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

Help needed understanding the magic system

Discussion in 'Civ4 - Fall from Heaven' started by Rotting, Nov 24, 2011.

  1. Rotting

    Rotting Chieftain

    Joined:
    Aug 1, 2006
    Messages:
    77
    it's a pretty simple question:

    When I have an Archmage or Lich, and, after I created him, build up to 4 Nodes to Air, do I get the Level3Spell for free? I was told so, but doesn't seem to work for me. Can anyone help? Thanx!
     
  2. Azhral

    Azhral Let's get Tactical!

    Joined:
    Jul 9, 2008
    Messages:
    622
    Location:
    Dunedin, New Zealand
    Only new units get the free magic spheres. Its not retroactive.
     
  3. Rotting

    Rotting Chieftain

    Joined:
    Aug 1, 2006
    Messages:
    77
    thought so. Thanx!
     
  4. Tielby

    Tielby Prince

    Joined:
    Sep 23, 2007
    Messages:
    313
    Location:
    The sacred and free citadel of mind
    Well... if you have more than one node of any mana resource when you promote a caster (adept -> mage, mage -> archmage or a few other rare possibilities), they DO also get the free promos. Kinda a bug, imho. Now that I think of it, it probably also works when you make an archmage into a lich, but I've never tried it.
     
  5. MagisterCultuum

    MagisterCultuum Great Sage

    Joined:
    Feb 14, 2007
    Messages:
    16,115
    Location:
    Kael's head
    The free promotions based on mana are given out by this code in CvEventmanager.py:
    Code:
    		
    	def onUnitCreated(self, argsList):
    		'Unit Completed'
    		unit = argsList[0]
    		player = PyPlayer(unit.getOwner())
    		pPlayer = gc.getPlayer(unit.getOwner())
    		iChanneling2 = gc.getInfoTypeForString('PROMOTION_CHANNELING2')
    		iChanneling3 = gc.getInfoTypeForString('PROMOTION_CHANNELING3')
    		
    		if unit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_ADEPT'):
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_AIR'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_AIR1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_AIR2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_AIR3'), True)
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_BODY'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_BODY1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_BODY2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_BODY3'), True)
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_CHAOS'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_CHAOS1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_CHAOS2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_CHAOS3'), True)
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_DEATH'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_DEATH1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_DEATH2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_DEATH3'), True)
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_EARTH'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_EARTH1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_EARTH2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_EARTH3'), True)
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_ENCHANTMENT'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_ENCHANTMENT1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_ENCHANTMENT2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_ENCHANTMENT3'), True)
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_ENTROPY'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_ENTROPY1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_ENTROPY2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_ENTROPY3'), True)
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_FIRE'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_FIRE1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_FIRE2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_FIRE3'), True)
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_ICE'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_ICE1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_ICE2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_ICE3'), True)
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_LAW'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_LAW1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_LAW2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_LAW3'), True)
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_LIFE'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_LIFE1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_LIFE2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_LIFE3'), True)
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_METAMAGIC'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_METAMAGIC1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_METAMAGIC2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_METAMAGIC3'), True)
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_MIND'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_MIND1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_MIND2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_MIND3'), True)
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_NATURE'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_NATURE1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_NATURE2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_NATURE3'), True)
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_SHADOW'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_SHADOW1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_SHADOW2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_SHADOW3'), True)
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_SPIRIT'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_SPIRIT1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_SPIRIT2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_SPIRIT3'), True)
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_SUN'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_SUN1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_SUN2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_SUN3'), True)
    			iNum = pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_WATER'))
    			if iNum > 1:
    				unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_WATER1'), True)
    				if (iNum > 2 and unit.isHasPromotion(iChanneling2)):
    					unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_WATER2'), True)
    					if (iNum > 3 and unit.isHasPromotion(iChanneling3)):
    						unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_WATER3'), True)
    
    (Between the lines where the channeling promotions are defined and checking the mana there are other if statements which I deleted, because they deal with AI decisions and are completely irrelevant to your question.)

    When a unit is upgraded, the game actually initializes a new unit before passing on attributes such as promotions from the old unit. The same is true for converting one unit to another though a spell like Lichdom. The free mana promotions are given out whenever a unit is upgraded to an arcane unit (whether by spell or the old fashioned way), based on the channeling promotions that the new unit has in its XML defines.

    In unmodded FfH2, the only promotion that a Lich has is the Undead racial promotion. (Even this does not really matter, as an elven, dwarven, or orcish archmage would pass on its racial promotion and overwrite Undead when it upgrades, were it not for the fact that the Lichdom spell also adds the Undead promotion.) They only have channeling 1, 2, and 3 after the promotions are passed on from the archmage, which is after the def onUnitCreated has already run. They are still UNITCOMBAT_ADEPT, so they do get the first level spell sphere promotions based on mana, but their lack of channeling promotions at the time of initialization means that they do not get second or third level promotions for free.

    If you want Lichdom to give free spell sphere promotions, it is quite simple to mod the unit to that it starts with channeling promotions. (In my modmod, they start with the Undead, Channeling 1, Channeling 2, Channeling 2, Vile Touch, Arcane, and Summoner promotions. They are also immortal.)
     
  6. Tielby

    Tielby Prince

    Joined:
    Sep 23, 2007
    Messages:
    313
    Location:
    The sacred and free citadel of mind
    :wow: Your liches are SCARY! :hide:
     
  7. cain3456

    cain3456 Prince

    Joined:
    Nov 1, 2010
    Messages:
    429
    Ok, I got one. What would be the point of having an extra node of an element if you're the Khazad and can use nothing higher than adepts?
     
  8. MagisterCultuum

    MagisterCultuum Great Sage

    Joined:
    Feb 14, 2007
    Messages:
    16,115
    Location:
    Kael's head
    Some mana types provide passive benefits in addition to beign used to get spell sphere promotions:
    Law mana decreases maintenance costs.
    Spirit mana makes you generate great person points faster.
    Mind mana gives a boost to research.
    Entropy mana slows the healing of enemy units in you land.
    Earth mana increases the chances that your mines will discover new mineral resources.


    You should also keep in mind the unit that have affinity for mana. Most of these are summons, but not all. Druids have affinity for Nature mana. Dwarven Druids instead have affinity for Earth mana. Dwarven Druids can also learn all three levels of Earth magic, which means that they can summon Earth Elementals. Earth Elementals also have Earth mana affinity.


    The dwarves can get lucky and get the event that grants them Gaelen, a who is basically a Mage with the Hero promotion and a stronger attack strength.


    It is also possible for the Khazad to capture enemy arcane units using units with the Command promotions or the Crown of Command equipment (taken from a vanquished Stephanos, the first of the Four Horsemen of the Apocalypse, who arrives in Erebus when the Armageddon Counter hits 40). Captured units are also initialized as new unit and get free mana based spell sphere promotions before the promotions are passed on from the old unit.
     
  9. A Moon

    A Moon The "A" is silent

    Joined:
    Dec 31, 2009
    Messages:
    682
    Location:
    Me.
    Hm. Two teammeates with hidden nationality priests (Svartalfar worldspell?) + Immortal liches = Infinite free mana promotions?
     
  10. MagisterCultuum

    MagisterCultuum Great Sage

    Joined:
    Feb 14, 2007
    Messages:
    16,115
    Location:
    Kael's head
    Units with the Hidden Nationality units cannot capture units, whether through the command promotions, the crown of command, subdue animal, or subdue beasts.

    Only living units can be captured. Liches are Undead, and therefore not living.

    An immortal unit is not reborn when defeated if captured.

    Kael disabled gifting units specifically because it could be abused for free promotions.
     
  11. A Moon

    A Moon The "A" is silent

    Joined:
    Dec 31, 2009
    Messages:
    682
    Location:
    Me.
    1) What if the unit being captured has hidden nationality instead?
    2) Hm. An archmage hero and life 3?
    3) Mostly the immortality was for in case the capture failed and the unit just died instead.
    4) Would this need gifting?
     
  12. Jarrema

    Jarrema Master Voter

    Joined:
    Dec 22, 2009
    Messages:
    4,196
    Location:
    At home
    As MagisterCultuum said.
    Also, you can go for religious hero archmage - Gibbon or Hemah. I enjoy going Essus when I play dwarves, mostly fot Gibbon.
     
  13. MagisterCultuum

    MagisterCultuum Great Sage

    Joined:
    Feb 14, 2007
    Messages:
    16,115
    Location:
    Kael's head
    Heroes cannot use lichdom, as doing so and then resurrecting them used to be over exploited.

    I'm pretty sure that Hidden Nationality units also cannot be captured in combat either.

    I should also point out that if by team you mean players actually in a permanent alliance, then they cannot attack each other even with Hidden Nationality.

    Hidden Nationality is not relevant when it comes to capture by Domination, the Mind III spell, but for it to work the units owners must technically be at war. You could pass archmages or archmage heroes back and forth that way, although there is a high chance of failure so you may just end up loosing the Mind III promotion.




    Gifting would be a whole lot easier to exploit if it were allowed. I really wish that instead of disabling it entirely though he had created an xml tag to make certain units ungiftable. I really wish I could gift extra workers and archers to liberated vassals.



    In the normal game resurrection works only on national (not religious) heroes, and only the Elohim and Amurites have archmage national heroes.

    In the normal game, the Resurrection spell initializes a new copy of the hero with only the promotions found in its XML defined (minus any equipment), plus free mana promotions in the case of an archmage hero. They do not keep any xp, levels, or promotions earned or given by buildings or spells.


    (In my modmod, Life 3 Ressurection is not one spell but a separate one for each of the heroes in the game, including one for Grigori Adventurers. The seperate spells do let you choose which hero you want back, although civilization an state religion requirements do limit you to those you would have been able to build in the first place. Unfortunately there is no way to distinguish which specific Grigori adventurer to bring back.

    My resurrected Heroes keep their promotions, level, xp, and custom names. To do this I must create a dummy unit to store this data between death and resurrection. I place these at tile (0,0) for easy retrieval and give them a form of invisibility hidden even from Perfect Sight so that other units can move through the tile without issue. I call these Sluaghs, as canonically that is the term for the soul of a deceased mortal that has not yet left the plane of Erebus. Resurrection is canonically impossible once the Sluagh has left the plane, unless the god that has claimed it chooses to send it back. As the netherblade binds souls to the plane of Arawn's netherworld, units killed by it cannot be ressurected. As Basium's warhammer imprisons demons and wicked souls rather than sending them back to hell or the netherworld, they don't come back resurrected or as manes either.)
     
  14. A Moon

    A Moon The "A" is silent

    Joined:
    Dec 31, 2009
    Messages:
    682
    Location:
    Me.
    Alright, I admit defeat. I swear though, one day I will find a way to I-can't-believe-it's-not-technically-a-bug-really a super mage-who-can-do-everything into existence.

    And then probably lose (which should not be spelt loose, and I swear I will smack the next person who spells it that way) him to a 99.99% odds fight against a goblin.
     
  15. xalien

    xalien Prince

    Joined:
    Jul 18, 2005
    Messages:
    512
    All animals are HN, so at least subdue animal/beast can capture HN's.
     
  16. Deon

    Deon Lt. of Mordor

    Joined:
    Jan 13, 2008
    Messages:
    2,956
    Location:
    St.Petersburg, Russian Federation
    Ugh, sorry? Loose is "free", an adjective. "Lose" is the verb :).
     
  17. A Moon

    A Moon The "A" is silent

    Joined:
    Dec 31, 2009
    Messages:
    682
    Location:
    Me.
    ARGROKGSR{G:mad::mad::mad:

    The one word I manage to miss out of that sentence and it's the one that completely changes its meaning!

    :cringe::wallbash::hammer2:

    Ugh. "not". "should not be spelt that way." garkogewso
     
  18. arcticnightwolf

    arcticnightwolf Emperor

    Joined:
    Jun 8, 2008
    Messages:
    1,301
    Location:
    Prague, Czech Republic
    A_moon, a_moon ... i'm starting to worry about you being moderator of the greyfox.me/rife/forum :D :D
    Spoiler :

    ...
    hahaahaahhahahah
    hahaahaahhahahahhahaahaahhahahahhahahahahahahahahhahHAHAHAHAHAHA
    mwhahahahAHAHAHAHAHAHAHHAHAHAHAHAHHAHAHAHAHAHAhHAHAHAHAHAHAHAHAHAHAHAHHAHAHAHAHHAAHHAHAHAHAHA
    HAHAHAHAHHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHHAHAHAHHAHAHAHAHAHHAHAHAHAHAHAHAHAHA
    HAHAHAHAHAHAHAHAHHAHAHAHAHAHAHAHHAHAHAHAHAHAHAHAHAHHAHAHAHAHAHAHAHAHAHAHHAHAHAHAHAHAHAH
    AHHAHAAHHAHAHAHAHAHAHHAHAHAHAHAHAHAHHAHAHAHAHAHAHAHHAHAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAHAAHAH


    Spoiler :
    yes, i'm bored
     
  19. A Moon

    A Moon The "A" is silent

    Joined:
    Dec 31, 2009
    Messages:
    682
    Location:
    Me.
    Well.

    I'm starting to worry about...

    Um...

    your face! Hah!

    ...

    Spoiler :
    I left my bag on the bus. I needed that bag.
     
  20. arcticnightwolf

    arcticnightwolf Emperor

    Joined:
    Jun 8, 2008
    Messages:
    1,301
    Location:
    Prague, Czech Republic
    I am face ? uh, well ... that's an interesting theory

    silly moon, silly silly moon

    we should probably stop spamming this thread ...
     

Share This Page