|
楼主 |
发表于 2013-10-19 10:24:02
|
显示全部楼层
主要的判定是这两句,中间计算太复杂,不用管。
if(iPlayersKilledPercent >= /*40*/ GC.getWARMONGER_THREAT_CRITICAL_PERCENT_THRESHOLD())
eThreatType = THREAT_CRITICAL;
if(iPlayersKilledPercent >= /*25*/ GC.getWARMONGER_THREAT_SEVERE_PERCENT_THRESHOLD())
eThreatType = THREAT_SEVERE;
大概的意思是说,如果玩家征服AI或城邦超过40%,战犯判定直接极其严重,超过25%,判定为严重。
这个百分数是经过一串计算的,不是直接值。
==================================分割线===============================================
上接3#楼,CvPlayer.cpp:
解放城市减少相应的战犯点,战犯点算法与占领城市相同,红字部分
/// This player liberates iOldCityID and gives it back to ePlayer
void CvPlayer::DoLiberatePlayer(PlayerTypes ePlayer, int iOldCityID)
{
CvCity* pCity = getCity(iOldCityID);
CvAssert(pCity);
if (!pCity)
return;
PlayerTypes eOldOwner = pCity->getOwner();
CvPlot* pPlot = pCity->plot();
// Set that this team has been liberated
TeamTypes eTeam = getTeam();
TeamTypes eLiberatedTeam = GET_PLAYER(ePlayer).getTeam();
// Who originally took out this team?
TeamTypes eConquerorTeam = GET_TEAM(eLiberatedTeam).GetKilledByTeam();
if (!GET_PLAYER(ePlayer).isAlive())
{
GET_PLAYER(ePlayer).setBeingResurrected(true);
GET_TEAM(eLiberatedTeam).SetLiberatedByTeam(eTeam);
// Put everyone at peace with this guy
for(int iOtherTeamLoop = 0; iOtherTeamLoop < MAX_CIV_TEAMS; iOtherTeamLoop++)
{
if(eLiberatedTeam != iOtherTeamLoop)
{
GET_TEAM(eLiberatedTeam).makePeace((TeamTypes) iOtherTeamLoop, /*bBumpUnits*/false, /*bSuppressNotification*/true);
}
}
if (!GET_PLAYER(ePlayer).isMinorCiv())
{
// add notification
Localization::String strMessage = Localization::Lookup("TXT_KEY_NOTIFICATION_CIV_RESURRECTED");
strMessage << getCivilizationShortDescriptionKey(); // LIBERATING CIV NAME
strMessage << pCity->getNameKey(); // CITY NAME
strMessage << GET_PLAYER(ePlayer).getCivilizationAdjectiveKey(); // LIBERATED CIV NAME
strMessage << GET_PLAYER(ePlayer).getCivilizationDescriptionKey();// LIBERATED CIV NAME
Localization::String strSummary = Localization::Lookup("TXT_KEY_NOTIFICATION_CIV_RESURRECTED_SHORT");
if(GC.getGame().isGameMultiPlayer() && GET_PLAYER(ePlayer).isHuman())
{
strSummary << GET_PLAYER(ePlayer).getNickName();
}
else
{
strSummary << GET_PLAYER(ePlayer).getNameKey();
}
if(GC.getGame().isGameMultiPlayer() && GET_PLAYER(m_eID).isHuman())
{
strSummary << GET_PLAYER(m_eID).getNickName();
}
else
{
strSummary << GET_PLAYER(m_eID).getNameKey();
}
for(int iI = 0; iI < MAX_PLAYERS; iI++)
{
const PlayerTypes eOtherPlayer = static_cast<PlayerTypes>(iI);
CvPlayerAI& kOtherPlayer = GET_PLAYER(eOtherPlayer);
if(kOtherPlayer.isAlive() && kOtherPlayer.GetNotifications() && iI != m_eID)
{
kOtherPlayer.GetNotifications()->Add(NOTIFICATION_RESURRECTED_MAJOR_CIV, strMessage.toUTF8(), strSummary.toUTF8(), pCity->getX(), pCity->getY(), -1);
}
}
CvString temp = strMessage.toUTF8();
GC.getGame().addReplayMessage(REPLAY_MESSAGE_MAJOR_EVENT, m_eID, temp);
}
}
else
{
GET_PLAYER(ePlayer).GetDiplomacyAI()->ChangeNumCitiesLiberated(m_eID, 1);
if (!GET_PLAYER(ePlayer).isMinorCiv())
{
// add notification
Localization::String strMessage = Localization::Lookup("TXT_KEY_NOTIFICATION_CITY_LIBERATED");
if(GC.getGame().isGameMultiPlayer() && isHuman())
{
strMessage << getNickName();
}
else
{
strMessage << getNameKey();
}
strMessage << pCity->getNameKey(); // CITY NAME
strMessage << GET_PLAYER(ePlayer).getCivilizationShortDescriptionKey();// RESTORED CIV NAME
Localization::String strSummary = Localization::Lookup("TXT_KEY_NOTIFICATION_CIV_LIBERATED_SHORT");
strSummary << pCity->getNameKey();
if(GC.getGame().isGameMultiPlayer() && GET_PLAYER(ePlayer).isHuman())
{
strSummary << GET_PLAYER(ePlayer).getNickName();
}
else
{
strSummary << GET_PLAYER(ePlayer).getNameKey();
}
for(int iI = 0; iI < MAX_PLAYERS; iI++)
{
const PlayerTypes eOtherPlayer = static_cast<PlayerTypes>(iI);
CvPlayerAI& kOtherPlayer = GET_PLAYER(eOtherPlayer);
if(kOtherPlayer.isAlive() && kOtherPlayer.GetNotifications() && iI != m_eID)
{
kOtherPlayer.GetNotifications()->Add(NOTIFICATION_LIBERATED_MAJOR_CITY, strMessage.toUTF8(), strSummary.toUTF8(), pCity->getX(), pCity->getY(), -1);
}
}
}
}
// Give the city back to the liberated player
GET_PLAYER(ePlayer).acquireCity(pCity, false, true);
if (!GET_PLAYER(ePlayer).isMinorCiv())
{
// slewis - if the player we're liberating the city for is dead, give the liberating player a resurrection mark in the once-defeated player's book
if (!GET_PLAYER(ePlayer).isAlive())
{
CvDiplomacyAI* pDiploAI = GET_PLAYER(ePlayer).GetDiplomacyAI();
PlayerTypes eMePlayer = GetID();
pDiploAI->SetResurrectedBy(eMePlayer, true);
pDiploAI->SetLandDisputeLevel(eMePlayer, DISPUTE_LEVEL_NONE);
pDiploAI->SetWonderDisputeLevel(eMePlayer, DISPUTE_LEVEL_NONE);
pDiploAI->SetMinorCivDisputeLevel(eMePlayer, DISPUTE_LEVEL_NONE);
pDiploAI->SetWarmongerThreat(eMePlayer, THREAT_NONE);
pDiploAI->SetPlayerNoSettleRequestCounter(eMePlayer, -1);
pDiploAI->SetPlayerStopSpyingRequestCounter(eMePlayer, -1);
pDiploAI->SetDemandCounter(eMePlayer, -1);
pDiploAI->ChangeNumTimesCultureBombed(eMePlayer, -pDiploAI->GetNumTimesCultureBombed(eMePlayer));
pDiploAI->ChangeNegativeReligiousConversionPoints(eMePlayer, -pDiploAI->GetNegativeReligiousConversionPoints(eMePlayer));
pDiploAI->ChangeNegativeArchaeologyPoints(eMePlayer, -pDiploAI->GetNegativeArchaeologyPoints(eMePlayer));
pDiploAI->ChangeNumTimesRobbedBy(eMePlayer, -pDiploAI->GetNumTimesRobbedBy(eMePlayer));
pDiploAI->SetPlayerBrokenMilitaryPromise(eMePlayer, false);
pDiploAI->SetPlayerIgnoredMilitaryPromise(eMePlayer, false);
pDiploAI->SetBrokenBorderPromiseValue(eMePlayer, 0);
pDiploAI->SetIgnoredBorderPromiseValue(eMePlayer, 0);
pDiploAI->SetBrokenExpansionPromiseValue(eMePlayer, 0);
pDiploAI->SetIgnoredExpansionPromiseValue(eMePlayer, 0);
pDiploAI->SetPlayerBrokenAttackCityStatePromise(eMePlayer, false);
pDiploAI->SetPlayerIgnoredAttackCityStatePromise(eMePlayer, false);
pDiploAI->SetPlayerBrokenBullyCityStatePromise(eMePlayer, false);
pDiploAI->SetPlayerIgnoredBullyCityStatePromise(eMePlayer, false);
pDiploAI->SetPlayerBrokenNoConvertPromise(eMePlayer, false);
pDiploAI->SetPlayerIgnoredNoConvertPromise(eMePlayer, false);
pDiploAI->SetPlayerBrokenNoDiggingPromise(eMePlayer, false);
pDiploAI->SetPlayerIgnoredNoDiggingPromise(eMePlayer, false);
pDiploAI->SetPlayerBrokenSpyPromise(eMePlayer, false);
pDiploAI->SetPlayerIgnoredSpyPromise(eMePlayer, false);
pDiploAI->SetPlayerBrokenCoopWarPromise(eMePlayer, false);
pDiploAI->SetOtherPlayerNumProtectedMinorsKilled(eMePlayer, 0);
pDiploAI->SetOtherPlayerNumProtectedMinorsAttacked(eMePlayer, 0);
pDiploAI->SetOtherPlayerNumProtectedMinorsBullied(eMePlayer, 0);
pDiploAI->SetOtherPlayerTurnsSinceSidedWithProtectedMinor(eMePlayer, -1);
pDiploAI->SetFriendDenouncedUs(eMePlayer, false);
pDiploAI->SetDenouncedPlayer(eMePlayer, false); // forget any denouncing
GetDiplomacyAI()->SetDenouncedPlayer(ePlayer, false); // forget any denouncing
pDiploAI->SetFriendDeclaredWarOnUs(eMePlayer, false);
pDiploAI->ChangeNumTimesNuked(eMePlayer, -pDiploAI->GetNumTimesNuked(eMePlayer));
}
}
// Now verify the player is alive
GET_PLAYER(ePlayer).verifyAlive();
GET_PLAYER(ePlayer).setBeingResurrected(false);
// Is this a Minor we have liberated?
if(GET_PLAYER(ePlayer).isMinorCiv())
{
GET_PLAYER(ePlayer).GetMinorCivAI()->DoLiberationByMajor(eOldOwner, eConquerorTeam);
}
// slewis
// negate warmonger
for(int iMajorLoop = 0; iMajorLoop < MAX_MAJOR_CIVS; iMajorLoop++)
{
PlayerTypes eMajor = (PlayerTypes)iMajorLoop;
if(GetID() != eMajor && GET_PLAYER(eMajor).isAlive())
{
// Have I met the player who conquered the city?
if(GET_TEAM(GET_PLAYER(eMajor).getTeam()).isHasMet(getTeam()))
{
int iNumCities = max(GET_PLAYER(ePlayer).getNumCities(), 1);
int iWarmongerOffset = CvDiplomacyAIHelpers::GetWarmongerOffset(iNumCities);
GET_PLAYER(eMajor).GetDiplomacyAI()->ChangeOtherPlayerWarmongerAmount(GetID(), -iWarmongerOffset);
}
}
}
// Move Units from player that don't belong here
if(pPlot->getNumUnits() > 0)
{
// Get the current list of units because we will possibly be moving them out of the plot's list
IDInfoVector currentUnits;
if (pPlot->getUnits(¤tUnits) > 0)
{
for(IDInfoVector::const_iterator itr = currentUnits.begin(); itr != currentUnits.end(); ++itr)
{
CvUnit* pLoopUnit = (CvUnit*)GetPlayerUnit(*itr);
if(pLoopUnit && pLoopUnit->getOwner() == eOldOwner)
{
pLoopUnit->finishMoves();
if (!pLoopUnit->jumpToNearestValidPlot())
pLoopUnit->kill(false);
}
}
}
}
}
[ 本帖最后由 everchu 于 2013-10-20 16:54 编辑 ] |
|