//------------------------------------------------------------------------------------------------------ // // FUNCTION: SetGlobalActionInfo(CvActionInfo** ppActionInfo, int* iNumVals) // // PURPOSE : Takes the szTagName parameter and if it exists in the xml it loads the ppActionInfo // with the value under it and sets the value of the iNumVals parameter to the total number // of occurances of the szTagName tag in the xml. // //------------------------------------------------------------------------------------------------------ bool CvDllDatabaseUtility::SetGlobalActionInfo() { cvStopWatch kPerfTest("SetGlobalActionInfo", "xml-perf.log"); LogMsg("SetGlobalActionInfo\n"); typedef std::vector<CvActionInfo*> ActionInfoVector; ActionInfoVector& actionInfos = GC.getActionInfo(); //First, clear out action info data for(ActionInfoVector::iterator it = actionInfos.begin(); it != actionInfos.end(); ++it) { CvActionInfo* pActionInfo = (*it); delete pActionInfo; } actionInfos.clear(); const int iNumMissionTypes = CvTypes::getNUM_MISSION_TYPES(); //Verify action counts if(!(NUM_INTERFACEMODE_TYPES > 0)) { LogMsg("NUM_INTERFACE_TYPES is not greater than zero in CvDllDatabaseUtility::SetGlobalActionInfo."); } if(!(GC.getNumBuildInfos() > 0)) { LogMsg("GC.getNumBuildInfos() is not greater than zero in CvDllDatabaseUtility::SetGlobalActionInfo."); } if(!(GC.getNumPromotionInfos() > 0)) { LogMsg("GC.getNumPromotionInfos() is not greater than zero in CvDllDatabaseUtility::SetGlobalActionInfo."); } if(!(GC.getNumSpecialistInfos() > 0)) { LogMsg("GC.getNumSpecialistInfos() is not greater than zero in CvDllDatabaseUtility::SetGlobalActionInfo."); } if(!(NUM_CONTROL_TYPES > 0)) { LogMsg("NUM_CONTROL_TYPES is not greater than zero in CvDllDatabaseUtility::SetGlobalActionInfo."); } if(!(GC.getNumAutomateInfos() > 0)) { LogMsg("GC.getNumAutomateInfos() is not greater than zero in CvDllDatabaseUtility::SetGlobalActionInfo."); } if(!(NUM_COMMAND_TYPES > 0)) { LogMsg("NUM_COMMAND_TYPES is not greater than zero in CvDllDatabaseUtility::SetGlobalActionInfo."); } if(!(iNumMissionTypes > 0)) { LogMsg("NUM_MISSION_TYPES is not greater than zero in CvDllDatabaseUtility::SetGlobalActionInfo."); } int iEstimatedNumActionInfos = NUM_INTERFACEMODE_TYPES + GC.getNumBuildInfos() + GC.getNumPromotionInfos() + GC.getNumSpecialistInfos() + NUM_CONTROL_TYPES + NUM_COMMAND_TYPES + GC.getNumAutomateInfos() + iNumMissionTypes; int* piBuffer = FNEW(int[iEstimatedNumActionInfos * 4], c_eCiv5GameplayDLL, 0); memset(piBuffer,0, sizeof(int) * iEstimatedNumActionInfos * 4); int* piIndexList = piBuffer + iEstimatedNumActionInfos * 0; //FNEW(int[iNumActionInfos], c_eCiv5GameplayDLL, 0); int* piPriorityList = piBuffer + iEstimatedNumActionInfos * 1; //FNEW(int[iNumActionInfos], c_eCiv5GameplayDLL, 0); int* piActionInfoTypeList = piBuffer + iEstimatedNumActionInfos * 2; //FNEW(int[iNumActionInfos], c_eCiv5GameplayDLL, 0); int* piOrderedIndex = piBuffer + iEstimatedNumActionInfos * 3; //FNEW(int[iNumActionInfos], c_eCiv5GameplayDLL, 0); //Gather all available infos, checking for NULL entries as they may have been removed. int iTotalActionInfoCount = 0; int i = 0; for(i=0; i<NUM_COMMAND_TYPES; i++) { CvCommandInfo* commandInfo = GC.getCommandInfo((CommandTypes)i); if(commandInfo) { piIndexList[iTotalActionInfoCount] = i; piPriorityList[iTotalActionInfoCount] = commandInfo->getOrderPriority(); piActionInfoTypeList[iTotalActionInfoCount] = ACTIONSUBTYPE_COMMAND; iTotalActionInfoCount++; } } for(i=0; i<NUM_INTERFACEMODE_TYPES; i++) { CvInterfaceModeInfo* interfaceInfo = GC.getInterfaceModeInfo((InterfaceModeTypes)i); if(interfaceInfo) { piIndexList[iTotalActionInfoCount] = i; piPriorityList[iTotalActionInfoCount] = interfaceInfo->getOrderPriority(); piActionInfoTypeList[iTotalActionInfoCount] = ACTIONSUBTYPE_INTERFACEMODE; iTotalActionInfoCount++; } } for(i=0; i<GC.getNumBuildInfos(); i++) { CvBuildInfo* buildInfo = GC.getBuildInfo((BuildTypes)i); if(buildInfo) { piIndexList[iTotalActionInfoCount] = i; piPriorityList[iTotalActionInfoCount] = buildInfo->getOrderPriority(); piActionInfoTypeList[iTotalActionInfoCount] = ACTIONSUBTYPE_BUILD; iTotalActionInfoCount++; } } for(i=0; i<GC.getNumPromotionInfos(); i++) { CvPromotionEntry* promotionEntry = GC.getPromotionInfo((PromotionTypes)i); if(promotionEntry) { piIndexList[iTotalActionInfoCount] = i; piPriorityList[iTotalActionInfoCount] = promotionEntry->getOrderPriority(); piActionInfoTypeList[iTotalActionInfoCount] = ACTIONSUBTYPE_PROMOTION; iTotalActionInfoCount++; } } for(i=0; i<GC.getNumSpecialistInfos(); i++) { CvSpecialistInfo* specialistInfo = GC.getSpecialistInfo((SpecialistTypes)i); if(specialistInfo) { piIndexList[iTotalActionInfoCount] = i; piPriorityList[iTotalActionInfoCount] = specialistInfo->getOrderPriority(); piActionInfoTypeList[iTotalActionInfoCount] = ACTIONSUBTYPE_SPECIALIST; iTotalActionInfoCount++; } } for(i=0; i<NUM_CONTROL_TYPES; i++) { CvControlInfo* controlInfo = GC.getControlInfo((ControlTypes)i); if(controlInfo) { piIndexList[iTotalActionInfoCount] = i; piPriorityList[iTotalActionInfoCount] = controlInfo->getOrderPriority(); piActionInfoTypeList[iTotalActionInfoCount] = ACTIONSUBTYPE_CONTROL; iTotalActionInfoCount++; } } for(i=0; i<GC.getNumAutomateInfos(); i++) { CvAutomateInfo* automateInfo = GC.getAutomateInfo(i); if(automateInfo) { piIndexList[iTotalActionInfoCount] = i; piPriorityList[iTotalActionInfoCount] = automateInfo->getOrderPriority(); piActionInfoTypeList[iTotalActionInfoCount] = ACTIONSUBTYPE_AUTOMATE; iTotalActionInfoCount++; } } for(i=0; i<iNumMissionTypes; i++) { CvMissionInfo* missionInfo = GC.getMissionInfo((MissionTypes)i); if(missionInfo) { piIndexList[iTotalActionInfoCount] = i; piPriorityList[iTotalActionInfoCount] = missionInfo->getOrderPriority(); piActionInfoTypeList[iTotalActionInfoCount] = ACTIONSUBTYPE_MISSION; iTotalActionInfoCount++; } } //Preallocate actionInfos.reserve(iTotalActionInfoCount); //Sort and add action infos. orderHotkeyInfo(&piOrderedIndex, piPriorityList, iTotalActionInfoCount); for(i = 0; i < iTotalActionInfoCount; i++) { CvActionInfo* pActionInfo = FNEW(CvActionInfo, c_eCiv5GameplayDLL, 0); CvAssert(piIndexList[piOrderedIndex[i]] != -1); pActionInfo->setOriginalIndex(piIndexList[piOrderedIndex[i]]); pActionInfo->setSubType((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]]); if((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]] == ACTIONSUBTYPE_COMMAND) { GC.getCommandInfo((CommandTypes)piIndexList[piOrderedIndex[i]])->setActionInfoIndex(i); } else if((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]] == ACTIONSUBTYPE_INTERFACEMODE) { GC.getInterfaceModeInfo((InterfaceModeTypes)piIndexList[piOrderedIndex[i]])->setActionInfoIndex(i); } else if((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]] == ACTIONSUBTYPE_BUILD) { GC.getBuildInfo((BuildTypes)piIndexList[piOrderedIndex[i]])->setMissionType(GC.getInfoTypeForString("MISSION_BUILD")); GC.getBuildInfo((BuildTypes)piIndexList[piOrderedIndex[i]])->setActionInfoIndex(i); } else if((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]] == ACTIONSUBTYPE_PROMOTION) { CvPromotionEntry* pkEntry = GC.getPromotionInfo((PromotionTypes)piIndexList[piOrderedIndex[i]]); pkEntry->SetCommandType(GC.getInfoTypeForString("COMMAND_PROMOTION")); pkEntry->setActionInfoIndex(i); CvString strHotKey = pkEntry->CreateHotKeyFromDescription(pkEntry->getHotKey(), pkEntry->isShiftDown(), pkEntry->isAltDown(), pkEntry->isCtrlDown()); pkEntry->setHotKeyDescription(pkEntry->GetDescription(), GC.getCommandInfo((CommandTypes)(pkEntry->GetCommandType()))->GetDescription(), strHotKey); } else if((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]] == ACTIONSUBTYPE_SPECIALIST) { CvSpecialistInfo* pkSpecialist = GC.getSpecialistInfo((SpecialistTypes)piIndexList[piOrderedIndex[i]]); pkSpecialist->setMissionType(GC.getInfoTypeForString("MISSION_JOIN")); pkSpecialist->setActionInfoIndex(i); CvString strHotKey = pkSpecialist->CreateHotKeyFromDescription(pkSpecialist->getHotKey(), pkSpecialist->isShiftDown(), pkSpecialist->isAltDown(), pkSpecialist->isCtrlDown()); pkSpecialist->setHotKeyDescription(pkSpecialist->GetDescription(), GC.getMissionInfo((MissionTypes)(pkSpecialist->getMissionType()))->GetDescription(), strHotKey); } else if((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]] == ACTIONSUBTYPE_CONTROL) { GC.getControlInfo((ControlTypes)piIndexList[piOrderedIndex[i]])->setActionInfoIndex(i); } else if((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]] == ACTIONSUBTYPE_AUTOMATE) { GC.getAutomateInfo(piIndexList[piOrderedIndex[i]])->setActionInfoIndex(i); } else if((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]] == ACTIONSUBTYPE_MISSION) { GC.getMissionInfo((MissionTypes)piIndexList[piOrderedIndex[i]])->setActionInfoIndex(i); } GC.getActionInfo().push_back(pActionInfo); } SAFE_DELETE_ARRAY(piBuffer); // SAFE_DELETE_ARRAY(piOrderedIndex); // SAFE_DELETE_ARRAY(piIndexList); // SAFE_DELETE_ARRAY(piPriorityList); // SAFE_DELETE_ARRAY(piActionInfoTypeList); return true; }
//------------------------------------------------------------------------------ int CvLuaGameInfo::pRegisterActions(lua_State* L) { lua_newtable(L); lua_pushvalue(L, -1); lua_setglobal(L, "GameInfoActions"); const int t = lua_gettop(L); int idx = 0; typedef std::vector<CvActionInfo*> ActionInfos; ActionInfos& infos = GC.getActionInfo(); for(ActionInfos::const_iterator it = infos.begin(); it != infos.end(); ++it) { CvActionInfo* pEntry = (*it); lua_createtable(L, 0, 0); Table kEntry(L, -1); kEntry["MissionData"] = pEntry->getMissionData(); kEntry["CommandData"] = pEntry->getCommandData(); kEntry["AutomateType"] = pEntry->getAutomateType(); kEntry["InterfaceModeType"] = pEntry->getInterfaceModeType(); kEntry["MissionType"] = pEntry->getMissionType(); kEntry["CommandType"] = pEntry->getCommandType(); kEntry["ControlType"] = pEntry->getControlType(); kEntry["OriginalIndex"] = pEntry->getOriginalIndex(); kEntry["ConfirmCommand"] = pEntry->isConfirmCommand(); kEntry["Visible"] = pEntry->isVisible(); kEntry["SubType"] = (int)pEntry->getSubType(); kEntry["Type"] = pEntry->GetType(); kEntry["TextKey"] = pEntry->GetTextKey(); kEntry["ActionInfoIndex"] = pEntry->getActionInfoIndex(); kEntry["HotKeyVal"] = pEntry->getHotKeyVal(); kEntry["HotKeyPriority"] = pEntry->getHotKeyPriority(); kEntry["HotKeyValAlt"] = pEntry->getHotKeyValAlt(); kEntry["HotKeyPriorityAlt"] = pEntry->getHotKeyPriorityAlt(); kEntry["OrderPriority"] = pEntry->getOrderPriority(); kEntry["AltDown"] = pEntry->isAltDown(); kEntry["ShiftDown"] = pEntry->isShiftDown(); kEntry["CtrlDown"] = pEntry->isCtrlDown(); kEntry["AltDownAlt"] = pEntry->isAltDownAlt(); kEntry["ShiftDownAlt"] = pEntry->isShiftDownAlt(); kEntry["CtrlDownAlt"] = pEntry->isCtrlDownAlt(); kEntry["HotKey"] = pEntry->getHotKeyString(); kEntry["Help"] = pEntry->GetHelp(); kEntry["DisabledHelp"] = pEntry->GetDisabledHelp(); lua_rawseti(L, t, idx); ++idx; } return 0; }
//------------------------------------------------------------------------------ int CvLuaGameInfo::pRegisterActions(lua_State* L) { lua_newtable(L); lua_pushvalue(L, -1); lua_setglobal(L, "GameInfoActions"); const int t = lua_gettop(L); int idx = 0; #ifdef AUI_CONSTIFY const std::vector<CvActionInfo*>& infos = GC.getActionInfo(); for (std::vector<CvActionInfo*>::const_iterator it = infos.begin(); it != infos.end(); ++it) { const CvActionInfo* pEntry = (*it); #else typedef std::vector<CvActionInfo*> ActionInfos; ActionInfos& infos = GC.getActionInfo(); for(ActionInfos::const_iterator it = infos.begin(); it != infos.end(); ++it) { CvActionInfo* pEntry = (*it); #endif lua_createtable(L, 0, 0); Table kEntry(L, -1); kEntry["MissionData"] = pEntry->getMissionData(); kEntry["CommandData"] = pEntry->getCommandData(); kEntry["AutomateType"] = pEntry->getAutomateType(); kEntry["InterfaceModeType"] = pEntry->getInterfaceModeType(); kEntry["MissionType"] = pEntry->getMissionType(); kEntry["CommandType"] = pEntry->getCommandType(); kEntry["ControlType"] = pEntry->getControlType(); kEntry["OriginalIndex"] = pEntry->getOriginalIndex(); kEntry["ConfirmCommand"] = pEntry->isConfirmCommand(); kEntry["Visible"] = pEntry->isVisible(); kEntry["SubType"] = (int)pEntry->getSubType(); kEntry["Type"] = pEntry->GetType(); kEntry["TextKey"] = pEntry->GetTextKey(); kEntry["ActionInfoIndex"] = pEntry->getActionInfoIndex(); kEntry["HotKeyVal"] = pEntry->getHotKeyVal(); kEntry["HotKeyPriority"] = pEntry->getHotKeyPriority(); kEntry["HotKeyValAlt"] = pEntry->getHotKeyValAlt(); kEntry["HotKeyPriorityAlt"] = pEntry->getHotKeyPriorityAlt(); kEntry["OrderPriority"] = pEntry->getOrderPriority(); kEntry["AltDown"] = pEntry->isAltDown(); kEntry["ShiftDown"] = pEntry->isShiftDown(); kEntry["CtrlDown"] = pEntry->isCtrlDown(); kEntry["AltDownAlt"] = pEntry->isAltDownAlt(); kEntry["ShiftDownAlt"] = pEntry->isShiftDownAlt(); kEntry["CtrlDownAlt"] = pEntry->isCtrlDownAlt(); kEntry["HotKey"] = pEntry->getHotKeyString(); kEntry["Help"] = pEntry->GetHelp(); kEntry["DisabledHelp"] = pEntry->GetDisabledHelp(); lua_rawseti(L, t, idx); ++idx; } return 0; } //------------------------------------------------------------------------------ int CvLuaGameInfo::pRegisterTypesInfo(lua_State* L) { lua_newtable(L); lua_pushvalue(L, -1); lua_setglobal(L, "GameInfoTypes"); const CvGlobals::InfosMap& kInfosMap = GC.GetInfoTypes(); for(CvGlobals::InfosMap::const_iterator it = kInfosMap.begin(); it != kInfosMap.end(); ++ it) { lua_pushinteger(L, (*it).second); lua_setfield(L, -2, (*it).first.c_str()); } return 0; }