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

  1. ## Sid Meier's Civilization 4
  2. ## Copyright Firaxis Games 2005
  3. from CvPythonExtensions import *
  4. import CvUtil
  5. import ScreenInput
  6. import CvScreenEnums
  7. import string
  8.  
  9. # globals
  10. gc = CyGlobalContext()
  11. ArtFileMgr = CyArtFileMgr()
  12. localText = CyTranslator()
  13.  
  14. class CvPediaUnit:
  15.     "Civilopedia Screen for Units"
  16.  
  17.     def __init__(self, main):
  18.         self.iUnit = -1
  19.         self.top = main
  20.         
  21.         self.X_UNIT_PANE = 20
  22.         self.Y_UNIT_PANE = 70
  23.         self.W_UNIT_PANE = 433
  24.         self.H_UNIT_PANE = 210
  25.  
  26.         self.X_UNIT_ANIMATION = 475
  27.         self.Y_UNIT_ANIMATION = 78
  28.         self.W_UNIT_ANIMATION = 303
  29.         self.H_UNIT_ANIMATION = 200
  30.         self.X_ROTATION_UNIT_ANIMATION = -20
  31.         self.Z_ROTATION_UNIT_ANIMATION = 30
  32.         self.SCALE_ANIMATION = 1.0
  33.  
  34.         self.X_ICON = 48
  35.         self.Y_ICON = 105
  36.         self.W_ICON = 150
  37.         self.H_ICON = 150
  38.         self.ICON_SIZE = 64
  39.  
  40.         self.BUTTON_SIZE = 64
  41.         self.PROMOTION_ICON_SIZE = 32
  42.  
  43.         self.X_STATS_PANE = 210
  44.         self.Y_STATS_PANE = 145
  45.         self.W_STATS_PANE = 250
  46.         self.H_STATS_PANE = 200
  47.  
  48.         self.X_SPECIAL_PANE = 20
  49.         self.Y_SPECIAL_PANE = 420
  50.         self.W_SPECIAL_PANE = 433
  51.         self.H_SPECIAL_PANE = 278
  52.  
  53.         self.X_PREREQ_PANE = 20
  54.         self.Y_PREREQ_PANE = 292
  55.         self.W_PREREQ_PANE = 433
  56.         self.H_PREREQ_PANE = 124
  57.  
  58.         self.X_UPGRADES_TO_PANE = 475
  59.         self.Y_UPGRADES_TO_PANE = 292
  60.         self.W_UPGRADES_TO_PANE = 303
  61.         self.H_UPGRADES_TO_PANE = 124
  62.  
  63.         self.X_PROMO_PANE = 475
  64.         self.Y_PROMO_PANE = 420
  65.         self.W_PROMO_PANE = 303
  66.         self.H_PROMO_PANE = 278
  67.  
  68.                         
  69.     # Screen construction function
  70.     def interfaceScreen(self, iUnit):    
  71.             
  72.         self.iUnit = iUnit
  73.     
  74.         self.top.deleteAllWidgets()                        
  75.                             
  76.         screen = self.top.getScreen()
  77.         
  78.         bNotActive = (not screen.isActive())
  79.         if bNotActive:
  80.             self.top.setPediaCommonWidgets()
  81.  
  82.         # Header...
  83.         szHeader = u"<font=4b>" + gc.getUnitInfo(self.iUnit).getDescription().upper() + u"</font>"
  84.         screen.setText(self.top.getNextWidgetName(), "Background", szHeader, CvUtil.FONT_CENTER_JUSTIFY, self.top.X_SCREEN, self.top.Y_TITLE, 0, FontTypes.TITLE_FONT, WidgetTypes.WIDGET_PEDIA_DESCRIPTION, CivilopediaPageTypes.CIVILOPEDIA_PAGE_UNIT, iUnit)
  85.         screen.setImageButton(self.top.getNextWidgetName(), ArtFileMgr.getInterfaceArtInfo("INTERFACE_GENERAL_CIVILOPEDIA_ICON").getPath(), self.top.X_EXIT, self.top.Y_TITLE, 32, 32, WidgetTypes.WIDGET_PEDIA_DESCRIPTION,  CivilopediaPageTypes.CIVILOPEDIA_PAGE_UNIT, iUnit)
  86.  
  87.         # Top
  88.         screen.setText(self.top.getNextWidgetName(), "Background", self.top.MENU_TEXT, CvUtil.FONT_LEFT_JUSTIFY, self.top.X_MENU, self.top.Y_MENU, 0, FontTypes.TITLE_FONT, WidgetTypes.WIDGET_PEDIA_MAIN, CivilopediaPageTypes.CIVILOPEDIA_PAGE_UNIT, -1)
  89.  
  90.         if self.top.iLastScreen    != CvScreenEnums.PEDIA_UNIT or bNotActive:        
  91.             self.placeLinks()
  92.             self.top.iLastScreen = CvScreenEnums.PEDIA_UNIT
  93.         
  94.         # Icon
  95.         screen.addPanel( self.top.getNextWidgetName(), "", "", False, False,
  96.             self.X_UNIT_PANE, self.Y_UNIT_PANE, self.W_UNIT_PANE, self.H_UNIT_PANE, PanelStyles.PANEL_STYLE_BLUE50)
  97.         screen.addPanel(self.top.getNextWidgetName(), "", "", false, false,
  98.             self.X_ICON, self.Y_ICON, self.W_ICON, self.H_ICON, PanelStyles.PANEL_STYLE_MAIN)
  99.         screen.addDDSGFC(self.top.getNextWidgetName(), gc.getUnitInfo(self.iUnit).getButton(),
  100.             self.X_ICON + self.W_ICON/2 - self.ICON_SIZE/2, self.Y_ICON + self.H_ICON/2 - self.ICON_SIZE/2, self.ICON_SIZE, self.ICON_SIZE, WidgetTypes.WIDGET_GENERAL, -1, -1 )
  101.  
  102.         # Unit animation
  103.         screen.addUnitGraphicGFC(self.top.getNextWidgetName(), self.iUnit, self.X_UNIT_ANIMATION, self.Y_UNIT_ANIMATION, self.W_UNIT_ANIMATION, self.H_UNIT_ANIMATION, WidgetTypes.WIDGET_GENERAL, -1, -1, self.X_ROTATION_UNIT_ANIMATION, self.Z_ROTATION_UNIT_ANIMATION, self.SCALE_ANIMATION, True)
  104.  
  105.         self.placeStats()
  106.  
  107.         self.placeUpgradesTo()
  108.         
  109.         self.placeRequires()
  110.                 
  111.         self.placeSpecial()
  112.         
  113.         self.placePromotions()
  114.                                         
  115.         return
  116.  
  117.     # Place strength/movement
  118.     def placeStats(self):
  119.  
  120.         screen = self.top.getScreen()
  121.  
  122.         panelName = self.top.getNextWidgetName()
  123.  
  124.         # Unit combat group
  125.         iCombatType = gc.getUnitInfo(self.iUnit).getUnitCombatType()
  126.         if (iCombatType != -1):
  127.             screen.setImageButton(self.top.getNextWidgetName(), gc.getUnitCombatInfo(iCombatType).getButton(), self.X_STATS_PANE, self.Y_STATS_PANE - 40, 32, 32, WidgetTypes.WIDGET_PEDIA_JUMP_TO_UNIT_COMBAT, iCombatType, 0)
  128.             screen.setText(self.top.getNextWidgetName(), "", u"<font=3>" + gc.getUnitCombatInfo(iCombatType).getDescription() + u"</font>", CvUtil.FONT_LEFT_JUSTIFY, self.X_STATS_PANE + 37, self.Y_STATS_PANE - 35, 0, FontTypes.TITLE_FONT, WidgetTypes.WIDGET_PEDIA_JUMP_TO_UNIT_COMBAT, iCombatType, 0)
  129.  
  130.         screen.addListBoxGFC(panelName, "", self.X_STATS_PANE, self.Y_STATS_PANE, self.W_STATS_PANE, self.H_STATS_PANE, TableStyles.TABLE_STYLE_EMPTY)
  131.         screen.enableSelect(panelName, False)
  132.         
  133.         if (gc.getUnitInfo(self.iUnit).getAirCombat() > 0):
  134.             iStrength = gc.getUnitInfo(self.iUnit).getAirCombat()
  135.         else:
  136.             iStrength = gc.getUnitInfo(self.iUnit).getCombat()
  137.             
  138.         szName = self.top.getNextWidgetName()        
  139.         szStrength = localText.getText("TXT_KEY_PEDIA_STRENGTH", ( iStrength, ) )
  140.         screen.appendListBoxString(panelName, u"<font=4>" + szStrength.upper() + u"%c" % CyGame().getSymbolID(FontSymbols.STRENGTH_CHAR) + u"</font>", WidgetTypes.WIDGET_GENERAL, 0, 0, CvUtil.FONT_LEFT_JUSTIFY)
  141.  
  142.         szName = self.top.getNextWidgetName()
  143.         szMovement = localText.getText("TXT_KEY_PEDIA_MOVEMENT", ( gc.getUnitInfo(self.iUnit).getMoves(), ) )
  144.         screen.appendListBoxString(panelName, u"<font=4>" + szMovement.upper() + u"%c" % CyGame().getSymbolID(FontSymbols.MOVES_CHAR) + u"</font>", WidgetTypes.WIDGET_GENERAL, 0, 0, CvUtil.FONT_LEFT_JUSTIFY)
  145.  
  146.         if (gc.getUnitInfo(self.iUnit).getProductionCost() >= 0):
  147.             szName = self.top.getNextWidgetName()
  148.             if self.top.iActivePlayer == -1:
  149.                 szCost = localText.getText("TXT_KEY_PEDIA_COST", ((gc.getUnitInfo(self.iUnit).getProductionCost() * gc.getDefineINT("UNIT_PRODUCTION_PERCENT"))/100,))
  150.             else:
  151.                 szCost = localText.getText("TXT_KEY_PEDIA_COST", ( gc.getActivePlayer().getUnitProductionNeeded(self.iUnit), ) )
  152.             screen.appendListBoxString(panelName, u"<font=4>" + szCost.upper() + u"%c" % gc.getYieldInfo(YieldTypes.YIELD_PRODUCTION).getChar() + u"</font>", WidgetTypes.WIDGET_GENERAL, 0, 0, CvUtil.FONT_LEFT_JUSTIFY)
  153.  
  154.         if (gc.getUnitInfo(self.iUnit).getAirRange() > 0):
  155.             szName = self.top.getNextWidgetName()
  156.             szRange = localText.getText("TXT_KEY_PEDIA_RANGE", ( gc.getUnitInfo(self.iUnit).getAirRange(), ) )
  157.             screen.appendListBoxString(panelName, u"<font=4>" + szRange.upper() + u"</font>", WidgetTypes.WIDGET_GENERAL, 0, 0, CvUtil.FONT_LEFT_JUSTIFY)
  158.                         
  159.     # Place prereqs (techs, resources)
  160.     def placeRequires(self):
  161.  
  162.         screen = self.top.getScreen()
  163.         
  164.         panelName = self.top.getNextWidgetName()
  165.         screen.addPanel( panelName, localText.getText("TXT_KEY_PEDIA_REQUIRES", ()), "", false, true, self.X_PREREQ_PANE, self.Y_PREREQ_PANE, self.W_PREREQ_PANE, self.H_PREREQ_PANE, PanelStyles.PANEL_STYLE_BLUE50 )
  166.         
  167.         screen.attachLabel(panelName, "", "  ")
  168.  
  169.         # add tech buttons
  170.         iPrereq = gc.getUnitInfo(self.iUnit).getPrereqAndTech()
  171.         if (iPrereq >= 0):
  172.             screen.attachImageButton( panelName, "", gc.getTechInfo(iPrereq).getButton(), GenericButtonSizes.BUTTON_SIZE_CUSTOM, WidgetTypes.WIDGET_PEDIA_JUMP_TO_TECH, iPrereq, 1, False )
  173.                 
  174.         for j in range(gc.getDefineINT("NUM_UNIT_AND_TECH_PREREQS")):
  175.             iPrereq = gc.getUnitInfo(self.iUnit).getPrereqAndTechs(j)
  176.             if (iPrereq >= 0):
  177.                 screen.attachImageButton( panelName, "", gc.getTechInfo(iPrereq).getButton(), GenericButtonSizes.BUTTON_SIZE_CUSTOM, WidgetTypes.WIDGET_PEDIA_JUMP_TO_TECH, iPrereq, -1, False )
  178.  
  179.         # add resource buttons
  180.         bFirst = True
  181.         iPrereq = gc.getUnitInfo(self.iUnit).getPrereqAndBonus()
  182.         if (iPrereq >= 0):
  183.             bFirst = False
  184.             screen.attachImageButton( panelName, "", gc.getBonusInfo(iPrereq).getButton(), GenericButtonSizes.BUTTON_SIZE_CUSTOM, WidgetTypes.WIDGET_PEDIA_JUMP_TO_BONUS, iPrereq, -1, False )
  185.  
  186.         # count the number of OR resources
  187.         nOr = 0
  188.         for j in range(gc.getNUM_UNIT_PREREQ_OR_BONUSES()):
  189.             if (gc.getUnitInfo(self.iUnit).getPrereqOrBonuses(j) > -1):
  190.                 nOr += 1
  191.  
  192.         szLeftDelimeter = ""
  193.         szRightDelimeter = ""
  194.         #  Display a bracket if we have more than one OR resource and an AND resource
  195.         if (not bFirst):
  196.             if (nOr > 1):
  197.                 szLeftDelimeter = localText.getText("TXT_KEY_AND", ()) + "( "
  198.                 szRightDelimeter = " ) "
  199.             elif (nOr > 0):
  200.                 szLeftDelimeter = localText.getText("TXT_KEY_AND", ())
  201.  
  202.         if len(szLeftDelimeter) > 0:
  203.             screen.attachLabel(panelName, "", szLeftDelimeter)
  204.  
  205.         bFirst = True
  206.         for j in range(gc.getNUM_UNIT_PREREQ_OR_BONUSES()):
  207.             eBonus = gc.getUnitInfo(self.iUnit).getPrereqOrBonuses(j)
  208.             if (eBonus > -1):
  209.                 if (not bFirst):
  210.                     screen.attachLabel(panelName, "", localText.getText("TXT_KEY_OR", ()))
  211.                 else:
  212.                     bFirst = False
  213.                 screen.attachImageButton( panelName, "", gc.getBonusInfo(eBonus).getButton(), GenericButtonSizes.BUTTON_SIZE_CUSTOM, WidgetTypes.WIDGET_PEDIA_JUMP_TO_BONUS, eBonus, -1, False )                    
  214.  
  215.         if len(szRightDelimeter) > 0:
  216.             screen.attachLabel(panelName, "", szRightDelimeter)
  217.  
  218.         # add religion buttons
  219.         iPrereq = gc.getUnitInfo(self.iUnit).getPrereqReligion()
  220.         if (iPrereq >= 0):
  221.             screen.attachImageButton( panelName, "", gc.getReligionInfo(iPrereq).getButton(), GenericButtonSizes.BUTTON_SIZE_CUSTOM, WidgetTypes.WIDGET_HELP_RELIGION, iPrereq, -1, False )
  222.         
  223.         # add building buttons
  224.         iPrereq = gc.getUnitInfo(self.iUnit).getPrereqBuilding()
  225.         if (iPrereq >= 0):
  226.             screen.attachImageButton( panelName, "", gc.getBuildingInfo(iPrereq).getButton(), GenericButtonSizes.BUTTON_SIZE_CUSTOM, WidgetTypes.WIDGET_PEDIA_JUMP_TO_BUILDING, iPrereq, -1, False )        
  227.         
  228.     # Place upgrades
  229.     def placeUpgradesTo(self):
  230.  
  231.         screen = self.top.getScreen()
  232.  
  233.         panelName = self.top.getNextWidgetName()
  234.         screen.addPanel( panelName, localText.getText("TXT_KEY_PEDIA_UPGRADES_TO", ()), "", false, true, self.X_UPGRADES_TO_PANE, self.Y_UPGRADES_TO_PANE, self.W_UPGRADES_TO_PANE, self.H_UPGRADES_TO_PANE, PanelStyles.PANEL_STYLE_BLUE50)
  235.         
  236.         screen.attachLabel(panelName, "", "  ")
  237.  
  238.         for k in range(gc.getNumUnitClassInfos()):
  239.             if self.top.iActivePlayer == -1:
  240.                 eLoopUnit = gc.getUnitClassInfo(k).getDefaultUnitIndex()                
  241.             else:
  242.                 eLoopUnit = gc.getCivilizationInfo(gc.getGame().getActiveCivilizationType()).getCivilizationUnits(k)
  243.             if (eLoopUnit >= 0 and gc.getUnitInfo(self.iUnit).getUpgradeUnitClass(k)):
  244.                 screen.attachImageButton( panelName, "", gc.getUnitInfo(eLoopUnit).getButton(), GenericButtonSizes.BUTTON_SIZE_CUSTOM, WidgetTypes.WIDGET_PEDIA_JUMP_TO_UNIT, eLoopUnit, 1, False )
  245.  
  246.     # Place Special abilities
  247.     def placeSpecial(self):
  248.  
  249.         screen = self.top.getScreen()
  250.         
  251.         panelName = self.top.getNextWidgetName()
  252.         screen.addPanel( panelName, localText.getText("TXT_KEY_PEDIA_SPECIAL_ABILITIES", ()), "", true, false,
  253.                                  self.X_SPECIAL_PANE, self.Y_SPECIAL_PANE, self.W_SPECIAL_PANE, self.H_SPECIAL_PANE, PanelStyles.PANEL_STYLE_BLUE50 )
  254.         
  255.         listName = self.top.getNextWidgetName()
  256.         screen.attachListBoxGFC( panelName, listName, "", TableStyles.TABLE_STYLE_EMPTY )
  257.         screen.enableSelect(listName, False)
  258.         
  259.         szSpecialText = CyGameTextMgr().getUnitHelp( self.iUnit, True, False, False, None )
  260.         splitText = string.split( szSpecialText, "\n" )
  261.         for special in splitText:
  262.             if len( special ) != 0:
  263.                 screen.appendListBoxString( listName, special, WidgetTypes.WIDGET_GENERAL, -1, -1, CvUtil.FONT_LEFT_JUSTIFY )
  264.                     
  265.     def placeLinks(self):
  266.  
  267.         screen = self.top.getScreen()
  268.  
  269.         screen.clearListBoxGFC(self.top.LIST_ID)
  270.         
  271.         # sort Units alphabetically
  272.         unitsList=[(0,0)]*gc.getNumUnitInfos()
  273.         for j in range(gc.getNumUnitInfos()):
  274.             unitsList[j] = (gc.getUnitInfo(j).getDescription(), j)
  275.         unitsList.sort()    
  276.         
  277.         iSelected = 0
  278.         for iI in range(gc.getNumUnitInfos()):
  279.             screen.appendListBoxString( self.top.LIST_ID, unitsList[iI][0], WidgetTypes.WIDGET_PEDIA_JUMP_TO_UNIT, unitsList[iI][1], 0, CvUtil.FONT_LEFT_JUSTIFY )
  280.             if unitsList[iI][1] == self.iUnit:
  281.                 iSelected = iI            
  282.  
  283.         screen.setSelectedListBoxStringGFC(self.top.LIST_ID, iSelected)
  284.             
  285.     def placePromotions(self):
  286.         screen = self.top.getScreen()
  287.         
  288.         # add pane and text
  289.         panelName = self.top.getNextWidgetName()
  290.         screen.addPanel(panelName, localText.getText("TXT_KEY_PEDIA_CATEGORY_PROMOTION", ()), "", true, true, self.X_PROMO_PANE, self.Y_PROMO_PANE, self.W_PROMO_PANE, self.H_PROMO_PANE, PanelStyles.PANEL_STYLE_BLUE50 )
  291.                 
  292.         # add promotion buttons
  293.         rowListName = self.top.getNextWidgetName()
  294.         screen.addMultiListControlGFC(rowListName, "", self.X_PROMO_PANE+15, self.Y_PROMO_PANE+40, self.W_PROMO_PANE-20, self.H_PROMO_PANE-20, 1, self.PROMOTION_ICON_SIZE, self.PROMOTION_ICON_SIZE, TableStyles.TABLE_STYLE_STANDARD)
  295.     
  296.         for k in range(gc.getNumPromotionInfos()):
  297.             if (isPromotionValid(k, self.iUnit)):
  298.                 screen.appendMultiListButton( rowListName, gc.getPromotionInfo(k).getButton(), 0, WidgetTypes.WIDGET_PEDIA_JUMP_TO_PROMOTION, k, -1, false )
  299.                                 
  300.     # Will handle the input for this screen...
  301.     def handleInput (self, inputClass):
  302.         return 0
  303.  
  304.  
  305.