We-the-People-civ4col-mod / Mod

This is the repository where the mod resides.
86 stars 36 forks source link

Permanent alliances issues (natives giving away their stuff for free) #124

Closed devolution79 closed 1 year ago

devolution79 commented 5 years ago

From a recent forum post:

"In this game I'm playing, I got an offer for a "permanent alliance" from the nearby native arawak tribe just after a few trades and a couple of missions. Weak as they were, I accepted simply because they were the first tribe to ever offer me such an offer and I was pleasantly surprised I could simply take whatever resources I could from them while trading. It was a bit OP, but having your early colonies use a native civ's food-producing capability is massively fun. The silver doesn't hurt either "

OPINION This makes sense when human players are allied, but for AI players I think that there should be no free stuff, that is simply an exploit. If we compare with BTS, permanent alliances are unlocked with a late mid-game tech. In addition, there are no yields to get for free. I think that they simply copied the logic from BTS but then forgot to adjust it for the COL yield system. Certain native leaders are generally very friendly (Pine Leaf) and it's easy to get a permanent alliance in the early game.

I think that either we should consider a direct nerf like having someone dislike you for having an alliance with the indians or we should only unlock this feature in the late game. Alternatively, we could modify the logic so that a human player cannot get stuff for free from an AI controlled player.

IMPLEMENTATION NOTES

Add this to to DenialTypes CvTeamAI::AI_permanentAllianceTrade(TeamTypes eTeam) const :

bool CvPlayerAI::AI_considerOffer(PlayerTypes ePlayer, const CLinkList pTheirList, const CLinkList pOurList, int iChange)

// Erik: Do not allow AI players on our team to give away all their stuff for free!
// This puts an end to a serious exploit when permanently allied with a native player
if (GET_PLAYER(ePlayer).getTeam() == getTeam() && GET_PLAYER(ePlayer).isHuman())
{
    return true;
}

To easily enter a permanent alliance for testing purposes, add the following to the start of the function: // Erik: for exploit testing only! return NO_DENIAL; This will have the native tribe not object to the alliance so that you can test the effects.

Alternatively, if we consider PA to be unbalanced since they are enabled at the start of the game. We could introduce a XML parameter and let it default to having half of the turns of the game to have passed before actually activating them:

<Define>
    <DefineName>MIN_ROUND_PERMANENT_ALLIANCE</DefineName>
    <iDefineIntVal>150</iDefineIntVal>
</Define>
Nightinggale commented 5 years ago

I never use permanent alliances. If you treat natives well, they give you gifts. If you treat them poorly they attack you. Permanent alliances allows poor treatment without negative consequences. I question if permanent alliances makes any sense at all in Colonization.

devolution79 commented 5 years ago

I don't like it either, in fact I'd favor that we remove the option altogether. There's also other options to review\rework(always war) or to perhaps add (aggressive AI)

Nightinggale commented 5 years ago

Adding or removing GameOptions will break savegames. It's avoidable, but with some not very clean code. Alternatively #46 could be made to avoid this, but implementing that one would break savegames by itself.

The only short term realistic way I can see removal without breaking savegames is to keep the setting, but ignore it. We can then remove the setting once we break savegames anyway. That approach would however result in a non-working setting, which would be a bug in itself.

The cleanest solution is to do nothing in 2.7.x.

raystuttgart commented 1 year ago

This was fixed by closing the exploits.