In terms of garrisoning the pirate ports, using a Drown should work if you don't want to bother with sailing right away.
Got to have necromancy for drowns in this modmod. Quicker to tech sailing I think.
In terms of garrisoning the pirate ports, using a Drown should work if you don't want to bother with sailing right away.
def spellCaveTrials(pCaster):
iX = pCaster.getX()
iY = pCaster.getY()
iPlayer = pCaster.getOwner()
iName = pCaster.getName()
if CyGame().getSorenRandNum(10, "Cave Trials") > 7:
pCaster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_IMMORTAL'), False)
pCaster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_LIFE3'), False)
while pCaster.isImmortal():
pCaster.changeImmortal(-1)
pCaster.kill(True, iPlayer)
CyInterface().addMessage(iPlayer,True,25,CyTranslator().getText("TXT_KEY_MESSAGE_CAVE_TRIALS_DEATH", (iName,)),'',1,'Art/Interface/Buttons/Buildings/Caveofancestors.dds',ColorTypes(7),iX,iY,True,True)
else:
pCaster.changeFreePromotionPick(1)
CyInterface().addMessage(iPlayer,True,25,CyTranslator().getText("TXT_KEY_MESSAGE_CAVE_TRIALS_SUCCESS", (iName,)),'',1,'Art/Interface/Buttons/Buildings/Caveofancestors.dds',ColorTypes(8),iX,iY,True,True)
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_CHANNELING3')):
if CyGame().getSorenRandNum(10, "Cave Trials Complete") < 2:
iCaswallawn = gc.getInfoTypeForString('PROMOTION_CASWALLAWN')
pCaswallawn = -1
for pUnit in PyPlayer(iPlayer).getUnitList():
if pUnit.isHasPromotion(iCaswallawn):
pCaswallawn = pUnit
break
[COLOR="Green"] pCaster.setHasPromotion(iCaswallawn, true)[/COLOR]
if pCaswallawn != -1:
if getCombatOdds(pCaster, pCaswallawn) > 500:
pCaster.setHasPromotion(iCaswallawn, False)
pCaster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_IMMORTAL'), False)
pCaster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_LIFE3'), False)
while pCaster.isImmortal():
pCaster.changeImmortal(-1)
pCaster.kill(True, pCaswallawn.getOwner())
CyInterface().addMessage(iPlayer,True,25,CyTranslator().getText("TXT_KEY_MESSAGE_CAVE_TRIALS_NEW_CASWALLAWN", (iName,)),'',1,'Art/Interface/Buttons/Buildings/Caveofancestors.dds',ColorTypes(7),iX,iY,True,True)
else:
pCaswallawn.setHasPromotion(iCaswallawn, False)
pCaswallawn.setHasPromotion(gc.getInfoTypeForString('PROMOTION_IMMORTAL'), False)
pCaswallawn.setHasPromotion(gc.getInfoTypeForString('PROMOTION_LIFE3'), False)
while pCaswallawn.isImmortal():
pCaswallawn.changeImmortal(-1)
pCaswallawn.kill(True, iPlayer)
pCaster.setHasPromotion(iCaswallawn, True)
pCaster.setName("The Caswallawn")
CyInterface().addMessage(iPlayer,True,25,CyTranslator().getText("TXT_KEY_MESSAGE_CAVE_TRIALS_OLD_CASWALLAWN", (iName,)),'',1,'Art/Interface/Buttons/Buildings/Caveofancestors.dds',ColorTypes(7),iX,iY,True,True)
[COLOR="Green"] else:
CyInterface().addMessage(iPlayer,True,25,CyTranslator().getText("TXT_KEY_MESSAGE_CAVE_TRIALS_NEW_CASWALLAWN", (iName,)),'',1,'Art/Interface/Buttons/Buildings/Caveofancestors.dds',ColorTypes(8),iX,iY,True,True)[/COLOR]
def getAllUnitList(self):
' UnitList - All alive units of all alive players'
lUnits = []
for player in self.getCivPlayerList():
for pUnit in player.getUnitList():
lUnits.append(pUnit)
return lUnits
def reqCaveTrials(pCaster):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_CASWALLAWN')):
return False
if not pCaster.canAcquirePromotionAny():
if not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_CHANNELING3')):
return False
return True
def spellCaveTrials(pCaster):
iX = pCaster.getX()
iY = pCaster.getY()
iPlayer = pCaster.getOwner()
sNameCaster = pCaster.getName()
if CyGame().getSorenRandNum(10, "Cave Trials") > 7:
pCaster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_IMMORTAL'), False)
pCaster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_LIFE3'), False)
while pCaster.isImmortal():
pCaster.changeImmortal(-1)
pCaster.kill(True, iPlayer)
CyInterface().addMessage(iPlayer,True,25,CyTranslator().getText("TXT_KEY_MESSAGE_CAVE_TRIALS_DEATH", (sNameCaster,)),'',1,'Art/Interface/Buttons/Buildings/Caveofancestors.dds',ColorTypes(7),iX,iY,True,True)
else:
pCaster.changeFreePromotionPick(1)
CyInterface().addMessage(iPlayer,True,25,CyTranslator().getText("TXT_KEY_MESSAGE_CAVE_TRIALS_SUCCESS", (sNameCaster,)),'',1,'Art/Interface/Buttons/Buildings/Caveofancestors.dds',ColorTypes(8),iX,iY,True,True)
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_CHANNELING3')):
if not pCaster.canAcquirePromotionAny() or CyGame().getSorenRandNum(100, "Cave Trials Complete") < 2:
iCaswallawn = gc.getInfoTypeForString('PROMOTION_CASWALLAWN')
for pUnit in PyHelpers.PyGame().getAllUnitList():
if pUnit.isHasPromotion(iCaswallawn):
iPlayerUnit = pUnit.getOwner()
sNameCaswallawn = pUnit.getName()
iOdds = getCombatOdds(pCaster, pUnit)
if iOdds < 500:
pCaster.setHasPromotion(iCaswallawn, False)
pCaster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_IMMORTAL'), False)
pCaster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_LIFE3'), False)
while pCaster.isImmortal():
pCaster.changeImmortal(-1)
pCaster.kill(True, pUnit.getOwner())
pUnit.changeExperience(1, -1, False, False, False)
pUnit.setDamage(CyGame().getSorenRandNum(iOdds/5, "Caswallawn Dual"), iPlayer)
if iPlayer == iPlayerUnit:
CyInterface().addMessage(iPlayer,True,25,CyTranslator().getText("TXT_KEY_MESSAGE_CAVE_TRIALS_OLD_CASWALLAWN_WON", ("Your", sNameCaster,"your",sNameCaswallawn,)),'',1,'Art/Interface/Buttons/Buildings/Caveofancestors.dds',ColorTypes(6),iX,iY,True,True)
else:
CyInterface().addMessage(iPlayer,True,25,CyTranslator().getText("TXT_KEY_MESSAGE_CAVE_TRIALS_OLD_CASWALLAWN_WON", ("Your", sNameCaster,gc.getPlayer(iPlayerUnit).getName() + "'s",sNameCaswallawn,)),'',1,'Art/Interface/Buttons/Buildings/Caveofancestors.dds',ColorTypes(7),iX,iY,True,True)
CyInterface().addMessage(iPlayerUnit,True,25,CyTranslator().getText("TXT_KEY_MESSAGE_CAVE_TRIALS_OLD_CASWALLAWN_WON", (gc.getPlayer(iPlayer).getName() + "'s", sNameCaster,"your",sNameCaswallawn,)),'',1,'Art/Interface/Buttons/Buildings/Caveofancestors.dds',ColorTypes(8),iX,iY,True,True)
else:
pUnit.setHasPromotion(iCaswallawn, False)
pUnit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_IMMORTAL'), False)
pUnit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_LIFE3'), False)
while pUnit.isImmortal():
pUnit.changeImmortal(-1)
pUnit.kill(True, iPlayer)
pCaster.setHasPromotion(iCaswallawn, True)
pCaster.changeExperience(1, -1, False, False, False)
pCaster.setDamage(CyGame().getSorenRandNum((iOdds - 500)/5, "Caswallawn Dual"), iPlayerUnit)
if iPlayer == iPlayerUnit:
CyInterface().addMessage(iPlayer,True,25,CyTranslator().getText("TXT_KEY_MESSAGE_CAVE_TRIALS_OLD_CASWALLAWN_DEFEATED", ("Your",sNameCaster,"your",sNameCaswallawn,)),'',1,'Art/Interface/Buttons/Buildings/Caveofancestors.dds',ColorTypes(6),iX,iY,True,True)
else:
CyInterface().addMessage(iPlayer,True,25,CyTranslator().getText("TXT_KEY_MESSAGE_CAVE_TRIALS_OLD_CASWALLAWN_DEFEATED", ("Your", sNameCaster,gc.getPlayer(iPlayerUnit).getName() + "'s",sNameCaswallawn,)),'',1,'Art/Interface/Buttons/Buildings/Caveofancestors.dds',ColorTypes(8),iX,iY,True,True)
CyInterface().addMessage(iPlayerUnit,True,25,CyTranslator().getText("TXT_KEY_MESSAGE_CAVE_TRIALS_OLD_CASWALLAWN_DEFEATED", (gc.getPlayer(iPlayer).getName() + "'s", sNameCaster,"your",sNameCaswallawn,)),'',1,'Art/Interface/Buttons/Buildings/Caveofancestors.dds',ColorTypes(7),iX,iY,True,True)
break
else:
pCaster.setHasPromotion(iCaswallawn, True)
CyInterface().addMessage(iPlayer,True,25,CyTranslator().getText("TXT_KEY_MESSAGE_CAVE_TRIALS_NEW_CASWALLAWN", (sNameCaster,)),'',1,'Art/Interface/Buttons/Buildings/Caveofancestors.dds',ColorTypes(8),iX,iY,True,True)
<TEXT>
<Tag>TXT_KEY_MESSAGE_CAVE_TRIALS_OLD_CASWALLAWN_DEFEATED</Tag>
<English>%s1 %s2 has slain %s3 %s4 in arcane combat, usurping the rank of Caswallawn</English>
<French>%s1 %s2 has slain %s3 %s4 in arcane combat, usurping the rank of Caswallawn</French>
<German>%s1 %s2 has slain %s3 %s4 in arcane combat, usurping the rank of Caswallawn</German>
<Italian>%s1 %s2 has slain %s3 %s4 in arcane combat, usurping the rank of Caswallawn</Italian>
<Spanish>%s1 %s2 has slain %s3 %s4 in arcane combat, usurping the rank of Caswallawn</Spanish>
</TEXT>
<TEXT>
<Tag>TXT_KEY_MESSAGE_CAVE_TRIALS_OLD_CASWALLAWN_WON</Tag>
<English>%s1 %s2 foolishly challenged %s3 %s4 for the rank of Caswallawn, and was slain for his hubris</English>
<French>%s1 %s2 foolishly challenged %s3 %s4 for the rank of Caswallawn, and was slain for his hubris</French>
<German>%s1 %s2 foolishly challenged %s3 %s4 for the rank of Caswallawn, and was slain for his hubris</German>
<Italian>%s1 %s2 foolishly challenged %s3 %s4 for the rank of Caswallawn, and was slain for his hubris</Italian>
<Spanish>%s1 %s2 foolishly challenged %s3 %s4 for the rank of Caswallawn, and was slain for his hubris</Spanish>
</TEXT>
<TEXT>
<Tag>TXT_KEY_MESSAGE_CAVE_TRIALS_NEW_CASWALLAWN</Tag>
<English>Your %s1 has passed every trial, and earned the rank of Caswallawn</English>
<French>Your %s1 has passed every trial, and earned the rank of Caswallawn</French>
<German>Your %s1 has passed every trial, and earned the rank of Caswallawn</German>
<Italian>Your %s1 has passed every trial, and earned the rank of Caswallawn</Italian>
<Spanish>Your %s1 has passed every trial, and earned the rank of Caswallawn</Spanish>
</TEXT>
<TEXT>
<Tag>TXT_KEY_MESSAGE_CAVE_TRIALS_SUCCESS</Tag>
<English>Your %s1 has passed this test, and emerged from the trial more skilled than before.</English>
<French>Your %s1 has passed this test, and emerged from the trial more skilled than before.</French>
<German>Your %s1 has passed this test, and emerged from the trial more skilled than before.</German>
<Italian>Your %s1 has passed this test, and emerged from the trial more skilled than before.</Italian>
<Spanish>Your %s1 has passed this test, and emerged from the trial more skilled than before.</Spanish>
</TEXT>
<TEXT>
<Tag>TXT_KEY_MESSAGE_CAVE_TRIALS_DEATH</Tag>
<English>When the illusions pass, you find only a corpse. Your %s1 was unprepared, overconfident, and failed the test.</English>
<French>When the illusions pass, you find only a corpse. Your %s1 was unprepared, overconfident, and failed the test.</French>
<German>When the illusions pass, you find only a corpse. Your %s1 was unprepared, overconfident, and failed the test.</German>
<Italian>When the illusions pass, you find only a corpse. Your %s1 was unprepared, overconfident, and failed the test.</Italian>
<Spanish>When the illusions pass, you find only a corpse. Your %s1 was unprepared, overconfident, and failed the test.</Spanish>
</TEXT>
The xml-only spell applies it to all units of the appropriate UNITCOMBAT types, in this case only UNITCOMBAT_NAVAL.Some feedback, if you do not mind.
I am a new in FFH gameplay, and maybe too scrupulous... But there is some flaws, that i noticed:
1) Can cast Fair Winds (air 1) on Trojan Horse. That, i think, is not right, because... it has no sails.
This is as Tholal intended it. (I have nothing to do with this.) Units traded through diplomacy are set as immobile for the first several turns. Eventually their immobility will run out and they will be able to move again.2) Frigate obtained via diplmacy cannot move.
I think this was a Tholal issue. I just now added a different TXT_KEY to have the Undercouncil position called Dark Magistrate instead.3) Text of solving for new resolution in Undercouncil (as dark magistrate) is taking from Overcouncil ("as a head-councilor you can make a proposition of new resolution for Overcouncil" - something like this). Not sure about inverse case.
I just tested this and had no problem whatsoever.4) In World Builder: when trying to manually assign the production of Acheron or Tumtum in barbarian city - boom in OS (CTD).
Yeah. I'm not an expert on these, but I think I can see how it works well enough to give more options to specific leaders or players. It is not a high priority though.5) Diplomacy texts can be more individual and diverse.
I just now fixed the mana inscriptions. (I thought I'd caught them all before, but I guess those 2 got away.)6) Civilopedia texts: there is mistake in descrption of dimension mana (all sheaim arcane units gain dimension 1 (not air 1); and in the description of mind mana - typo in the same place. And it would be better if there was the description for "evangelist" promotion (for what purpose it can be used).
I'm not familiar with it. When I looked it up it seems to be based on MNAI v2.42. Does it work with v2.5 too?7) Can you include lfgr's Events Enhanced 1.6 in your modmod, as in his modmod (thanks to ostar)? It will be so better...
It makes sense. Does he have actual code I could borrow yet though. I have made some changes to revolutions on my own (mostly related to stopping the new civs from adopting religions they would otherwise be unable to adopt), but I'm not sure I understand it well enough to try to implement it like this on my own.8) What do you think about lfgr's "some thoughts on revolutions", in particular: "...The Revolution mod is actually "wasting" leaders; almost every revolt gets a leader, even if it consist of two warriors and is put down next turn. It's good to have minor leaders for this, but I think less powerful revolutions should only gererate (potential non-orc) barbarians...".
I too agree, that it is a bit annoying as so many leaders appearing from revolts outside cities with several units for only to be eliminated on next turn.
If two players use the same color scheme then their borders will merge like that.9) One cosmetic remark: when i started a new game with two civilizations of Ljosalfar (with two different leaders) and two civilizations of Sheaim (the same), there was that one of Ljosalfars and Clan of Embers gained the same color (orange) in result. Even their borders are merged when they meet. Is that normal? (From start there were 16 civs in game).
The AI is really an issue for Tholal.10) AI's diplomatic course of actions are awful. They can get considerably more from diplomacy (resources, technologies, wars), than they have now... And AI's is too willingly declare new wars, when they have one or even more at their hands already. And more, AI's somehow won't make peace even if they can, when they wage wars on several fronts. (In my last game Malakim waged wars with almost the whole world and through diplmacy window i saw, that they could make peace with anyone, but... they didn't do that, and lose cities one by one... Stupid Varn Gosam).
As i think, AI's should strive to maintain one war at a time, max - two, with weaker pray ("strategy of lion") or even stronger pray when it wage wars with other civs ("strategy of jackal"), in all other cases they must seeking ways for making peace. And that is a politics for evil and neutrals civs (predators); for Good civs... well, they must always be seeking peace with everybody (except maybe Bannor and against Ashen Veil-adopted civs). IMHO
Yeah, it is a bit odd. Maybe she had enough happiness and valued the research and GPP boost more?11) In your modmod temples of different religions have happiness\unhappiness effect depending on overcouncil\undercouncil. In one of my games Arendel (Ljosalfar) became neutral, adopted Undercouncil, but when Empyrean spread in her cities she without second thought built temples of empyrean... Strange choice, i say.
I don't really like forced wars.12) In my opinion, angels of Basium and Infernal demons must be much more aggresive, after all they arrive on Erebus to conquer and to eliminate their eternal enemies, and they care not about diplomacy games or even well-being of the world of mortals. And what is the most important, that it is their nature, so they can't willingly change their alignment or ideology... My suggestion: Infernals automatically declare wars on every non Ashen Veil civ and Basium in the same way - to every evil civ. And Basium religion strict to Order and Infernals - to Ashen Veil, and there is no change for them. IMHO
Note: There is need to consider a teamplay, when one team composed of evil and non-evil civs. When non-evil build Mercurian Gates and summon Basium there must be choice for exclude from team or Mercurians themselves, or every other evil members. Otherwise it turns out rubbish.
I know, that some moments i mentioned above must be addressed not to you, but to Tholal... Maybe you can tell him.
Thanks.
<UnitInfo>
<Class>UNITCLASS_PRIVATEER</Class>
<Type>UNIT_PRIVATEER</Type>
...
<bSuicide>0</bSuicide>
<bHiddenNationality>0</bHiddenNationality>
<bAlwaysHostile>1</bAlwaysHostile>
<UnitClassUpgrades>
</UnitClassUpgrades>
...
(from CIV4UnitInfos.xml)
Hello.
Who are playing this mod in multiplayer ? Is this mod is intented to be a balancing mod in competitive multiplayer ?
it is very unbalanced - fun as hell in single player![]()