// recv a research topic that is now complete. static bool recvResearch(NETQUEUE queue) { uint8_t player; uint32_t index; int i; PLAYER_RESEARCH *pPlayerRes; NETbeginDecode(queue, GAME_DEBUG_FINISH_RESEARCH); NETuint8_t(&player); NETuint32_t(&index); NETend(); if (!getDebugMappingStatus() && bMultiPlayer) { debug(LOG_WARNING, "Failed to finish research for player %u.", NetPlay.players[queue.index].position); return false; } syncDebug("player%d, index%u", player, index); if (player >= MAX_PLAYERS || index >= asResearch.size()) { debug(LOG_ERROR, "Bad GAME_DEBUG_FINISH_RESEARCH received, player is %d, index is %u", (int)player, index); return false; } pPlayerRes = &asPlayerResList[player][index]; syncDebug("research status = %d", pPlayerRes->ResearchStatus & RESBITS); if (!IsResearchCompleted(pPlayerRes)) { MakeResearchCompleted(pPlayerRes); researchResult(index, player, false, NULL, true); } // Update allies research accordingly if (game.type == SKIRMISH) { for (i = 0; i < MAX_PLAYERS; i++) { if (alliances[i][player] == ALLIANCE_FORMED) { pPlayerRes = &asPlayerResList[i][index]; if (!IsResearchCompleted(pPlayerRes)) { // Do the research for that player MakeResearchCompleted(pPlayerRes); researchResult(index, i, false, NULL, true); } } } } return true; }
static QScriptValue js_completeResearch(QScriptContext *context, QScriptEngine *engine) { QString researchName = context->argument(0).toString(); int player; if (context->argumentCount() > 1) { player = context->argument(0).toInt32(); } else { player = engine->globalObject().property("me").toInt32(); } RESEARCH *psResearch = getResearch(researchName.toUtf8().constData()); SCRIPT_ASSERT(context, psResearch, "No such research %s for player %d", researchName.toUtf8().constData(), player); int researchIndex = psResearch - asResearch; SCRIPT_ASSERT(context, researchIndex < numResearch, "Research index out of bounds"); if (bMultiMessages && (gameTime > 2)) { SendResearch(player, researchIndex, false); // Wait for our message before doing anything. } else { researchResult(researchIndex, player, false, NULL, false); } return QScriptValue(); }
// //////////////////////////////////////////////////////////////////////////// // give technologies. static void giftResearch(uint8_t from, uint8_t to, bool send) { int i; uint32_t dummy = 0; if (send) { uint8_t giftType = RESEARCH_GIFT; NETbeginEncode(NETgameQueue(selectedPlayer), GAME_GIFT); NETuint8_t(&giftType); NETuint8_t(&from); NETuint8_t(&to); NETuint32_t(&dummy); NETend(); } else if (alliancesCanGiveResearchAndRadar(game.alliance)) { if (to == selectedPlayer) { CONPRINTF(ConsoleString, (ConsoleString, _("%s Gives You Technology Documents"), getPlayerName(from))); } // For each topic for (i = 0; i < asResearch.size(); i++) { // If they have it and we don't research it if (IsResearchCompleted(&asPlayerResList[from][i]) && !IsResearchCompleted(&asPlayerResList[to][i])) { MakeResearchCompleted(&asPlayerResList[to][i]); researchResult(i, to, false, NULL, true); } } } }
/*find the last research topic of importance that the losing player did and 'give' the results to the reward player*/ void researchReward(UBYTE losingPlayer, UBYTE rewardPlayer) { UDWORD topicIndex = 0, researchPoints = 0, rewardID = 0; STRUCTURE *psStruct; RESEARCH_FACILITY *psFacility; //look through the losing players structures to find a research facility for (psStruct = apsStructLists[losingPlayer]; psStruct != NULL; psStruct = psStruct->psNext) { if (psStruct->pStructureType->type == REF_RESEARCH) { psFacility = (RESEARCH_FACILITY *)psStruct->pFunctionality; if (psFacility->psBestTopic) { topicIndex = ((RESEARCH *)psFacility->psBestTopic)->ref - REF_RESEARCH_START; if (topicIndex) { //if it cost more - it is better (or should be) if (researchPoints < asResearch[topicIndex].researchPoints) { //store the 'best' topic researchPoints = asResearch[topicIndex].researchPoints; rewardID = topicIndex; } } } } } //if a topic was found give the reward player the results of that research if (rewardID) { researchResult(rewardID, rewardPlayer, true, NULL, true); if (rewardPlayer == selectedPlayer) { //name the actual reward CONPRINTF(ConsoleString, (ConsoleString, "%s :- %s", _("Research Award"), getName(&asResearch[rewardID]))); } } }
// //////////////////////////////////////////////////////////////////////////// // give technologies. static void giftResearch(uint8_t from, uint8_t to, BOOL send) { PLAYER_RESEARCH *pR, *pRto; int i; uint32_t dummy = 0; if (send) { uint8_t giftType = RESEARCH_GIFT; NETbeginEncode(NETgameQueue(selectedPlayer), GAME_GIFT); NETuint8_t(&giftType); NETuint8_t(&from); NETuint8_t(&to); NETuint32_t(&dummy); NETend(); } else { if (to == selectedPlayer) { CONPRINTF(ConsoleString, (ConsoleString, _("%s Gives You Technology Documents"), getPlayerName(from))); } pR = asPlayerResList[from]; pRto = asPlayerResList[to]; // For each topic for (i = 0; i < numResearch; i++) { // If they have it and we don't research it if (IsResearchCompleted(&pR[i]) && !IsResearchCompleted(&pRto[i])) { MakeResearchCompleted(&pRto[i]); researchResult(i, to, false, NULL, true); } } } }