HI. Sorry if I bother you with my requests for help.
I wanted to try to adapt the limited religion component mod for bug , but I don't think I could do it on my own. So this is the text I prepared, I hope it goes well. also attach the original mod. I have already prepared the init and the mod file in the config folder.
## Sid Meier's Civilization 4
## Copyright Firaxis Games 2005
##
## Implementaion of miscellaneous game functions
from CvPythonExtensions import *
import CvEventInterface
import CvGameUtils
import Popup as PyPopup
import PyHelpers
import LimitedReligions
# for C++ compatibility
false=False
true=True
# globals
gc = CyGlobalContext()
PyPlayer = PyHelpers.PyPlayer
PyInfo = PyHelpers.PyInfo
PyCity = PyHelpers.PyCity
PyGame = PyHelpers.PyGame
import BugEventManager
import BugPath
class CvGameUtils:
"Miscellaneous game functions"
def __init__(self):
pass
def init():
em = BugEventManager.g_eventManager
em.addEventHandler('BeginGameTurn', onBeginGameTurn)
em.addEventHandler('TechAcquired', onTechAcquired)
def onBeginPlayerTurn(argsList):
'Called at the beginning of a players turn'
iGameTurn, iPlayer = argsList
# Limited Religions
if LimitedReligions.NonStateHolyCityReligionSpreadCheck(iPlayer):
LimitedReligions.doNonStateHolyCityReligionSpread(iPlayer)
# Limited Religions
def onTechAcquired(argsList):
'Tech Acquired'
iTechType, iTeam, iPlayer, bAnnounce = argsList
# Note that iPlayer may be NULL (-1) and not a refer to a player object
# Limited Religions
game = CyGame()
pPlayer = gc.getPlayer(iPlayer)
FoundRel = False
if iPlayer > -1:
# Is this a religious Tech?
if LimitedReligions.isReligiousTech(iTechType):
# Is the game option selected for Limited Religions?
if LimitedReligions.isOC_LIMITED_RELIGIONS():
# Skip dead players and Barbarions
if pPlayer.isAlive() and not pPlayer.isBarbarian():
# Must not already have a Holy City
if not LimitedReligions.OwnsHolyCity(iPlayer):
# Loop through all religions
for iSlot in range(gc.getNumReligionInfos()):
# Does the player have the prerequisite tech for this religion slot?
if gc.getTeam(pPlayer.getTeam()).isHasTech(gc.getReligionInfo(iSlot).getTechPrereq()):
# Must be at least one religion slot available
if not game.isReligionSlotTaken(iSlot):
# The number of religious techs discovered must be greater than total religions founded.
if LimitedReligions.RelTechsGreaterThanReligions:
# PreConditions are met to found a religion.
# If the active player is Human
if iPlayer == gc.getGame().getActivePlayer() and pPlayer.isHuman:
# Choose religions option on?
if game.isOption(GameOptionTypes.GAMEOPTION_PICK_RELIGION):
# If Autoplay is running, Let the game pick the religion.
if( game.getAIAutoPlay() > 0 ):
FoundRel = True
break
else:
#Display the popup to pick a religion
#CyInterface().addImmediateMessage("Pick Religion", "")
popupInfo = CyPopupInfo()
popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_FOUND_RELIGION)
popupInfo.setData1(iSlot)
popupInfo.addPopup(iPlayer)
break
else:
# Not Playing Choose Religions, So let the game pick the religion.
#CyInterface().addImmediateMessage("C", "")
FoundRel = True
break
else:
# Not Human, So let the game pick the religion.
#CyInterface().addImmediateMessage("Found a Religion", "")
FoundRel = True
break
if FoundRel:
if game.isOption(GameOptionTypes.GAMEOPTION_PICK_RELIGION):
# Get Civ's Favorite religion or random pick if favorite religion is not available.
iNewReligion = LimitedReligions.AI_chooseReligion(iPlayer)
if iNewReligion != -1:
# Found the religion.
#CyInterface().addImmediateMessage("Found Favorite Religion", "")
pPlayer.foundReligion(iNewReligion, iSlot, True)
else:
for i in range(gc.getNumReligionInfos()):
if gc.getReligionInfo(i).getTechPrereq() == iTechType:
if not gc.getGame().isReligionFounded(i):
# Found the religion.
#CyInterface().addImmediateMessage("Found Prerequisit Religion", "")
pPlayer.foundReligion(i,i,True)
# End Limited Religions Mod
def cannotTrain(argsList):
# Limited Religions
# Restricts the Missionary production to only state religion missionaries.
# Requires the Cannot Train call back to be enabled in the PythonCallbackDefines.xml file
pCity = argsList[0]
eUnit = argsList[1]
bContinue = argsList[2]
bTestVisible = argsList[3]
bIgnoreCost = argsList[4]
bIgnoreUpgrades = argsList[5]
iOwner = pCity.getOwner()
pPlayer = gc.getPlayer(iOwner)
iStateReligion = pPlayer.getStateReligion()
# If the Player has a state religion
if iStateReligion != -1:
# If option is selected for restricting missionary production
if LimitedReligions.isOC_TRAIN_ONLY_STATE_RELIGION_MISSIONARY:
# Does the Player have a non-State Religion
for iReligionLoop in range(gc.getNumReligionInfos()):
# Make sure only non-state religions are selected
if iReligionLoop != iStateReligion:
# Get the Missionary for the non State Religion
MyNonStateRelMissionary = str(LimitedReligions.getReligionMissionary(iOwner, iReligionLoop))
# If this is a non state religion Missionary
if eUnit == gc.getInfoTypeForString(MyNonStateRelMissionary):
# Deny the ability to train the non state religion Missionary
return True
break
return False
# End Limited Religions
def doHolyCity(self):
# Limited Religions
# Purpose: Determine if Religion should be allowed to be founded
# Returns True if religion should not be founded
# Returns False if religion should be founded (Default)
if LimitedReligions.isOC_LIMITED_RELIGIONS():
#CyInterface().addImmediateMessage("doHolyCity", "")
# religion should not be founded
return True
# religion should be founded
return False
def doHolyCityTech(argsList):
eTeam = argsList[0]
ePlayer = argsList[1]
eTech = argsList[2]
bFirst = argsList[3]
# Limited Religions
# Purpose: Determine if Religion Popup should be dispalyed
# Returns True if Religion Popup should not be dispalyed
# Returning False if Religion Popup should be dispalyed (Default)
if LimitedReligions.isOC_LIMITED_RELIGIONS():
# Stop Religion Popup from being dispalyed
#CyInterface().addImmediateMessage("doHolyCityTech", "")
return True
# Allow the Religion popup to be displayed
return False
def isOC_LIMITED_RELIGIONS():
# Limited Religions
return gc.getDefineINT("OC_LIMITED_RELIGIONS") != 0
def isOC_TRAIN_ONLY_STATE_RELIGION_MISSIONARY():
# Limited Religions
return gc.getDefineINT("OC_TRAIN_ONLY_STATE_RELIGION_MISSIONARY") != 0
def OwnsHolyCity(iPlayer):
# Limited Religions
#Checks to see if player has a Holy City (Any Holy City)
#Returns True if player has a Holy City
#Returns False if player does not have a Holy City
#pPlayer = gc.getPlayer(iPlayer)
iRefCityList = PyPlayer(iPlayer).getCityList()
pHolyCity = False
for pyCity in iRefCityList:
pCity = pyCity.GetCy()
#iCity = pCity.getID()
for iRel in range(gc.getNumReligionInfos()):
if pCity.isHasReligion(iRel):
if pCity.isHolyCityByType(iRel):
#CyInterface().addMessage(CyGame().getActivePlayer(),True,25,'Holy City Found!','AS2D_DISCOVERBONUS',1,'Art/Interface/Buttons/TerrainFeatures/Forest.dds',ColorTypes(8),0,0,False,False)
pHolyCity = True
break
return pHolyCity
def OwnsStateRelHolyCity(iPlayer):
# Limited Religions
#Checks to see if player has the Holy City for the State Religion
#Returns True if player has the State Religion Holy City
#Returns False if player does not have the State Religion Holy City
iRefCityList = PyPlayer(iPlayer).getCityList()
pPlayer = gc.getPlayer(iPlayer)
iStateReligion = pPlayer.getStateReligion()
pHolyCity = False
if iStateReligion != -1:
for pyCity in iRefCityList:
pCity = pyCity.GetCy()
#iCity = pCity.getID()
for iRel in range(gc.getNumReligionInfos()):
if pCity.isHasReligion(iRel):
if iRel == iStateReligion:
if pCity.isHolyCityByType(iRel):
#CyInterface().addMessage(CyGame().getActivePlayer(),True,25,'Holy City Found!','AS2D_DISCOVERBONUS',1,'Art/Interface/Buttons/TerrainFeatures/Forest.dds',ColorTypes(8),0,0,False,False)
pHolyCity = True
break
return pHolyCity
def OwnsNonStateRelHolyCity(iPlayer):
# Limited Religions
#Checks to see if player has a Non-State Religion Holy City
#Returns True if player has a Non-State Religion Holy City
#Returns False if player does not have a Non-State Religion Holy City
iRefCityList = PyPlayer(iPlayer).getCityList()
pPlayer = gc.getPlayer(iPlayer)
iStateReligion = pPlayer.getStateReligion()
pHolyCity = False
if iStateReligion != -1:
for pyCity in iRefCityList:
pCity = pyCity.GetCy()
#iCity = pCity.getID()
for iRel in range(gc.getNumReligionInfos()):
if pCity.isHasReligion(iRel):
if iRel != iStateReligion:
if pCity.isHolyCityByType(iRel):
#CyInterface().addMessage(CyGame().getActivePlayer(),True,25,'Holy City Found!','AS2D_DISCOVERBONUS',1,'Art/Interface/Buttons/TerrainFeatures/Forest.dds',ColorTypes(8),0,0,False,False)
pHolyCity = True
break
return pHolyCity
def onTechPreviouslyFounded(MyiTechType):
# Limited Religions
# Purpose: Check to see if tech has been previously discovered
# Returns True if tech has been previously discovered
# Returns False if tech has not been previously discovered
pdTech = False
for ePlayer in range(gc.getMAX_CIV_PLAYERS()):
PzPlayer = gc.getPlayer(ePlayer)
if PzPlayer.isAlive():
#if ePlayer != gc.getPlayer(CyGame().getActivePlayer()).getID():
if gc.getTeam(PzPlayer.getTeam()).isHasTech(MyiTechType):
# Tech has been previously discovered
pdTech = True
break
if not pdTech:
#CyInterface().addMessage(CyGame().getActivePlayer(),True,25,'Tech was not previously discovered!','AS2D_DISCOVERBONUS',1,'Art/Interface/Buttons/TerrainFeatures/Forest.dds',ColorTypes(8),0,0,False,False)
return False
else:
#CyInterface().addMessage(CyGame().getActivePlayer(),True,25,'Tech was previously discovered!','AS2D_DISCOVERBONUS',1,'Art/Interface/Buttons/TerrainFeatures/Forest.dds',ColorTypes(8),0,0,False,False)
return True
def isReligiousTech(iTechType):
# Limited Religions
# Returns True if the Tech is a Religious Tech
# Returns False if the Tech is not a Religious Tech
ReligiousTech = False
for iREL in range(gc.getNumReligionInfos()):
if gc.getReligionInfo(iREL).getTechPrereq() == iTechType:
ReligiousTech = True
break
return ReligiousTech
def RelTechsGreaterThanReligions():
# Limited Religions
TCount = False
if getTotalReligiousTechsFounded > getTotalReligionsFounded:
TCount = True
return TCount
def getTotalReligionsFounded():
# Limited Religions
# Returns the total number of Religions founded.
iReligionCount = 0
for ixReligion in range(gc.getNumReligionInfos()):
#If the religion has not been founded
if gc.getGame().isReligionFounded(ixReligion):
iReligionCount = iReligionCount + 1
#CyInterface().addMessage(CyGame().getActivePlayer(),True,25,'Total Religious founded' [iReligionCount],'AS2D_DISCOVERBONUS',1,'Art/Interface/Buttons/TerrainFeatures/Forest.dds',ColorTypes(8),0,0,False,False)
return iReligionCount
def getTotalReligiousTechsFounded():
# Limited Religions
# Returns the total number of Religious Techs founded.
iRelTechCount = 0
for iTech in range(gc.getNumTechInfos()):
if isReligiousTech(iTech):
if onTechPreviouslyFounded(iTech):
iRelTechCount = iRelTechCount + 1
#CyInterface().addMessage(CyGame().getActivePlayer(),True,25,'Total Religious Techs founded' [iRelTechCount],'AS2D_DISCOVERBONUS',1,'Art/Interface/Buttons/TerrainFeatures/Forest.dds',ColorTypes(8),0,0,False,False)
return iRelTechCount
def ReligionDiscoveryConditions(iPlayer):
# Limited Religions
# Returns True if Civ can found a religion.
# Returns false if Civ can't found a religion.
Condition = False
pPlayer = gc.getPlayer(iPlayer)
iTotalTechs = getTotalReligiousTechsFounded()
iTotalReligions = getTotalReligionsFounded()
if not OwnsHolyCity(iPlayer):
#CyInterface().addMessage(CyGame().getActivePlayer(),True,25,'Message A','AS2D_DISCOVERBONUS',1,'Art/Interface/Buttons/TerrainFeatures/Forest.dds',ColorTypes(8),0,0,False,False)
if iTotalTechs > iTotalReligions:
Condition = True
#CyInterface().addMessage(CyGame().getActivePlayer(),True,25,'Message A','AS2D_DISCOVERBONUS',1,'Art/Interface/Buttons/TerrainFeatures/Forest.dds',ColorTypes(8),0,0,False,False)
return Condition
def AI_chooseReligion(iPlayer):
# Limited Religions
# Purpose:
# 1. Finds the AI's favorite religion and if available, selects it.
# 2. If favorite religion is not available, the AI makes a randum pick.
pPlayer = gc.getPlayer(iPlayer)
eFavorite = gc.getLeaderHeadInfo(pPlayer.getLeaderType()).getFavoriteReligion()
if eFavorite > -1 and not CyGame().isReligionFounded(eFavorite):
return eFavorite
aeReligions = list()
for i in range(gc.getNumReligionInfos()):
if not CyGame().isReligionFounded(i):
aeReligions.append(i)
if len(aeReligions) > 0:
return aeReligions[CyGame().getSorenRandNum(len(aeReligions), "AI pick religion")]
return -1
def getNonStateHolyCityReligion(iPlayer):
# Limited Religions
# Looks to see if the AI has a non-State Holy City Religion
iRefCityList = PyPlayer(iPlayer).getCityList()
pPlayer = gc.getPlayer(iPlayer)
iStateReligion = pPlayer.getStateReligion()
for pyCity in iRefCityList:
pCity = pyCity.GetCy()
#iCity = pCity.getID()
for iReligion in range( gc.getNumReligionInfos()):
if iReligion != iStateReligion:
if pCity.isHolyCityByType(iReligion):
NSHCReligion = iReligion
break
return NSHCReligion
def isMaxedOut(zReligion, zPlayer):
# Limited Religions
# 1. Returns True if every city has the official state religion
# 1. Returns False if at least one city does not have the official state religion
iPlayer = zPlayer.getID()
iRefCityList = PyPlayer(iPlayer).getCityList()
MaxedOut = True
for pyCity in iRefCityList:
zCity = pyCity.GetCy()
for iRel in range(gc.getNumReligionInfos()):
if iRel == zReligion:
if not zCity.isHasReligion(iRel):
MaxedOut = False
return MaxedOut
def NonStateHolyCityReligionSpreadCheck(iPlayer):
# Limited Religions
# Returns True if the conditions below are met for AI players:
# 1. AI Player does not own the state religion Holy City
# 2. AI Player has a non-state HolyCity
# 3. The non-State religion should be spread or...
# 4. The state religion should be converted to the non-state Holy City religion.
# Returns False if the conditions above are not met.
AIpPlayer = gc.getPlayer(iPlayer)
iStateReligion = AIpPlayer.getStateReligion()
# Make sure the AI player has a state religion
if iStateReligion != -1:
# If Limited Religions
if isOC_LIMITED_RELIGIONS():
# If this is an AI player
if not AIpPlayer.isNone() and not AIpPlayer.isBarbarian() and not AIpPlayer.isHuman() and AIpPlayer.isAlive():
# Make sure the AI player does not own the state religion Holy City.
if not OwnsStateRelHolyCity(iPlayer):
# Does the Player have a non-state Holy City?
if OwnsNonStateRelHolyCity(iPlayer):
return True
return False
def doNonStateHolyCityReligionSpread(iPlayer):
# Limited Religions
# Applies to AI Players Only
# Purpose: Spreads a non-State religion or converts state religion to the non-state Holy City religion.
AIpPlayer = gc.getPlayer(iPlayer)
# Is the game option selected for Limited Religions?
if isOC_LIMITED_RELIGIONS():
# If this is an AI player
if not AIpPlayer.isNone() and not AIpPlayer.isBarbarian() and not AIpPlayer.isHuman() and AIpPlayer.isAlive():
# If the AI Player meets the conditions to spread a non-state religion
if NonStateHolyCityReligionSpreadCheck(iPlayer):
# Find the Religion matching non-State Holy City Religion
NonStateHolyCityReligion = getNonStateHolyCityReligion(iPlayer)
if not isMaxedOut(NonStateHolyCityReligion, AIpPlayer):
# Spread the non-state Religion to a city
SpreadHolyCityReligion(iPlayer, NonStateHolyCityReligion)
# If every city has the non-state religion, then force the AI player to covert.
elif isMaxedOut(NonStateHolyCityReligion, AIpPlayer):
# Force Civ to covert the state Religion to the non-stae Holy City religion
AIpPlayer.convert(NonStateHolyCityReligion)
#def doPickReligionPopup(iPlayer, religionSlot):
# # Limited Religions
# pPlayer = gc.getPlayer(iPlayer)
# popupInfo = CyPopupInfo()
# popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON)
# popupInfo.setData1(iPlayer)
# popupInfo.setData2(religionSlot)
# popupInfo.setOnClickedPythonCallback("foundReligionCallback")
# popupInfo.setText(CyTranslator().getText(("TXT_KEY_FOUNDED_RELIGION"),()))
#
# for i in range(gc.getNumReligionInfos()):
# if not CyGame().isReligionFounded(i):
# popupInfo.addPythonButton(gc.getReligionInfo(i).getDescription(), gc.getReligionInfo(i).getButton())
#
# popupInfo.addPopup(iPlayer)
def ReligiousTechCheck(iPlayer, iTechType):
# Limited Religions
# Returns True if the player has the specified Religious Tech
# Returns False if the player doesn't have the specified Religious Tech
pPlayer = gc.getPlayer(iPlayer)
TechCheck = False
for iTech in range(gc.getNumTechInfos()):
# Is this a religious Tech?
if isReligiousTech(iTech):
# Does the player have this tech?
if gc.getTeam(pPlayer.getTeam()).isHasTech(iTech):
if iTech == iTechType:
TechCheck = True
break
return TechCheck
def getReligionMissionary(iPlayer, iReligion):
# Limited Religions
# Returns the Missionary Name for the specified Religion
pPlayer = gc.getPlayer(iPlayer)
pCivilization = gc.getCivilizationInfo(pPlayer.getCivilizationType())
for iUnitClass in range(gc.getNumUnitClassInfos()):
if gc.getUnitClassInfo(iUnitClass).getMaxPlayerInstances() > 0:
#if gc.getBuildingClassInfo(iUnitClass).getMaxPlayerInstances() > 0:
kUnit = gc.getUnitInfo(pCivilization.getCivilizationUnits(iUnitClass))
if kUnit.getPrereqReligion() == iReligion:
if kUnit.getReligionSpreads(iReligion):
iUnit = pCivilization.getCivilizationUnits(iUnitClass)
MyMissionaryName = gc.getUnitInfo(iUnit).getType()
#CyInterface().addImmediateMessage(str(MyMissionaryName), "")
return MyMissionaryName
break
def SpreadHolyCityReligion(iPlayer, HolyCityiReligion):
# Limited Religions
# Purpose: 1. To increase the influence a non-state Holy City until Civ converts to the religion.
# 2. Spreads Religion one City per turn
# Scope: 1. Called when a Civ does not own the Holy City for their state religion
# 2. Will not run if Civ owns the Holy City for their state religion
#iPlayer = pPlayer.getID()
iRefCityList = PyPlayer(iPlayer).getCityList()
for pyCity in iRefCityList:
pCity = pyCity.GetCy()
#iCity = pCity.getID()
for iRel in range(gc.getNumReligionInfos()):
if not pCity.isHasReligion(iRel):
if iRel == HolyCityiReligion:
# Spread Holy City Religion to the City
pCity.setHasReligion(iRel, True, 0, 0)
break
# End Limited Religions Functions