Seeking Possible Collaboration for Scenario(s)!

Aurelazza

Chieftain
Joined
Oct 4, 2012
Messages
58
I'd been working on a possible series of scenarios for a while now, all centered around Auric Ulvin's Ascendancy. A little while ago my old hard drive burned out, and I lost most of what I had. As I pick up the pieces, I can't help but think that a little outside help could do wonders. I can do a modest job with the graphical side of things, and I'm teaching myself Python as I go. If you can act as a decent programmer, graphics designer or idea-guru, then I'd love to hear from you!
 
For idea, I suggest you read MagisterCultuum's posts or seek his advice.

For other things, what are exactly things/skills/people that you need? I might be able to lend some hand.
 
I've been in contact with Magister for a while now, in fact. He's given out tremendous advice.

As for what would be helpful in terms of things/skills/people, it's pretty open-ended. Someone who I could run an idea for a new unit or promotion by for their take on how it would affect game balance / enjoyability, then someone who could help Blender/Nifskope/Python that concept into a reality. Someone to toss ideas for a scenario's objectives and activated features back and forth with, then maybe someone else to help playtest that scenario. In short, a second (or third or fourth) set of hands willing to bring whatever skills they have to the table. I'd be quite happy to PM anyone who's interested with the specifics of what I'm up to and what I've managed to recover from my dead-and-gone laptop.

If more people get involved, we could scale up the scope of the project accordingly. I've a bit of experience with coordinating people with different skillsets on game mods, assuming that ripped/pirated Pokemon Nintendo DS games count :mischief:
 
I don't know much python at all but I created that python code thread (to give a promotion to a unit after it kills a certain type of unit) ages ago just taking snippets of Kael's code and modifying it. Maybe you could write down what needs code (and break it down into small discreet packages)?
 
Sounds good. I'll work out which functions I'm having trouble with, then run it by you in a PM. Thanks! :D
 
Sounds good. I'll work out which functions I'm having trouble with, then run it by you in a PM. Thanks! :D

I don't know python but I can try to think of a way to do it from Pre-existing code and work it out from there, perhaps. I'd suggest posting it publically in this thread as well as PMing me (I'm not on forums that often).
 
I think Aurelazza wants to have something happen at a certain turn. Aurelazza, could you please give a specific action that you want to happen?

I found this code in Age of Ice scenario (CvModEvents.py):

Code:
def onBeginGameTurn(self, argsList):
[INDENT]'Called at the beginning of the end of each turn'
iGameTurn = argsList[0]
pPlayer = gc.getPlayer(0)
...
if iGameTurn == 2:
...
if iGameTurn > 5:
...
if iGameTurn == 20:
...[/INDENT]

It was also suggested that the best way would be to isolate Orthus' code that causes him to spawn on a random land tile on a certain turn. The code relating to Orthus (FFH2 mod) is:
CvEventManager.py
Code:
def onBeginGameTurn(self, argsList):
		'Called at the beginning of the end of each turn'
		iGameTurn = argsList[0]

		iOrthusTurn = 75
		if not CyGame().isUnitClassMaxedOut(gc.getInfoTypeForString('UNITCLASS_ORTHUS'), 0):
			if not CyGame().isOption(gc.getInfoTypeForString('GAMEOPTION_NO_ORTHUS')):
				bOrthus = False
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_QUICK'):
					if iGameTurn >= iOrthusTurn / 3 * 2:
						bOrthus = True
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_NORMAL'):
					if iGameTurn >= iOrthusTurn:
						bOrthus = True
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_EPIC'):
					if iGameTurn >= iOrthusTurn * 3 / 2:
						bOrthus = True
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_MARATHON'):
					if iGameTurn >= iOrthusTurn * 3:
						bOrthus = True
				if bOrthus:
					iUnit = gc.getInfoTypeForString('UNIT_ORTHUS')
					cf.addUnit(iUnit)
					cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_ORTHUS_CREATION",()), str(gc.getUnitInfo(iUnit).getImage()))

		if not CyGame().isOption(gc.getInfoTypeForString('GAMEOPTION_NO_PLOT_COUNTER')):
			cf.doHellTerrain()

		if CyGame().getWBMapScript():
			sf.doTurn()
So my interpretation of this is that 1) The game turn number is called iGameTurn; 2) The unit (Orthus) will appear on the game turn defined by iOrthusTurn and this is modified according to gamespeed; 3) bOrthus = False by default and when Orthus is allowed on the map, bOrthus = True; 4) if Orthus is to be added to the map then the program defines iUnit as Orthus which presumably references data on what Orthus is (therefore this is the part that could be changed to add any unit of your choosing); 5) The unit (Orthus) is presumably added by the line cf.addUnit(iUnit) (remembering that iUnit has just been defined to be Orthus). Please correct me if I'm wrong on any of this! :)



QUESTIONS:
(A) I'm not sure what if not CyGame().isUnitClassMaxedOut(gc.getInfoTypeForString('UNITCLASS_ORTHUS'), 0): means - is it possibly checking if Orthus has been killed already (does anyone know what this line means)?

(B) I'm not sure what these lines mean:
if not CyGame().isOption(gc.getInfoTypeForString('GAMEOPTION_NO_PLOT_COUNTER')):
cf.doHellTerrain()

if CyGame().getWBMapScript():
sf.doTurn()

(C) How does it know where to place Orthus on the map (so that he is placed on a valid land tile)?

(D) How does it define what Orthus is (so that this can be the part easily changed to suit individual scenario makers)? If I were to guess, it might be the reference to Orthus in the Civ4UnitInfos.xml or possibly Civ4UnitClassInfos.xml.
 
So I've been working on creating a barbarian unit (e.g. Scout) on a particular turn at a random land location with lots of help from Snarko on #erebus and this is the code (which is easily modified by even non-programmers to make their scenario how they want). The below code is tested and works.

Code:
	def onBeginGameTurn(self, argsList):
		'Called at the beginning of the end of each turn'
		iGameTurn = argsList[0]

		iOrthusTurn = 75
		if not CyGame().isUnitClassMaxedOut(gc.getInfoTypeForString('UNITCLASS_ORTHUS'), 0):
			if not CyGame().isOption(gc.getInfoTypeForString('GAMEOPTION_NO_ORTHUS')):
				bOrthus = False
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_QUICK'):
					if iGameTurn >= iOrthusTurn / 3 * 2:
						bOrthus = True
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_NORMAL'):
					if iGameTurn >= iOrthusTurn:
						bOrthus = True
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_EPIC'):
					if iGameTurn >= iOrthusTurn * 3 / 2:
						bOrthus = True
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_MARATHON'):
					if iGameTurn >= iOrthusTurn * 3:
						bOrthus = True
				if bOrthus:
					iUnit = gc.getInfoTypeForString('UNIT_ORTHUS')
					cf.addUnit(iUnit)
					cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_ORTHUS_CREATION",()), str(gc.getUnitInfo(iUnit).getImage()))


          	#NEW CODE STARTS HERE#
		iExtraUnitTurn = [COLOR="Red"]10[/COLOR]
		#This means it spawns at the end of year 10 so change 10 to whatever year you want#
		if not CyGame().isUnitClassMaxedOut(gc.getInfoTypeForString('[COLOR="Red"]UNITCLASS_SCOUT[/COLOR]'), 0):
		#This only stops a unit from being spawned if it has a maximum number allowed, e.g. unique units can't be created twice#
		#if not CyGame().isOption(gc.getInfoTypeForString('GAMEOPTION_NO_ORTHUS')):#
		#Remove the hashtags above to uncomment the line if you use the units Orthus/Duin/Archeron because they might have been removed at the menu#
				bExtraUnit = False
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_QUICK'):
					if iGameTurn == iExtraUnitTurn / 3 * 2:
						bExtraUnit = True
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_NORMAL'):
					if iGameTurn == iExtraUnitTurn:
						bExtraUnit = True
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_EPIC'):
					if iGameTurn == iExtraUnitTurn * 3 / 2:
						bExtraUnit = True
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_MARATHON'):
					if iGameTurn == iExtraUnitTurn * 3:
						bExtraUnit = True
				if bExtraUnit:
					iUnit = gc.getInfoTypeForString('[COLOR="Red"]UNIT_SCOUT[/COLOR]')
					#Change SCOUT to whatever unit you want to be created#
					cf.addUnit(iUnit)
       		#NEW CODE ENDS HERE#


		if not CyGame().isOption(gc.getInfoTypeForString('GAMEOPTION_NO_PLOT_COUNTER')):
			cf.doHellTerrain()

		if CyGame().getWBMapScript():
			sf.doTurn()

Lines starting and ending with apostrophes are comment lines and are ignored by python.

This code needs to be added to the file CvEventManager.py (code shown before and after so you can see exactly where to insert it). For a scenario with modified code, a whole new directory with all the files needs to be created.

A complete list of all units you can easily use is listed in Civ4UnitInfos.xml. If you wish to create a new unit or modify existing unit then check appropriate sources before doing so.

Remember that a boarding party, for example, has a different unit name (boarding party) to unit class (champion).
 
In the above example:

if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_QUICK'):
if iGameTurn == iExtraUnitTurn / 3 * 2:

Python automatically rounds the iExtraUnitTurn down to the nearest integer. This means that iGameTurn being an integer is always able to equal iExtraUnitTurn (which is always rounded down to an integer).

Snarko advises to always use the "*" before the "/" because they can give different results in python.
 
So my interpretation of this is that 1) The game turn number is called iGameTurn; 2) The unit (Orthus) will appear on the game turn defined by iOrthusTurn and this is modified according to gamespeed; 3) bOrthus = False by default and when Orthus is allowed on the map, bOrthus = True; 4) if Orthus is to be added to the map then the program defines iUnit as Orthus which presumably references data on what Orthus is (therefore this is the part that could be changed to add any unit of your choosing); 5) The unit (Orthus) is presumably added by the line cf.addUnit(iUnit) (remembering that iUnit has just been defined to be Orthus). Please correct me if I'm wrong on any of this! :)

That is all correct.

QUESTIONS:
(A) I'm not sure what if not CyGame().isUnitClassMaxedOut(gc.getInfoTypeForString('UNITCLASS_ORTHUS'), 0): means - is it possibly checking if Orthus has been killed already (does anyone know what this line means)?

Making sure that he hasn't been created already. Orthus is a hero unit, so there can only be one of him.

(B) I'm not sure what these lines mean:
if not CyGame().isOption(gc.getInfoTypeForString('GAMEOPTION_NO_PLOT_COUNTER')):
cf.doHellTerrain()

if CyGame().getWBMapScript():
sf.doTurn()

Plot Counter = Armageddon Counter. If the Armageddon counter is turned off (via the game option), then it wont call the doHellTerrain function (cf = custom function which means its in the CustomFunctions.py file)

(C) How does it know where to place Orthus on the map (so that he is placed on a valid land tile)?

Thats done in the addUnit function of CustomFunctions.py

(D) How does it define what Orthus is (so that this can be the part easily changed to suit individual scenario makers)? If I were to guess, it might be the reference to Orthus in the Civ4UnitInfos.xml or possibly Civ4UnitClassInfos.xml.

Seems like you figured this one out already.
 
I'd recommend that anyone with qestions about python functions look them up here in the BtS API first. It does not cover the functions added by FfH2 or MNAI, but it is easier than searching the MNAI DLL source code.

QUESTIONS:
(A) I'm not sure what if not CyGame().isUnitClassMaxedOut(gc.getInfoTypeForString('UNITCLASS_ORTHUS'), 0): means - is it possibly checking if Orthus has been killed already (does anyone know what this line means)?
It is checking to see whether Orthus has been created yet.


The function is:
CvGame.cpp:
Code:
bool CvGame::isUnitClassMaxedOut(UnitClassTypes eIndex, int iExtra)
{
	FAssertMsg(eIndex >= 0, "eIndex is expected to be non-negative (invalid Index)");
	FAssertMsg(eIndex < GC.getNumUnitClassInfos(), "eIndex is expected to be within maximum bounds (invalid Index)");

	if (!isWorldUnitClass(eIndex))
	{
		return false;
	}

	// Tholal Note - Barnaxus is causing this assert error because he can be created many times - not sure an easy workaround is available
//	FAssertMsg(getUnitClassCreatedCount(eIndex) <= GC.getUnitClassInfo(eIndex).getMaxGlobalInstances(), "Index is expected to be within maximum bounds (invalid Index)");

	return ((getUnitClassCreatedCount(eIndex) + iExtra) >= GC.getUnitClassInfo(eIndex).getMaxGlobalInstances());
}

eIndex is an integer representing the index (position in the file) of the UnitClass in question. (You can get the index from the string using gc.getInfoTypeForString("whatever").)

iExtra is how many more units are allowed before the limit is reached. (The game uses this function to determine whether you are allowed to build another unit of this class. In counts the number of such units your cities are already building as passes them along as iExtra.)

Since iExtra is 0 in this case, the question is whether the number of such units that have already been created has yet reached the limit.


The World Unit limits count all units that have ever been created by any player.

There are equivalent functions under CyTeam and CyPlayer to check for Team and National unit limits. Those only check how many units the team or player currently controls.



(B) I'm not sure what these lines mean:
if not CyGame().isOption(gc.getInfoTypeForString('GAMEOPTION_NO_PLOT_COUNTER')):
cf.doHellTerrain()

if CyGame().getWBMapScript():
sf.doTurn()
The first line is asking whether or not the Hallowed Ground (Removes the Armageddon Counter from the Game) game option is active. If it is not, then it calls the def doHellTerrain() function found in CustomFunctions.py. That function is what controls the spread of hell and causes resources to change to and from their hell equivalents.

I believe that the second conditional is asking whether the game is a scenario. If it is then it runs the def doTurn() function found in ScenarioFunctions.py. That in turn would check for the various dummy game options that Kael added in order allow the game to know what special code to apply to what scenario.

(C) How does it know where to place Orthus on the map (so that he is placed on a valid land tile)?
cf.addUnit(iUnit) calls this code found in CustomFunctions.py:

Code:
	def addUnit(self, iUnit):
		pBestPlot = -1
		iBestPlot = -1
		for i in range (CyMap().numPlots()):
			pPlot = CyMap().plotByIndex(i)
			iPlot = -1
			if pPlot.isWater() == False:
				if pPlot.getNumUnits() == 0:
					if pPlot.isCity() == False:
						if pPlot.isImpassable() == False:
							iPlot = CyGame().getSorenRandNum(500, "Add Unit")
							iPlot = iPlot + (pPlot.area().getNumTiles() * 10)
							if pPlot.isBarbarian():
								iPlot = iPlot + 200
							if pPlot.isOwned():
								iPlot = iPlot / 2
							if iPlot > iBestPlot:
								iBestPlot = iPlot
								pBestPlot = pPlot
		if iBestPlot != -1:
			bPlayer = gc.getPlayer(gc.getBARBARIAN_PLAYER())
			newUnit = bPlayer.initUnit(iUnit, pBestPlot.getX(), pBestPlot.getY(), UnitAITypes.UNITAI_ATTACK, DirectionTypes.DIRECTION_SOUTH)



(D) How does it define what Orthus is (so that this can be the part easily changed to suit individual scenario makers)? If I were to guess, it might be the reference to Orthus in the Civ4UnitInfos.xml or possibly Civ4UnitClassInfos.xml.
iUnit = gc.getInfoTypeForString('UNIT_ORTHUS')

gc.getInfoTypeForString finds the index of "UNIT_ORTHUS", i.e., the position in CIV4UnitInfos.xml where the unit is found. (The first unit is 0, the second 1, the third 3, etc). This index is what is needed in order to initialize the unit.


Edit: I just saw that Tholal already answered most of this:

Plot Counter = Armageddon Counter.
While the rest of your explanation was right, this is statement is technically false and could confuse people. The Plot Counter and the Armageddon counter as different, but related, things.

The Armageddon counter applies to the game as a whole. It is what causes the various Armageddon events to be triggered, and it is one criteria used to determined whether hell is allowed to spread.

The Plot Counter is what determines whether any individual tile should be considered hell. (The terrain types change automatically based o Plot Counter, although feature and resource changes rely on python.) When doHellTerrain() runs, it does not simply turn a tile to hell. The Armageddon Counter and the alignment of the plot's owner are used to determine whether hell is allowed to spread. The spread of hell is however an increase in a plot's Plot Counter, and will only actually happen if the plot is adjacent to a tile with a high enough Plot Counter (or is Infernal Territory).


I believe that you could technically still use the Plot Counter in a scenario where the Armageddon counter and doHellTerrain are turned off. Your scenario-specific code would make the changes instead.

I just saw something I didn't know before - in the lore for Ice Golem (age of ice scenario) it implies that Mulcarn captured Barnaxus and had him work for him. Maybe something interesting that could be used in a story??

This is indeed the case.

(If you look carefully, you'll see that Barnaxus's artwork bears the makr of the White Hand.)

Mulcarn did not merely recruit or control Barnaxus. He took a broken piece of enchanted machinery and breathed life into it. Barnaxus became an intelligent being capable of independent thought because he was given a divine spark, a small fragment of Mulcarn's own soul.


The Beneath the Hell scenario already touches on the subject. The whole point of the scenario is to capture Barnaxus (or the pieces thereof) so that Auric can release the only surviving part of Mulcarn from the machine and absorb it into himself. This was probably the most important step on his path towards godhood.


(In my modmod, Auric has the "Inhale Mulcarn's Last Breath" ability, which lets him sacrifice The Pieces of Barnaxus in order to hurry The Draw or The Ascension ritual. The Illians are also allowed to rebuilt him from the pieces, if they do not wish to sacrifice them. Under Illian control, Barnaxus has the Craft Ice Golem ability. Since I gave Barnaxus The White Hand religion, he may defect to serve Auric once The Draw is completed. Barnaxus would not fight the God of Winter any more than Bambur would fight against Kilmorph.)
 
Another piece of code. This requires 3 lines to be added to the CvEventManager.py file. It creates a unit belonging to the player upon discovery of a particular technology. Again, thanks to Snarko for lots of help with the python code!

Code:
	def onTechAcquired(self, argsList):
		'Tech Acquired'
		iTechType, iTeam, iPlayer, bAnnounce = argsList
		# Note that iPlayer may be NULL (-1) and not a refer to a player object
		pPlayer = gc.getPlayer(iPlayer)		
		
		# Show tech splash when applicable
		if (iPlayer > -1 and bAnnounce and not CyInterface().noTechSplash()):
			if (gc.getGame().isFinalInitialized() and not gc.getGame().GetWorldBuilderMode()):
				if ((not gc.getGame().isNetworkMultiPlayer()) and (iPlayer == gc.getGame().getActivePlayer())):
					popupInfo = CyPopupInfo()
					popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON_SCREEN)
					popupInfo.setData1(iTechType)
					popupInfo.setText(u"showTechSplash")
					popupInfo.addPopup(iPlayer)

		if (iPlayer != -1 and iPlayer != gc.getBARBARIAN_PLAYER()):
			pPlayer = gc.getPlayer(iPlayer)
			
#Sephi	
#Go into Conquest Mode
			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_AMURITES'):
				if iTechType == gc.getInfoTypeForString('TECH_BOWYERS'):
					pPlayer.startConquestMode()
			
			if pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_PERPENTACH'):
				if iTechType == gc.getInfoTypeForString('TECH_CONSTRUCTION'):
					pPlayer.startConquestMode()

			if pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_KEELYN'):
				if iTechType == gc.getInfoTypeForString('TECH_IRON_WORKING'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_BALSERAPHS'):
				if iTechType == gc.getInfoTypeForString('TECH_IRON_WORKING'):
					pPlayer.startConquestMode()
					
			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_BANNOR'):											
				if iTechType == gc.getInfoTypeForString('TECH_FANATICISM'):			
					pPlayer.startConquestMode()

			if pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_ALEXIS'):
				if iTechType == gc.getInfoTypeForString('TECH_BRONZE_WORKING'):
					pPlayer.startConquestMode()
			elif pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_CALABIM'):											 
				if iTechType == gc.getInfoTypeForString('TECH_FEUDALISM'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_CLAN_OF_EMBERS'):											 
				if iTechType == gc.getInfoTypeForString('TECH_MASONRY'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_DOVIELLO'):											 
				if iTechType == gc.getInfoTypeForString('TECH_FESTIVALS'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_ELOHIM'):
				if iTechType == gc.getInfoTypeForString('TECH_PRIESTHOOD'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_GRIGORI'):
				if iTechType == gc.getInfoTypeForString('TECH_MEDICINE'):
					pPlayer.startConquestMode()
					
			if pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_TASUNKE'):
				if iTechType == gc.getInfoTypeForString('TECH_HORSEBACK_RIDING'):
					pPlayer.startConquestMode()
					
			elif pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_RHOANNA'):
				if iTechType == gc.getInfoTypeForString('TECH_STIRRUPS'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_HIPPUS'):
				if iTechType == gc.getInfoTypeForString('TECH_STIRRUPS'):
					pPlayer.startConquestMode()
					
			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_ILLIANS'):
				if iTechType == gc.getInfoTypeForString('TECH_IRON_WORKING'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_INFERNAL'):
				if iTechType == gc.getInfoTypeForString('TECH_IRON_WORKING'):
					pPlayer.startConquestMode()
					
			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_KHAZAD'):
				if iTechType == gc.getInfoTypeForString('TECH_IRON_WORKING'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_KURIOTATES'):
				if iTechType == gc.getInfoTypeForString('TECH_STIRRUPS'):
					pPlayer.startConquestMode()
					
					
			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_LANUN'):
				if iTechType == gc.getInfoTypeForString('TECH_IRON_WORKING'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_LJOSALFAR'):											 
				if iTechType == gc.getInfoTypeForString('TECH_SORCERY'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_LUCHUIRP'):											 
				if iTechType == gc.getInfoTypeForString('TECH_SORCERY'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_MALAKIM'):
				if iTechType == gc.getInfoTypeForString('TECH_PRIESTHOOD'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_MERCURIANS'):
				if iTechType == gc.getInfoTypeForString('TECH_IRON_WORKING'):
					pPlayer.startConquestMode()
					
			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_SHEAIM'):
				if iTechType == gc.getInfoTypeForString('TECH_BRONZE_WORKING'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_SIDAR'):
				if iTechType == gc.getInfoTypeForString('TECH_POISONS'):
					pPlayer.startConquestMode()
					
			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_SVARTALFAR'):											 
				if iTechType == gc.getInfoTypeForString('TECH_SORCERY'):
					pPlayer.startConquestMode()
			
			#This creates a unit for the player when the player discovers a certain technology.
			if iTechType == gc.getInfoTypeForString('TECH_[COLOR="Red"]MASONRY[/COLOR]'):
				iUnit = gc.getInfoTypeForString('UNIT_[COLOR="Red"]HUNTER[/COLOR]')
				cf.giftUnit(iUnit, pPlayer.getCivilizationType(), 0, -1, -1)
			
			iReligion = -1
			if iTechType == gc.getInfoTypeForString('TECH_CORRUPTION_OF_SPIRIT'):
				iUnit = gc.getInfoTypeForString('UNIT_DISCIPLE_THE_ASHEN_VEIL')
				iReligion = gc.getInfoTypeForString('RELIGION_THE_ASHEN_VEIL')
			if iTechType == gc.getInfoTypeForString('TECH_ORDERS_FROM_HEAVEN'):
				iUnit = gc.getInfoTypeForString('UNIT_DISCIPLE_THE_ORDER')
				iReligion = gc.getInfoTypeForString('RELIGION_THE_ORDER')
			if iTechType == gc.getInfoTypeForString('TECH_WAY_OF_THE_FORESTS'):
				iUnit = gc.getInfoTypeForString('UNIT_DISCIPLE_FELLOWSHIP_OF_LEAVES')
				iReligion = gc.getInfoTypeForString('RELIGION_FELLOWSHIP_OF_LEAVES')
			if iTechType == gc.getInfoTypeForString('TECH_WAY_OF_THE_EARTHMOTHER'):
				iUnit = gc.getInfoTypeForString('UNIT_DISCIPLE_RUNES_OF_KILMORPH')
				iReligion = gc.getInfoTypeForString('RELIGION_RUNES_OF_KILMORPH')
			if iTechType == gc.getInfoTypeForString('TECH_MESSAGE_FROM_THE_DEEP'):
				iUnit = gc.getInfoTypeForString('UNIT_DISCIPLE_OCTOPUS_OVERLORDS')
				iReligion = gc.getInfoTypeForString('RELIGION_OCTOPUS_OVERLORDS')
			if iTechType == gc.getInfoTypeForString('TECH_HONOR'):
				iUnit = gc.getInfoTypeForString('UNIT_DISCIPLE_EMPYREAN')
				iReligion = gc.getInfoTypeForString('RELIGION_THE_EMPYREAN')
			if iTechType == gc.getInfoTypeForString('TECH_DECEPTION'):
				iUnit = gc.getInfoTypeForString('UNIT_NIGHTWATCH')
				iReligion = gc.getInfoTypeForString('RELIGION_COUNCIL_OF_ESUS')
			if iReligion != -1:
				if (iReligion==pPlayer.getFavoriteReligion()):
					pPlayer.getCapitalCity().setHasReligion(iReligion,True,True,True)			
				if CyGame().isReligionFounded(iReligion):
					cf.giftUnit(iUnit, pPlayer.getCivilizationType(), 0, -1, -1)

All you need to do to use this is copy and paste those 3 lines of code (plus comment explaining it is advisable) and change the red text to whatever unit and technology you want!
 
Another bit of code (thanks to Snarko and JHeral on #Erebus for the massive help again). This requires 4 lines (or more for more flames) of code to be added to CvEventManager.py. It creates a flaming tile on the (x,y) coordinates you specify when you research a particular technology IF there is a forest or jungle on that tile. The y-axis counts vertically upwards with the lowest tile being y=0).

Code:
	def onTechAcquired(self, argsList):
		'Tech Acquired'
		iTechType, iTeam, iPlayer, bAnnounce = argsList
		# Note that iPlayer may be NULL (-1) and not a refer to a player object
		pPlayer = gc.getPlayer(iPlayer)		
		
		# Show tech splash when applicable
		if (iPlayer > -1 and bAnnounce and not CyInterface().noTechSplash()):
			if (gc.getGame().isFinalInitialized() and not gc.getGame().GetWorldBuilderMode()):
				if ((not gc.getGame().isNetworkMultiPlayer()) and (iPlayer == gc.getGame().getActivePlayer())):
					popupInfo = CyPopupInfo()
					popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON_SCREEN)
					popupInfo.setData1(iTechType)
					popupInfo.setText(u"showTechSplash")
					popupInfo.addPopup(iPlayer)

		if (iPlayer != -1 and iPlayer != gc.getBARBARIAN_PLAYER()):
			pPlayer = gc.getPlayer(iPlayer)
			
#Sephi	
#Go into Conquest Mode
			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_AMURITES'):
				if iTechType == gc.getInfoTypeForString('TECH_BOWYERS'):
					pPlayer.startConquestMode()
			
			if pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_PERPENTACH'):
				if iTechType == gc.getInfoTypeForString('TECH_CONSTRUCTION'):
					pPlayer.startConquestMode()

			if pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_KEELYN'):
				if iTechType == gc.getInfoTypeForString('TECH_IRON_WORKING'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_BALSERAPHS'):
				if iTechType == gc.getInfoTypeForString('TECH_IRON_WORKING'):
					pPlayer.startConquestMode()
					
			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_BANNOR'):											
				if iTechType == gc.getInfoTypeForString('TECH_FANATICISM'):			
					pPlayer.startConquestMode()

			if pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_ALEXIS'):
				if iTechType == gc.getInfoTypeForString('TECH_BRONZE_WORKING'):
					pPlayer.startConquestMode()
			elif pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_CALABIM'):											 
				if iTechType == gc.getInfoTypeForString('TECH_FEUDALISM'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_CLAN_OF_EMBERS'):											 
				if iTechType == gc.getInfoTypeForString('TECH_MASONRY'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_DOVIELLO'):											 
				if iTechType == gc.getInfoTypeForString('TECH_FESTIVALS'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_ELOHIM'):
				if iTechType == gc.getInfoTypeForString('TECH_PRIESTHOOD'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_GRIGORI'):
				if iTechType == gc.getInfoTypeForString('TECH_MEDICINE'):
					pPlayer.startConquestMode()
					
			if pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_TASUNKE'):
				if iTechType == gc.getInfoTypeForString('TECH_HORSEBACK_RIDING'):
					pPlayer.startConquestMode()
					
			elif pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_RHOANNA'):
				if iTechType == gc.getInfoTypeForString('TECH_STIRRUPS'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_HIPPUS'):
				if iTechType == gc.getInfoTypeForString('TECH_STIRRUPS'):
					pPlayer.startConquestMode()
					
			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_ILLIANS'):
				if iTechType == gc.getInfoTypeForString('TECH_IRON_WORKING'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_INFERNAL'):
				if iTechType == gc.getInfoTypeForString('TECH_IRON_WORKING'):
					pPlayer.startConquestMode()
					
			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_KHAZAD'):
				if iTechType == gc.getInfoTypeForString('TECH_IRON_WORKING'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_KURIOTATES'):
				if iTechType == gc.getInfoTypeForString('TECH_STIRRUPS'):
					pPlayer.startConquestMode()
					
					
			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_LANUN'):
				if iTechType == gc.getInfoTypeForString('TECH_IRON_WORKING'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_LJOSALFAR'):											 
				if iTechType == gc.getInfoTypeForString('TECH_SORCERY'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_LUCHUIRP'):											 
				if iTechType == gc.getInfoTypeForString('TECH_SORCERY'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_MALAKIM'):
				if iTechType == gc.getInfoTypeForString('TECH_PRIESTHOOD'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_MERCURIANS'):
				if iTechType == gc.getInfoTypeForString('TECH_IRON_WORKING'):
					pPlayer.startConquestMode()
					
			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_SHEAIM'):
				if iTechType == gc.getInfoTypeForString('TECH_BRONZE_WORKING'):
					pPlayer.startConquestMode()

			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_SIDAR'):
				if iTechType == gc.getInfoTypeForString('TECH_POISONS'):
					pPlayer.startConquestMode()
					
			if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_SVARTALFAR'):											 
				if iTechType == gc.getInfoTypeForString('TECH_SORCERY'):
					pPlayer.startConquestMode()			

			#This creates a flame on a tile (x,y) when the player discovers a certain technology IF the tile is forested.	
			if iTechType == gc.getInfoTypeForString('TECH_[COLOR="Red"]MASONRY[/COLOR]'):
				pPlot = CyMap().plot([COLOR="Red"]10,10[/COLOR])
				if (pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_FOREST') or pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_JUNGLE')):
					pPlot.setFeatureType(gc.getInfoTypeForString('FEATURE_FLAMES'), 0)
				pPlot = CyMap().plot([COLOR="Red"]15,10[/COLOR])				
				if (pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_FOREST') or pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_JUNGLE')):
					pPlot.setFeatureType(gc.getInfoTypeForString('FEATURE_FLAMES'), 0)
				pPlot = CyMap().plot([COLOR="Red"]20,10[/COLOR])
				if (pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_FOREST') or pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_JUNGLE')):
					pPlot.setFeatureType(gc.getInfoTypeForString('FEATURE_FLAMES'), 0)
				pPlot = CyMap().plot([COLOR="Red"]25,10[/COLOR])
				if (pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_FOREST') or pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_JUNGLE')):
					pPlot.setFeatureType(gc.getInfoTypeForString('FEATURE_FLAMES'), 0)
								
			iReligion = -1
			if iTechType == gc.getInfoTypeForString('TECH_CORRUPTION_OF_SPIRIT'):
				iUnit = gc.getInfoTypeForString('UNIT_DISCIPLE_THE_ASHEN_VEIL')
				iReligion = gc.getInfoTypeForString('RELIGION_THE_ASHEN_VEIL')
			if iTechType == gc.getInfoTypeForString('TECH_ORDERS_FROM_HEAVEN'):
				iUnit = gc.getInfoTypeForString('UNIT_DISCIPLE_THE_ORDER')
				iReligion = gc.getInfoTypeForString('RELIGION_THE_ORDER')
			if iTechType == gc.getInfoTypeForString('TECH_WAY_OF_THE_FORESTS'):
				iUnit = gc.getInfoTypeForString('UNIT_DISCIPLE_FELLOWSHIP_OF_LEAVES')
				iReligion = gc.getInfoTypeForString('RELIGION_FELLOWSHIP_OF_LEAVES')
			if iTechType == gc.getInfoTypeForString('TECH_WAY_OF_THE_EARTHMOTHER'):
				iUnit = gc.getInfoTypeForString('UNIT_DISCIPLE_RUNES_OF_KILMORPH')
				iReligion = gc.getInfoTypeForString('RELIGION_RUNES_OF_KILMORPH')
			if iTechType == gc.getInfoTypeForString('TECH_MESSAGE_FROM_THE_DEEP'):
				iUnit = gc.getInfoTypeForString('UNIT_DISCIPLE_OCTOPUS_OVERLORDS')
				iReligion = gc.getInfoTypeForString('RELIGION_OCTOPUS_OVERLORDS')
			if iTechType == gc.getInfoTypeForString('TECH_HONOR'):
				iUnit = gc.getInfoTypeForString('UNIT_DISCIPLE_EMPYREAN')
				iReligion = gc.getInfoTypeForString('RELIGION_THE_EMPYREAN')
			if iTechType == gc.getInfoTypeForString('TECH_DECEPTION'):
				iUnit = gc.getInfoTypeForString('UNIT_NIGHTWATCH')
				iReligion = gc.getInfoTypeForString('RELIGION_COUNCIL_OF_ESUS')
			if iReligion != -1:
				if (iReligion==pPlayer.getFavoriteReligion()):
					pPlayer.getCapitalCity().setHasReligion(iReligion,True,True,True)			
				if CyGame().isReligionFounded(iReligion):
					cf.giftUnit(iUnit, pPlayer.getCivilizationType(), 0, -1, -1)

Again, all you need to do to use this is copy and paste the 4+ lines and change tech and (x,y) coordinates (red text). This has 4 flames set, you can reduce or increase this number by deleting or copying more lines of my text (each flame requires the 3 lines of text from "pPlot = CyMap()..." to pPlot.setFeatureType...".
 
This code adds flames on selected tiles on a particular turn IF the tile is a forest or jungle. Again, a massive thanks to Snarko who helped a lot with getting the code right. The code needs to be added to the file CvEventManager.py. The red text is what you change to suit your needs. This has 4 flames appear, this can be decreased or increased by deleting or adding more of the 3 lines of text from "pPlot = CyMap()..." to pPlot.setFeatureType...".

Code:
	def onBeginGameTurn(self, argsList):
		'Called at the beginning of the end of each turn'
		iGameTurn = argsList[0]

		iOrthusTurn = 75
		if not CyGame().isUnitClassMaxedOut(gc.getInfoTypeForString('UNITCLASS_ORTHUS'), 0):
			if not CyGame().isOption(gc.getInfoTypeForString('GAMEOPTION_NO_ORTHUS')):
				bOrthus = False
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_QUICK'):
					if iGameTurn >= iOrthusTurn / 3 * 2:
						bOrthus = True
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_NORMAL'):
					if iGameTurn >= iOrthusTurn:
						bOrthus = True
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_EPIC'):
					if iGameTurn >= iOrthusTurn * 3 / 2:
						bOrthus = True
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_MARATHON'):
					if iGameTurn >= iOrthusTurn * 3:
						bOrthus = True
				if bOrthus:
					iUnit = gc.getInfoTypeForString('UNIT_ORTHUS')
					cf.addUnit(iUnit)
					cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_ORTHUS_CREATION",()), str(gc.getUnitInfo(iUnit).getImage()))

		
		#Flames will appear on the game turn iFlameAppearTurn if it is a normal speed game, otherwise the turn is modified by the game speed#
		#This creates a flame on the four tiles at the specified turn IF the tile is forested or has a jungle.#	
		iFlameAppearTurn = [COLOR="Red"]10[/COLOR]
                if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_QUICK'):
                        iFlameAppearTurn = iFlameAppearTurn / 3 * 2      
                #elif CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_NORMAL'): 'We don't need this check, as normal speed is the default'
                elif CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_EPIC'):
                        iFlameAppearTurn = iFlameAppearTurn * 3 / 2                                              
                elif CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_MARATHON'):
                        iFlameAppearTurn = iFlameAppearTurn * 3

		if iGameTurn == iFlameAppearTurn:
                        pPlot = CyMap().plot([COLOR="Red"]10,15[/COLOR])
                        if (pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_FOREST') or pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_JUNGLE')):
                                pPlot.setFeatureType(gc.getInfoTypeForString('FEATURE_FLAMES'), 0)
                        pPlot = CyMap().plot([COLOR="Red"]15,15[/COLOR])                            
                        if (pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_FOREST') or pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_JUNGLE')):
                                pPlot.setFeatureType(gc.getInfoTypeForString('FEATURE_FLAMES'), 0)
                        pPlot = CyMap().plot([COLOR="Red"]20,15[/COLOR])
                        if (pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_FOREST') or pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_JUNGLE')):
                                pPlot.setFeatureType(gc.getInfoTypeForString('FEATURE_FLAMES'), 0)
                        pPlot = CyMap().plot([COLOR="Red"]25,15[/COLOR])
                        if (pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_FOREST') or pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_JUNGLE')):
                                pPlot.setFeatureType(gc.getInfoTypeForString('FEATURE_FLAMES'), 0)                                                     
		#END OF FLAMES CODE#
 
Again, a massive thanks to Snarko for help with this code. This code is added to CvEventManager.py and when any unit of any nationality is in the trigger tile, the designated tiles will set on fire IF they have forest or jungle.

Code:
	def onBeginGameTurn(self, argsList):
		'Called at the beginning of the end of each turn'
		iGameTurn = argsList[0]

		iOrthusTurn = 75
		if not CyGame().isUnitClassMaxedOut(gc.getInfoTypeForString('UNITCLASS_ORTHUS'), 0):
			if not CyGame().isOption(gc.getInfoTypeForString('GAMEOPTION_NO_ORTHUS')):
				bOrthus = False
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_QUICK'):
					if iGameTurn >= iOrthusTurn / 3 * 2:
						bOrthus = True
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_NORMAL'):
					if iGameTurn >= iOrthusTurn:
						bOrthus = True
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_EPIC'):
					if iGameTurn >= iOrthusTurn * 3 / 2:
						bOrthus = True
				if CyGame().getGameSpeedType() == gc.getInfoTypeForString('GAMESPEED_MARATHON'):
					if iGameTurn >= iOrthusTurn * 3:
						bOrthus = True
				if bOrthus:
					iUnit = gc.getInfoTypeForString('UNIT_ORTHUS')
					cf.addUnit(iUnit)
					cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_ORTHUS_CREATION",()), str(gc.getUnitInfo(iUnit).getImage()))



		#This creates flames in particular square/s if at least one unit is in the trigger tile square#
		#It will keep triggering every time a unit is in the tile#
                #The line below sets the trigger tile#
		pPlot = CyMap().plot([COLOR="Red"]10,5[/COLOR])
		if (pPlot.getNumUnits() > 0):
				#First flame#
				pPlot = CyMap().plot([COLOR="Red"]8,5[/COLOR])
				if (pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_FOREST') or pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_JUNGLE')):
						pPlot.setFeatureType(gc.getInfoTypeForString('FEATURE_FLAMES'), 0)	
				#Second flame#
				pPlot = CyMap().plot([COLOR="Red"]9,5[/COLOR])
				if (pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_FOREST') or pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_JUNGLE')):
						pPlot.setFeatureType(gc.getInfoTypeForString('FEATURE_FLAMES'), 0)	
				#Third flame#
				pPlot = CyMap().plot([COLOR="Red"]11,5[/COLOR])
				if (pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_FOREST') or pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_JUNGLE')):
						pPlot.setFeatureType(gc.getInfoTypeForString('FEATURE_FLAMES'), 0)	
				#Fourth flame#
				pPlot = CyMap().plot([COLOR="Red"]12,5[/COLOR])
				if (pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_FOREST') or pPlot.getFeatureType() == gc.getInfoTypeForString('FEATURE_JUNGLE')):
						pPlot.setFeatureType(gc.getInfoTypeForString('FEATURE_FLAMES'), 0)
 
Thanks to anw and jheral on #erebus for the help with this and the trigger tile version of this (and being VERY patient with my debugging). This code is added to CvEventManager.py and it causes any (non-flying, non-water walking) unit on the square to be destroyed. A tile of death!

Code:
		pPlot = CyMap().plot([COLOR="Red"]13,13[/COLOR])
		for i in range(pPlot.getNumUnits()):
				pUnit = pPlot.getUnit(i)
				if not pUnit.isHasPromotion(gc.getInfoTypeForString('PROMOTION_WATER_WALKING')):
						if not pUnit.isHasPromotion(gc.getInfoTypeForString('PROMOTION_FLYING')):
								pUnit.kill(False, PlayerTypes.NO_PLAYER)
 
Top Bottom