home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2006 January / Gamestar_80_2006-01_dvd.iso / Dema / Civilization4 / data1.cab / Civ4DemoComponent / Assets / Python / Screens / CvReplayScreen.py < prev    next >
Encoding:
Python Source  |  2005-11-09  |  13.2 KB  |  364 lines

  1. ## Sid Meier's Civilization 4
  2. ## Copyright Firaxis Games 2005
  3. from CvPythonExtensions import *
  4. import CvUtil
  5. import ScreenInput
  6. import time
  7. import re
  8. import CvScreensInterface
  9.  
  10. # globals
  11. gc = CyGlobalContext()
  12. ArtFileMgr = CyArtFileMgr()
  13. localText = CyTranslator()
  14.  
  15. class CvReplayScreen:
  16.     "Replay Screen for end of game"
  17.  
  18.     def __init__(self, screenId):
  19.         return
  20.  
  21.         self.screenId = screenId
  22.         self.REPLAY_SCREEN_NAME = "ReplayScreen"
  23.         self.INTERFACE_ART_INFO = "TECH_BG"
  24.  
  25.         self.WIDGET_ID = "ReplayScreenWidget"
  26.         self.EXIT_ID = "ReplayScreenExitWidget"
  27.         self.BACKGROUND_ID = "ReplayScreenBackground"
  28.  
  29.         self.Z_BACKGROUND = -6.1
  30.         self.Z_CONTROLS = self.Z_BACKGROUND - 0.2
  31.         self.DZ = -0.2
  32.  
  33.         self.X_SCREEN = 500
  34.         self.Y_SCREEN = 396
  35.         self.W_SCREEN = 1024
  36.         self.H_SCREEN = 768
  37.         self.Y_TITLE = 8
  38.         self.BORDER_WIDTH = 4
  39.         self.W_HELP_AREA = 200
  40.         
  41.         self.X_EXIT = 994
  42.         self.Y_EXIT = 726
  43.                         
  44.         self.X_PLAY = 50
  45.         self.Y_PLAY = 730
  46.  
  47.         self.X_FORWARD = 200
  48.         self.Y_FORWARD = 730
  49.         
  50.         self.X_SPEED = 520
  51.         self.Y_SPEED = 745
  52.         
  53.         self.X_SLIDER = 475
  54.         self.Y_SLIDER = 725
  55.         self.W_SLIDER = 100
  56.         self.H_SLIDER = 15
  57.         self.NUM_SLIDER_STOPS = 5
  58.         
  59.         self.nWidgetCount = 0
  60.         
  61.         self.X_MAP = 50
  62.         self.Y_MAP = 100
  63.         self.W_MAP = 550
  64.         self.H_MAP_MAX = 400
  65.         
  66.         self.X_TEXT = 625
  67.         self.Y_TEXT = 100
  68.         self.W_TEXT = 350
  69.         self.H_TEXT = 580
  70.         
  71.         self.TIME_STEP = (1.0, 0.5, 0.25, 0.125, 0.0625)
  72.                 
  73.         self.X_GRAPH = 50
  74.         self.W_GRAPH = 550
  75.         
  76.         self.replayInfo = None
  77.         self.bPlaying = False
  78.         
  79.     def setReplayInfo(self, replayInfo):
  80.         self.replayInfo = replayInfo
  81.         
  82.     def getScreen(self):
  83.         return CyGInterfaceScreen(self.REPLAY_SCREEN_NAME, self.screenId)
  84.  
  85.     def hideScreen(self):
  86.         screen = self.getScreen()
  87.         screen.hideScreen()    
  88.         
  89.     # Screen construction function
  90.     def showScreen(self, bFromHallOfFame):
  91.         return
  92.     
  93.         # Create a new screen
  94.         screen = self.getScreen()
  95.         if screen.isActive():
  96.             return
  97.         screen.setRenderInterfaceOnly(True);
  98.         screen.showScreen(PopupStates.POPUPSTATE_IMMEDIATE, False)
  99.  
  100.         self.EXIT_TEXT = u"<font=4>" + localText.getText("TXT_KEY_PEDIA_SCREEN_EXIT", ()).upper() + u"</font>"
  101.         self.PLAY_TEXT = u"<font=4>" + localText.getText("TXT_KEY_REPLAY_SCREEN_PLAY", ()).upper() + u"</font>"
  102.         self.FORWARD_TEXT = u"<font=4>" + localText.getText("TXT_KEY_REPLAY_SCREEN_NEXT", ()).upper() + u"</font>"
  103.         self.STOP_TEXT = u"<font=4>" + localText.getText("TXT_KEY_REPLAY_SCREEN_STOP", ()).upper() + u"</font>"
  104.         self.SPEED_TEXT = localText.getText("TXT_KEY_REPLAY_SCREEN_SPEED", ())
  105.             
  106.         self.bPlaying = False
  107.         self.fLastUpdate = 0.
  108.         self.iSpeed = 2
  109.         self.iLastTurnShown = -1
  110.         self.bFromHallOfFame = bFromHallOfFame
  111.         self.bDone = False
  112.         
  113.         if not bFromHallOfFame:
  114.             self.replayInfo = CyGame().getReplayInfo()
  115.             if self.replayInfo.isNone():
  116.                 self.replayInfo = CyReplayInfo()
  117.                 self.replayInfo.createInfo()
  118.                 
  119.         self.iTurn = self.replayInfo.getInitialTurn()
  120.                     
  121.         self.deleteAllWidgets()
  122.     
  123.         # Controls
  124.         self.szForwardId = self.getNextWidgetName()
  125.         self.szPlayId = self.getNextWidgetName()
  126.         
  127.         # Set the background widget and exit button
  128.         screen.setDimensions(screen.centerX(0), screen.centerY(0), self.W_SCREEN, self.H_SCREEN)
  129.         screen.addDDSGFC(self.BACKGROUND_ID, ArtFileMgr.getInterfaceArtInfo("SCREEN_BG_OPAQUE").getPath(), 0, 0, self.W_SCREEN, self.H_SCREEN, WidgetTypes.WIDGET_GENERAL, -1, -1 )
  130.         screen.addPanel( "TechTopPanel", u"", u"", True, False, 0, 0, self.W_SCREEN, 55, PanelStyles.PANEL_STYLE_TOPBAR )
  131.         screen.addPanel( "TechBottomPanel", u"", u"", True, False, 0, 713, self.W_SCREEN, 55, PanelStyles.PANEL_STYLE_BOTTOMBAR )
  132.         screen.showWindowBackground(False)
  133.         screen.setText(self.EXIT_ID, "", self.EXIT_TEXT, CvUtil.FONT_RIGHT_JUSTIFY, self.X_EXIT, self.Y_EXIT, 0, FontTypes.TITLE_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1 )
  134.  
  135.         # Header...
  136.         self.szHeader = self.getNextWidgetName()
  137.         screen.setLabel(self.szHeader, "Background", u"<font=4b>" + localText.getText("TXT_KEY_REPLAY_SCREEN_TITLE", ()).upper() + u"</font>", CvUtil.FONT_CENTER_JUSTIFY, self.X_SCREEN, self.Y_TITLE, self.Z_CONTROLS, FontTypes.TITLE_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1 )
  138.  
  139.         # Minimap initialization
  140.         self.H_MAP = (self.W_MAP * self.replayInfo.getMapHeight()) / self.replayInfo.getMapWidth() 
  141.         if (self.H_MAP > self.H_MAP_MAX):
  142.             self.W_MAP = (self.H_MAP_MAX * self.replayInfo.getMapWidth()) / self.replayInfo.getMapHeight()
  143.             self.H_MAP = self.H_MAP_MAX
  144.             
  145.         screen.setMinimapMap(self.replayInfo, self.X_MAP, self.X_MAP + self.W_MAP, self.Y_MAP, self.Y_MAP + self.H_MAP, self.Z_CONTROLS)
  146.         screen.updateMinimapSection(True)
  147.         screen.setMinimapMode(MinimapModeTypes.MINIMAPMODE_REPLAY)
  148.  
  149.         # add pane for text
  150.         #mainPanelName = self.getNextWidgetName()
  151.         #screen.addPanel(mainPanelName, "", "", True, True, self.X_TEXT, self.Y_TEXT, self.W_TEXT, self.H_TEXT, PanelStyles.PANEL_STYLE_IN)
  152.         self.szAreaId = self.getNextWidgetName()
  153.         screen.addListBoxGFC(self.szAreaId, "", self.X_TEXT, self.Y_TEXT, self.W_TEXT, self.H_TEXT, TableStyles.TABLE_STYLE_STANDARD)
  154.         screen.enableSelect(self.szAreaId, False)
  155.                 
  156.         self.Y_GRAPH = self.Y_MAP + self.H_MAP + 15
  157.         self.H_GRAPH = 680 - self.Y_GRAPH
  158.         self.szGraph = self.getNextWidgetName()
  159.         screen.addGraphWidget(self.szGraph, "Background", ArtFileMgr.getInterfaceArtInfo("POPUPS_BACKGROUND_TRANSPARENT").getPath(), self.X_GRAPH, self.Y_GRAPH, self.Z_CONTROLS, self.W_GRAPH, self.H_GRAPH, WidgetTypes.WIDGET_GENERAL, -1, -1)
  160.  
  161.         self.initGraph()
  162.         
  163.         # Forward
  164.         screen.setText(self.szForwardId, "Background", self.FORWARD_TEXT, CvUtil.FONT_LEFT_JUSTIFY, self.X_FORWARD, self.Y_FORWARD, self.Z_CONTROLS, FontTypes.TITLE_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1 )
  165.  
  166.         # Play
  167.         screen.setText(self.szPlayId, "Background", self.PLAY_TEXT, CvUtil.FONT_LEFT_JUSTIFY, self.X_PLAY, self.Y_PLAY, self.Z_CONTROLS, FontTypes.TITLE_FONT, WidgetTypes.WIDGET_GENERAL, 1, -1 )        
  168.  
  169.  
  170.         # Speed Slider
  171.         self.szSliderTextId = self.getNextWidgetName()
  172.         screen.setLabel(self.szSliderTextId, "Background", self.SPEED_TEXT, CvUtil.FONT_CENTER_JUSTIFY, self.X_SPEED, self.Y_SPEED, self.Z_CONTROLS, FontTypes.GAME_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)
  173.         
  174.         self.szSliderId = self.getNextWidgetName()
  175.         screen.addSlider(self.szSliderId, self.X_SLIDER, self.Y_SLIDER, self.W_SLIDER, self.H_SLIDER, self.iSpeed - 1, 0, self.NUM_SLIDER_STOPS-1, WidgetTypes.WIDGET_GENERAL, -1, -1, False);
  176.  
  177.         self.showEvents(self.iTurn, False)
  178.                                                             
  179.         return
  180.         
  181.     def showEvents(self, iTurn, bSilent):
  182.  
  183.         self.iTurn = iTurn
  184.         screen = self.getScreen()
  185.         
  186.         if (iTurn < self.replayInfo.getInitialTurn()):
  187.             self.iTurn = self.replayInfo.getInitialTurn()
  188.             self.iLastTurnShown = -1
  189.             return
  190.         elif iTurn >= self.replayInfo.getFinalTurn() and self.iLastTurnShown > self.replayInfo.getFinalTurn():
  191.             self.iTurn = self.replayInfo.getInitialTurn()
  192.             self.iLastTurnShown = -1
  193.             self.resetData()
  194.             self.showEvents(self.iTurn, False)
  195.             return
  196.             
  197.  
  198.         szTurnDate = CyGameTextMgr().getDateStr(self.iTurn, false, self.replayInfo.getCalendar(), self.replayInfo.getStartYear(), self.replayInfo.getGameSpeed())
  199.         screen.deleteWidget(self.szHeader)
  200.         screen.setLabel(self.szHeader, "Background", u"<font=4b>" + szTurnDate + u"<font>", CvUtil.FONT_CENTER_JUSTIFY, self.X_SCREEN, self.Y_TITLE, self.Z_CONTROLS, FontTypes.TITLE_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1 )
  201.  
  202.         events = []
  203.         bFound = False
  204.         bDone = False
  205.         i = 0
  206.         while (i < self.replayInfo.getNumReplayMessages() and not bDone):
  207.             if     (self.replayInfo.getReplayMessageTurn(i) <= iTurn and self.replayInfo.getReplayMessageTurn(i) > self.iLastTurnShown):
  208.                 events.append(i)
  209.                 bFound = True
  210.             else:
  211.                 if (bFound):
  212.                     bDone = True
  213.             i += 1
  214.     
  215.         for iLoopEvent in events:
  216.  
  217.             szEventDate = CyGameTextMgr().getDateStr(self.replayInfo.getReplayMessageTurn(iLoopEvent), false, self.replayInfo.getCalendar(), self.replayInfo.getStartYear(), self.replayInfo.getGameSpeed())
  218.  
  219.             szText = self.replayInfo.getReplayMessageText(iLoopEvent)
  220.             iX = self.replayInfo.getReplayMessagePlotX(iLoopEvent)
  221.             iY = self.replayInfo.getReplayMessagePlotY(iLoopEvent)
  222.             eMessageType = self.replayInfo.getReplayMessageType(iLoopEvent)
  223.             eColor = self.replayInfo.getReplayMessageColor(iLoopEvent)
  224.                 
  225.  
  226.             if (szText != "" and not bSilent):            
  227.                 szTextNoColor = re.sub("<color=.*?>", "", szText)
  228.                 szText = re.sub("</color>", "", szTextNoColor)
  229.                         
  230.                 szText =  u"<font=2>" + szEventDate + u": " + szText + u"</font>"
  231.                 szText =localText.changeTextColor(szText, eColor)
  232.                 screen.prependListBoxString(self.szAreaId, szText, WidgetTypes.WIDGET_GENERAL, -1, -1, CvUtil.FONT_LEFT_JUSTIFY )
  233.             
  234.             if (eMessageType == ReplayMessageTypes.REPLAY_MESSAGE_PLOT_OWNER_CHANGE):
  235.                 iPlayer = self.replayInfo.getReplayMessagePlayer(iLoopEvent)
  236.                 if iPlayer != -1:
  237.                     screen.setMinimapColor(MinimapModeTypes.MINIMAPMODE_REPLAY, iX, iY, self.replayInfo.getColor(iPlayer), 0.6)
  238.                 else:
  239.                     screen.setMinimapColor(MinimapModeTypes.MINIMAPMODE_REPLAY, iX, iY, gc.getInfoTypeForString("COLOR_CLEAR"), 0.6)
  240.             else:
  241.                 if (iX > -1 and iY > -1 and not bSilent):
  242.                     screen.minimapFlashPlot(iX, iY, gc.getInfoTypeForString("COLOR_WHITE"), 10)
  243.         if (self.yMessage > self.H_TEXT):                    
  244.             screen.scrollableAreaScrollToBottom(self.szAreaId)
  245.         
  246.         # Power Graph
  247.         iLoopTurn = self.iLastTurnShown
  248.         while (iLoopTurn <= self.iTurn):
  249.             iTotalScore = 0
  250.             for iLoopPlayer in range(self.replayInfo.getNumPlayers()):
  251.                 iTotalScore += self.replayInfo.getPlayerScore(iLoopPlayer, iLoopTurn)
  252.             if (iTotalScore > 0):
  253.                 iScore = iTotalScore
  254.                 for iLoopPlayer in range(self.replayInfo.getNumPlayers()):
  255.                     screen.addGraphData(self.szGraph, iLoopTurn, (1.0 * iScore) / iTotalScore, iLoopPlayer)
  256.                     iScore -= self.replayInfo.getPlayerScore(iLoopPlayer, iLoopTurn)
  257.             iLoopTurn += 1
  258.             
  259.         self.iLastTurnShown = iTurn
  260.  
  261.     # returns a unique ID for a widget in this screen
  262.     def getNextWidgetName(self):
  263.         szName = self.WIDGET_ID + str(self.nWidgetCount)
  264.         self.nWidgetCount += 1
  265.         return szName
  266.         
  267.     def deleteAllWidgets(self):
  268.         screen = self.getScreen()
  269.         i = self.nWidgetCount - 1
  270.         while (i >= 0):
  271.             self.nWidgetCount = i
  272.             screen.deleteWidget(self.getNextWidgetName())
  273.             i -= 1
  274.  
  275.         self.nWidgetCount = 0        
  276.         self.yMessage = 5
  277.         
  278.     def resetMinimapColor(self):
  279.         screen = self.getScreen()
  280.         for iX in range(self.replayInfo.getMapWidth()):
  281.             for iY in range(self.replayInfo.getMapHeight()):
  282.                 screen.setMinimapColor(MinimapModeTypes.MINIMAPMODE_REPLAY, iX, iY, gc.getInfoTypeForString("COLOR_CLEAR"), 0.6)
  283.  
  284.     def resetData(self):
  285.         screen = self.getScreen()
  286.         self.resetMinimapColor()
  287.         for iPlayer in range(self.replayInfo.getNumPlayers()):
  288.             screen.clearGraphData(self.szGraph, iPlayer)
  289.         self.initGraph()            
  290.         screen.clearListBoxGFC(self.szAreaId)
  291.         
  292.         
  293.     def initGraph(self):
  294.         screen = self.getScreen()
  295.         for iPlayer in range(self.replayInfo.getNumPlayers()):
  296.             screen.addGraphLayer(self.szGraph, iPlayer, self.replayInfo.getColor(iPlayer));
  297.  
  298.         screen.setGraphLabelX(self.szGraph, localText.getText("TXT_KEY_REPLAY_SCREEN_TURNS", ()));
  299.         screen.setGraphLabelY(self.szGraph, localText.getText("TXT_KEY_REPLAY_SCREEN_SCORE", ()));
  300.         screen.setGraphYDataRange(self.szGraph, 0.0, 1.0);
  301.         
  302.     def setPlaying(self, bPlaying):
  303.         if bPlaying != self.bPlaying:
  304.             self.bPlaying = bPlaying
  305.             screen = self.getScreen()
  306.             if (self.bPlaying):
  307.                 screen.hide(self.szForwardId)
  308.                 screen.modifyString(self.szPlayId, self.STOP_TEXT, 0)
  309.                 screen.show(self.szSliderId)
  310.                 screen.show(self.szSliderTextId)
  311.             else:
  312.                 screen.show(self.szForwardId)
  313.                 screen.modifyString(self.szPlayId, self.PLAY_TEXT, 0)        
  314.                 screen.hide(self.szSliderId)
  315.                 screen.hide(self.szSliderTextId)
  316.                                                                                 
  317.     # handle the input for this screen...
  318.     def handleInput (self, inputClass):
  319.     
  320.         szWidgetName = inputClass.getFunctionName() + str(inputClass.getID())
  321.  
  322.         if (inputClass.getNotifyCode() == NotifyCode.NOTIFY_CLICKED):
  323.             if (inputClass.getFunctionName() == self.EXIT_ID):
  324.                 screen = self.getScreen()
  325.                 screen.hideScreen()
  326.  
  327.             elif (szWidgetName == self.szPlayId):
  328.                 self.setPlaying(not self.bPlaying)
  329.                 if self.bPlaying:
  330.                     if self.iTurn >= self.replayInfo.getFinalTurn():
  331.                         self.resetData()
  332.                         self.showEvents(self.replayInfo.getInitialTurn()-1, False)
  333.                     else:
  334.                         self.showEvents(self.iTurn + 1, False)
  335.             elif (szWidgetName == self.szForwardId):
  336.                 if (not self.bPlaying):
  337.                     self.showEvents(self.iTurn + 1, False)
  338.         elif (inputClass.getNotifyCode() == NotifyCode.NOTIFY_SLIDER_NEWSTOP):
  339.             if (szWidgetName == self.szSliderId):
  340.                 screen = self.getScreen()
  341.                 self.iSpeed = inputClass.getData() + 1
  342.                                     
  343.         return 0
  344.  
  345.     def update(self, fDelta):
  346.     
  347.         screen = self.getScreen()
  348.  
  349.         screen.updateMinimap(fDelta)
  350.  
  351.         if self.bPlaying:
  352.             if self.iTurn < self.replayInfo.getFinalTurn():
  353.                 self.fLastUpdate += max(fDelta, 0.02)
  354.                 iTurnJump = int(self.fLastUpdate / self.TIME_STEP[self.iSpeed - 1])
  355.                     
  356.                 if (iTurnJump > 0):
  357.                     self.fLastUpdate = 0.0
  358.                     self.showEvents(self.iTurn + iTurnJump, False)
  359.  
  360.             elif self.iTurn >= self.replayInfo.getFinalTurn():
  361.                 self.setPlaying(False)
  362.                 self.fLastUpdate = 0.0
  363.  
  364.