##### MARNOK LAIRS
def reqMarnokDungeoneer(caster):
pPlot = caster.plot()
if pPlot.getImprovementType() != gc.getInfoTypeForString('MARNOK_HILLGIANT_STEADING') and pPlot.getImprovementType() != gc.getInfoTypeForString('IMPROVEMENT_BARROW') and pPlot.getImprovementType() != gc.getInfoTypeForString('IMPROVEMENT_RUINS'):
return False
pPlayer = gc.getPlayer(caster.getOwner())
eTeam = gc.getTeam(gc.getPlayer(gc.getBARBARIAN_PLAYER()).getTeam())
iTeam = pPlayer.getTeam()
if eTeam.isAtWar(iTeam) == False:
return False
# if pPlayer.hasTrait(gc.getInfoTypeForString('TRAIT_BARBARIAN')):
# return False
if pPlayer.isBarbarian():
return False
return True
def spellMarnokDungeoneer(caster):
iPlayer = caster.getOwner()
pPlot = caster.plot()
#pPlot.setImprovementType(-1)
pPlayer = gc.getPlayer(caster.getOwner())
iRnd = CyGame().getSorenRandNum(100, "Rob Grave")
iDestroyLair=100
# Vehem's Adventurer promotion
iAdventurer = gc.getInfoTypeForString('PROMOTION_ADVENTURER')
if caster.isHasPromotion(iAdventurer):
iRnd += 10
#iRnd = 79 ### Testing
if iRnd < 21:
iDestroyLair = MarnokDungeoneerBadRandom(caster)
if iRnd >= 21 and iRnd < 30:
iDestroyLair = MarnokDungeoneerBigBad(caster)
if iRnd >= 30 and iRnd < 50:
iDestroyLair = MarnokDungeoneerMonster(caster)
if iRnd >= 50 and iRnd < 60:
iDestroyLair = MarnokDungeoneerRandomStuff(caster)
if iRnd >= 60 and iRnd < 65:
iDestroyLair = MarnokDungeoneerCivSpecific(caster)
if iRnd >= 65 and iRnd < 70:
iDestroyLair = MarnokDungeoneerAlignSpecific(caster)
if iRnd >= 70 and iRnd < 75:
iDestroyLair = MarnokDungeoneerReligionSpecific(caster)
if iRnd >= 75 and iRnd < 90:
iDestroyLair = MarnokDungeoneerGood(caster)
if iRnd >= 90:
iDestroyLair = MarnokDungeoneerBigGood(caster)
# Destroy the Lair, or not:
iRnd = CyGame().getSorenRandNum(100, "Rob Grave")
if iRnd <= iDestroyLair:
pPlot.setImprovementType(-1)
#possibly a message here to say it has gone
CyInterface().addMessage(caster.getOwner(),True,25,CyTranslator().getText("TXT_KEY_MESSAGE_LAIR_DESTROYED", ()),'AS2D_POSITIVE_DINK',1,'Art/Interface/Buttons/Spells/Rob Grave.dds',ColorTypes(8),pPlot.getX(),pPlot.getY(),True,True)
return True
if iRnd > iDestroyLair:
#ought to be a message to say the lair is still intact. Perhaps one of a number of random messages!
CyInterface().addMessage(caster.getOwner(),True,25,CyTranslator().getText("TXT_KEY_MESSAGE_LAIR_NOT_DESTROYED", ()),'AS2D_DEAL_CANCELLED',1,'Art/Interface/Buttons/Spells/Rob Grave.dds',ColorTypes(7),pPlot.getX(),pPlot.getY(),True,True)
return False
def MarnokDungeoneerBigBad(caster):
iPlayer = caster.getOwner()
pPlot = caster.plot()
pPlayer = gc.getPlayer(caster.getOwner())
iRnd = CyGame().getSorenRandNum(100, "Rob Grave")
if iRnd < 31:
# Terrain Specific. Note order; first listed will occur.
if pPlot.getTerrainType() == gc.getInfoTypeForString('TERRAIN_HILL'):
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_HILLGIANT'), caster)
return 100
if pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_FOREST'):
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_TREANT'), caster)
return 100
# default for terrain type, generate this if no specific terrain monster is specified
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_SPIDER'), caster)
return 80
if iRnd < 61:
#Lair-Type Specific
if pPlot.getImprovementType() == gc.getInfoTypeForString('MARNOK_HILLGIANT_STEADING'):
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_HILLGIANT'), caster)
return 80
if pPlot.getImprovementType() == gc.getInfoTypeForString('IMPROVEMENT_BARROW'):
### Comment by Vehem: Altered this one to give him Summon Spectre (uses MarnokSpawn instead of Goody)
unitLich = MarnokSpawnMonster(caster,gc.getInfoTypeForString('UNIT_GARGOYLE'))
unitLich.setHasPromotion(gc.getInfoTypeForString('PROMOTION_DEATH2'), True)
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_LICH'), caster)
return 80
if pPlot.getImprovementType() == gc.getInfoTypeForString('IMPROVEMENT_RUINS'):
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_PITBEAST'), caster)
return 80
# default for lair type, in case the lair is one not specified (if new lairs are added)
MarnokSpawnMonster(caster,gc.getInfoTypeForString('UNIT_DEATHKNIGHT'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_DEATHKNIGHT'), caster)
return 80
# list of individual entries not linked to terrain or lair type
# (none at present)
#default entry
MarnokSpawnMonster(caster,gc.getInfoTypeForString('UNIT_GARGOYLE'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_GARGOYLE'), caster)
return 100
def MarnokDungeoneerBadRandom(caster):
# what's the worst that could happen?
iPlayer = caster.getOwner()
pPlot = caster.plot()
pPlayer = gc.getPlayer(caster.getOwner())
iRnd = CyGame().getSorenRandNum(100, "Rob Grave")
# Vehem's Adventurer promotion
# even though this is a bad result table, adventurers should be able to avoid the worst of it
iAdventurer = gc.getInfoTypeForString('PROMOTION_ADVENTURER')
if caster.isHasPromotion(iAdventurer):
iRnd = iRnd + 20
if iRnd <= 26:
#DEATH!
caster.kill(True,0)
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_MYSTERYDEATH'), caster)
return 0
if iRnd <= 31:
caster.doDamageNoCaster(25, 100, gc.getInfoTypeForString('DAMAGE_PHYSICAL'), false)
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_DUNGEONCOLLAPSE'), caster)
return 100
if iRnd <= 36:
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_ENRAGED'), True)
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_DEMON'), True)
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_POSSESSED'), caster)
return 80
if iRnd <= 41:
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_ENRAGED'), True)
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_VAMPIRE'), True)
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BITTEN'), caster)
return 80
if iRnd <= 46:
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_WITHERED'), True)
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_WITHERED'), caster)
return 80
if iRnd <= 56:
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_ENRAGED'), True)
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_ENRAGED'), caster)
return 80
if iRnd <= 66:
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_ENERVATED'), True)
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_ENERVATED'), caster)
return 80
if iRnd <= 76:
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_DISEASED'), True)
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_DISEASED'), caster)
return 80
if iRnd <= 86:
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_PLAGUED'), True)
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_PLAGUED'), caster)
return 80
if iRnd > 86:
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_POISONED'), True)
caster.doDamageNoCaster(25, 50, gc.getInfoTypeForString('DAMAGE_POISON'), false)
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_POISONED'), caster)
return 80
return 100
def MarnokDungeoneerMonster(caster):
iPlayer = caster.getOwner()
pPlot = caster.plot()
pPlayer = gc.getPlayer(caster.getOwner())
iRnd = CyGame().getSorenRandNum(100, "Rob Grave")
if iRnd < 30:
# Terrain Specific. Note order.
if pPlot.getTerrainType() == gc.getInfoTypeForString('TERRAIN_SNOW'):
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_FROSTLINGS'), caster)
return 50
#Default Terrain Monster; generate this if we don't care
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BARBARIANS_WEAK'), caster)
return 50
if iRnd < 60:
#Lair-Type Specific
if pPlot.getImprovementType() == gc.getInfoTypeForString('MARNOK_HILLGIANT_STEADING'):
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BARBARIANS_STRONG'), caster)
return 50
if pPlot.getImprovementType() == gc.getInfoTypeForString('IMPROVEMENT_BARROW'):
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_SKELETONS'), caster)
return 50
if pPlot.getImprovementType() == gc.getInfoTypeForString('IMPROVEMENT_RUINS'):
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_LIZARDMEN_STRONG'), caster)
return 50
#default for lairtype
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BARBARIANS_WEAK'), caster)
return 50
# general random monsters
if iRnd < 70:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_SPECTRE'), caster)
return 50
if iRnd < 80:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_SPIDER'), caster)
return 50
#default entry
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BARBARIANS_WEAK'), caster)
return 50
def MarnokDungeoneerRandomStuff(caster):
iPlayer = caster.getOwner()
pPlot = caster.plot()
pPlayer = gc.getPlayer(caster.getOwner())
iRnd = CyGame().getSorenRandNum(100, "Rob Grave")
if iRnd <= 21:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_NOTHING'), caster)
return 0
if iRnd <= 41:
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_MUTATED'), True)
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_MUTATED'), caster)
return 50
if iRnd > 41:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_EXPERIENCE'), caster)
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_ADVENTURER'), True)
return 100
return 100
def MarnokDungeoneerCivSpecific(caster):
iPlayer = caster.getOwner()
pPlot = caster.plot()
pPlayer = gc.getPlayer(caster.getOwner())
#default
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BARBARIANS_WEAK'), caster)
return 80
def MarnokDungeoneerAlignSpecific(caster):
iPlayer = caster.getOwner()
pPlot = caster.plot()
pPlayer = gc.getPlayer(caster.getOwner())
#default
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BARBARIANS_WEAK'), caster)
return 80
def MarnokDungeoneerReligionSpecific(caster):
iPlayer = caster.getOwner()
pPlot = caster.plot()
pPlayer = gc.getPlayer(caster.getOwner())
# NOTE : could use religion of unit and state religion as seperate sub-categories!
#default entry, where state religion is not represented here or some factor means other entries not used
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BARBARIANS_WEAK'), caster)
return 80
def MarnokDungeoneerGood(caster):
iPlayer = caster.getOwner()
pPlot = caster.plot()
CyInterface().addMessage(caster.getOwner(),True,25,CyTranslator().getText("DUNGEONEER_GOOD", ()),'AS2D_POSITIVE_DINK',1,'Art/Interface/Buttons/Spells/Rob Grave.dds',ColorTypes(8),pPlot.getX(),pPlot.getY(),True,True)
pPlayer = gc.getPlayer(caster.getOwner())
iRnd = CyGame().getSorenRandNum(100, "Rob Grave")
CyInterface().addMessage(caster.getOwner(),True,25,CyTranslator().getText("iRND GENERATED", ()),'AS2D_POSITIVE_DINK',1,'Art/Interface/Buttons/Spells/Rob Grave.dds',ColorTypes(8),pPlot.getX(),pPlot.getY(),True,True)
#iRnd = 35 ### Testing
if iRnd <= 21:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_HIGH_GOLD'), caster)
return 90
if iRnd <= 41:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_MAP'), caster)
return 80
if iRnd <= 61:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_EXPERIENCE'), caster)
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_ADVENTURER'), True)
return 80
if iRnd <= 66:
iProm = gc.getInfoTypeForString('PROMOTION_SPIRIT_GUIDE')
caster.setHasPromotion(iProm, True)
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_SPIRIT_GUIDE'), caster)
return 80
if iRnd <= 81:
#find a minor magic item; healing salve
iProm = gc.getInfoTypeForString('PROMOTION_HEALING_SALVE')
caster.setHasPromotion(iProm, True)
# goody given only for messaging purposes? Is there a better way?
### Comment by Vehem: You can just send a message if you like (see below, and the "Lair (not) Destroyed" ones I added) - nothing much wrong with the Goody Method though - and it's consistent.
### CyInterface().addMessage(caster.getOwner(),True,25,CyTranslator().getText("TXT_KEY_MARNOK_GOODY_SALVE", ()),'AS2D_POSITIVE_DINK',1,'Art/Interface/Buttons/Equipment/HealingSalve.dds',ColorTypes(8),pPlot.getX(),pPlot.getY(),True,True)
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_SALVE'), caster)
return 100
if iRnd > 81:
iProm = gc.getInfoTypeForString('PROMOTION_ENCHANTED_BLADE')
caster.setHasPromotion(iProm, True)
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_ENCHANTED_BLADE'), caster)
return 100
return 100
def MarnokDungeoneerBigGood(caster):
iPlayer = caster.getOwner()
pPlot = caster.plot()
pPlayer = gc.getPlayer(caster.getOwner())
iRnd = CyGame().getSorenRandNum(100, "Rob Grave")
### Comment by Vehem: Made Immortal a very rare option for non-adventurers and moved it to the top of the list.
if caster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_ADVENTURER')):
iRnd += 10
if iRnd <= 21:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_TREASURE_VAULT') , caster)
return 100
if iRnd <= 31:
MarnokDungeoneerMinerals(caster)
return 100
if iRnd <= 41:
MarnokDungeoneerMana(caster)
return 100
#rescue a prisoner series (free great person)
if iRnd <= 43:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_RELEASE_PRISONER_ARTIST') , caster)
return 100
if iRnd <= 45:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_RELEASE_PRISONER_SCIENTIST') , caster)
return 100
if iRnd <= 47:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_RELEASE_PRISONER_ENGINEER') , caster)
return 100
if iRnd <= 49:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_RELEASE_PRISONER_COMMANDER') , caster)
return 100
if iRnd <= 51:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_RELEASE_PRISONER_MERCHANT') , caster)
return 100
if iRnd <= 53:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_RELEASE_PRISONER_PROPHET') , caster)
return 100
if iRnd <= 55:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_RELEASE_PRISONER_ADVENTURER') , caster)
return 100
if iRnd <= 61:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_TECH'), caster)
return 100
if iRnd <= 81:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_FAMOUS_ADVENTURE') , caster)
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_ADVENTURER'), True)
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_COURAGE'), True)
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_VALOR'), True)
return 100
if iRnd <= 98:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_MAGIC_ITEM') , caster)
iItem = receiveDungeonMagicItem(caster)
return 100
if iRnd > 98:
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_IMMORTAL'), True)
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_IMMORTAL') , caster)
return 100
return 100
def MarnokDungeoneerMinerals(caster):
# reveals a new mineral resource.
iPlayer = caster.getOwner()
pPlot = caster.plot()
pPlayer = gc.getPlayer(caster.getOwner())
iRnd = CyGame().getSorenRandNum(50, "Rob Grave")
if caster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_ADVENTURER')):
iRnd += 10
### Comment by Vehem: Shuffled things around, made it so that only adventurers can find the really rare ones. Also - made this one a "Rnd(50)".
if iRnd <= 20:
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_COPPER'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BONUS_COPPER') , caster)
return 100
if iRnd <= 30:
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_IRON'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BONUS_IRON') , caster)
return 100
if iRnd <= 40:
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_GOLD'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BONUS_GOLD') , caster)
return 100
if iRnd <= 50:
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_GEMS'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BONUS_GEMS') , caster)
return 100
if iRnd <= 55:
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MITHRIL'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BONUS_MITHRIL') , caster)
return 100
if iRnd > 55:
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_REAGENTS'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BONUS_REAGENTS') , caster)
return 100
#default
# other ideas :
#+hammers, like the "tin mine" event
#+gold, perhaps a silver mine?
# maybe even +food for an underground mushroom forest.
### Comment by Vehem: I looked into this one, but can't see a way to add yields to a plot using Python alone.
def MarnokDungeoneerMana(caster):
# reveals a new Mana node. This is a pretty big deal and ought to come with some cost, I think.
# associaed goodie event ought to spawn bad monsters - elementals of course, shadows, etc
# and/or add an effect to represent explosive release of mystical forces
iPlayer = caster.getOwner()
pPlot = caster.plot()
pPlayer = gc.getPlayer(caster.getOwner())
iRnd = CyGame().getSorenRandNum(100, "Rob Grave")
if iRnd < 4:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_DEATH'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_DEATHMANA') , caster)
return 100
if iRnd < 7:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_FIRE'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_FIREMANA') , caster)
return 100
if iRnd < 10:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_AIR'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_AIRMANA') , caster)
return 100
if iRnd < 13:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_BODY'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BODYMANA') , caster)
return 100
if iRnd < 16:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_CHAOS'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_CHAOSMANA') , caster)
return 100
if iRnd < 19:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_EARTH'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_EARTHMANA') , caster)
return 100
if iRnd < 22:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_ENCHANTMENT'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_ENCHANTMENTMANA') , caster)
return 100
if iRnd < 25:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_ENTROPY'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_ENTROPYMANA') , caster)
return 100
if iRnd < 28:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_FIRE'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_FIREMANA') , caster)
return 100
if iRnd < 31:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_LAW'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_LAWMANA') , caster)
return 100
if iRnd < 34:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_LIFE'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_LIFEMANA') , caster)
return 100
if iRnd < 37:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_METAMAGIC'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_METAMAGICMANA') , caster)
return 100
if iRnd < 40:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_MIND'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_MINDMANA') , caster)
return 100
if iRnd < 43:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_NATURE'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_NATUREMANA') , caster)
return 100
if iRnd < 46:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_SPIRIT'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_SPIRITMANA') , caster)
return 100
if iRnd < 49:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_WATER'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_WATERMANA') , caster)
return 100
if iRnd < 54:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_SUN'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_SUNMANA') , caster)
return 100
if iRnd < 57:
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA_SHADOW'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_SHADOWMANA') , caster)
return 100
#default
# basic raw mana
pPlot.setBonusType(-1)
pPlot.setBonusType(gc.getInfoTypeForString('BONUS_MANA'))
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BASICMANA') , caster)
return 100
def receiveDungeonMagicItem(caster):
iPlayer = caster.getOwner()
pPlot = caster.plot()
pPlayer = gc.getPlayer(caster.getOwner())
iRnd = CyGame().getSorenRandNum(100, "Rob Grave")
if caster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_ADVENTURER')):
iRnd += 10
### Comment by Vehem: Added the new items in...
if iRnd <= 20:
iEquipment = gc.getInfoTypeForString('EQUIPMENT_HEALING_SALVE')
if iRnd > 20 and iRnd <= 30:
iEquipment = gc.getInfoTypeForString('EQUIPMENT_HEALING_POTION')
if iRnd > 30 and iRnd <= 35:
iEquipment = gc.getInfoTypeForString('EQUIPMENT_NEWTS_DRAUGHT')
if iRnd > 35 and iRnd <= 45:
iEquipment = gc.getInfoTypeForString('EQUIPMENT_HEART_AMULET')
if iRnd > 45 and iRnd <= 50:
iEquipment = gc.getInfoTypeForString('EQUIPMENT_SWIFT_BOOTS')
if iRnd > 50 and iRnd <= 60:
iEquipment = gc.getInfoTypeForString('EQUIPMENT_TRAVELLERS_CLOAK')
if iRnd > 60 and iRnd <= 70:
iEquipment = gc.getInfoTypeForString('EQUIPMENT_RING_OF_PERCEPTION')
if iRnd > 70 and iRnd <= 75:
iEquipment = gc.getInfoTypeForString('EQUIPMENT_RING_OF_STRIKING')
if iRnd > 75 and iRnd <= 80:
iEquipment = gc.getInfoTypeForString('EQUIPMENT_COMPELLING_JEWEL')
if iRnd > 80 and iRnd <= 85:
iEquipment = gc.getInfoTypeForString('EQUIPMENT_CURSED_TOKEN_OF_RAGNAROK')
if iRnd > 85 and iRnd <= 90:
iEquipment = gc.getInfoTypeForString('EQUIPMENT_ROD_OF_WINDS')
if iRnd > 90 and iRnd <= 95:
iEquipment = gc.getInfoTypeForString('EQUIPMENT_JADE_TORC')
if iRnd > 95 and iRnd <= 99:
iEquipment = gc.getInfoTypeForString('EQUIPMENT_MENACING_HELM')
if iRnd > 99 and iRnd <= 105:
iEquipment = gc.getInfoTypeForString('EQUIPMENT_HAUBERK_OF_ABJURATION')
if iRnd > 105:
#Double prize!
receiveDungeonMagicItem(caster)
receiveDungeonMagicItem(caster)
### Comment by Vehem: This way the item should drop on the floor if the unit already has one of them (so that he doesn't lose out of multiple common items).
iPromotion = gc.getUnitInfo(iEquipment).getEquipmentPromotion()
if caster.isHasPromotion(iPromotion) == False:
caster.setHasPromotion(iPromotion, True)
else:
newUnit = pPlayer.initUnit(iEquipment, caster.getX(), caster.getY(), UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_SOUTH)
return 100
def reqMarnokHillGiantLairMaking(caster):
pPlot = caster.plot()
if pPlot.getImprovementType() != gc.getInfoTypeForString('IMPROVEMENT_TOWER') and pPlot.getImprovementType() != gc.getInfoTypeForString('IMPROVEMENT_BARROW') and pPlot.getImprovementType() != gc.getInfoTypeForString('IMPROVEMENT_RUINS'):
return False
if pPlot.getTerrainType() != gc.getInfoTypeForString('TERRAIN_HILL'):
return False
if caster.getUnitType() == gc.getInfoTypeForString('UNIT_HILL_GIANT'):
return True
return False
def spellMarnokHillGiantLairMaking(caster):
pPlot = caster.plot()
pPlot.setImprovementType(-1)
pPlot.setImprovementType(gc.getInfoTypeForString('MARNOK_HILLGIANT_STEADING'))
def reqMarnokHillGiantLairEvent(caster):
pPlot = caster.plot()
if pPlot.getImprovementType() != gc.getInfoTypeForString('MARNOK_HILLGIANT_STEADING'):
return False
iRnd = CyGame().getSorenRandNum(100, "Rob Grave")
if iRnd > 10:
return False
if pPlayer.isBarbarian():
return True
def spellMarnokHillGiantLairEvent(caster):
pPlot = caster.plot()
pPlayer = gc.getPlayer(caster.getOwner())
iRnd = CyGame().getSorenRandNum(100, "Rob Grave")
if iRnd < 20:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_EXPERIENCE'), caster)
caster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_ADVENTURER'), True)
if iRnd >= 20 and iRnd < 35:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_OGRE'), caster)
if iRnd >= 35 and iRnd < 60:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BARBARIANS_WEAK'), caster)
if iRnd >= 60 and iRnd < 80:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BARBARIANS_STRONG'), caster)
if iRnd >= 80 and iRnd < 85:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_OGRE_STONESKIN'), caster)
if iRnd >= 85 and iRnd < 90:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_OGRE_CHIEF'), caster)
if iRnd >= 90:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_HILLGIANT'), caster)
def reqMarnokBarbarianAllyDungeoneer(caster):
pPlot = caster.plot()
if pPlot.getImprovementType() != gc.getInfoTypeForString('IMPROVEMENT_BARROW') and pPlot.getImprovementType() != gc.getInfoTypeForString('IMPROVEMENT_RUINS'):
return False
pPlayer = gc.getPlayer(caster.getOwner())
if pPlayer.getGold()<50:
return False
if pPlayer.hasTrait(gc.getInfoTypeForString('TRAIT_BARBARIAN')):
return True
return False
def spellMarnokBarbarianAllyDungeoneer(caster):
pPlot = caster.plot()
pPlayer = gc.getPlayer(caster.getOwner())
pPlayer.changeGold(-50)
iRnd = CyGame().getSorenRandNum(100, "Rob Grave")
if iRnd < 20:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BARBARIANS_WEAK'), caster)
if iRnd >= 20 and iRnd < 30:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BARBARIANS_STRONG'), caster)
if iRnd >= 30 and iRnd < 40:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_EXPERIENCE'), caster)
if iRnd >= 40 and iRnd < 45:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_SPIDER'), caster)
if iRnd >= 45 and iRnd < 55:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_HILLGIANT'), caster)
if iRnd >= 55 and iRnd < 65:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_BARBARIANS_WEAK'), caster)
if iRnd >= 65:
pPlayer.receiveGoody(pPlot, gc.getInfoTypeForString('GOODY_MARNOK_NOTHING'), caster)
def MarnokSpawnMonster(caster, monster):
iPlayer = caster.getOwner()
pPlot = caster.plot()
pPlot.setImprovementType(-1)
pPlayer = gc.getPlayer(caster.getOwner())
pNewPlot = cf.findClearPlot(-1, pPlot)
if pNewPlot != -1:
pOwner=gc.getPlayer(gc.getBARBARIAN_PLAYER())
unitMonster = pOwner.initUnit(monster, pNewPlot.getX(), pNewPlot.getY(), UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_SOUTH)
return unitMonster
return -1