## Sid Meier's Civilization 4 ## Copyright Firaxis Games 2005 ## ## 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 gc = CyGlobalContext() localText = CyTranslator() PyPlayer = PyHelpers.PyPlayer PyInfo = PyHelpers.PyInfo # globals ################################################### class CvEventManager: def __init__(self): #################### ON EVENT MAP ###################### #print "EVENTMANAGER INIT" self.bMultiplayer = False 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 = 0 self.__LOG_UNITLOST = 0 self.__LOG_UNITPROMOTED = 0 self.__LOG_UNITSELECTED = 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 ## EVENTLIST self.EventHandlerMap = { 'mouseEvent' : self.onMouseEvent, 'kbdEvent' : self.onKbdEvent, '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, '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, 'routeBuilt' : self.onRouteBuilt, 'firstContact' : self.onFirstContact, 'cityBuilt' : self.onCityBuilt, 'cityRazed' : self.onCityRazed, 'cityAcquired' : self.onCityAcquired, 'cityLost' : self.onCityLost, 'cultureExpansion' : self.onCultureExpansion, 'cityGrowth' : self.onCityGrowth, 'cityDoTurn' : self.onCityDoTurn, 'cityBuildingUnit' : self.onCityBuildingUnit, 'cityBuildingBuilding' : self.onCityBuildingBuilding, 'cityRename' : self.onCityRename, '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, 'goodyReceived' : self.onGoodyReceived, 'greatPersonBorn' : self.onGreatPersonBorn, 'buildingBuilt' : self.onBuildingBuilt, 'projectBuilt' : self.onProjectBuilt, 'techAcquired' : self.onTechAcquired, 'techSelected' : self.onTechSelected, 'religionFounded' : self.onReligionFounded, 'religionSpread' : self.onReligionSpread, 'goldenAge' : self.onGoldenAge, 'endGoldenAge' : self.onEndGoldenAge, 'chat' : self.onChat, 'victory' : self.onVictory, 'changeWar' : self.onChangeWar, 'setPlayerAlive' : self.onSetPlayerAlive, '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), } #################### 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 self.bDbg, self.bMultiPlayer, 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 ' 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 = CyGame() self.bMultiplayer = CyGame().isNetworkMultiPlayer() 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,self.bMultiplayer) if ( CvDebugTools.g_CvDebugTools.notifyInput(argsList) ): return 0 if ( eventType == self.EventKeyDown ): theKey=int(key) CvCameraControls.g_CameraControls.handleInput( theKey ) # Shift - T (Debug - No MP) if (self.bAllowCheats and theKey == int(InputTypes.KB_T)): if ( self.bShift ): self.beginEvent(CvUtil.EventAwardTechsAndGold) #self.beginEvent(CvUtil.EventCameraControlPopup) return 1 # Shift - ] (Debug - currently mouse-overd unit, health += 10 elif (self.bAllowCheats and 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 (self.bAllowCheats and 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 (self.bAllowCheats and 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 (self.bAllowCheats and theKey == int(InputTypes.KB_F2)): if ( self.bShift ): import CvDebugInfoScreen CvScreensInterface.showDebugInfoScreen() return 1 elif (self.bAllowCheats and theKey == int(InputTypes.KB_F3)): if ( self.bShift ): CvScreensInterface.showDanQuayleScreen(()) return 1 elif (self.bAllowCheats and theKey == int(InputTypes.KB_F4)): if ( self.bShift ): CvScreensInterface.showUnVictoryScreen(()) return 1 return 0 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): return 0 def onGameStart(self, argsList): 'Called at the start of the game' if (gc.getGame().getGameTurnYear() == gc.getDefineINT("START_YEAR")): 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) 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 def onEndPlayerTurn(self, argsList): 'Called at the end of a players turn' iGameTurn, iPlayer = argsList if (gc.getGame().getElapsedGameTurns() == 1): if (gc.getPlayer(iPlayer).isHuman()): if (gc.getPlayer(iPlayer).canRevolution(0)): popupInfo = CyPopupInfo() popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_CHANGECIVIC) popupInfo.addPopup(iPlayer) CvAdvisorUtils.resetAdvisorNags() CvAdvisorUtils.endTurnFeats(iPlayer) def onEndTurnReady(self, argsList): iGameTurn = argsList[0] def onFirstContact(self, argsList): 'Contact' iTeamX,iHasMetTeamY = argsList if (not self.__LOG_CONTACT): return CvUtil.pyPrint('Team %d has met Team %d' %(iTeamX, iHasMetTeamY)) def onCombatResult(self, argsList): 'Combat Result' pWinner,pLoser = argsList playerX = PyPlayer(pWinner.getOwner()) unitX = PyInfo.UnitInfo(pWinner.getUnitType()) playerY = PyPlayer(pLoser.getOwner()) unitY = PyInfo.UnitInfo(pLoser.getUnitType()) if (not self.__LOG_COMBAT): return if playerX and playerX and unitX and playerY: CvUtil.pyPrint('Player %d Civilization %s Unit %s has defeated Player %d Civilization %s Unit %s' %(playerX.getID(), playerX.getCivilizationName(), unitX.getDescription(), playerY.getID(), playerY.getCivilizationName(), unitY.getDescription())) def onCombatLogCalc(self, argsList): 'Combat Result' genericArgs = argsList[0][0] cdAttacker = genericArgs[0] cdDefender = genericArgs[1] iDefenderOdds = genericArgs[2] CvUtil.combatMessageBuilder(cdAttacker, cdDefender) combatMessage = "%s: %.1f%%" %(localText.getText("TXT_KEY_COMBAT_MESSAGE_DEFENDER_ODDS", ()),iDefenderOdds/10.0,) CyInterface().addCombatMessage(cdAttacker.eOwner,combatMessage) CyInterface().addCombatMessage(cdDefender.eOwner,combatMessage) def onCombatLogHit(self, argsList): 'Combat Message' global gCombatMessages, gCombatLog genericArgs = argsList[0][0] cdAttacker = genericArgs[0] cdDefender = genericArgs[1] iIsAttacker = genericArgs[2] iDamage = genericArgs[3] if (iIsAttacker == 0): combatMessage = localText.getText("TXT_KEY_COMBAT_MESSAGE_HIT", (gc.getPlayer(cdDefender.eOwner).getNameKey(), cdDefender.sUnitName, iDamage, cdDefender.iCurrHitPoints, cdDefender.iMaxHitPoints)) CyInterface().addCombatMessage(cdAttacker.eOwner,combatMessage) CyInterface().addCombatMessage(cdDefender.eOwner,combatMessage) if (cdDefender.iCurrHitPoints <= 0): combatMessage = localText.getText("TXT_KEY_COMBAT_MESSAGE_DEFEATED", (gc.getPlayer(cdAttacker.eOwner).getNameKey(), cdAttacker.sUnitName, gc.getPlayer(cdDefender.eOwner).getNameKey(), cdDefender.sUnitName)) CyInterface().addCombatMessage(cdAttacker.eOwner,combatMessage) CyInterface().addCombatMessage(cdDefender.eOwner,combatMessage) elif (iIsAttacker == 1): combatMessage = localText.getText("TXT_KEY_COMBAT_MESSAGE_HIT", (gc.getPlayer(cdAttacker.eOwner).getNameKey(), cdAttacker.sUnitName, iDamage, cdAttacker.iCurrHitPoints, cdAttacker.iMaxHitPoints)) CyInterface().addCombatMessage(cdAttacker.eOwner,combatMessage) CyInterface().addCombatMessage(cdDefender.eOwner,combatMessage) if (cdAttacker.iCurrHitPoints <= 0): combatMessage = localText.getText("TXT_KEY_COMBAT_MESSAGE_DEFEATED", (gc.getPlayer(cdDefender.eOwner).getNameKey(), cdDefender.sUnitName, gc.getPlayer(cdAttacker.eOwner).getNameKey(), cdAttacker.sUnitName)) CyInterface().addCombatMessage(cdAttacker.eOwner,combatMessage) CyInterface().addCombatMessage(cdDefender.eOwner,combatMessage) def onImprovementBuilt(self, argsList): 'Improvement Built' iImprovement, iX, iY = argsList iPlayer = CyGame().getActivePlayer() pPlot = CyMap().plot(iX,iY) player = gc.getPlayer(iPlayer) if(iImprovement==25): Plot.setFeatureType(CyGlobalContext().getInfoTypeForString("FEATURE_FOREST"),-1) pPlot.setImprovementType(-1) if (not self.__LOG_IMPROVEMENT): return CvUtil.pyPrint('Improvement %s was built at %d, %d' %(PyInfo.ImprovementInfo(iImprovement).getDescription(), iX, iY)) def onRouteBuilt(self, argsList): 'Route Built' iRoute, iX, iY = argsList if (not self.__LOG_IMPROVEMENT): return CvUtil.pyPrint('Route %s was built at %d, %d' %(gc.getRouteInfo(iRoute).getDescription(), iX, iY)) def onPlotRevealed(self, argsList): 'Plot Revealed' pPlot = argsList[0] iTeam = argsList[1] def onBuildingBuilt(self, argsList): 'Building Completed' pCity, iBuildingType = argsList game = CyGame() if ((not self.bMultiPlayer) and (pCity.getOwner() == CyGame().getActivePlayer()) and isWorldWonderClass(gc.getBuildingInfo(iBuildingType).getBuildingClassType())): # If this is a wonder... popupInfo = CyPopupInfo() popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON_SCREEN) popupInfo.setData1(iBuildingType) popupInfo.setData2(pCity.getID()) popupInfo.setData3(0) popupInfo.setText(u"showWonderMovie") popupInfo.addPopup(pCity.getOwner()) CvAdvisorUtils.buildingBuiltFeats(pCity, iBuildingType) if (not self.__LOG_BUILDING): return CvUtil.pyPrint('%s was finished by Player %d Civilization %s' %(PyInfo.BuildingInfo(iBuildingType).getDescription(), pCity.getOwner(), gc.getPlayer(pCity.getOwner()).getCivilizationDescription(0))) def onProjectBuilt(self, argsList): 'Project Completed' pCity, iProjectType = argsList game = CyGame() if ((not self.bMultiPlayer) and (pCity.getOwner() == CyGame().getActivePlayer())): popupInfo = CyPopupInfo() popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON_SCREEN) popupInfo.setData1(iProjectType) popupInfo.setData2(pCity.getID()) popupInfo.setData3(2) popupInfo.setText(u"showWonderMovie") popupInfo.addPopup(pCity.getOwner()) def onUnitMove(self, argsList): 'unit move' pPlot,pUnit = argsList player = PyPlayer(pUnit.getOwner()) unitInfo = PyInfo.UnitInfo(pUnit.getUnitType()) if (not self.__LOG_MOVEMENT): return if player and unitInfo: CvUtil.pyPrint('Player %d Civilization %s unit %s is moving to %d, %d' %(player.getID(), player.getCivilizationName(), unitInfo.getDescription(), pUnit.getX(), pUnit.getY())) def onUnitSetXY(self, argsList): 'units xy coords set manually' pPlot,pUnit = argsList player = PyPlayer(pUnit.getOwner()) unitInfo = PyInfo.UnitInfo(pUnit.getUnitType()) if (not self.__LOG_MOVEMENT): return def onUnitCreated(self, argsList): 'Unit Completed' unit = argsList[0] player = PyPlayer(unit.getOwner()) if (not self.__LOG_UNITBUILD): return def onUnitBuilt(self, argsList): 'Unit Completed' city = argsList[0] unit = argsList[1] player = PyPlayer(city.getOwner()) CvAdvisorUtils.unitBuiltFeats(city, unit) if (not self.__LOG_UNITBUILD): return CvUtil.pyPrint('%s was finished by Player %d Civilization %s' %(PyInfo.UnitInfo(unit.getUnitType()).getDescription(), player.getID(), player.getCivilizationName())) def onUnitKilled(self, argsList): 'Unit Killed' unit, iAttacker = argsList player = PyPlayer(unit.getOwner()) attacker = PyPlayer(iAttacker) if (not self.__LOG_UNITKILLED): return CvUtil.pyPrint('Player %d Civilization %s Unit %s was killed by Player %d' %(player.getID(), player.getCivilizationName(), PyInfo.UnitInfo(unit.getUnitType()).getDescription(), attacker.getID())) def onUnitLost(self, argsList): 'Unit Lost' unit = argsList[0] player = PyPlayer(unit.getOwner()) if (not self.__LOG_UNITLOST): return CvUtil.pyPrint('%s was lost by Player %d Civilization %s' %(PyInfo.UnitInfo(unit.getUnitType()).getDescription(), player.getID(), player.getCivilizationName())) def onUnitPromoted(self, argsList): 'Unit Promoted' pUnit, iPromotion = argsList player = PyPlayer(pUnit.getOwner()) if (not self.__LOG_UNITPROMOTED): return CvUtil.pyPrint('Unit Promotion Event: %s - %s' %(player.getCivilizationName(), pUnit.getName(),)) def onUnitSelected(self, argsList): 'Unit Selected' unit = argsList[0] player = PyPlayer(unit.getOwner()) if (not self.__LOG_UNITSELECTED): return CvUtil.pyPrint('%s was selected by Player %d Civilization %s' %(PyInfo.UnitInfo(unit.getUnitType()).getDescription(), player.getID(), player.getCivilizationName())) def onUnitRename(self, argsList): 'Unit is renamed' pUnit = argsList[0] if (pUnit.getOwner() == CyGame().getActivePlayer()): self.__eventEditUnitNameBegin(pUnit) def onGoodyReceived(self, argsList): 'Goody received' iPlayer, pPlot, pUnit, iGoodyType = argsList if (not self.__LOG_GOODYRECEIVED): return CvUtil.pyPrint('%s received a goody' %(gc.getPlayer(iPlayer).getCivilizationDescription(0)),) def onGreatPersonBorn(self, argsList): 'Unit Promoted' pUnit, iPlayer, pCity = argsList player = PyPlayer(iPlayer) if pUnit.isNone() or pCity.isNone(): return if (not self.__LOG_GREATPERSON): return CvUtil.pyPrint('A %s was born for %s in %s' %(pUnit.getName(), player.getCivilizationName(), pCity.getName())) 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 # Show tech splash when applicable if (iPlayer > -1 and bAnnounce): if (gc.getGame().isFinalInitialized() and not gc.getGame().GetWorldBuilder2Mode()): if ((not self.bMultiPlayer) and (iPlayer == CyGame().getActivePlayer())): popupInfo = CyPopupInfo() popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON_SCREEN) popupInfo.setData1(iTechType) popupInfo.setText(u"showTechSplash") popupInfo.addPopup(iPlayer) if (not self.__LOG_TECH): return CvUtil.pyPrint('%s was finished by Team %d' %(PyInfo.TechnologyInfo(iTechType).getDescription(), iTeam)) def onTechSelected(self, argsList): 'Tech Selected' iTechType, iPlayer = argsList if (not self.__LOG_TECH): return CvUtil.pyPrint('%s was selected by Player %d' %(PyInfo.TechnologyInfo(iTechType).getDescription(), iPlayer)) def onReligionFounded(self, argsList): 'Religion Founded' iReligion, iFounder = argsList player = PyPlayer(iFounder) iCityId = gc.getGame().getHolyCity(iReligion).getID() if (gc.getGame().isFinalInitialized() and not gc.getGame().GetWorldBuilder2Mode()): if ((not self.bMultiPlayer) and (iFounder == CyGame().getActivePlayer())): popupInfo = CyPopupInfo() popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON_SCREEN) popupInfo.setData1(iReligion) popupInfo.setData2(iCityId) popupInfo.setData3(1) popupInfo.setText(u"showWonderMovie") popupInfo.addPopup(iFounder) if (not self.__LOG_RELIGION): return CvUtil.pyPrint('Player %d Civilization %s has founded %s' %(iFounder, player.getCivilizationName(), gc.getReligionInfo(iReligion).getDescription())) def onReligionSpread(self, argsList): 'Religion Has Spread to a City' iReligion, iOwner, pSpreadCity = argsList player = PyPlayer(iOwner) if (not self.__LOG_RELIGIONSPREAD): return CvUtil.pyPrint('%s has spread to Player %d Civilization %s city of %s' %(gc.getReligionInfo(iReligion).getDescription(), iOwner, player.getCivilizationName(), pSpreadCity.getName())) def onGoldenAge(self, argsList): 'Golden Age' iPlayer = argsList[0] player = PyPlayer(iPlayer) if (not self.__LOG_GOLDENAGE): return CvUtil.pyPrint('Player %d Civilization %s has begun a golden age' %(iPlayer, player.getCivilizationName())) def onEndGoldenAge(self, argsList): 'End Golden Age' iPlayer = argsList[0] player = PyPlayer(iPlayer) if (not self.__LOG_ENDGOLDENAGE): return CvUtil.pyPrint('Player %d Civilization %s golden age has ended' %(iPlayer, player.getCivilizationName())) def onChangeWar(self, argsList): 'War Status Changes' bIsWar = argsList[0] iPlayer = argsList[1] iRivalTeam = argsList[2] if (not self.__LOG_WARPEACE): return if (bIsWar): strStatus = "declared war" else: strStatus = "declared peace" CvUtil.pyPrint('Player %d Civilization %s has %s on Team %d' %(iPlayer, gc.getPlayer(iPlayer).getCivilizationName(), strStatus, eRivalTeam)) def onChat(self, argsList): 'Chat Message Event' chatMessage = "%s" %(argsList[0],) def onSetPlayerAlive(self, argsList): 'Set Player Alive Event' iPlayerID = argsList[0] bNewValue = argsList[1] CvUtil.pyPrint("Player %d's alive status set to: %d" %(iPlayerID, int(bNewValue))) def onCityBuilt(self, argsList): 'City Built' city = argsList[0] if (city.getOwner() == CyGame().getActivePlayer()): self.__eventEditCityNameBegin(city) CvUtil.pyPrint('City Built Event: %s' %(city.getName())) def onCityRazed(self, argsList): 'City Razed' city, iPlayer = argsList owner = PyPlayer(city.getOwner()) razor = PyPlayer(iPlayer) CvUtil.pyPrint('Player %d Civilization %s City %s was razed by Player %d' %(owner.getID(), owner.getCivilizationName(), city.getName(), razor.getID())) CvUtil.pyPrint("City Razed Event: %s" %(city.getName(),)) def onCityAcquired(self, argsList): 'City Acquired' owner,playerType,city,bConquest,bTrade = argsList CvUtil.pyPrint('City Acquired Event: %s' %(city.getName())) def onCityLost(self, argsList): 'City Lost' city = argsList[0] player = PyPlayer(city.getOwner()) if (not self.__LOG_CITYLOST): return CvUtil.pyPrint('City %s was lost by Player %d Civilization %s' %(city.getName(), player.getID(), player.getCivilizationName())) def onCultureExpansion(self, argsList): 'City Culture Expansion' pCity = argsList[0] iPlayer = argsList[1] CvUtil.pyPrint("City %s's culture has expanded" %(pCity.getName(),)) def onCityGrowth(self, argsList): 'City Population Growth' pCity = argsList[0] iPlayer = argsList[1] CvUtil.pyPrint("%s has grown" %(pCity.getName(),)) def onCityDoTurn(self, argsList): 'City Production' pCity = argsList[0] iPlayer = argsList[1] CvAdvisorUtils.cityAdvise(pCity, iPlayer) def onCityBuildingUnit(self, argsList): 'City begins building a unit' pCity = argsList[0] iUnitType = argsList[1] if (not self.__LOG_CITYBUILDING): return CvUtil.pyPrint("%s has begun building a %s" %(pCity.getName(),gc.getUnitInfo(iUnitType).getDescription())) def onCityBuildingBuilding(self, argsList): 'City begins building a Building' pCity = argsList[0] iBuildingType = argsList[1] if (not self.__LOG_CITYBUILDING): return CvUtil.pyPrint("%s has begun building a %s" %(pCity.getName(),gc.getBuildingInfo(iBuildingType).getDescription())) def onCityRename(self, argsList): 'City is renamed' pCity = argsList[0] if (pCity.getOwner() == CyGame().getActivePlayer()): self.__eventEditCityNameBegin(pCity) def onVictory(self, argsList): 'Victory' iTeam, iVictory = argsList if (iVictory >= 0 and iVictory < gc.getNumVictoryInfos()): victoryInfo = gc.getVictoryInfo(int(iVictory)) CvUtil.pyPrint("Victory! Team %d achieves a %s victory" %(iTeam, victoryInfo.getDescription())) def onGameUpdate(self, argsList): 'sample generic event, called on each game turn slice' genericArgs = argsList[0][0] # tuple of tuple of my args turnSlice = genericArgs[0] def onMouseEvent(self, argsList): 'mouse handler - returns 1 if the event was consumed' eventType,mx,my,px,py,interfaceConsumed,screens = argsList print "onMouseEvent" print eventType if ( px!=-1 and py!=-1 ): if ( eventType == self.EventLButtonDown ): if (self.bAllowCheats and self.bCtrl and self.bAlt and CyMap().plot(px,py).isCity() and not interfaceConsumed): # Launch Edit City Event self.beginEvent( CvUtil.EventEditCity, (px,py) ) return 1 elif (self.bAllowCheats and self.bCtrl and self.bShift and not interfaceConsumed): # Launch Place Object Event self.beginEvent( CvUtil.EventPlaceObject, (px, py) ) return 1 if ( eventType == self.EventBack ): return CvScreensInterface.handleBack(screens) elif ( eventType == self.EventForward ): return CvScreensInterface.handleForward(screens) return 0 #################### TRIGGERED EVENTS ################## def __eventEditCityNameBegin(self, city): popup = PyPopup.PyPopup(CvUtil.EventEditCityName, EventContextTypes.EVENTCONTEXT_ALL) popup.setUserData((city.getID(),)) popup.setHeaderString(localText.getText("TXT_KEY_NAME_CITY", ())) popup.setBodyString(localText.getText("TXT_KEY_SETTLE_NEW_CITY_NAME", ())) popup.createEditBox(city.getName()) popup.setEditBoxMaxCharCount( 15 ) popup.launch() def __eventEditCityNameApply(self, playerID, userData, popupReturn): 'Edit City Name Event' iCityID = userData[0] player = gc.getPlayer(playerID) city = player.getCity(iCityID) cityName = popupReturn.getEditBoxString(0) if (len(cityName) > 30): cityName = cityName[:30] city.setName(cityName, false) def __eventEditCityBegin(self, argsList): 'Edit City Event' px,py = argsList CvWBPopups.CvWBPopups().initEditCity(argsList) def __eventEditCityApply(self, playerID, userData, popupReturn): 'Edit City Event Apply' if (getChtLvl() > 0): CvWBPopups.CvWBPopups().applyEditCity( (popupReturn, userData) ) def __eventPlaceObjectBegin(self, argsList): 'Place Object Event' CvDebugTools.CvDebugTools().initUnitPicker(argsList) def __eventPlaceObjectApply(self, playerID, userData, popupReturn): 'Place Object Event Apply' if (getChtLvl() > 0): CvDebugTools.CvDebugTools().applyUnitPicker( (popupReturn, userData) ) def __eventAwardTechsAndGoldBegin(self, argsList): 'Award Techs & Gold Event' CvDebugTools.CvDebugTools().cheatTechs() def __eventAwardTechsAndGoldApply(self, playerID, netUserData, popupReturn): 'Award Techs & Gold Event Apply' if (getChtLvl() > 0): CvDebugTools.CvDebugTools().applyTechCheat( (popupReturn) ) def __eventEditUnitNameBegin(self, argsList): pUnit = argsList popup = PyPopup.PyPopup(CvUtil.EventEditUnitName, EventContextTypes.EVENTCONTEXT_ALL) popup.setUserData((pUnit.getID(),)) popup.setBodyString(localText.getText("TXT_KEY_RENAME_UNIT", ())) popup.createEditBox(pUnit.getNameNoDesc()) popup.launch() def __eventEditUnitNameApply(self, playerID, userData, popupReturn): 'Edit Unit Name Event' iUnitID = userData[0] unit = gc.getPlayer(playerID).getUnit(iUnitID) newName = popupReturn.getEditBoxString(0) if (len(newName) > 25): newName = newName[:25] unit.setName(newName) def __eventWBAllPlotsPopupBegin(self, argsList): CvScreensInterface.getWorldBuilderScreen().allPlotsCB() return def __eventWBAllPlotsPopupApply(self, playerID, userData, popupReturn): if (popupReturn.getButtonClicked() >= 0): CvScreensInterface.getWorldBuilderScreen().handleAllPlotsCB(popupReturn) return def __eventWBLandmarkPopupBegin(self, argsList): popup = PyPopup.PyPopup(CvUtil.EventWBLandmarkPopup, EventContextTypes.EVENTCONTEXT_ALL) popup.createEditBox(localText.getText("TXT_KEY_WB_LANDMARK_START", ())) popup.launch() return def __eventWBLandmarkPopupApply(self, playerID, userData, popupReturn): if (popupReturn.getEditBoxString(0)): szLandmark = popupReturn.getEditBoxString(0) if (len(szLandmark)): CvScreensInterface.getWorldBuilderScreen().setLandmarkCB(szLandmark) return def __eventWBScriptPopupBegin(self, argsList): popup = PyPopup.PyPopup(CvUtil.EventWBScriptPopup, EventContextTypes.EVENTCONTEXT_ALL) popup.setHeaderString(localText.getText("TXT_KEY_WB_SCRIPT", ())) popup.createEditBox(CvScreensInterface.getWorldBuilderScreen().getCurrentScript()) popup.launch() return def __eventWBScriptPopupApply(self, playerID, userData, popupReturn): if (popupReturn.getEditBoxString(0)): szScriptName = popupReturn.getEditBoxString(0) CvScreensInterface.getWorldBuilderScreen().setScriptCB(szScriptName) return def __eventWBStartYearPopupBegin(self, argsList): popup = PyPopup.PyPopup(CvUtil.EventWBStartYearPopup, EventContextTypes.EVENTCONTEXT_ALL) popup.createSpinBox(0, "", gc.getGame().getStartYear(), 1, 5000, -5000) popup.launch() return def __eventWBStartYearPopupApply(self, playerID, userData, popupReturn): iStartYear = popupReturn.getSpinnerWidgetValue(int(0)) print iStartYear CvScreensInterface.getWorldBuilderScreen().setStartYearCB(iStartYear) return