bool researchAvailable(int inc, int playerID, QUEUE_MODE mode) { // Decide whether to use IsResearchCancelledPending/IsResearchStartedPending or IsResearchCancelled/IsResearchStarted. bool (*IsResearchCancelledFunc)(PLAYER_RESEARCH const *) = IsResearchCancelledPending; bool (*IsResearchStartedFunc)(PLAYER_RESEARCH const *) = IsResearchStartedPending; if (mode == ModeImmediate) { IsResearchCancelledFunc = IsResearchCancelled; IsResearchStartedFunc = IsResearchStarted; } UDWORD incPR, incS; bool bPRFound, bStructFound; // if its a cancelled topic - add to list if (IsResearchCancelledFunc(&asPlayerResList[playerID][inc])) { return true; } // if the topic is possible and has not already been researched - add to list if ((IsResearchPossible(&asPlayerResList[playerID][inc]))) { if (!IsResearchCompleted(&asPlayerResList[playerID][inc]) && !IsResearchStartedFunc(&asPlayerResList[playerID][inc])) { return true; } } // if single player mode and key topic, then ignore cos can't do it! if (!bMultiPlayer && asResearch[inc].keyTopic) { return false; } bool researchStarted = IsResearchStartedFunc(&asPlayerResList[playerID][inc]); if (researchStarted) { STRUCTURE *psBuilding = findResearchingFacilityByResearchIndex(playerID, inc); // May fail to find the structure here, if the research is merely pending, not actually started. if (psBuilding != nullptr && psBuilding->status == SS_BEING_BUILT) { researchStarted = false; // Although research is started, the facility is currently being upgraded or demolished, so we want to be able to research this elsewhere. } } // make sure that the research is not completed or started by another researchfac if (!IsResearchCompleted(&asPlayerResList[playerID][inc]) && !researchStarted) { // Research is not completed ... also it has not been started by another researchfac // if there aren't any PR's - go to next topic if (asResearch[inc].pPRList.empty()) { return false; } // check for pre-requisites bPRFound = true; for (incPR = 0; incPR < asResearch[inc].pPRList.size(); incPR++) { if (IsResearchCompleted(&(asPlayerResList[playerID][asResearch[inc].pPRList[incPR]])) == 0) { // if haven't pre-requisite - quit checking rest bPRFound = false; break; } } if (!bPRFound) { // if haven't pre-requisites, skip the rest of the checks return false; } // check for structure effects bStructFound = true; for (incS = 0; incS < asResearch[inc].pStructList.size(); incS++) { if (!checkSpecificStructExists(asResearch[inc].pStructList[incS], playerID)) { //if not built, quit checking bStructFound = false; break; } } if (!bStructFound) { // if haven't all structs built, skip to next topic return false; } return true; } return false; }
bool skTopicAvail(UWORD inc, UDWORD player) { UDWORD incPR, incS; bool bPRFound, bStructFound; //if the topic is possible and has not already been researched - add to list if ((IsResearchPossible(&asPlayerResList[player][inc]))) { if (!IsResearchCompleted(&asPlayerResList[player][inc]) && !IsResearchStartedPending(&asPlayerResList[player][inc])) { return true; } } // make sure that the research is not completed or started by another researchfac if (!IsResearchCompleted(&asPlayerResList[player][inc]) && !IsResearchStartedPending(&asPlayerResList[player][inc])) { // Research is not completed ... also it has not been started by another researchfac //if there aren't any PR's - go to next topic if (asResearch[inc].pPRList.empty()) { return false; } //check for pre-requisites bPRFound = true; for (incPR = 0; incPR < asResearch[inc].pPRList.size(); incPR++) { if (IsResearchCompleted(&asPlayerResList[player][asResearch[inc].pPRList[incPR]]) == 0) { //if haven't pre-requisite - quit checking rest bPRFound = false; break; } } if (!bPRFound) { //if haven't pre-requisites, skip the rest of the checks return false; } //check for structure effects bStructFound = true; for (incS = 0; incS < asResearch[inc].pStructList.size(); incS++) { //if (!checkStructureStatus(asStructureStats + asResearch[inc]. // pStructList[incS], playerID, SS_BUILT)) if (!checkSpecificStructExists(asResearch[inc].pStructList[incS], player)) { //if not built, quit checking bStructFound = false; break; } } if (!bStructFound) { //if haven't all structs built, skip to next topic return false; } return true; } return false; }
BOOL skTopicAvail(UWORD inc, UDWORD player) { UDWORD incPR, incS; PLAYER_RESEARCH *pPlayerRes = asPlayerResList[player]; BOOL bPRFound, bStructFound; //if the topic is possible and has not already been researched - add to list if ((IsResearchPossible(&pPlayerRes[inc]))) { if ((IsResearchCompleted(&pPlayerRes[inc])==FALSE) && (IsResearchStarted(&pPlayerRes[inc])==FALSE)) { return TRUE; } } // make sure that the research is not completed or started by another researchfac if ((IsResearchCompleted(&pPlayerRes[inc])==FALSE) && (IsResearchStarted(&pPlayerRes[inc])==FALSE)) { // Research is not completed ... also it has not been started by another researchfac //if there aren't any PR's - go to next topic if (!asResearch[inc].numPRRequired) { return FALSE; } //check for pre-requisites bPRFound = TRUE; for (incPR = 0; incPR < asResearch[inc].numPRRequired; incPR++) { if (IsResearchCompleted(&(pPlayerRes[asResearch[inc].pPRList[incPR]]))==0) { //if haven't pre-requisite - quit checking rest bPRFound = FALSE; break; } } if (!bPRFound) { //if haven't pre-requisites, skip the rest of the checks return FALSE; } //check for structure effects bStructFound = TRUE; for (incS = 0; incS < asResearch[inc].numStructures; incS++) { //if (!checkStructureStatus(asStructureStats + asResearch[inc]. // pStructList[incS], playerID, SS_BUILT)) if (!checkSpecificStructExists(asResearch[inc].pStructList[incS], player)) { //if not built, quit checking bStructFound = FALSE; break; } } if (!bStructFound) { //if haven't all structs built, skip to next topic return FALSE; } return TRUE; } return FALSE; }