Valkrionn
The Hamster King
I believe the combat odds do take city, terrain, hill, and feature defense into account, so the odds would be different based on who attacks whom.
Bringng in a challenger from another stack seems like something that could happen fairly often. It might be a good idea to put a break at the end of the code to end the for loop and make the caster only accept one challenge.
I'll look for an example and incorporate it.

Hmm... How do you use a break? Can't be as simple as putting break at the end of the loop, can it?
Edit: Holy hell, apparently it IS just that easy.

This code will work, right? Added a break after each combat odd section. Not sure if the multiple breaks are necessary, or if they'll kill the code and I should have just the one at the end.
Code:
def spellDovielloDuel(caster):
pPlot = caster.plot()
iChallengerProm = gc.getInfoTypeForString('PROMOTION_CHALLENGER')
for i in range(pPlot.getNumUnits()):
pUnit = pPlot.getUnit(i)
iRnd = CyGame().getSorenRandNum(100, "Doviello Duel")
if pUnit.isHasPromotion(iChallengerProm) == True:
iChallengerOdds = getCombatOdds(pUnit, caster)
iChallengerRnd = (iRnd + (iChallengerOdds * 2)) / 3
iDefenderOdds = getCombatOdds(caster, pUnit)
iDefenderRnd = (iRnd + (iDefenderOdds * 2)) / 3
if iDefenderOdds > iChallengerOdds:
iDefenseRnd = CyGame().getSorenRandNum(100, "Doviello Duel Defender")
iDefenseTieRnd = CyGame().getSorenRandNum(100, "Doviello Duel Defender Tie")
if iDefenseTieRnd < 10:
caster.changeExperience(pUnit.getExperienceTimes100() / 10, -1, False, False, False)
caster.setDamage(75, caster.getOwner())
pUnit.changeExperience(caster.getExperienceTimes100() / 10, -1, False, False, False)
pUnit.setDamage(75, pUnit.getOwner())
pUnit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_CHALLENGER'), False)
CyInterface().addMessage(caster.getOwner(),True,25,CyTranslator().getText("TXT_KEY_MESSAGE_DOVIELLO_DUEL_DRAW", ()),'',1,'Art/Interface/Buttons/Buildings/Arena.dds',ColorTypes(8),caster.getX(),caster.getY(),True,True)
elif (iDefenseTieRnd <= 12 and iDefenseTieRnd >= 10):
CyInterface().addMessage(caster.getOwner(),True,25,CyTranslator().getText("TXT_KEY_MESSAGE_ARENA_DEATH", ()),'',1,'Art/Interface/Buttons/Buildings/Arena.dds',ColorTypes(7),caster.getX(),caster.getY(),True,True)
caster.kill(True, PlayerTypes.NO_PLAYER)
pUnit.kill(True, PlayerTypes.NO_PLAYER)
elif iDefenseTieRnd > 12:
if iDefenseRnd > iDefenderOdds:
pUnit.changeExperience((caster.getExperienceTimes100() / 4) + 2, -1, False, False, False)
pUnit.setDamage(25, pUnit.getOwner())
pUnit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_CHALLENGER'), False)
CyInterface().addMessage(caster.getOwner(),True,25,CyTranslator().getText("TXT_KEY_MESSAGE_DOVIELLO_DUEL_LOSS", ()),'',1,'Art/Interface/Buttons/Buildings/Arena.dds',ColorTypes(8),caster.getX(),caster.getY(),True,True)
caster.kill(True, PlayerTypes.NO_PLAYER)
if iDefenseRnd < iDefenderOdds:
caster.changeExperience((pUnit.getExperienceTimes100() / 4) + 2, -1, False, False, False)
caster.setDamage(25, caster.getOwner())
CyInterface().addMessage(caster.getOwner(),True,25,CyTranslator().getText("TXT_KEY_MESSAGE_DOVIELLO_DUEL_WIN", ()),'',1,'Art/Interface/Buttons/Buildings/Arena.dds',ColorTypes(8),caster.getX(),caster.getY(),True,True)
pUnit.kill(True, PlayerTypes.NO_PLAYER)
[B][I]break[/I][/B]
if iChallengerOdds > iDefenderOdds:
iChallengeRnd = CyGame().getSorenRandNum(100, "Doviello Duel Challenger")
iChallengerTieRnd = CyGame().getSorenRandNum(100, "Doviello Duel Challenger Tie")
if iChallengerTieRnd < 10:
caster.changeExperience(pUnit.getExperienceTimes100() / 10, -1, False, False, False)
caster.setDamage(75, caster.getOwner())
pUnit.changeExperience(caster.getExperienceTimes100() / 10, -1, False, False, False)
pUnit.setDamage(75, pUnit.getOwner())
pUnit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_CHALLENGER'), False)
CyInterface().addMessage(caster.getOwner(),True,25,CyTranslator().getText("TXT_KEY_MESSAGE_DOVIELLO_DUEL_DRAW", ()),'',1,'Art/Interface/Buttons/Buildings/Arena.dds',ColorTypes(8),caster.getX(),caster.getY(),True,True)
elif (iChallengerTieRnd <= 12 and iChallengerTieRnd >= 10):
CyInterface().addMessage(caster.getOwner(),True,25,CyTranslator().getText("TXT_KEY_MESSAGE_ARENA_DEATH", ()),'',1,'Art/Interface/Buttons/Buildings/Arena.dds',ColorTypes(7),caster.getX(),caster.getY(),True,True)
caster.kill(True, PlayerTypes.NO_PLAYER)
pUnit.kill(True, PlayerTypes.NO_PLAYER)
elif iChallengerTieRnd > 12:
if iChallengeRnd < iChallengerOdds:
pUnit.changeExperience((caster.getExperienceTimes100() / 4) + 2, -1, False, False, False)
pUnit.setDamage(25, pUnit.getOwner())
pUnit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_CHALLENGER'), False)
CyInterface().addMessage(caster.getOwner(),True,25,CyTranslator().getText("TXT_KEY_MESSAGE_DOVIELLO_DUEL_LOSS", ()),'',1,'Art/Interface/Buttons/Buildings/Arena.dds',ColorTypes(8),caster.getX(),caster.getY(),True,True)
caster.kill(True, PlayerTypes.NO_PLAYER)
if iChallengeRnd > iChallengerOdds:
caster.changeExperience((pUnit.getExperienceTimes100() / 4) + 2, -1, False, False, False)
caster.setDamage(25, caster.getOwner())
CyInterface().addMessage(caster.getOwner(),True,25,CyTranslator().getText("TXT_KEY_MESSAGE_DOVIELLO_DUEL_WIN", ()),'',1,'Art/Interface/Buttons/Buildings/Arena.dds',ColorTypes(8),caster.getX(),caster.getY(),True,True)
pUnit.kill(True, PlayerTypes.NO_PLAYER)
[B][I]break[/I][/B]
if iChallengerOdds == iDefenderOdds:
iEqualRnd = CyGame().getSorenRandNum(100, "Doviello Duel Equals")
iEqualTieRnd = CyGame().getSorenRandNum(100, "Doviello Duel Equals Tie")
if iEqualTieRnd < 10:
caster.changeExperience(pUnit.getExperienceTimes100() / 10, -1, False, False, False)
caster.setDamage(75, caster.getOwner())
pUnit.changeExperience(caster.getExperienceTimes100() / 10, -1, False, False, False)
pUnit.setDamage(75, pUnit.getOwner())
pUnit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_CHALLENGER'), False)
CyInterface().addMessage(caster.getOwner(),True,25,CyTranslator().getText("TXT_KEY_MESSAGE_DOVIELLO_DUEL_DRAW", ()),'',1,'Art/Interface/Buttons/Buildings/Arena.dds',ColorTypes(8),caster.getX(),caster.getY(),True,True)
elif (iEqualTieRnd <= 12 and iEqualTieRnd >= 10):
CyInterface().addMessage(caster.getOwner(),True,25,CyTranslator().getText("TXT_KEY_MESSAGE_ARENA_DEATH", ()),'',1,'Art/Interface/Buttons/Buildings/Arena.dds',ColorTypes(7),caster.getX(),caster.getY(),True,True)
caster.kill(True, PlayerTypes.NO_PLAYER)
pUnit.kill(True, PlayerTypes.NO_PLAYER)
elif iEqualTieRnd > 12:
if iEqualRnd < 50:
pUnit.changeExperience((caster.getExperienceTimes100() / 4) + 2, -1, False, False, False)
pUnit.setDamage(25, pUnit.getOwner())
pUnit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_CHALLENGER'), False)
CyInterface().addMessage(caster.getOwner(),True,25,CyTranslator().getText("TXT_KEY_MESSAGE_DOVIELLO_DUEL_LOSS", ()),'',1,'Art/Interface/Buttons/Buildings/Arena.dds',ColorTypes(8),caster.getX(),caster.getY(),True,True)
caster.kill(True, PlayerTypes.NO_PLAYER)
if iEqualRnd >= 50:
caster.changeExperience((pUnit.getExperienceTimes100() / 4) + 2, -1, False, False, False)
caster.setDamage(25, caster.getOwner())
CyInterface().addMessage(caster.getOwner(),True,25,CyTranslator().getText("TXT_KEY_MESSAGE_DOVIELLO_DUEL_WIN", ()),'',1,'Art/Interface/Buttons/Buildings/Arena.dds',ColorTypes(8),caster.getX(),caster.getY(),True,True)
pUnit.kill(True, PlayerTypes.NO_PLAYER)
[B][I]break[/I][/B]
In case anyone is wondering, the DefenderRnd and ChallengerRnd are unused atm. They're there in case I decide to randomize the odds slightly.
Last edited: