## Sid Meier's Civilization 4
## Copyright Firaxis Games 2006
##
## CvEventManager
## This class is passed an argsList from CvAppInterface.onEvent
## The argsList can contain anything from mouse location to key info
## The EVENTLIST that are being notified can be found
from CvPythonExtensions import *
import CvUtil
import CvScreensInterface
import CvDebugTools
import CvWBPopups
import PyHelpers
import Popup as PyPopup
import CvCameraControls
import CvTopCivs
import sys
import CvWorldBuilderScreen
import CvAdvisorUtils
import CvTechChooser
# Rise of Mankind start
import GodsOfOld
# import pickle
import cPickle as pickle
import CvGameUtils
import BugOptions
import BugCore
import BugUtil
import OOSLogger
RevDCMOpt = BugCore.game.RevDCM
# Rise of Mankind end
gc = CyGlobalContext()
localText = CyTranslator()
PyPlayer = PyHelpers.PyPlayer
PyInfo = PyHelpers.PyInfo
PyCity = PyHelpers.PyCity
PyGame = PyHelpers.PyGame
# globals
###################################################
class CvEventManager:
def __init__(self):
#################### ON EVENT MAP ######################
#print "EVENTMANAGER INIT"
self.bCtrl = False
self.bShift = False
self.bAlt = False
self.bAllowCheats = False
# OnEvent Enums
self.EventLButtonDown=1
self.EventLcButtonDblClick=2
self.EventRButtonDown=3
self.EventBack=4
self.EventForward=5
self.EventKeyDown=6
self.EventKeyUp=7
self.__LOG_MOVEMENT = 0
self.__LOG_BUILDING = 0
self.__LOG_COMBAT = 0
self.__LOG_CONTACT = 0
self.__LOG_IMPROVEMENT =0
self.__LOG_CITYLOST = 0
self.__LOG_CITYBUILDING = 0
self.__LOG_TECH = 0
self.__LOG_UNITBUILD = 0
self.__LOG_UNITKILLED = 1
self.__LOG_UNITLOST = 0
self.__LOG_UNITPROMOTED = 0
self.__LOG_UNITSELECTED = 0
self.__LOG_UNITPILLAGE = 0
self.__LOG_GOODYRECEIVED = 0
self.__LOG_GREATPERSON = 0
self.__LOG_RELIGION = 0
self.__LOG_RELIGIONSPREAD = 0
self.__LOG_GOLDENAGE = 0
self.__LOG_ENDGOLDENAGE = 0
self.__LOG_WARPEACE = 0
self.__LOG_PUSH_MISSION = 0
# RoM start Next War tracks cities that have been razed
self.iArcologyCityID = -1
#Net Messages
self.m_iNetMessage_Inquisitor = 0
# Rise of Mankind 2.7
# def onBuildingBuilt / Initializing of building upgrade line
self.asBuildingUpgradeLine_Upgrade_Name = [
["BUILDING_KNIGHT_STABLE"],
["BUILDING_ARCOLOGY_SHIELDING"],
["BUILDING_ADVANCED_SHIELDING","BUILDING_NATIONAL_SHIELD"],
["BUILDING_HARBOR","BUILDING_CARTHAGE_COTHON"],
["BUILDING_PORT"],
["BUILDING_COMMERCIAL_PORT"],
["BUILDING_INTERNATIONAL_PORT"],
["BUILDING_COMMERCIAL_AIRPORT"],
["BUILDING_HIGH_WALLS"],
["BUILDING_CUSTOM_HOUSE","BUILDING_PORTUGAL_FEITORIA"],
["BUILDING_DRYDOCK"],
["BUILDING_NAVAL_YARD"],
["BUILDING_STEEL_MILL"],
["BUILDING_FOOD_PROCESSING_PLANT"],
["BUILDING_ARCOLOGY"],
["BUILDING_MODERN_GRANARY"],
["BUILDING_GARRISON"],
["BUILDING_NUCLEAR_PLANT","BUILDING_HYDRO_PLANT","BUILDING_FUSION_PLANT"],
["BUILDING_AEROSPACE_COMPLEX"],
["BUILDING_COMMUNICATION_TOWER"],
["BUILDING_NETWORK_NODE"]]
self.asBuildingUpgradeLine_Obsolete_Name = [
["BUILDING_STABLE","BUILDING_MONGOL_GER"],
["BUILDING_ANTI_MISSILE_BATTERIES","BUILDING_ARCOLOGY"],
["BUILDING_ANTI_MISSILE_BATTERIES","BUILDING_ARCOLOGY","BUILDING_ARCOLOGY_SHIELDING"],
["BUILDING_RIVER_PORT"],
["BUILDING_RIVER_PORT","BUILDING_HARBOR","BUILDING_CARTHAGE_COTHON"],
["BUILDING_RIVER_PORT","BUILDING_HARBOR","BUILDING_CARTHAGE_COTHON","BUILDING_PORT"],
["BUILDING_RIVER_PORT","BUILDING_HARBOR","BUILDING_CARTHAGE_COTHON","BUILDING_PORT","BUILDING_COMMERCIAL_PORT"],
["BUILDING_AIRPORT"],
["BUILDING_WALLS","BUILDING_CELTIC_DUN"],
["BUILDING_TOLL_HOUSE"],
["BUILDING_SHIPYARD"],
["BUILDING_SHIPYARD","BUILDING_DRYDOCK"],
["BUILDING_FORGE","BUILDING_MALI_MINT","BUILDING_IRON_FORGE"],
["BUILDING_BAKERY"],
["BUILDING_ANTI_MISSILE_BATTERIES"],
["BUILDING_GRANARY","BUILDING_INCAN_TERRACE"],
["BUILDING_BARRACKS","BUILDING_ZULU_IKHANDA","BUILDING_ASSYRIA_EKAL"],
["BUILDING_COAL_PLANT","BUILDING_JAPANESE_SHALE_PLANT","BUILDING_OIL_PLANT"],
["BUILDING_MILITARY_AIRBASE"],
["BUILDING_BROADCAST_TOWER"],
["BUILDING_BROADCAST_TOWER","BUILDING_COMMUNICATION_TOWER"]]
self.aiBuildingUpgradeLine_Upgrade_InfoTypeNum = []
self.aiBuildingUpgradeLine_Obsolete_InfoTypeNum = []
# Rise of Mankind 2.7
# Rise of Mankind 2.71
self.iBUILDING_CRUSADE = 0
self.iBUILDING_DJENNE = 0
self.iBUILDING_WORLD_BANK = 0
self.iTECH_KNOWLEDGE_MANAGEMENT = 0
self.m_iNetMessage_Colonist = 410
self.m_iNetMessage_Pioneer = 411
# Rise of Mankind 2.71
# Rise of Mankind 2.8
self.iPROJECT_EDEN = 0
# Rise of Mankind 2.8
## EVENTLIST
self.EventHandlerMap = {
'mouseEvent' : self.onMouseEvent,
'kbdEvent' : self.onKbdEvent,
'ModNetMessage' : self.onModNetMessage,
'Init' : self.onInit,
'Update' : self.onUpdate,
'UnInit' : self.onUnInit,
'OnSave' : self.onSaveGame,
'OnPreSave' : self.onPreSave,
'OnLoad' : self.onLoadGame,
'GameStart' : self.onGameStart,
'GameEnd' : self.onGameEnd,
'plotRevealed' : self.onPlotRevealed,
'plotFeatureRemoved' : self.onPlotFeatureRemoved,
'plotPicked' : self.onPlotPicked,
'nukeExplosion' : self.onNukeExplosion,
'gotoPlotSet' : self.onGotoPlotSet,
'BeginGameTurn' : self.onBeginGameTurn,
'EndGameTurn' : self.onEndGameTurn,
'BeginPlayerTurn' : self.onBeginPlayerTurn,
'EndPlayerTurn' : self.onEndPlayerTurn,
'endTurnReady' : self.onEndTurnReady,
'combatResult' : self.onCombatResult,
'combatLogCalc' : self.onCombatLogCalc,
'combatLogHit' : self.onCombatLogHit,
'improvementBuilt' : self.onImprovementBuilt,
'improvementDestroyed' : self.onImprovementDestroyed,
'routeBuilt' : self.onRouteBuilt,
'firstContact' : self.onFirstContact,
'cityBuilt' : self.onCityBuilt,
'cityRazed' : self.onCityRazed,
'cityAcquired' : self.onCityAcquired,
'cityAcquiredAndKept' : self.onCityAcquiredAndKept,
'cityLost' : self.onCityLost,
'cultureExpansion' : self.onCultureExpansion,
'cityGrowth' : self.onCityGrowth,
'cityDoTurn' : self.onCityDoTurn,
'cityBuildingUnit' : self.onCityBuildingUnit,
'cityBuildingBuilding' : self.onCityBuildingBuilding,
'cityRename' : self.onCityRename,
'cityHurry' : self.onCityHurry,
'selectionGroupPushMission' : self.onSelectionGroupPushMission,
'unitMove' : self.onUnitMove,
'unitSetXY' : self.onUnitSetXY,
'unitCreated' : self.onUnitCreated,
'unitBuilt' : self.onUnitBuilt,
'unitKilled' : self.onUnitKilled,
'unitLost' : self.onUnitLost,
'unitPromoted' : self.onUnitPromoted,
'unitSelected' : self.onUnitSelected,
'UnitRename' : self.onUnitRename,
'unitPillage' : self.onUnitPillage,
'unitSpreadReligionAttempt' : self.onUnitSpreadReligionAttempt,
'unitGifted' : self.onUnitGifted,
'unitBuildImprovement' : self.onUnitBuildImprovement,
'goodyReceived' : self.onGoodyReceived,
'greatPersonBorn' : self.onGreatPersonBorn,
'buildingBuilt' : self.onBuildingBuilt,
'projectBuilt' : self.onProjectBuilt,
'techAcquired' : self.onTechAcquired,
'techSelected' : self.onTechSelected,
'religionFounded' : self.onReligionFounded,
'religionSpread' : self.onReligionSpread,
'religionRemove' : self.onReligionRemove,
'corporationFounded' : self.onCorporationFounded,
'corporationSpread' : self.onCorporationSpread,
'corporationRemove' : self.onCorporationRemove,
'goldenAge' : self.onGoldenAge,
'endGoldenAge' : self.onEndGoldenAge,
'chat' : self.onChat,
'victory' : self.onVictory,
'vassalState' : self.onVassalState,
'changeWar' : self.onChangeWar,
'setPlayerAlive' : self.onSetPlayerAlive,
'playerChangeStateReligion' : self.onPlayerChangeStateReligion,
'playerGoldTrade' : self.onPlayerGoldTrade,
'windowActivation' : self.onWindowActivation,
'gameUpdate' : self.onGameUpdate, # sample generic event
}
################## Events List ###############################
#
# Dictionary of Events, indexed by EventID (also used at popup context id)
# entries have name, beginFunction, applyFunction [, randomization weight...]
#
# Normal events first, random events after
#
################## Events List ###############################
self.Events={
CvUtil.EventEditCityName : ('EditCityName', self.__eventEditCityNameApply, self.__eventEditCityNameBegin),
CvUtil.EventEditCity : ('EditCity', self.__eventEditCityApply, self.__eventEditCityBegin),
CvUtil.EventPlaceObject : ('PlaceObject', self.__eventPlaceObjectApply, self.__eventPlaceObjectBegin),
CvUtil.EventAwardTechsAndGold: ('AwardTechsAndGold', self.__eventAwardTechsAndGoldApply, self.__eventAwardTechsAndGoldBegin),
CvUtil.EventEditUnitName : ('EditUnitName', self.__eventEditUnitNameApply, self.__eventEditUnitNameBegin),
CvUtil.EventWBAllPlotsPopup : ('WBAllPlotsPopup', self.__eventWBAllPlotsPopupApply, self.__eventWBAllPlotsPopupBegin),
CvUtil.EventWBLandmarkPopup : ('WBLandmarkPopup', self.__eventWBLandmarkPopupApply, self.__eventWBLandmarkPopupBegin),
CvUtil.EventWBScriptPopup : ('WBScriptPopup', self.__eventWBScriptPopupApply, self.__eventWBScriptPopupBegin),
CvUtil.EventWBStartYearPopup : ('WBStartYearPopup', self.__eventWBStartYearPopupApply, self.__eventWBStartYearPopupBegin),
CvUtil.EventShowWonder: ('ShowWonder', self.__eventShowWonderApply, self.__eventShowWonderBegin),
}
#################### EVENT STARTERS ######################
def handleEvent(self, argsList):
'EventMgr entry point'
# extract the last 6 args in the list, the first arg has already been consumed
self.origArgsList = argsList # point to original
tag = argsList[0] # event type string
idx = len(argsList)-6
bDummy = false
self.bDbg, bDummy, self.bAlt, self.bCtrl, self.bShift, self.bAllowCheats = argsList[idx:]
ret = 0
if self.EventHandlerMap.has_key(tag):
fxn = self.EventHandlerMap[tag]
ret = fxn(argsList[1:idx])
return ret
#################### EVENT APPLY ######################
def beginEvent( self, context, argsList=-1 ):
'Begin Event'
entry = self.Events[context]
return entry[2]( argsList )
def applyEvent( self, argsList ):
'Apply the effects of an event '
context, playerID, netUserData, popupReturn = argsList
if context == CvUtil.PopupTypeEffectViewer:
return CvDebugTools.g_CvDebugTools.applyEffectViewer( playerID, netUserData, popupReturn )
entry = self.Events[context]
if ( context not in CvUtil.SilentEvents ):
self.reportEvent(entry, context, (playerID, netUserData, popupReturn) )
return entry[1]( playerID, netUserData, popupReturn ) # the apply function
def reportEvent(self, entry, context, argsList):
'Report an Event to Events.log '
if (gc.getGame().getActivePlayer() != -1):
message = "DEBUG Event: %s (%s)" %(entry[0], gc.getActivePlayer().getName())
CyInterface().addImmediateMessage(message,"")
CvUtil.pyPrint(message)
return 0
#################### ON EVENTS ######################
def onKbdEvent(self, argsList):
'keypress handler - return 1 if the event was consumed'
eventType,key,mx,my,px,py = argsList
game = gc.getGame()
if (self.bAllowCheats):
# notify debug tools of input to allow it to override the control
argsList = (eventType,key,self.bCtrl,self.bShift,self.bAlt,mx,my,px,py,gc.getGame().isNetworkMultiPlayer())
if ( CvDebugTools.g_CvDebugTools.notifyInput(argsList) ):
return 0
if ( eventType == self.EventKeyDown ):
theKey=int(key)
CvCameraControls.g_CameraControls.handleInput( theKey )
if (self.bAllowCheats):
# Shift - T (Debug - No MP)
if (theKey == int(InputTypes.KB_T)):
if ( self.bShift ):
self.beginEvent(CvUtil.EventAwardTechsAndGold)
#self.beginEvent(CvUtil.EventCameraControlPopup)
return 1
elif (theKey == int(InputTypes.KB_W)):
if ( self.bShift and self.bCtrl):
self.beginEvent(CvUtil.EventShowWonder)
return 1
# Shift - ] (Debug - currently mouse-overd unit, health += 10
elif (theKey == int(InputTypes.KB_LBRACKET) and self.bShift ):
unit = CyMap().plot(px, py).getUnit(0)
if ( not unit.isNone() ):
d = min( unit.maxHitPoints()-1, unit.getDamage() + 10 )
unit.setDamage( d, PlayerTypes.NO_PLAYER )
# Shift - [ (Debug - currently mouse-overd unit, health -= 10
elif (theKey == int(InputTypes.KB_RBRACKET) and self.bShift ):
unit = CyMap().plot(px, py).getUnit(0)
if ( not unit.isNone() ):
d = max( 0, unit.getDamage() - 10 )
unit.setDamage( d, PlayerTypes.NO_PLAYER )
elif (theKey == int(InputTypes.KB_F1)):
if ( self.bShift ):
CvScreensInterface.replayScreen.showScreen(False)
return 1
# don't return 1 unless you want the input consumed
elif (theKey == int(InputTypes.KB_F2)):
if ( self.bShift ):
import CvDebugInfoScreen
CvScreensInterface.showDebugInfoScreen()
return 1
elif (theKey == int(InputTypes.KB_F3)):
if ( self.bShift ):
CvScreensInterface.showDanQuayleScreen(())
return 1
elif (theKey == int(InputTypes.KB_F4)):
if ( self.bShift ):
CvScreensInterface.showUnVictoryScreen(())
return 1
return 0
def onModNetMessage(self, argsList):
'Called whenever CyMessageControl().sendModNetMessage() is called - this is all for you modders!'
iData1, iData2, iData3, iData4, iData5 = argsList
print("Modder's net message!")
CvUtil.pyPrint( 'onModNetMessage' )
# Rise of Mankind start
iMessageID = iData1
#Inquisitor's Effect on a City
if ( iMessageID == self.m_iNetMessage_Inquisitor ):
iPlotX = iData2
iPlotY = iData3
iOwner = iData4
iUnitID = iData5
pPlot = CyMap( ).plot( iPlotX, iPlotY )
pCity = pPlot.getPlotCity( )
pPlayer = gc.getPlayer( iOwner )
pUnit = pPlayer.getUnit( iUnitID )
self.doInquisitorPersecution( pCity, pUnit )
# Rise of Mankind 2.71
# NetModMessage 410
# SettlersEventManager.py / Colonist
# Add additional buildings and change city size
if ( gc.getDefineINT("ROM_MULTIPLAYER_FIX") <= 0 ):
if ( iMessageID == self.m_iNetMessage_Colonist ):
iPlotX = iData2
iPlotY = iData3
iOwner = iData4
iUnitID = iData5
pPlot = CyMap( ).plot( iPlotX, iPlotY )
pCity = pPlot.getPlotCity( )
pPlayer = gc.getPlayer( iOwner )
pCity.setPopulation(3)
self.addCityBuildings(pCity, "BUILDINGCLASS_BARRACKS")
self.addCityBuildings(pCity, "BUILDINGCLASS_GRANARY")
self.addCityBuildings(pCity, "BUILDINGCLASS_FORGE")
self.addCityBuildings(pCity, "BUILDINGCLASS_MARKET")
if pCity.plot().isCoastalLand():
self.addCityBuildings(pCity, "BUILDINGCLASS_HARBOR")
self.addCityBuildings(pCity, "BUILDINGCLASS_LIGHTHOUSE")
self.addCityBuildings(pCity, "BUILDINGCLASS_FISHERMAN_HUT")
# NetModMessage 411
# SettlersEventManager.py / Pioneer
# Add additional buildings and change city size
if ( iMessageID == self.m_iNetMessage_Pioneer ):
iPlotX = iData2
iPlotY = iData3
iOwner = iData4
iUnitID = iData5
pPlot = CyMap( ).plot( iPlotX, iPlotY )
pCity = pPlot.getPlotCity( )
pPlayer = gc.getPlayer( iOwner )
pCity.setPopulation(4)
self.addCityBuildings(pCity, "BUILDINGCLASS_GARRISON")
self.addCityBuildings(pCity, "BUILDINGCLASS_GRANARY")
self.addCityBuildings(pCity, "BUILDINGCLASS_FORGE")
self.addCityBuildings(pCity, "BUILDINGCLASS_COURTHOUSE")
self.addCityBuildings(pCity, "BUILDINGCLASS_MARKET")
self.addCityBuildings(pCity, "BUILDINGCLASS_STABLE")
self.addCityBuildings(pCity, "BUILDINGCLASS_GROCER")
self.addCityBuildings(pCity, "BUILDINGCLASS_DOCTOR")
self.addCityBuildings(pCity, "BUILDINGCLASS_BANK")
self.addCityBuildings(pCity, "BUILDINGCLASS_LIBRARY")
if pCity.plot().isCoastalLand():
self.addCityBuildings(pCity, "BUILDINGCLASS_PORT")
self.addCityBuildings(pCity, "BUILDINGCLASS_LIGHTHOUSE")
self.addCityBuildings(pCity, "BUILDINGCLASS_FISHERMAN_HUT")
def addCityBuildings(self, pCity, szBuilding):
iBuilding = gc.getInfoTypeForString(szBuilding)
iUniqueBuilding = gc.getCivilizationInfo(gc.getPlayer(pCity.getOwner()).getCivilizationType()).getCivilizationBuildings(iBuilding)
if iUniqueBuilding > -1:
if pCity.canConstruct(iUniqueBuilding, False, True, False):
pCity.setNumRealBuilding(iUniqueBuilding, 1)
# Rise of Mankind 2.71
def onInit(self, argsList):
'Called when Civ starts up'
CvUtil.pyPrint( 'OnInit' )
def onUpdate(self, argsList):
'Called every frame'
fDeltaTime = argsList[0]
# allow camera to be updated
CvCameraControls.g_CameraControls.onUpdate( fDeltaTime )
def onWindowActivation(self, argsList):
'Called when the game window activates or deactivates'
bActive = argsList[0]
def onUnInit(self, argsList):
'Called when Civ shuts down'
CvUtil.pyPrint('OnUnInit')
def onPreSave(self, argsList):
"called before a game is actually saved"
CvUtil.pyPrint('OnPreSave')
def onSaveGame(self, argsList):
"return the string to be saved - Must be a string"
return ""
def onLoadGame(self, argsList):
CvAdvisorUtils.resetNoLiberateCities()
# Rise of Mankind 2.7
for iBuildingUpgradeLine_OuterItem in range(self.asBuildingUpgradeLine_Upgrade_Name.__len__()):
for iBuildingUpgradeLine_InnerItem_Upgrade in range(self.asBuildingUpgradeLine_Upgrade_Name[iBuildingUpgradeLine_OuterItem].__len__()):
for iBuildingUpgradeLine_InnerItem_Obsolete in range(self.asBuildingUpgradeLine_Obsolete_Name[iBuildingUpgradeLine_OuterItem].__len__()):
self.aiBuildingUpgradeLine_Upgrade_InfoTypeNum.append(CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), self.asBuildingUpgradeLine_Upgrade_Name[iBuildingUpgradeLine_OuterItem][iBuildingUpgradeLine_InnerItem_Upgrade]))
self.aiBuildingUpgradeLine_Obsolete_InfoTypeNum.append(CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), self.asBuildingUpgradeLine_Obsolete_Name[iBuildingUpgradeLine_OuterItem][iBuildingUpgradeLine_InnerItem_Obsolete]))
self.iBUILDING_CRUSADE = gc.getInfoTypeForString("BUILDING_CRUSADE")
# Rise of Mankind 2.7
# Rise of Mankind 2.71
self.iBUILDING_DJENNE = gc.getInfoTypeForString("BUILDING_DJENNE")
self.iBUILDING_WORLD_BANK = gc.getInfoTypeForString("BUILDING_WORLD_BANK")
self.iTECH_KNOWLEDGE_MANAGEMENT = gc.getInfoTypeForString("TECH_KNOWLEDGE_MANAGEMENT")
self.iPROJECT_EDEN = gc.getInfoTypeForString("PROJECT_EDEN")
# Rise of Mankind 2.71
return 0
def onGameStart(self, argsList):
'Called at the start of the game'
if (gc.getGame().getGameTurnYear() == gc.getDefineINT("START_YEAR") and not gc.getGame().isOption(GameOptionTypes.GAMEOPTION_ADVANCED_START)):
for iPlayer in range(gc.getMAX_PLAYERS()):
player = gc.getPlayer(iPlayer)
if (player.isAlive() and player.isHuman()):
popupInfo = CyPopupInfo()
popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON_SCREEN)
popupInfo.setText(u"showDawnOfMan")
popupInfo.addPopup(iPlayer)
else:
CyInterface().setSoundSelectionReady(true)
if gc.getGame().isPbem():
for iPlayer in range(gc.getMAX_PLAYERS()):
player = gc.getPlayer(iPlayer)
if (player.isAlive() and player.isHuman()):
popupInfo = CyPopupInfo()
popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_DETAILS)
popupInfo.setOption1(true)
popupInfo.addPopup(iPlayer)
CvAdvisorUtils.resetNoLiberateCities()
# Rise of Mankind 2.63 - init building upgrade lines, can not be done earlier as the game inits python before it inits xml...
for iBuildingUpgradeLine_OuterItem in range(self.asBuildingUpgradeLine_Upgrade_Name.__len__()):
for iBuildingUpgradeLine_InnerItem_Upgrade in range(self.asBuildingUpgradeLine_Upgrade_Name[iBuildingUpgradeLine_OuterItem].__len__()):
for iBuildingUpgradeLine_InnerItem_Obsolete in range(self.asBuildingUpgradeLine_Obsolete_Name[iBuildingUpgradeLine_OuterItem].__len__()):
self.aiBuildingUpgradeLine_Upgrade_InfoTypeNum.append(CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), self.asBuildingUpgradeLine_Upgrade_Name[iBuildingUpgradeLine_OuterItem][iBuildingUpgradeLine_InnerItem_Upgrade]))
self.aiBuildingUpgradeLine_Obsolete_InfoTypeNum.append(CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), self.asBuildingUpgradeLine_Obsolete_Name[iBuildingUpgradeLine_OuterItem][iBuildingUpgradeLine_InnerItem_Obsolete]))
# def onBuildingBuilt / Additional tests variable
self.iBUILDING_CRUSADE = gc.getInfoTypeForString("BUILDING_CRUSADE")
# Rise of Mankind
# Rise of Mankind 2.71
self.iBUILDING_DJENNE = gc.getInfoTypeForString("BUILDING_DJENNE")
self.iBUILDING_WORLD_BANK = gc.getInfoTypeForString("BUILDING_WORLD_BANK")
self.iTECH_KNOWLEDGE_MANAGEMENT = gc.getInfoTypeForString("TECH_KNOWLEDGE_MANAGEMENT")
# Rise of Mankind 2.71
# Rise of Mankind 2.8
self.iPROJECT_EDEN = gc.getInfoTypeForString('PROJECT_EDEN')
# Rise of Mankind 2.8
def onGameEnd(self, argsList):
'Called at the End of the game'
print("Game is ending")
return
def onBeginGameTurn(self, argsList):
'Called at the beginning of the end of each turn'
iGameTurn = argsList[0]
CvTopCivs.CvTopCivs().turnChecker(iGameTurn)
def onEndGameTurn(self, argsList):
'Called at the end of the end of each turn'
iGameTurn = argsList[0]
def onBeginPlayerTurn(self, argsList):
'Called at the beginning of a players turn'
iGameTurn, iPlayer = argsList
pPlayer = gc.getPlayer(iPlayer)
pPlayer = gc.getPlayer(iPlayer)
# Rise of Mankind 2.7 start - world bank national wonder
if gc.getTeam(pPlayer.getTeam()).isHasTech(gc.getInfoTypeForString("TECH_APPLIED_ECONOMICS")):
b_WorldBank = gc.getInfoTypeForString("BUILDING_WORLD_BANK")
obsoleteTech = gc.getBuildingInfo(b_WorldBank).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_WorldBank) == true:
#pPID = pPlayer.getID()
iGold = pPlayer.getGold( )
pPlayer.changeGold( iGold//50 )
# Rise of Mankind 2.7 end
#Inquisition Mod
# BugUtil.info("RoM - Begin Player turn, do religious victory checks")
# Code to determine if all cities have 6 "Religious Unity" Prerequisites by Orion Veteran
# Special thanks to STO for providing the code strategy - Great Job!
# 1. A player must have an official State Religion
# 2. A player must have the Holy City for the official State Religion
# 3. A player must have built the Shrine for the official State Religion
# 4. 80% a player's cities must have the official state religion established.
# 5. All of a player's cities must not have any non-state religions established.
# 6. Religious influence must be at least 80%
#Is the "Religious" victory game option set to True?
if CyGame().isVictoryValid(gc.getInfoTypeForString("VICTORY_RELIGIOUS")) :
if (pPlayer.getNumCities() > 0) and (CyGame().getNumCivCities() > 2 * CyGame().countCivPlayersAlive()): # be sure the game is advanced enough to test a religious victory
bUnity = True
iStateReligion = pPlayer.getStateReligion()
if iStateReligion == -1 :
# No State Religion was Found - Prerequisite 1
#CyInterface().addMessage(CyGame().getActivePlayer(),True,25,'No State Religion!','AS2D_DISCOVERBONUS',1,'Art/Interface/Buttons/TerrainFeatures/Forest.dds',ColorTypes(8),0,0,False,False)
bUnity = False
if bUnity :
if not pPlayer.hasHolyCity(iStateReligion) :
# No Holy City was Found for the official state religion - Prerequisite 2
#CyInterface().addMessage(CyGame().getActivePlayer(),True,25,'Holy City Not Found!','AS2D_DISCOVERBONUS',1,'Art/Interface/Buttons/TerrainFeatures/Forest.dds',ColorTypes(8),0,0,False,False)
bUnity = False
if bUnity :
bHasShrine = False
MyShrine = CvUtil.CvGetStateReligionShrine(iPlayer)
#CyInterface().addMessage(CyGame().getActivePlayer(),True,25,'Test','AS2D_DISCOVERBONUS',1,'Art/Interface/Buttons/TerrainFeatures/Forest.dds',ColorTypes(8),0,0,False,False)
for iCity in range(pPlayer.getNumCities()):
CVpCity = pPlayer.getCity(iCity)
if CVpCity.isHasBuilding(gc.getInfoTypeForString(MyShrine)):
# No official State Religion Shrine was found for the official state religion - Prerequisite 3
bHasShrine = True
break
if not bHasShrine :
#CyInterface().addMessage(CyGame().getActivePlayer(),True,25,'No State Shrine was Found!','AS2D_DISCOVERBONUS',1,'Art/Interface/Buttons/TerrainFeatures/Forest.dds',ColorTypes(8),0,0,False,False)
bUnity = False
if bUnity :
#RevolutionDCM - relaxation of prerequisite 4 because of the practical difficulty in spreading state religion to every satellite settlement
maxNonStatePercentThreshold = 20
nonStateReligionCount = 0
numCities = len(PyHelpers.PyPlayer(iPlayer).getCityList())
for pyCity in PyHelpers.PyPlayer(iPlayer).getCityList() :
if not bUnity :
break
for iReligionLoop in range(gc.getNumReligionInfos()):
if iReligionLoop == iStateReligion :
if not pyCity.hasReligion(iReligionLoop) :
# City does not have the official state religion - Prerequisite 4
#CyInterface().addMessage(CyGame().getActivePlayer(),True,25,'No State Religion founded in City!','AS2D_DISCOVERBONUS',1,'Art/Interface/Buttons/TerrainFeatures/Forest.dds',ColorTypes(8),0,0,False,False)
nonStateReligionCount += 1
nonStateReligionPercent = 100 * nonStateReligionCount / numCities
if nonStateReligionPercent > maxNonStatePercentThreshold:
bUnity = False
break
elif pyCity.hasReligion(iReligionLoop) :
# City has a non-State religion - Prerequisite 5
if not CvUtil.isOC_INQISITOR_CAN_REMOVE_HOLY_CITY():
if not CvUtil.isHoly(pyCity):
bUnity = False
break
else:
#CyInterface().addMessage(CyGame().getActivePlayer(),True,25,'Found non-State Religion!','AS2D_DISCOVERBONUS',1,'Art/Interface/Buttons/TerrainFeatures/Forest.dds',ColorTypes(8),0,0,False,False)
bUnity = False
break
if bUnity :
if CyGame().calculateReligionPercent(iStateReligion) < 75 :
# Religeous influence is less than 75% - Prerequisite 6
#CyInterface().addMessage(CyGame().getActivePlayer(),True,25,'No Religion influence!','AS2D_DISCOVERBONUS',1,'Art/Interface/Buttons/TerrainFeatures/Forest.dds',ColorTypes(8),0,0,False,False)
bUnity = False
if bUnity :
# The player has met all 5 prerequsites to achieve a valid religeous victory
#CyInterface().addMessage(CyGame().getActivePlayer(),True,25,'Victory!','AS2D_DISCOVERBONUS',1,'Art/Interface/Buttons/TerrainFeatures/Forest.dds',ColorTypes(8),0,0,False,False)
CyGame().setWinner(pPlayer.getTeam(), gc.getInfoTypeForString("VICTORY_RELIGIOUS"))
# End Inquisition Mod
# Rise of Mankind 2.8 start - Scientific Victory when Ascension Gate is found from player city ie. it has been built
if CyGame().isVictoryValid(gc.getInfoTypeForString("VICTORY_SCIENTIFIC")) :
if gc.getTeam(pPlayer.getTeam()).isHasTech(gc.getInfoTypeForString("TECH_SENTIENT_EARTH")):
b_AscensionGate = gc.getInfoTypeForString("BUILDING_ASCENSION_GATE")
for iCity in range(pPlayer.getNumCities()):
ppCity = pPlayer.getCity(iCity)
if ppCity.getNumActiveBuilding(b_AscensionGate) == true:
CyGame().setWinner(pPlayer.getTeam(), gc.getInfoTypeForString("VICTORY_SCIENTIFIC"))