## 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
import pickle
# BUG - Next War Merge - start
import SdToolkit
SD_MOD_ID = "NextWar"
SD_NUKES_ID = "NumNukes"
# BUG - Next War Merge - end
gc = CyGlobalContext()
localText = CyTranslator()
PyPlayer = PyHelpers.PyPlayer
PyInfo = PyHelpers.PyInfo
# globals
###################################################
g_iNumNukesWarningMessage = 7
g_iNumNukesGameOver = 20
class DiplomacyEventManager:
def __init__(self, eventmanager):
eventManager.addEventHandler("GameStart", self.onGameStart)
eventManager.addEventHandler("OnLoad", self.onLoadGame)
eventManager.addEventHandler("GameStart", self.onGameStart)
eventManager.addEventHandler("BeginGameTurn", self.onBeginGameTurn)
eventManager.addEventHandler("cityRazed", self.onCityRazed)
eventManager.addEventHandler("cityDoTurn", self.onCityDoTurn)
###circus hagenbeck start part 1
self.oldcity = [-1,-1]
###circus hagenbeck end part 1
# Next War tracks cities that have been razed
self.iArcologyCityID = -1
def onLoadGame(self, argsList):
CvAdvisorUtils.resetNoLiberateCities()
# BUG - Next War Merge - start
# convert old script data list to SdToolkit for old saves
data = gc.getGame().getScriptData()
if isinstance(data, list):
CvUtil.pyPrint('converting script data: %s' % data)
iNukes = list[0]
gc.getGame().setScriptData("")
SdToolkit.sdSetGlobal(SD_MOD_ID, SD_NUKES_ID, iNukes)
# BUG - Next War Merge - end
return 0
def onGameStart(self, argsList):
'Called at the start of the game'
self.initScriptData()
### circus hagenbeck start part 2
if (gc.getGame().getGameTurnYear() <> gc.getDefineINT("START_YEAR")):
for iPlayer in range (gc.getMAX_PLAYERS()):
player = gc.getPlayer(iPlayer)
if player.isAlive():
numbuildings = player.countNumBuildings(gc.getInfoTypeForString("BUILDING_CIRCUS_HAGENBECK"))
if numbuildings>0:
for iCity in range(player.getNumCities()):
pCity = player.getCity(iCity)
if pCity.getNumBuilding(gc.getInfoTypeForString("BUILDING_CIRCUS_HAGENBECK"))>0:
self.oldcity = [iPlayer,iCity]
return
###circus hagenbeck end part 2
# Are we using the scenario file? If so, then show the backstory popup
if (CyMap().plot(0,0).getScriptData() == "Scenario"):
for iPlayer in range(gc.getMAX_PLAYERS()):
player = gc.getPlayer(iPlayer)
if (player.isAlive() and player.isHuman()):
popupInfo = CyPopupInfo()
popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_TEXT)
szTitle = u"<font=4b>" + localText.getText("TXT_KEY_NEXT_WAR_BACKSTORY_TITLE", ()) + u"</font>"
szBody = u"<font=3>" + localText.getText("TXT_KEY_NEXT_WAR_BACKSTORY_TEXT", ()) + u"</font>"
popupInfo.setText(szTitle + u"\n\n" + szBody)
popupInfo.addPopup(iPlayer)
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()
def onBeginGameTurn(self, argsList):
'Called at the beginning of the end of each turn'
iGameTurn = argsList[0]
###circus hagenbeck start part 3
if (CyGame().getTurnYear(iGameTurn)>=1890) and ( iGameTurn % 3 ==0 ):
counter = 0
while True:
counter = counter+1
if counter>=100:break
dice = gc.getGame().getMapRand()
iPlayer = dice.get(gc.getMAX_PLAYERS (), "Players")
pPlayer = gc.getPlayer(iPlayer)
if pPlayer.isNone():continue
if pPlayer.isAlive():
iCity = dice.get(pPlayer.getNumCities () , "Cities" )
pCity = pPlayer.getCity(iCity)
if pCity.isNone():continue
pCity.setNumRealBuilding(gc.getInfoTypeForString("BUILDING_CIRCUSHAGENBECK"),1)
CyInterface().addMessage(iPlayer,false,20,CyTranslator().getText("TXT_KEY_CIRCUS_MOVED",(pCity.getName (),pCity.getName ())),'',0,'Art/Interface/Buttons/General/happy_person.dds',ColorTypes(gc.getInfoTypeForString("COLOR_GREEN")), pCity.getX(), pCity.getY(), True,True)
if self.oldcity <>[-1,-1]:
otherplayer = gc.getPlayer(self.oldcity[0])
othercity = otherplayer.getCity(self.oldcity[1])
if not othercity.isNone():
othercity.setNumRealBuilding(gc.getInfoTypeForString("BUILDING_CIRCUSHAGENBECK"),0)
CyInterface().addMessage(self.oldcity[0],false,20,CyTranslator().getText("TXT_KEY_CIRCUS_LOST",(othercity.getName (),othercity.getName ())),'',0,'Art/Interface/Buttons/General/warning_popup.dds',ColorTypes(gc.getInfoTypeForString("COLOR_RED")), othercity.getX(), othercity.getY(), True,True)
self.oldcity = [iPlayer,iCity]
break
###circus hagenbeck end part 3
CvTopCivs.CvTopCivs().turnChecker(iGameTurn)
if (CyMap().plot(0,0).getScriptData() == "Scenario"):
if iGameTurn!=0:
if iGameTurn%2 == 0:
self.doCheckDepletion()
def onCityRazed(self, argsList):
'City Razed'
city, iPlayer = argsList
iOwner = city.findHighestCulture()
# Partisans!
if city.getPopulation > 1 and iOwner != -1 and iPlayer != -1:
owner = gc.getPlayer(iOwner)
if not owner.isBarbarian() and owner.getNumCities() > 0:
if gc.getTeam(owner.getTeam()).isAtWar(gc.getPlayer(iPlayer).getTeam()):
if gc.getNumEventTriggerInfos() > 0: # prevents mods that don't have events from getting an error
iEvent = CvUtil.findInfoTypeNum(gc.getEventTriggerInfo, gc.getNumEventTriggerInfos(),'EVENTTRIGGER_PARTISANS')
if iEvent != -1 and gc.getGame().isEventActive(iEvent) and owner.getEventTriggerWeight(iEvent) < 0:
triggerData = owner.initTriggeredData(iEvent, true, -1, city.getX(), city.getY(), iPlayer, city.getID(), -1, -1, -1, -1)
#Raze the Arcology
owner = PyPlayer(city.getOwner())
razor = PyPlayer(iPlayer)
self.iArcologyCityID = -1
if city.getNumRealBuilding(gc.getInfoTypeForString("BUILDING_ARCOLOGY")) or city.getNumRealBuilding(gc.getInfoTypeForString("BUILDING_ARCOLOGY_SHIELDING")) or city.getNumRealBuilding(gc.getInfoTypeForString("BUILDING_DEFLECTOR_SHIELDING")):
self.iArcologyCityID = city.getID()
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 onCityDoTurn(self, argsList):
'City Production'
pCity = argsList[0]
iPlayer = argsList[1]
# no anger defying UN resolutions start #
iGovernmentCivicOption = CvUtil.findInfoTypeNum(gc.getCivicOptionInfo,gc.getNumCivicOptionInfos(),'CIVICOPTION_GOVERNMENT')
iPoliceState = CvUtil.findInfoTypeNum(gc.getCivicInfo,gc.getNumCivicInfos(),'CIVIC_POLICE_STATE')
pPlayer = gc.getPlayer(iPlayer)
iGovernmentCivic = pPlayer.getCivics(iGovernmentCivicOption)
if (iGovernmentCivic == iPoliceState):
pCity.changeDefyResolutionAngerTimer(pCity.getDefyResolutionAngerTimer())
# no anger defying UN resolutions end #
CvAdvisorUtils.cityAdvise(pCity, iPlayer)
####### Next War Functions ######
## Added Fort to doCheckDepletion -- otherwise bonuses worked via forts would never be subject to resource depletion. JKP
def doCheckDepletion(self):
self.doCheckWorkedResource("BONUS_ALUMINUM", "IMPROVEMENT_MINE", 880)
self.doCheckWorkedResource("BONUS_ALUMINUM", "IMPROVEMENT_FORT", 880)
self.doCheckWorkedResource("BONUS_BANANA", "IMPROVEMENT_PLANTATION", 1120)
self.doCheckWorkedResource("BONUS_BANANA", "IMPROVEMENT_FORT", 1120)
self.doCheckWorkedResource("BONUS_CLAM", "IMPROVEMENT_FISHING_BOATS", 880)
self.doCheckWorkedResource("BONUS_COAL", "IMPROVEMENT_MINE", 880)
self.doCheckWorkedResource("BONUS_COAL", "IMPROVEMENT_FORT", 880)
self.doCheckWorkedResource("BONUS_COPPER", "IMPROVEMENT_MINE", 880)
self.doCheckWorkedResource("BONUS_COPPER", "IMPROVEMENT_FORT", 880)
self.doCheckWorkedResource("BONUS_CORN", "IMPROVEMENT_FARM", 1120)
self.doCheckWorkedResource("BONUS_CORN", "IMPROVEMENT_FORT", 1120)
self.doCheckWorkedResource("BONUS_COW", "IMPROVEMENT_PASTURE", 1120)
self.doCheckWorkedResource("BONUS_COW", "IMPROVEMENT_FORT", 1120)
self.doCheckWorkedResource("BONUS_CRAB", "IMPROVEMENT_FISHING_BOATS", 1120)
self.doCheckWorkedResource("BONUS_DEER", "IMPROVEMENT_CAMP", 780)
self.doCheckWorkedResource("BONUS_DEER", "IMPROVEMENT_FORT", 780)
self.doCheckWorkedResource("BONUS_DYE", "IMPROVEMENT_PLANTATION", 1120)
self.doCheckWorkedResource("BONUS_DYE", "IMPROVEMENT_FORT", 1120)
self.doCheckWorkedResource("BONUS_FISH", "IMPROVEMENT_FISHING_BOATS", 880)
self.doCheckWorkedResource("BONUS_FUR", "IMPROVEMENT_CAMP", 560)
self.doCheckWorkedResource("BONUS_FUR", "IMPROVEMENT_FORT", 560)
self.doCheckWorkedResource("BONUS_GEMS", "IMPROVEMENT_MINE", 1120)
self.doCheckWorkedResource("BONUS_GEMS", "IMPROVEMENT_FORT", 1120)
self.doCheckWorkedResource("BONUS_GOLD", "IMPROVEMENT_MINE", 880)
self.doCheckWorkedResource("BONUS_GOLD", "IMPROVEMENT_FORT", 880)
self.doCheckWorkedResource("BONUS_HORSE", "IMPROVEMENT_PASTURE", 1120)
self.doCheckWorkedResource("BONUS_HORSE", "IMPROVEMENT_FORT", 1120)
self.doCheckWorkedResource("BONUS_IRON", "IMPROVEMENT_MINE", 880)
self.doCheckWorkedResource("BONUS_IRON", "IMPROVEMENT_FORT", 880)
self.doCheckWorkedResource("BONUS_IVORY", "IMPROVEMENT_CAMP", 560)
self.doCheckWorkedResource("BONUS_IVORY", "IMPROVEMENT_FORT", 560)
self.doCheckWorkedResource("BONUS_MARBLE", "IMPROVEMENT_QUARRY", 750)
self.doCheckWorkedResource("BONUS_MARBLE", "IMPROVEMENT_FORT", 750)
self.doCheckWorkedResource("BONUS_OIL", "IMPROVEMENT_WELL", 880)
self.doCheckWorkedResource("BONUS_OIL", "IMPROVEMENT_FORT", 880)
self.doCheckWorkedResource("BONUS_OIL", "IMPROVEMENT_OFFSHORE_PLATFORM", 880)
self.doCheckWorkedResource("BONUS_PIG", "IMPROVEMENT_PASTURE", 1120)
self.doCheckWorkedResource("BONUS_PIG", "IMPROVEMENT_FORT", 1120)
self.doCheckWorkedResource("BONUS_RICE", "IMPROVEMENT_FARM", 1120)
self.doCheckWorkedResource("BONUS_RICE", "IMPROVEMENT_FORT", 1120)
self.doCheckWorkedResource("BONUS_SILK", "IMPROVEMENT_PLANTATION", 1120)
self.doCheckWorkedResource("BONUS_SILK", "IMPROVEMENT_FORT", 1120)
self.doCheckWorkedResource("BONUS_SILVER", "IMPROVEMENT_MINE", 880)
self.doCheckWorkedResource("BONUS_SILVER", "IMPROVEMENT_FORT", 880)
self.doCheckWorkedResource("BONUS_SPICES", "IMPROVEMENT_PLANTATION", 1120)
self.doCheckWorkedResource("BONUS_SPICES", "IMPROVEMENT_FORT", 1120)
self.doCheckWorkedResource("BONUS_STONE", "IMPROVEMENT_QUARRY", 750)
self.doCheckWorkedResource("BONUS_STONE", "IMPROVEMENT_FORT", 750)
self.doCheckWorkedResource("BONUS_SUGAR", "IMPROVEMENT_PLANTATION", 1120)
self.doCheckWorkedResource("BONUS_SUGAR", "IMPROVEMENT_FORT", 1120)
self.doCheckWorkedResource("BONUS_URANIUM", "IMPROVEMENT_MINE", 880)
self.doCheckWorkedResource("BONUS_URANIUM", "IMPROVEMENT_FORT", 880)
self.doCheckWorkedResource("BONUS_WHALE", "IMPROVEMENT_WHALING_BOATS", 560)
self.doCheckWorkedResource("BONUS_WHEAT", "IMPROVEMENT_FARM", 1120)
self.doCheckWorkedResource("BONUS_WHEAT", "IMPROVEMENT_FORT", 1120)
self.doCheckWorkedResource("BONUS_WINE", "IMPROVEMENT_WINERY", 1120)
self.doCheckWorkedResource("BONUS_WINE", "IMPROVEMENT_FORT", 1120)
def doCheckWorkedResource(self, bonus, improvement, randomInt):
iBonus = CvUtil.findInfoTypeNum(gc.getBonusInfo, gc.getNumBonusInfos(), bonus)
if (iBonus == -1):
return
lValidPlots = self.getPlotListbyBonus(iBonus)
if len(lValidPlots) == 0:
return
##If you have the requisite improvement (incl. fort) or if the plot is being worked by a City, continue.
for plot in lValidPlots:
P = False
if plot.getImprovementType() == CvUtil.findInfoTypeNum(gc.getImprovementInfo, gc.getNumImprovementInfos(), improvement):
P = True
elif plot.isCity():
P = True
if P == True:
if self.getRandomNumber(randomInt) == 0:
pBonusInfo = gc.getBonusInfo(iBonus)
plot.setBonusType(-1)
szTitle = localText.getText("TEXT_KEY_NEXT_WAR_RESOURCE_DEPLETED_TITLE", ())# (pBonusInfo.getDescription(), plotgetX(), plot.getY()))
#szText = localText.getText("TEXT_KEY_NEXT_WAR_RESOURCE_DEPLETED", (pBonusInfo.getDescription(), plot.getX(), plot.getY()))
#Not sure what the above commented out code for (debugging?) -- it was commented out in PM's original NextWar code. JKP1187
CyInterface().addMessage(plot.getOwner(), False, gc.getEVENT_MESSAGE_TIME(), szTitle, "AS2D_DISCOVERBONUS", InterfaceMessageTypes.MESSAGE_TYPE_MINOR_EVENT, pBonusInfo.getButton(), gc.getInfoTypeForString("COLOR_GREEN"), plot.getX(), plot.getY(), True, True)
else:
return
### Below are additional functions necessary to the activity of the resource depl'n code:
def getPlotListbyBonus(self, iBonus):
lPlots = []
totalPlots = gc.getMap().numPlots()
for i in range(totalPlots):
plot = gc.getMap().plotByIndex(i)
iOwner = plot.getOwner()
if (iOwner != -1):
if plot.getBonusType(gc.getPlayer(iOwner).getTeam()) == iBonus:
lPlots.append(plot)
return lPlots
def getRandomNumber(self, int):
return gc.getGame().getSorenRandNum(int, "Next War")
# BUG - Next War Merge - start
def initScriptData(self):
# Set default script data manually since we need defaults for all values in the array before any functions can be called on them
iDefaultNumNukesFired = 0
SdToolkit.sdSetGlobal(SD_MOD_ID, SD_NUKES_ID, iDefaultNumNukesFired)
def getGameNumNukes(self):
return SdToolkit.sdGetGlobal(SD_MOD_ID, SD_NUKES_ID)
def setGameNumNukes(self, iValue):
SdToolkit.sdSetGlobal(SD_MOD_ID, SD_NUKES_ID, iValue)
self.checkNukeStuff(iValue)
def changeGameNumNukes(self, iChange):
self.setGameNumNukes(self.getGameNumNukes() + iChange)
# BUG - Next War Merge - end