def __init__(self, strCompactDescr=None, inventoryID=-1, typeCompDescr=None, proxy=None): if strCompactDescr is not None: vehDescr = vehicles.VehicleDescr(compactDescr=strCompactDescr) else: raise typeCompDescr is not None or AssertionError _, nID, innID = vehicles.parseIntCompactDescr(typeCompDescr) vehDescr = vehicles.VehicleDescr(typeID=(nID, innID)) self.__descriptor = vehDescr HasStrCD.__init__(self, strCompactDescr) FittingItem.__init__(self, vehDescr.type.compactDescr, proxy) self.inventoryID = inventoryID self.xp = 0 self.dailyXPFactor = -1 self.isElite = False self.isFullyElite = False self.clanLock = 0 self.isUnique = self.isHidden self.rentPackages = [] self.hasRentPackages = False self.isDisabledForBuy = False self.isSelected = False self.igrCustomizationsLayout = {} invData = dict() if proxy is not None and proxy.inventory.isSynced( ) and proxy.stats.isSynced() and proxy.shop.isSynced(): invDataTmp = proxy.inventory.getItems(GUI_ITEM_TYPE.VEHICLE, inventoryID) if invDataTmp is not None: invData = invDataTmp self.xp = proxy.stats.vehiclesXPs.get(self.intCD, self.xp) if proxy.shop.winXPFactorMode == WIN_XP_FACTOR_MODE.ALWAYS or self.intCD not in proxy.stats.multipliedVehicles and not self.isOnlyForEventBattles: self.dailyXPFactor = proxy.shop.dailyXPFactor self.isElite = len( vehDescr.type.unlocksDescrs ) == 0 or self.intCD in proxy.stats.eliteVehicles self.isFullyElite = self.isElite and len([ data for data in vehDescr.type.unlocksDescrs if data[1] not in proxy.stats.unlocks ]) == 0 clanDamageLock = proxy.stats.vehicleTypeLocks.get(self.intCD, {}).get( CLAN_LOCK, 0) clanNewbieLock = proxy.stats.globalVehicleLocks.get(CLAN_LOCK, 0) self.clanLock = clanDamageLock or clanNewbieLock self.isDisabledForBuy = self.intCD in proxy.shop.getNotToBuyVehicles( ) self.hasRentPackages = bool(proxy.shop.getVehicleRentPrices().get( self.intCD, {})) self.isSelected = bool(self.invID in proxy.stats.oldVehInvIDs) self.igrCustomizationsLayout = proxy.inventory.getIgrCustomizationsLayout( ).get(self.inventoryID, {}) self.inventoryCount = 1 if len(invData.keys()) else 0 data = invData.get('rent') if data is not None: self.rentInfo = RentalInfoProvider(isRented=True, *data) self.settings = invData.get('settings', 0) self.lock = invData.get('lock', (0, 0)) self.repairCost, self.health = invData.get('repair', (0, 0)) self.gun = VehicleGun(vehDescr.gun['compactDescr'], proxy, vehDescr.gun) self.turret = VehicleTurret(vehDescr.turret['compactDescr'], proxy, vehDescr.turret) self.engine = VehicleEngine(vehDescr.engine['compactDescr'], proxy, vehDescr.engine) self.chassis = VehicleChassis(vehDescr.chassis['compactDescr'], proxy, vehDescr.chassis) self.radio = VehicleRadio(vehDescr.radio['compactDescr'], proxy, vehDescr.radio) self.fuelTank = VehicleFuelTank(vehDescr.fuelTank['compactDescr'], proxy, vehDescr.fuelTank) self.sellPrice = self._calcSellPrice(proxy) self.defaultSellPrice = self._calcDefaultSellPrice(proxy) self.optDevices = self._parserOptDevs(vehDescr.optionalDevices, proxy) gunAmmoLayout = [] for shell in self.gun.defaultAmmo: gunAmmoLayout += (shell.intCD, shell.defaultCount) self.shells = self._parseShells( invData.get('shells', list()), invData.get('shellsLayout', dict()).get(self.shellsLayoutIdx, gunAmmoLayout), proxy) self.eqs = self._parseEqs(invData.get('eqs') or [0, 0, 0], proxy) self.eqsLayout = self._parseEqs( invData.get('eqsLayout') or [0, 0, 0], proxy) defaultCrew = [None] * len(vehDescr.type.crewRoles) crewList = invData.get('crew', defaultCrew) self.bonuses = self._calcCrewBonuses(crewList, proxy) self.crewIndices = dict([(invID, idx) for idx, invID in enumerate(crewList)]) self.crew = self._buildCrew(crewList, proxy) self.lastCrew = invData.get('lastCrew') self.rentPackages = calcRentPackages(self, proxy) self.__customState = '' return
def construct(self): xp = self.configuration.xp dailyXP = self.configuration.dailyXP buyPrice = self.configuration.buyPrice sellPrice = self.configuration.sellPrice unlockPrice = self.configuration.unlockPrice techTreeNode = self.configuration.node minRentPrice = self.configuration.minRentPrice rentals = self.configuration.rentals futureRentals = self.configuration.futureRentals paddings = formatters.packPadding(left=-4) neededValue = 0 actionPrc = 0 if buyPrice and sellPrice: LOG_ERROR( 'You are not allowed to use buyPrice and sellPrice at the same time' ) return else: block = [] isUnlocked = self.vehicle.isUnlocked isInInventory = self.vehicle.isInInventory isNextToUnlock = False parentCD = None if techTreeNode is not None: isNextToUnlock = bool( int(techTreeNode.state) & NODE_STATE_FLAGS.NEXT_2_UNLOCK) parentCD = techTreeNode.unlockProps.parentID if xp: xpValue = self.vehicle.xp if xpValue: xPText = text_styles.expText(_int(xpValue)) icon = ICON_TEXT_FRAMES.FREE_XP if self.vehicle.isPremium else ICON_TEXT_FRAMES.XP block.append( formatters.packTextParameterWithIconBlockData( name=text_styles.main(TOOLTIPS.VEHICLE_XP), value=xPText, icon=icon, valueWidth=self._valueWidth, padding=paddings)) if dailyXP: attrs = g_itemsCache.items.stats.attributes if attrs & constants.ACCOUNT_ATTR.DAILY_MULTIPLIED_XP and self.vehicle.dailyXPFactor > 0: dailyXPText = text_styles.main( text_styles.expText('x' + _int(self.vehicle.dailyXPFactor))) block.append( formatters.packTextParameterWithIconBlockData( name=text_styles.main( TOOLTIPS.VEHICLE_DAILYXPFACTOR), value=dailyXPText, icon=ICON_TEXT_FRAMES.DOUBLE_XP_FACTOR, valueWidth=self._valueWidth, padding=paddings)) if unlockPrice: isAvailable, cost, need = getUnlockPrice( self.vehicle.intCD, parentCD) if cost > 0: neededValue = None if isAvailable and not isUnlocked and need > 0 and techTreeNode is not None: neededValue = need block.append( makePriceBlock(cost, CURRENCY_SETTINGS.UNLOCK_PRICE, neededValue, valueWidth=self._valueWidth)) if buyPrice: if self.vehicle.isRestorePossible(): price = self.vehicle.restorePrice defaultPrice = price currency = price.getCurrency() buyPriceText = price.get(currency) oldPrice = defaultPrice.get(currency) neededValue = _getNeedValue(price, currency) if isInInventory or not isInInventory and not isUnlocked and not isNextToUnlock: neededValue = None block.append( makePriceBlock(buyPriceText, CURRENCY_SETTINGS.RESTORE_PRICE, neededValue, oldPrice, actionPrc, valueWidth=self._valueWidth)) if self.vehicle.hasLimitedRestore(): timeKey, formattedTime = getTimeLeftInfo( self.vehicle.restoreInfo.getRestoreTimeLeft(), None) block.append( formatters.packTextParameterWithIconBlockData( name=text_styles.main( '#tooltips:vehicle/restoreLeft/%s' % timeKey), value=text_styles.main(formattedTime), icon=ICON_TEXT_FRAMES.ALERT if timeKey == 'hours' else ICON_TEXT_FRAMES.EMPTY, valueWidth=self._valueWidth, padding=formatters.packPadding(left=-4))) elif not (self.vehicle.isDisabledForBuy or self.vehicle.isPremiumIGR or self.vehicle.isTelecom): price = self.vehicle.buyPrice actionPrc = self.vehicle.actionPrc defaultPrice = self.vehicle.defaultPrice currency = price.getCurrency() buyPriceText = price.get(currency) oldPrice = defaultPrice.get(currency) neededValue = _getNeedValue(price, currency) if isInInventory or not isInInventory and not isUnlocked and not isNextToUnlock: neededValue = None block.append( makePriceBlock( buyPriceText, CURRENCY_SETTINGS.getBuySetting(currency), neededValue, oldPrice, 0, valueWidth=self._valueWidth)) if sellPrice and not self.vehicle.isTelecom: sellPrice = self.vehicle.sellPrice if sellPrice.isSet(Currency.GOLD): sellPriceText = text_styles.gold(_int(sellPrice.gold)) sellPriceIcon = ICON_TEXT_FRAMES.GOLD else: sellPriceText = text_styles.credits(_int( sellPrice.credits)) sellPriceIcon = ICON_TEXT_FRAMES.CREDITS block.append( formatters.packTextParameterWithIconBlockData( name=text_styles.main(TOOLTIPS.VEHICLE_SELL_PRICE), value=sellPriceText, icon=sellPriceIcon, valueWidth=self._valueWidth, padding=paddings)) if minRentPrice and not self.vehicle.isPremiumIGR: minRentPricePackage = self.vehicle.getRentPackage() if minRentPricePackage: minRentPriceValue = Money( *minRentPricePackage['rentPrice']) minDefaultRentPriceValue = Money( *minRentPricePackage['defaultRentPrice']) actionPrc = self.vehicle.getRentPackageActionPrc( minRentPricePackage['days']) currency = minRentPriceValue.getCurrency() price = minRentPriceValue.get(currency) oldPrice = minDefaultRentPriceValue.get(currency) neededValue = _getNeedValue(minRentPriceValue, currency) block.append( makePriceBlock( price, CURRENCY_SETTINGS.getRentSetting(currency), neededValue, oldPrice, actionPrc, valueWidth=self._valueWidth)) if not self.vehicle.isRented or self.vehicle.rentalIsOver: block.append( formatters.packTextParameterWithIconBlockData( name=text_styles.main( '#tooltips:vehicle/rentAvailable'), value='', icon=ICON_TEXT_FRAMES.RENTALS, valueWidth=self._valueWidth, padding=paddings)) if rentals and not self.vehicle.isPremiumIGR: if futureRentals: rentLeftKey = '#tooltips:vehicle/rentLeftFuture/%s' rentInfo = RentalInfoProvider(time=self._rentExpiryTime, isRented=True) else: rentLeftKey = '#tooltips:vehicle/rentLeft/%s' rentInfo = self.vehicle.rentInfo rentFormatter = RentLeftFormatter(rentInfo) rentLeftInfo = rentFormatter.getRentLeftStr( rentLeftKey, formatter=lambda key, countType, count, _=None: { 'left': count, 'descr': i18n.makeString(key % countType) }) if rentLeftInfo: block.append( formatters.packTextParameterWithIconBlockData( name=text_styles.main(rentLeftInfo['descr']), value=text_styles.main(rentLeftInfo['left']), icon=ICON_TEXT_FRAMES.RENTALS, valueWidth=self._valueWidth, padding=formatters.packPadding(left=-4, bottom=-16))) notEnoughMoney = neededValue > 0 hasAction = actionPrc > 0 return (block, notEnoughMoney or hasAction)