[MOD] MagisterModmod

After playing some time, I have observed some issues and decided to communicate them here in case you feel apropriate to change in the mod.
  • The Attached Warlord ability - When used, the chosen unit does not inherit the name and promotions of the selected Great Commander, only the Attached Commander Promotion. For example, it would be fun if an Axeman with Averax the Cambion as attached commander inherit the Sundered Promotion, as well his name. Also, why they don't have an skin with their attached units like the Great General unit ?
  • Is it possible to space the religions names in the religious advisor window? Some of the names are appearing on the next one.
  • The crime rate – This one is a nice tool applied to the mod, but not well explored. In some games I have cities with 100% of crime and they are the richest, high culturally, and scientific of the empires I have built. Also, they was the happiest cities. The problem is that an absurd rate of crime should have great consequences that not happen in the gameplays. Events like riots, stolen money, corruption, increased unhappiness and unhealthy, more facility in kidnapping great people that stand in such cities, spreading evil religions and others can be applied to the mod, giving a much more dynamic and fun experience.
  • The Advanced Diplomacy – Certain elements like the cease talking bottom does not work. In addition, when the player is at war with civilization B, the diplomatic tab shows the option to declare war to civ B even if they are already at war.
  • Events – Some of the events have no physical consequences in the game, like the volcano event that never destroys any improvements in the titles around it or cause considerable damage to cities close to the recently created volcano. It only eventually burn the forests around it. Other example is Tali Constellation, which never occurs anything.
  • Events that help modify the Alignment of a civ – At now the only things that modify the alignments are mostly religious. Maybe some of the events could be more active in that element, like the one of the children that will change the world, for example.
  • The White Hand – Just technical issues like the initial text that appears doubled, the video is the same of Council of Esus and the soundtrack that exists in the scenarios is not the same of the standard game. Maybe the video could be some part of the Age of Ice mod intro.
Well, these are the only ones, for now. Thanks for this great work and dedication of yours !
 
I just now added a Greater Rift gate, making it so that the basic one allows 1 airlift and the affinity one allows 3. I believe those do stack together with each other and with the Obsidian Gates and Nexus in order to allow more units to be airlifted on the same turn.


A rift gate with more than 1 movement point can already make multiple trips, so long as each trip is to a tile with no additional movement penalties.
 
I'm quickly noting my thoughts:
- regenerate already applies to all stack (maybe "greater regenerate" could affect non-living units ; same with "greater haste" (maybe not for mecanical : siege or golem which cannot in anyway be considered as having a form of body ; alternatively, greater haste could give 2mvt, but that would be really OP)
- giving 3rd ring would be good for creation... but changing settlement to city for kurios would need to be permanent, and as balancing: sacrifice the archmage or at least sacrifice the affinity...
- auric seems great
- Summons being banned from getting a supplemental "affinity" is good ; but getting Strong might be too weak, so strong + 2 summons could be the right balance
- for buildings: no ideas....but new buildings could be great : +science per mind mana
 
What would you think if I made Leader-specific palace buildings, to replace the normal Civ-Specific palaces, at least for those leaders whose canonical affinity is known to include mana types not provided by their civ's normal palace?

For example, Tebryn Arbandi would start with a palace providing Dimensional, Death, and Enchantment mana rather than the standard Sheaim palace's Dimensional, Fire, and Chaos shared by Os-Gabella, Malchiavic, Averax the Cambion, and Gosea the Dwindling (at least until more info reveals better mana choices for them). Arendel Phaedra and Amelanchier might still start with Nature, Sun, and Life mana, but Thessa would have Nature, Death, and Life. Keelyn would have Mind, Dimensional, and Chaos. Dain would have Metamagic, Fire, and Sun. Alexis would have Body, Death, and Spirit.

I'm thinking having different mana for each leader could make some interesting and thematic differences in playstyle.

A potential problem is that I don't think it can be implemented without a bit of python. I believe implementing the code to actually switch out the palaces is so easy that it is trivial, but making the palaces appear in the 'pedia so that players understand what is going on could get complicated.

At the moment I have it set up so that players effective mana supply (that which is used to determine the free affinity promotions, but due to coding restraints does does not effect the strength bonus from affinity or allow the purchase of promotions) is boosted by 2 for the civ's patron sphere and 1 for that civ's other two mana sources. That code could get more complicated if I make it use the leader-specific mana.

I also currently have it reducing the effective supply for the patron's sphere's opposing sphere, but if I am going to follow the mana types given for the Decliarchs Alexis and Tebryn I think I'd have to remove that malus as it would otherwise cancel out a free mana source. (Body opposes spirit, dimensional opposes enchantment.)



I am currently testing out how the game feels without Unholy Taint allowing access to any spell sphere promotions, but granting 2 types of affinity based on whatever Demonic Pacts are currently active.

I'm also about to see how well it works if each Demon Lord gives Unholy Taint to a different thematically appropriate unit. E.g., Sallos would give Unholy Taint to Succubi, and both Mind and Body affinity to all units with Unholy Taint (including Succubi) Ouzza would give Unholy Taint to Chaos Marauders, and Fire and Chaos Affinity to all unit with Unholy Taint (including Chaos Marauders).

There is no easy way to trace the source of a unit's affinity, so an arcane unit that takes the Unholy Taint promotion to gain extra affinities from a Demonic Pact could end up losing its original affinity if such a pact is ever broken. I think I'm ok with that.

I'm still planning on only granting random affinity to mages and archmages, not adepts, but giving adepts the standard 1st tier spells. To reduce clutter of promotions and duplicate spells, the affinity promotions would remove the normal promotions in that sphere. (Demonic pacts could thus also cost mages the spells they learned from experience if the temporarily gain affinity for that sphere.)

I was previously planning on having the first level spell spheres remain unchanged and have no affinity bonus, but I am about to test a version where the affinity promotions replace those two with stronger versions of adept level spells. The main impetus there is a desire to see Judecca fulfill his canonical rose as "the Rustbringer," which requires a version of the Rust spell that is hard to resist.

The archmage level affinity spells definitely require affinity and channeling 2, but I am still debating whether to require channeling to access the 1st and 2nd level spells.

I still want Ritualists and Mobius witches to be able to use those spells so they don't become underpowered, but alo do not want them to be too overpowered.

I'm thinking I may make it so that Mobius Witches are like adepts with more base strength, a paradrop ability, and the affinity granted from the demonic pacts with unholy taint. They would not be able to cast any mage level spells before a demonic pact though. I may let them upgrade to mages (rather than archmages in the last version), although I still have some concerns about how an upgraded Planar Gate unit no longer counts towards the gate limit so upgrading them may cause you to get even more units for free. I may let Ritualists have Channeling 2 but not 1, and Profanes Channeling 2 and 3 but not 1, so Mobius Witches upgrading can make the AV clerics mage and archmage equivalents ( but without any affinity except from Demonic Pacts) for the Sheaim only.
 
my feedbacks on your post:
- including mana tailored to the Leaders seems fun but is not necesseraly good for repetability : every game, you'll have the mana tailored to your leader, you won't have to change tech research because suddenly you want an affinity with death. However if there is no synergy between new mana and leader, and only "thematical change" then IMO it's good.
(couldn't it be changed to : palace gives 2 mana... and leader gives 1 mana/ressource, not linked to a building (or linked a secondary palace-like building that moves when city is destroyed/captured) ? then you could have Roanna always carry a horse ressource with her, even in un-restricted leaders.)
- Sheaim summons getting unholy taint & corresponding affinity seems fun. (but OPness has to be checked)
- unholy taint ritualists/M witches seems balanced, even if they lose their affinity and every spell if they the pact is broken.
- adepts not getting affinity would be good....
- but mage/archmages getting improved (or free) lvl 1 spells on affinity mana sphere would also be a good effect.

Balance remarks (those are done playing MnAi so might not be relevant to your mod, but I'd like to share)
I rarely play AV so never noticed that before:
AV is a bit too OP with not enough drawbacks/missed opportunities to change that.
- Ritualists are OP : having Ritualists, I don"t get the interest to get mages... (maelstrom is weaker than RoF, and mages weaker than RoF, and harder to build... )
- Mardero & beast of Agares are very strong, and others don't get equivalent units (other religions don"t get 5 units at 14+str).
- Sacrifice the weak is strong but, may be balanced with other civs ? (not sure)
- Hell terrain was initially supposed to balance AV by being a poor land... but in reality, the only drawback is that you lose ressource variety... & thus health but with 1F per pop it's not much of an issue, and an army of life adepts cleans the land easily.
- Hell terrain even protects your lands from the effect of the Draw (transformation of land into ice & tundra.... !!, leading to hell terrain having better yield than other lands... !! )

IMO
-ritualist could get less max damage than maelstrom
-hell terrain could get 1F less or maybe 1-2 commerce less, or random chance to destroy improvements.. or something (damage living units?)
 
It is not possible to provide a true source of mana without a building, except by python alterations to specific cities which can get really messy to keep track of when cities can be razed or conquered and would not play nicely with the Crucible. Actual sources of mana (or any resource) cannot be connected without a capital city.

It turns out that swapping out the palaces based on leader type is not as simple as I thought. def onBuildingBuilt does not get called when a palace is granted for free in the capital, only if a palace is built to move the capital. I can still swap them out in python, but I need to put the code in a couple extra places to account for cities getting built or conquered, and might want to add a per turn check to make sure things don't get screwed up if there is another case I forgot.

I am thinking now that it might be simpler and more thematic to make the "supplimnetal mana" of my "effective mana" mechanism depend on the leader rather than adding whatever mana would be granted by the palace. The supplemental mana does not contribute to extra strength from affinity, it cannot be traded, and it cannot be used as a prereq for purchasing spells through experience, but it does help determine what random affinity gets applied to mages/archmages (and free 1st tier spells for adepts).

If I go with this Thessa would still have the normal Nature/Sun/Air mana from the Ljosalfar palace (or perhaps Body, Mind, Shadow from the Calabim palace) but her arcane units would be additionally more likely to be born with Nature and/or Death affinity.

This would require a bit of hardcoding in python, but it would only be in one place and it might actually run more efficiently than the code I currently use that has to check a bunch of fields in xml files.
 
would that mean that you'll add 2 "fake mana" to most leaders ? or only to a few ?

would the boosted spells be given when people get the affinity or only when having the affinity + acces to the mana itself ?

I could see some having 2 fake manas (some being identical to one of their palace mana) a few having twice the same fake mana, most having 1 fake mana (often one of the palace's mana, but not always) and a few having no fake mana (Khazad leaders wouldn't get mana affinities).
 
For the Thessa example, you mentioned how her arcane units cannot use the extra mana as a prereq for spells via experience. Does this include the free promotion they get upon creation or level-up? If i understand correctly, the only effect the leader has in that case is giving you a slight chance to gain Death affinity for your units (or giving you a small chance of getting Death instead of Nat/Sun/Life) & tier 1 spells. If so, it sounds like a flavorful addition, but it may prove frustrating - especially for Thessa, as using Death magic & building the nodes runs counter to the way Ljosalfar tends to play in my games (whether it be AI or myself).

I also agree entirely with the Mobius witches and related changes. Losing affinity for breaking the pact sounds like an interesting penalty.
 
I'd like to make it so that almost all spells require a source of effective mana, but that would require either editing the dll (in a significant way well beyond my current coding skills) or a python prereq for almost every spell which would slow things down and get rather messy.

I never specified that it would be 2 "fake mana." In the lore only a quarter of mages are Petrarchs with access to 2 spheres, and some of the leaders are known Decliarchs with access to 3.

I was actually thinking of maybe giving those leaders a source of effective mana per level in Kael's last magic lore post, so some would get 2, 3, or 4 sources of effective mana. Having more sources would only make their arcane units more biased towards those spheres though, or work to counteract the negative mana supplied by religions for their opposite spheres.

I may change it, but the code currently looks like this:
Spoiler :
Code:
   def getNumBonusEffective(self, iPlayer, iBonus, unit=-1):
       iNum = gc.getPlayer(iPlayer).getNumAvailableBonuses(iBonus)
       if gc.getBonusInfo(iBonus).isMana():

           if PyHelpers.PyGame().doesBuildingExist(gc.getInfoTypeForString('BUILDING_CRUCIBLE')):
               return 0

           iNum += self.getNumSupplimentalManaPlayer(iPlayer, iBonus)
           if unit!=-1:
               iNum += self.getNumSupplimentalManaUnit(iBonus, unit)
       return iNum



   def getNumSupplimentalManaUnit(self, iBonus, unit):
       iNum = 0

##       if gc.getUnitInfo(unit.getUnitType()).getPrereqAndBonus() == iBonus:
##           iNum += 1

       pPlot = unit.plot()
       pArea = unit.area()
       iTeam = unit.getTeam()
       if iBonus == pPlot.getBonusType(iTeam):
           iNum += 7

##       if unit.isBarbarian():## or gc.getPlayer(unit.getOwner()).getCapitalCity().isNone():
##           iNum += pArea.getNumBonuses(iBonus)

       iRel = unit.getReligion()
       if iRel != -1:
           if iRel == gc.getInfoTypeForString('RELIGION_THE_ORDER'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_LAW'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_CHAOS'):
                   iNum -= 2

           elif iRel == gc.getInfoTypeForString('RELIGION_THE_EMPYREAN'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SUN'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_SHADOW'):
                   iNum -= 2

           elif iRel == gc.getInfoTypeForString('RELIGION_RUNES_OF_KILMORPH'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_EARTH'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_AIR'):
                   iNum -= 2

           elif iRel == gc.getInfoTypeForString('RELIGION_FELLOWSHIP_OF_LEAVES'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_NATURE'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_ICE'):
                   iNum -= 2

           elif iRel == gc.getInfoTypeForString('RELIGION_OCTOPUS_OVERLORDS'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_WATER'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_FIRE'):
                   iNum -= 2

           elif iRel == gc.getInfoTypeForString('RELIGION_COUNCIL_OF_ESUS'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SHADOW'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_SUN'):
                   iNum -= 2

           elif iRel == gc.getInfoTypeForString('RELIGION_THE_ASHEN_VEIL'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_ENTROPY'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_CREATION'):
                   iNum -= 2

           elif iRel == gc.getInfoTypeForString('RELIGION_WHITE_HAND'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_ICE'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_NATURE'):
                   iNum -= 2

       return iNum

   def getNumSupplimentalManaPlayer(self, iPlayer, iBonus):
       iNum = 0
       pPlayer = gc.getPlayer(iPlayer)
       if gc.getBonusInfo(iBonus).isMana():

           if PyHelpers.PyGame().doesBuildingExist(gc.getInfoTypeForString('BUILDING_CRUCIBLE')):
               return 0

           if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_SIDAR'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_DEATH'):
                   return -pPlayer.getNumAvailableBonuses(iBonus)
           if pPlayer.isFullMember(gc.getInfoTypeForString('DIPLOVOTE_OVERCOUNCIL')):
               if CyGame().isVotePassed(gc.getInfoTypeForString('VOTE_NO_DEATH_MANA')):
                   if iBonus == gc.getInfoTypeForString('BONUS_MANA_DEATH'):
                       return -pPlayer.getNumAvailableBonuses(iBonus)
               if CyGame().isVotePassed(gc.getInfoTypeForString('VOTE_NO_DIMENSIONAL_MANA')):
                   if iBonus == gc.getInfoTypeForString('BONUS_MANA_DIMENSIONAL'):
                       return -pPlayer.getNumAvailableBonuses(iBonus)
               if CyGame().isVotePassed(gc.getInfoTypeForString('VOTE_NO_ENTROPY_MANA')):
                   if iBonus == gc.getInfoTypeForString('BONUS_MANA_ENTROPY'):
                       return -pPlayer.getNumAvailableBonuses(iBonus)
               if CyGame().isVotePassed(gc.getInfoTypeForString('VOTE_NO_CHAOS_MANA')):
                   if iBonus == gc.getInfoTypeForString('BONUS_MANA_CHAOS'):
                       return -pPlayer.getNumAvailableBonuses(iBonus)
               if CyGame().isVotePassed(gc.getInfoTypeForString('VOTE_NO_SHADOW_MANA')):
                   if iBonus == gc.getInfoTypeForString('BONUS_MANA_SHADOW'):
                       return -pPlayer.getNumAvailableBonuses(iBonus)

           if pPlayer.isBarbarian():
               iNum += CyMap().getNumBonuses(iBonus)


           iLeader = pPlayer.getLeaderType()
           if iLeader == gc.getInfoTypeForString('LEADER_ALEXIS'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SPIRIT'):
                   iNum += 4
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_BODY'):
                   iNum += 4
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_DEATH'):
                   iNum += 4
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_SUN'):
                   iNum -= 4
           elif iLeader == gc.getInfoTypeForString('LEADER_AMELANCHIER'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_NATURE'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_AIR'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_LIFE'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_ANAGANTIOS'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_ICE'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_ARENDEL'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_NATURE'):
                   iNum += 4
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_CREATON'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_LIFE'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_ARTURUS'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_EARTH'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_LAW'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_ICE'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_AURIC'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_METAMAGIC'):
                   iNum += 3
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_ICE'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_AVERAX'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_DIMENSIONAL'):
                   iNum += 3
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_MIND'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_BASIUM'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_LIFE'):
                   iNum += 5
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_FIRE'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_FORCE'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_BEERI'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_ENCHANTMENT'):
                   iNum += 3
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_EARTH'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_BRAEDEN'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_ICE'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_Iwater'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_CAPRIA'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_LAW'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_FIRE'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_LIFE'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_CARDITH'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_CREATION'):
                   iNum += 5
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SPIRIT'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_WATER'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_NATURE'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_life'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_CASSIEL'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_FORCE'):
                   iNum += 5
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_AIR'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_ENCHANTMENT'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SPIRIT'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_CREATION'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_CHARADON'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_CHAOS'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_BODY'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_ICE'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_DAIN'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_METAMAGIC'):
                   iNum += 4
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_FIRE'):
                   iNum += 4
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_SUN'):
                   iNum += 4
           elif iLeader == gc.getInfoTypeForString('LEADER_DECIUS'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_LAW'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SUN'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_BODY'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_MIND'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_DUIN'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_CHAOS'):
                   iNum += 3
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_BODY'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_DUMANNIOS'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_ICE'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_EINION'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SPIRIT'):
                   iNum += 2
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_METAMAGIC'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_SUN'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_ETHNE'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SPIRIT'):
                   iNum += 3
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_CREATION'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_LIFE'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_FAERYL'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_NATURE'):
                   iNum += 3
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_SHADOW'):
                   iNum += 3
           elif iLeader == gc.getInfoTypeForString('LEADER_FALAMAR'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_WATER'):
                   iNum += 2
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_CREATION'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_AIR'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_FLAUROS'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_MIND'):
                   iNum += 2
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SHADOW'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_FURIA'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_MIND'):
                   iNum += 2
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_DEATH'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_GARRIM'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_ENCHANTMENT'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_GOSEA'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_DIMENSIONAL'):
                   iNum += 2
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_SPIRIT'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_HANNAH'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_WATER'):
                   iNum += 4
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_CHAOS'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_AIR'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_DEATH'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_HAFGAN'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_FIRE'):
                   iNum += 2
               if iBonus == gc.getInfoTypeForString('BONUS_CHAOS'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_HYBOREM'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_ENTROPY'):
                   iNum += 4
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_DIMENSIONAL'):
                   iNum += 2
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_FIRE'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_JONAS'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_FIRE'):
                   iNum += 3
           elif iLeader == gc.getInfoTypeForString('LEADER_JUDECCA'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_EARTH'):
                   iNum += 3
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_ENTROPY'):
                   iNum += 3
           elif iLeader == gc.getInfoTypeForString('LEADER_KANE'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SUN'):
                   iNum += 2
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_BODY'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_KANDROS'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_EARTH'):
                   iNum += 2
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_LAW'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_KEELYN'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_DIMENSIONAL'):
                   iNum += 3
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_MIND'):
                   iNum += 3
           elif iLeader == gc.getInfoTypeForString('LEADER_KOUN'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_LAW'):
                   iNum += 2
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_MIND'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_LETHE'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SPIRIT'):
                   iNum += 3
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_ENTROPY'):
                   iNum += 3
           elif iLeader == gc.getInfoTypeForString('LEADER_MALCHAVIC'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_MIND'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_MAHALA'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_CHAOS'):
                   iNum += 2
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_BODY'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_MAHON'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_BODY'):
                   iNum += 2
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_DEATH'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_MELISANDRE'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_DIMENSIONAL'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_MERESIN'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_DEATH'):
                   iNum += 2
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_AIR'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_OS-GABELLA'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_DIMENSIONAL'):
                   iNum += 5
           elif iLeader == gc.getInfoTypeForString('LEADER_OSTANES'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_AIR'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_OUZZA'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_CHAOS'):
                   iNum += 2
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_FIRE'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_PERPENTACH'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_METAMAGIC'):
                   iNum += 4
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_MIND'):
                   iNum += 4
           elif iLeader == gc.getInfoTypeForString('LEADER_RHOANNA'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_MIND'):
                   iNum += 3
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_LAW'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_RIUROS'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_ICE'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_RIVANNA'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_DEATH'):
                   iNum += 2
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SHADOW'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_SABATHIEL'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_LAW'):
                   iNum += 2
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_FORCE'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_SALLOS'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_BODY'):
                   iNum += 2
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_MIND'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_SANDALPHON'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SPIRIT'):
                   iNum += 3
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SHADOW'):
                   iNum += 3
           elif iLeader == gc.getInfoTypeForString('LEADER_SHEELBA'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_FIRE'):
                   iNum += 2
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_LAW'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_SHEKINAH'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SHADOW'):
                   iNum += 2
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_METAMAGIC'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_STATIUS'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_DIMENSIONAL'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_TASUNKE'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_MIND'):
                   iNum += 2
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_BODY'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_TEBRYN'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_DIMENSIONAL'):
                   iNum += 4
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_ENCHANTMENT'):
                   iNum += 4
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_DEATH'):
                   iNum += 4
           elif iLeader == gc.getInfoTypeForString('LEADER_TETHIRA'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_LAW'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SPIRIT'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_THESSA'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_NATURE'):
                   iNum += 3
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_DEATH'):
                   iNum += 3
           elif iLeader == gc.getInfoTypeForString('LEADER_THESSALONICA'):
               cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_DEFEATED_ELOHIM",()),'art/interface/popups/Thessalonica.dds')
           elif iLeader == gc.getInfoTypeForString('LEADER_TYA'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_DIMENSIONAL'):
                   iNum += 3
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_ENTROPY'):
                   iNum += 3
           elif iLeader == gc.getInfoTypeForString('LEADER_ULDANOR'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_MIND'):
                   iNum += 2
           elif iLeader == gc.getInfoTypeForString('LEADER_VALLEDIA'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_METAMAGIC'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_MIND'):
                   iNum += 1
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_SHADOW'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_VARN'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SUN'):
                   iNum += 3
               elif iBonus == gc.getInfoTypeForString('BONUS_MANA_SHADOW'):
                   iNum -= 2
           elif iLeader == gc.getInfoTypeForString('LEADER_VOLANNA'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SHADOW'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_CHAOS'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_BODY'):
                   iNum += 1
           elif iLeader == gc.getInfoTypeForString('LEADER_WEEVIL'):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_MIND'):
                   iNum += 2


           if pPlayer.hasTrait(gc.getInfoTypeForString('TRAIT_FALLOW')):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_CREATION'):
                   return -pPlayer.getNumAvailableBonuses(iBonus)
           if pPlayer.hasTrait(gc.getInfoTypeForString('TRAIT_PACT_WITH_HYBOREM')):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_ENTROPY'):
                   iNum += 1
           if pPlayer.hasTrait(gc.getInfoTypeForString('TRAIT_PACT_WITH_JUDECCA')):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_EARTH'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_ENTROPY'):
                   iNum += 1
           if pPlayer.hasTrait(gc.getInfoTypeForString('TRAIT_PACT_WITH_LETHE')):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SPIRIT'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_ENTROPY'):
                   iNum += 1
           if pPlayer.hasTrait(gc.getInfoTypeForString('TRAIT_PACT_WITH_MERESIN')):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_AIR'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_DEATH'):
                   iNum += 1
           if pPlayer.hasTrait(gc.getInfoTypeForString('TRAIT_PACT_WITH_OUZZA')):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_CHAOS'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_FIRE'):
                   iNum += 1
           if pPlayer.hasTrait(gc.getInfoTypeForString('TRAIT_PACT_WITH_STATIUS')):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_SHADOW'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_DIMENSIONAL'):
                   iNum += 1
           if pPlayer.hasTrait(gc.getInfoTypeForString('TRAIT_PACT_WITH_SALLOS')):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_BODY'):
                   iNum += 1
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_MIND'):
                   iNum += 1
           if pPlayer.hasTrait(gc.getInfoTypeForString('TRAIT_PACT_WITH_WINTER')):
               if iBonus == gc.getInfoTypeForString('BONUS_MANA_ICE'):
                   iNum += 1

           iStateRel = pPlayer.getStateReligion()
           if iStateRel != -1:
               if iStateRel == gc.getInfoTypeForString('RELIGION_THE_ORDER'):
                   if iBonus == gc.getInfoTypeForString('BONUS_MANA_LAW'):
                       iNum += 1
                   elif iBonus == gc.getInfoTypeForString('BONUS_MANA_CHAOS'):
                       iNum -= 2

               elif iStateRel == gc.getInfoTypeForString('RELIGION_THE_EMPYREAN'):
                   if iBonus == gc.getInfoTypeForString('BONUS_MANA_SUN'):
                       iNum += 2
                   elif iBonus == gc.getInfoTypeForString('BONUS_MANA_SHADOW'):
                       iNum -= 1

               elif iStateRel == gc.getInfoTypeForString('RELIGION_RUNES_OF_KILMORPH'):
                   if iBonus == gc.getInfoTypeForString('BONUS_MANA_EARTH'):
                       iNum += 1
                   elif iBonus == gc.getInfoTypeForString('BONUS_MANA_AIR'):
                       iNum -= 2

               elif iStateRel == gc.getInfoTypeForString('RELIGION_FELLOWSHIP_OF_LEAVES'):
                   if iBonus == gc.getInfoTypeForString('BONUS_MANA_NATURE'):
                       iNum += 1
                   elif iBonus == gc.getInfoTypeForString('BONUS_MANA_ICE'):
                       iNum -= 2

               elif iStateRel == gc.getInfoTypeForString('RELIGION_OCTOPUS_OVERLORDS'):
                   if iBonus == gc.getInfoTypeForString('BONUS_MANA_WATER'):
                       iNum += 1
                   elif iBonus == gc.getInfoTypeForString('BONUS_MANA_FIRE'):
                       iNum -= 2

               elif iStateRel == gc.getInfoTypeForString('RELIGION_COUNCIL_OF_ESUS'):
                   if iBonus == gc.getInfoTypeForString('BONUS_MANA_SHADOW'):
                       iNum += 1
                   elif iBonus == gc.getInfoTypeForString('BONUS_MANA_SUN'):
                       iNum -= 2

               elif iStateRel == gc.getInfoTypeForString('RELIGION_THE_ASHEN_VEIL'):
                   if iBonus == gc.getInfoTypeForString('BONUS_MANA_ENTROPY'):
                       iNum += 1
                   elif iBonus == gc.getInfoTypeForString('BONUS_MANA_CREATION'):
                       iNum -= 2

               elif iStateRel == gc.getInfoTypeForString('RELIGION_WHITE_HAND'):
                   if iBonus == gc.getInfoTypeForString('BONUS_MANA_ICE'):
                       iNum += 1
                   elif iBonus == gc.getInfoTypeForString('BONUS_MANA_NATURE'):
                       iNum -= 2

       return iNum

When I speak of spells learned by experience that does also include those which are free promotion picks upon building or upgrading units. It is the same mechanic of purchasing a promotion, and the promotions themselves have a bonus prereq that is checked in the DLL. I have often wished that promotions could be given python prereqs, but no on ever implemented such a mechanic for me.

The effective mana supply, in addition to determining what units get random affinity, is also used to determine how many free promotions to give undead or elemental units from the Tower of Necromancy or Tower of Elements. It is also used to determine what magic can be taught through Govannon's Ethics, and whether a Vampire can learn a form of magic from its sire.



I just added a secondary Spirit Affinity spell, in order to make it useful for Lethe's perversion of the sphere. (I might make it so that the normal version of Hope_greater is only availible to living units, as it does not do much good for the Infernal but blocking it based on civ rather than living status would require a python prereq.) The new spell is Despair, which removes the Hope/Hope_Greater buildings from nearby enemy cities, removes Courage and Morale from enemy units, and adds Fatigued.

(I just made a slight alteration to the Hope pedia entry to work for despair. Hope said "We gazed at the ruins of our city, and around it the slaughtered herds and salted fields. The crows circled overhead eagerly, and their stench of the scavengers feast reached insidiously into our noses. "Well," the commander said at last, "things won't be getting any worse, boys."' Despair says 'We gazed at the ruins of our city, and around it the slaughtered herds and salted fields. The crows circled overhead eagerly, and their stench of the scavengers feast reached insidiously into our noses. The commander's last words were, "things will never get better, boys."')

I'm still trying to decide whether to make this a Spirit affinity-Entropy affinity cross-sphere spell, or to make it require Spirit and Unholy Taint.

Lethe canonically uses both Spirit and Entropy, but I don't really associate her with Pit Beasts. I'm also starting to think that letting every Demon Lord grant you 2 spheres of affinity might be too much. Even if each one only grants 1 type of affinity, you can still use 3 demonic pacts to become a decliarch. Canonically only Kylorin ever learned to use affinity for more than 3 spheres.

I might make some affinity spells require channeling promotions and others not. If ritualists have channeling 2 then they could use them all, but I may not want other units given Unholy Taint from a Pact to have all the spells.

I don't have a strong basis for the belief but I tend to associate Lethe with Esus, so I'm thinking she might grant Unholy Taint and Spirit Affinity to Shadows, letting you move unseen in enemy lands to destroy hope as well as conducting assassinations that look like suicides.


I'm thinking of making the Hide Nationality spell require not Shadow 3 in the stack but a unit with Shadow Affinity and channeling 3 in the stack. It would still let other units near an archmage become HN without requiring the archmage to do anything to active cast the spell.

I'm also thinking of lettings units in the same stack as a caster with Dimensional Affinity (regardless of what magic that caster knows) cast a duplicate of Escape.

I currently have a Sever Soul_greater, but am not sure I like it enough to keep it.

I'm thinking Dimensional Affinity will give Strong as a summon perk to all summons, even though summons already get strong if summoned by a caster with affinity in their specific sphere. I had made Hero grant strong, but I may instead let Hero grant summons Hero too.
 
Last edited:
Hi there, MC. I see you are still working on your mod which is already great! Keep it up. I am playing with this minor graphic tweak (making mana nodes linked to mana types, not religion like the original FFH2). I think it adds a nice flavor to it and I play all FFH2 modmods like this. I have taken the liberty to attach a small zip with the patch. It replaces 3 files (Artdefines Improvements and Bonus - sun mana was blue instead of yellow from orig FFH2, and removes all mana nodes from civ4plotLSystem) and copies some art files for them and a better looking coastline. I hope you find them to your liking. It doesn't break saves. Taken from MoM so credits to them :). Let me know if you like them and plan to use them for a next patch. Cheers!
 

Attachments

  • MC new mana nodes.zip
    3.6 MB · Views: 84
  • Screenshot.jpg
    Screenshot.jpg
    4 MB · Views: 117
Also, I have tried to include the other flavor improvements from MoM (via the civ4PlotLSystem) - like flavor quarries, workshops and lumbermills but for some reason the game cracks. If I were to introduce the nifs to improvements via CIV4ArtDefines_Improvement, they work just fine, but the Civ4PlotLSystem seems to cause the game to crash :(. Could anyone help me with this issue? Thnx
 
After playing some time, I have observed some issues and decided to communicate them here in case you feel apropriate to change in the mod.
The Attached Warlord ability - When used, the chosen unit does not inherit the name and promotions of the selected Great Commander, only the Attached Commander Promotion. For example, it would be fun if an Axeman with Averax the Cambion as attached commander inherit the Sundered Promotion, as well his name.

It might be fun, would be a nightmare to code unless we get rid of the Detach Commander ability. A detached commander would be given a new name and possible promotions before I could possibly assign them their own name and promotions. I'd have to do a lot of python hardcoding to keep track of what promotions to associate with the commander unit when detached. If I rely on the unit's name to keep track of the commander type things could be easily broken by upgrading units or manually renaming them. Renaming commanders or units with commanders attached could be used to cheat. The only other place I know to store data to try to keep track of things is the Alternative Unit type, and using that could easily break the mechanics I use for code that is needed for my Werewolf and Sluagh Ressurection mechanics. I do not want to break them just to make Great Commanders more thematic.
Also, why they don't have an skin with their attached units like the Great General unit ?
I believe that would require adding custom art for every combination of a unit and commander. That sounds like a lot of work for little payoff. It would not show up in single unit mode or for heroes anyway.
Is it possible to space the religions names in the religious advisor window? Some of the names are appearing on the next one.

I think this depends on screen resolution. I believe I spaced it so that they would not overlap and so that the basic 7 religions would not require scrolling over to see on my screen. I could try to tweak it more, but it is not a high priority.
The crime rate – This one is a nice tool applied to the mod, but not well explored. In some games I have cities with 100% of crime and they are the richest, high culturally, and scientific of the empires I have built. Also, they was the happiest cities. The problem is that an absurd rate of crime should have great consequences that not happen in the gameplays. Events like riots, stolen money, corruption, increased unhappiness and unhealthy, more facility in kidnapping great people that stand in such cities, spreading evil religions and others can be applied to the mod, giving a much more dynamic and fun experience.
Kael added the mechanic planning on doing things like that but then lost interest before implementing such effects. I never had a lot of interest in making up such events, but could add some if people make good specific suggestions.
The Advanced Diplomacy – Certain elements like the cease talking bottom does not work. In addition, when the player is at war with civilization B, the diplomatic tab shows the option to declare war to civ B even if they are already at war.
I believe that is an issue for Tholal. I have no idea how that code works.
Events – Some of the events have no physical consequences in the game, like the volcano event that never destroys any improvements in the titles around it or cause considerable damage to cities close to the recently created volcano. It only eventually burn the forests around it. Other example is Tali Constellation, which never occurs anything.

Events that help modify the Alignment of a civ – At now the only things that modify the alignments are mostly religious. Maybe some of the events could be more active in that element, like the one of the children that will change the world, for example.
Maybe, but that is a major change for a minor event. I would like the idea better if the mod used the alignment ranges that Xienwolf added his modmod long ago. I used to base my mod on his and would not mind adding such alignments back into MagisterModmod if Tholal shows up again and wants to add it to MNAI, but I am not good enough with C++ to merge such mechanics in my myself and care a lot more about mechanics allowed in MNAI and not those other modmods.
The White Hand – Just technical issues like the initial text that appears doubled, the video is the same of Council of Esus and the soundtrack that exists in the scenarios is not the same of the standard game. Maybe the video could be some part of the Age of Ice mod intro.
Well, these are the only ones, for now. Thanks for this great work and dedication of yours !
I have always played with videos turned off. I really do not think it is worth adding more media of that sort which would make the download size bigger.

A rift gate with more than 1 movement point can already make multiple trips, so long as each trip is to a tile with no additional movement penalties.
A Rift Gate is the Dimensional 3 Building (a duplicate of an Obsidian Gate) not the Dimensional 3 Summon (an ICBM that can carry cargo).

I may need to give them better names to reduce confusion.

I used to call the summon a Tesseract, but could not find artwork that looks anything like a hyper-cube.

What names sound good to you? Void Vessel? Null Elemental? Ether Ark? Void Gate? Warp Gate?

In my last release I used the Lightning elemental artwork, but have recently changed it. It now uses the Maelstron icon and a llarger version of the Severed Soul animations. This looks much cooler, like a clear spherical bubble of distorted space burning with white flames.

Hi there, MC. I see you are still working on your mod which is already great! Keep it up. I am playing with this minor graphic tweak (making mana nodes linked to mana types, not religion like the original FFH2). I think it adds a nice flavor to it and I play all FFH2 modmods like this. I have taken the liberty to attach a small zip with the patch. It replaces 3 files (Artdefines Improvements and Bonus - sun mana was blue instead of yellow from orig FFH2, and removes all mana nodes from civ4plotLSystem) and copies some art files for them and a better looking coastline. I hope you find them to your liking. It doesn't break saves. Taken from MoM so credits to them :). Let me know if you like them and plan to use them for a next patch. Cheers!
Also, I have tried to include the other flavor improvements from MoM (via the civ4PlotLSystem) - like flavor quarries, workshops and lumbermills but for some reason the game cracks. If I were to introduce the nifs to improvements via CIV4ArtDefines_Improvement, they work just fine, but the Civ4PlotLSystem seems to cause the game to crash :(. Could anyone help me with this issue? Thnx
To be honest I am not a fan of most of the MoM mana art, and do not consider it worth the effort of changing things.

I am not familiar with the most recent versions of MoM, but I believe that the only reason our coasts look different is that I added a hellish version of ocean and coats and found that without making a certain change the game showed a really ugly sandy shore between the different types of water terrain.

It has been a long time since I dealt with Civ4PlotLSystem. I know I broke a lot of things there before finally figuring out how it works, and have since forgotten how.


-----

I just changed Lichdom, so that instead of being available to level 8 living units with Death 3 it is available to any living level 6 with Channeling 3 in a city containing your Tower of Necromancy.

Liches lose their Death promotions but gain Death Affinity.

I added a new Dominate Undead spell available to units with Death Affinity and Channeling 3 (including Liches). It removes Rebellious from your team's undead units as well as letting you take control of any hostile or rebellious undead from other teams.

I decided that Skeletons summoned from the Death 1 spell would start out Rebellious, while those summoned from Death Affinity will not.This was inspired by rereading the Bestiary entry saying "Skeletons have few thoughts beyond wanting to end life and they will attack anyone they come into contact with. Necromancers have to use magic to give them an aura of the undead to keep their skeletons from attacking them."

I also decided to change the Sailor's Dirge in light of its pedia entry. It now has Death Affinity. Since it has Seafaring, the Skeletons it summons gain Boarding. It may generate Drowns from combat. I removed the special Skeleton_Sailor unit, which was just a skeleton with boarding generated from combat with this ship or when the ship was first created. When it first appears it will be filled with random undead units, including Spectres, Drowns, Hollow Men, and Diseased Corpses. The Bestiary says that the only undead not welcome on the Dirge are Pyre Zombies, but I a thinking putting a Lich or even Wraith on the boat would probably be to much.


I decided to allow units with Death Affinity and either Body Affinity or Demon or Undead to purchase Plague Carrier.

The Life II Destroy Undead Spell can do a maximum of 95% damage. The Life Affinity version does more damage and kills them outright.

Assuage does Psychic damage instead of Holy damage to anger based units if the caster has unholy taint.


It may be too powerful so I may remove it, but for now Water Affinity and Channeling 2 allows a mage to add Water Walking (the temporary version of the promotion) to all the units in its tile, letting your armies walk from Isle to Isle. Water 2 no longer has any spell, but just gives the permanent version of Water Waking for the unit itself. The Oasis spell has been merged into the Affinity version of Spring. Spring Greater adds an Oasis (which is a source of fresh water than may be used for irrigating farms) on a desert without any water on adjacent tiles. Otherwise it acts just the same as the current Spring.

Blaze Greater creates Flames as well as Smoke.

The 1st level affinity spells to not prevent further casting.

There are now 6 Bloom spells, 2 to make New Forests, 2 to upgrade them to Forests, and 2 to Upgrade them to Ancient Forests. The Nature 2 versions have a longer delay than the Nature Affinity version. The Nature 2 version that turns Forests into Ancient Forests requires Fellowship of the Leaves as a state religion, while the Nature Affinity version does not.

If a unit with a summoner casts Escape, it is moved to its Summoner's tile rather than the capital. Escape now has a PyHelp description telling you where it moved, much like Sever soul does.

Dimensional Affinity allows other units in the same tile to cast Escape. Rifts start with Dimensional Affinity. Summon Rift Greater creates 1 rift with Channeling 3, letting it go to a distant city and then make a Rift Gate there. (I tried to make the affinity escape spells take the unit to the tile of the Affinity-unit's caster, but that code proved too complex. If there are multiple units on the tile with Dimensional affinity, it is hard to know which one to pick.)


The Summon Djinni Greater spell summons 1 Djinn with Channeling 3, and thus Archmage level spells with at least one affinity.

All of the other Channeling 3 Affinity summoning spells create 3 summons with Strong.

All of the Channeling 2 Affinity summoning spells (Summon Ice Elemental, Summon Spectre, and Fireball) create 2 summons with strong.

The Channeling 1 Death summon is a single skeleton with strong (instead of Rebellious) which (since the number of units is limited to one per caster) does not prevent the caster from casting again.

I decided to treat The White Hand Ritual/Auric much the same as an Infernal Pact/Demon Lord, so that Auric and whoever summons him (and remains on good terms with him) get Ice Affinity for any units with the Unholy Taint. The Pact with Winter promotions also gives Ice Affinity to White Hand Priests and High Priests, as well as the Channeling promotions to let them use the Affinity spells that are replacing their standard ice spells.

I have rejected my previous idea of making Ice nodes unable to be built on raw mana. It is just too irritating to face that limitation to getting the Tower of Elements in every game. Instead I am thinking about making it so that The Deepening makes it impossible to build Ice nodes without a Pact With Winter, which you can only have by being on Auric's team.


In my last game testing Unholy Taint's Demonic Pact effects I was very upset to find that units were losing their affinity for the relevant spheres before any Demon Lords were summoned. Just rewrote the code so that it only runs after the ritual has been completed and only if the summoned demon lord was ever alive. I still have to test this.

For some reason the Tower of Elements and Tower of Necromancy seems to adding be double the free promotion pick that they should. I definitely have to fix that lest they be way too strong.

Edit: I'm thinking now that the problem may just have been that I was playing as Tebryn, and thus getting an extra +4 supplemental death mana. I decided that giving more than 2 of one type supplimental mana per leader is just too much.

The free affinity for Ritualists from summing 3 Demon Lords seems overpowered. I'm thinking I may have to reduce the team limit on Infernal Pact, or make it so that summing a second demon lord breaks your pact with the previous one.
 
Last edited:
I am now leaning strongly towards removing the team limit on the Infernal Pact, making it so that a single player could summon all 7 Demon Lords, but only letting you have a Pact with one Demon Lord at a time. Whenever you summon a new Demon Lord, you are breaking your agreement with which every demon came before.

Thematically it does make sense that if you sell your soul to one devil and then try to cheat him by reselling the same soul to a different devil that the first devil would get pissed and retract any benefits he had given you.

If I do this I can make each pact stronger, rather than nerfing them for fear of Strength 30+ Ritualists, Chaos Marauders, etc., with affinity for 6 different types or mana.

I'm also thinking I will make the Exorcism spell remove any demon-granted affinities along with Unholy Taint and Demon Possessed. That will require adding Python code, so I might as well make the spell free Saverous from his Thralldom too.


I just discovered a python call to check whether an event has occurred for a specific player.

This opens up some interesting new options on how to make the Demonic Pacts work.

I can have the event rather than the trait grant a free promotion to various unitclasses, in which case it would automatically give the promotion to all current units of that unitclass (without needing to inefficiently cycle through all of the units in python) as well as all gained thenceforth.

I just tested a change where I take advantage of this to remove all of the free promotions given by a demonic pact from unholy taint units only from those players who had made the pact. That means a mage with Unholy Taint would not have to loose Spirit Affinity just because a rival might have summoned Lethe, but that if you summon Lethe yourself and cannot stay on her good side then it would loose it.

I really wanted Hyborem, as Lord of the Balors, to improve Balors, but if I want to do that through an xml/c++ event I'd have to change the unit to be its own unitclass or else give all the same benefits to Berserkers, Counselors, and Brujahs. I was thinking Hyborem's Balors would have the powers of Profanes (Unholy Taint, Channeling 2, and Channeling 3), but it does not seem right to give those to ordinary Berserkers.

Now that I think of it making Balors share a unitclass with Berserkers never made much sense anyway. It can be annoying to have a summon prevent you from training more of your national units. If a Balor is to share a unitclass with anything, the most logical choice is the Seraph. Most of the Balors were Seraphim before Bhall fell, and most of the good gods except for Lugus continue to distrust the Seraphim many who abandoned Bhall to remain good later fell to corruption anyway. I really cannot think of any good reason not to make Balors a Seraph UU.

The question then becomes whether the Infernal should have the standard Berserker unit, no Berserker unit, or a new unique unit. The idea of making the Ira be their Berseker replacement is starting to grow on me. I might allow Chaos Marauders to upgrade to Irae too, maybe for the Sheaim as well as the Infernal.





Edit: I just noticed there is another call to reset whether an event has occurred for a given player. It might be better to use that to just prevent such free promotions from being granted anymore, after a one time python call to remove them from existing units. I'll have to think about this some more and maybe test it out to make sure it does what I think.
 
The idea of making the Ira be their Berseker replacement is starting to grow on me. I might allow Chaos Marauders to upgrade to Irae too, maybe for the Sheaim as well as the Infernal.
I think this is a good idea. The Ira have a small participation in the game (only appears when the Avatar of Wrath enters in the game) and giving them a replacement of the Berserker unit for the Infernals and Sheaim would make them more acessible and interesting to the players and the gameplay in general.
 
I like your suggestions and the Tower of Mastery.
His suggestions on that link are extensive.
 
I just made Irae the Infernal/Sheaim Berserker UU, requiring Rage, Chaos Mana, and a minimum level of 4.

I made them slightly weaker but gave them Chaos affinity and made them regain Burning Blood from battle with living units.

I believe the way I have it set up will make Chaos Marauders upgrade to Irae and never regular Berserker, and will not let regular living melee units upgrade to Irae. If I am wrong I'll probably remove this as a UU.



I decided that Malevolent Designs makes more sense as the tech prereq for Balors than Rage does.

I was thinking of removing Unholy Taint and Divine from Balors but making a Pact with Hyborem give it back, but I just thought of a much better idea. Balors will keep those promotions and the Ritualist spells it enabled, and also gain one random affinity. They would be determined the same way as a Mage's affinity, but they would only get one. I will not allow any Balors to be Petrarchs or Decliarchs, except by affinities their Unholy Taint gives them from Pacts with various Demon Lords.

A Pact with Hyborem will increase the duration of summons (including Balors) and will grant Balors Channeling 2, thus allowing them to use the mage level affinity spells. I am considering letting Hyborem give Balors Channeling 3 too, but that would create the odd situation where one Balor can summon another Balor. (I thought the DLL blocked units from summoning more of their kind, but apparently it only blocks units that have been summoned from summoning more summons of the same kind.) I could easily get around this though by making only living casters able to summon Balors. That might also reduce the frustration of a summoned Balor causing an Infernal city to lose production on a trained Balor. It also makes sense when you realize that Balors usually only want to bargain with mortals whom they can convince to sell their souls. I think that idea is growing on me.


Canonically all of the evil gods have Balors in their service, who are all fallen True Angels. Most of them serving most of the evil gods were angels their god created before their fall corrupted the nature of their spheres, but all of Agares' Balors were created by Good or Neutral gods. As such, there is no reason why there should not be Balors using every form of magic. (When the Bannor were fighting their way out of hell, they even encountered one Balor who had been made by Amathaon and who used Creation magic to create a paradise where he hoped to trap the Bannor lest they leave the machine of hell entirely.) However, True Angels made by the god of a single precept cannot be expected to have major gifts in multiple spheres like mortals who were created by The Twenty-One acting in unison.


I'm thinking of eliminating Creation 1 (like I already removed Creation 2 and 3) and allowing Adepts to get Creation Affinity if it is randomly assigned. Canonically Amatheon does love young children best, and grants gifts of affinity to those with no training or experience whatsoever. This would allow me to eliminate a bit of superfluous python and prevent Auric from keeping a Creation 1 promotion forever just from visiting the Golden Dragon Bones once.

(By the way, I renamed all of the Dragon Bones just based on each dragon's color rather than its name, mostly because no one is supposed to know what the Blue Dragon's true name is.)



I'm thinking that granting units with the Pilgrim promotion free promotions based on every Unique Feature you control is probably overpowered. It means Elohim Devouts are essentially what Adepts were before. Having large numbers of units with a large number of promotions granting a large number of minor spells just is not as much fun as managing more powerful specialists with fewer options. I have not touched the code yet, but I'm planning to make it work more like how mage affinity now works; each unit with the Pilgrim promotion would gain benefits from one or perhaps a few random unique feature within your team's borders, not from all of them. The benefits may be increased through, such as including affinity. I'm thinking upgrading a unit to the Pilgrim promotion on the site of a unique feature would probably give the benefits from that site rather than a random unique feature. I'm not sure about keeping the various Pilgrimage spells. If I remove the automatic effect but don't place any limits on units using the pilgrimage spells to get the full benefits, I may simply be increasing micromanagement. For some improvements I could merge Pilgrimage with Explore Lair, so that a unit with the Pilgrim promotion gets extra possible buffs from a good lair exploration result but still risks danger if the pilgrim's exploration goes poorly.

Another thought just occurred to me that could be the simplest solution to the Pilgrim spells: make each Pilgrimage spell remove the Pilgrim promotion, so if you want a Devout to go to a specific unique feature to get its specific bonuses you loose the option to do that again at another site.
 
Love the mod, been enjoying it for years. It's really nice to see you are still thinking and working on it!

One thing, and probably the only thing, that i've always felt was missing was the ability to start with minor leaders. I've always enjoyed that mechanic for a fresh playthrough. Any chance of adding it?
 
Do you just mean that all of the players should be playable? I could do that, but I cannot (without Tholal's aid) add a game option to make it so that they an only be active in some games and not others. I cannot make it so that a leader (only a civilization) is only AI playable or only human playable.

I used to be able to make it so that Unrestricted Leaders lets you manually assign a leader to any civ, and liked it that way, but Tholal rewriting the random leader code a while back broke that.
 
I'm hoping that Kael will release the character list he is working on soon so I can use it to make my mod even closer to canon, but whether he does or not I intend to release a new version on my Birthday (February 1st).

I fixed the Religion screen so that there are no more overlaps.

I currently have all of the minor leaders playable like major leaders. I have quite enjoyed some games with Mahon of the Calabim and Volanna and Rivana of the Svartalfar. It does seem a little weird to see Thessa/Rivanna randomly assigned to the Calabim or Amelanchier/Volanna to the Doviello, so I may decide to remove the elven leaders from the civs they only join in the scenarios depending on results of an earlier scenario.

Because of the confusion between Rifts and Rift gates, I just renamed them both. I could change them again, but currently a Rift Gate is called a "Door of Ether" and a Rift is called a "Warp Bubble," since the new graphics do look like a bubble of distorted space burning with a pale flame.

I have never seen the AI actually use a Rift as an ICBM to move to a different tile, but they do ok with basic summons like Air or Water Elementals so I decided to let Warp Bubbles act as normal flying DOMAIN_LAND unit, as well as letting them use both Para-Drop and Nuke Mode. I also increased their movement points.

I like the idea of powers being more dependent on geography, so I'm thinking of making it so that Elementals summoned on a tile containing its prerequisite mana source may be granted Affinity.

I have hidden the Winged promotions (making it its own next level so it does not show up among the unit's promotions) and made it so that it can be randomly applied to units with Air Affinity. It won't happen automatically as soon as an adept upgrades to a Mage, but Air Mages will eventually gain the power of flight.

I'm playing around with making the Affinity promotions grant other promotions as random bonuses, not immediately but as an additional bonus after having grown experienced with one's affinity for a while.

Currently Air affinity grants Winged, Body grants Strong, Chaos grant Dance of Blades, Creation grants Blessed, Death grants Undead Slaying, Dimensional grants Summoner, Earth grants Mountaineer, Enchantment grants Enchanted Blade, Entropy grants Sundered, Fire grants Mutated, Force grants Magic Resistance, Ice grants Cold Resistance, Law grants Inquisitot, Life grants Medic 2, Metamagic grants Arcane, Mind grants Bounty Hunter, Nature grants Subdue Animal, Shadow grants Illusionist, Spirit grants Exorcism, Sun grants Perfect Sight, S
Earth Affinity may similarly apply Mountaineer, Nature Affinity Subdue Animal, Sun Affinity Perfect Sight, Shadow Affinity Illusionist, Spirit affinity Exorcist, and Water grants Water Walking.

I'm thinking I might not block the Sidar from having Death affinity, but still blocked them from getting Death 1-3 or using any of the standard (Un)Death spells from that affinity. Instead their Death affinity mages could cast a copy of Destroy Undead Greater, and their Death affinity Archmages could summon 3 Angels of Death. The Tower of Mortality would not remove access to Death magic, but would make the resource grant +2 health (which means +1 when you take the normal -1 into account.)


I decided to change Wind Knights from having Air 2 to having Air Affinity (plus 2 less base strength), allowing them to potentially fly.


I decided that rather than making the Ring of Warding (Greater) make units in the city magic immune, I'd make the Warding effective against Angels, Demons, Elementals, and Undead, even when not summons.

I decided not to nerf Pilgrim as much as I was thinking before. Instead I eliminated the spells but gave the promotion a PyPerTurn effect that gives pilgrimage bonuses based on the unit's current tile's unique feature. It applies one random Pilgrimage (chosen from among sites within your team's borders) when the unit is created.


edit: I just implemented another variant of this idea which I think I like better. (It does not require python calls to run as often and does clutter the units orders with spells that can never be used.) There are now two separate forms of Death Affinity promotions, one for the Undead and one for those who honor Arawn. Both the Sidar and Good players have their Death affinity switched to the Arawn version. The corrupt Death Affinity may grant Vile Touch at random. The moral version gives Undead Slaying. The undead version has stronger versions of the old death spells, while the good version allows "Summon Angels of Death," "Destroy Undead" (Greater, a duplicate of the Life Affinity spell but with a prereq to make sure they are not both available at once), and a new "Hallow Graveyard." This spell transforms any Barrows, Ruins, City Ruins, or Dungeons into Graveyards, and adds the "Hallowed Ground" feature to the Graveyards. That feature (which has been in the mod for a while but only used in a couple scenarios) make the plot impassible to Demons or the Undead and prevents the spread of Hell terrain. Removing the Graveyard will remove the Hallowed Ground too.
 
Last edited:
Top Bottom