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

  1. ## Sid Meier's Civilization 4
  2. ## Copyright Firaxis Games 2005
  3. from CvPythonExtensions import *
  4. import string
  5. import CvUtil
  6. import ScreenInput
  7. import CvScreenEnums
  8. import CvPediaScreen        # base class
  9. import CvPediaTech
  10. import CvPediaUnit
  11. import CvPediaBuilding
  12. import CvPediaPromotion
  13. import CvPediaUnitChart
  14. import CvPediaBonus
  15. import CvPediaTerrain
  16. import CvPediaFeature
  17. import CvPediaImprovement
  18. import CvPediaCivic
  19. import CvPediaCivilization
  20. import CvPediaLeader
  21. import CvPediaSpecialist
  22. import CvPediaHistory
  23. import CvPediaProject
  24. import CvPediaReligion
  25.  
  26. # globals
  27. gc = CyGlobalContext()
  28. ArtFileMgr = CyArtFileMgr()
  29. localText = CyTranslator()
  30.  
  31. class CvPediaMain( CvPediaScreen.CvPediaScreen ):
  32.     "Civilopedia Main Screen"
  33.  
  34.     def __init__(self):
  35.     
  36.         self.PEDIA_MAIN_SCREEN_NAME = "PediaMainScreen"
  37.         self.INTERFACE_ART_INFO = "SCREEN_BG_OPAQUE"
  38.  
  39.         self.WIDGET_ID = "PediaMainWidget"
  40.         self.EXIT_ID = "PediaMainExitWidget"
  41.         self.BACKGROUND_ID = "PediaMainBackground"
  42.         self.TOP_PANEL_ID = "PediaMainTopPanel"
  43.         self.BOTTOM_PANEL_ID = "PediaMainBottomPanel"
  44.         self.BACK_ID = "PediaMainBack"
  45.         self.NEXT_ID = "PediaMainForward"
  46.         self.TOP_ID = "PediaMainTop"
  47.         self.LIST_ID = "PediaMainList"
  48.  
  49.         self.X_SCREEN = 500
  50.         self.Y_SCREEN = 396
  51.         self.W_SCREEN = 1024
  52.         self.H_SCREEN = 768
  53.         self.Y_TITLE = 8
  54.         self.DY_TEXT = 45
  55.         
  56.         self.X_EXIT = 925
  57.         self.Y_EXIT = 730
  58.                         
  59.         self.X_BACK = 50
  60.         self.Y_BACK = 730
  61.  
  62.         self.X_FORWARD = 200
  63.         self.Y_FORWARD = 730
  64.         
  65.         self.X_MENU = 450
  66.         self.Y_MENU = 730
  67.  
  68.         self.BUTTON_SIZE = 64
  69.         self.BUTTON_COLUMNS = 9
  70.  
  71.         self.X_ITEMS_PANE = 30
  72.         self.Y_ITEMS_PANE = 80
  73.         self.H_ITEMS_PANE = 610
  74.         self.W_ITEMS_PANE = 740
  75.         self.ITEMS_MARGIN = 18
  76.         self.ITEMS_SEPARATION = 2
  77.                 
  78.         self.X_LINKS = 797
  79.         self.Y_LINKS = 51
  80.         self.H_LINKS = 665
  81.         self.W_LINKS = 225
  82.         
  83.         self.nWidgetCount = 0
  84.         
  85.         # screen instances
  86.         self.pediaTechScreen = CvPediaTech.CvPediaTech(self)
  87.         self.pediaUnitScreen = CvPediaUnit.CvPediaUnit(self)
  88.         self.pediaBuildingScreen = CvPediaBuilding.CvPediaBuilding(self)
  89.         self.pediaPromotionScreen = CvPediaPromotion.CvPediaPromotion(self)
  90.         self.pediaUnitChart = CvPediaUnitChart.CvPediaUnitChart(self)
  91.         self.pediaBonus = CvPediaBonus.CvPediaBonus(self)
  92.         self.pediaTerrain = CvPediaTerrain.CvPediaTerrain(self)
  93.         self.pediaFeature = CvPediaFeature.CvPediaFeature(self)
  94.         self.pediaImprovement = CvPediaImprovement.CvPediaImprovement(self)
  95.         self.pediaCivic = CvPediaCivic.CvPediaCivic(self)
  96.         self.pediaCivilization = CvPediaCivilization.CvPediaCivilization(self)
  97.         self.pediaLeader = CvPediaLeader.CvPediaLeader(self)
  98.         self.pediaSpecialist = CvPediaSpecialist.CvPediaSpecialist(self)
  99.         self.pediaProjectScreen = CvPediaProject.CvPediaProject(self)
  100.         self.pediaReligion = CvPediaReligion.CvPediaReligion(self)
  101.         self.pediaHistorical = CvPediaHistory.CvPediaHistory(self)
  102.                 
  103.         # used for navigating "forward" and "back" in civilopedia
  104.         self.pediaHistory = []
  105.         self.pediaFuture = []
  106.         
  107.         self.listCategories = []
  108.  
  109.         
  110.         self.iCategory = -1
  111.         self.iLastScreen = -1
  112.         self.iActivePlayer = -1
  113.                                 
  114.         self.mapCategories = { 
  115.             CivilopediaPageTypes.CIVILOPEDIA_PAGE_TECH    : self.placeTechs, 
  116.             CivilopediaPageTypes.CIVILOPEDIA_PAGE_UNIT    : self.placeUnits, 
  117.             CivilopediaPageTypes.CIVILOPEDIA_PAGE_BUILDING    : self.placeBuildings, 
  118.             }
  119.         
  120.     def getScreen(self):
  121.         return CyGInterfaceScreen(self.PEDIA_MAIN_SCREEN_NAME, CvScreenEnums.PEDIA_MAIN)
  122.         
  123.     def setPediaCommonWidgets(self):
  124.         self.EXIT_TEXT = u"<font=4>" + localText.getText("TXT_KEY_PEDIA_SCREEN_EXIT", ()).upper() + "</font>"
  125.         self.BACK_TEXT = u"<font=4>" + localText.getText("TXT_KEY_PEDIA_SCREEN_BACK", ()).upper() + "</font>"
  126.         self.FORWARD_TEXT = u"<font=4>" + localText.getText("TXT_KEY_PEDIA_SCREEN_FORWARD", ()).upper() + "</font>"
  127.         self.MENU_TEXT = u"<font=4>" + localText.getText("TXT_KEY_PEDIA_SCREEN_TOP", ()).upper() + "</font>"
  128.         
  129.         self.szCategoryTech = localText.getText("TXT_KEY_PEDIA_CATEGORY_TECH", ())        
  130.         self.szCategoryUnit = localText.getText("TXT_KEY_PEDIA_CATEGORY_UNIT", ())        
  131.         self.szCategoryBuilding = localText.getText("TXT_KEY_PEDIA_CATEGORY_BUILDING", ())        
  132.         
  133.         self.listCategories = [ self.szCategoryTech, 
  134.                                 self.szCategoryUnit, 
  135.                                 self.szCategoryBuilding]
  136.                                 
  137.         # Create a new screen
  138.         screen = self.getScreen()
  139.         screen.setRenderInterfaceOnly(True);
  140.         screen.showScreen(PopupStates.POPUPSTATE_IMMEDIATE, False)
  141.         
  142.         # Set background
  143.         screen.addDDSGFC(self.BACKGROUND_ID, ArtFileMgr.getInterfaceArtInfo("SCREEN_BG_OPAQUE").getPath(), 0, 0, self.W_SCREEN, self.H_SCREEN, WidgetTypes.WIDGET_GENERAL, -1, -1 )
  144.         screen.addPanel(self.TOP_PANEL_ID, u"", u"", True, False, 0, 0, self.W_SCREEN, 55, PanelStyles.PANEL_STYLE_TOPBAR )
  145.         screen.addPanel(self.BOTTOM_PANEL_ID, u"", u"", True, False, 0, 713, self.W_SCREEN, 55, PanelStyles.PANEL_STYLE_BOTTOMBAR )
  146.         screen.setDimensions(screen.centerX(0), screen.centerY(0), self.W_SCREEN, self.H_SCREEN)
  147.         
  148.         # Exit button
  149.         screen.setText(self.EXIT_ID, "Background", self.EXIT_TEXT, CvUtil.FONT_LEFT_JUSTIFY, self.X_EXIT, self.Y_EXIT, 0, FontTypes.TITLE_FONT, WidgetTypes.WIDGET_CLOSE_SCREEN, -1, -1)
  150.  
  151.         # Back
  152.         screen.setText(self.BACK_ID, "Background", self.BACK_TEXT, CvUtil.FONT_LEFT_JUSTIFY, self.X_BACK, self.Y_BACK, 0, FontTypes.TITLE_FONT, WidgetTypes.WIDGET_PEDIA_BACK, 1, -1)
  153.             
  154.         # Forward
  155.         screen.setText(self.NEXT_ID, "Background", self.FORWARD_TEXT, CvUtil.FONT_LEFT_JUSTIFY, self.X_FORWARD, self.Y_FORWARD, 0, FontTypes.TITLE_FONT, WidgetTypes.WIDGET_PEDIA_FORWARD, 1, -1)
  156.  
  157.         # List of items on the right
  158.         screen.addListBoxGFC(self.LIST_ID, "", self.X_LINKS, self.Y_LINKS, self.W_LINKS, self.H_LINKS, TableStyles.TABLE_STYLE_STANDARD)
  159.         screen.enableSelect(self.LIST_ID, True)
  160.         
  161.     # Screen construction function
  162.     def showScreen(self, iCategory):
  163.         self.iCategory = iCategory
  164.  
  165.         self.deleteAllWidgets()                        
  166.                             
  167.         screen = self.getScreen()
  168.         
  169.         bNotActive = (not screen.isActive())
  170.         if bNotActive:
  171.             self.setPediaCommonWidgets()
  172.  
  173.         # Header...
  174.         szHeader = u"<font=4b>" +localText.getText("TXT_KEY_WIDGET_HELP", ()).upper() + u"</font>"
  175.         szHeaderId = self.getNextWidgetName()
  176.         screen.setLabel(szHeaderId, "Background", szHeader, CvUtil.FONT_CENTER_JUSTIFY, self.X_SCREEN, self.Y_TITLE, 0, FontTypes.TITLE_FONT, WidgetTypes.WIDGET_PEDIA_DESCRIPTION, -1, -1)
  177.  
  178.         self.panelName = self.getNextWidgetName()
  179.         screen.addPanel(self.panelName, "", "", false, false,
  180.             self.X_ITEMS_PANE, self.Y_ITEMS_PANE, self.W_ITEMS_PANE, self.H_ITEMS_PANE, PanelStyles.PANEL_STYLE_BLUE50)
  181.         
  182.         if self.iLastScreen    != CvScreenEnums.PEDIA_MAIN or bNotActive:        
  183.             self.placeLinks()
  184.             self.iLastScreen = CvScreenEnums.PEDIA_MAIN
  185.         
  186.         if (self.mapCategories.has_key(iCategory)):
  187.             self.mapCategories.get(iCategory)()
  188.             
  189.     def placeTechs(self):
  190.         screen = self.getScreen()
  191.         
  192.         # sort techs alphabetically
  193.         techsList = self.getSortedList( gc.getNumTechInfos(), gc.getTechInfo )
  194.  
  195.         # display the techs
  196.         if (gc.getNumTechInfos() > self.BUTTON_COLUMNS):
  197.             rowListName = "Child" + self.panelName
  198.             screen.attachMultiListControlGFC(self.panelName, rowListName, "", 1, self.BUTTON_SIZE,self.BUTTON_SIZE, TableStyles.TABLE_STYLE_STANDARD)
  199.             for tech in techsList:
  200.                 screen.appendMultiListButton( rowListName, gc.getTechInfo(tech[1]).getButton(), 0, WidgetTypes.WIDGET_PEDIA_JUMP_TO_TECH, tech[1], 1, false )
  201.         else:
  202.             i = 0
  203.             for tech in techsList:
  204.                 y = self.ITEMS_SEPARATION + i * (self.BUTTON_SIZE + self.ITEMS_SEPARATION)
  205.                 screen.setImageButtonAt("", self.panelName, gc.getTechInfo(tech[1]).getButton(), self.ITEMS_MARGIN, y, self.BUTTON_SIZE, self.BUTTON_SIZE, WidgetTypes.WIDGET_PEDIA_JUMP_TO_TECH, tech[1], 1)
  206.                 screen.setLabelAt("", self.panelName, u"<font=4>" + gc.getTechInfo(tech[1]).getDescription() + u"</font>", CvUtil.FONT_LEFT_JUSTIFY, 2*self.ITEMS_MARGIN + self.BUTTON_SIZE, y+10, 0, FontTypes.GAME_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)
  207.                 i += 1
  208.  
  209.  
  210.                         
  211.     def placeUnits(self):
  212.         screen = self.getScreen()
  213.         
  214.         unitList = self.getSortedList( gc.getNumUnitInfos(), gc.getUnitInfo )
  215.             
  216.         # display the units
  217.         if (gc.getNumUnitInfos() > self.BUTTON_COLUMNS):
  218.             rowListName = "Child" + self.panelName
  219.             screen.attachMultiListControlGFC(self.panelName, rowListName, "", 1, self.BUTTON_SIZE,self.BUTTON_SIZE, TableStyles.TABLE_STYLE_STANDARD)
  220.             for unit in unitList:
  221.                 screen.appendMultiListButton( rowListName, gc.getUnitInfo(unit[1]).getButton(), 0, WidgetTypes.WIDGET_PEDIA_JUMP_TO_UNIT, unit[1], 1, false )        
  222.         else:
  223.             i = 0
  224.             for unit in unitList:
  225.                 y = self.ITEMS_SEPARATION + i * (self.BUTTON_SIZE + self.ITEMS_SEPARATION)
  226.                 screen.setImageButtonAt("", self.panelName, gc.getUnitInfo(unit[1]).getButton(), self.ITEMS_MARGIN, y, self.BUTTON_SIZE, self.BUTTON_SIZE, WidgetTypes.WIDGET_PEDIA_JUMP_TO_UNIT, unit[1], 1)
  227.                 screen.setLabelAt("", self.panelName, u"<font=4>" + gc.getUnitInfo(unit[1]).getDescription() + u"</font>", CvUtil.FONT_LEFT_JUSTIFY, 2*self.ITEMS_MARGIN + self.BUTTON_SIZE, y+10, 0, FontTypes.GAME_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)
  228.                 i += 1
  229.  
  230.     def placeBuildings(self):
  231.         screen = self.getScreen()
  232.                 
  233.         buildingList = self.pediaBuildingScreen.getBuildingSortedList()
  234.         
  235.         # display the buildings
  236.         if (gc.getNumBuildingInfos() > self.BUTTON_COLUMNS):
  237.             rowListName = "Child" + self.panelName
  238.             screen.attachMultiListControlGFC(self.panelName, rowListName, "", 1, self.BUTTON_SIZE,self.BUTTON_SIZE, TableStyles.TABLE_STYLE_STANDARD)
  239.             for building in buildingList:
  240.                 if (not gc.getBuildingInfo(building[1]).isGraphicalOnly()):
  241.                     screen.appendMultiListButton( rowListName, gc.getBuildingInfo(building[1]).getButton(), 0, WidgetTypes.WIDGET_PEDIA_JUMP_TO_BUILDING, building[1], 1, false )
  242.         else:
  243.             i = 0
  244.             for building in buildingList:
  245.                 if (not gc.getBuildingInfo(building[1]).isGraphicalOnly()):
  246.                     y = self.ITEMS_SEPARATION + i * (self.BUTTON_SIZE + self.ITEMS_SEPARATION)
  247.                     screen.setImageButtonAt("", self.panelName, gc.getBuildingInfo(building[1]).getButton(), self.ITEMS_MARGIN, y, self.BUTTON_SIZE, self.BUTTON_SIZE, WidgetTypes.WIDGET_PEDIA_JUMP_TO_BUILDING, building[1], 1)
  248.                     screen.setLabelAt("", self.panelName, u"<font=4>" + gc.getBuildingInfo(building[1]).getDescription() + u"</font>", CvUtil.FONT_LEFT_JUSTIFY, 2*self.ITEMS_MARGIN + self.BUTTON_SIZE, y+10, 0, FontTypes.GAME_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)
  249.                     i += 1
  250.  
  251.                         
  252.     def placeBoni(self):
  253.         return
  254.         screen = self.getScreen()
  255.         
  256.         bonusList = self.getSortedList( gc.getNumBonusInfos(), gc.getBonusInfo )
  257.         
  258.         # display the resources
  259.         if (gc.getNumBonusInfos() > self.BUTTON_COLUMNS):
  260.             rowListName = "Child" + self.panelName
  261.             screen.attachMultiListControlGFC(self.panelName, rowListName, "", 1, self.BUTTON_SIZE,self.BUTTON_SIZE, TableStyles.TABLE_STYLE_STANDARD)
  262.             for bonus in bonusList:
  263.                 screen.appendMultiListButton( rowListName, gc.getBonusInfo(bonus[1]).getButton(), 0, WidgetTypes.WIDGET_PEDIA_JUMP_TO_BONUS, bonus[1], 1, false )
  264.         else:
  265.             i = 0
  266.             for bonus in bonusList:
  267.                 y = self.ITEMS_SEPARATION + i * (self.BUTTON_SIZE + self.ITEMS_SEPARATION)
  268.                 screen.setImageButtonAt("", self.panelName, gc.getBonusInfo(bonus[1]).getButton(), self.ITEMS_MARGIN, y, self.BUTTON_SIZE, self.BUTTON_SIZE, WidgetTypes.WIDGET_PEDIA_JUMP_TO_BONUS, bonus[1], 1)
  269.                 screen.setLabelAt("", self.panelName, u"<font=4>" + gc.getBonusInfo(bonus[1]).getDescription() + u"</font>", CvUtil.FONT_LEFT_JUSTIFY, 2*self.ITEMS_MARGIN + self.BUTTON_SIZE, y+10, 0, FontTypes.GAME_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)
  270.                 i += 1
  271.             
  272.     def placeImprovements(self):
  273.         return
  274.         screen = self.getScreen()
  275.         
  276.         improvementList = self.getSortedList( gc.getNumImprovementInfos(), gc.getImprovementInfo )
  277.         
  278.         # display the improvements
  279.         if (gc.getNumImprovementInfos() > self.BUTTON_COLUMNS):
  280.             rowListName = "Child" + self.panelName
  281.             screen.attachMultiListControlGFC(self.panelName, rowListName, "", 1, self.BUTTON_SIZE,self.BUTTON_SIZE, TableStyles.TABLE_STYLE_STANDARD)
  282.             for improvement in improvementList:
  283.                 if (not gc.getImprovementInfo(improvement[1]).isGraphicalOnly()):
  284.                     screen.appendMultiListButton( rowListName, gc.getImprovementInfo(improvement[1]).getButton(), 0, WidgetTypes.WIDGET_PEDIA_JUMP_TO_IMPROVEMENT, improvement[1], 1, false )
  285.         else:
  286.             i = 0
  287.             for improvement in improvementList:
  288.                 if (not gc.getImprovementInfo(improvement[1]).isGraphicalOnly()):
  289.                     y = self.ITEMS_SEPARATION + i * (self.BUTTON_SIZE + self.ITEMS_SEPARATION)
  290.                     screen.setImageButtonAt("", self.panelName, gc.getImprovementInfo(improvement[1]).getButton(), self.ITEMS_MARGIN, y, self.BUTTON_SIZE, self.BUTTON_SIZE, WidgetTypes.WIDGET_PEDIA_JUMP_TO_IMPROVEMENT, improvement[1], 1)
  291.                     screen.setLabelAt("", self.panelName, u"<font=4>" + gc.getImprovementInfo(improvement[1]).getDescription() + u"</font>", CvUtil.FONT_LEFT_JUSTIFY, 2*self.ITEMS_MARGIN + self.BUTTON_SIZE, y+10, 0, FontTypes.GAME_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)
  292.                     i += 1
  293.                                                 
  294.     def placePromotions(self):
  295.         return
  296.         screen = self.getScreen()
  297.                     
  298.         promotionList = self.getSortedList( gc.getNumPromotionInfos(), gc.getPromotionInfo )
  299.         
  300.         # display the promotion
  301.         if (gc.getNumPromotionInfos() > self.BUTTON_COLUMNS):
  302.             rowListName = "Child" + self.panelName
  303.             screen.attachMultiListControlGFC(self.panelName, rowListName, "", 1, self.BUTTON_SIZE,self.BUTTON_SIZE, TableStyles.TABLE_STYLE_STANDARD)
  304.             for promotion in promotionList:
  305.                 screen.appendMultiListButton( rowListName, gc.getPromotionInfo(promotion[1]).getButton(), 0, WidgetTypes.WIDGET_PEDIA_JUMP_TO_PROMOTION, promotion[1], 1, false )
  306.         else:
  307.             i = 0
  308.             for promotion in promotionList:
  309.                 y = self.ITEMS_SEPARATION + i * (self.BUTTON_SIZE + self.ITEMS_SEPARATION)
  310.                 screen.setImageButtonAt("", self.panelName, gc.getPromotionInfo(promotion[1]).getButton(), self.ITEMS_MARGIN, y, self.BUTTON_SIZE, self.BUTTON_SIZE, WidgetTypes.WIDGET_PEDIA_JUMP_TO_PROMOTION, promotion[1], 1)
  311.                 screen.setLabelAt("", self.panelName, u"<font=4>" + gc.getPromotionInfo(promotion[1]).getDescription() + u"</font>", CvUtil.FONT_LEFT_JUSTIFY, 2*self.ITEMS_MARGIN + self.BUTTON_SIZE, y+10, 0, FontTypes.GAME_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)
  312.                 i += 1
  313.  
  314.     def placeUnitGroups(self):
  315.         return
  316.         screen = self.getScreen()
  317.         
  318.         groupList = self.getSortedList( gc.getNumUnitCombatInfos(), gc.getUnitCombatInfo )
  319.  
  320.         if (gc.getNumUnitCombatInfos() > self.BUTTON_COLUMNS):
  321.             rowListName = "Child" + self.panelName
  322.             screen.attachMultiListControlGFC(self.panelName, rowListName, "", 1, self.BUTTON_SIZE,self.BUTTON_SIZE, TableStyles.TABLE_STYLE_STANDARD)
  323.             for group in groupList:
  324.                 screen.appendMultiListButton(rowListName, gc.getUnitCombatInfo(group[1]).getButton(), 0, WidgetTypes.WIDGET_PEDIA_JUMP_TO_UNIT_COMBAT, group[1], 1, false )
  325.         else:
  326.             i = 0
  327.             for group in groupList:
  328.                 y = self.ITEMS_SEPARATION + i * (self.BUTTON_SIZE + self.ITEMS_SEPARATION)
  329.                 screen.setImageButtonAt("", self.panelName, gc.getUnitCombatInfo(group[1]).getButton(), self.ITEMS_MARGIN, y, self.BUTTON_SIZE, self.BUTTON_SIZE, WidgetTypes.WIDGET_PEDIA_JUMP_TO_UNIT_COMBAT, group[1], 1)
  330.                 screen.setLabelAt("", self.panelName, u"<font=4>" + gc.getUnitCombatInfo(group[1]).getDescription() + u"</font>", CvUtil.FONT_LEFT_JUSTIFY, 2*self.ITEMS_MARGIN + self.BUTTON_SIZE, y+10, 0, FontTypes.GAME_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)
  331.                 i += 1
  332.  
  333.     def placeCivs(self):
  334.         screen = self.getScreen()
  335.                 
  336.         civList = self.getSortedList( gc.getNumCivilizationInfos(), gc.getCivilizationInfo )
  337.             
  338.         # display the civs
  339.  
  340.         if (gc.getNumCivilizationInfos() > self.BUTTON_COLUMNS):
  341.             rowListName = "Child" + self.panelName
  342.             screen.attachMultiListControlGFC(self.panelName, rowListName, "", 1, self.BUTTON_SIZE,self.BUTTON_SIZE, TableStyles.TABLE_STYLE_STANDARD)
  343.             for civ in civList:
  344.                 if (gc.getCivilizationInfo(civ[1]).isPlayable()):
  345.                     screen.appendMultiListButton( rowListName, ArtFileMgr.getCivilizationArtInfo(gc.getCivilizationInfo(civ[1]).getArtDefineTag()).getButton(), 0, WidgetTypes.WIDGET_PEDIA_JUMP_TO_CIV, civ[1], 1, false )
  346.         else:
  347.             i = 0
  348.             for civ in civList:
  349.                 if (gc.getCivilizationInfo(civ[1]).isPlayable()):
  350.                     y = self.ITEMS_SEPARATION + i * (self.BUTTON_SIZE + self.ITEMS_SEPARATION)
  351.                     screen.setImageButtonAt("", self.panelName, gc.getCivilizationInfo(civ[1]).getButton(), self.ITEMS_MARGIN, y, self.BUTTON_SIZE, self.BUTTON_SIZE, WidgetTypes.WIDGET_PEDIA_JUMP_TO_CIV, civ[1], 1)
  352.                     screen.setLabelAt("", self.panelName, u"<font=4>" + gc.getCivilizationInfo(civ[1]).getDescription() + u"</font>", CvUtil.FONT_LEFT_JUSTIFY, 2*self.ITEMS_MARGIN + self.BUTTON_SIZE, y+10, 0, FontTypes.GAME_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)
  353.                     i += 1
  354.                         
  355.     def placeLeaders(self):
  356.         screen = self.getScreen()
  357.         
  358.         leaderList = self.getSortedList( gc.getNumLeaderHeadInfos(), gc.getLeaderHeadInfo )
  359.         
  360.         # display the leaders                    
  361.         if (gc.getNumLeaderHeadInfos() > self.BUTTON_COLUMNS):
  362.             rowListName = "Child" + self.panelName
  363.             screen.attachMultiListControlGFC(self.panelName, rowListName, "", 1, self.BUTTON_SIZE,self.BUTTON_SIZE, TableStyles.TABLE_STYLE_STANDARD)
  364.             for leader in leaderList:
  365.                 if gc.getLeaderHeadInfo(leader[1]).getFavoriteCivic() != -1:
  366.                     screen.appendMultiListButton( rowListName, gc.getLeaderHeadInfo(leader[1]).getButton(), 0, WidgetTypes.WIDGET_PEDIA_JUMP_TO_LEADER, leader[1], 1, false )
  367.         else:
  368.             i = 0
  369.             for leader in leaderList:
  370.                 if gc.getLeaderHeadInfo(leader[1]).getFavoriteCivic() != -1:
  371.                     y = self.ITEMS_SEPARATION + i * (self.BUTTON_SIZE + self.ITEMS_SEPARATION)
  372.                     screen.setImageButtonAt("", self.panelName, gc.getLeaderHeadInfo(leader[1]).getButton(), self.ITEMS_MARGIN, y, self.BUTTON_SIZE, self.BUTTON_SIZE, WidgetTypes.WIDGET_PEDIA_JUMP_TO_LEADER, leader[1], 1)
  373.                     screen.setLabelAt("", self.panelName, u"<font=4>" + gc.getLeaderHeadInfo(leader[1]).getDescription() + u"</font>", CvUtil.FONT_LEFT_JUSTIFY, 2*self.ITEMS_MARGIN + self.BUTTON_SIZE, y+10, 0, FontTypes.GAME_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)
  374.                     i += 1
  375.  
  376.     def placeReligions(self):
  377.         return
  378.         screen = self.getScreen()
  379.                 
  380.         religionList = self.getSortedList( gc.getNumReligionInfos(), gc.getReligionInfo )
  381.             
  382.         # display the religions
  383.         if (gc.getNumReligionInfos() > self.BUTTON_COLUMNS):
  384.             rowListName = "Child" + self.panelName
  385.             screen.attachMultiListControlGFC(self.panelName, rowListName, "", 1, self.BUTTON_SIZE,self.BUTTON_SIZE, TableStyles.TABLE_STYLE_STANDARD)
  386.             for religion in religionList:
  387.                 screen.appendMultiListButton(rowListName, gc.getReligionInfo(religion[1]).getButton(), 0, WidgetTypes.WIDGET_PEDIA_JUMP_TO_RELIGION, religion[1], 1, false )
  388.         else:
  389.             i = 0
  390.             for religion in religionList:
  391.                 y = self.ITEMS_SEPARATION + i * (self.BUTTON_SIZE + self.ITEMS_SEPARATION)
  392.                 screen.setImageButtonAt("", self.panelName, gc.getReligionInfo(religion[1]).getButton(), self.ITEMS_MARGIN, y, self.BUTTON_SIZE, self.BUTTON_SIZE, WidgetTypes.WIDGET_PEDIA_JUMP_TO_RELIGION, religion[1], 1)
  393.                 screen.setLabelAt("", self.panelName, u"<font=4>" + gc.getReligionInfo(religion[1]).getDescription() + u"</font>", CvUtil.FONT_LEFT_JUSTIFY, 2*self.ITEMS_MARGIN + self.BUTTON_SIZE, y+10, 0, FontTypes.GAME_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)
  394.                 i += 1
  395.                         
  396.     def placeCivics(self):
  397.         return
  398.         screen = self.getScreen()
  399.         
  400.         civicList = self.getSortedList( gc.getNumCivicInfos(), gc.getCivicInfo )
  401.         
  402.         # display the civics
  403.         if (gc.getNumCivicInfos() > self.BUTTON_COLUMNS):
  404.             rowListName = "Child" + self.panelName
  405.             screen.attachMultiListControlGFC(self.panelName, rowListName, "", 1, self.BUTTON_SIZE,self.BUTTON_SIZE, TableStyles.TABLE_STYLE_STANDARD)
  406.             for civic in civicList:
  407.                 screen.appendMultiListButton( rowListName, gc.getCivicInfo(civic[1]).getButton(), 0, WidgetTypes.WIDGET_PEDIA_JUMP_TO_CIVIC, civic[1], 1, false )
  408.         else:
  409.             i = 0
  410.             for civic in civicList:
  411.                 y = self.ITEMS_SEPARATION + i * (self.BUTTON_SIZE + self.ITEMS_SEPARATION)
  412.                 screen.setImageButtonAt("", self.panelName, gc.getCivicInfo(civic[1]).getButton(), self.ITEMS_MARGIN, y, self.BUTTON_SIZE, self.BUTTON_SIZE, WidgetTypes.WIDGET_PEDIA_JUMP_TO_CIVIC, civic[1], 1)
  413.                 screen.setLabelAt("", self.panelName, u"<font=4>" + gc.getCivicInfo(civic[1]).getDescription() + u"</font>", CvUtil.FONT_LEFT_JUSTIFY, 2*self.ITEMS_MARGIN + self.BUTTON_SIZE, y+10, 0, FontTypes.GAME_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)
  414.                 i += 1
  415.  
  416.     def placeProjects(self):
  417.         return
  418.         screen = self.getScreen()
  419.         
  420.         projectList = self.pediaProjectScreen.getProjectSortedList()
  421.         
  422.         # display the projects                        
  423.         if (gc.getNumProjectInfos() > self.BUTTON_COLUMNS):
  424.             rowListName = "Child" + self.panelName
  425.             screen.attachMultiListControlGFC(self.panelName, rowListName, "", 1, self.BUTTON_SIZE,self.BUTTON_SIZE, TableStyles.TABLE_STYLE_STANDARD)
  426.             for project in projectList:
  427.                 screen.appendMultiListButton( rowListName, gc.getProjectInfo(project[1]).getButton(), 0, WidgetTypes.WIDGET_PEDIA_JUMP_TO_PROJECT, project[1], 1, false )
  428.         else:
  429.             i = 0
  430.             for project in projectList:
  431.                 y = self.ITEMS_SEPARATION + i * (self.BUTTON_SIZE + self.ITEMS_SEPARATION)
  432.                 screen.setImageButtonAt("", self.panelName, gc.getProjectInfo(project[1]).getButton(), self.ITEMS_MARGIN, y, self.BUTTON_SIZE, self.BUTTON_SIZE, WidgetTypes.WIDGET_PEDIA_JUMP_TO_PROJECT, project[1], 1)
  433.                 screen.setLabelAt("", self.panelName, u"<font=4>" + gc.getProjectInfo(project[1]).getDescription() + u"</font>", CvUtil.FONT_LEFT_JUSTIFY, 2*self.ITEMS_MARGIN + self.BUTTON_SIZE, y+10, 0, FontTypes.GAME_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)
  434.                 i += 1
  435.  
  436.     def placeTerrains(self):
  437.         return
  438.         screen = self.getScreen()
  439.  
  440.         terrainList = self.getSortedList( gc.getNumTerrainInfos(), gc.getTerrainInfo )
  441.         
  442.         # display the terrains
  443.         if (gc.getNumTerrainInfos() > self.BUTTON_COLUMNS):
  444.             rowListName = "Child" + self.panelName
  445.             screen.attachMultiListControlGFC(self.panelName, rowListName, "", 1, self.BUTTON_SIZE,self.BUTTON_SIZE, TableStyles.TABLE_STYLE_STANDARD)
  446.             for terrain in terrainList:
  447.                 if (not gc.getTerrainInfo(terrain[1]).isGraphicalOnly()):
  448.                     screen.appendMultiListButton( rowListName, gc.getTerrainInfo(terrain[1]).getButton(), 0, WidgetTypes.WIDGET_PEDIA_JUMP_TO_TERRAIN, terrain[1], 1, false )
  449.         else:
  450.             i = 0
  451.             for terrain in terrainList:
  452.                 if (not gc.getTerrainInfo(terrain[1]).isGraphicalOnly()):
  453.                     y = self.ITEMS_SEPARATION + i * (self.BUTTON_SIZE + self.ITEMS_SEPARATION)
  454.                     screen.setImageButtonAt("", self.panelName, gc.getTerrainInfo(terrain[1]).getButton(), self.ITEMS_MARGIN, y, self.BUTTON_SIZE, self.BUTTON_SIZE, WidgetTypes.WIDGET_PEDIA_JUMP_TO_TERRAIN, terrain[1], 1)
  455.                     screen.setLabelAt("", self.panelName, u"<font=4>" + gc.getTerrainInfo(terrain[1]).getDescription() + u"</font>", CvUtil.FONT_LEFT_JUSTIFY, 2*self.ITEMS_MARGIN + self.BUTTON_SIZE, y+10, 0, FontTypes.GAME_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)
  456.                     i += 1
  457.                         
  458.     def placeFeatures(self):
  459.         return
  460.         screen = self.getScreen()
  461.         
  462.         featureList = self.getSortedList( gc.getNumFeatureInfos(), gc.getFeatureInfo )
  463.         
  464.         # display the features
  465.         if (gc.getNumFeatureInfos() > self.BUTTON_COLUMNS):
  466.             rowListName = "Child" + self.panelName
  467.             screen.attachMultiListControlGFC(self.panelName, rowListName, "", 1, self.BUTTON_SIZE,self.BUTTON_SIZE, TableStyles.TABLE_STYLE_STANDARD)
  468.             for feature in featureList:
  469.                 if (not gc.getFeatureInfo(feature[1]).isGraphicalOnly()):
  470.                     screen.appendMultiListButton( rowListName, gc.getFeatureInfo(feature[1]).getButton(), 0, WidgetTypes.WIDGET_PEDIA_JUMP_TO_FEATURE, feature[1], 1, false )
  471.         else:
  472.             i = 0
  473.             for feature in featureList:
  474.                 if (not gc.getFeatureInfo(feature[1]).isGraphicalOnly()):
  475.                     y = self.ITEMS_SEPARATION + i * (self.BUTTON_SIZE + self.ITEMS_SEPARATION)
  476.                     screen.setImageButtonAt("", self.panelName, gc.getFeatureInfo(feature[1]).getButton(), self.ITEMS_MARGIN, y, self.BUTTON_SIZE, self.BUTTON_SIZE, WidgetTypes.WIDGET_PEDIA_JUMP_TO_FEATURE, feature[1], 1)
  477.                     screen.setLabelAt("", self.panelName, u"<font=4>" + gc.getFeatureInfo(feature[1]).getDescription() + u"</font>", CvUtil.FONT_LEFT_JUSTIFY, 2*self.ITEMS_MARGIN + self.BUTTON_SIZE, y+10, 0, FontTypes.GAME_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)
  478.                     i += 1
  479.                         
  480.     def placeConcepts(self):
  481.         return
  482.         screen = self.getScreen()
  483.         
  484.         # Create and place a tech pane                                    
  485.         conceptList = self.getSortedList( gc.getNumConceptInfos(), gc.getConceptInfo )
  486.  
  487.         nColumns = 2
  488.         tableName = self.getNextWidgetName()
  489.         screen.addTableControlGFC(tableName, nColumns, self.X_ITEMS_PANE, self.Y_ITEMS_PANE+5, self.W_ITEMS_PANE, self.H_ITEMS_PANE-5, False, False, 16, 16, TableStyles.TABLE_STYLE_STANDARD);
  490.         screen.enableSelect(tableName, False)
  491.         for i in range(nColumns):
  492.             screen.setTableColumnHeader(tableName, i, "", self.W_ITEMS_PANE/nColumns)
  493.         
  494.         # display the game concepts
  495.         iCounter = 0
  496.         iNumRows = 0
  497.         for concept in conceptList:
  498.             iColumn = iCounter % nColumns
  499.             iRow = iCounter // nColumns
  500.             if iRow >= iNumRows:
  501.                 iNumRows += 1
  502.                 screen.appendTableRow(tableName)
  503.             screen.setText("tableItem" + str(iRow*nColumns + iColumn), "", u"<font=4>" + concept[0] + u"</font>", CvUtil.FONT_LEFT_JUSTIFY, 0, 0, 0, FontTypes.TITLE_FONT, WidgetTypes.WIDGET_PEDIA_DESCRIPTION_NO_HELP, CivilopediaPageTypes.CIVILOPEDIA_PAGE_CONCEPT, concept[1])
  504.             screen.attachControlToTableCell("tableItem" + str(iRow*nColumns + iColumn), tableName, iRow, iColumn)
  505.             iCounter += 1
  506.                         
  507.     def placeSpecialists(self):
  508.         screen = self.getScreen()
  509.         
  510.         # display specialists
  511.         if (gc.getNumSpecialistInfos() > self.BUTTON_COLUMNS):
  512.             rowListName = "Child" + self.panelName
  513.             screen.attachMultiListControlGFC(self.panelName, rowListName, "", 1, self.BUTTON_SIZE,self.BUTTON_SIZE, TableStyles.TABLE_STYLE_STANDARD)
  514.             for i in range(gc.getNumSpecialistInfos()):
  515.                 screen.appendMultiListButton( rowListName, gc.getSpecialistInfo(i).getButton(), 0, WidgetTypes.WIDGET_PEDIA_JUMP_TO_SPECIALIST, i, 1, false )
  516.         else:
  517.             for i in range(gc.getNumSpecialistInfos()):
  518.                 y = self.ITEMS_SEPARATION + i * (self.BUTTON_SIZE + self.ITEMS_SEPARATION)
  519.                 screen.setImageButtonAt("", self.panelName, gc.getSpecialistInfo(i).getButton(), self.ITEMS_MARGIN, y, self.BUTTON_SIZE, self.BUTTON_SIZE, WidgetTypes.WIDGET_PEDIA_JUMP_TO_SPECIALIST, i, 1)
  520.                 screen.setLabelAt("", self.panelName, u"<font=4>" + gc.getSpecialistInfo(i).getDescription() + u"</font>", CvUtil.FONT_LEFT_JUSTIFY, 2*self.ITEMS_MARGIN + self.BUTTON_SIZE, y+10, 0, FontTypes.GAME_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)
  521.                         
  522.     def placeHints(self):
  523.         screen = self.getScreen()
  524.                                 
  525.         self.szAreaId = self.getNextWidgetName()
  526.         screen.addListBoxGFC( self.szAreaId, "",
  527.                                       self.X_ITEMS_PANE, self.Y_ITEMS_PANE, self.W_ITEMS_PANE, self.H_ITEMS_PANE, TableStyles.TABLE_STYLE_STANDARD )
  528.         
  529.         szHintsText = CyGameTextMgr().buildHintsList()
  530.         hintText = string.split( szHintsText, "\n" )
  531.         for hint in hintText:
  532.             if len( hint ) != 0:
  533.                 screen.appendListBoxString( self.szAreaId, hint, WidgetTypes.WIDGET_GENERAL, -1, -1, CvUtil.FONT_LEFT_JUSTIFY )
  534.                                         
  535.     def placeLinks(self):
  536.         
  537.         screen = self.getScreen()
  538.         
  539.         screen.clearListBoxGFC(self.LIST_ID)
  540.  
  541.         i = 0
  542.         for szCategory in self.listCategories:
  543.             screen.appendListBoxString(self.LIST_ID, szCategory, WidgetTypes.WIDGET_PEDIA_MAIN, i, 0, CvUtil.FONT_LEFT_JUSTIFY )
  544.             i += 1
  545.  
  546.         screen.setSelectedListBoxStringGFC(self.LIST_ID, self.iCategory)
  547.                     
  548.     # returns a unique ID for a widget in this screen
  549.     def getNextWidgetName(self):
  550.         szName = self.WIDGET_ID + str(self.nWidgetCount)
  551.         self.nWidgetCount += 1
  552.         return szName
  553.         
  554.     def pediaJump(self, iScreen, iEntry, bRemoveFwdList):
  555.     
  556.         if (iEntry < 0):
  557.             return
  558.             
  559.         self.iActivePlayer = gc.getGame().getActivePlayer()
  560.  
  561.         self.pediaHistory.append((iScreen, iEntry))
  562.         if (bRemoveFwdList):
  563.             self.pediaFuture = []
  564.  
  565.         if (iScreen == CvScreenEnums.PEDIA_MAIN):
  566.             self.showScreen(iEntry)
  567.         elif (iScreen == CvScreenEnums.PEDIA_TECH):
  568.             self.pediaTechScreen.interfaceScreen(iEntry)
  569.         elif (iScreen == CvScreenEnums.PEDIA_UNIT):
  570.             self.pediaUnitScreen.interfaceScreen(iEntry)
  571.         elif (iScreen == CvScreenEnums.PEDIA_BUILDING):
  572.             self.pediaBuildingScreen.interfaceScreen(iEntry)    
  573.         elif (iScreen == CvScreenEnums.PEDIA_CIVILIZATION):
  574.             self.pediaCivilization.interfaceScreen(iEntry)    
  575.         elif (iScreen == CvScreenEnums.PEDIA_LEADER):
  576.             self.pediaLeader.interfaceScreen(iEntry)    
  577.  
  578.     def back(self):
  579.         print "pedia back"
  580.         if (len(self.pediaHistory) > 1):
  581.             self.pediaFuture.append(self.pediaHistory.pop())
  582.             current = self.pediaHistory.pop()
  583.             self.pediaJump(current[0], current[1], False)
  584.         return 1
  585.         
  586.     def forward(self):
  587.         print "pedia fwd"
  588.         if (self.pediaFuture):
  589.             current = self.pediaFuture.pop()
  590.             self.pediaJump(current[0], current[1], False)
  591.         return 1
  592.         
  593.     def pediaShow(self):
  594.         if (not self.pediaHistory):
  595.             self.pediaHistory.append((CvScreenEnums.PEDIA_MAIN, 0))
  596.             
  597.         current = self.pediaHistory.pop()
  598.         
  599.         # erase history so it doesn't grow too large during the game
  600.         self.pediaFuture = []
  601.         self.pediaHistory = []
  602.         
  603.         # jump to the last screen that was up
  604.         self.pediaJump(current[0], current[1], False)
  605.         
  606.     def link(self, szLink):
  607.         for i in range(gc.getNumTechInfos()):
  608.             if (gc.getTechInfo(i).getType() == szLink):
  609.                 return self.pediaJump(CvScreenEnums.PEDIA_TECH, i, True)
  610.         for i in range(gc.getNumUnitInfos()):
  611.             if (gc.getUnitInfo(i).getType() == szLink):
  612.                 return self.pediaJump(CvScreenEnums.PEDIA_UNIT, i, True)
  613.         for i in range(gc.getNumBuildingInfos()):
  614.             if (gc.getBuildingInfo(i).getType() == szLink):
  615.                 return self.pediaJump(CvScreenEnums.PEDIA_BUILDING, i, True)
  616.         for i in range(gc.getNumCivilizationInfos()):
  617.             if (gc.getCivilizationInfo(i).getType() == szLink):
  618.                 return self.pediaJump(CvScreenEnums.PEDIA_CIVILIZATION, i, True)
  619.         for i in range(gc.getNumLeaderHeadInfos()):
  620.             if (gc.getLeaderHeadInfo(i).getType() == szLink):
  621.                 return self.pediaJump(CvScreenEnums.PEDIA_LEADER, i, True)
  622.                                                                 
  623.     def deleteAllWidgets(self):
  624.         screen = self.getScreen()
  625.         iNumWidgets = self.nWidgetCount
  626.         self.nWidgetCount = 0
  627.         for i in range(iNumWidgets):
  628.             screen.deleteWidget(self.getNextWidgetName())
  629.         self.nWidgetCount = 0
  630.         
  631.         
  632.             
  633.     # Will handle the input for this screen...
  634.     def handleInput (self, inputClass):
  635.         # redirect to proper screen if necessary
  636.         if (inputClass.getPythonFile() == CvScreenEnums.PEDIA_TECH):
  637.             return self.pediaTechScreen.handleInput(inputClass)
  638.         if (inputClass.getPythonFile() == CvScreenEnums.PEDIA_UNIT):
  639.             return self.pediaUnitScreen.handleInput(inputClass)
  640.         if (inputClass.getPythonFile() == CvScreenEnums.PEDIA_BUILDING):
  641.             return self.pediaBuildingScreen.handleInput(inputClass)
  642.         if (inputClass.getPythonFile() == CvScreenEnums.PEDIA_CIVILIZATION):
  643.             return self.pediaCivilization.handleInput(inputClass)
  644.         if (inputClass.getPythonFile() == CvScreenEnums.PEDIA_LEADER):
  645.             return self.pediaLeader.handleInput(inputClass)                        
  646.         return 0
  647.  
  648.