def effectTeachMagic(pCaster):
if pCaster.getImmobileTimer() < 1:
if not (pCaster.getImmobileTimer() > 0 or pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_HELD'))):
pPlot = pCaster.plot()
iNumUnits = pPlot.getNumUnits()
if iNumUnits > 1:
iLevel = pCaster.getLevel()
if CyGame().getSorenRandNum(21, "School of Govannon") < iLevel:
iX = pCaster.getX()
iY = pCaster.getY()
pPlayer = gc.getPlayer(pCaster.getOwner())
iTeam = pCaster.getTeam()
sTeacherName = pCaster.getName()
iTaught = 0
iMagLib = gc.getInfoTypeForString('PROMOTION_MAGICALLY_LIBERAL')
iAdept = gc.getInfoTypeForString('UNITCOMBAT_ADEPT')
iAnimal = gc.getInfoTypeForString('UNITCOMBAT_ANIMAL')
iBeast = gc.getInfoTypeForString('UNITCOMBAT_BEAST')
lList = []
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_CHANNELING2')):
lList += [gc.getInfoTypeForString('PROMOTION_CHANNELING1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_EXTENSION2')):
lList += [gc.getInfoTypeForString('PROMOTION_EXTENSION1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_AIR1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_AIR')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_AIR1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_BODY1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_BODY')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_BODY1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_CHAOS1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_CHAOS')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_CHAOS1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_CREATION1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_CREATION')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_CREATION1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_DEATH1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_DEATH')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_DEATH1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_DIMENSIONAL1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_DIMENSIONAL')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_DIMENSIONAL1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_EARTH1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_EARTH')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_EARTH1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_ENCHANTMENT1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_ENCHANTMENT')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_ENCHANTMENT1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_ENTROPY1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_ENTROPY')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_ENTROPY1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_FIRE1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_FIRE')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_FIRE1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_FORCE1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_FORCE')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_FORCE1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_ICE1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_ICE')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_ICE1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_LAW1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_LAW')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_LAW1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_LIFE1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_LIFE')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_LIFE1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_METAMAGIC1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_METAMAGIC')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_METAMAGIC1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_MIND1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_MIND')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_MIND1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_NATURE1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_NATURE')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_NATURE1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_SHADOW1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_SHADOW')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_SHADOW1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_SPIRIT1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_SPIRIT')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_SPIRIT1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_SUN1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_SUN')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_SUN1')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_WATER1')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_WATER')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_WATER1')]
while len(lList) > 0 and iTaught < iLevel:
iProm = lList.pop(CyGame().getSorenRandNum(len(lList), "Primary School of Govannon"))
infoPromotion = gc.getPromotionInfo(iProm)
for i in range(iNumUnits):
pUnit = pPlot.getUnit(i)
if pUnit.isAlive():
if pUnit.getTeam() == iTeam:
if not pUnit.isHasPromotion(iProm):
iUnitCombat = pUnit.getUnitCombatType()
if iUnitCombat != iAnimal and iUnitCombat != iBeast and (iUnitCombat != iAdept or pUnit.isHasPromotion(iMagLib)):
pUnit.setHasPromotion(iProm, True)
pUnit.setHasPromotion(iMagLib, True)
szBuffer = CyTranslator().getText("TXT_KEY_MESSAGE_MAGIC_TAUGHT", (pUnit.getName(),infoPromotion.getDescription(),sTeacherName,))
CyInterface().addMessage(pUnit.getOwner(),True,25, szBuffer,'',1,infoPromotion.getButton(),ColorTypes(8),iX,iY,True,True)
iTaught += 1
if iTaught >= iLevel:
break
if iTaught < iLevel and pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_CHANNELING3')):
lList = [iMagLib]
lList += [gc.getInfoTypeForString('PROMOTION_CHANNELING2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_EXTENSION3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_EXTENSION2')):
lList += [gc.getInfoTypeForString('PROMOTION_EXTENSION2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_AIR3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_AIR2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_AIR')) > 0:
lList += [gc.getInfoTypeForString('PROMOTION_AIR2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_BODY3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_BODY2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_BODY')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_BODY2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_CHAOS3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_CHAOS2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_CHAOS')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_CHAOS2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_CREATION3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_CREATION2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_CREATION')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_CREATION2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_DEATH3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_DEATH2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_DEATH')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_DEATH2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_DIMENSIONAL3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_DIMENSIONAL2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_DIMENSIONAL')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_DIMENSIONAL2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_EARTH3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_EARTH2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_EARTH')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_EARTH2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_ENCHANTMENT3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_ENCHANTMENT2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_ENCHANTMENT')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_ENCHANTMENT2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_ENTROPY3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_ENTROPY2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_ENTROPY')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_ENTROPY2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_FIRE3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_FIRE2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_FIRE')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_FIRE2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_FORCE3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_FORCE2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_FORCE')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_FORCE2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_ICE3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_ICE2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_ICE')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_ICE2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_LAW3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_LAW2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_LAW')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_LAW2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_LIFE3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_LIFE2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_LIFE')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_LIFE2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_METAMAGIC3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_METAMAGIC2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_METAMAGIC')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_METAMAGIC2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_MIND3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_MIND2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_MIND')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_MIND2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_NATURE3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_NATURE2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_NATURE')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_NATURE2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_SHADOW3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_SHADOW2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_SHADOW')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_SHADOW2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_SPIRIT3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_SPIRIT2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_SPIRIT')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_SPIRIT2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_SUN3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_SUN2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_SUN')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_SUN2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_WATER3')):
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_WATER2')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_WATER')) > 1:
lList += [gc.getInfoTypeForString('PROMOTION_WATER2')]
while len(lList) > 0 and iTaught < iLevel:
iProm = lList.pop(CyGame().getSorenRandNum(len(lList), "Secondary School of Govannon"))
infoPromotion = gc.getPromotionInfo(iProm)
for i in range(iNumUnits):
pUnit = pPlot.getUnit(i)
if pUnit.isAlive():
if pUnit.getTeam() == iTeam:
if not pUnit.isHasPromotion(iProm):
if gc.getUnitInfo(pUnit.getUnitType()).getTier() > 2:
iUnitCombat = pUnit.getUnitCombatType()
if iProm == iMagLib:
if iUnitCombat == iAdept:
pUnit.setHasPromotion(iMagLib, True)
szBuffer = CyTranslator().getText("TXT_KEY_MESSAGE_MAGIC_TAUGHT", (pUnit.getName(),infoPromotion.getDescription(),sTeacherName, ))
CyInterface().addMessage(pUnit.getOwner(),True,25, szBuffer,'',1,infoPromotion.getButton(),ColorTypes(8),iX,iY,True,True)
iTaught += 7
if iTaught >= iLevel:
break
elif infoPromotion.getPrereqPromotion() == -1 or pUnit.isHasPromotion(infoPromotion.getPrereqPromotion()):
if iUnitCombat != iAnimal and iUnitCombat != iBeast and (iUnitCombat != iAdept or pUnit.isHasPromotion(iMagLib)):
pUnit.setHasPromotion(iProm, True)
pUnit.setHasPromotion(iMagLib, True)
szBuffer = CyTranslator().getText("TXT_KEY_MESSAGE_MAGIC_TAUGHT", (pUnit.getName(),infoPromotion.getDescription(),sTeacherName, ))
CyInterface().addMessage(pUnit.getOwner(),True,25, szBuffer,'',1,infoPromotion.getButton(),ColorTypes(8),iX,iY,True,True)
iTaught += 7
if iTaught >= iLevel:
break
if iTaught < iLevel and pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_CASWALLAWN')):
lList = [iMagLib]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_CHANNELING2')):
lList += [gc.getInfoTypeForString('PROMOTION_CHANNELING2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_CHANNELING3')):
lList += [gc.getInfoTypeForString('PROMOTION_CHANNELING3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_EXTENSION2')):
lList += [gc.getInfoTypeForString('PROMOTION_EXTENSION2')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_EXTENSION3')):
lList += [gc.getInfoTypeForString('PROMOTION_EXTENSION3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_AIR3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_AIR')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_AIR3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_BODY3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_BODY')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_BODY3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_CHAOS3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_CHAOS')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_CHAOS3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_CREATION3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_CREATION')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_CREATION3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_DEATH3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_DEATH')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_DEATH3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_DIMENSIONAL3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_DIMENSIONAL')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_DIMENSIONAL3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_EARTH3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_EARTH')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_EARTH3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_ENCHANTMENT3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_ENCHANTMENT')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_ENCHANTMENT3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_ENTROPY3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_ENTROPY')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_ENTROPY3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_FIRE3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_FIRE')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_FIRE3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_FORCE3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_FORCE')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_FORCE3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_ICE3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_ICE')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_ICE3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_LAW3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_LAW')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_LAW3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_LIFE3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_LIFE')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_LIFE3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_METAMAGIC3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_METAMAGIC')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_METAMAGIC3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_MIND3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_MIND')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_MIND3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_NATURE3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_NATURE')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_NATURE3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_SHADOW3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_SHADOW')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_SHADOW3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_SPIRIT3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_SPIRIT')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_SPIRIT3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_SUN3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_SUN')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_SUN3')]
if pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_WATER3')):
if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MANA_WATER')) > 2:
lList += [gc.getInfoTypeForString('PROMOTION_WATER3')]
while len(lList) > 0 and iTaught < iLevel:
iProm = lList.pop(CyGame().getSorenRandNum(len(lList), "Tertiary School of Govannon"))
infoPromotion = gc.getPromotionInfo(iProm)
for i in range(iNumUnits):
pUnit = pPlot.getUnit(i)
if pUnit.isAlive():
if pUnit.getTeam() == iTeam:
if not pUnit.isHasPromotion(iProm):
if gc.getUnitInfo(pUnit.getUnitType()).getTier() > 3:
iUnitCombat = pUnit.getUnitCombatType()
if iProm == iMagLib:
if iUnitCombat == iAdept:
pUnit.setHasPromotion(iMagLib, True)
szBuffer = CyTranslator().getText("TXT_KEY_MESSAGE_MAGIC_TAUGHT", (pUnit.getName(),infoPromotion.getDescription(),sTeacherName, ))
CyInterface().addMessage(pUnit.getOwner(),True,25, szBuffer,'',1,infoPromotion.getButton(),ColorTypes(8),iX,iY,True,True)
iTaught += 21
if iTaught >= iLevel:
break
elif infoPromotion.getPrereqPromotion() == -1 or pUnit.isHasPromotion(infoPromotion.getPrereqPromotion()):
if iUnitCombat != iAnimal and iUnitCombat != iBeast and (iUnitCombat != iAdept or pUnit.isHasPromotion(iMagLib)):
pUnit.setHasPromotion(iProm, True)
pUnit.setHasPromotion(iMagLib, True)
szBuffer = CyTranslator().getText("TXT_KEY_MESSAGE_MAGIC_TAUGHT", (pUnit.getName(),infoPromotion.getDescription(),sTeacherName, ))
CyInterface().addMessage(pUnit.getOwner(),True,25, szBuffer,'',1,infoPromotion.getButton(),ColorTypes(8),iX,iY,True,True)
iTaught += 21
if iTaught >= iLevel:
break
return False