Graceheart the Leopard
Resident Amur leopard
- Joined
- Sep 24, 2007
- Messages
- 3,476
def getReligionInquisitor(iPlayer, iReligion):
# Limited Religions
# Returns the Inquisitor Name for the specified Religion
pPlayer = gc.getPlayer(iPlayer)
pCivilization = gc.getCivilizationInfo(pPlayer.getCivilizationType())
PrereqBuildingName = getReligionHolyOffice(iPlayer, iReligion)
[B][COLOR="Red"] print "Checking getReligionInquisitor() method for player " + str(iPlayer)[/COLOR][/B]
for iUnitClass in range(gc.getNumUnitClassInfos()):
if gc.getUnitClassInfo(iUnitClass).getMaxPlayerInstances() > 0:
iUnit = pCivilization.getCivilizationUnits(iUnitClass)
[B][COLOR="Red"] print "UnitClass: " + str(iUnitClass) + ", UnitType: " + str(iUnit)[/COLOR][/B]
if gc.getUnitInfo(iUnit).getPrereqReligion() != -1:
inqPrereqRel = gc.getUnitInfo(iUnit).getPrereqReligion()
if inqPrereqRel == iReligion:
# Look for state Religion Holy Office
if gc.getUnitInfo(iUnit).getPrereqBuilding() != -1:
iPrereqBld = gc.getUnitInfo(iUnit).getPrereqBuilding()
if iPrereqBld == gc.getInfoTypeForString(PrereqBuildingName):
MyInquisitorName = gc.getUnitInfo(iUnit).getType()
#CyInterface().addImmediateMessage(str(MyInquisitorName), "")
return MyInquisitorName
break
My initial thought was that the unit causing the exception belonged to the Barbarians or some other minor player, and was created via World Builder. Is this the case?I agree that this is almost certainly caused by the civilization XML, but you should put a check for it in the Python since the setup in the XML that causes this is valid. Most likely, some civ has the unit type set to NONE for some unit class (any unit class since it loops over them all)) to prevent it from building a unit of that class. If this is ever called for the barbarians, then it could be them.
Yeah, this is exactly what we're gonna do, and this is why Farsight needs to run my debug code and post the Python Debug Log.You must check the value of iUnit that is returned by pCivilization.getCivilizationUnits(iUnitClass) to make sure that it is not -1, which is what you get for NONE. If it is -1, then gc.getUnitInfo(iUnit) will not return a valid unit info, instead it will return a "none type object", which not being a valid unit info will not have the getPrereqReligion() method (as per the error message) and therefore it will fail at that point.
There is not necessarily an actual unit of the class in existence. It isn't checking for an actual unit anywhere, just what kind of unit can be built by the civ for which this is being run.My initial thought was that the unit causing the exception belonged to the Barbarians or some other minor player, and was created via World Builder. Is this the case?
File "CvScreensInterface", line 705, in forceScreenRedraw
File "CvMainInterface", line 720, in redraw
File "CvMainInterface", line 1524, in updateSelectionButtons
File "OIM", line 854, in showInquisitionButton
File "OIM", line 180, in getReligionInquisitor
AttributeError: 'NoneType' object has no attribute 'getPrereqReligion'
ERR: Python function forceScreenRedraw failed, module CvScreensInterface
Checking getReligionInquisitor() method for player 0
UnitClass: 9, UnitType: 12
UnitClass: 10, UnitType: 13
UnitClass: 11, UnitType: 14
UnitClass: 12, UnitType: 15
UnitClass: 13, UnitType: 16
UnitClass: 14, UnitType: 17
UnitClass: 15, UnitType: 18
UnitClass: 16, UnitType: 19
UnitClass: 17, UnitType: 20
UnitClass: 18, UnitType: 21
UnitClass: 19, UnitType: 22
UnitClass: 20, UnitType: 23
UnitClass: 21, UnitType: 24
UnitClass: 22, UnitType: 25
UnitClass: 23, UnitType: 27
UnitClass: 24, UnitType: 26
UnitClass: 25, UnitType: 28
UnitClass: 116, UnitType: 125
UnitClass: 118, UnitType: 126
UnitClass: 137, UnitType: -1
PY:OnUnInit
UnInit Python
SCREEN OFF
PY:Cuzco has grown
Checking getReligionInquisitor() method for player 2
UnitClass: Wonka Executive, UnitType: 12
UnitClass: CHANGED_TXT_KEY_UNIT_EXECUTIVE_2, UnitType: 13
UnitClass: Dinoco Executive, UnitType: 14
UnitClass: A.C.M.E. Executive, UnitType: 15
UnitClass: Cyberdyne Executive, UnitType: 16
UnitClass: Black Mesa Executive, UnitType: 17
UnitClass: Mooby Executive, UnitType: 18
UnitClass: Jewish Missionary, UnitType: 19
UnitClass: Christian Missionary, UnitType: 20
UnitClass: Islamic Missionary, UnitType: 21
UnitClass: Hindu Missionary, UnitType: 22
UnitClass: Buddhist Missionary, UnitType: 23
UnitClass: Confucian Missionary, UnitType: 24
UnitClass: Taoist Missionary, UnitType: 25
UnitClass: Martian Missionary, UnitType: 27
UnitClass: Yuggoth Missionary, UnitType: 26
UnitClass: Wizarding Missionary, UnitType: 28
UnitClass: Dreadnought, UnitType: 125
UnitClass: Assault Mech, UnitType: 126
UnitClass: TXT_KEY_SPECIALIST_SUPERHERO, UnitType: -1
Checking getReligionInquisitor() method for player 2
UnitClass: Wonka Executive, UnitType: 12
UnitClass: CHANGED_TXT_KEY_UNIT_EXECUTIVE_2, UnitType: 13
UnitClass: Dinoco Executive, UnitType: 14
UnitClass: A.C.M.E. Executive, UnitType: 15
UnitClass: Cyberdyne Executive, UnitType: 16
UnitClass: Black Mesa Executive, UnitType: 17
UnitClass: Mooby Executive, UnitType: 18
UnitClass: Jewish Missionary, UnitType: 19
UnitClass: Christian Missionary, UnitType: 20
UnitClass: Islamic Missionary, UnitType: 21
UnitClass: Hindu Missionary, UnitType: 22
UnitClass: Buddhist Missionary, UnitType: 23
UnitClass: Confucian Missionary, UnitType: 24
UnitClass: Taoist Missionary, UnitType: 25
UnitClass: Martian Missionary, UnitType: 27
UnitClass: Yuggoth Missionary, UnitType: 26
UnitClass: Wizarding Missionary, UnitType: 28
UnitClass: Dreadnought, UnitType: 125
UnitClass: Assault Mech, UnitType: 126
UnitClass: TXT_KEY_SPECIALIST_SUPERHERO, UnitType: -1
Checking getReligionInquisitor() method for player 3
UnitClass: Wonka Executive, UnitType: 12
UnitClass: CHANGED_TXT_KEY_UNIT_EXECUTIVE_2, UnitType: 13
UnitClass: Dinoco Executive, UnitType: 14
UnitClass: A.C.M.E. Executive, UnitType: 15
UnitClass: Cyberdyne Executive, UnitType: 16
UnitClass: Black Mesa Executive, UnitType: 17
UnitClass: Mooby Executive, UnitType: 18
UnitClass: Jewish Missionary, UnitType: 19
UnitClass: Christian Missionary, UnitType: 20
UnitClass: Islamic Missionary, UnitType: 21
UnitClass: Hindu Missionary, UnitType: 22
UnitClass: Buddhist Missionary, UnitType: 23
UnitClass: Confucian Missionary, UnitType: 24
UnitClass: Taoist Missionary, UnitType: 25
UnitClass: Martian Missionary, UnitType: 27
UnitClass: Yuggoth Missionary, UnitType: 26
UnitClass: Wizarding Missionary, UnitType: 28
UnitClass: Dreadnought, UnitType: 125
UnitClass: Assault Mech, UnitType: 126
UnitClass: TXT_KEY_SPECIALIST_SUPERHERO, UnitType: -1
Checking getReligionInquisitor() method for player 3
UnitClass: Wonka Executive, UnitType: 12
UnitClass: CHANGED_TXT_KEY_UNIT_EXECUTIVE_2, UnitType: 13
UnitClass: Dinoco Executive, UnitType: 14
UnitClass: A.C.M.E. Executive, UnitType: 15
UnitClass: Cyberdyne Executive, UnitType: 16
UnitClass: Black Mesa Executive, UnitType: 17
UnitClass: Mooby Executive, UnitType: 18
UnitClass: Jewish Missionary, UnitType: 19
UnitClass: Christian Missionary, UnitType: 20
UnitClass: Islamic Missionary, UnitType: 21
UnitClass: Hindu Missionary, UnitType: 22
UnitClass: Buddhist Missionary, UnitType: 23
UnitClass: Confucian Missionary, UnitType: 24
UnitClass: Taoist Missionary, UnitType: 25
UnitClass: Martian Missionary, UnitType: 27
UnitClass: Yuggoth Missionary, UnitType: 26
UnitClass: Wizarding Missionary, UnitType: 28
UnitClass: Dreadnought, UnitType: 125
UnitClass: Assault Mech, UnitType: 126
UnitClass: TXT_KEY_SPECIALIST_SUPERHERO, UnitType: -1
PY:OnPreSave
So you have a custom unit class without even a proper description. And I'm guessing that no player is able to build any unit belonging to this class, hence the -1 (None) UnitType value.UnitClass: TXT_KEY_SPECIALIST_SUPERHERO, UnitType: -1
UnitClass: TXT_KEY_SPECIALIST_GOLEM, UnitType: 167
UnitClass: TXT_KEY_SPECIALIST_KNIGHT_TEMPLAR, UnitType: 168
UnitClass: TXT_KEY_SPECIALIST_DJINN, UnitType: 169
UnitClass: TXT_KEY_SPECIALIST_VIMANA, UnitType: 170
UnitClass: TXT_KEY_SPECIALIST_SHAOLIN_MONK, UnitType: -1
def getReligionInquisitor(iPlayer, iReligion):
# Limited Religions
# Returns the Inquisitor Name for the specified Religion
pPlayer = gc.getPlayer(iPlayer)
pCivilization = gc.getCivilizationInfo(pPlayer.getCivilizationType())
PrereqBuildingName = getReligionHolyOffice(iPlayer, iReligion)
for iUnitClass in range(gc.getNumUnitClassInfos()):
if gc.getUnitClassInfo(iUnitClass).getMaxPlayerInstances() > 0:
iUnit = pCivilization.getCivilizationUnits(iUnitClass)
[COLOR="Red"] if iUnit == -1: continue[/COLOR]
if gc.getUnitInfo(iUnit).getPrereqReligion() != -1:
inqPrereqRel = gc.getUnitInfo(iUnit).getPrereqReligion()
if inqPrereqRel == iReligion:
# Look for state Religion Holy Office
if gc.getUnitInfo(iUnit).getPrereqBuilding() != -1:
iPrereqBld = gc.getUnitInfo(iUnit).getPrereqBuilding()
if iPrereqBld == gc.getInfoTypeForString(PrereqBuildingName):
MyInquisitorName = gc.getUnitInfo(iUnit).getType()
#CyInterface().addImmediateMessage(str(MyInquisitorName), "")
return MyInquisitorName
break