//------------------------------------------------------------------------------ void CvDllNetMessageHandler::ResponseResearch(PlayerTypes ePlayer, TechTypes eTech, int iDiscover, PlayerTypes ePlayerToStealFrom, bool bShift) { CvPlayerAI& kPlayer = GET_PLAYER(ePlayer); CvTeam& kTeam = GET_TEAM(kPlayer.getTeam()); // Free tech if(iDiscover > 0) { // Make sure we can research this tech for free if(kPlayer.GetPlayerTechs()->CanResearchForFree(eTech)) { kTeam.setHasTech(eTech, true, ePlayer, true, true); if(iDiscover > 1) { if(ePlayer == GC.getGame().getActivePlayer()) { kPlayer.chooseTech(iDiscover - 1); } } kPlayer.SetNumFreeTechs(max(0, iDiscover - 1)); } } // Stealing tech else if(ePlayerToStealFrom != NO_PLAYER) { // make sure we can still take a tech CvAssertMsg(kPlayer.GetEspionage()->m_aiNumTechsToStealList[ePlayerToStealFrom] > 0, "No techs to steal from player"); CvAssertMsg(kPlayer.GetEspionage()->m_aaPlayerStealableTechList[ePlayerToStealFrom].size() > 0, "No techs to be stolen from this player"); CvAssertMsg(kPlayer.GetPlayerTechs()->CanResearch(eTech), "Player can't research this technology"); CvAssertMsg(GET_TEAM(GET_PLAYER(ePlayerToStealFrom).getTeam()).GetTeamTechs()->HasTech(eTech), "ePlayerToStealFrom does not have the requested tech"); if (kPlayer.GetEspionage()->m_aiNumTechsToStealList[ePlayerToStealFrom] > 0) { kTeam.setHasTech(eTech, true, ePlayer, true, true); kPlayer.GetEspionage()->m_aiNumTechsToStealList[ePlayerToStealFrom]--; } } // Normal tech else { CvPlayerTechs* pPlayerTechs = kPlayer.GetPlayerTechs(); CvTeamTechs* pTeamTechs = kTeam.GetTeamTechs(); if(eTech == NO_TECH) { kPlayer.clearResearchQueue(); } else if(pPlayerTechs->CanEverResearch(eTech)) { if((pTeamTechs->HasTech(eTech) || pPlayerTechs->IsResearchingTech(eTech)) && !bShift) { kPlayer.clearResearchQueue(); } kPlayer.pushResearch(eTech, !bShift); } } }
//------------------------------------------------------------------------------ int CvDllTeam::GetTechCount() const { CvTeamTechs* pkTeamTechs = m_pTeam->GetTeamTechs(); if (pkTeamTechs) { return pkTeamTechs->GetNumTechsKnown(); } return 0; }
//------------------------------------------------------------------------------ //void ChangeResearchProgressTimes100(TechTypes eIndex, int iChange, PlayerTypes ePlayer); int CvLuaTeamTech::lChangeResearchProgressTimes100(lua_State* L) { #if defined(MOD_BUGFIX_RESEARCH_OVERFLOW) CvTeamTechs* pkTeamTech = GetInstance(L); const TechTypes eTech = (TechTypes)lua_tointeger(L, 2); const int iNewValue = (TechTypes)lua_tointeger(L, 3); const PlayerTypes ePlayer = (PlayerTypes)lua_tointeger(L, 4); pkTeamTech->ChangeResearchProgressTimes100(eTech, iNewValue, ePlayer); return 0; #else return BasicLuaMethod(L, &CvTeamTechs::ChangeResearchProgressTimes100); #endif }
//------------------------------------------------------------------------------ int CvDllTeam::GetTechs(TechTypes* pkTechArray, uint uiArraySize) const { int iFoundTechs = 0; CvTeamTechs* pkTeamTechs = m_pTeam->GetTeamTechs(); if (pkTeamTechs) { for (int iTechLoop = 0; iTechLoop < GC.getNumTechInfos() && uiArraySize--; iTechLoop++) { if (pkTeamTechs->HasTech((TechTypes) iTechLoop) || pkTeamTechs->GetTechCount((TechTypes)iTechLoop) > 0) { *pkTechArray++ = (TechTypes)iTechLoop; ++iFoundTechs; } } } return iFoundTechs; }