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}