Sure: https://forums.civfanatics.com/resources/realism-invictus-3-601-patch.30399/Do you have a link to the latest version so I can check?
Apologies, it's called 3.601 not 3.6a
Sure: https://forums.civfanatics.com/resources/realism-invictus-3-601-patch.30399/Do you have a link to the latest version so I can check?
there are so many leaders and civ, I hope they will be enough to delay the carnage to when we actually play
Good question; I'm open to both. I've always liked scenarios and I'm currently playing the large earth map (not the huge one) in a singleplayer game. But I suppose there might be balancing issues in this case. What do you and other players think about it? If we choose a random map, I'd prefer Totestra mapscript which I think is probably the best. As for size, I think it also depends on how many human players there are. I'd say large with 4 human players, huge with 6 and giant with 8 although I'm not sure about the last one; I would let the default number of AI players for each map size. I think my pc can handle a giant map even if it's 3 years old (I've autoplayed some games to the end to check), but I don't know about others.
Sure: https://forums.civfanatics.com/resources/realism-invictus-3-601-patch.30399/
Apologies, it's called 3.601 not 3.6a
I don't think I would be able to play every weekend, so maybe this is too much of a commitment
Oh, sorry, skimmed through the thread a little too fast it would seem. That sounds doable!I
It should be once or twice per month, not every weekend. I also wouldn't be able to play every weekend. Would this be ok for you?
What sort of session length is everyone thinking? I'd be able to play for 4-6 hours at a time, probably.
I think we were talking about a couple of hours. I know the game will take a long time to finish, but given you're in the US and bluecivdoom in in India we have little choice. Maybe from time to time we can agree on a longer session but I suppose this is the best we can do for the moment. We'll see how the game will go on.
I am in the modern era in my huge world map single player game right now, I do get the occasional CTD but it's the memory issue, what kind of bug are you experiencing?Thanks, I've checked the patch, it's just xml and python changes, no update to the dll; we can use base 3.6+this patch 3.601 and my dll fix; I strongly advise we use my fix because when I tried autoplaying the game, half of the times it was impossible to finish the game because of the CTD caused by that bug in modern era.
I am in the modern era in my huge world map single player game right now, I do get the occasional CTD but it's the memory issue, what kind of bug are you experiencing?
bool CvUnit::airBomb(int iX, int iY)
{
CvCity* pCity;
CvPlot* pPlot;
CvWString szBuffer;
if (!canAirBombAt(plot(), iX, iY))
{
return false;
}
pPlot = GC.getMapINLINE().plotINLINE(iX, iY);
/* if (!isEnemy(pPlot->getTeam()))
{
getGroup()->groupDeclareWar(pPlot, true);
} */ // Disabled by K-Mod
if (!isEnemy(pPlot->getTeam()))
{
return false;
}
// < Air Combat Experience Start >
if (!isEnemy(pPlot->getTeam()) && !GC.getGameINLINE().isBombNoMansLand())
{
return false;
}
// < Air Combat Experience End >
if (interceptTest(pPlot))
{
return true;
}
pCity = pPlot->getPlotCity();
if (pCity != NULL)
{
pCity->changeDefenseModifier(-airBombCurrRate());
szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_DEFENSES_REDUCED_TO", pCity->getNameKey(), pCity->getDefenseModifier(false), getNameKey());
gDLL->getInterfaceIFace()->addHumanMessage(pCity->getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_BOMBARDED", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pCity->getX_INLINE(), pCity->getY_INLINE(), true, true);
szBuffer = gDLL->getText("TXT_KEY_MISC_ENEMY_DEFENSES_REDUCED_TO", getNameKey(), pCity->getNameKey(), pCity->getDefenseModifier(false));
gDLL->getInterfaceIFace()->addHumanMessage(getOwnerINLINE(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_BOMBARD", MESSAGE_TYPE_INFO, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pCity->getX_INLINE(), pCity->getY_INLINE());
// < Air Combat Experience Start >
if(GC.getGameINLINE().isExperienceGainByAttackingCities())
{
int iExperience = (int)((attackXPValue()*((float)pCity->getDefenseModifier(false)/100))/1.25);
iExperience = range(iExperience, GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT"), GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT"));
changeExperience(iExperience, maxXPValue(), false, pPlot->getOwnerINLINE() == getOwnerINLINE(), !isBarbarian());
}
// < Air Combat Experience End >
}
else
{
if (pPlot->getImprovementType() != NO_IMPROVEMENT)
{
if (GC.getGameINLINE().getSorenRandNum(airBombCurrRate(), "Air Bomb - Offense") >=
GC.getGameINLINE().getSorenRandNum(GC.getImprovementInfo(pPlot->getImprovementType()).getAirBombDefense(), "Air Bomb - Defense"))
{
szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_UNIT_DESTROYED_IMP", getNameKey(), GC.getImprovementInfo(pPlot->getImprovementType()).getTextKeyWide());
gDLL->getInterfaceIFace()->addHumanMessage(getOwnerINLINE(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_PILLAGE", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pPlot->getX_INLINE(), pPlot->getY_INLINE());
if (pPlot->isOwned())
{
szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_IMP_WAS_DESTROYED", GC.getImprovementInfo(pPlot->getImprovementType()).getTextKeyWide(), getNameKey(), getVisualCivAdjective(pPlot->getTeam()));
gDLL->getInterfaceIFace()->addHumanMessage(pPlot->getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_PILLAGED", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pPlot->getX_INLINE(), pPlot->getY_INLINE(), true, true);
}
// < Air Combat Experience Start >
if(GC.getGameINLINE().isExperienceGainByDestroyingImprovements())
{
int iExperience = attackXPValue();
iExperience = (GC.getImprovementInfo(pPlot->getImprovementType()).getAirBombDefense()/iExperience)/2;
iExperience = range(iExperience, GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT"), GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT"));
changeExperience(iExperience, maxXPValue(), false, pPlot->getOwnerINLINE() == getOwnerINLINE(), !isBarbarian());
}
// < Air Combat Experience End >
pPlot->setImprovementType((ImprovementTypes)(GC.getImprovementInfo(pPlot->getImprovementType()).getImprovementPillage()));
}
else
{
szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_UNIT_FAIL_DESTROY_IMP", getNameKey(), GC.getImprovementInfo(pPlot->getImprovementType()).getTextKeyWide());
gDLL->getInterfaceIFace()->addHumanMessage(getOwnerINLINE(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_BOMB_FAILS", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pPlot->getX_INLINE(), pPlot->getY_INLINE());
}
}
// < Air Combat Experience Start >
else if (pPlot->getRouteType() != NO_ROUTE)
{
if(GC.getGameINLINE().isRouteDestructionThroughAirBombs())
{
if (GC.getGameINLINE().getSorenRandNum(airBombCurrRate(), "Air Bomb - Offense") >=
GC.getGameINLINE().getSorenRandNum(GC.getRouteInfo(pPlot->getRouteType()).getAirBombDefense(), "Air Bomb - Defense"))
{
szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_UNIT_DESTROYED_ROUTE", getNameKey(), GC.getRouteInfo(pPlot->getRouteType()).getTextKeyWide());
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_PILLAGE", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pPlot->getX_INLINE(), pPlot->getY_INLINE());
if (pPlot->isOwned())
{
szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_ROUTE_WAS_DESTROYED", GC.getRouteInfo(pPlot->getRouteType()).getTextKeyWide(), getNameKey(), getVisualCivAdjective(pPlot->getTeam()));
gDLL->getInterfaceIFace()->addMessage(pPlot->getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_PILLAGED", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pPlot->getX_INLINE(), pPlot->getY_INLINE(), true, true);
}
if(GC.getGameINLINE().isExperienceGainByDestroyingRoutes())
{
int iExperience = attackXPValue();
iExperience = (GC.getRouteInfo(pPlot->getRouteType()).getAirBombDefense()/iExperience)/2;
iExperience = range(iExperience, GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT"), GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT"));
changeExperience(iExperience, maxXPValue(), false, pPlot->getOwnerINLINE() == getOwnerINLINE(), !isBarbarian());
}
pPlot->setRouteType(NO_ROUTE, true);
}
else
{
szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_UNIT_FAIL_DESTROY_ROUTE", getNameKey(), GC.getRouteInfo(pPlot->getRouteType()).getTextKeyWide());
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_BOMB_FAILS", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pPlot->getX_INLINE(), pPlot->getY_INLINE());
}
}
}
// < Air Combat Experience End >
}
setReconPlot(pPlot);
setMadeAttack(true);
changeMoves(GC.getMOVE_DENOMINATOR());
if (pPlot->isActiveVisible(false))
{
CvAirMissionDefinition kAirMission;
kAirMission.setMissionType(MISSION_AIRBOMB);
kAirMission.setUnit(BATTLE_UNIT_ATTACKER, this);
kAirMission.setUnit(BATTLE_UNIT_DEFENDER, NULL);
kAirMission.setDamage(BATTLE_UNIT_DEFENDER, 0);
kAirMission.setDamage(BATTLE_UNIT_ATTACKER, 0);
kAirMission.setPlot(pPlot);
kAirMission.setMissionTime(GC.getMissionInfo((MissionTypes)MISSION_AIRBOMB).getTime() * gDLL->getSecsPerTurn());
gDLL->getEntityIFace()->AddMission(&kAirMission);
}
if (isSuicide())
{
kill(true);
}
return true;
}
Oh okay, nice spot!There's a repeatable CTD which occurs on some occasion when AI is airbombing an improvemt, here's the relevant code which is embedded in the dll. The part "int iExperience = attackXPValue();" is causing a CTD because if attackXPValue is zero which sometimes happens then iExperience is also zero and hence you get a division by zero in the following lines, which is the cause for the CTD. I've simply fixed the problem by replacing the line in red with int iExperience = std::max(1, attackXPValue()); then you don't get a division by zero anymore, hence no more CTD. I autoplayed many games in the previous months and this problem arised almost half of the games I've autoplayed. You can reload a previous savegame and hope it doesn't happen again, but sometimes there's nothing to do, sooner or later it will happen. So I decided to fix this myself. I posted the fix and tagged Walter so he can add this fix for a future release but maybe he didn't see my post. Anyway, no other changes have been made and this fixes the repeatable CTD.
Code:bool CvUnit::airBomb(int iX, int iY) { CvCity* pCity; CvPlot* pPlot; CvWString szBuffer; if (!canAirBombAt(plot(), iX, iY)) { return false; } pPlot = GC.getMapINLINE().plotINLINE(iX, iY); /* if (!isEnemy(pPlot->getTeam())) { getGroup()->groupDeclareWar(pPlot, true); } */ // Disabled by K-Mod if (!isEnemy(pPlot->getTeam())) { return false; } // < Air Combat Experience Start > if (!isEnemy(pPlot->getTeam()) && !GC.getGameINLINE().isBombNoMansLand()) { return false; } // < Air Combat Experience End > if (interceptTest(pPlot)) { return true; } pCity = pPlot->getPlotCity(); if (pCity != NULL) { pCity->changeDefenseModifier(-airBombCurrRate()); szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_DEFENSES_REDUCED_TO", pCity->getNameKey(), pCity->getDefenseModifier(false), getNameKey()); gDLL->getInterfaceIFace()->addHumanMessage(pCity->getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_BOMBARDED", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pCity->getX_INLINE(), pCity->getY_INLINE(), true, true); szBuffer = gDLL->getText("TXT_KEY_MISC_ENEMY_DEFENSES_REDUCED_TO", getNameKey(), pCity->getNameKey(), pCity->getDefenseModifier(false)); gDLL->getInterfaceIFace()->addHumanMessage(getOwnerINLINE(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_BOMBARD", MESSAGE_TYPE_INFO, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pCity->getX_INLINE(), pCity->getY_INLINE()); // < Air Combat Experience Start > if(GC.getGameINLINE().isExperienceGainByAttackingCities()) { int iExperience = (int)((attackXPValue()*((float)pCity->getDefenseModifier(false)/100))/1.25); iExperience = range(iExperience, GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT"), GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT")); changeExperience(iExperience, maxXPValue(), false, pPlot->getOwnerINLINE() == getOwnerINLINE(), !isBarbarian()); } // < Air Combat Experience End > } else { if (pPlot->getImprovementType() != NO_IMPROVEMENT) { if (GC.getGameINLINE().getSorenRandNum(airBombCurrRate(), "Air Bomb - Offense") >= GC.getGameINLINE().getSorenRandNum(GC.getImprovementInfo(pPlot->getImprovementType()).getAirBombDefense(), "Air Bomb - Defense")) { szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_UNIT_DESTROYED_IMP", getNameKey(), GC.getImprovementInfo(pPlot->getImprovementType()).getTextKeyWide()); gDLL->getInterfaceIFace()->addHumanMessage(getOwnerINLINE(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_PILLAGE", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pPlot->getX_INLINE(), pPlot->getY_INLINE()); if (pPlot->isOwned()) { szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_IMP_WAS_DESTROYED", GC.getImprovementInfo(pPlot->getImprovementType()).getTextKeyWide(), getNameKey(), getVisualCivAdjective(pPlot->getTeam())); gDLL->getInterfaceIFace()->addHumanMessage(pPlot->getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_PILLAGED", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pPlot->getX_INLINE(), pPlot->getY_INLINE(), true, true); } // < Air Combat Experience Start > if(GC.getGameINLINE().isExperienceGainByDestroyingImprovements()) { int iExperience = attackXPValue(); iExperience = (GC.getImprovementInfo(pPlot->getImprovementType()).getAirBombDefense()/iExperience)/2; iExperience = range(iExperience, GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT"), GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT")); changeExperience(iExperience, maxXPValue(), false, pPlot->getOwnerINLINE() == getOwnerINLINE(), !isBarbarian()); } // < Air Combat Experience End > pPlot->setImprovementType((ImprovementTypes)(GC.getImprovementInfo(pPlot->getImprovementType()).getImprovementPillage())); } else { szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_UNIT_FAIL_DESTROY_IMP", getNameKey(), GC.getImprovementInfo(pPlot->getImprovementType()).getTextKeyWide()); gDLL->getInterfaceIFace()->addHumanMessage(getOwnerINLINE(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_BOMB_FAILS", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pPlot->getX_INLINE(), pPlot->getY_INLINE()); } } // < Air Combat Experience Start > else if (pPlot->getRouteType() != NO_ROUTE) { if(GC.getGameINLINE().isRouteDestructionThroughAirBombs()) { if (GC.getGameINLINE().getSorenRandNum(airBombCurrRate(), "Air Bomb - Offense") >= GC.getGameINLINE().getSorenRandNum(GC.getRouteInfo(pPlot->getRouteType()).getAirBombDefense(), "Air Bomb - Defense")) { szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_UNIT_DESTROYED_ROUTE", getNameKey(), GC.getRouteInfo(pPlot->getRouteType()).getTextKeyWide()); gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_PILLAGE", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pPlot->getX_INLINE(), pPlot->getY_INLINE()); if (pPlot->isOwned()) { szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_ROUTE_WAS_DESTROYED", GC.getRouteInfo(pPlot->getRouteType()).getTextKeyWide(), getNameKey(), getVisualCivAdjective(pPlot->getTeam())); gDLL->getInterfaceIFace()->addMessage(pPlot->getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_PILLAGED", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pPlot->getX_INLINE(), pPlot->getY_INLINE(), true, true); } if(GC.getGameINLINE().isExperienceGainByDestroyingRoutes()) { int iExperience = attackXPValue(); iExperience = (GC.getRouteInfo(pPlot->getRouteType()).getAirBombDefense()/iExperience)/2; iExperience = range(iExperience, GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT"), GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT")); changeExperience(iExperience, maxXPValue(), false, pPlot->getOwnerINLINE() == getOwnerINLINE(), !isBarbarian()); } pPlot->setRouteType(NO_ROUTE, true); } else { szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_UNIT_FAIL_DESTROY_ROUTE", getNameKey(), GC.getRouteInfo(pPlot->getRouteType()).getTextKeyWide()); gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_BOMB_FAILS", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pPlot->getX_INLINE(), pPlot->getY_INLINE()); } } } // < Air Combat Experience End > } setReconPlot(pPlot); setMadeAttack(true); changeMoves(GC.getMOVE_DENOMINATOR()); if (pPlot->isActiveVisible(false)) { CvAirMissionDefinition kAirMission; kAirMission.setMissionType(MISSION_AIRBOMB); kAirMission.setUnit(BATTLE_UNIT_ATTACKER, this); kAirMission.setUnit(BATTLE_UNIT_DEFENDER, NULL); kAirMission.setDamage(BATTLE_UNIT_DEFENDER, 0); kAirMission.setDamage(BATTLE_UNIT_ATTACKER, 0); kAirMission.setPlot(pPlot); kAirMission.setMissionTime(GC.getMissionInfo((MissionTypes)MISSION_AIRBOMB).getTime() * gDLL->getSecsPerTurn()); gDLL->getEntityIFace()->AddMission(&kAirMission); } if (isSuicide()) { kill(true); } return true; }
My opinion is I think it would be great to agree on a date/time here in this thread when we will all could "get together" on Discord and work out the details.So, @FireBlaze and @Monsijo are you ok on playing once or twice per month, probably 18-20 GMT or 19-21 GMT during weekends?
For everyone: is it more comfortable to use this forum/thread or do you prefer to use Discord here: https://discord.gg/57RY7sjb ? Four of us are already in the discord channel but I have no preferences. Maybe the discord is more immediate when we play, but I'm ok with any proposal.
So is the plan to speak vocally to each other or just use chat? As far as I know, the game already has a chat function built-in.