Bazaar developer reference

CvLeague::CanProposeEnact(ResolutionTypes, PlayerTypes, int, CvString *)

Defined in
CvVotingClasses.cpp, line 2427
Class
CvLeague
Hook name
CivHooks::CvLeague_CanProposeEnact
Lua events
GameEvents.PlayerCanPropose

Hooks

static bool BeforeCvLeague_CanProposeEnact(CvLeague* self, ResolutionTypes eResolution, PlayerTypes eProposer, int iChoice, CvString* sTooltipSink, bool& result);static void AfterCvLeague_CanProposeEnact(CvLeague* self, ResolutionTypes eResolution, PlayerTypes eProposer, int iChoice, CvString* sTooltipSink, bool& result);static bool ReplaceCvLeague_CanProposeEnact(bool (*original)(CvLeague*, ResolutionTypes, PlayerTypes, int, CvString*), CvLeague* self, ResolutionTypes eResolution, PlayerTypes eProposer, int iChoice, CvString* sTooltipSink);CivRegisterBefore<CivHooks::CvLeague_CanProposeEnact>(host, &BeforeCvLeague_CanProposeEnact);CivRegisterAfter<CivHooks::CvLeague_CanProposeEnact>(host, &AfterCvLeague_CanProposeEnact);CivRegisterReplace<CivHooks::CvLeague_CanProposeEnact>(host, &ReplaceCvLeague_CanProposeEnact);

Code

2427bool CvLeague::CanProposeEnact(ResolutionTypes eResolution, PlayerTypes eProposer, int iChoice, CvString* sTooltipSink)2428{2429	CvAssertMsg(eResolution >= 0, "Invalid resolution type. Please send Anton your save file and version.");2430	CvAssertMsg(eResolution < GC.getNumResolutionInfos(), "Resolution index out of bounds. Please send Anton your save file and version.");24312432	CvResolutionEntry* pInfo = GC.getResolutionInfo(eResolution);2433	CvAssertMsg(pInfo, "Resolution info is null. Please send Anton your save file and version.");2434	if (!pInfo) return false;24352436	bool bValid = true;2437	2438	// Is a player proposing this?2439	if (eProposer != NO_PLAYER)2440	{2441		// Must be a proposal that can be made by players2442		if (pInfo->IsNoProposalByPlayer())2443		{2444			if (sTooltipSink != NULL)2445			{2446				(*sTooltipSink) += "[NEWLINE][NEWLINE][COLOR_WARNING_TEXT]";2447				(*sTooltipSink) += Localization::Lookup("TXT_KEY_LEAGUE_OVERVIEW_INVALID_RESOLUTION_NO_PLAYER_PROPOSAL").toUTF8();2448				(*sTooltipSink) += "[ENDCOLOR]";2449			}2450			bValid = false;2451		}24522453		// Must be a member2454		if (!IsMember(eProposer))2455			bValid = false;24562457		// Must have right to propose2458		if (!CanPropose(eProposer))2459			bValid = false;2460	}24612462	// Is this a valid choice for this proposal?2463	bool bValidChoice = false;2464	std::vector<int> vValidChoices = GetChoicesForDecision(pInfo->GetProposerDecision(), eProposer);2465	if (vValidChoices.empty())2466	{2467		if (pInfo->GetProposerDecision() == RESOLUTION_DECISION_NONE && LeagueHelpers::CHOICE_NONE == iChoice)2468		{2469			bValidChoice = true;2470		}2471	}2472	else2473	{2474		for (uint i = 0; i < vValidChoices.size(); i++)2475		{2476			if (vValidChoices[i] == iChoice)2477			{2478				bValidChoice = true;2479				break;2480			}2481		}2482	}2483	if (!bValidChoice)2484	{2485		bValid = false;2486	}2487	else2488	{2489		// Effects must be allowed in our game2490		if (!IsResolutionEffectsValid(eResolution, iChoice, sTooltipSink))2491		{2492			bValid = false;2493		}24942495		// Must not already be proposed2496		if (IsEnactProposed(eResolution, iChoice))2497		{2498			if (sTooltipSink != NULL)2499			{2500				(*sTooltipSink) += "[NEWLINE][NEWLINE][COLOR_WARNING_TEXT]";2501				(*sTooltipSink) += Localization::Lookup("TXT_KEY_LEAGUE_OVERVIEW_INVALID_RESOLUTION_ALREADY_PROPOSED").toUTF8();2502				(*sTooltipSink) += "[ENDCOLOR]";2503			}2504			bValid = false;2505		}25062507		// Must not already be active2508		if (IsActiveResolution(eResolution, iChoice))2509		{2510			if (sTooltipSink != NULL)2511			{2512				(*sTooltipSink) += "[NEWLINE][NEWLINE][COLOR_WARNING_TEXT]";2513				(*sTooltipSink) += Localization::Lookup("TXT_KEY_LEAGUE_OVERVIEW_INVALID_RESOLUTION_ALREADY_ENACTED").toUTF8();2514				(*sTooltipSink) += "[ENDCOLOR]";2515			}2516			bValid = false;2517		}2518	}2519	2520	// Prereq tech2521	if (pInfo->GetTechPrereqAnyMember() != NO_TECH)2522	{2523		bool bMemberHasTech = false;2524		for (MemberList::iterator it = m_vMembers.begin(); it != m_vMembers.end(); it++)2525		{2526			if (GET_TEAM(GET_PLAYER(it->ePlayer).getTeam()).GetTeamTechs()->HasTech(pInfo->GetTechPrereqAnyMember()))2527			{2528				bMemberHasTech = true;2529				break;2530			}2531		}25322533		if (!bMemberHasTech)2534		{2535			if (sTooltipSink != NULL)2536			{2537				CvTechEntry* pTechInfo = GC.getTechInfo(pInfo->GetTechPrereqAnyMember());2538				if (pTechInfo != NULL)2539				{2540					Localization::String sTemp = Localization::Lookup("TXT_KEY_LEAGUE_OVERVIEW_INVALID_RESOLUTION_NO_TECH");2541					sTemp << pTechInfo->GetDescriptionKey();25422543					(*sTooltipSink) += "[NEWLINE][NEWLINE][COLOR_WARNING_TEXT]";2544					(*sTooltipSink) += sTemp.toUTF8();2545					(*sTooltipSink) += "[ENDCOLOR]";2546				}2547			}2548			bValid = false;2549		}2550	}25512552	// League Project2553	if (pInfo->GetLeagueProjectEnabled() != NO_LEAGUE_PROJECT)2554	{2555		// Is the project already underway or completed??2556		if (IsProjectActive(pInfo->GetLeagueProjectEnabled()) || IsProjectComplete(pInfo->GetLeagueProjectEnabled()))2557		{2558			if (sTooltipSink != NULL)2559			{2560				(*sTooltipSink) += "[NEWLINE][NEWLINE][COLOR_WARNING_TEXT]";2561				(*sTooltipSink) += Localization::Lookup("TXT_KEY_LEAGUE_OVERVIEW_INVALID_RESOLUTION_ALREADY_ENACTED").toUTF8();2562				(*sTooltipSink) += "[ENDCOLOR]";2563			}2564			bValid = false;2565		}2566	}2567	2568#if defined(MOD_EVENTS_RESOLUTIONS)2569	if (MOD_EVENTS_RESOLUTIONS) {2570		if (GAMEEVENTINVOKE_TESTALL(GAMEEVENT_PlayerCanPropose, eProposer, eResolution, iChoice, true) == GAMEEVENTRETURN_FALSE) {2571			bValid = false;2572		}2573	}2574#endif2575	2576	return bValid;2577}

Calls

Called by