示例#1
0
    def _researchContext(self, tech):
        player = client.getPlayer()

        descr = []
        improvement = player.techs.get(self.techID, 0)
        if hasattr(tech, 'researchMod'):
            prefix = _('Improvement') if improvement else _('Research')
            descr.append(
                _('%s costs: %d') %
                (prefix, Utils.getTechRCost(player, self.techID)))
            descr.append('')
        # requires
        if tech.researchRequires and improvement == 0:
            descr.append(_('Research requires:'))
            for tmpTechID, improvement in tech.researchRequires:
                tmpTech = client.getTechInfo(tmpTechID)
                descr.append(
                    _(' - %s improvement %d (TL%d)') %
                    (tmpTech.name, improvement, tmpTech.level))
            if hasattr(tech, "researchReqSRes"):
                for stratRes in tech.researchReqSRes:
                    descr.append(
                        _(" - %s (strategic resource)") %
                        (gdata.stratRes[stratRes]))
            descr.append('')
        if hasattr(tech, "researchDisables") and tech.researchDisables:
            descr.append(_("Research disables:"))
            for tmpTechID in tech.researchDisables:
                tmpTech = client.getTechInfo(tmpTechID)
                descr.append(_(" - %s (TL%d)") % (tmpTech.name, tmpTech.level))
            descr.append('')
        return descr
示例#2
0
 def _designRepresentation(self, player):
     if self.highlightedDesignID is None:
         if self.editMode:
             if self.ctrlID:
                 eqIDs = {self.ctrlID: 1}
             else:
                 eqIDs = {}
             for eqID in self.eqIDs:
                 eqIDs[eqID] = self.eqIDs[eqID]
             improvements = []
         else:
             self.hullID = self.ctrlID = None
             self.win.vName.text = ""
             self.eqIDs = {}
             eqIDs = {}
             improvements = []
     else:
         spec = player.shipDesigns[self.highlightedDesignID]
         self.hullID = spec.hullID
         eqIDs = spec.eqIDs
         improvements = spec.improvements
         self.win.vName.text = spec.name
         self.win.vHull.text = client.getTechInfo(self.hullID).name
         self.eqIDs = {}
         for eqID in eqIDs:
             tech = client.getTechInfo(eqID)
             if tech.subtype == "seq_ctrl":
                 self.ctrlID = eqID
                 self.win.vCtrl.text = tech.name
             else:
                 self.eqIDs[eqID] = eqIDs[eqID]
     try:
         result = ShipUtils.makeShipFullSpec(player, None, self.hullID,
                                             eqIDs, improvements)
         if self.editMode:
             self.win.vConstruct.enabled = 1
     except GameException as e:
         self.win.setStatus(e.args[0])
         self.win.vConstruct.enabled = 0
         try:
             result = ShipUtils.makeShipFullSpec(player,
                                                 None,
                                                 self.hullID,
                                                 eqIDs,
                                                 improvements,
                                                 raiseExs=False)
         except GameException:
             result = None
     else:
         self.win.setStatus(_("Ready."))
     return result
示例#3
0
    def showItems(self):
        items = []
        selected = None
        player = client.getPlayer()
        for techID in player.techs:
            tech = client.getTechInfo(techID)
            if getattr(tech, self.techType) == 0:
                continue
            if self.techSubtype and tech.subtype not in self.techSubtype:
                continue
            # skip equipment not suitable for this hull
            if tech.minHull > self.hullType:
                continue
            if tech.maxHull < self.hullType:
                continue

            techType = self.getTechType(tech)
            if self.typeFilter & techType == 0:
                continue

            item = ui.Item(tech.name,
                           tData=sequip.getLongDescr(techID),
                           techID=techID,
                           tType=typeText[techType])

            if techID == self.selected:
                selected = item

            items.append(item)
        self.win.vList.items = items
        self.win.vList.itemsChanged()
        self.win.vList.selectItem(selected)
示例#4
0
	def show(self):
		player = client.getPlayer()

		self.buildingsCount = {}
		self.buildingsPos = {}
		for planetID in player.planets:
			planet = client.get(planetID)
			if hasattr(planet, "slots"):
				for struct in planet.slots:
					techID = struct[STRUCT_IDX_TECHID]
					if not techID in self.buildingsCount:
						self.buildingsCount[techID] = 1
					else:
						self.buildingsCount[techID] = self.buildingsCount[techID] + 1
					if not techID in self.buildingsPos:
						self.buildingsPos[techID] = {planetID: 1}
					else:
						planetList = self.buildingsPos[techID]
						if not planetID in planetList:
							planetList[planetID] = 1
						else:
							planetList[planetID] = planetList[planetID] + 1

		items = []
		for techID in self.buildingsCount:
			tech = client.getTechInfo(techID)
			items.append(ui.Item(tech.name, tStructCount = self.buildingsCount[techID], techID = techID))

		self.win.vStructures.items = items
		self.win.vStructures.itemsChanged()
示例#5
0
    def _showStructures(self, prodProd):
        items = []

        for techID in client.getPlayer().techs.keys():
            tech = client.getTechInfo(techID)
            if not tech.isStructure or tech.level not in self.showLevels or \
               (tech.isStructure and not self._filterStructure(tech)):
                continue

            if prodProd > 0:
                etc = math.ceil(float(tech.buildProd) / prodProd)
                if self.sourceID != self.planetID:
                    etc *= Rules.buildOnAnotherPlanetMod
                etc = res.formatTime(etc)
            else:
                etc = _("N/A")

            item = ui.Item(
                etc,
                techID=techID,
                tIsShip=0,
                name=tech.name,
                tl=tech.level,
                subtype=tech.subtype,
                icons=((res.getTechImg(techID), ui.ALIGN_N), ),
                font="small-bold",
                align=ui.ALIGN_S,
                tooltipTitle=_("Details"),
                tooltip="%s, %d %s, %s %d" %
                (tech.name, tech.buildProd, _("CP"), _("TL"), tech.level),
                statustip="%s, %d %s, %s %d" %
                (tech.name, tech.buildProd, _("CP"), _("TL"), tech.level))
            self.maxTechLevel = max(self.maxTechLevel, tech.level)
            items.append(item)
        return items
示例#6
0
    def showSlots(self):
        # techs
        items = []
        techs = {}
        if self.showStructures:
            player = client.getPlayer()
            target = client.get(self.targetID, noUpdate=1)
            if hasattr(target, 'slots') and target.owner == player.oid:
                if len(target.slots) < target.plSlots:
                    item = ui.Item(_("Free slot"), techID=0)
                    items.append(item)
                for struct in target.slots:
                    if not struct[Const.STRUCT_IDX_TECHID] in techs:
                        techs[struct[Const.STRUCT_IDX_TECHID]] = 1
                    else:
                        techs[struct[Const.STRUCT_IDX_TECHID]] += 1
                for tech in techs.keys():
                    techInfo = client.getTechInfo(tech)
                    item = ui.Item("%s (%d)" % (techInfo.name, techs[tech]),
                                   techID=tech)
                    items.append(item)

        self.win.vTSlots.items = items
        self.win.vTSlots.itemsChanged()
        self.structToDemolish = Const.OID_NONE
示例#7
0
    def show(self):
        tech = client.getTechInfo(self.techID)
        self.win.title = _('Technology: %s (TL%d)') % (tech.name, tech.level)
        # fill data
        # fill description
        descr = []
        descr.extend(self._researchContext(tech))
        if hasattr(tech, 'partialData') and hasattr(tech, 'textPreRsrch'):
            # preresearch info
            descr.extend(self._preResearch(tech))
        elif not hasattr(tech, 'partialData'):
            descr.extend(self._researchEnablement(tech))
            descr.extend(self._productionDependency(tech))
            descr.extend(self._stratResources(tech))
            descr.extend(self._descriptionFlavor(tech))

        if not len(descr):
            descr.append(_('No information available'))
        #
        self.win.vDescr.text = descr

        self._prepareTypeButtons(tech)

        self.win.vData.items = self._processAttributes(tech)
        self.win.vData.itemsChanged()
示例#8
0
    def showItems(self):
        items = []
        selected = None
        player = client.getPlayer()
        for techID in player.techs:
            tech = client.getTechInfo(techID)
            if getattr(tech, self.techType) == 0:
                continue
            if self.techSubtype and tech.subtype not in self.techSubtype:
                continue
            # skip equipment not suitable for this hull
            if tech.minHull > self.hullType:
                continue
            if tech.maxHull < self.hullType:
                continue

            techType = self.getTechType(tech)
            if self.typeFilter & techType == 0:
                continue

            item = ui.Item(tech.name, tData = sequip.getLongDescr(techID), techID = techID,
                            tType = typeText[techType])

            if techID == self.selected:
                selected = item

            items.append(item)
        self.win.vList.items = items
        self.win.vList.itemsChanged()
        self.win.vList.selectItem(selected)
示例#9
0
 def onConstruct(self, widget, action, data):
     planet = client.get(self.planetID, noUpdate = 1)
     player = client.getPlayer()
     if not self.techID:
         self.win.setStatus(_('Select technology to construct.'))
         return
     if not self.targetID:
         self.win.setStatus(_('Select planet to construct on.'))
         return
     try:
         self.quantity = int(self.win.vQuantity.text)
     except ValueError:
         self.win.setStatus(_('Specify quantity (1, 2, 3, ...).'))
         return
     # government centers have additional query and if confirmed, another round of this function is called
     if self.techID < 1000:
         tech = player.shipDesigns[self.techID]
     else:
         tech = client.getTechInfo(self.techID)
     if not getattr(tech, 'govPwr', 0) == 0 and not self.govTransferConfirm:
         # confirm dialog doesn't send through parameters, so we have to save them
         self.govTransferData = (widget, action, data)
         self.confirmDlg.display(_("Do you want to issue relocation of your government?"),
             _("Yes"), _("No"), self.onGovTransferConfirmed)
     else:
         try:
             self.win.setStatus(_('Executing START CONSTRUCTION command...'))
             planet.prodQueue, player.stratRes = client.cmdProxy.startConstruction(self.planetID,
                 self.techID, self.quantity, self.targetID, self.techID < 1000,
                 self.win.vReportFin.checked, self.structToDemolish)
             self.win.setStatus(_('Command has been executed.'))
         except GameException, e:
             self.win.setStatus(e.args[0])
             return
示例#10
0
    def show(self):
        player = client.getPlayer()

        self.buildingsCount = {}
        self.buildingsPos = {}
        for planetID in player.planets:
            planet = client.get(planetID)
            if hasattr(planet, "slots"):
                for struct in planet.slots:
                    techID = struct[STRUCT_IDX_TECHID]
                    if not techID in self.buildingsCount:
                        self.buildingsCount[techID] = 1
                    else:
                        self.buildingsCount[
                            techID] = self.buildingsCount[techID] + 1
                    if not techID in self.buildingsPos:
                        self.buildingsPos[techID] = {planetID: 1}
                    else:
                        planetList = self.buildingsPos[techID]
                        if not planetID in planetList:
                            planetList[planetID] = 1
                        else:
                            planetList[planetID] = planetList[planetID] + 1

        items = []
        for techID in self.buildingsCount:
            tech = client.getTechInfo(techID)
            items.append(
                ui.Item(tech.name,
                        tStructCount=self.buildingsCount[techID],
                        techID=techID))

        self.win.vStructures.items = items
        self.win.vStructures.itemsChanged()
示例#11
0
 def _processProdQueue(self, planet):
     player = client.getPlayer()
     if planet.prodQueue and planet.effProdProd > 0:
         index = 0
         totalProd = 0
         for task in planet.prodQueue:
             if task.isShip:
                 tech = player.shipDesigns[task.techID]
             else:
                 tech = client.getFullTechInfo(task.techID)
             prodFirst, prodNext = self._getTaskProd(task, tech, planet.oid)
             if index == 0:
                 constrInfo = tech.name
                 etc = math.ceil(float(prodFirst) / planet.effProdProd)
             totalProd += prodFirst + prodNext
             index += 1
         etc = res.formatTime(etc)
         totalEtc = res.formatTime(math.ceil(float(totalProd) / planet.effProdProd))
     elif planet.prodQueue:
         task = planet.prodQueue[0]
         if task.isShip:
             tech = player.shipDesigns[task.techID]
         else:
             tech = client.getTechInfo(task.techID)
         constrInfo = tech.name
         etc = _('N/A')
         totalEtc = _("N/A")
     else:
         constrInfo = _("-")
         etc = "-"
         totalEtc = _("-")
     return constrInfo, etc, totalEtc
示例#12
0
    def _showProjects(self):
        items = []
        for techID in client.getPlayer().techs.keys():
            tech = client.getTechInfo(techID)
            if tech.level not in self.showLevels or not tech.isProject:
                continue
            items.append(self._processNonShips(tech))

        return items
示例#13
0
 def _detailComputedAttributes(self, player, result):
     if result:
         hull = client.getTechInfo(result.hullID)
         self.win.vAClass.text = _(gdata.shipClasses[result.combatClass])
         self.win.vASignature.text = _("%d") % result.signature
         if result.speed == result.battleSpeed:
             self.win.vSpeed.text = _("Speed")
             self.win.vASpeed.text = _("%.2f") % result.speed
         else:
             self.win.vSpeed.text = _("Spd FTL (STL)")
             self.win.vASpeed.text = _("%.2f (%.2f)") % (result.speed,
                                                         result.battleSpeed)
         self.win.vAHP.text = _("%d - %d") % (
             result.maxHP, result.shieldHP
         ) if result.shieldHP > 0 else _("%d") % result.maxHP
         self.win.vAAttack.text = _("%d") % result.combatAtt
         self.win.vADefence.text = _("%d / %d") % (result.combatDef,
                                                   result.missileDef)
         self.win.vAPayload.text = _("%d") % (hull.maxWeight -
                                              result.weight) if getattr(
                                                  hull, "maxWeight",
                                                  None) else _("N/A")
         self.win.vASlots.text = _("%d") % (hull.slots -
                                            result.slots) if hasattr(
                                                hull, "slots") else _("N/A")
         self.win.vATanks.text = _("%d") % result.storEn
         if result.speed > 0 and result.operEn > 0:
             support = result.storEn / result.operEn
             self.win.vARange.text = _("%.2f") % (support * result.speed /
                                                  Rules.turnsPerDay)
         else:
             self.win.vARange.text = _("None")
         self.win.vACCPts.text = _("%d") % result.buildProd
         self.win.vACombatPwr.text = _("%d") % result.combatPwr
         if self.highlightedDesignID and player.shipDesigns[
                 self.highlightedDesignID].upgradeTo:
             self.win.vAUpgrade.text = player.shipDesigns[
                 player.shipDesigns[
                     self.highlightedDesignID].upgradeTo].name
             self.win.vAUpgrade.font = "normal-italic"
         else:
             self.win.vAUpgrade.text = _("N/A")
             self.win.vAUpgrade.font = "normal"
     else:
         self.win.vAClass.text = _("N/A")
         self.win.vASignature.text = _("N/A")
         self.win.vASpeed.text = _("N/A")
         self.win.vAHP.text = _("N/A")
         self.win.vAAttack.text = _("N/A")
         self.win.vADefence.text = _("N/A")
         self.win.vAPayload.text = _("N/A")
         self.win.vASlots.text = _("N/A")
         self.win.vATanks.text = _("N/A")
         self.win.vARange.text = _("N/A")
         self.win.vACCPts.text = _("N/A")
         self.win.vACombatPwr.text = _("N/A")
         self.win.vAUpgrade.text = _("N/A")
示例#14
0
 def _designRepresentation(self, player):
     if self.highlightedDesignID is None:
         if self.editMode:
             if self.ctrlID:
                 eqIDs = {self.ctrlID : 1}
             else:
                 eqIDs = {}
             for eqID in self.eqIDs:
                 eqIDs[eqID] = self.eqIDs[eqID]
             improvements = []
         else:
             self.hullID = self.ctrlID = None
             self.win.vName.text = ""
             self.eqIDs = {}
             eqIDs = {}
             improvements = []
     else:
         spec = player.shipDesigns[self.highlightedDesignID]
         self.hullID = spec.hullID
         eqIDs = spec.eqIDs
         improvements = spec.improvements
         self.win.vName.text = spec.name
         self.win.vHull.text = client.getTechInfo(self.hullID).name
         self.eqIDs = {}
         for eqID in eqIDs:
             tech = client.getTechInfo(eqID)
             if tech.subtype == "seq_ctrl":
                 self.ctrlID = eqID
                 self.win.vCtrl.text = tech.name
             else:
                 self.eqIDs[eqID] = eqIDs[eqID]
     try:
         result = ShipUtils.makeShipFullSpec(player, None, self.hullID, eqIDs, improvements)
         if self.editMode:
             self.win.vConstruct.enabled = 1
     except GameException, e:
         self.win.setStatus(e.args[0])
         self.win.vConstruct.enabled = 0
         try:
             result = ShipUtils.makeShipFullSpec(player, None, self.hullID, eqIDs,
                 improvements, raiseExs = False)
         except GameException:
             result = None
示例#15
0
    def onConstruct(self, widget, action, data):
        if not data:
            self.win.setStatus(_('Select technology to construct.'))
            return

        if not self.sourceID:
            self.sourceID = self.planetID

        try:
            self.quantity = int(self.win.vQuantity.text)
        except ValueError:
            self.win.setStatus(_('Specify quantity (1, 2, 3, ...).'))
            return
        # government centers have additional query and if confirmed, another round of this function is called
        tech = client.getTechInfo(data.techID)
        if tech.govPwr and not self.govTransferConfirm:
            # confirm dialog doesn't send through parameters, so we have to save them
            self.govTransferData = (widget, action, data)
            self.confirmDlg.display(_("Do you want to issue relocation of your government?"),
                _("Yes"), _("No"), self.onGovTransferConfirmed)
        else:
            try:
                self.win.setStatus(_('Executing START CONSTRUCTION command...'))
                planet = client.get(self.sourceID, noUpdate = 1)
                player = client.getPlayer()
                if self.extraSlot:
                    # check required special resources, if not available, do not continue
                    # (without check, server start slot expansion but not the tech)
                    specialResources = player.stratRes
                    for sr in tech.buildSRes:
                        if specialResources.get(sr, 0) < self.quantity:
                            self.win.setStatus(_('You do not own required strategic resource(s)'))
                            return
                        else:
                            specialResources[sr] = specialResources.get(sr, 0) - self.quantity
                    for i in range(1, self.quantity + 1):
                        # as we need two slots instead of one, check whether is task queue short
                        # enough (ie 8 tasks max)
                        if len(planet.prodQueue) > 8:
                            self.win.setStatus(_('Queue is full'))
                            return
                        client.cmdProxy.startConstruction(self.sourceID,
                            Rules.Tech.ADDSLOT3, 1, self.planetID, False,
                            self.win.vReportFin.checked, OID_NONE)
                        planet.prodQueue, player.stratRes = client.cmdProxy.startConstruction(self.sourceID,
                            data.techID, 1, self.planetID, data.techID < 1000,
                            self.win.vReportFin.checked, self.structToDemolish)
                else:
                        planet.prodQueue, player.stratRes = client.cmdProxy.startConstruction(self.sourceID,
                        data.techID, self.quantity, self.planetID, data.techID < 1000,
                        self.win.vReportFin.checked, self.structToDemolish)
                self.win.setStatus(_('Command has been executed.'))
            except GameException, e:
                self.win.setStatus(e.args[0])
                return
示例#16
0
 def _getPlayerRace(self):
     player = client.getPlayer()
     raceChoosen = None
     if player.techLevel == 1:
         techID = set(player.techs).intersection(set(
             [1990, 1991,
              1992])).pop()  # these are the race-selecting techs
         raceChoosen = client.getTechInfo(techID).data
     else:
         raceChoosen = player.race
     return raceChoosen
示例#17
0
 def _detailComputedAttributes(self, player, result):
     if result:
         hull = client.getTechInfo(result.hullID)
         self.win.vAClass.text = _(gdata.shipClasses[result.combatClass])
         self.win.vASignature.text = _("%d") % result.signature
         if result.speed == result.battleSpeed:
             self.win.vSpeed.text = _("Speed")
             self.win.vASpeed.text = _("%.2f") % result.speed
         else:
             self.win.vSpeed.text = _("Spd FTL (STL)")
             self.win.vASpeed.text = _("%.2f (%.2f)") % (result.speed, result.battleSpeed)
         if result.shieldHP > 0:
             self.win.vAHP.text = _("%d - %d") % (result.maxHP, result.shieldHP)
         else:
             self.win.vAHP.text = _("%d") % result.maxHP
         self.win.vAAttack.text = _("%d") % result.combatAtt
         self.win.vADefence.text = _("%d / %d") % (result.combatDef, result.missileDef)
         if hasattr(hull, "maxWeight"):
             self.win.vAPayload.text = _("%d") % (hull.maxWeight - result.weight)
         else:
             self.win.vAPayload.text = _("N/A")
         if hasattr(hull, "slots"):
             self.win.vASlots.text = _("%d") % (hull.slots - result.slots)
         else:
             self.win.vASlots.text = _("N/A")
         self.win.vATanks.text = _("%d") % result.storEn
         if result.speed > 0:
             support = 10000000
             if result.operEn > 0: support = min(support, result.storEn / result.operEn)
             self.win.vARange.text = _("%.2f") % (support * result.speed / Rules.turnsPerDay)
         else:
             self.win.vARange.text = _("None")
         self.win.vACCPts.text = _("%d") % result.buildProd
         self.win.vACombatPwr.text = _("%d") % result.combatPwr
         if self.highlightedDesignID and player.shipDesigns[self.highlightedDesignID].upgradeTo:
             self.win.vAUpgrade.text = player.shipDesigns[player.shipDesigns[self.highlightedDesignID].upgradeTo].name
             self.win.vAUpgrade.font = "normal-italic"
         else:
             self.win.vAUpgrade.text = _("N/A")
             self.win.vAUpgrade.font = "normal"
     else:
         self.win.vAClass.text = _("N/A")
         self.win.vASignature.text = _("N/A")
         self.win.vASpeed.text = _("N/A")
         self.win.vAHP.text = _("N/A")
         self.win.vAAttack.text = _("N/A")
         self.win.vADefence.text = _("N/A")
         self.win.vAPayload.text = _("N/A")
         self.win.vASlots.text = _("N/A")
         self.win.vATanks.text = _("N/A")
         self.win.vARange.text = _("N/A")
         self.win.vACCPts.text = _("N/A")
         self.win.vACombatPwr.text = _("N/A")
         self.win.vAUpgrade.text = _("N/A")
示例#18
0
	def onSelectStruct(self, widget, action, data):
		planetList = self.buildingsPos[data.techID]
		tech = client.getTechInfo(data.techID)
		self.win.vPlanetsTitle.text = _("Planets with structure %s") % tech.name
		if planetList:
			items = []
			for planetID in planetList:
				planet = client.get(planetID)
				items.append(ui.Item(planet.name, tStructCount = planetList[planetID], planetID = planetID))
			self.win.vPlanets.items = items
			self.win.vPlanets.itemsChanged()
 def onSelectStruct(self, widget, action, data):
     planetList = self.buildingsPos[data.techID]
     tech = client.getTechInfo(data.techID)
     self.win.vPlanetsTitle.text = _("Planets with structure %s") % tech.name
     if planetList:
         items = []
         for planetID in planetList:
             planet = client.get(planetID)
             items.append(ui.Item(planet.name, tStructCount = planetList[planetID], planetID = planetID))
         self.win.vPlanets.items = items
         self.win.vPlanets.itemsChanged()
示例#20
0
    def _showStructures(self):
        items = []

        for techID in client.getPlayer().techs.keys():
            tech = client.getTechInfo(techID)
            if not tech.isStructure or tech.level not in self.showLevels or \
               (tech.isStructure and not self._filterStructure(tech)):
                continue
            items.append(self._processNonShips(tech))

        return items
示例#21
0
    def _processResearchable(self, disabled, queued):
        player = client.getPlayer()

        items = []
        for techID in client.getAllTechIDs():
            if techID in player.techs or techID in queued or techID in disabled:
                continue
            tech = client.getTechInfo(techID)
            if not hasattr(tech, 'partialData') or not hasattr(
                    tech, 'researchMod'):
                continue
            items.append(self._processResearchableTech(tech))
        self.win.vRTechs.items = items
        self.win.vRTechs.itemsChanged()
示例#22
0
    def _processProjects(self):
        items = []
        for techID in client.getPlayer().techs.keys():
            tech = client.getTechInfo(techID)

            if not tech.isProject or tech.globalDisabled or tech.level not in self.showLevels:
                continue

            item = ui.Item(tech.name,
                           tLevel=tech.level,
                           tProd=tech.buildProd,
                           techID=techID,
                           tIsShip=0)
            items.append(item)
        return items
示例#23
0
    def _processKnownTech(self):
        player = client.getPlayer()

        items = []
        disabled = []
        scheduledIDs = set([task.techID for task in player.rsrchQueue])
        for techID in player.techs.keys():
            if techID in player.obsoleteTechs and not self.showObsolete:
                continue
            tech = client.getTechInfo(techID)
            improvement = player.techs[techID]
            if improvement == tech.maxImprovement and not self.showCompleted:
                continue
            items.append(self._processImprovableTech(tech, scheduledIDs))
            disabled.extend(tech.researchDisables)
        self.win.vKTechs.items = items
        self.win.vKTechs.itemsChanged()
        return disabled
示例#24
0
 def showShip(self, techID, exp):
     tech = client.getPlayer().shipDesigns[techID]
     level = Rules.shipExpToLevel.get(int(exp / tech.baseExp),
                                      Rules.shipDefLevel)
     self.win.vShipModel.text = tech.name
     self.win.vShipClass.text = _(gdata.shipClasses[tech.combatClass])
     self.win.vShipAtt.text = int(tech.combatAtt *
                                  Rules.shipLevelEff[level])
     self.win.vShipDef.text = _("%d / %d") % (
         int(tech.combatDef * Rules.shipLevelEff[level]),
         int(tech.missileDef * Rules.shipLevelEff[level]),
     )
     self.win.vShipMaxSpeed.text = _("%.2f") % tech.speed
     self.win.vShipScannerPwr.text = tech.scannerPwr
     self.win.vShipSupport.text = _("%d + %d") % (
         tech.operEn, int(tech.buildProd * Rules.operProdRatio))
     info = _("Support: %d energy and %d contruction points per turn.") % (
         tech.operEn, int(tech.buildProd * Rules.operProdRatio))
     self.win.vShipSupport.statustip = info
     self.win.vShipSupport.tooltip = info
     self.win.vShipStorages.text = _("%d") % tech.storEn
     self.win.vShipSignature.text = tech.signature
     if tech.shieldHP > 0:
         self.win.vShipMaxHP.text = _("%d + %d") % (
             tech.maxHP,
             tech.shieldHP,
         )
     else:
         self.win.vShipMaxHP.text = _("%d") % (tech.maxHP, )
     # show equipment
     items = []
     for techID in tech.eqIDs:
         eq = client.getTechInfo(techID)
         short = sequip.getShortDescr(techID)
         long = sequip.getLongDescr(techID)
         item = ui.Item(_("%d x %s") % (tech.eqIDs[techID], eq.name),
                        tData=short,
                        tooltip=long,
                        statustip=long)
         items.append(item)
     self.win.vShipEquipment.items = items
     self.win.vShipEquipment.itemsChanged()
示例#25
0
    def _researchEnablement(self, tech):
        descr = []
        tmp = []
        raceChoosen = self._getPlayerRace()

        for improvement in range(1, 6):
            for tmpTechID in tech.researchEnables[improvement]:
                tmpTech = client.getTechInfo(tmpTechID)
                racesDispl = ""
                if 0 < len(tmpTech.researchRaces) < 3 and not raceChoosen:
                    racesDispl = _(", only for %s") % tmpTech.researchRaces
                if not raceChoosen or not tmpTech.researchRaces or raceChoosen in tmpTech.researchRaces:
                    tmp.append(
                        _(' - %s (with improvement %d, on TL%d%s)') %
                        (tmpTech.name, improvement, tmpTech.level, racesDispl))
        if tmp:
            descr.append(_('Research/Improvement enables:'))
            descr.extend(tmp)
            descr.append('')
        return descr
示例#26
0
    def _processResearchQueueTask(self, task):
        player = client.getPlayer()
        tech = client.getTechInfo(task.techID)
        fulltech = client.getFullTechInfo(task.techID)
        researchSci = Utils.getTechRCost(player, task.techID, task.improvement)
        item = ui.Item(tech.name, techID=task.techID)
        item.tooltipTitle = _("Details")
        item.tooltip = _("Research points %d/%d, change %d pts/turn.") % (
            task.currSci, researchSci, task.changeSci)
        item.statustip = item.tooltip
        item.tImpToMax = "*" if task.improveToMax else ""
        item.tImproveToMax = task.improveToMax
        item.tProgress = _("%d %%") % int(
            task.currSci * 100 / researchSci) if task.currSci > 0 else _("-")
        totalSci = 0
        if task.changeSci > 0:
            etc = float(researchSci - task.currSci) / max(
                task.changeSci, player.effSciPoints)
            totalSci += researchSci - task.currSci
            if player.effSciPoints > 0:
                item.tETC = res.formatTime(etc)
            else:
                item.tETC = res.getNA()
        elif task.changeSci < 0:
            etc = -float(task.currSci) / min(task.changeSci,
                                             player.effSciPoints)
            item.tETC = _("[%s]") % res.formatTime(etc)
        elif player.effSciPoints > 0:
            etc = float(researchSci) / player.effSciPoints
            totalSci += researchSci
            item.tETC = res.formatTime(etc)
        else:
            item.tETC = res.getNA()

        if task.improveToMax:
            for impr in range(task.improvement + 1,
                              fulltech.maxImprovement + 1):
                totalSci += Utils.getTechRCost(player, task.techID, impr)
        item.tLevel = _("%d-%d") % (tech.level, task.improvement)
        return item, totalSci
示例#27
0
 def showShip(self, techID, exp):
     tech = client.getPlayer().shipDesigns[techID]
     level = Rules.shipExpToLevel.get(int(exp / tech.baseExp), Rules.shipDefLevel)
     self.win.vShipModel.text = tech.name
     self.win.vShipClass.text = _(gdata.shipClasses[tech.combatClass])
     self.win.vShipAtt.text = int(tech.combatAtt * Rules.shipLevelEff[level])
     self.win.vShipDef.text = _("%d / %d") % (
         int(tech.combatDef * Rules.shipLevelEff[level]),
         int(tech.missileDef * Rules.shipLevelEff[level]),
     )
     self.win.vShipMaxSpeed.text = _("%.2f") % tech.speed
     self.win.vShipScannerPwr.text = tech.scannerPwr
     self.win.vShipSupport.text = _("%d + %d") % (tech.operEn, int(tech.buildProd * Rules.operProdRatio))
     info = _("Support: %d energy and %d contruction points per turn.") % (tech.operEn, int(tech.buildProd * Rules.operProdRatio))
     self.win.vShipSupport.statustip = info
     self.win.vShipSupport.tooltip = info
     self.win.vShipStorages.text = _("%d") % tech.storEn
     self.win.vShipSignature.text = tech.signature
     if tech.shieldHP > 0:
         self.win.vShipMaxHP.text = _("%d + %d") % (
             tech.maxHP,
             tech.shieldHP,
         )
     else:
         self.win.vShipMaxHP.text = _("%d") % (
             tech.maxHP,
         )
     # show equipment
     items = []
     for techID in tech.eqIDs:
         eq = client.getTechInfo(techID)
         short = sequip.getShortDescr(techID)
         long = sequip.getLongDescr(techID)
         item = ui.Item(_("%d x %s") % (tech.eqIDs[techID], eq.name),
             tData = short, tooltip = long, statustip = long)
         items.append(item)
     self.win.vShipEquipment.items = items
     self.win.vShipEquipment.itemsChanged()
示例#28
0
 def onConstruct(self, widget, action, data):
     planet = client.get(self.planetID, noUpdate=1)
     player = client.getPlayer()
     if not self.techID:
         self.win.setStatus(_('Select technology to construct.'))
         return
     if not self.targetID:
         self.win.setStatus(_('Select planet to construct on.'))
         return
     try:
         self.quantity = int(self.win.vQuantity.text)
     except ValueError:
         self.win.setStatus(_('Specify quantity (1, 2, 3, ...).'))
         return
     # government centers have additional query and if confirmed, another round of this function is called
     if self.techID < 1000:
         tech = player.shipDesigns[self.techID]
     else:
         tech = client.getTechInfo(self.techID)
     if not getattr(tech, 'govPwr', 0) == 0 and not self.govTransferConfirm:
         # confirm dialog doesn't send through parameters, so we have to save them
         self.govTransferData = (widget, action, data)
         self.confirmDlg.display(
             _("Do you want to issue relocation of your government?"),
             _("Yes"), _("No"), self.onGovTransferConfirmed)
     else:
         try:
             self.win.setStatus(
                 _('Executing START CONSTRUCTION command...'))
             planet.prodQueue, player.stratRes = client.cmdProxy.startConstruction(
                 self.planetID, self.techID, self.quantity, self.targetID,
                 self.techID < 1000, self.win.vReportFin.checked,
                 self.structToDemolish)
             self.win.setStatus(_('Command has been executed.'))
         except GameException, e:
             self.win.setStatus(e.args[0])
             return
示例#29
0
    def showSlots(self):
        # techs
        items = []
        techs = {}
        if self.showStructures:
            player = client.getPlayer()
            target = client.get(self.targetID, noUpdate = 1)
            if hasattr(target, 'slots') and target.owner == player.oid:
                if len(target.slots) < target.plSlots:
                    item = ui.Item(_("Free slot"), techID = 0)
                    items.append(item)
                for struct in target.slots:
                    if not struct[STRUCT_IDX_TECHID] in techs:
                        techs[struct[STRUCT_IDX_TECHID]] = 1
                    else:
                        techs[struct[STRUCT_IDX_TECHID]] += 1
                for tech in techs.keys():
                    techInfo = client.getTechInfo(tech)
                    item = ui.Item("%s (%d)" % (techInfo.name, techs[tech]), techID = tech)
                    items.append(item)

        self.win.vTSlots.items = items
        self.win.vTSlots.itemsChanged()
        self.structToDemolish = OID_NONE
示例#30
0
    def showTechs(self):
        # techs
        items = []
        select = None

        showSmall = self.win.vSmall.checked
        showMed = self.win.vMedium.checked
        showLarge = self.win.vLarge.checked
        showCivShip = self.win.vCivShip.checked
        showMilShip = self.win.vMilShip.checked

        for techID in client.getPlayer().techs.keys():
            tech = client.getTechInfo(techID)

            # hide pirate techs
            if tech.level == 99:
                continue

            if tech.isStructure or tech.globalDisabled:
                continue

            etc = _("N/A")
            item = ui.Item(
                tech.name,
                tLevel=tech.level,
                tProd=tech.buildProd,
                techID=techID,
                tIsShip=0,
            )
            if item.tLevel > self.maxTechLevel:
                self.maxTechLevel = item.tLevel

            if item.tLevel in self.showLevels and \
                (self.showOther and (tech.isProject)):
                items.append(item)
                if techID == self.techID:
                    select = item

        # special handling for ships
        player = client.getPlayer()
        if self.showShips:
            for designID in player.shipDesigns.keys():
                tech = player.shipDesigns[designID]

                if not ((tech.combatClass == 0 and showSmall) or
                        (tech.combatClass == 1 and showMed) or
                        (tech.combatClass == 2 and showLarge)):
                    continue

                if not ((tech.isMilitary and showMilShip) or
                        (not tech.isMilitary and showCivShip)):
                    continue

                if tech.upgradeTo != Const.OID_NONE:
                    # skip ships that are set to upgrade
                    continue
                etc = _("N/A")
                item = ui.Item(
                    tech.name,
                    tLevel=tech.level,
                    tProd=tech.buildProd,
                    techID=designID,
                    tIsShip=1,
                )
                items.append(item)
                if designID == self.techID:
                    select = item
        # sort it by level and then by name
        items.sort(key=lambda a: (100 - a.tLevel, a.text))
        self.win.vTechs.items = items
        self.win.vTechs.itemsChanged()
        self.win.vTechs.selectItem(select)
        # filter
        for i in xrange(1, 10):
            widget = getattr(self.win, 'vLevel%d' % i)
            if i in self.showLevels and i <= self.maxTechLevel:
                widget.visible = 1
                widget.pressed = 1
            elif i not in self.showLevels and i <= self.maxTechLevel:
                widget.visible = 1
                widget.pressed = 0
            else:
                widget.visible = 0
        self.win.vShipsToggle.pressed = self.showShips
        self.win.vOtherToggle.pressed = self.showOther
        # quantity
        self.win.vQuantity.text = str(self.quantity)
示例#31
0
 def _detailEquipmentLists(self):
     # design info
     if self.hullID:
         tech = client.getTechInfo(self.hullID)
         self.win.vHull.text = tech.name # TODO _(tech.name)
     elif self.editMode:
         self.win.vHull.text = _("[Click to select]")
     else:
         self.win.vHull.text = ""
     if self.ctrlID:
         tech = client.getTechInfo(self.ctrlID)
         self.win.vCtrl.text = tech.name # TODO _(tech.name)
     elif self.editMode:
         self.win.vCtrl.text = _("[Click to select]")
     else:
         self.win.vCtrl.text = ""
     # equipments
     engines = []
     weapons = []
     equipment = []
     selected = None
     selected_type = None
     for eqID in self.eqIDs:
         tech = client.getTechInfo(eqID)
         short = sequip.getShortDescr(eqID)
         long = sequip.getLongDescr(eqID)
         # cache has been introduced to let items preserve highlight information
         if eqID in self.itemCache:
             item = self.itemCache[eqID]
             item.tNumber = self.eqIDs[eqID]
         else:
             item = ui.Item(tech.name, techID = eqID, tNumber = self.eqIDs[eqID],
                 tData = short, tooltipTitle = _("Details"), tooltip = long, statustip = long)
             self.itemCache[eqID] = item
         if eqID == self.selectedEqID:
             selected = item
             selected_type = tech.subtype
         if tech.subtype == "seq_eng":
             engines.append(item)
         elif tech.subtype == "seq_wpn":
             weapons.append(item)
         elif tech.subtype in ["seq_mod", "seq_struct"]:
             equipment.append(item)
     self.win.vEngines.items = engines
     self.win.vEngines.itemsChanged()
     if selected_type == "seq_eng":
         self.win.vEngines.selectItem(selected)
     else:
         self.win.vEngines.selectItem(None)
     self.win.vWeapons.items = weapons
     self.win.vWeapons.itemsChanged()
     if selected_type == "seq_wpn":
         self.win.vWeapons.selectItem(selected)
     else:
         self.win.vWeapons.selectItem(None)
     self.win.vEquipment.items = equipment
     self.win.vEquipment.itemsChanged()
     if selected_type == "seq_mod":
         self.win.vEquipment.selectItem(selected)
     else:
         self.win.vEquipment.selectItem(None)
示例#32
0
 def show(self):
     player = client.getPlayer()
     #
     items = []
     for planetID in client.db.keys():
         planet = client.get(planetID, noUpdate=1)
         # skip non-planets
         if not hasattr(planet, "type") or planet.type != Const.T_PLANET:
             continue
         # shall be shown?
         ok = 0
         if hasattr(planet, 'owner'):
             if self.showMine and planet.owner == player.oid:
                 ok = 1
             if self.showOtherPlayers and planet.owner != Const.OID_NONE and \
                 planet.owner != player.oid:
                 ok = 1
             if self.showColonizable and planet.owner == Const.OID_NONE and \
                 planet.plType not in ('G', 'A'):
                 ok = 1
             if self.showUncolonizable and planet.plType in ('G', 'A'):
                 ok = 1
         elif hasattr(planet, 'plType'):
             if self.showColonizable and planet.plType not in ('G', 'A'):
                 ok = 1
             if self.showUncolonizable and planet.plType in ('G', 'A'):
                 ok = 1
         if not ok:
             continue
         # fill in data
         #rel = Const.REL_UNDEF
         maxNA = 999999
         maxNone = 99999
         ownerID = Const.OID_NONE
         if hasattr(planet, 'owner'):
             ownerID = planet.owner
             #if planet.owner != Const.OID_NONE:
             #    rel = client.getRelationTo(planet.owner)
             if planet.owner == Const.OID_NONE:
                 #else:
                 owner = _('[Nobody]')
         if hasattr(planet, 'owner') and planet.owner == player.oid:
             if planet.prodQueue and planet.effProdProd > 0:
                 index = 0
                 totalEtc = 0
                 for task in planet.prodQueue:
                     if task.isShip:
                         tech = client.getPlayer().shipDesigns[task.techID]
                     else:
                         tech = client.getFullTechInfo(task.techID)
                     if index == 0:
                         constrInfo = tech.name
                     # etc
                     if task.targetID != planetID:
                         if index == 0:
                             etc = math.ceil(
                                 float(tech.buildProd *
                                       Rules.buildOnAnotherPlanetMod -
                                       task.currProd) / planet.effProdProd)
                             totalEtc += etc
                             totalEtc += math.ceil(
                                 (task.quantity - 1) *
                                 float(tech.buildProd *
                                       Rules.buildOnAnotherPlanetMod) /
                                 planet.effProdProd)
                         else:
                             totalEtc += math.ceil(
                                 float(tech.buildProd *
                                       Rules.buildOnAnotherPlanetMod -
                                       task.currProd) / planet.effProdProd)
                             totalEtc += math.ceil(
                                 (task.quantity - 1) *
                                 float(tech.buildProd *
                                       Rules.buildOnAnotherPlanetMod) /
                                 planet.effProdProd)
                     else:
                         if index == 0:
                             etc = math.ceil(
                                 float(tech.buildProd - task.currProd) /
                                 planet.effProdProd)
                             totalEtc += etc
                             totalEtc += math.ceil(
                                 (task.quantity - 1) *
                                 float(tech.buildProd) / planet.effProdProd)
                         else:
                             totalEtc += math.ceil(
                                 task.quantity *
                                 float(tech.buildProd - task.currProd) /
                                 planet.effProdProd)
                             totalEtc += math.ceil(
                                 (task.quantity - 1) *
                                 float(tech.buildProd) / planet.effProdProd)
                     index += 1
                 etc_raw = etc
                 etc = res.formatTime(etc)
                 totalEtc_raw = totalEtc
                 totalEtc = res.formatTime(totalEtc)
             elif planet.prodQueue:
                 task = planet.prodQueue[0]
                 if task.isShip:
                     tech = client.getPlayer().shipDesigns[task.techID]
                 else:
                     tech = client.getTechInfo(task.techID)
                 constrInfo = tech.name
                 etc = _('N/A')
                 etc_raw = maxNA
                 totalEtc = _("N/A")
                 totalEtc_raw = maxNA
             elif planet.effProdProd > 0:
                 constrInfo = _("-")
                 etc = "-"
                 etc_raw = 0
                 totalEtc = _("-")
                 totalEtc_raw = 0
             else:
                 constrInfo = _("-")
                 etc = "-"
                 etc_raw = maxNone
                 totalEtc = _("-")
                 totalEtc_raw = maxNone
         else:
             constrInfo = '?'
             etc = '?'
             etc_raw = maxNA
             totalEtc = '?'
             totalEtc_raw = maxNA
         # used slots
         if hasattr(planet, 'slots'):
             freeSlots = planet.plSlots - len(planet.slots)
         else:
             freeSlots = '?'
         # morale
         if hasattr(planet, "morale"):
             morale = int(planet.morale)
         else:
             morale = "?"
         #
         plType = gdata.planetTypes[getattr(planet, 'plType', None)]
         # list item
         item = ui.Item(
             getattr(planet, 'name', res.getUnknownName()),
             tPlType=_(plType),
             tPlBio=getattr(planet, 'plBio', '?'),
             tPlMin=getattr(planet, 'plMin', '?'),
             tPlEn=getattr(planet, 'plEn', '?'),
             tChangeBio=getattr(planet, 'changeBio', '?'),
             tChangeEn=getattr(planet, 'changeEn', '?'),
             tETC=etc,
             tETC_raw=etc_raw,
             tTotalETC=totalEtc,
             tTotalETC_raw=totalEtc_raw,
             tConstrInfo=constrInfo,
             tFree=freeSlots,
             tMorale=morale,
             tSpace=getattr(planet, 'plSlots', '?'),
             tDiam=getattr(planet, 'plDiameter', 0) / 1000,
             tProd=getattr(planet, 'effProdProd', '?'),
             tSci=getattr(planet, 'effProdSci', '?'),
             tPlanetID=planetID,
             #foreground = res.getFFColorCode(rel),
             foreground=res.getPlayerColor(ownerID),
         )
         items.append(item)
     self.win.vPlanets.items = items
     self.win.vPlanets.itemsChanged()
     # buttons
     self.win.vMine.pressed = self.showMine
     self.win.vOtherPlayers = self.showOtherPlayers
     self.win.vColonizable = self.showColonizable
     self.win.vUncolonizable = self.showUncolonizable
示例#33
0
    def showTechs(self):
        # techs
        items = []
        select = None

        showMilitary = self.win.vMilitary.checked
        showBio = self.win.vBioProduction.checked
        showEn = self.win.vEnProduction.checked
        showCP = self.win.vCPProduction.checked
        showRP = self.win.vRPProduction.checked
        showMorale = self.win.vMorale.checked

        showSmall = self.win.vSmall.checked
        showMed = self.win.vMedium.checked
        showLarge = self.win.vLarge.checked
        showCivShip = self.win.vCivShip.checked
        showMilShip = self.win.vMilShip.checked

        for techID in client.getPlayer().techs.keys():
            tech = client.getTechInfo(techID)

            # hide pirate techs from ships and miscs view
            if not self.showStructures and tech.level == 99:
                continue

            if tech.isStructure:
                if (tech.isMilitary or getattr(tech, "prodBio", 0) > 0 or getattr(tech, "prodEnv", 0) > 0 or \
                        getattr(tech, "prodEn", 0) > 0 or getattr(tech, "prodProd", 0) > 0 or \
                        getattr(tech, "prodSci", 0) > 0 or getattr(tech, "moraleTrgt", 0) > 0):
                    if not ((tech.isMilitary and showMilitary) or \
                           ((getattr(tech, "prodBio", 0) > 0 or getattr(tech, "prodEnv", 0) > 0) and showBio) or \
                            (getattr(tech, "prodEn", 0) > 0 and showEn) or \
                            (getattr(tech, "prodProd", 0) > 0 and showCP) or \
                            (getattr(tech, "prodSci", 0) > 0 and showRP) or \
                            (getattr(tech, "moraleTrgt", 0) > 0 and showMorale)):
                        continue

            if self.prodProd > 0:
                etc = math.ceil(float(tech.buildProd) / self.prodProd)
                if self.targetID != self.planetID:
                    etc *= Rules.buildOnAnotherPlanetMod
                etc = res.formatTime(etc)
            else:
                etc = _("N/A")
            item = ui.Item(
                tech.name,
                tLevel=tech.level,
                tProd=tech.buildProd,
                techID=techID,
                tIsShip=0,
                tETC=etc,
            )
            if item.tLevel > self.maxTechLevel:
                self.maxTechLevel = item.tLevel

            if item.tLevel in self.showLevels and \
                ((self.showStructures and tech.isStructure) or \
                (self.showOther and (tech.isProject))):
                items.append(item)
                if techID == self.techID:
                    select = item

        # special handling for ships
        player = client.getPlayer()
        if self.showShips:
            for designID in player.shipDesigns.keys():
                tech = player.shipDesigns[designID]

                if not ((tech.combatClass == 0 and showSmall) or
                        (tech.combatClass == 1 and showMed) or
                        (tech.combatClass == 2 and showLarge)):
                    continue

                if not ((tech.isMilitary and showMilShip) or
                        (not tech.isMilitary and showCivShip)):
                    continue

                if tech.upgradeTo != Const.OID_NONE:
                    # skip ships that are set to upgrade
                    continue
                if self.prodProd > 0:
                    etc = res.formatTime(
                        math.ceil(float(tech.buildProd) / self.prodProd))
                else:
                    etc = _("N/A")
                item = ui.Item(
                    tech.name,
                    tLevel=tech.level,
                    tProd=tech.buildProd,
                    techID=designID,
                    tIsShip=1,
                    tETC=etc,
                )
                items.append(item)
                if designID == self.techID:
                    select = item
        # sort it by level and then by name
        items.sort(key=lambda a: (100 - a.tLevel, a.text))
        self.win.vTechs.items = items
        self.win.vTechs.itemsChanged()
        self.win.vTechs.selectItem(select)
        # filter
        for i in xrange(1, 10):
            widget = getattr(self.win, 'vLevel%d' % i)
            if i in self.showLevels and i <= self.maxTechLevel:
                widget.visible = 1
                widget.pressed = 1
            elif i not in self.showLevels and i <= self.maxTechLevel:
                widget.visible = 1
                widget.pressed = 0
            else:
                widget.visible = 0
        self.win.vStructuresToggle.pressed = self.showStructures
        self.win.vShipsToggle.pressed = self.showShips
        self.win.vOtherToggle.pressed = self.showOther
        # targets
        info = []
        system = client.get(self.systemID, noUpdate=1)
        select = None
        if hasattr(system, 'planets'):
            for planetID in system.planets:
                planet = client.get(planetID, noUpdate=1)
                owner = res.getUnknownName()
                #rel = Const.REL_UNDEF
                ownerID = Const.OID_NONE
                if hasattr(planet, 'owner'):
                    ownerID = planet.owner
                    if planet.owner != Const.OID_NONE:
                        owner = client.get(planet.owner, noUpdate=1).name
                        #rel = client.getRelationTo(planet.owner)
                    else:
                        owner = _('[Nobody]')
                if planet.plType in ("A", "G"):
                    color = gdata.sevColors[gdata.DISABLED]
                else:
                    #color = res.getFFColorCode(rel)
                    color = res.getPlayerColor(ownerID)
                plname = getattr(planet, 'name', res.getUnknownName())
                item = ui.Item(
                    plname,
                    text_raw=getattr(planet, 'plEn', plname),
                    planetID=planetID,
                    plOwner=owner,
                    foreground=color,
                )
                info.append(item)
                if planetID == self.targetID:
                    select = item
        self.win.vTargets.items = info
        self.win.vTargets.itemsChanged()
        self.win.vTargets.selectItem(select)
        # quantity
        self.win.vQuantity.text = str(self.quantity)
示例#34
0
	def show(self):
		player = client.getPlayer()
		# title
		self.win.vRQueueTitle.text = _('Research queue [%d pts/turn]') % (
			player.effSciPoints,
		)
		self.win.title = _("Research [TL%d]") % player.techLevel
		# Known techs
		items = []
		#~researchable = {}
		disabled = []
		taskIDs = {}
		for task in player.rsrchQueue:
			taskIDs[task.techID] = None
		for techID in player.techs.keys():
			tech = client.getTechInfo(techID)
			improvement = player.techs[techID]
			item = ui.Item(tech.name,
				techID = techID,
				tLevel = '%d-%d' % (tech.level, improvement),
				tStruct = (' ', '*')[tech.isStructure],
				tShip = (' ', '*')[tech.isShipEquip],
			)
			if improvement < Rules.techMaxImprovement and improvement < tech.maxImprovement:
				neededSci = Utils.getTechRCost(player, techID)
				if player.effSciPoints > 0:
					item.tETC = res.formatTime(float(neededSci) / player.effSciPoints)
				else:
					item.tETC = _("N/A")
				found = 0
				if taskIDs.has_key(techID):
					item.foreground = (0xd0, 0xd0, 0xd0)
				else:
					item.foreground = None
			else:
				item.tETC = res.getNA()
				item.foreground = (0x80, 0x80, 0x80)
				if not self.showCompleted:
					# skip this item
					continue
			items.append(item)
			disabled.extend(tech.researchDisables)
			#~for improvement in range(1, improvement + 1):
			#~	for techID in tech.researchEnables[improvement]:
			#~		researchable[techID] = 1
		self.win.vKTechs.items = items
		self.win.vKTechs.itemsChanged()
		# Research queue
		items = []
		index = 0
		queueTechs = []
		total = 0
		for task in player.rsrchQueue:
			tech = client.getTechInfo(task.techID)
			fulltech = client.getFullTechInfo(task.techID)
			queueTechs.append(task.techID)
			item = ui.Item(tech.name, techID = task.techID, index = index)
			researchSci = Utils.getTechRCost(player, task.techID, task.improvement)
			maxImprovement = min(Rules.techMaxImprovement,fulltech.maxImprovement)
			maxImpTotalSci = 0
			if task.improveToMax and task.improvement < maxImprovement:
				for impr in range(task.improvement+1,maxImprovement+1):
					maxImpTotalSci += Utils.getTechRCost(player, task.techID, impr)
			item.tooltip = _("Research points %d/%d, change %d pts/turn.") % (task.currSci, researchSci, task.changeSci)
			item.statustip = item.tooltip
			item.tImpToMax = ["", "*"][task.improveToMax]
			item.tImproveToMax = task.improveToMax
			if task.currSci > 0:
				item.tProgress = _("%d %%") % int(task.currSci * 100 / researchSci)
			else:
				item.tProgress = _("-")
			if task.changeSci > 0:
				value = float(researchSci - task.currSci) / max(task.changeSci, player.effSciPoints)
				total += int(value + 1)
				if player.effSciPoints > 0:
					total += float(maxImpTotalSci) / player.effSciPoints
					item.tETC = res.formatTime(value)
				else:
					total = 0
					item.tETC = res.getNA()
			elif task.changeSci < 0:
				value = - float(task.currSci) / min(task.changeSci, player.effSciPoints)
				item.tETC = _("[%s]") % res.formatTime(value)
			elif player.effSciPoints > 0:
				value = float(researchSci) / player.effSciPoints
				total += int(value + 1)
				total += float(maxImpTotalSci) / player.effSciPoints
				item.tETC = res.formatTime(value)
			else:
				item.tETC = res.getNA()
			item.tLevel = _("%d-%d") % (tech.level, task.improvement)
			items.append(item)
			index += 1
		self.win.vRQueue.items = items
		self.win.vRQueue.itemsChanged()
		self.win.vRQueueTop.enabled = 0
		self.win.vRQueueUp.enabled = 0
		self.win.vRQueueDown.enabled = 0
		self.win.vRQueueAbort.enabled = 0
		self.win.vRQueueRepat.enabled = 0
		self.win.vRQueueRepat.pressed = 0
		self.win.vRQueueInfo.enabled = 0
		if total == 0:
			self.win.vRTotal.text = _("N/A")
		else:
			self.win.vRTotal.text = res.formatTime(total)
		# Researchable techs
		items = []
		for techID in client.getAllTechIDs():
			if player.techs.has_key(techID)	or techID in queueTechs \
				or techID in disabled:
				continue
			# can check requirements
			tech = client.getTechInfo(techID)
			if not hasattr(tech, "partialData"):
				continue
			item = ui.Item(tech.name, tLevel = tech.level, techID = techID)
			if hasattr(tech, 'isStructure'): item.tStruct = ('', '*')[tech.isStructure]
			else: item.tStruct = ''
			if hasattr(tech, 'isShipEquip'): item.tShip = ('', '*')[tech.isShipEquip]
			else: item.tShip = ''
			if hasattr(tech, 'researchMod'):
				neededSci = Utils.getTechRCost(player, techID)
				if player.effSciPoints > 0:
					item.tETC = res.formatTime(float(neededSci) / player.effSciPoints)
				else:
					item.tETC = _("N/A")
				item.foreground = None
			else:
				item.tSci = res.getNA()
				item.foreground = (0xc0, 0xc0, 0xc0)
				# skip this item
				continue
			if hasattr(tech, "researchDisables") and tech.researchDisables:
				item.foreground = (0xff, 0xff, 0x00)
			if client.getFullTechInfo(techID).finishResearchHandler == TechHandlers.finishResTLAdvance:
					item.foreground = gdata.sevColors[gdata.CRI]
			items.append(item)
		self.win.vRTechs.items = items
		self.win.vRTechs.itemsChanged()
示例#35
0
    def show(self):
        player = client.getPlayer()
        if not hasattr(player.stats, "prodProd"):
            self.win.vText.text = [_("No data available")]
            self.win.vText.offsetRow = 0
            self.win.vText.vertScrollbar.slider.position = 0
            self.win.vText.vertScrollbar.slider.max = 1
            return

        text = []
        # imperator or leader
        if player.imperator == 1:
            text.append(_("You are LEADER of the galaxy."))
            text.append("")
        elif player.imperator == 2:
            text.append(_("You are IMPERATOR of the galaxy."))
            text.append("")
        elif player.imperator >= 3:
            text.append(_("You are IMPERATOR of the galaxy."))
            text.append(_("You have the right to end this galaxy."))
            text.append("")

        # strategic resources
        # check ownership of the strat. resources
        srChange = {}
        for planetID in player.planets:
            planet = client.get(planetID)
            if planet.plStratRes:
                sr = planet.plStratRes
                srChange[sr] = srChange.get(sr, 0) + Rules.stratResAmountBig

        if player.stratRes or srChange:
            text.append(_("Strategic resources:"))
            # merge owned and change
            srList = player.stratRes.keys()
            for sr in srChange:
                if sr not in srList:
                    srList.append(sr)
            srList.sort()
            for sr in srList:
                # srChange is printed as integer - assumption is there are only
                # full generators of special resources (i.e. planets)
                text.append(u'    %s: %s (+%d)' % (
                    gdata.stratRes[sr],
                    player.stratRes.get(sr, 0) /
                    float(Rules.stratResAmountBig),
                    srChange.get(sr, 0) / float(Rules.stratResAmountBig),
                ))
            text.append('')
        # statistics
        # compute some stats
        realProd = 0
        realSci = 0
        for planetID in player.planets:
            planet = client.get(planetID)
            realProd += planet.effProdProd
            realSci += planet.effProdSci
        for fleetID in player.fleets:
            fleet = client.get(fleetID)
        # display data
        text.append(_("Statistics:"))
        text.append(u'    %s: %s' %
                    (_("Population"), getattr(player.stats, "storPop", "?")))
        if hasattr(
                player.stats, "storPop"
        ) and player.govPwr > player.stats.storPop and player.stats.storPop > 0:
            text.append(u'    %s: %s (%d %% %s)' %
                        (_("Gov. power"), player.govPwr, 100 *
                         (player.govPwr - player.stats.storPop) /
                         player.govPwr, _("unused")))
        else:
            text.append(u'    %s: %s' % (_("Gov. power"), player.govPwr))
        text.append(u'    %s: %s' %
                    (_("Planets"), getattr(player.stats, "planets", "?")))
        text.append(u'    %s: %s' %
                    (_("Structures"), getattr(player.stats, "structs", "?")))
        text.append(
            u'    %s: %s' %
            (_("Raw production"), getattr(player.stats, "prodProd", "?")))
        text.append(u'    %s: %d' % (_("Total production"), realProd))
        text.append(u'    %s: %s' %
                    (_("Raw research"), getattr(player.stats, "prodSci", "?")))
        text.append(u'    %s: %s' % (_("Total reseach"), player.effSciPoints))
        text.append(
            u'    %s: %s' %
            (_("Military power"), getattr(player.stats, "fleetPwr", "?")))
        if hasattr(player, "pirateFame"):
            text.append(u'    %s: %s (%+d %% %s)' %
                        (_("Fame"), player.pirateFame, player.pirateFame,
                         _("production eff.")))
            text.append(u'    %s: %s fame' % (
                _("New colony on planet with TL3 resouce cost"),
                int(Rules.pirateTL3StratResColonyCostMod *
                    Rules.pirateColonyCostMod * len(player.planets)),
            ))
            text.append(u'    %s: %s fame' % (
                _("New colony cost multiplier"),
                int(Rules.pirateColonyCostMod * len(player.planets)),
            ))
            text.append(
                u'        %s' %
                (_("(hover over system/planet to view actual cost)"), ))
        text.append("")
        # Production
        text.append(_("Production:"))
        text.append(
            u'    %s: %s' %
            (_("Raw production"), getattr(player.stats, "prodProd", "?")))
        if player.prodIncreasePool > 0:
            ratio = (Rules.unusedProdMod *
                     player.prodIncreasePool) / player.stats.prodProd
            text.append(u'    %s: %d (%+d %% %s)' %
                        (_("Unused production"), player.prodIncreasePool,
                         min(ratio * 100,
                             math.sqrt(ratio) * 100), _("effectivity")))
        # fleet support
        total = getattr(player.stats, 'fleetSupportProd',
                        0) + player.fleetUpgradePool * Rules.operProdRatio
        if total > player.stats.prodProd / 10:
            effectivity = -100 * (total - player.stats.prodProd / 10) / max(
                player.stats.prodProd, 1)
        else:
            effectivity = 0
        text.append(
            u'    %s: %+d (%s %d %s, %+d %% %s)' %
            (_("Fleet support"), -total, _("first"), player.stats.prodProd /
             10, _("CP is free"), effectivity, _("effectivity")))
        text.append(u"    %s: %d %%" %
                    (_("Empire effectivity"), int(100 * player.prodEff)))
        text.append(u'    %s: %d' % (_("Total production"), realProd))
        text.append("")
        # Research
        text.append(_("Research:"))
        text.append(u"    %s: %d %%" %
                    (_("Empire effectivity"), int(100 * player.sciEff)))
        if hasattr(player.stats, "prodSci"):
            text.append(
                u"    %s: %s" %
                (_("Raw production"), getattr(player.stats, "prodSci", "?")))
        text.append(u'    %s: %s' % (_("Real production"), realSci))
        if player.techLevel < 7:
            popSupp = int(player.stats.storPop *
                          Rules.sciPtsPerCitizen[player.techLevel])
        else:
            popSupp = 0
        text.append(u'    %s: %+d' % (_("Population support"), -popSupp))
        text.append(u'    %s: %+d' % (_("From pacts"), player.effSciPoints +
                                      popSupp - player.sciPoints))
        text.append(u'    %s: %d' % (_("Total research"), player.effSciPoints))
        text.append("")
        # Fleet
        civ = [0, 0, 0, 0]
        mil = [0, 0, 0, 0]
        mp = [0, 0, 0, 0]
        for fleetID in player.fleets:
            fleet = client.get(fleetID)
            for designID, hp, shield, exp in fleet.ships:
                tech = player.shipDesigns[designID]
                if tech.isMilitary:
                    mil[tech.combatClass] += 1
                else:
                    civ[tech.combatClass] += 1
                mp[tech.combatClass] += int(tech.combatPwr *
                                            float(hp + shield) /
                                            (tech.maxHP + tech.shieldHP))
        text.append(_("Fleet:"))
        text.append(u'    %s: %d (%d %s)' %
                    (_("Upgrade Pool"), player.fleetUpgradePool,
                     -player.fleetUpgradePool * Rules.operProdRatio,
                     _("CP to support")))
        text.append(u'    %s: %d %s + %d %s, %d %s' %
                    (_("Small ships"), civ[0], _("civ"), mil[0], _("mil"),
                     mp[0], _("MP")))
        text.append(u'    %s: %d %s + %d %s, %d %s' %
                    (_("Medium ships"), civ[1], _("civ"), mil[1], _("mil"),
                     mp[1], _("MP")))
        text.append(u'    %s: %d %s + %d %s, %d %s' %
                    (_("Large ships"), civ[2], _("civ"), mil[2], _("mil"),
                     mp[2], _("MP")))

        # Planetary Weapons
        weapons = player.planetWeapons
        if weapons[0] or weapons[1] or weapons[2]:
            text.append("")
            text.append(u'Planetary Weapons:')
            if weapons[0] != None:
                if weapons[0] in player.techs.keys():
                    tech = client.getTechInfo(weapons[0])
                    sweapon = tech.name
                    text.append(u'    Anti-small: %s' % sweapon)
            if weapons[1] != None:
                if weapons[1] in player.techs.keys():
                    tech = client.getTechInfo(weapons[1])
                    mweapon = tech.name
                    text.append(u'    Anti-medium: %s' % mweapon)
            if weapons[2] != None:
                if weapons[2] in player.techs.keys():
                    tech = client.getTechInfo(weapons[2])
                    lweapon = tech.name
                    text.append(u'    Anti-large: %s' % lweapon)

        self.win.vText.text = text
        self.win.vText.offsetRow = 0
        self.win.vText.vertScrollbar.slider.position = 0
        self.win.vText.vertScrollbar.slider.max = len(text)
示例#36
0
    def showTechs(self):
        # techs
        items = []
        select = None

        showSmall = self.win.vSmall.checked
        showMed = self.win.vMedium.checked
        showLarge = self.win.vLarge.checked
        showCivShip = self.win.vCivShip.checked
        showMilShip = self.win.vMilShip.checked

        for techID in client.getPlayer().techs.keys():
            tech = client.getTechInfo(techID)

            # hide pirate techs
            if tech.level == 99:
                continue

            if tech.isStructure or tech.globalDisabled:
                continue

            etc = _("N/A")
            item = ui.Item(tech.name,
                tLevel = tech.level,
                tProd = tech.buildProd,
                techID = techID,
                tIsShip = 0,
            )
            if item.tLevel > self.maxTechLevel:
                self.maxTechLevel = item.tLevel

            if item.tLevel in self.showLevels and \
                (self.showOther and (tech.isProject)):
                items.append(item)
                if techID == self.techID:
                    select = item

        # special handling for ships
        player = client.getPlayer()
        if self.showShips:
            for designID in player.shipDesigns.keys():
                tech = player.shipDesigns[designID]

                if not ((tech.combatClass == 0 and showSmall) or (tech.combatClass == 1 and showMed) or (tech.combatClass == 2 and showLarge)):
                    continue

                if not ((tech.isMilitary and showMilShip) or (not tech.isMilitary and showCivShip)):
                    continue

                if tech.upgradeTo != OID_NONE:
                    # skip ships that are set to upgrade
                    continue
                etc = _("N/A")
                item = ui.Item(tech.name,
                    tLevel = tech.level,
                    tProd = tech.buildProd,
                    techID = designID,
                    tIsShip = 1,
                )
                items.append(item)
                if designID == self.techID:
                    select = item
        # sort it by level and then by name
        items.sort(lambda a, b: cmp((100 - a.tLevel, a.text), (100 - b.tLevel, b.text)))
        self.win.vTechs.items = items
        self.win.vTechs.itemsChanged()
        self.win.vTechs.selectItem(select)
        # filter
        for i in xrange(1, 10):
            widget = getattr(self.win, 'vLevel%d' % i)
            if i in self.showLevels and i <= self.maxTechLevel:
                widget.visible = 1
                widget.pressed = 1
            elif i not in self.showLevels and i <= self.maxTechLevel:
                widget.visible = 1
                widget.pressed = 0
            else:
                widget.visible = 0
        self.win.vShipsToggle.pressed = self.showShips
        self.win.vOtherToggle.pressed = self.showOther
        # quantity
        self.win.vQuantity.text = str(self.quantity)
示例#37
0
	def show(self):
		player = client.getPlayer()
		if not hasattr(player.stats, "prodProd"):
			self.win.vText.text = [_("No data available")]
			self.win.vText.offsetRow = 0
			self.win.vText.vertScrollbar.slider.position = 0
			self.win.vText.vertScrollbar.slider.max = 1
			return
			
		text = []
		# imperator or leader
		if player.imperator == 1:
			text.append(_("You are LEADER of the galaxy."))
			text.append("")
		elif player.imperator == 2:
			text.append(_("You are IMPERATOR of the galaxy."))
			text.append("")
		elif player.imperator >= 3:
			text.append(_("You are IMPERATOR of the galaxy."))
			text.append(_("You have the right to end this galaxy."))
			text.append("")

		# strategic resources
		# check ownership of the strat. resources
		srChange = {}
		for planetID in player.planets:
			planet = client.get(planetID)
			if planet.plStratRes:
				sr = planet.plStratRes
				srChange[sr] = srChange.get(sr, 0) + 1

		if player.stratRes or srChange:
			text.append(_("Strategic resources:"))
			# merge owned and change
			srList = player.stratRes.keys()
			for sr in srChange:
				if sr not in srList:
					srList.append(sr)
			srList.sort()
			for sr in srList:
				text.append(u'    %s: %s (+%d)' % (
					gdata.stratRes[sr],
					player.stratRes.get(sr, 0),
					srChange.get(sr, 0),
				))
			text.append('')
		# statistics
		# compute some stats
		realProd = 0
		realSci = 0
		for planetID in player.planets:
			planet = client.get(planetID)
			realProd += planet.effProdProd
			realSci += planet.effProdSci
		for fleetID in player.fleets:
			fleet = client.get(fleetID)
		# display data
		text.append(_("Statistics:"))
		text.append(u'    %s: %s' % (_("Population"), getattr(player.stats, "storPop", "?")))
		if hasattr(player.stats, "storPop") and player.govPwr > player.stats.storPop and player.stats.storPop > 0:
			text.append(u'    %s: %s (%d %% %s)' % (_("Gov. power"), player.govPwr, 100 * (player.govPwr - player.stats.storPop) / player.govPwr, _("unused")))
		else:
			text.append(u'    %s: %s' % (_("Gov. power"), player.govPwr))
		text.append(u'    %s: %s' % (_("Planets"), getattr(player.stats, "planets", "?")))
		text.append(u'    %s: %s' % (_("Structures"), getattr(player.stats, "structs", "?")))
		text.append(u'    %s: %s' % (_("Raw production"), getattr(player.stats, "prodProd", "?")))
		text.append(u'    %s: %d' % (_("Total production"), realProd))
		text.append(u'    %s: %s' % (_("Raw research"), getattr(player.stats, "prodSci", "?")))
		text.append(u'    %s: %s' % (_("Total reseach"), player.effSciPoints))
		text.append(u'    %s: %s' % (_("Military power"), getattr(player.stats, "fleetPwr", "?")))
		if hasattr(player, "pirateFame"):
			text.append(u'    %s: %s (%+d %% %s)' % (
				_("Fame"),
				player.pirateFame,
				player.pirateFame,
				_("production eff.")
			))
			text.append(u'    %s: %s fame' % (
				_("New colony on planet with TL3 resouce cost"),
				int(Rules.pirateTL3StratResColonyCostMod * Rules.pirateColonyCostMod * len(player.planets)),
			))
			text.append(u'    %s: %s fame' % (
				_("New colony cost multiplier"),
				int(Rules.pirateColonyCostMod * len(player.planets)),
			))
			text.append(u'        %s' % (
				_("(hover over system/planet to view actual cost)"),
			))
		text.append("")
		# Production
		text.append(_("Production:"))
		text.append(u'    %s: %s' % (_("Raw production"), getattr(player.stats, "prodProd", "?")))
		if player.prodIncreasePool > 0:
			ratio = (Rules.unusedProdMod * player.prodIncreasePool) / player.stats.prodProd
			text.append(u'    %s: %d (%+d %% %s)' % (
				_("Unused production"), player.prodIncreasePool, min(ratio * 100, math.sqrt(ratio) * 100), _("effectivity")
			))
		# fleet support
		total = getattr(player.stats, 'fleetSupportProd', 0) + player.fleetUpgradePool * Rules.operProdRatio
		if total > player.stats.prodProd / 10:
			effectivity = - 100 * (total - player.stats.prodProd / 10) / max(player.stats.prodProd, 1)
		else:
			effectivity = 0
		text.append(u'    %s: %+d (%s %d %s, %+d %% %s)' % (
			_("Fleet support"),
			- total,
			_("first"),
			player.stats.prodProd / 10,
			_("CP is free"),
			effectivity,
			_("effectivity")
		))
		text.append(u"    %s: %d %%" % (_("Empire effectivity"), int(100 * player.prodEff)))
		text.append(u'    %s: %d' % (_("Total production"), realProd))
		text.append("")
		# Research
		text.append(_("Research:"))
		text.append(u"    %s: %d %%" % (_("Empire effectivity"), int(100 * player.sciEff)))
		if hasattr(player.stats, "prodSci"):
			text.append(u"    %s: %s" % (_("Raw production"), getattr(player.stats, "prodSci", "?")))
		text.append(u'    %s: %s' % (_("Real production"), realSci))
		if player.techLevel < 7:
			popSupp = int(player.stats.storPop * Rules.sciPtsPerCitizen[player.techLevel])
		else:
			popSupp = 0
		text.append(u'    %s: %+d' % (_("Population support"), -popSupp))
		text.append(u'    %s: %+d' % (_("From pacts"), player.effSciPoints + popSupp - player.sciPoints))
		text.append(u'    %s: %d' % (_("Total research"), player.effSciPoints))
		text.append("")
		# Fleet
		civ = [0, 0, 0, 0]
		mil = [0, 0, 0, 0]
		mp = [0, 0, 0, 0]
		for fleetID in player.fleets:
			fleet = client.get(fleetID)
			for designID, hp, shield, exp in fleet.ships:
				tech = player.shipDesigns[designID]
				if tech.isMilitary:
					mil[tech.combatClass] += 1
				else:
					civ[tech.combatClass] += 1
				mp[tech.combatClass] += int(tech.combatPwr * float(hp + shield) / (tech.maxHP + tech.shieldHP))
		text.append(_("Fleet:"))
		text.append(u'    %s: %d (%d %s)' % (_("Upgrade Pool"), player.fleetUpgradePool, - player.fleetUpgradePool * Rules.operProdRatio,_("CP to support")))
		text.append(u'    %s: %d %s + %d %s, %d %s' % (_("Small ships"), civ[0], _("civ"), mil[0], _("mil"), mp[0],_("MP")))
		text.append(u'    %s: %d %s + %d %s, %d %s' % (_("Medium ships"), civ[1], _("civ"), mil[1], _("mil"), mp[1],_("MP")))
		text.append(u'    %s: %d %s + %d %s, %d %s' % (_("Large ships"), civ[2], _("civ"), mil[2], _("mil"), mp[2],_("MP")))

		# Planetary Weapons
		weapons = player.planetWeapons
		if weapons[0] or weapons[1] or weapons[2]:
			text.append("")
			text.append(u'Planetary Weapons:')
			if weapons[0] != None:
				if weapons[0] in player.techs.keys():
					tech = client.getTechInfo(weapons[0])
					sweapon = tech.name
					text.append(u'    Anti-small: %s' % sweapon)
			if weapons[1] != None:
				if weapons[1] in player.techs.keys():
					tech = client.getTechInfo(weapons[1])
					mweapon = tech.name
					text.append(u'    Anti-medium: %s' % mweapon)
			if weapons[2] != None:
				if weapons[2] in player.techs.keys():
					tech = client.getTechInfo(weapons[2])
					lweapon = tech.name
					text.append(u'    Anti-large: %s' % lweapon)
		
		self.win.vText.text = text
		self.win.vText.offsetRow = 0
		self.win.vText.vertScrollbar.slider.position = 0
		self.win.vText.vertScrollbar.slider.max = len(text)
示例#38
0
    def showTechs(self):
        # techs
        items = []
        select = None
        showMilitary = self.win.vMilitary.checked
        showBio = self.win.vBioProduction.checked
        showEn = self.win.vEnProduction.checked
        showCP = self.win.vCPProduction.checked
        showRP = self.win.vRPProduction.checked
        showMorale = self.win.vMorale.checked

        for techID in client.getPlayer().techs.keys():
            tech = client.getTechInfo(techID)

            if not ((tech.isMilitary and showMilitary) or \
               ((getattr(tech, "prodBio", 0) > 0 or getattr(tech, "prodEnv", 0) > 0) and showBio) or \
               (getattr(tech, "prodEn", 0) > 0 and showEn) or \
               (getattr(tech, "prodProd", 0) > 0 and showCP) or \
               (getattr(tech, "prodSci", 0) > 0 and showRP) or \
               (getattr(tech, "moraleTrgt", 0) > 0 and showMorale)):
                continue

            sourcePlanet = client.get(self.sourceID, noUpdate = 1)
            prodProd = getattr(sourcePlanet, "effProdProd", 0)

            if prodProd > 0:
                etc = math.ceil(float(tech.buildProd) / prodProd)
                if self.sourceID != self.planetID:
                    etc *= Rules.buildOnAnotherPlanetMod
                etc = res.formatTime(etc)
            else:
                etc = _("N/A")

            item = ui.Item(etc,
                techID = techID,
                tIsShip = 0,
                name = tech.name,
                tl = tech.level,
                subtype = tech.subtype,
                icons = ((res.getTechImg(techID), ui.ALIGN_N),),
                font = "small-bold",
                align = ui.ALIGN_S,
                tooltip = "%s, %d %s, %s %d" % (tech.name, tech.buildProd,_("CP"),_("TL"), tech.level),
                statustip = "%s, %d %s, %s %d" % (tech.name, tech.buildProd,_("CP"),_("TL"), tech.level),
            )
            if tech.level > self.maxTechLevel:
                self.maxTechLevel = tech.level
            # TODO FIX ME
            if tech.level in self.showLevels and \
                ((self.showStructures and tech.isStructure) or \
                (self.showOther and (tech.isProject))) or tech.level == 99:
                items.append(item)
                if techID == self.techID:
                    select = item

        # sort methods
        if self.sort == 'none': # sort by name
            items.sort(lambda a, b: cmp(a.name, b.name))
        elif self.sort == 'tl': # sort by TL, subsort by name
            items.sort(lambda a, b: cmp(a.name, b.name))
            items.sort(lambda a, b: cmp(a.tl, b.tl))
        elif self.sort == 'type': #sort by subtype, subsort by tl
            items.sort(lambda a, b: cmp(a.tl, b.tl))
            items.sort(lambda a, b: cmp(a.subtype, b.subtype))
        self.win.vTechs.items = items
        self.win.vTechs.itemsChanged()
        if select:
            self.win.vTechs.selectItem(select)

        # filter
        for i in xrange(1, 10):
            widget = getattr(self.win, 'vLevel%d' % i)
            if i in self.showLevels and i <= self.maxTechLevel:
                widget.visible = 1
                widget.pressed = 1
            elif i not in self.showLevels and i <= self.maxTechLevel:
                widget.visible = 1
                widget.pressed = 0
            else:
                widget.visible = 0

        # quantity
        self.win.vQuantity.text = str(self.quantity)
示例#39
0
 def show(self):
     player = client.getPlayer()
     # title
     self.win.vRQueueTitle.text = _('Research queue [%d pts/turn]') % (
         player.effSciPoints,
     )
     self.win.title = _("Research [TL%d]") % player.techLevel
     # Known techs
     items = []
     #~researchable = {}
     disabled = []
     taskIDs = {}
     for task in player.rsrchQueue:
         taskIDs[task.techID] = None
     for techID in player.techs.keys():
         if techID in player.obsoleteTechs and not self.showObsolete:
             continue
         tech = client.getTechInfo(techID)
         improvement = player.techs[techID]
         item = ui.Item(tech.name,
             techID = techID,
             tLevel = '%d-%d' % (tech.level, improvement),
             tStruct = (' ', '*')[tech.isStructure],
             tShip = (' ', '*')[tech.isShipEquip],
         )
         if improvement < Rules.techMaxImprovement and improvement < tech.maxImprovement:
             neededSci = Utils.getTechRCost(player, techID)
             if player.effSciPoints > 0:
                 item.tETC = res.formatTime(float(neededSci) / player.effSciPoints)
             else:
                 item.tETC = _("N/A")
             found = 0
             if taskIDs.has_key(techID):
                 item.foreground = (0xd0, 0xd0, 0xd0)
             else:
                 item.foreground = None
         else:
             item.tETC = res.getNA()
             item.foreground = (0x80, 0x80, 0x80)
             if not self.showCompleted:
                 # skip this item
                 continue
         if techID in player.obsoleteTechs:
             item.foreground = (0x80, 0x40, 0x40)
         items.append(item)
         disabled.extend(tech.researchDisables)
         #~for improvement in range(1, improvement + 1):
         #~    for techID in tech.researchEnables[improvement]:
         #~        researchable[techID] = 1
     self.win.vKTechs.items = items
     self.win.vKTechs.itemsChanged()
     # Research queue
     items = []
     index = 0
     queueTechs = []
     total = 0
     for task in player.rsrchQueue:
         tech = client.getTechInfo(task.techID)
         fulltech = client.getFullTechInfo(task.techID)
         queueTechs.append(task.techID)
         item = ui.Item(tech.name, techID = task.techID, index = index)
         researchSci = Utils.getTechRCost(player, task.techID, task.improvement)
         maxImprovement = min(Rules.techMaxImprovement,fulltech.maxImprovement)
         maxImpTotalSci = 0
         if task.improveToMax and task.improvement < maxImprovement:
             for impr in range(task.improvement+1,maxImprovement+1):
                 maxImpTotalSci += Utils.getTechRCost(player, task.techID, impr)
         item.tooltipTitle = _("Details")
         item.tooltip = _("Research points %d/%d, change %d pts/turn.") % (task.currSci, researchSci, task.changeSci)
         item.statustip = item.tooltip
         item.tImpToMax = ["", "*"][task.improveToMax]
         item.tImproveToMax = task.improveToMax
         if task.currSci > 0:
             item.tProgress = _("%d %%") % int(task.currSci * 100 / researchSci)
         else:
             item.tProgress = _("-")
         if task.changeSci > 0:
             value = float(researchSci - task.currSci) / max(task.changeSci, player.effSciPoints)
             total += int(value + 1)
             if player.effSciPoints > 0:
                 total += float(maxImpTotalSci) / player.effSciPoints
                 item.tETC = res.formatTime(value)
             else:
                 total = 0
                 item.tETC = res.getNA()
         elif task.changeSci < 0:
             value = - float(task.currSci) / min(task.changeSci, player.effSciPoints)
             item.tETC = _("[%s]") % res.formatTime(value)
         elif player.effSciPoints > 0:
             value = float(researchSci) / player.effSciPoints
             total += int(value + 1)
             total += float(maxImpTotalSci) / player.effSciPoints
             item.tETC = res.formatTime(value)
         else:
             item.tETC = res.getNA()
         item.tLevel = _("%d-%d") % (tech.level, task.improvement)
         items.append(item)
         index += 1
     self.win.vRQueue.items = items
     self.win.vRQueue.itemsChanged()
     self.win.vRQueueTop.enabled = 0
     self.win.vRQueueUp.enabled = 0
     self.win.vRQueueDown.enabled = 0
     self.win.vRQueueAbort.enabled = 0
     self.win.vRQueueRepat.enabled = 0
     self.win.vRQueueRepat.pressed = 0
     self.win.vRQueueInfo.enabled = 0
     if total == 0:
         self.win.vRTotal.text = _("N/A")
     else:
         self.win.vRTotal.text = res.formatTime(total)
     # Researchable techs
     items = []
     for techID in client.getAllTechIDs():
         if player.techs.has_key(techID) or techID in queueTechs \
             or techID in disabled:
             continue
         # can check requirements
         tech = client.getTechInfo(techID)
         if not hasattr(tech, "partialData"):
             continue
         item = ui.Item(tech.name, tLevel = tech.level, techID = techID)
         if hasattr(tech, 'isStructure'): item.tStruct = ('', '*')[tech.isStructure]
         else: item.tStruct = ''
         if hasattr(tech, 'isShipEquip'): item.tShip = ('', '*')[tech.isShipEquip]
         else: item.tShip = ''
         if hasattr(tech, 'researchMod'):
             neededSci = Utils.getTechRCost(player, techID)
             if player.effSciPoints > 0:
                 item.tETC = res.formatTime(float(neededSci) / player.effSciPoints)
             else:
                 item.tETC = _("N/A")
             item.foreground = None
         else:
             item.tSci = res.getNA()
             item.foreground = (0xc0, 0xc0, 0xc0)
             # skip this item
             continue
         if hasattr(tech, "researchDisables") and tech.researchDisables:
             item.foreground = (0xff, 0xff, 0x00)
         if client.getFullTechInfo(techID).finishResearchHandler == TechHandlers.finishResTLAdvance:
             item.foreground = gdata.sevColors[gdata.CRI]
         items.append(item)
     self.win.vRTechs.items = items
     self.win.vRTechs.itemsChanged()
示例#40
0
 def show(self):
     player = client.getPlayer()
     #
     items = []
     for planetID in client.db.keys():
         planet = client.get(planetID, noUpdate = 1)
         # skip non-planets
         if not hasattr(planet, "type") or planet.type != T_PLANET:
             continue
         # shall be shown?
         ok = 0
         if hasattr(planet, 'owner'):
             if self.showMine and planet.owner == player.oid:
                 ok = 1
             if self.showOtherPlayers and planet.owner != OID_NONE and \
                 planet.owner != player.oid:
                 ok = 1
             if self.showColonizable and planet.owner == OID_NONE and \
                 planet.plType not in ('G', 'A'):
                 ok = 1
             if self.showUncolonizable and planet.plType in ('G', 'A'):
                 ok = 1
         elif hasattr(planet, 'plType'):
             if self.showColonizable and planet.plType not in ('G', 'A'):
                 ok = 1
             if self.showUncolonizable and planet.plType in ('G', 'A'):
                 ok = 1
         if not ok:
             continue
         # fill in data
         #rel = REL_UNDEF
         maxNA = 999999
         maxNone = 99999
         ownerID = OID_NONE
         if hasattr(planet, 'owner'):
             ownerID = planet.owner
             #if planet.owner != OID_NONE:
             #    rel = client.getRelationTo(planet.owner)
             if planet.owner == OID_NONE:
             #else:
                 owner = _('[Nobody]')
         if hasattr(planet, 'owner') and planet.owner == player.oid:
             if planet.prodQueue and planet.effProdProd > 0:
                 index = 0
                 totalEtc = 0
                 for task in planet.prodQueue:
                     if task.isShip:
                         tech = client.getPlayer().shipDesigns[task.techID]
                     else:
                         tech = client.getFullTechInfo(task.techID)
                     if index == 0:
                         constrInfo = tech.name
                     # etc
                     if task.targetID != planetID:
                         if index == 0:
                             etc = math.ceil(float(tech.buildProd * Rules.buildOnAnotherPlanetMod - task.currProd) / planet.effProdProd)
                             totalEtc += etc
                             totalEtc += math.ceil((task.quantity - 1) * float(tech.buildProd * Rules.buildOnAnotherPlanetMod) / planet.effProdProd)
                         else:
                             totalEtc += math.ceil(float(tech.buildProd * Rules.buildOnAnotherPlanetMod - task.currProd) / planet.effProdProd)
                             totalEtc += math.ceil((task.quantity - 1) * float(tech.buildProd * Rules.buildOnAnotherPlanetMod) / planet.effProdProd)
                     else:
                         if index == 0:
                             etc = math.ceil(float(tech.buildProd - task.currProd) / planet.effProdProd)
                             totalEtc += etc
                             totalEtc += math.ceil((task.quantity - 1)* float(tech.buildProd) / planet.effProdProd)
                         else:
                             totalEtc += math.ceil(task.quantity * float(tech.buildProd - task.currProd) / planet.effProdProd)
                             totalEtc += math.ceil((task.quantity - 1) * float(tech.buildProd) / planet.effProdProd)
                     index += 1
                 etc_raw = etc
                 etc = res.formatTime(etc)
                 totalEtc_raw = totalEtc
                 totalEtc = res.formatTime(totalEtc)
             elif planet.prodQueue:
                 task = planet.prodQueue[0]
                 if task.isShip:
                     tech = client.getPlayer().shipDesigns[task.techID]
                 else:
                     tech = client.getTechInfo(task.techID)
                 constrInfo = tech.name
                 etc = _('N/A')
                 etc_raw = maxNA
                 totalEtc = _("N/A")
                 totalEtc_raw = maxNA
             elif planet.effProdProd > 0:
                 constrInfo = _("-")
                 etc = "-"
                 etc_raw = 0
                 totalEtc = _("-")
                 totalEtc_raw = 0
             else:
                 constrInfo = _("-")
                 etc = "-"
                 etc_raw = maxNone
                 totalEtc = _("-")
                 totalEtc_raw = maxNone
         else:
             constrInfo = '?'
             etc = '?'
             etc_raw = maxNA
             totalEtc = '?'
             totalEtc_raw = maxNA
         # used slots
         if hasattr(planet, 'slots'):
             freeSlots = planet.plSlots - len(planet.slots)
         else:
             freeSlots = '?'
         # morale
         if hasattr(planet, "morale"):
             morale = int(planet.morale)
         else:
             morale = "?"
         #
         plType = gdata.planetTypes[getattr(planet, 'plType', None)]
         # list item
         item = ui.Item(
             getattr(planet, 'name', res.getUnknownName()),
             tPlType = _(plType),
             tPlBio = getattr(planet, 'plBio', '?'),
             tPlMin = getattr(planet, 'plMin', '?'),
             tPlEn = getattr(planet, 'plEn', '?'),
             tChangeBio = getattr(planet, 'changeBio', '?'),
             tChangeEn = getattr(planet, 'changeEn', '?'),
             tETC = etc,
             tETC_raw = etc_raw,
             tTotalETC = totalEtc,
             tTotalETC_raw = totalEtc_raw,
             tConstrInfo = constrInfo,
             tFree = freeSlots,
             tMorale = morale,
             tSpace = getattr(planet, 'plSlots', '?'),
             tDiam = getattr(planet, 'plDiameter',0)/1000,
             tProd = getattr(planet, 'effProdProd', '?'),
             tSci = getattr(planet, 'effProdSci', '?'),
             tPlanetID = planetID,
             #foreground = res.getFFColorCode(rel),
             foreground = res.getPlayerColor(ownerID),
         )
         items.append(item)
     self.win.vPlanets.items = items
     self.win.vPlanets.itemsChanged()
     # buttons
     self.win.vMine.pressed = self.showMine
     self.win.vOtherPlayers = self.showOtherPlayers
     self.win.vColonizable = self.showColonizable
     self.win.vUncolonizable = self.showUncolonizable
	def show(self):
		player = client.getPlayer()
		# check if selected ship design exists
		if self.selectedDesignID not in player.shipDesigns:
			self.selectedDesignID = None
		# designs
		items = []
		selected = None
		items = []
		for designID in player.shipDesigns:
			spec = player.shipDesigns[designID]
			# number of ships with this design in fleet
			countInService = 0
			for fleetID in player.fleets:
				fleet = client.get(fleetID)
				for tmpDesignID, hp, shieldHP, exp in fleet.ships:
					if tmpDesignID == designID:
						countInService += 1
			hullTech = client.getFullTechInfo(spec.hullID)
			# number of ships in build queue
			countInBuild = 0
			for planetID in client.db.keys():
				planet = client.get(planetID, noUpdate = 1)
				# skip non-planets
				if not hasattr(planet, "type") or planet.type != T_PLANET \
					or not hasattr(planet, 'owner') or not planet.owner == player.oid \
					or not planet.prodQueue:
					continue
				for task in planet.prodQueue:
					if task.isShip and task.techID == designID:
						countInBuild += task.quantity
			# ui list item
			item = ui.Item(spec.name, tDesignID = designID,
				tClass = "%s/%s%d" % (
					_(gdata.shipClasses[spec.combatClass][:1].upper()),_("TL"),
					hullTech.level,
				),
				tNumber = countInService,
				tInBuild = countInBuild
			)
			if spec.upgradeTo:
				item.foreground = gdata.sevColors[gdata.NONE]
			if designID == self.selectedDesignID:
				selected = item
			items.append(item)
		self.win.vDesigns.items = items
		self.win.vDesigns.itemsChanged()
		self.win.vDesigns.selectItem(selected)
		# compute
		if self.selectedDesignID == None:
			if self.ctrlID:
				eqIDs = {self.ctrlID : 1}
			else:
				eqIDs = {}
			for eqID in self.eqIDs:
				eqIDs[eqID] = self.eqIDs[eqID]
			improvements = []
			self.win.vUpgrade.enabled = 0
			self.win.vUpgrade.text = _("Upgrade")
			self.win.vScrap.enabled = 0
			self.win.vConstruct.enabled = 1
		else:
			spec = player.shipDesigns[self.selectedDesignID]
			self.hullID = spec.hullID
			eqIDs = spec.eqIDs
			improvements = spec.improvements
			self.win.vName.text = spec.name
			self.win.vHull.text = client.getTechInfo(self.hullID).name
			self.eqIDs = {}
			for eqID in eqIDs:
				tech = client.getTechInfo(eqID)
				if tech.subtype == "seq_ctrl":
					self.ctrlID = eqID
					self.win.vCtrl.text = tech.name
				else:
					self.eqIDs[eqID] = eqIDs[eqID]
			if player.shipDesigns[self.selectedDesignID].upgradeTo == 0:
				self.win.vUpgrade.enabled = 1
				self.win.vUpgrade.text = _("Upgrade")
			else:
				self.win.vUpgrade.enabled = 1
				self.win.vUpgrade.text = _("Cancel Upgrd")
			self.win.vScrap.enabled = 1
			self.win.vConstruct.enabled = 0
		try:
			result = ShipUtils.makeShipFullSpec(player, None, self.hullID, eqIDs, improvements)
		except GameException, e:
			self.win.setStatus(e.args[0])
			try:
				result = ShipUtils.makeShipFullSpec(player, None, self.hullID, eqIDs,
					improvements, raiseExs = False)
			except GameException:
				result = None
			self.win.vScrap.enabled = 1
			self.win.vConstruct.enabled = 0
		try:
			result = ShipUtils.makeShipFullSpec(player, None, self.hullID, eqIDs, improvements)
		except GameException, e:
			self.win.setStatus(e.args[0])
			try:
				result = ShipUtils.makeShipFullSpec(player, None, self.hullID, eqIDs,
					improvements, raiseExs = False)
			except GameException:
				result = None
		else:
			self.win.setStatus(_("Ready."))
		# design info
		if self.hullID:
			tech = client.getTechInfo(self.hullID)
			self.win.vHull.text = tech.name # TODO _(tech.name)
		else:
			self.win.vHull.text = _("[Click to select]")
		if self.ctrlID:
			tech = client.getTechInfo(self.ctrlID)
			self.win.vCtrl.text = tech.name # TODO _(tech.name)
		else:
			self.win.vCtrl.text = _("[Click to select]")
		# equipments
		items = []
		selected = None
		for eqID in self.eqIDs:
			tech = client.getTechInfo(eqID)
			short = sequip.getShortDescr(eqID)
			long = sequip.getLongDescr(eqID)
示例#43
0
    def onConstruct(self, widget, action, data):
        if not data:
            self.win.setStatus(_('Select technology to construct.'))
            return

        if not self.sourceID:
            self.sourceID = self.planetID

        try:
            self.quantity = int(self.win.vQuantity.text)
        except ValueError:
            self.win.setStatus(_('Specify quantity (1, 2, 3, ...).'))
            return
        # government centers have additional query and if confirmed, another round of this function is called
        tech = client.getTechInfo(data.techID)
        if tech.govPwr and not self.govTransferConfirm:
            # confirm dialog doesn't send through parameters, so we have to save them
            self.govTransferData = (widget, action, data)
            self.confirmDlg.display(
                _("Do you want to issue relocation of your government?"),
                _("Yes"), _("No"), self.onGovTransferConfirmed)
        else:
            try:
                self.win.setStatus(
                    _('Executing START CONSTRUCTION command...'))
                planet = client.get(self.sourceID, noUpdate=1)
                player = client.getPlayer()
                if self.extraSlot:
                    # check required special resources, if not available, do not continue
                    # (without check, server start slot expansion but not the tech)
                    specialResources = player.stratRes
                    for sr in tech.buildSRes:
                        if specialResources.get(sr, 0) < self.quantity:
                            self.win.setStatus(
                                _('You do not own required strategic resource(s)'
                                  ))
                            return
                        else:
                            specialResources[sr] = specialResources.get(
                                sr, 0) - self.quantity
                    for i in range(1, self.quantity + 1):
                        # as we need two slots instead of one, check whether is task queue short
                        # enough (ie 8 tasks max)
                        if len(planet.prodQueue) > 8:
                            self.win.setStatus(_('Queue is full'))
                            return
                        client.cmdProxy.startConstruction(
                            self.sourceID, Rules.Tech.ADDSLOT3, 1,
                            self.planetID, False, self.win.vReportFin.checked,
                            Const.OID_NONE)
                        planet.prodQueue, player.stratRes = client.cmdProxy.startConstruction(
                            self.sourceID, data.techID, 1, self.planetID,
                            data.techID < 1000, self.win.vReportFin.checked,
                            self.structToDemolish)
                else:
                    planet.prodQueue, player.stratRes = client.cmdProxy.startConstruction(
                        self.sourceID, data.techID, self.quantity,
                        self.planetID, data.techID < 1000,
                        self.win.vReportFin.checked, self.structToDemolish)
                self.win.setStatus(_('Command has been executed.'))
            except GameException, e:
                self.win.setStatus(e.args[0])
                return
示例#44
0
    def show(self):
        tech = client.getTechInfo(self.techID)
        player = client.getPlayer()
        techEff = Rules.techImprEff[player.techs.get(self.techID, Rules.techBaseImprovement)]
        self.win.title = _('Technology: %s (TL%d)') % (tech.name, tech.level)
        # fill data
        # fill description
        descr = []
        improvement = player.techs.get(self.techID, 0)
        if hasattr(tech, 'researchMod'):
            if improvement == 0:
                descr.append(_('Research costs: %d') % Utils.getTechRCost(player, self.techID))
                descr.append('')
            elif improvement < Rules.techMaxImprovement:
                descr.append(_('Improvement costs: %d') % Utils.getTechRCost(player, self.techID))
                descr.append('')
        # requires
        if tech.researchRequires and improvement == 0:
            descr.append(_('Research requires:'))
            for tmpTechID, improvement in tech.researchRequires:
                tmpTech = client.getTechInfo(tmpTechID)
                descr.append(_(' - %s improvement %d (TL%d)') % (tmpTech.name, improvement, tmpTech.level))
            if hasattr(tech, "researchReqSRes"):
                for stratRes in tech.researchReqSRes:
                    descr.append(_(" - %s (strategic resource)") % (gdata.stratRes[stratRes]))
            descr.append('')
        if hasattr(tech, "researchDisables") and tech.researchDisables:
            descr.append(_("Research disables:"))
            for tmpTechID in tech.researchDisables:
                tmpTech = client.getTechInfo(tmpTechID)
                descr.append(_(" - %s (TL%d)") % (tmpTech.name, tmpTech.level))
            descr.append('')
        if hasattr(tech, 'partialData') and hasattr(tech, 'textPreRsrch'):
            # preresearch info
            descr.append(_('Estimated use:'))
            descr.extend(tech.textPreRsrch.split('\n'))
            descr.append('')
        elif not hasattr(tech, 'partialData'):
            tmp = []
            for improvement in range(1, 6):
                for tmpTechID in tech.researchEnables[improvement]:
                    tmpTech = client.getTechInfo(tmpTechID)
                    racesDispl = ""
                    raceChoosen = None
                    if player.techLevel == 1:
                        for techID in player.techs.keys():
                            if techID in (1990, 1991, 1992):
                                raceChoosen = client.getTechInfo(techID).data
                    else:
                        raceChoosen = player.race
                    if len(tmpTech.researchRaces) > 0 and len(tmpTech.researchRaces) < 3 and not raceChoosen:
                        racesDispl = _(", only for %s") % tmpTech.researchRaces
                    if not raceChoosen or len(tmpTech.researchRaces) == 0 or raceChoosen in tmpTech.researchRaces:
                        tmp.append(_(' - %s (with improvement %d, on TL%d%s)') % (tmpTech.name, improvement, tmpTech.level, racesDispl))
            if tmp:
                descr.append(_('Research/Improvement enables:'))
                descr.extend(tmp)
                descr.append('')
            # production dependency
            if tech.prodBioMod != [0, 0, 0, 0] and tech.prodBioMod != [0, 0, 0, 1]:
                descr.append(_("Bio production depends:"))
                if tech.prodBioMod[0]: descr.append(_(" - %d %% on planet's environment") % (tech.prodBioMod[0] * 100))
                if tech.prodBioMod[1]: descr.append(_(" - %d %% on planet's min. abundance") % (tech.prodBioMod[1] * 100))
                if tech.prodBioMod[2]: descr.append(_(" - %d %% on planet's en. abundance") % (tech.prodBioMod[2] * 100))
                if tech.prodBioMod[3]: descr.append(_(" - %d %% is not dependent on any planet's attribute") % (tech.prodBioMod[3] * 100))
                descr.append("")
            if tech.prodEnMod != [0, 0, 0, 0] and tech.prodEnMod != [0, 0, 0, 1]:
                descr.append(_("Energy production depends:"))
                if tech.prodEnMod[0]: descr.append(_(" - %d %% on planet's environment") % (tech.prodEnMod[0] * 100))
                if tech.prodEnMod[1]: descr.append(_(" - %d %% on planet's min. abundance") % (tech.prodEnMod[1] * 100))
                if tech.prodEnMod[2]: descr.append(_(" - %d %% on planet's en. abundance") % (tech.prodEnMod[2] * 100))
                if tech.prodEnMod[3]: descr.append(_(" - %d %% is not dependent on any planet's attribute") % (tech.prodEnMod[3] * 100))
                descr.append("")
            if tech.prodProdMod != [0, 0, 0, 0] and tech.prodProdMod != [0, 0, 0, 1]:
                descr.append(_("Constr. points production depends:"))
                if tech.prodProdMod[0]: descr.append(_(" - %d %% on planet's environment") % (tech.prodProdMod[0] * 100))
                if tech.prodProdMod[1]: descr.append(_(" - %d %% on planet's min. abundance") % (tech.prodProdMod[1] * 100))
                if tech.prodProdMod[2]: descr.append(_(" - %d %% on planet's en. abundance") % (tech.prodProdMod[2] * 100))
                if tech.prodProdMod[3]: descr.append(_(" - %d %% is not dependent on any planet's attribute") % (tech.prodProdMod[3] * 100))
                descr.append("")
            if tech.prodSciMod != [0, 0, 0, 0] and tech.prodSciMod != [0, 0, 0, 1]:
                descr.append(_("Research points production depends:"))
                if tech.prodSciMod[0]: descr.append(_(" - %d %% on planet's environment") % (tech.prodSciMod[0] * 100))
                if tech.prodSciMod[1]: descr.append(_(" - %d %% on planet's min. abundance") % (tech.prodSciMod[1] * 100))
                if tech.prodSciMod[2]: descr.append(_(" - %d %% on planet's en. abundance") % (tech.prodSciMod[2] * 100))
                if tech.prodSciMod[3]: descr.append(_(" - %d %% is not dependent on any planet's attribute") % (tech.prodSciMod[3] * 100))
                descr.append("")

            requiredStrategicResourcesForBuilding = self.getStrategicResourcesText(tech, "buildSRes")
            requiredStrategicResourcesForResearch = self.getStrategicResourcesText(tech, "researchReqSRes")
            if len(requiredStrategicResourcesForBuilding) > 0 or len(requiredStrategicResourcesForResearch) > 0:
                descr.append(_("Required strategic resources:"))
                if len(requiredStrategicResourcesForBuilding) > 0:
                    descr.append(_(" - for building: %s") % requiredStrategicResourcesForBuilding)
                if len(requiredStrategicResourcesForResearch) > 0:
                    descr.append(_(" - for research: %s") % requiredStrategicResourcesForResearch)

                descr.append("")

            # decription
            descr.append(_('Description:'))
            if tech.textDescr != u'Not specified':
                descr.extend(tech.textDescr.split('\n'))
            else:
                descr.extend(tech.textPreRsrch.split('\n'))
            descr.append('')
            # flavor
            descr.append(_('Rumours:'))
            descr.extend(tech.textFlavor.split('\n'))
            descr.append('')
        if not len(descr):
            descr.append(_('No information available'))
        #
        self.win.vDescr.text = descr
        # re-set techType if neccessary
        self.techType = self.techType & (
            getattr(tech ,'isStructure', 0) * V_STRUCT |
            getattr(tech ,'isShipHull', 0) * V_HULL |
            getattr(tech ,'isShipEquip', 0) * V_SEQUIP |
            getattr(tech ,'isProject', 0) * V_PROJECT
        )
        if self.techType == V_NONE:
            if getattr(tech ,'isStructure', 0): self.techType = V_STRUCT
            elif getattr(tech ,'isShipHull', 0): self.techType = V_HULL
            elif getattr(tech ,'isShipEquip', 0): self.techType = V_SEQUIP
            elif getattr(tech ,'isProject', 0): self.techType = V_PROJECT
        # set type buttons
        self.win.vStruct.pressed = self.techType == V_STRUCT
        self.win.vStruct.enabled = getattr(tech ,'isStructure', 0)
        self.win.vHull.pressed = self.techType == V_HULL
        self.win.vHull.enabled = getattr(tech, 'isShipHull', 0)
        self.win.vSEquip.pressed = self.techType == V_SEQUIP
        self.win.vSEquip.enabled = getattr(tech, 'isShipEquip', 0)
        self.win.vProject.pressed = self.techType == V_PROJECT
        self.win.vProject.enabled = getattr(tech, 'isProject', 0)
        # fill data
        items = []
        for attr in dir(tech):
            value = getattr(tech, attr)
            descr, props, showIfDef, default, convertor = techAttrs.get(attr, defaultAttr)
            if self.techType & props and (value != default or showIfDef):
                item = ui.Item(descr, tValue = convertor(value))
                if V_EFF & props:
                    item.font = 'normal-bold'
                    item.tValue = convertor(value * techEff)
                if V_EFF_REV & props:
                    item.font = 'normal-bold'
                    item.tValue = convertor(value / techEff)
                items.append(item)

        self.win.vData.items = items
        self.win.vData.itemsChanged()
示例#45
0
    def show(self):
        critical = self.win.vCritical.checked
        major = self.win.vMajor.checked
        minor = self.win.vMinor.checked
        info = self.win.vInfo.checked

        disp = 1

        player = client.getPlayer()
        items = []
        # object list (all player's objects + systems)
        objects = player.fleets[:]
        objects += player.planets[:]
        systems = {}
        for planetID in player.planets:
            planet = client.get(planetID)
            if planet.compOf not in systems:
                systems[planet.compOf] = None
        objects += systems.keys()

        # counting construction points value of each global production queue
        # holder for (number , eff production) of planets set to each queue
        globalQueueStats = [(0, 0), (0, 0), (0, 0), (0, 0), (0, 0)]
        prodQueueProblems = []

        # go through all objects
        for objID in objects:
            if objID < Const.OID_FREESTART:
                continue
            obj = client.get(objID, noUpdate=1)
            if not hasattr(obj, "type"):
                continue
            if obj.type == Const.T_SYSTEM:
                if not hasattr(obj, 'planets'):
                    continue
                bio = 0
                totalBio = 0
                en = 0
                totalEn = 0
                buildingQuantity = {}
                buildingInfo = {}
                # holds modified planets
                planetCopies = {}

                for planetID in obj.planets:
                    planet = client.get(planetID, noUpdate=1)
                    # copy of planet to change plSlots count
                    if not planetID in planetCopies:
                        cPlanet = copy.deepcopy(planet)
                        planetCopies[planetID] = cPlanet
                    else:
                        cPlanet = planetCopies[planetID]
                    if hasattr(planet, 'owner') and planet.owner == player.oid:
                        queuePlanetNumber, queueEffProd = globalQueueStats[
                            planet.globalQueue]
                        queuePlanetNumber += 1
                        queueEffProd += planet.effProdProd
                        globalQueueStats[planet.globalQueue] = (
                            queuePlanetNumber, queueEffProd)
                        # compute bio and en for system
                        bio += planet.changeBio
                        totalBio += max(0, planet.storBio - planet.minBio)
                        en += planet.changeEn
                        totalEn += max(0, planet.storEn - planet.minEn)
                        # the planet needs to have global queue 0 - the default one - to have its queue reported
                        if hasattr(
                                planet, 'prodQueue'
                        ) and self.win.vPlanets.checked and not planet.globalQueue:
                            totalEtc = 0
                            # compute length of production queue
                            if cPlanet.prodQueue and cPlanet.effProdProd > 0:
                                for task in cPlanet.prodQueue:
                                    if task.isShip:
                                        tech = client.getPlayer().shipDesigns[
                                            task.techID]
                                    else:
                                        tech = client.getFullTechInfo(
                                            task.techID)
                                        if tech.isStructure and hasattr(
                                                task, "demolishStruct"
                                        ) and task.demolishStruct == 0:
                                            # total count of constructing buildings on target
                                            if buildingQuantity.has_key(
                                                    task.targetID):
                                                buildingQuantity[
                                                    task.
                                                    targetID] += task.quantity
                                            else:
                                                buildingQuantity[
                                                    task.
                                                    targetID] = task.quantity

                                            # information about source and target of constructing
                                            if buildingInfo.has_key(
                                                (planetID, task.targetID)):
                                                buildingInfo[(
                                                    planetID, task.targetID
                                                )] += task.quantity
                                            else:
                                                buildingInfo[(
                                                    planetID, task.targetID
                                                )] = task.quantity
                                        elif tech.isProject and tech.id == 3802:
                                            # we are constructing Habitable Surface Expansion
                                            # so after construction we got some new slots on planet
                                            if not task.targetID in planetCopies:
                                                targetPlanet = client.get(
                                                    task.targetID, noUpdate=1)
                                                cPlanet = copy.deepcopy(
                                                    targetPlanet)
                                                planetCopies[
                                                    task.targetID] = cPlanet

                                            planetCopies[
                                                task.
                                                targetID].plSlots += task.quantity

                                    if task.targetID != planetID:
                                        totalEtc += math.ceil(
                                            float(tech.buildProd *
                                                  Rules.buildOnAnotherPlanetMod
                                                  - task.currProd) /
                                            planet.effProdProd)
                                        totalEtc += math.ceil(
                                            (task.quantity - 1) * float(
                                                tech.buildProd *
                                                Rules.buildOnAnotherPlanetMod)
                                            / planet.effProdProd)
                                    else:
                                        totalEtc += math.ceil(
                                            task.quantity *
                                            float(tech.buildProd -
                                                  task.currProd) /
                                            planet.effProdProd)
                                        totalEtc += math.ceil(
                                            (task.quantity - 1) *
                                            float(tech.buildProd) /
                                            planet.effProdProd)
                            else:
                                totalEtc = 99999

                            prodQueueProblems.append(
                                (planetID, totalEtc, len(planet.prodQueue)))

                        # check for structures status
                        if hasattr(planet,
                                   'slots') and self.win.vPlanets.checked:
                            for struct in planet.slots:
                                status = struct[Const.STRUCT_IDX_STATUS]
                                problem = None
                                tech = client.getFullTechInfo(
                                    struct[Const.STRUCT_IDX_TECHID])

                                if hasattr(player, 'techs'):
                                    techEff = Rules.techImprEff[
                                        player.techs.get(
                                            struct[Const.STRUCT_IDX_TECHID],
                                            Rules.techBaseImprovement)]
                                else:
                                    techEff = Rules.techImprEff[
                                        Rules.techBaseImprovement]

                                HPturn = max(1,
                                             int(0.02 * tech.maxHP * techEff))
                                turnsToDestroy = math.ceil(
                                    struct[Const.STRUCT_IDX_HP] / HPturn)

                                if turnsToDestroy < 48:
                                    dispDestr = major
                                    fgColorDestr = gdata.sevColors[gdata.MAJ]
                                    if turnsToDestroy < 24:
                                        dispDestr = critical
                                        fgColorDestr = gdata.sevColors[
                                            gdata.CRI]
                                else:
                                    dispDestr = minor
                                    fgColorDestr = None

                                if not status & Const.STRUCT_STATUS_ON:
                                    # structure is off
                                    if dispDestr:
                                        items.append(
                                            ui.Item(
                                                planet.name,
                                                tOID=planetID,
                                                tType=Const.T_PLANET,
                                                foreground=fgColorDestr,
                                                vDescription=
                                                _('Structure (%s) is off and will be destroyed in %s turns.'
                                                  ) %
                                                (tech.name,
                                                 res.formatTime(turnsToDestroy)
                                                 )))

                                elif status & Const.STRUCT_STATUS_DETER:
                                    problem = _('is deteriorating')
                                    disp = major
                                    fgColor = gdata.sevColors[gdata.MAJ]
                                elif status & Const.STRUCT_STATUS_NOBIO:
                                    problem = _(
                                        'has insufficient supply of biomatter')
                                    disp = info
                                    fgColor = gdata.sevColors[gdata.INFO]
                                elif status & Const.STRUCT_STATUS_NOEN:
                                    problem = _(
                                        'has insufficient supply of energy')
                                    disp = info
                                    fgColor = gdata.sevColors[gdata.INFO]
                                elif status & Const.STRUCT_STATUS_NOPOP:
                                    problem = _(
                                        'has insufficient supply of workers')
                                    disp = info
                                    fgColor = gdata.sevColors[gdata.INFO]
                                elif status & Const.STRUCT_STATUS_REPAIRING:
                                    problem = _('is repairing')
                                    disp = info
                                    fgColor = gdata.sevColors[gdata.INFO]

                                if problem and disp:
                                    items.append(
                                        ui.Item(planet.name,
                                                tOID=planetID,
                                                tType=Const.T_PLANET,
                                                foreground=fgColor,
                                                vDescription=_(
                                                    'Structure (%s) %s.') %
                                                (tech.name, problem)))

                for planetID, quantity in buildingQuantity.items():
                    planet = planetCopies[planetID]
                    # test, if there is total quantity of building as target for this planet
                    if planet.plSlots < len(planet.slots) + quantity and major:
                        # walk infos and search for all planets, that are building
                        # on planet founded above
                        for (sourceID,
                             targetID), quantity in buildingInfo.items():
                            if planetID == targetID:
                                source = client.get(sourceID, noUpdate=1)
                                items.append(
                                    ui.Item(
                                        source.name,
                                        tOID=sourceID,
                                        tType=Const.T_PLANET,
                                        foreground=gdata.sevColors[gdata.MAJ],
                                        vDescription=
                                        _('There is no space for all constructed buildings on %s.'
                                          ) % (planet.name)))

                # check bio for system
                if bio < 0 and self.win.vSystems.checked:
                    disp = minor
                    fgColor = None
                    surplusTurns = totalBio / (-bio)
                    if surplusTurns < 168:
                        disp = major
                        fgColor = gdata.sevColors[gdata.MAJ]
                    if surplusTurns < 48:
                        disp = critical
                        fgColor = gdata.sevColors[gdata.CRI]

                    if disp:
                        if totalBio > 0:
                            items.append(
                                ui.Item(
                                    obj.name,
                                    tOID=obj.oid,
                                    tType=Const.T_SYSTEM,
                                    foreground=fgColor,
                                    vDescription=
                                    _('Bio decreasing - last turn change %d, surplus %d (%s).'
                                      ) % (bio, totalBio,
                                           res.formatTime(surplusTurns))))
                        else:
                            items.append(
                                ui.Item(
                                    obj.name,
                                    tOID=obj.oid,
                                    tType=Const.T_SYSTEM,
                                    foreground=fgColor,
                                    vDescription=
                                    _('Bio decreasing - last turn change %d, surplus %d.'
                                      ) % (bio, totalBio)))

                #check en for system
                if en < 0 and self.win.vSystems.checked:
                    disp = minor
                    fgColor = None
                    surplusTurns = totalEn / (-en)
                    if surplusTurns < 168:
                        disp = major
                        fgColor = gdata.sevColors[gdata.MAJ]
                    if surplusTurns < 48:
                        disp = critical
                        fgColor = gdata.sevColors[gdata.CRI]

                    if disp:
                        if totalEn > 0:
                            items.append(
                                ui.Item(
                                    obj.name,
                                    tOID=obj.oid,
                                    tType=Const.T_SYSTEM,
                                    foreground=fgColor,
                                    vDescription=
                                    _('Energy decreasing - last turn change %d, surplus %d (%s).'
                                      ) % (en, totalEn,
                                           res.formatTime(surplusTurns))))
                        else:
                            items.append(
                                ui.Item(
                                    obj.name,
                                    tOID=obj.oid,
                                    tType=Const.T_SYSTEM,
                                    foreground=fgColor,
                                    vDescription=
                                    _('Energy decreasing - last turn change %d, surplus %d.'
                                      ) % (en, totalEn)))

            # check fleets
            elif obj.type == Const.T_FLEET and self.win.vFleets.checked:
                if hasattr(obj, 'owner') and obj.owner == player.oid:
                    energyReserve = obj.storEn * 100 / obj.maxEn
                    system = None
                    disp = major
                    fgColor = gdata.sevColors[gdata.MAJ]
                    note = _(' and IS NOT refueling')

                    maxRefuelMax = 0
                    if hasattr(obj, 'orbiting') and obj.orbiting:
                        system = client.get(obj.orbiting, noUpdate=1)
                        if hasattr(system, 'planets'):
                            for planetID in system.planets:
                                planet = client.get(planetID, noUpdate=1)
                                if hasattr(planet, 'owner') and hasattr(
                                        planet, 'refuelMax'):
                                    if player.diplomacyRels.has_key(
                                            planet.owner):
                                        dipl = client.getDiplomacyWith(
                                            planet.owner)
                                        if dipl.pacts.has_key(
                                                Const.PACT_ALLOW_TANKING
                                        ) and dipl.pacts[
                                                Const.PACT_ALLOW_TANKING][
                                                    0] == Const.PACT_ACTIVE:
                                            maxRefuelMax = max(
                                                maxRefuelMax, planet.refuelMax)
                                    else:
                                        if planet.owner == player.oid:
                                            maxRefuelMax = max(
                                                maxRefuelMax, planet.refuelMax)

                            if maxRefuelMax > 0:
                                disp = info
                                fgColor = gdata.sevColors[gdata.INFO]
                                note = _(' and IS refueling')
                                if maxRefuelMax <= energyReserve:
                                    note = _(
                                        ' and CAN refuel, but reach planet maximum refuel amount'
                                    )

                    else:
                        continue

                    systemName = res.getUnknownName()
                    if system and hasattr(system, "name"):
                        systemName = system.name

                    # check fleets energy reserve
                    if energyReserve < 50 and maxRefuelMax == 0:
                        disp = major
                        fgColor = gdata.sevColors[gdata.MAJ]
                        if energyReserve < 25 and maxRefuelMax == 0:
                            disp = critical
                            fgColor = gdata.sevColors[gdata.CRI]
                    else:
                        fgColor = gdata.sevColors[gdata.INFO]
                        disp = info

                    # is fleet named?
                    if hasattr(obj, 'customname') and obj.customname:
                        name = obj.customname
                    else:
                        name = getattr(obj, "name", None)

                    if energyReserve == 100 and info and disp:
                        items.append(
                            ui.Item(systemName,
                                    tOID=obj.oid,
                                    tType=Const.T_FLEET,
                                    foreground=gdata.sevColors[gdata.INFO],
                                    vDescription=_(
                                        'Fleet "%s" has full fuel tanks.') %
                                    (name)))
                    elif disp:
                        items.append(
                            ui.Item(
                                systemName,
                                tOID=obj.oid,
                                tType=Const.T_FLEET,
                                foreground=fgColor,
                                vDescription=_(
                                    'Fleet "%s" is low on fuel [%d %%]%s.') %
                                (name, energyReserve, note)))

        queConstValues = [0, 0, 0, 0, 0]
        queEtc = [0, 0, 0, 0, 0]
        for queue in xrange(5):
            quePlanets, queEffProd = globalQueueStats[queue]
            for task in player.prodQueues[queue]:
                if task.isShip:
                    tech = client.getPlayer().shipDesigns[task.techID]
                else:
                    tech = client.getFullTechInfo(task.techID)
                queConstValues[queue] += task.quantity * tech.buildProd
            if queEffProd > 0:
                queEtc[queue] = math.ceil(
                    float(queConstValues[queue]) / queEffProd)
            else:
                queEtc[queue] = 99999

        # creation of items with production queue [default one] problems
        for planetID, totalEtc, queueLen in prodQueueProblems:
            planet = client.get(planetID, noUpdate=1)

            # check empty production queue
            if queueLen == 0 and planet.effProdProd > 0 and queConstValues[
                    0] == 0 and critical:
                items.append(
                    ui.Item(planet.name,
                            tOID=planetID,
                            tType=Const.T_PLANET,
                            foreground=gdata.sevColors[gdata.CRI],
                            vDescription=_('Production queue is empty.')))

            # check end of production queue
            if totalEtc + queEtc[0] < 48:
                fgColor = None
                disp = minor
                if totalEtc + queEtc[0] < 24:
                    disp = major
                    fgColor = gdata.sevColors[gdata.MAJ]
                    if disp:
                        items.append(
                            ui.Item(
                                planet.name,
                                tOID=planetID,
                                tType=Const.T_PLANET,
                                foreground=fgColor,
                                vDescription=_(
                                    'Production queue may end in {0} turns ({1} directly in planet queue), {2} item(s) on list.'
                                    .format(
                                        res.formatTime(totalEtc + queEtc[0]),
                                        res.formatTime(totalEtc), queueLen))))

        # creation of items with global queue problems
        for queue in xrange(1, 5):
            queName = res.globalQueueName(queue)
            quePlanets = globalQueueStats[queue][0]
            # check empty global production queue with at least one planet [so its relevant]
            if queConstValues[queue] == 0 and quePlanets > 0 and critical:
                items.append(
                    ui.Item(
                        _('Global queue ' + queName),
                        tType=Const.T_QUEUE,
                        foreground=gdata.sevColors[gdata.CRI],
                        vDescription=_(
                            'Global production queue {0} used by {1} planet(s) is empty.'
                            .format(queName, quePlanets))))

            # check end of global production queue
            elif queEtc[queue] < 48:
                fgColor = None
                disp = minor
                if queEtc[queue] < 24:
                    disp = major
                    fgColor = gdata.sevColors[gdata.MAJ]
                if disp:
                    items.append(
                        ui.Item(
                            _('Global queue ' + queName),
                            tType=Const.T_QUEUE,
                            foreground=fgColor,
                            vDescription=_(
                                'Global production queue {0} used by {1} planet(s) runs out in {2} turns.'
                                .format(queName, quePlanets,
                                        res.formatTime(queEtc[queue])))))

        # check research queue
        if self.win.vResearch.checked:
            totalEtc = 0
            # compute length of research queue
            for task in player.rsrchQueue:
                tech = client.getTechInfo(task.techID)
                fulltech = client.getFullTechInfo(task.techID)
                researchSci = Utils.getTechRCost(player, task.techID,
                                                 task.improvement)
                maxImprovement = min(Rules.techMaxImprovement,
                                     fulltech.maxImprovement)
                maxImpTotalSci = 0
                if task.improveToMax and task.improvement < maxImprovement:
                    for impr in range(task.improvement + 1,
                                      maxImprovement + 1):
                        maxImpTotalSci += Utils.getTechRCost(
                            player, task.techID, impr)
                if task.changeSci > 0:
                    value = float(researchSci - task.currSci) / max(
                        task.changeSci, player.effSciPoints)
                    totalEtc += int(value + 1)
                    if player.effSciPoints != 0:
                        totalEtc += float(maxImpTotalSci) / player.effSciPoints
                elif task.changeSci < 0:
                    totalEtc -= float(task.currSci) / min(
                        task.changeSci, player.effSciPoints)
                elif player.effSciPoints > 0:
                    value = float(researchSci) / player.effSciPoints
                    totalEtc += int(value + 1)
                    totalEtc += float(maxImpTotalSci) / player.effSciPoints
                else:
                    totalEtc = 99999
                    break

            # check empty research queue
            if totalEtc == 0 and len(
                    player.rsrchQueue
            ) == 0 and player.effSciPoints > 0 and major:
                items.append(
                    ui.Item(_('Research'),
                            tType=Const.T_TECHNOLOGY,
                            foreground=gdata.sevColors[gdata.MAJ],
                            vDescription=_('Research queue is empty.')))
            # check short reseach queue
            elif totalEtc < 48:
                disp = minor
                fgColor = None
                if totalEtc < 24:
                    disp = major
                    fgColor = gdata.sevColors[gdata.MAJ]

                if disp:
                    items.append(
                        ui.Item(
                            _('Research'),
                            tType=Const.T_TECHNOLOGY,
                            foreground=fgColor,
                            vDescription=
                            _('Research queue ends in %s turns, %d item(s) on list.'
                              ) % (res.formatTime(totalEtc),
                                   len(player.rsrchQueue))))

        self.win.vProblems.items = items
        self.win.vProblems.itemsChanged()
示例#46
0
 def _detailEquipmentLists(self):
     # design info
     if self.hullID:
         tech = client.getTechInfo(self.hullID)
         self.win.vHull.text = tech.name  # TODO _(tech.name)
     elif self.editMode:
         self.win.vHull.text = _("[Click to select]")
     else:
         self.win.vHull.text = ""
     if self.ctrlID:
         tech = client.getTechInfo(self.ctrlID)
         self.win.vCtrl.text = tech.name  # TODO _(tech.name)
     elif self.editMode:
         self.win.vCtrl.text = _("[Click to select]")
     else:
         self.win.vCtrl.text = ""
     # equipments
     engines = []
     weapons = []
     equipment = []
     selected = None
     selected_type = None
     for eqID in self.eqIDs:
         tech = client.getTechInfo(eqID)
         short = sequip.getShortDescr(eqID)
         _long = sequip.getLongDescr(eqID)
         # cache has been introduced to let items preserve highlight information
         if eqID in self.itemCache:
             item = self.itemCache[eqID]
             item.tNumber = self.eqIDs[eqID]
         else:
             item = ui.Item(tech.name,
                            techID=eqID,
                            tNumber=self.eqIDs[eqID],
                            tData=short,
                            tooltipTitle=_("Details"),
                            tooltip=_long,
                            statustip=_long)
             self.itemCache[eqID] = item
         if eqID == self.selectedEqID:
             selected = item
             selected_type = tech.subtype
         if tech.subtype == "seq_eng":
             engines.append(item)
         elif tech.subtype == "seq_wpn":
             weapons.append(item)
         elif tech.subtype in ["seq_mod", "seq_struct"]:
             equipment.append(item)
     self.win.vEngines.items = engines
     self.win.vEngines.itemsChanged()
     if selected_type == "seq_eng":
         self.win.vEngines.selectItem(selected)
     else:
         self.win.vEngines.selectItem(None)
     self.win.vWeapons.items = weapons
     self.win.vWeapons.itemsChanged()
     if selected_type == "seq_wpn":
         self.win.vWeapons.selectItem(selected)
     else:
         self.win.vWeapons.selectItem(None)
     self.win.vEquipment.items = equipment
     self.win.vEquipment.itemsChanged()
     if selected_type == "seq_mod":
         self.win.vEquipment.selectItem(selected)
     else:
         self.win.vEquipment.selectItem(None)
示例#47
0
    def showTechs(self):
        # techs
        items = []
        select = None

        showMilitary = self.win.vMilitary.checked
        showBio = self.win.vBioProduction.checked
        showEn = self.win.vEnProduction.checked
        showCP = self.win.vCPProduction.checked
        showRP = self.win.vRPProduction.checked
        showMorale = self.win.vMorale.checked

        showSmall = self.win.vSmall.checked
        showMed = self.win.vMedium.checked
        showLarge = self.win.vLarge.checked
        showCivShip = self.win.vCivShip.checked
        showMilShip = self.win.vMilShip.checked

        for techID in client.getPlayer().techs.keys():
            tech = client.getTechInfo(techID)

            # hide pirate techs from ships and miscs view
            if not self.showStructures and tech.level == 99:
                continue

            if tech.isStructure:
                if (tech.isMilitary or getattr(tech, "prodBio", 0) > 0 or getattr(tech, "prodEnv", 0) > 0 or \
                        getattr(tech, "prodEn", 0) > 0 or getattr(tech, "prodProd", 0) > 0 or \
                        getattr(tech, "prodSci", 0) > 0 or getattr(tech, "moraleTrgt", 0) > 0):
                    if not ((tech.isMilitary and showMilitary) or \
                           ((getattr(tech, "prodBio", 0) > 0 or getattr(tech, "prodEnv", 0) > 0) and showBio) or \
                            (getattr(tech, "prodEn", 0) > 0 and showEn) or \
                            (getattr(tech, "prodProd", 0) > 0 and showCP) or \
                            (getattr(tech, "prodSci", 0) > 0 and showRP) or \
                            (getattr(tech, "moraleTrgt", 0) > 0 and showMorale)):
                        continue

            if self.prodProd > 0:
                etc = math.ceil(float(tech.buildProd) / self.prodProd)
                if self.targetID != self.planetID:
                    etc *= Rules.buildOnAnotherPlanetMod
                etc = res.formatTime(etc)
            else:
                etc = _("N/A")
            item = ui.Item(tech.name,
                tLevel = tech.level,
                tProd = tech.buildProd,
                techID = techID,
                tIsShip = 0,
                tETC = etc,
            )
            if item.tLevel > self.maxTechLevel:
                self.maxTechLevel = item.tLevel

            if item.tLevel in self.showLevels and \
                ((self.showStructures and tech.isStructure) or \
                (self.showOther and (tech.isProject))):
                items.append(item)
                if techID == self.techID:
                    select = item

        # special handling for ships
        player = client.getPlayer()
        if self.showShips:
            for designID in player.shipDesigns.keys():
                tech = player.shipDesigns[designID]

                if not ((tech.combatClass == 0 and showSmall) or (tech.combatClass == 1 and showMed) or (tech.combatClass == 2 and showLarge)):
                    continue

                if not ((tech.isMilitary and showMilShip) or (not tech.isMilitary and showCivShip)):
                    continue

                if tech.upgradeTo != OID_NONE:
                    # skip ships that are set to upgrade
                    continue
                if self.prodProd > 0:
                    etc = res.formatTime(math.ceil(float(tech.buildProd) / self.prodProd))
                else:
                    etc = _("N/A")
                item = ui.Item(tech.name,
                    tLevel = tech.level,
                    tProd = tech.buildProd,
                    techID = designID,
                    tIsShip = 1,
                    tETC = etc,
                )
                items.append(item)
                if designID == self.techID:
                    select = item
        # sort it by level and then by name
        items.sort(lambda a, b: cmp((100 - a.tLevel, a.text), (100 - b.tLevel, b.text)))
        self.win.vTechs.items = items
        self.win.vTechs.itemsChanged()
        self.win.vTechs.selectItem(select)
        # filter
        for i in xrange(1, 10):
            widget = getattr(self.win, 'vLevel%d' % i)
            if i in self.showLevels and i <= self.maxTechLevel:
                widget.visible = 1
                widget.pressed = 1
            elif i not in self.showLevels and i <= self.maxTechLevel:
                widget.visible = 1
                widget.pressed = 0
            else:
                widget.visible = 0
        self.win.vStructuresToggle.pressed = self.showStructures
        self.win.vShipsToggle.pressed = self.showShips
        self.win.vOtherToggle.pressed = self.showOther
        # targets
        info = []
        system = client.get(self.systemID, noUpdate = 1)
        select = None
        if hasattr(system, 'planets'):
            for planetID in system.planets:
                planet = client.get(planetID, noUpdate = 1)
                owner = res.getUnknownName()
                #rel = REL_UNDEF
                ownerID = OID_NONE
                if hasattr(planet, 'owner'):
                    ownerID = planet.owner
                    if planet.owner != OID_NONE:
                        owner = client.get(planet.owner, noUpdate = 1).name
                        #rel = client.getRelationTo(planet.owner)
                    else:
                        owner = _('[Nobody]')
                if planet.plType in ("A", "G"):
                    color = gdata.sevColors[gdata.DISABLED]
                else:
                    #color = res.getFFColorCode(rel)
                    color = res.getPlayerColor(ownerID)
                plname = getattr(planet, 'name', res.getUnknownName())
                item = ui.Item(
                    plname,
                    text_raw = getattr(planet, 'plEn', plname),
                    planetID = planetID,
                    plOwner = owner,
                    foreground = color,
                )
                info.append(item)
                if planetID == self.targetID:
                    select = item
        self.win.vTargets.items = info
        self.win.vTargets.itemsChanged()
        self.win.vTargets.selectItem(select)
        # quantity
        self.win.vQuantity.text = str(self.quantity)
示例#48
0
    def show(self):
        critical = self.win.vCritical.checked
        major = self.win.vMajor.checked
        minor = self.win.vMinor.checked
        info = self.win.vInfo.checked

        disp = 1

        player = client.getPlayer()
        items = []
        # object list (all player's objects + systems)
        objects = player.fleets[:]
        objects += player.planets[:]
        systems = {}
        for planetID in player.planets:
            planet = client.get(planetID)
            if planet.compOf not in systems:
                systems[planet.compOf] = None
        objects += systems.keys()

        # counting construction points value of each global production queue
        # holder for (number , eff production) of planets set to each queue
        globalQueueStats=[(0,0), (0,0), (0,0), (0,0), (0,0)]
        prodQueueProblems = []


        # go through all objects
        for objID in objects:
            if objID < OID_FREESTART:
                continue
            obj = client.get(objID, noUpdate = 1)
            if not hasattr(obj, "type"):
                continue
            if obj.type == T_SYSTEM:
                if not hasattr(obj, 'planets'):
                    continue
                bio = 0
                totalBio = 0
                en = 0
                totalEn = 0
                buildingQuantity = {}
                buildingInfo = {}
                # holds modified planets
                planetCopies = {}

                for planetID in obj.planets:
                    planet = client.get(planetID, noUpdate = 1)
                    # copy of planet to change plSlots count
                    if not planetID in planetCopies:
                        cPlanet = copy.deepcopy(planet)
                        planetCopies[planetID] = cPlanet
                    else:
                        cPlanet = planetCopies[planetID]
                    if hasattr(planet, 'owner') and planet.owner == player.oid:
                        queuePlanetNumber, queueEffProd = globalQueueStats[planet.globalQueue]
                        queuePlanetNumber += 1
                        queueEffProd += planet.effProdProd
                        globalQueueStats[planet.globalQueue] = (queuePlanetNumber, queueEffProd)
                        # compute bio and en for system
                        bio += planet.changeBio
                        totalBio += max(0, planet.storBio - planet.minBio)
                        en  += planet.changeEn
                        totalEn += max(0, planet.storEn - planet.minEn)
                        # the planet needs to have global queue 0 - the default one - to have its queue reported
                        if hasattr(planet, 'prodQueue') and self.win.vPlanets.checked and not planet.globalQueue:
                            totalEtc = 0
                            # compute length of production queue
                            if cPlanet.prodQueue and cPlanet.effProdProd > 0:
                                for task in cPlanet.prodQueue:
                                    if task.isShip:
                                        tech = client.getPlayer().shipDesigns[task.techID]
                                    else:
                                        tech = client.getFullTechInfo(task.techID)
                                        if tech.isStructure and hasattr(task, "demolishStruct") and task.demolishStruct == 0:
                                            # total count of constructing buildings on target
                                            if buildingQuantity.has_key(task.targetID):
                                                buildingQuantity[task.targetID] += task.quantity
                                            else:
                                                buildingQuantity[task.targetID] = task.quantity

                                            # information about source and target of constructing
                                            if buildingInfo.has_key((planetID, task.targetID)):
                                                buildingInfo[(planetID, task.targetID)] += task.quantity
                                            else:
                                                buildingInfo[(planetID, task.targetID)] = task.quantity
                                        elif tech.isProject and tech.id == 3802:
                                            # we are constructing Habitable Surface Expansion
                                            # so after construction we got some new slots on planet
                                            if not task.targetID in planetCopies:
                                                targetPlanet = client.get(task.targetID, noUpdate = 1)
                                                cPlanet = copy.deepcopy(targetPlanet)
                                                planetCopies[task.targetID] = cPlanet

                                            planetCopies[task.targetID].plSlots += task.quantity

                                    if task.targetID != planetID:
                                        totalEtc += math.ceil(float(tech.buildProd * Rules.buildOnAnotherPlanetMod - task.currProd) / planet.effProdProd)
                                        totalEtc += math.ceil((task.quantity - 1) * float(tech.buildProd * Rules.buildOnAnotherPlanetMod) / planet.effProdProd)
                                    else:
                                        totalEtc += math.ceil(task.quantity * float(tech.buildProd - task.currProd) / planet.effProdProd)
                                        totalEtc += math.ceil((task.quantity - 1) * float(tech.buildProd) / planet.effProdProd)
                            else:
                                totalEtc = 99999

                            prodQueueProblems.append((planetID, totalEtc, len(planet.prodQueue)))


                        # check for structures status
                        if hasattr(planet, 'slots') and self.win.vPlanets.checked:
                            for struct in planet.slots:
                                status = struct[STRUCT_IDX_STATUS]
                                problem = None
                                tech = client.getFullTechInfo(struct[STRUCT_IDX_TECHID])

                                if hasattr(player, 'techs'):
                                    techEff = Rules.techImprEff[player.techs.get(struct[STRUCT_IDX_TECHID], Rules.techBaseImprovement)]
                                else:
                                    techEff = Rules.techImprEff[Rules.techBaseImprovement]

                                HPturn = max(1, int(0.02 * tech.maxHP * techEff))
                                turnsToDestroy = math.ceil(struct[STRUCT_IDX_HP] / HPturn)

                                if turnsToDestroy < 48:
                                    dispDestr = major
                                    fgColorDestr = gdata.sevColors[gdata.MAJ]
                                    if turnsToDestroy < 24:
                                        dispDestr = critical
                                        fgColorDestr = gdata.sevColors[gdata.CRI]
                                else:
                                    dispDestr = minor
                                    fgColorDestr = None

                                if not status & STRUCT_STATUS_ON:
                                    # structure is off
                                    if dispDestr:
                                        items.append(ui.Item(planet.name, tOID = planetID, tType = T_PLANET, foreground = fgColorDestr,
                                            vDescription = _('Structure (%s) is off and will be destroyed in %s turns.') % (tech.name, res.formatTime(turnsToDestroy))))

                                elif status & STRUCT_STATUS_DETER:
                                    problem = _('is deteriorating and will be destroyed in %s turns') % res.formatTime(turnsToDestroy)
                                    disp = major
                                    fgColor = gdata.sevColors[gdata.MAJ]
                                elif status & STRUCT_STATUS_NOBIO:
                                    problem = _('has insufficient supply of biomatter')
                                    disp = info
                                    fgColor = gdata.sevColors[gdata.INFO]
                                elif status & STRUCT_STATUS_NOEN:
                                    problem = _('has insufficient supply of energy')
                                    disp = info
                                    fgColor = gdata.sevColors[gdata.INFO]
                                elif status & STRUCT_STATUS_NOPOP:
                                    problem = _('has insufficient supply of workers')
                                    disp = info
                                    fgColor = gdata.sevColors[gdata.INFO]
                                elif status & STRUCT_STATUS_REPAIRING:
                                    problem = _('is repairing')
                                    disp = info
                                    fgColor = gdata.sevColors[gdata.INFO]

                                if problem and disp:
                                    items.append(ui.Item(planet.name, tOID = planetID, tType = T_PLANET, foreground = fgColor,
                                        vDescription = _('Structure (%s) %s.') % (tech.name, problem)))

                for planetID, quantity in buildingQuantity.items():
                    planet = planetCopies[planetID]
                    # test, if there is total quantity of building as target for this planet
                    if planet.plSlots < len(planet.slots) + quantity and major:
                        # walk infos and search for all planets, that are building
                        # on planet founded above
                        for (sourceID, targetID), quantity in buildingInfo.items():
                            if planetID == targetID:
                                source = client.get(sourceID, noUpdate = 1)
                                items.append(ui.Item(source.name, tOID = sourceID, tType = T_PLANET, foreground = gdata.sevColors[gdata.MAJ],
                                            vDescription = _('There is no space for all constructed buildings on %s.') % (planet.name)))

                # check bio for system
                if bio < 0 and self.win.vSystems.checked:
                    disp = minor
                    fgColor = None
                    surplusTurns = totalBio / (-bio)
                    if surplusTurns < 168:
                        disp = major
                        fgColor = gdata.sevColors[gdata.MAJ]
                    if surplusTurns < 48:
                        disp = critical
                        fgColor = gdata.sevColors[gdata.CRI]

                    if disp:
                        if totalBio > 0:
                            items.append(ui.Item(obj.name, tOID = obj.oid, tType = T_SYSTEM, foreground = fgColor,
                                         vDescription = _('Bio decreasing - last turn change %d, surplus %d (%s).') % (bio, totalBio,res.formatTime(surplusTurns))))
                        else:
                            items.append(ui.Item(obj.name, tOID = obj.oid, tType = T_SYSTEM, foreground = fgColor,
                                         vDescription = _('Bio decreasing - last turn change %d, surplus %d.') % (bio, totalBio)))

                #check en for system
                if en < 0 and self.win.vSystems.checked:
                    disp = minor
                    fgColor = None
                    surplusTurns = totalEn / (-en)
                    if surplusTurns < 168:
                        disp = major
                        fgColor = gdata.sevColors[gdata.MAJ]
                    if surplusTurns < 48:
                        disp = critical
                        fgColor = gdata.sevColors[gdata.CRI]

                    if disp:
                        if totalEn > 0:
                            items.append(ui.Item(obj.name, tOID = obj.oid, tType = T_SYSTEM, foreground = fgColor,
                                        vDescription = _('Energy decreasing - last turn change %d, surplus %d (%s).') % (en, totalEn,res.formatTime(surplusTurns))))
                        else:
                            items.append(ui.Item(obj.name, tOID = obj.oid, tType = T_SYSTEM, foreground = fgColor,
                                         vDescription = _('Energy decreasing - last turn change %d, surplus %d.') % (en, totalEn)))

            # check fleets
            elif obj.type == T_FLEET and self.win.vFleets.checked:
                if hasattr(obj, 'owner') and obj.owner == player.oid:
                    energyReserve = obj.storEn  * 100 / obj.maxEn
                    system = None
                    disp = major
                    fgColor = gdata.sevColors[gdata.MAJ]
                    note = _(' and IS NOT refueling')

                    maxRefuelMax = 0
                    if hasattr(obj, 'orbiting') and obj.orbiting:
                        system = client.get(obj.orbiting, noUpdate = 1)
                        if hasattr(system, 'planets'):
                            for planetID in system.planets:
                                planet = client.get(planetID, noUpdate = 1)
                                if hasattr(planet, 'owner') and hasattr(planet, 'refuelMax'):
                                    if player.diplomacyRels.has_key(planet.owner):
                                        dipl = client.getDiplomacyWith(planet.owner)
                                        if dipl.pacts.has_key(PACT_ALLOW_TANKING) and dipl.pacts[PACT_ALLOW_TANKING][0] == PACT_ACTIVE:
                                            maxRefuelMax = max(maxRefuelMax, planet.refuelMax)
                                    else:
                                        if planet.owner == player.oid:
                                            maxRefuelMax = max(maxRefuelMax, planet.refuelMax)

                            if maxRefuelMax > 0:
                                disp = info
                                fgColor = gdata.sevColors[gdata.INFO]
                                note = _(' and IS refueling')
                                if maxRefuelMax <= energyReserve:
                                    note = _(' and CAN refuel, but reach planet maximum refuel amount')

                    else:
                        continue

                    systemName = res.getUnknownName()
                    if system and hasattr(system, "name"):
                        systemName = system.name

                    # check fleets energy reserve
                    if energyReserve < 50 and maxRefuelMax == 0:
                        disp = major
                        fgColor = gdata.sevColors[gdata.MAJ]
                        if energyReserve < 25 and maxRefuelMax == 0:
                            disp = critical
                            fgColor = gdata.sevColors[gdata.CRI]
                    else:
                        fgColor = gdata.sevColors[gdata.INFO]
                        disp = info

                    # is fleet named?
                    if hasattr(obj,'customname') and obj.customname:
                        name = obj.customname
                    else:
                        name = getattr(obj, "name", None)

                    if energyReserve == 100 and info and disp:
                        items.append(ui.Item(systemName, tOID = obj.oid, tType = T_FLEET,foreground = gdata.sevColors[gdata.INFO],
                                    vDescription = _('Fleet "%s" has full fuel tanks.') % (name)))
                    elif disp:
                        items.append(ui.Item(systemName, tOID = obj.oid, tType = T_FLEET,foreground = fgColor,
                                    vDescription = _('Fleet "%s" is low on fuel [%d %%]%s.') % (name, energyReserve, note)))


        queConstValues = [0, 0, 0, 0, 0]
        queEtc = [0, 0, 0, 0, 0]
        for queue in xrange(5):
            quePlanets, queEffProd = globalQueueStats[queue]
            for task in player.prodQueues[queue]:
                if task.isShip:
                    tech = client.getPlayer().shipDesigns[task.techID]
                else:
                    tech = client.getFullTechInfo(task.techID)
                queConstValues[queue] += task.quantity * tech.buildProd
            if queEffProd > 0:
                queEtc[queue] = math.ceil(float(queConstValues[queue])/queEffProd)
            else:
                queEtc[queue] = 99999

        # creation of items with production queue [default one] problems
        for planetID, totalEtc, queueLen in prodQueueProblems:
            planet = client.get(planetID, noUpdate = 1)

            # check empty production queue
            if queueLen == 0 and planet.effProdProd > 0 and queConstValues[0] == 0 and critical:
                items.append(ui.Item(planet.name, tOID = planetID, tType = T_PLANET,
                    foreground = gdata.sevColors[gdata.CRI],
                    vDescription = _('Production queue is empty.')))

            # check end of production queue
            if totalEtc+queEtc[0] < 48:
                fgColor = None
                disp = minor
                if totalEtc+queEtc[0] < 24:
                    disp = major
                    fgColor = gdata.sevColors[gdata.MAJ]
                    if disp:
                        items.append(ui.Item(planet.name, tOID = planetID, tType = T_PLANET, foreground = fgColor,
                            vDescription = _('Production queue may end in {0} turns ({1} directly in planet queue), {2} item(s) on list.'.format(res.formatTime(totalEtc+queEtc[0]), res.formatTime(totalEtc), queueLen))))

        # creation of items with global queue problems
        for queue in xrange(1, 5):
            queName = res.globalQueueName(queue)
            quePlanets = globalQueueStats[queue][0]
            # check empty global production queue with at least one planet [so its relevant]
            if queConstValues[queue] == 0 and  quePlanets > 0 and critical:
                items.append(ui.Item(_('Global queue ' + queName), tType = T_QUEUE,
                    foreground = gdata.sevColors[gdata.CRI],
                    vDescription = _('Global production queue {0} used by {1} planet(s) is empty.'.format(queName, quePlanets))))

            # check end of global production queue
            elif queEtc[queue] < 48:
                fgColor = None
                disp = minor
                if queEtc[queue] < 24:
                    disp = major
                    fgColor = gdata.sevColors[gdata.MAJ]
                if disp:
                    items.append(ui.Item(_('Global queue ' + queName), tType = T_QUEUE, foreground = fgColor,
                        vDescription = _('Global production queue {0} used by {1} planet(s) runs out in {2} turns.'.format(queName, quePlanets, res.formatTime(queEtc[queue])))))

        # check research queue
        if self.win.vResearch.checked:
            totalEtc = 0
            # compute length of research queue
            for task in player.rsrchQueue:
                tech = client.getTechInfo(task.techID)
                fulltech = client.getFullTechInfo(task.techID)
                researchSci = Utils.getTechRCost(player, task.techID, task.improvement)
                maxImprovement = min(Rules.techMaxImprovement,fulltech.maxImprovement)
                maxImpTotalSci = 0
                if task.improveToMax and task.improvement < maxImprovement:
                    for impr in range(task.improvement+1,maxImprovement+1):
                        maxImpTotalSci += Utils.getTechRCost(player, task.techID, impr)
                if task.changeSci > 0:
                    value = float(researchSci - task.currSci) / max(task.changeSci, player.effSciPoints)
                    totalEtc += int(value + 1)
                    if player.effSciPoints != 0:
                        totalEtc += float(maxImpTotalSci) / player.effSciPoints
                elif task.changeSci < 0:
                    totalEtc -= float(task.currSci) / min(task.changeSci, player.effSciPoints)
                elif player.effSciPoints > 0:
                    value = float(researchSci) / player.effSciPoints
                    totalEtc += int(value + 1)
                    totalEtc += float(maxImpTotalSci) / player.effSciPoints
                else:
                    totalEtc = 99999
                    break

            # check empty research queue
            if totalEtc == 0 and len(player.rsrchQueue) == 0 and player.effSciPoints > 0 and major:
                items.append(ui.Item(_('Research'), tType = T_TECHNOLOGY, foreground = gdata.sevColors[gdata.MAJ],
                    vDescription = _('Research queue is empty.')))
            # check short reseach queue
            elif totalEtc < 48:
                disp = minor
                fgColor = None
                if totalEtc < 24:
                    disp = major
                    fgColor = gdata.sevColors[gdata.MAJ]

                if disp:
                    items.append(ui.Item(_('Research'), tType = T_TECHNOLOGY, foreground = fgColor,
                                vDescription = _('Research queue ends in %s turns, %d item(s) on list.') % (res.formatTime(totalEtc), len(player.rsrchQueue))))

        self.win.vProblems.items = items
        self.win.vProblems.itemsChanged()