Creatures in War [CIW] [Mod in the making] [Need some support and ideas]

I believe alpha comes before beta in both the alphabet and versions. Version numbers are whatever the modder feels like doing. For my mod if the new version is compatible with save games from the previous version then I only change the number by .01 such as 1.00 to 1.01. When I have made changes that will break saves I jump to the next .1 value such as 1.10.
 
Problem with Python merging:

1) CvEventManager original codes from Bts:

PHP:
	def onEndPlayerTurn(self, argsList):
		'Called at the end of a players turn'
		iGameTurn, iPlayer = argsList
		
		if (gc.getGame().getElapsedGameTurns() == 1):
			if (gc.getPlayer(iPlayer).isHuman()):
				if (gc.getPlayer(iPlayer).canRevolution(0)):
					popupInfo = CyPopupInfo()
					popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_CHANGECIVIC)
					popupInfo.addPopup(iPlayer)
		
		CvAdvisorUtils.resetAdvisorNags()
		CvAdvisorUtils.endTurnFeats(iPlayer)

Codes from CIW (My mod):

PHP:
	def onEndPlayerTurn(self, argsList):
		'Called at the end of a players turn'
		iGameTurn, iPlayer = argsList
		
## Imperialist Trait Start ##
		pPlayer = gc.getPlayer(iPlayer)

		if pPlayer.hasTrait(gc.getInfoTypeForString("TRAIT_IMPERIALISTIC")):
			if pPlayer.isGoldenAge():
				pPlayer.changeCombatExperience(2)
## Imperialist Trait End ##

		if (gc.getGame().getElapsedGameTurns() == 1):
			if (gc.getPlayer(iPlayer).isHuman()):
				if (gc.getPlayer(iPlayer).canRevolution(0)):
					popupInfo = CyPopupInfo()
					popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_CHANGECIVIC)
					popupInfo.addPopup(iPlayer)
		
		CvAdvisorUtils.resetAdvisorNags()
		CvAdvisorUtils.endTurnFeats(iPlayer)

Codes from Platy's wonder Assembly of Experts:

PHP:
	def onEndPlayerTurn(self, argsList):
		'Called at the end of a players turn'
		iGameTurn, iPlayer = argsList
	
## Assembly of Experts Start ##
		pPlayer = gc.getPlayer(iPlayer)
		if pPlayer.getBuildingClassCount(gc.getInfoTypeForString("BUILDINGCLASS_ASSEMBLY_OF_EXPERTS")) == 1:
			capital = pPlayer.getCapitalCity()
			if capital.getDefyResolutionAngerTimer() > 0:
				(loopCity, iter) = pPlayer.firstCity(false)
				while(loopCity):
					loopCity.changeDefyResolutionAngerTimer(- loopCity.getDefyResolutionAngerTimer())
					(loopCity, iter) = pPlayer.nextCity(iter, false)
## Assembly of Experts End ##
	
		if (gc.getGame().getElapsedGameTurns() == 1):
			if (gc.getPlayer(iPlayer).isHuman()):
				if (gc.getPlayer(iPlayer).canRevolution(0)):
					popupInfo = CyPopupInfo()
					popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_CHANGECIVIC)
					popupInfo.addPopup(iPlayer)
		
		CvAdvisorUtils.resetAdvisorNags()
		CvAdvisorUtils.endTurnFeats(iPlayer)

I want to merge this, i am try but it's fail. I am copy Platy's assembly below Imperialist trait and building haven't their effect.

2) CvEventManager original codes from Bts:

PHP:
	def onUnitKilled(self, argsList):
		'Unit Killed'
		unit, iAttacker = argsList
		player = PyPlayer(unit.getOwner())
		attacker = PyPlayer(iAttacker)
		if (not self.__LOG_UNITKILLED):
			return
		CvUtil.pyPrint('Player %d Civilization %s Unit %s was killed by Player %d' 
			%(player.getID(), player.getCivilizationName(), PyInfo.UnitInfo(unit.getUnitType()).getDescription(), attacker.getID()))

Codes from CIW (My mod):

PHP:
	def onUnitKilled(self, argsList):
		'Unit Killed'
		unit, iAttacker = argsList
		player = PyPlayer(unit.getOwner())
		attacker = PyPlayer(iAttacker)

		iPlayer = unit.getOwner()
		pPlayer = gc.getPlayer(iPlayer)
		RealDeath = ["PROMOTION_REBIRTH", "PROMOTION_LAST_WISH", "PROMOTION_LEGEND", "PROMOTION_INTERCEPTION3", "PROMOTION_ENTERTAINER"]
		DeathEffect = ["PROMOTION_BLOOD_PACT", "PROMOTION_AMBASSADOR",  "PROMOTION_BANSHEE_CRY", "PROMOTION_RETRIBUTION", "PROMOTION_DESPAIR", "PROMOTION_STUPIFY"]
## Rebirth Flames ##
		if unit.isHasPromotion(gc.getInfoTypeForString("PROMOTION_REBIRTH")):
			if CyGame().getSorenRandNum(3, "Revive") == 0:
				pReviveCity = pPlayer.getCapitalCity()
				if pReviveCity:
					pNewUnit = pPlayer.initUnit(unit.getUnitType(), pReviveCity.getX(), pReviveCity.getY(), UnitAITypes.NO_UNITAI, DirectionTypes.NO_DIRECTION)
					unit.setDamage(0, false)
					pNewUnit.convert(unit)
					for iDeath in RealDeath:
						unit.setHasPromotion(gc.getInfoTypeForString(iDeath), false)
					for iDeath in self.AllArtifacts:
						unit.setHasPromotion(iDeath, false)
					unit.setLeaderUnitType(-1)
					pNewUnit.setBaseCombatStr(unit.baseCombatStr())
					pNewUnit.finishMoves()
					CyInterface().addMessage(iPlayer,false,10,CyTranslator().getText("TXT_REBIRTH_FLAMES",(pNewUnit.getName(),pReviveCity.getName(),)),'',0, gc.getPromotionInfo(gc.getInfoTypeForString("PROMOTION_REBIRTH")).getButton(),ColorTypes(11),pNewUnit.getX(), pNewUnit.getY(), true,true)
## Last Wish Start ##
		if unit.isHasPromotion(gc.getInfoTypeForString("PROMOTION_LAST_WISH")):
			Wish = []
			DeathXP = unit.getExperience() * 2
			pPlot = unit.plot()
			for iUnit in xrange(pPlot.getNumUnits()):
				pUnit = pPlot.getUnit(iUnit)
				if pUnit.isNone(): continue
				if pUnit.isDead(): continue
				if pUnit.getUnitCombatType() == -1: continue
				if pUnit.getOwner() == iPlayer:
					Wish.append(pUnit)
			for i in xrange(len(Wish)):
				Wish[i].changeExperience(DeathXP /len(Wish),9999,False,False,False)
				if i < DeathXP % len(Wish):
					Wish[i].changeExperience(1,9999,False,False,False)
## Blood Pact Start ##
		if unit.isHasPromotion(gc.getInfoTypeForString("PROMOTION_BLOOD_PACT")):
			pPlot = unit.plot()
			for iUnit in xrange(pPlot.getNumUnits()):
				pUnit = pPlot.getUnit(iUnit)
				if pUnit.isNone(): continue
				if pUnit.isDead(): continue
				if pUnit.getOwner() == iPlayer:	
					pUnit.changeDamage(-(unit.getLevel() * 10), false)
## Interception III Start ##
		if unit.isHasPromotion(gc.getInfoTypeForString("PROMOTION_INTERCEPTION3")):
			pTeam = gc.getTeam(pPlayer.getTeam())
			pTeam.changeNukeInterception(-2)
## Entertainer Start ##
		if unit.isHasPromotion(gc.getInfoTypeForString("PROMOTION_ENTERTAINER")):
			pPlayer.changeExtraHappiness(-1)
## Legend Start ##
		if unit.isHasPromotion(gc.getInfoTypeForString("PROMOTION_LEGEND")):
			pPlayer.changeAnarchyTurns(unit.getLevel())
			CyInterface().addMessage(iPlayer,true,10,CyTranslator().getText("TXT_MOURNING",()),'',0,'',-1,-1,-1,false,false)
## Ambasador Start ##
		if unit.isHasPromotion(gc.getInfoTypeForString("PROMOTION_AMBASSADOR")):
			pPlayer2 = gc.getPlayer(iAttacker)
			iTeam2 = pPlayer2.getTeam()
			for iTeamX in xrange(gc.getMAX_CIV_TEAMS()):
				pTeamX = gc.getTeam(iTeamX)
				pLeaderX = gc.getPlayer(pTeamX.getLeaderID())
				if pTeamX.canDeclareWar(iTeam2):
					if CyGame().getSorenRandNum(5, "Declare War") > 3 * pLeaderX.AI_getAttitude(iAttacker) - pLeaderX.AI_getAttitude(iPlayer):
						pTeamX.declareWar(iTeam2, true, -1)
## Platyping Promotions End ##
		if (not self.__LOG_UNITKILLED):
			return
		CvUtil.pyPrint('Player %d Civilization %s Unit %s was killed by Player %d' 
			%(player.getID(), player.getCivilizationName(), PyInfo.UnitInfo(unit.getUnitType()).getDescription(), attacker.getID()))

Codes from Platy's wonder National Aquatics Center:

PHP:
	def onUnitKilled(self, argsList):
		'Unit Killed'
		unit, iAttacker = argsList
		player = PyPlayer(unit.getOwner())
		attacker = PyPlayer(iAttacker)

## National Aquatics Center Start ##
		pPlayer = gc.getPlayer(unit.getOwner())
		if pPlayer.getBuildingClassCount(gc.getInfoTypeForString("BUILDINGCLASS_NATIONAL_AQUATICS_CENTER")) == 1:
			if unit.getDomainType() == gc.getInfoTypeForString("DOMAIN_LAND"):
				if unit.plot().isWater() and unit.getDamage() < 75:
					capital = pPlayer.getCapitalCity()
					pNewUnit = pPlayer.initUnit(unit.getUnitType(), capital.getX(), capital.getY(), UnitAITypes.NO_UNITAI, DirectionTypes.NO_DIRECTION)
					pNewUnit.setDamage(unit.getDamage() + 25, -1)
					pNewUnit.finishMoves()
## National Aquatics Center End ##

		if (not self.__LOG_UNITKILLED):
			return
		CvUtil.pyPrint('Player %d Civilization %s Unit %s was killed by Player %d' 
			%(player.getID(), player.getCivilizationName(), PyInfo.UnitInfo(unit.getUnitType()).getDescription(), attacker.getID()))

How to merge this?

3) I want ocean in this mapscript on this red surface (like in bts mapscript, one plot from land is coast, other plots from land are ocean).

mappp.png


link to image if you can't see it: http://s12.postimg.org/pf0gph7nf/mappp.png
 
On the Python stuff: I see no reason why it wouldn't be possible just to copy platyping's code right below your additions. I suppose you have added the associated buildings with the exact same XML tags? Do you have Python exceptions enabled?
 
As I see it, I did. But if i copy Assembly of Experts below Imperialist Trait, that building haven't their python effect. I will ask you something can i write code on this way:

PHP:
    def onEndPlayerTurn(self, argsList):
        'Called at the end of a players turn'
        iGameTurn, iPlayer = argsList
        
## Imperialist Trait Start ##
        pPlayer = gc.getPlayer(iPlayer)

        if pPlayer.hasTrait(gc.getInfoTypeForString("TRAIT_IMPERIALISTIC")):
            if pPlayer.isGoldenAge():
                pPlayer.changeCombatExperience(2)
## Imperialist Trait End ##
## Assembly of Experts Start ##
        pPlayer = gc.getPlayer(iPlayer)
        if pPlayer.getBuildingClassCount(gc.getInfoTypeForString("BUILDINGCLASS_ASSEMBLY_OF_EXPERTS")) == 1:
            capital = pPlayer.getCapitalCity()
            if capital.getDefyResolutionAngerTimer() > 0:
                (loopCity, iter) = pPlayer.firstCity(false)
                while(loopCity):
                    loopCity.changeDefyResolutionAngerTimer(- loopCity.getDefyResolutionAngerTimer())
                    (loopCity, iter) = pPlayer.nextCity(iter, false)
## Assembly of Experts End ## 

        if (gc.getGame().getElapsedGameTurns() == 1):
            if (gc.getPlayer(iPlayer).isHuman()):
                if (gc.getPlayer(iPlayer).canRevolution(0)):
                    popupInfo = CyPopupInfo()
                    popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_CHANGECIVIC)
                    popupInfo.addPopup(iPlayer)
        
        CvAdvisorUtils.resetAdvisorNags()
        CvAdvisorUtils.endTurnFeats(iPlayer)

i have two "pPlayer = gc.getPlayer(iPlayer)" in this def, is this correctly can i write on this way?
 
Defining pPlayer a 2nd time is redundant, but does not cause any errors.
It is just... inefficient.

What I am more curious is, do you even know what the building is supposed to do, before claiming the building's effects are not active? :D
 
You can and it shouldn't change anything. But there isn't really a point since you can reuse the pPlayer object in both cases.

How exactly are you testing the building effect? As far as I can see, its only purpose is to reduce the defy resolution anger in all cities to zero at the end of every turn.
 
I am write on this way and don't work again, but in you alone module wonder work
CvEventManager:
PHP:
	def onEndPlayerTurn(self, argsList):
		'Called at the end of a players turn'
		iGameTurn, iPlayer = argsList
		
## Imperialist Trait Start ##
		pPlayer = gc.getPlayer(iPlayer)

		if pPlayer.hasTrait(gc.getInfoTypeForString("TRAIT_IMPERIALISTIC")):
			if pPlayer.isGoldenAge():
				pPlayer.changeCombatExperience(2)
## Imperialist Trait End ##
## Assembly of Experts Start ##
		if pPlayer.getBuildingClassCount(gc.getInfoTypeForString("BUILDINGCLASS_ASSEMBLY_OF_EXPERTS")) == 1:
			capital = pPlayer.getCapitalCity()
			if capital.getDefyResolutionAngerTimer() > 0:
				(loopCity, iter) = pPlayer.firstCity(false)
				while(loopCity):
					loopCity.changeDefyResolutionAngerTimer(- loopCity.getDefyResolutionAngerTimer())
					(loopCity, iter) = pPlayer.nextCity(iter, false)
## Assembly of Experts End ##

		if (gc.getGame().getElapsedGameTurns() == 1):
			if (gc.getPlayer(iPlayer).isHuman()):
				if (gc.getPlayer(iPlayer).canRevolution(0)):
					popupInfo = CyPopupInfo()
					popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_CHANGECIVIC)
					popupInfo.addPopup(iPlayer)
		
		CvAdvisorUtils.resetAdvisorNags()
		CvAdvisorUtils.endTurnFeats(iPlayer)

My PythonCallbackDefines:
PHP:
	.
.
.
<Define>
		<DefineName>USE_CANNOT_CONSTRUCT_CALLBACK</DefineName>
		<iDefineIntVal>1</iDefineIntVal>
	</Define>
.
.
.
	<Define>
		<DefineName>USE_CAN_TRAIN_CALLBACK</DefineName>
		<iDefineIntVal>1</iDefineIntVal>
	</Define>

Yes, i know Platy.
Yes Leoleth that is Assembly effect.

If i defy resolution my people became angry. Maybe i can't merge this.
 
Do you wait one turn for the wonder to take effect?

As it is implemented, a defied resolution should apply unhappiness which is removed at the end of the turn.
 
No, i am do that just now. My BIG APOLOGIZE to everyone, especially to platyping. Sorry Platy your wonder work, i am make i big mistake :(

But how to merge codes from post #225 in this thread - 2) question ?
 
Seeing that nobody else bothered to answer, my answer is don't bother.
Merging 2 codes that deal with reviving units is not as easy as C&P.
You can see how many extra work needed in the promo codes to merge few promotions together.
If not done properly, you will end up reviving twice or triggering death effects when it can revive
 
I am test my mod and i am get this error:

errorrr.png


Code:
PHP:
	def onUnitSpreadReligionAttempt(self, argsList):
		'Unit tries to spread religion to a city'
		pUnit, iReligion, bSuccess = argsList
		
		iX = pUnit.getX()
		iY = pUnit.getY()

## Spiritual Trait Start ##
		if bSuccess == false:
			pPlayer = gc.getPlayer(pUnit.getOwner())
			if pPlayer.hasTrait(gc.getInfoTypeForString("TRAIT_SPIRITUAL")):
				capital= pPlayer.getCapitalCity()
				newUnit = player.initUnit(pUnit.getUnitType(), capital.getX(),capital.getY(), UnitAITypes.UNITAI_MISSIONARY, DirectionTypes.NO_DIRECTION )
				newUnit.finishMoves()
## Spiritual Trait End ##

		pPlot = CyMap().plot(iX, iY)
		pCity = pPlot.getPlotCity()

newUnit = player.initUnit(pUnit.getUnitType(), capital.getX(),capital.getY(), UnitAITypes.UNITAI_MISSIONARY, DirectionTypes.NO_DIRECTION ) <-- line 1238

If you can't see image click here http://s16.postimg.org/707a5hedh/errorrr.png
 
Seriously, whether it is the screenshot you pasted, or the one in the link, they are both too small to see anything.

But anyway, it is pretty obvious player is undefined and should be pPlayer
 
Spoiler :
PHP:
## Crusade Start ##

		pPlayer = gc.getPlayer(iPlayer)
		b_Crusade = gc.getInfoTypeForString("BUILDING_CRUSADE")
		obsoleteTech = gc.getBuildingInfo(b_Crusade).getObsoleteTech()

		if ( gc.getTeam(pPlayer.getTeam()).isHasTech(obsoleteTech) == false or obsoleteTech == -1 ):
			for iCity in range(pPlayer.getNumCities()):
				ppCity = pPlayer.getCity(iCity)
				if ppCity.getNumActiveBuilding(b_Crusade) == true:

					iX = ppCity.getX()
					iY = ppCity.getY()
					u_crusader = gc.getInfoTypeForString( 'UNIT_CRUSADER' )

					estiEnd = CyGame().getEstimateEndTurn()
					if ( estiEnd >= 1000 ):
						if ( iGameTurn % 12 ) == 0:
							for i in range(1):
								pNewUnit = pPlayer.initUnit( u_crusader, iX, iY, UnitAITypes.UNITAI_ATTACK_CITY, DirectionTypes.NO_DIRECTION )
					elif ( estiEnd >= 700 ):
						if ( iGameTurn % 8 ) == 0:
							for i in range(1):
								pNewUnit = pPlayer.initUnit( u_crusader, iX, iY, UnitAITypes.UNITAI_ATTACK_CITY, DirectionTypes.NO_DIRECTION )
					elif ( estiEnd >= 500 ):
						if ( iGameTurn % 6 ) == 0:
							for i in range(1):
								pNewUnit = pPlayer.initUnit( u_crusader, iX, iY, UnitAITypes.UNITAI_ATTACK_CITY, DirectionTypes.NO_DIRECTION )

					elif ( estiEnd >= 300 ):
						if ( iGameTurn % 4 ) == 0:
							for i in range(1):
								pNewUnit = pPlayer.initUnit( u_crusader, iX, iY, UnitAITypes.UNITAI_ATTACK_CITY, DirectionTypes.NO_DIRECTION )
					else:
						if ( iGameTurn % 4 ) == 0:
							for i in range(1):
								pNewUnit = pPlayer.initUnit( u_crusader, iX, iY, UnitAITypes.UNITAI_ATTACK_CITY, DirectionTypes.NO_DIRECTION )

					basechance = 12
					estiEnd = CyGame().getEstimateEndTurn()
					if ( estiEnd >= 1000 ):
						basechance = basechance
					elif ( estiEnd >= 700 ):
						basechance = 6
					elif ( estiEnd >= 500 ):
						basechance = 4
					elif ( estiEnd >= 300 ):
						basechance = 2
					else:
						basechance = 1

					chance = CyGame().getSorenRandNum(basechance, "free state religion spread chance")
					if ( chance == 0 ):
						lppCityUber5 = []
						for iiCity in range(pPlayer.getNumCities()):
							ppCity = pPlayer.getCity(iiCity)
							if ( not ppCity.isHasReligion(pPlayer.getStateReligion()) ):
								lppCityUber5.append(ppCity)
						if ( len(lppCityUber5) != 0 ):
							chance = CyGame().getSorenRandNum(len(lppCityUber5), "which city")
							ppCity = lppCityUber5[chance]
							ppCity.setHasReligion(pPlayer.getStateReligion(), true, true, true)

## Crusade End ##
## Second Crusade Start ##

		pPlayer = gc.getPlayer(iPlayer)
		b_Crusade = gc.getInfoTypeForString("BUILDING_CRUSADE")
		obsoleteTech = gc.getBuildingInfo(b_Crusade).getObsoleteTech()

		if ( gc.getTeam(pPlayer.getTeam()).isHasTech(obsoleteTech) == false or obsoleteTech == -1 ):
			for iCity in range(pPlayer.getNumCities()):
				ppCity = pPlayer.getCity(iCity)
				if ppCity.getNumActiveBuilding(b_Crusade) == true:

					iX = ppCity.getX()
					iY = ppCity.getY()
					u_crusader = gc.getInfoTypeForString( 'UNIT_CRUSADER' )

					estiEnd = CyGame().getEstimateEndTurn()
					if ( estiEnd >= 1000 ):
						if ( iGameTurn % 12 ) == 0:
							for i in range(1):
								pNewUnit = pPlayer.initUnit( u_crusader, iX, iY, UnitAITypes.UNITAI_ATTACK_CITY, DirectionTypes.NO_DIRECTION )
					elif ( estiEnd >= 700 ):
						if ( iGameTurn % 8 ) == 0:
							for i in range(1):
								pNewUnit = pPlayer.initUnit( u_crusader, iX, iY, UnitAITypes.UNITAI_ATTACK_CITY, DirectionTypes.NO_DIRECTION )
					elif ( estiEnd >= 500 ):
						if ( iGameTurn % 6 ) == 0:
							for i in range(1):
								pNewUnit = pPlayer.initUnit( u_crusader, iX, iY, UnitAITypes.UNITAI_ATTACK_CITY, DirectionTypes.NO_DIRECTION )

					elif ( estiEnd >= 300 ):
						if ( iGameTurn % 4 ) == 0:
							for i in range(1):
								pNewUnit = pPlayer.initUnit( u_crusader, iX, iY, UnitAITypes.UNITAI_ATTACK_CITY, DirectionTypes.NO_DIRECTION )
					else:
						if ( iGameTurn % 4 ) == 0:
							for i in range(1):
								pNewUnit = pPlayer.initUnit( u_crusader, iX, iY, UnitAITypes.UNITAI_ATTACK_CITY, DirectionTypes.NO_DIRECTION )

					basechance = 12
					estiEnd = CyGame().getEstimateEndTurn()
					if ( estiEnd >= 1000 ):
						basechance = basechance
					elif ( estiEnd >= 700 ):
						basechance = 6
					elif ( estiEnd >= 500 ):
						basechance = 4
					elif ( estiEnd >= 300 ):
						basechance = 2
					else:
						basechance = 1

					chance = CyGame().getSorenRandNum(basechance, "free state religion spread chance")
					if ( chance == 0 ):
						lppCityUber5 = []
						for iiCity in range(pPlayer.getNumCities()):
							ppCity = pPlayer.getCity(iiCity)
							if ( not ppCity.isHasReligion(pPlayer.getStateReligion()) ):
								lppCityUber5.append(ppCity)
						if ( len(lppCityUber5) != 0 ):
							chance = CyGame().getSorenRandNum(len(lppCityUber5), "which city")
							ppCity = lppCityUber5[chance]
							ppCity.setHasReligion(pPlayer.getStateReligion(), true, true, true)

## Second Crusade End ##

Can i write this in CvEventManager? In ## Second Crusade i will change unit and building (Need to spawn undead units for undead civilization)
 
NEWS:

Some Chaos Gun units (I am finish all Chaos Units instead Great Peoples)

chaos_gun_units.png


if you can't see image go here http://s8.postimg.org/ozydu3f4z/chaos_gun_units.png

- 16 civilizations for now, not the end of it, coming soon new. (Completed arts for Skaven and Chaos Civilization)
- Civilizations: Bakemono, Caelum, Chaos, Ermor, Infernal, Woodelves, Mazatl, Mechanos, Morian Orcs, Orcs, Man, Skaven, Terran, Highelves, Ulm, Zao Lizards.
- I am edited The_J civil war event for all eras, now if your people are angry they can revolt against you, but you never know when and where they will do that, because keep your people happy.
- Every Civilization have their unique trait, which give some promotion-s to units.
- Leaders balanced to hate/love each other (Infernal leaders love Ermor Leaders, Terrans hates Ors, Bakemono, etc)

I don't know, whether to upload the first version of this mod? Other Civilizations have units arts from BTS instead Chaos and Skaven.
 
Well, if all it matters is just artwork, at least you can gather feedback such as
"This freaking lizard unit is too strong. All other units of similar era are free food."
"I got a CTD!"
"This python trait does not work when lalalalala happens"
 
Back
Top Bottom