Hooks
static bool BeforeCvLeague_GetResolutionVoteOpinionDetails(CvLeague* self, ResolutionTypes eResolution, PlayerTypes eObserver, int iResolutionID, CvString& result);static void AfterCvLeague_GetResolutionVoteOpinionDetails(CvLeague* self, ResolutionTypes eResolution, PlayerTypes eObserver, int iResolutionID, CvString& result);static CvString ReplaceCvLeague_GetResolutionVoteOpinionDetails(CvString (*original)(CvLeague*, ResolutionTypes, PlayerTypes, int), CvLeague* self, ResolutionTypes eResolution, PlayerTypes eObserver, int iResolutionID);CivRegisterBefore<CivHooks::CvLeague_GetResolutionVoteOpinionDetails>(host, &BeforeCvLeague_GetResolutionVoteOpinionDetails);CivRegisterAfter<CivHooks::CvLeague_GetResolutionVoteOpinionDetails>(host, &AfterCvLeague_GetResolutionVoteOpinionDetails);CivRegisterReplace<CivHooks::CvLeague_GetResolutionVoteOpinionDetails>(host, &ReplaceCvLeague_GetResolutionVoteOpinionDetails);
Code
4249CvString CvLeague::GetResolutionVoteOpinionDetails(ResolutionTypes eResolution, PlayerTypes eObserver, int iResolutionID)4250{4251 CvResolutionEntry* pInfo = GC.getResolutionInfo(eResolution);4252 if (!pInfo)4253 {4254 return "";4255 }4256 // Must be proposed as either enact or repeal, but not both4257 if (!IsProposed(iResolutionID, /*bRepeal*/false) && !IsProposed(iResolutionID, /*bRepeal*/true))4258 {4259 CvAssert(false);4260 return "";4261 }4262 if (IsProposed(iResolutionID, /*bRepeal*/false) && IsProposed(iResolutionID, /*bRepeal*/true))4263 {4264 CvAssert(false);4265 return "";4266 }4267 4268 CvString s = "";4269 s += Localization::Lookup("TXT_KEY_LEAGUE_OVERVIEW_VOTE_OPINIONS").toUTF8();42704271 bool bEnact = IsProposed(iResolutionID, /*bRepeal*/false);4272 ResolutionDecisionTypes eDecision = pInfo->GetVoterDecision();4273 if (!bEnact)4274 {4275 eDecision = RESOLUTION_DECISION_REPEAL;4276 }4277 std::vector<int> vChoices = GetChoicesForDecision(eDecision, NO_PLAYER);42784279 // Discover what choices we can of the other players4280 FStaticVector< std::pair<PlayerTypes, int>, MAX_MAJOR_CIVS, true, c_eCiv5GameplayDLL> vMemberOpinions;4281 for (MemberList::iterator it = m_vMembers.begin(); it != m_vMembers.end(); ++it)4282 {4283 if (it->ePlayer != eObserver && CanEverVote(it->ePlayer))4284 {4285 int iMemberChoice = LeagueHelpers::CHOICE_NONE;4286 if (bEnact)4287 {4288 iMemberChoice = GET_PLAYER(it->ePlayer).GetLeagueAI()->EvaluateVoteForOtherPlayerKnowledge(this, eObserver, GetEnactProposal(iResolutionID));4289 }4290 else4291 {4292 iMemberChoice = GET_PLAYER(it->ePlayer).GetLeagueAI()->EvaluateVoteForOtherPlayerKnowledge(this, eObserver, GetRepealProposal(iResolutionID));4293 }4294 std::pair<PlayerTypes, int> pair = std::pair<PlayerTypes, int>(it->ePlayer, iMemberChoice);4295 vMemberOpinions.push_back(pair);4296 }4297 }42984299 std::vector<LeagueHelpers::VoteOpinionIntrigueElement> vChoiceCommitments;4300 std::vector<LeagueHelpers::VoteOpinionIntrigueElement> vChoiceLeanings;4301 for (uint iChoiceIndex = 0; iChoiceIndex < vChoices.size(); iChoiceIndex++)4302 {4303 int iChoice = vChoices[iChoiceIndex];4304 int iNumCivsCommitted = 0;4305 int iNumCivsLeaning = 0;4306 int iNumDelegatesCommitted = 0;4307 int iNumDelegatesLeaning = 0;43084309 for (uint iMemberIndex = 0; iMemberIndex < vMemberOpinions.size(); iMemberIndex++)4310 {4311 PlayerTypes eMember = vMemberOpinions[iMemberIndex].first;4312 int iMemberChoice = vMemberOpinions[iMemberIndex].second;4313 int iMemberDelegates = CalculateStartingVotesForMember(eMember);43144315 // Vote Commitment to us4316 int iCommitted = GET_PLAYER(eMember).GetLeagueAI()->GetVoteCommitment(eObserver, iResolutionID, iChoice, bEnact); //here4317 if (iCommitted > 0)4318 {4319 iNumCivsCommitted++;4320 iNumDelegatesCommitted += iCommitted;4321 iMemberDelegates -= iCommitted;4322 CvAssert(iMemberDelegates >= 0);4323 }43244325 // Known leaning4326 if (iMemberChoice == iChoice)4327 {4328 if (iMemberDelegates > 0)4329 {4330 iNumCivsLeaning++;4331 iNumDelegatesLeaning += iMemberDelegates;4332 }4333 }4334 }43354336 if (iNumCivsCommitted > 0)4337 {4338 LeagueHelpers::VoteOpinionIntrigueElement temp;4339 temp.iChoice = iChoice;4340 temp.iNumCivs = iNumCivsCommitted;4341 temp.iNumDelegates = iNumDelegatesCommitted;4342 vChoiceCommitments.push_back(temp);4343 }43444345 if (iNumCivsLeaning > 0)4346 {4347 LeagueHelpers::VoteOpinionIntrigueElement temp;4348 temp.iChoice = iChoice;4349 temp.iNumCivs = iNumCivsLeaning;4350 temp.iNumDelegates = iNumDelegatesLeaning;4351 vChoiceLeanings.push_back(temp);4352 }4353 }43544355 // Votes committed to us (show all of them - don't address if a player makes ones for different choices since that's weird)4356 if (!vChoiceCommitments.empty())4357 {4358 std::stable_sort(vChoiceCommitments.begin(), vChoiceCommitments.end(), LeagueHelpers::VoteOpinionIntrigueSorter());4359 for (uint i = 0; i < vChoiceCommitments.size(); i++)4360 {4361 Localization::String sTemp = Localization::Lookup("TXT_KEY_LEAGUE_OVERVIEW_VOTE_OPINIONS_COMMITMENTS");4362 sTemp << vChoiceCommitments[i].iNumDelegates << vChoiceCommitments[i].iNumCivs << LeagueHelpers::GetTextForChoice(eDecision, vChoiceCommitments[i].iChoice);4363 s += sTemp.toUTF8();4364 }4365 }43664367 // Known leanings (but only show the top ones, lest the tooltip get cut off)4368 int iNumLeaningsShown = 0;4369 int iNumLeaningsToShow = 11;4370 if (!vChoiceLeanings.empty())4371 {4372 std::stable_sort(vChoiceLeanings.begin(), vChoiceLeanings.end(), LeagueHelpers::VoteOpinionIntrigueSorter());4373 for (uint i = 0; i < vChoiceLeanings.size(); i++)4374 {4375 if (iNumLeaningsShown <= iNumLeaningsToShow)4376 {4377 iNumLeaningsShown++;4378 Localization::String sTemp = Localization::Lookup("TXT_KEY_LEAGUE_OVERVIEW_VOTE_OPINIONS_CHOICE");4379 sTemp << vChoiceLeanings[i].iNumDelegates << vChoiceLeanings[i].iNumCivs << LeagueHelpers::GetTextForChoice(eDecision, vChoiceLeanings[i].iChoice);4380 s += sTemp.toUTF8();4381 }4382 else4383 {4384 break;4385 }4386 }4387 }43884389 // Unknown leanings4390 int iNumCivsUnaccounted = 0;4391 int iNumDelegatesUnaccounted = 0;4392 for (uint iMemberIndex = 0; iMemberIndex < vMemberOpinions.size(); iMemberIndex++)4393 {4394 PlayerTypes eMember = vMemberOpinions[iMemberIndex].first;4395 int iMemberChoice = vMemberOpinions[iMemberIndex].second;4396 int iMemberDelegates = CalculateStartingVotesForMember(eMember);43974398 // Vote Commitment to us4399 for (uint i = 0; i < vChoices.size(); i++)4400 {4401 int iCommitted = GET_PLAYER(eMember).GetLeagueAI()->GetVoteCommitment(eObserver, iResolutionID, vChoices[i], bEnact);4402 if (iCommitted > 0)4403 {4404 iMemberDelegates -= iCommitted;4405 CvAssert(iMemberDelegates >= 0);4406 }4407 }44084409 // Unknown leaning4410 if (iMemberChoice == LeagueHelpers::CHOICE_NONE)4411 {4412 if (iMemberDelegates > 0)4413 {4414 iNumCivsUnaccounted++;4415 iNumDelegatesUnaccounted += iMemberDelegates;4416 }4417 }4418 }4419 if (iNumCivsUnaccounted > 0)4420 {4421 Localization::String sTemp = Localization::Lookup("TXT_KEY_LEAGUE_OVERVIEW_VOTE_OPINIONS_UNACCOUNTED");4422 sTemp << iNumDelegatesUnaccounted << iNumCivsUnaccounted;4423 s += sTemp.toUTF8();4424 }44254426 // Our delegation4427 int iOurDelegates = CalculateStartingVotesForMember(eObserver);4428 if (iOurDelegates > 0)4429 {4430 Localization::String sTemp = Localization::Lookup("TXT_KEY_LEAGUE_OVERVIEW_VOTE_OPINIONS_OURS");4431 sTemp << iOurDelegates;4432 s += sTemp.toUTF8();4433 }44344435 return s;4436}