Doviello+

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. :lol: Hadn't know how to kill the loop, hadn't felt like looking through the whole file just yet.

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. :lol:

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:
All you do is type "break" (without the quotation marks, of course) within a loop (either for or while) and its gets you out of the loop prematurely (if you have loops within loops, then only out of the innermost loop). You could put this anywhere in a loop (including within a conditional within a loop) but in your case you'd want it at the very end, aligned with iChallengerOdds. (You could actually use as many

Alternately, you could break be the only thing in the if pUnit.isHasPromotion(iChallengerProm) == True: conditional, and move the rest out of the loop. You might have to initialize pUnit as something that way, to prevent some error messages but I don't think it would be a real problem. Unless no unit with the promotion was in the stack (presumably the xml would make the spell impossible to cast anyway then).

If you took all that of it out of the loop but used a different variable to store the pUnit with the promotion it would work too, but that way you'd still loop though all the units and it would be the last challenger it finds to accept instead of the first.

I've noticed a few places in Kael's code that works like that, which in at least a few of my versions I've changed to use break to make them run slightly faster. For some reason Kael never seems to use break in python at all, although he'll use it in in C++, where the command is the same except for needing to be followed by a semicolon.
 
Alternately, you could break be the only thing in the if pUnit.isHasPromotion(iChallengerProm) == True: conditional, and move the rest out of the loop. You might have to initialize pUnit as something that way, to prevent some error messages but I don't think it would be a real problem. Unless no unit with the promotion was in the stack (presumably the xml would make the spell impossible to cast anyway then).

So basically, set it up like this?

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:
			break
	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)
	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)
	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)
 
Thinking of moving away from the animal lairs as improvements, incorporating them as buildings in a city. That way I can steal the Jotnar Citizen spawn code, applying it to the animals... Each new animal den/technology will add a new unit to the list of spawnable animals. Do you think this would be better or worse than the current system?

Edit: Should be ready for a first real release once the new patch comes out. :goodjob:
 
If you go that route, I would consider NOT using the % chance for every city, that could flood the world with animals.

My 1st thought was limit to the Capital. However I say go a different direction. Have the % chance be inversely proportional to each cities size. For instance 2% chance to spawn an animal per city -.2% chance per population point.

Code:
Pop 1 = 1.8% chance
Pop 2 = 1.6% chance
Pop 3 = 1.4% chance
Pop 4 = 1.2% chance
Pop 5 = 1.0% chance
Pop 6 = .8% chance
Pop 7 = .6% chance
Pop 8 = .4% chance
Pop 9 = .2% chance
Pop 10 and higher = 0% chance

Would keep the animal production in the rural areas of their Civ, and as the play improved his cities they would control the animal population for you. They want a LOT of animals, then they trade off production centers to do so. Would also give them a reason to place cities in less than optimal places... "Yeah that city has 10 mountains and 2 coastal square, but it will stay small to spawn animals."
 
Last edited:
If you go that route, I would consider NOT using the % chance for every city, that could flood the world with animals.

My 1st thought was limit to the Capital. However I say go a different direction. Have the % chance be inversely proportional to each cities size. For instance 2% chance to spawn an animal per city -2% chance per population point.

Code:
Pop 1 = 1.8% chance
Pop 2 = 1.6% chance
Pop 3 = 1.4% chance
Pop 4 = 1.2% chance
Pop 5 = 1.0% chance
Pop 6 = .8% chance
Pop 7 = .6% chance
Pop 8 = .4% chance
Pop 9 = .2% chance
Pop 10 and higher = 0% chance

Would keep the animal production in the rural areas of their Vic, and as the play improved his cities they would control the animal population for you. They want a LOT of animals, then they trade off production centers to do so. Would also give them a reason to place cities in less than optimal places... "Yeah that city has 10 mountains and 2 coastal square, but it will stay small to spawn animals."

I second this idea.
 
If you go that route, I would consider NOT using the % chance for every city, that could flood the world with animals.

My 1st thought was limit to the Capital. However I say go a different direction. Have the % chance be inversely proportional to each cities size. For instance 2% chance to spawn an animal per city -.2% chance per population point.

Code:
Pop 1 = 1.8% chance
Pop 2 = 1.6% chance
Pop 3 = 1.4% chance
Pop 4 = 1.2% chance
Pop 5 = 1.0% chance
Pop 6 = .8% chance
Pop 7 = .6% chance
Pop 8 = .4% chance
Pop 9 = .2% chance
Pop 10 and higher = 0% chance

Would keep the animal production in the rural areas of their Civ, and as the play improved his cities they would control the animal population for you. They want a LOT of animals, then they trade off production centers to do so. Would also give them a reason to place cities in less than optimal places... "Yeah that city has 10 mountains and 2 coastal square, but it will stay small to spawn animals."

Hmm... I like it. Keeps you from having hordes of animals AND regular units without working for it. Make the dens National Wonders, and once they're built, they can spawn in any city, with the pop chance limiting it to border cities?

I like 80% of your ideas in this mod. I'll try it. Especially the emphazis on animals. :)

What 20% do you dislike then? :p

Since Daracaat is also going feral in the next patch, what about allowing him (and only him) to build spider dens?

Daracaat already has spiders spawning for him, and I'd prefer not to mess with any civ but the Doviello.
 
Version 010:

  1. Scavenger promotion - Gained after successful combat with a living enemy.
    • Promotion expires in 5 turns.
    • Unit costs no maintenance.
    • Does not cause War Weariness.
    • Does not cost military support.
    • Can sacrifice to provide 10 to a city.
    • Heals an extra 5%/5%/5% in Friendly/Neutral/Enemy territory.
  2. Bear Rider - horse archer UU. :p No ranged attack, higher strength.
    • 8:strength: rather than 6, no ranged attack, no defensive strikes. Does not require Archery.
  3. Stag - Stag Copse is able to be constructed at KotE.
    • Starts with Body I and Nature I. Currently unavailable to the Animal Faction, don't know if I'll allow them or not.
  4. Mammoth Rider artwork brought in.
    • 1:strength: more than War Elephants, Amurite model is available to everyone. Illians and Doviello have unique art. Mammoths and Mammoth Riders have Winterborn.
  5. Bison resource:
    • Northern cows. Visible to everyone. Should break up some of the endless amounts of Arctic Deer. Doviello gain a flavourstart preference for them.
  6. Duel System:
    • Doviello units are now able to duel, excluding settlers, naval units, animals and workers. Takes actual combat odds into account, but just as in combat even a unit with 99.5% combat odds can lose.
    • In order to duel, just bring at least two eligible units into a stack. Select the unit you'd like to be the Challenger, and use the 'Issue Challenge' ability, granting the 'Challenger' promotion to the unit, with a 1 turn duration. Then, select the unit you'd like to be the Defender, and use the 'Accept Challenge' ability. The 'Challenger' promotion blocks any other unit from using 'Issue Challenge', and allows 'Accept Challenge'.
    • Before the combat is taken into account, there is a 10% chance for the duel to be a draw, in which case both units are severely injured, and a 3% chance for both units to die. In the event of a tie, each unit gains 10% of the other's xp.
    • If the duel does not end in a tie or death, one unit WILL die. However, the other gains 50% of the killed units xp, with a bonus of 2xp in case they are fresh units.
  7. Mr. Underhills experience share code:
    • New Doviello units inherit XP from your existing army, but with diminishing returns so as to discourage swarming. Basically, a small, highly promoted pack is better than a swarm, better differentiating the Doviello and the Clan. It works very well combined with the Duel system, and the Scavenger promotion.
  8. Traits:
    1. Charadon becomes Aggressive/Warlord, loses Barbarian.
      • Warlord Trait from Fall Flat- doubles the production speed of all training buildings, and increases experience gained from combat for Melee, Recon, and Archery units.
    2. Mahala becomes Charismatic/Raiders, loses Ingenuity, and gets a makeover. (Stolen from Orbis. :lol:)
  9. Animal Dens - Automatically convert to Doviello control when inside Doviello borders.
  10. Doviello gain the ability to build animal dens.
    • Wolf Den - Available at game start. Grassland/Plains/Tundra. Any tile with Forest. Flatland only.
    • Lion Den - Mining. Grassland/Plains. Flatland only.
    • Bear Den - Smelting. Plains/Tundra. Any tile with Forest. Flatland only.
    • Griffon Weyr - Animal Handling. Any hill tile.
    • Mammoth Den - Horseback Riding. Tundra/Ice. Flatland only.
    • Stag Copse - Knowledge of the Ether. Plains, any tile with Forest.


That SHOULD be all the changes... Can't be sure of course, lots of little things. :lol: Of course, there were a few changes more in the first version, but they've already been absorbed... :p

I did NOT add upgradeable dens, as the dens likely won't persist past this initial version. Going with Breez's idea instead..

If you go that route, I would consider NOT using the % chance for every city, that could flood the world with animals.

My 1st thought was limit to the Capital. However I say go a different direction. Have the % chance be inversely proportional to each cities size. For instance 2% chance to spawn an animal per city -.2% chance per population point.

Code:
Pop 1 = 1.8% chance
Pop 2 = 1.6% chance
Pop 3 = 1.4% chance
Pop 4 = 1.2% chance
Pop 5 = 1.0% chance
Pop 6 = .8% chance
Pop 7 = .6% chance
Pop 8 = .4% chance
Pop 9 = .2% chance
Pop 10 and higher = 0% chance
Would keep the animal production in the rural areas of their Civ, and as the play improved his cities they would control the animal population for you. They want a LOT of animals, then they trade off production centers to do so. Would also give them a reason to place cities in less than optimal places... "Yeah that city has 10 mountains and 2 coastal square, but it will stay small to spawn animals."

Still thinking about making Mahala Neutral as she doesn't really seem evil to me, and making Duin a Doviello leader, possibly with a werewolf UU.
 
So, any comments? Complaints? ;)


Some 'small' new features (All still subject to change):
  1. Mahala moved back to Ingenuity, rather than Charismatic. Decided I prefered the orginal. :lol:
  2. Mahala is now neutral... For those of you using BA, she was already only 5 points away from neutral. Now, she's 15 from evil.
  3. Baron Duin Halfmorn added as a playable leader, mostly ripped from Notque's Minor Leaders mod.
    I say mostly because Notque's Feral and my Feral are at odds... Subdue animal isn't very useful when you're at peace with animals. :lol: Instead, he is Agnostic, as in Minor Leaders, and Lycanthropic, which grants Cannibalize to all melee and recon units. Thought very hard about limiting it to recon only as that's not normally the Doviello's strong suit... Still leaning towards it.
    Going to try and make it so that Duin(the hero) can only be built by the Doviello if they are lead by Duin(the leader). Meaning, if you play against Duin and want him as a hero, wipe him out before he can build himself. :lol: Should be easy if the fix in Minor Leaders is all python.
    Thinking about giving the Doviello a Beastmaster UU, only available to Duin, that is basically a lesser werewolf. Not buildable, upgraded only.
 
Last edited:
Mahala moved back to Ingenuity, rather than Charismatic. Decided I prefered the orginal. :lol:

Ok, I really disagree here.
Ingenuity is pretty much a trait in name only. It's a minor trait. Almost worthless. Reduced upgrade costs are really nothing in the broader scheme of things. Certainly nothing compared to financial, organised, or charismatic.

Giving her ingenuity is good. Replacing anything with ingenuity, is not. It's not a good enough trait to be a worthy replacement for any other one in the game. Even Defender is better.

Mahala is now neutral... For those of you using BA, she was already only 5 points away from neutral. Now, she's 15 from evil.

This does seem reasonable. But I do wonder.
In the grand scheme of things, dark fantasy is full of hidden motives and moral grey areas. Neutral is already the biggest alignment band, isn't it? I'm kind of wary about making it any bigger. The number of leaders polarised to one extreme or the other is already relatively small.

[*]Baron Duin Halfmorn added as a playable leader, mostly ripped from Notque's Minor Leaders mod.
I say mostly because Notque's Feral and my Feral are at odds... Subdue animal isn't very useful when you're at peace with animals. :lol: Instead, he is Agnostic, as in Minor Leaders, and Lycanthropic, which grants Cannibalize to all melee and recon units. Thought very hard about limiting it to recon only as that's not normally the Doviello's strong suit... Still leaning towards it.
Going to try and make it so that Duin(the hero) can only be built by the Doviello if they are lead by Duin(the leader). Meaning, if you play against Duin and want him as a hero, wipe him out before he can build himself. :lol: Should be easy if the fix in Minor Leaders is all python.
Thinking about giving the Doviello a Beastmaster UU, only available to Duin, that is basically a lesser werewolf. Not buildable, upgraded only.


Ok. This is a perplexing thing.
Not entirely sure what to say.
As far as I'm aware, duin was resurrected as a werewolf after his death. Given this, I don't think it should be possible for the doviello to build him if he's leading them. Since he'd have to die, and then be resurrected by a powerful mage (which the doviello are not). I think the most logical approach here, if he's a leader in a game, is to restrict building him to anyone (including himself) until he's been annihilated.

That said, why as a leader of the doviello? was he associated with them? shouldn't he have his own civ of some sort?

Lycanthropic doesn't seem to make much sense, since he wasn't a werewolf until after his death. Given that, a werewolf as a UU also doesn't make sense. But having Cannibalize given free to your units would be interesting. To be honest, I'd say horribly overpowered.

I'd rename the trait something like "Cannibalistic" or "Survivalist". And it make it not give the promotion freely, but rather allow all of his units to learn it, with the same prereq as anyone else, Combat II. Then allow it to archery, animal, disciple, recon, melee, mounted, arcane. Essentially, anything that's alive.​
 
Ok, I really disagree here.
Ingenuity is pretty much a trait in name only. It's a minor trait. Almost worthless. Reduced upgrade costs are really nothing in the broader scheme of things. Certainly nothing compared to financial, organised, or charismatic.

Giving her ingenuity is good. Replacing anything with ingenuity, is not. It's not a good enough trait to be a worthy replacement for any other one in the game. Even Defender is better.

Main reason Ingenuity is good for the Doviello, is the fact that upgrades cost 50% less. Much more useful late game than early, yes, but being able to buy a bunch of slaves and upgrade them to champions for next to nothing is NOT weak. I'm still playing around with it, but I felt that Charismatic made her basically a Charadon clone... Originally gave it to her because I was stealing Fall Flat's trait changes. Charadon gets an extra 25% xp... so Mahala should have promotions cost 25% less? Far too close. Financial could be an interesting trait or really anything less combat oriented. Want to differentiate them more than they currently are. Actually, Financial would work amazingly well with Raiders....

This does seem reasonable. But I do wonder.
In the grand scheme of things, dark fantasy is full of hidden motives and moral grey areas. Neutral is already the biggest alignment band, isn't it? I'm kind of wary about making it any bigger. The number of leaders polarised to one extreme or the other is already relatively small.

Really, it is one of the largest bands... But I just don't think she fits as an evil leader. She's trying to preserve her people... Just doesn't strike me as something *evil*. She is on the borderline though... Might be possible to become evil just by adopting slavery, actually. Need to check how much it moves you... She only has a 15 point buffer.

Ok. This is a perplexing thing.
Not entirely sure what to say.
As far as I'm aware, duin was resurrected as a werewolf after his death. Given this, I don't think it should be possible for the doviello to build him if he's leading them. Since he'd have to die, and then be resurrected by a powerful mage (which the doviello are not). I think the most logical approach here, if he's a leader in a game, is to restrict building him to anyone (including himself) until he's been annihilated.

That said, why as a leader of the doviello? was he associated with them? shouldn't he have his own civ of some sort?

Actually, he was a warlord back in the Age of Magic, so he's already dead. :p

Seeing as he is a Doviello leader in the scenarios, I'd assume that he does in fact have a link with the Doviello. Personally, I think it was them who brought him back... Seeing as Mahala's pedia entry talks about how the council brought Charadon back from the dead, they're definitely capable of it. Posted Duin's entry at the bottom.

That said, I can see the logic in not allowing Duin to build himself. I was actually considering having the civ lose it's traits if they lose Duin, but just disallowing him completely should be better.

Edit: Got it working, if Duin is a leader he cannot be built until you kill him. :crazyeye:

Lycanthropic doesn't seem to make much sense, since he wasn't a werewolf until after his death. Given that, a werewolf as a UU also doesn't make sense. But having Cannibalize given free to your units would be interesting. To be honest, I'd say horribly overpowered.

I'd rename the trait something like "Cannibalistic" or "Survivalist". And it make it not give the promotion freely, but rather allow all of his units to learn it, with the same prereq as anyone else, Combat II. Then allow it to archery, animal, disciple, recon, melee, mounted, arcane. Essentially, anything that's alive.

Since he had to have been resurrected already just to be a leader, I think he'd be passing his gift to his army quite readily... Cannibilize seemed the best way to do it.

One way that I could reflect the whole werewolf thing would be to do as you say, and then allow Cannabilize a (vanishingly) small chance for a Doviello unit to become a werewolf after combat? 1 in 200? 1 in 1000?

Spoiler FfH2 Pedia :

Duin's Pedia said:
Duin was a fearsome warlord during the Age of Magic. He hosted lavish banquets after his victories, where he and his generals feasted on the bodies of the captured opponents. His generals' ambition grew to match his own and they turned on him in a bloody civil war. Duin won the war but lost his empire; in the end, he sat alone, feasting on his generals' bodies.

Like all mortals, even the horrific Duin passed away, but he would not be allowed to sleep forever. In time of dire need, desperate mages performed rites to bring back the greatest, most feared general of history. But it was not without price: the gods knew of Duin's character, and would not suffer him to be raised back to life without an appropriate form.

Werewolves had not been seen in the world since the Age of Ice. Hardly possessed with the same mental faculties as vampires, the werewolves truly were hunted to extinction by the human survivors. But in Duin Halfmorn, these dark creatures will witness a terrible rebirth, and the free peoples would do right to tremble in fear.
Mahala's Pedia said:
. .. .. .. .. ."We need to find out more about him."

"Need to find out more, are we the yellow skirts now? Why do you obsess about knowledge? It's that kind of talk that makes the civilized..." Charadon practically spat the word "...people soft. It makes you soft as well."

Mahala ignored him. Blustering, headstrong fool... "The man could be a fraud, or he could be a very real threat – or an ally. We need certainty, or as much as can be had. If the Illians are on the rise..."

She had hoped he would see sense for once, but their discussion deteriorated, as usual. Damned, stupid, singleminded, vicious bastard. For the Shamans to reawaken this monster... Mahala took a deep breath and tried again to argue her point.

"All your pointless wars will do is make sure our enemies get organized and decide that we are better off extinct!"

"Hah! All you want to do is weaken us and then hand us over to our enemies, to be put in pens like sheep and cows! Better to die as warriors than live as thralls!"

"Sheep and c... Argh! I am thinking of our CHILDREN, while all you think of is your thirst for BLOOD!"

"If I didn't watch you every second, I'm sure you would sneak up and plant a knife in my back – then you'd be rid of the last defender of Doviello strength!" The insult was clear and damning. Killing an opponent in any other way than in public, gory, single combat, was perhaps the most cowardly thing the Doviello could think of.

"I would never shame myself like that – but I wish to Camulos someone WOULD challenge you! You are well past your prime anyway! It's about time the pack had a new leader, grey hair. Bringing you back was a mistake."

She could see that struck home. She knew it would. Charadon's face turned deep purple with unfettered rage.

"You rodent! How dare you! You ungrateful little sheep's daughter! It is not too late to make you into mothers meat, weakling! You will listen to your pack leader!"

"You are not my pack leader! I built the Doviello alone with my bare hands! After your failed age of ice, they had nothing but me. The Doviello is my pack!" Mahala had enough. She turned to leave, but Charadon grabbed her from behind, wrapped his arms around her waist, held her tight and brought his head to the level of hers.

Mahala could smell the stench of rotting meat and bad teeth on Charadon's breath as he panted in her ear: "Your mind is weak, your words are foolish, but your body has... potential. We would have strong cubs, leaders. As long as they had my good blood in them..." There was an undertone to his statement, an ill-controlled growl of anticipation and desire, anger turned to lust.

She snarled, twisted, and brought her knife, concealed in the folds of her sleeve, up along his jugular. She drew blood, a hairline running along his neck.

Undeterred, Charadon flashed her a lecherous grin, and backed away from her. As he left the hall, his parting words were "Not yet, I see." That lascivious dog, Mahala thought uncharitably, as her chest heaved and fell, the adrenaline pumping through her veins.

It didn't really matter what Charadon decided, she would be conducting her own investigations anyway. At this stage, it looked like a very good idea to go away for a while.

She closed her eyes and once again saw the figure from her dream. Handsome, but... effeminate, foppish, with some ridiculous roguish affectations and a thin, pointy sword that looked like it was only good for skewering meat. He did not seem like a warrior, let alone a hero or someone she could trust. But he must be important. Why else would such a figure haunt her sleep?

After waiting for Charadon to lumber out and meet his henchmen, Mahala slipped out the back. Her mount was waiting, along with a handful of her most trusted and capable friends and bodyguards. One of them, a huntress named Ciciel, approached her.

"We are ready. Did you get any more help?"

"We will make do with what we've got. That man is impossible to reason with. Camulos, he is impossible to even speak to! He tried to mate with me, again! If I could, I would have every Shaman who helped recall that lunatic from Camulos' vault put to death."

"The elders seem to think it was good. A leader in a time of need, with so many young beastmen dying on failed raids..."

"No time of need! It was sad to be weakened like that, it was dark times to be sure, but it was a necessary cull of the headstrong." Mahala did not mention that occasionally the raids had failed on purpose. Not many people knew that, and her continued good health depended on her keeping it that way: "We would have emerged much more lethal and efficient afterwards, but now, now..."

Mahala gave her stubborn horse a sharp jab in the belly, forcing him to exhale the air he was holding on to. Then she pulled the saddle strap tight.

"Now this ghost from the past thinks it is a good idea to use the chaos in the deadlands to raid everyone else with abandon, and hang everything else. It is folly either way – if they defeat him, they're coming for us, but if the sorcerer wins, we will not escape either."

Mahala peered around the corner of the great hall. She could just see Charadon busily inspecting his beloved War Machine. It was the perfect device for Charadon, brutal and direct. No wonder he loved it so much. She busied herself with her own preparations.

"Well, at least one of us has some common sense and a will to think beyond the tip of her sword."

Charadon would probably just be glad to be rid of her, so he could continue his mad race to drown the Doviello in blood. But she was bringing one man he was sure to miss...

"Ciciel, is Lucien here yet?"
 
Last edited:
I agree with all your changes concerning Mahala (since it's what I wanted) :goodjob:
However, something kinda contradictory: Ingenuity is really great for upgrading swarms of slaves and all but isn't that going against the concept behind the pool of experience? Moreover, I have to admit that Ingenuity/Raiders is a bit light for traits. In fact, as WarKirby said, Ingenuity as something of a non-trait trait :crazyeye:

Non-Mahala-wise, this looks promising. I'll wait till patch M is out and try your mod (with Mahala of course :p) right away!

Edit: it's already out! And I think your modmod is compatible (totally deducting), so...
 
I agree with all your changes concerning Mahala (since it's what I wanted) :goodjob:
However, something kinda contradictory: Ingenuity is really great for upgrading swarms of slaves and all but isn't that going against the concept behind the pool of experience? Moreover, I have to admit that Ingenuity/Raiders is a bit light for traits. In fact, as WarKirby said, Ingenuity as something of a non-trait trait :crazyeye:

Non-Mahala-wise, this looks promising. I'll wait till patch M is out and try your mod (with Mahala of course :p) right away!

Edit: it's already out! And I think your modmod is compatible (totally deducting), so...

I totally agree that it is light on traits, but I want something that would both help her and differentiate her from Charadon. The version you can download was made for patch M, but has Mahala as Charismatic.

giva mahala financial/raiders/ingenuity, and I think it'd be good.

That's actually what I'm testing first once I'm done with Duin.
 
Thinking of giving Lucian a minor version of Hero. Free xp up to a cap of 50. Think that's too much?
Well, I really like the Orbis version till 101, so... But the fact is that now, with the XP pool, it would make some pretty strong units early on... Well, test it.

I've begun a game with Doviello+ et Malakim+. I'm playing Doviello and the Malakim are in, even though I haven't met them right now. I started in a bad position very close to the Scions, to the point of screwing with my extension. I captured a barb city and gained a pretty amount of XP for three units (including Lucian) thanks to the duel system. Then I killed the Scions... They had one city, two Centeni. Easy target.

Thoughts: it's fun and very flavorful. But have a small xp pool (or too many units?) and thus my new units get few free XP. It may take a few times before I get to playing them correctly.

If I have time, I may try changing Mahala's traits. I'll also change her portrait (again) :p
 
Well, I really like the Orbis version till 101, so... But the fact is that now, with the XP pool, it would make some pretty strong units early on... Well, test it.

I've begun a game with Doviello+ et Malakim+. I'm playing Doviello and the Malakim are in, even though I haven't met them right now. I started in a bad position very close to the Scions, to the point of screwing with my extension. I captured a barb city and gained a pretty amount of XP for three units (including Lucian) thanks to the duel system. Then I killed the Scions... They had one city, two Centeni. Easy target.

Thoughts: it's fun and very flavorful. But have a small xp pool (or too many units?) and thus my new units get few free XP. It may take a few times before I get to playing them correctly.

If I have time, I may try changing Mahala's traits. I'll also change her portrait (again) :p

He's a bit early to get a full hero, and I don't want to tie him down like Korinna, so I think a lesser version is the only way to really do it without unbalancing the game too horribly.

So, what do you think of the Duel system?

What portrait do you change it to? The original?



Think I've decided on what promotion the Lycanthropic trait will grant... Promotion with the same name, allows cannibalize the same as Undead, and grants one movement. Should be a bit better balancewise. For the icon, atm I'm using an aged version of Winterborn... attached it to the bottom of the post.
 
Back
Top Bottom