1. We have added a Gift Upgrades feature that allows you to gift an account upgrade to another member, just in time for the holiday season. You can see the gift option when going to the Account Upgrades screen, or on any user profile screen.
    Dismiss Notice

MagisterModmod

Discussion in 'FfH2 Modmods, Scenarios, and Maps' started by MagisterCultuum, Feb 27, 2012.

  1. Dominus the Mentat

    Dominus the Mentat Chieftain

    Joined:
    Oct 29, 2018
    Messages:
    27
    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 !
     
    Imp. Knoedel likes this.
  2. Cutlass

    Cutlass The Man Who Wasn't There.

    Joined:
    Jan 13, 2008
    Messages:
    44,021
    Location:
    US of A

    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.
     
  3. Calavente

    Calavente Richard's voice

    Joined:
    Jun 4, 2006
    Messages:
    2,698
    Location:
    France
    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
     
  4. MagisterCultuum

    MagisterCultuum Great Sage

    Joined:
    Feb 14, 2007
    Messages:
    15,832
    Location:
    Kael's head
    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.
     
  5. Calavente

    Calavente Richard's voice

    Joined:
    Jun 4, 2006
    Messages:
    2,698
    Location:
    France
    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?)
     
  6. MagisterCultuum

    MagisterCultuum Great Sage

    Joined:
    Feb 14, 2007
    Messages:
    15,832
    Location:
    Kael's head
    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.
     
  7. Calavente

    Calavente Richard's voice

    Joined:
    Jun 4, 2006
    Messages:
    2,698
    Location:
    France
    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).
     
  8. Nothrazim

    Nothrazim Chieftain

    Joined:
    Oct 12, 2009
    Messages:
    49
    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.
     
  9. MagisterCultuum

    MagisterCultuum Great Sage

    Joined:
    Feb 14, 2007
    Messages:
    15,832
    Location:
    Kael's head
    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: Jan 11, 2019
  10. The Monarch

    The Monarch Chieftain

    Joined:
    May 31, 2003
    Messages:
    2
    Location:
    Romania
    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!
     

    Attached Files:

  11. The Monarch

    The Monarch Chieftain

    Joined:
    May 31, 2003
    Messages:
    2
    Location:
    Romania
    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
     
  12. MagisterCultuum

    MagisterCultuum Great Sage

    Joined:
    Feb 14, 2007
    Messages:
    15,832
    Location:
    Kael's head
    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.
    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.
    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.
    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.
    I believe that is an issue for Tholal. I have no idea how that code works.
    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.
    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 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.

    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: Jan 14, 2019
    Nothrazim and Dominus the Mentat like this.
  13. MagisterCultuum

    MagisterCultuum Great Sage

    Joined:
    Feb 14, 2007
    Messages:
    15,832
    Location:
    Kael's head
    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.
     
    Dominus the Mentat likes this.
  14. Dominus the Mentat

    Dominus the Mentat Chieftain

    Joined:
    Oct 29, 2018
    Messages:
    27
    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.
     
  15. plasmacannon

    plasmacannon Chieftain

    Joined:
    May 5, 2010
    Messages:
    1,564
    Gender:
    Male
    Location:
    Orlando, Florida
    I like your suggestions and the Tower of Mastery.
    His suggestions on that link are extensive.
     
  16. MagisterCultuum

    MagisterCultuum Great Sage

    Joined:
    Feb 14, 2007
    Messages:
    15,832
    Location:
    Kael's head
    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.
     

Share This Page