//------------------------------------------------------------------------------
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);
		}
	}
}
Example #2
0
//------------------------------------------------------------------------------
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
}
Example #4
0
//------------------------------------------------------------------------------
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;
}