Beispiel #1
0
 def _addNode(self, nodeCD, node):
     state = node.getState()
     if not NODE_STATE.isAnnouncement(state):
         if self.__overrideResearch:
             if not NODE_STATE.inInventory(state) and not (
                     NODE_STATE.isAvailable2Unlock(state)
                     or NODE_STATE.isAvailable2Buy(state)):
                 state = NODE_STATE.addIfNot(state,
                                             NODE_STATE_FLAGS.NOT_CLICKABLE)
             if self.getRootCD() == self.__firstVehicleNode:
                 if self.__secondVehicleResearch:
                     if nodeCD == self.__secondVehicleNode:
                         return -1
                 if not NODE_STATE.inInventory(
                         state
                 ) and not NODE_STATE.isInstalled(
                         state
                 ) and nodeCD != self.__moduleNodeCD and nodeCD != self.__secondVehicleNode:
                     return -1
         item = self._items.getItemByCD(nodeCD)
         if item.level in DISABLED_TANK_LEVELS and NODE_STATE.isAvailable2Buy(
                 state):
             state = NODE_STATE.add(state,
                                    NODE_STATE_FLAGS.PURCHASE_DISABLED)
         if not NODE_STATE.isAvailable2Unlock(
                 state) and self._isLastUnlocked(nodeCD):
             state |= NODE_STATE_FLAGS.LAST_2_BUY
     if NODE_STATE.hasBlueprints(state):
         state = NODE_STATE.remove(state, NODE_STATE_FLAGS.BLUEPRINT)
     node.setState(state)
     return super(BCResearchItemsData, self)._addNode(nodeCD, node)
Beispiel #2
0
 def _addNode(self, nodeCD, node):
     state = node['state']
     if self.__overrideResearch:
         if nodeCD == self.__secondVehicleNode:
             g_bootcampGarage.setSecondVehicleNode(node)
         elif nodeCD == self.__moduleNodeCD:
             g_bootcampGarage.setModuleNode(node)
         if not NODE_STATE.inInventory(state):
             state = NODE_STATE.addIfNot(state,
                                         NODE_STATE_FLAGS.NOT_CLICKABLE)
         if self.getRootCD() == self.__firstVehicleNode:
             if self.__secondVehicleResearch:
                 if nodeCD == self.__secondVehicleNode:
                     return -1
             if not NODE_STATE.inInventory(
                     state
             ) and not NODE_STATE.isInstalled(
                     state
             ) and nodeCD != self.__moduleNodeCD and nodeCD != self.__secondVehicleNode:
                 return -1
     state = NODE_STATE.removeIfHas(state, NODE_STATE_FLAGS.ELITE)
     item = self._items.getItemByCD(nodeCD)
     if item.level in DISABLED_TANK_LEVELS and NODE_STATE.isAvailable2Buy(
             state):
         state = NODE_STATE.add(state, NODE_STATE_FLAGS.PURCHASE_DISABLED)
     node['state'] = state
     return super(BCResearchItemsData, self)._addNode(nodeCD, node)
Beispiel #3
0
    def getNationTreeData(self, nationName):
        data = super(BCTechTree,
                     self).getNationTreeData(NATION_NAMES[g_bootcamp.nation])
        dataNodes = data.get('nodes', None)
        nationData = g_bootcamp.getNationData()
        if dataNodes is not None:
            dataNodes = [
                node for node in dataNodes
                if not NODE_STATE.isPremium(node['state'])
            ]
            for node in dataNodes:
                if 'vehCompareTreeNodeData' in node:
                    node['vehCompareTreeNodeData']['modeAvailable'] = False
                nodeState = node['state']
                if not NODE_STATE.inInventory(nodeState):
                    isUnlocked = NODE_STATE.isUnlocked(nodeState)
                    isVehicleSecond = node['id'] == nationData[
                        'vehicle_second']
                    if not (isVehicleSecond and isUnlocked):
                        node['state'] = NODE_STATE_FLAGS.LOCKED
                    if isUnlocked:
                        node['state'] |= NODE_STATE_FLAGS.PURCHASE_DISABLED
                    if isVehicleSecond:
                        node['state'] |= NODE_STATE_FLAGS.NEXT_2_UNLOCK
                    if NODE_STATE.isAnnouncement(nodeState):
                        node['state'] |= NODE_STATE_FLAGS.ANNOUNCEMENT
                        node['state'] |= NODE_STATE_FLAGS.NOT_CLICKABLE

            data['nodes'] = dataNodes
        return data
Beispiel #4
0
 def __getDiscountBannerStr(self, root, rootNode):
     htmlStr = ''
     nodeState = rootNode.getState()
     if NODE_STATE.canTradeIn(
             nodeState
     ) and self.__tradeIn.tradeOffSelectedApplicableForLevel(root.level):
         return htmlStr
     if NODE_STATE.isRestoreAvailable(nodeState):
         restoreDueDate = getDueDateOrTimeStr(
             rootNode.getRestoreFinishTime())
         if restoreDueDate:
             return _BANNER_GETTERS[States.RESTORE](restoreDueDate)
     if not root.isUnlocked and not root.isCollectible:
         unlockDiscount = self._itemsCache.items.blueprints.getBlueprintDiscount(
             root.intCD, root.level)
         if unlockDiscount > 0:
             return _BANNER_GETTERS[States.UNLOCKED](unlockDiscount)
     if root.isRented:
         discount = rootNode.getActionDiscount()
         if discount != 0:
             return _BANNER_GETTERS[States.RENT](discount)
     if not NODE_STATE.inInventory(nodeState) and NODE_STATE.isActionVehicle(
             nodeState) or NODE_STATE.isCollectibleActionVehicle(nodeState):
         discount, isPersonalDiscount = rootNode.getActionDetails()
         if discount != 0:
             actionDueDate = '' if isPersonalDiscount else getDueDateOrTimeStr(
                 rootNode.getActionFinishTime(), isShortDateFormat=True)
             return _BANNER_GETTERS[States.ACTION](discount, actionDueDate)
     return htmlStr
 def _generateOptions(self, ctx=None):
     vehicle = g_itemsCache.items.getItemByCD(self._nodeCD)
     options = [
         self._makeItem(VEHICLE.INFO, MENU.CONTEXTMENU_VEHICLEINFOEX),
         self._makeItem(
             VEHICLE.STATS, MENU.CONTEXTMENU_SHOWVEHICLESTATISTICS,
             {'enabled': NODE_STATE.isWasInBattle(self._nodeState)}),
         self._makeSeparator(),
         self._makeItem(
             VEHICLE.UNLOCK, MENU.CONTEXTMENU_UNLOCK, {
                 'enabled':
                 NODE_STATE.isAvailable2Unlock(self._nodeState)
                 and not NODE_STATE.isPremium(self._nodeState)
             })
     ]
     if not vehicle.isPremiumIGR:
         options.extend([
             self._makeItem(
                 VEHICLE.BUY, MENU.CONTEXTMENU_BUY,
                 {'enabled': NODE_STATE.isAvailable2Buy(self._nodeState)}),
             self._makeItem(
                 VEHICLE.SELL, MENU.CONTEXTMENU_VEHICLEREMOVE
                 if vehicle.isRented else MENU.CONTEXTMENU_SELL,
                 {'enabled': NODE_STATE.isAvailable2Sell(self._nodeState)}),
             self._makeSeparator(),
             self._makeItem(
                 VEHICLE.SELECT, MENU.CONTEXTMENU_SELECTVEHICLEINHANGAR, {
                     'enabled':
                     NODE_STATE.inInventory(self._nodeState)
                     and NODE_STATE.isVehicleCanBeChanged(self._nodeState)
                 })
         ])
     return options
 def _addTopNode(self, nodeCD, node):
     state = node.getState()
     if self.__overrideResearch:
         if not NODE_STATE.inInventory(state):
             state = NODE_STATE.addIfNot(state, NODE_STATE_FLAGS.NOT_CLICKABLE)
     if nodeCD != self.__firstVehicleNode:
         state = NODE_STATE.addIfNot(state, NODE_STATE_FLAGS.LOCKED)
     node.setState(state)
     return super(BCResearchItemsData, self)._addTopNode(nodeCD, node)
 def _generateOptions(self, ctx=None):
     vehicle = self.itemsCache.items.getItemByCD(self._nodeCD)
     options = [
         self._makeItem(VEHICLE.INFO, MENU.CONTEXTMENU_VEHICLEINFOEX)
     ]
     if vehicle.isPreviewAllowed():
         options.append(
             self._makeItem(VEHICLE.PREVIEW,
                            MENU.CONTEXTMENU_SHOWVEHICLEPREVIEW,
                            {'enabled': self.hangarSpace.spaceInited}))
     if NODE_STATE.isWasInBattle(self._nodeState):
         options.append(
             self._makeItem(VEHICLE.STATS,
                            MENU.CONTEXTMENU_SHOWVEHICLESTATISTICS))
     self._manageVehCompareItem(options, vehicle)
     options.append(self._makeSeparator())
     if vehicle.isUnlocked:
         if not vehicle.isPremiumIGR and (not vehicle.isInInventory
                                          or vehicle.isRented):
             if vehicle.isRestoreAvailable():
                 label = MENU.CONTEXTMENU_RESTORE
             elif vehicle.canTradeIn:
                 label = MENU.CONTEXTMENU_BUYORTRADEIN
             else:
                 label = MENU.CONTEXTMENU_BUY
             options.append(
                 self._makeItem(VEHICLE.BUY, label, {
                     'enabled':
                     NODE_STATE.isAvailable2Buy(self._nodeState)
                 }))
     else:
         options.append(
             self._makeItem(
                 VEHICLE.UNLOCK, MENU.CONTEXTMENU_UNLOCK, {
                     'enabled':
                     NODE_STATE.isAvailable2Unlock(self._nodeState)
                     and not NODE_STATE.isPremium(self._nodeState)
                 }))
     if not vehicle.isPremiumIGR:
         isAvailable2SellOrRemove = NODE_STATE.isAvailable2Sell(
             self._nodeState)
         if isAvailable2SellOrRemove:
             options.append(
                 self._makeItem(
                     VEHICLE.SELL, MENU.CONTEXTMENU_VEHICLEREMOVE
                     if vehicle.isRented else MENU.CONTEXTMENU_SELL,
                     {'enabled': isAvailable2SellOrRemove}))
     options.extend([
         self._makeSeparator(),
         self._makeItem(
             VEHICLE.SELECT, MENU.CONTEXTMENU_SELECTVEHICLEINHANGAR, {
                 'enabled': (NODE_STATE.inInventory(self._nodeState)
                             or NODE_STATE.isRentalOver(self._nodeState))
                 and NODE_STATE.isVehicleCanBeChanged(self._nodeState)
             })
     ])
     return options
 def _generateOptions(self, ctx = None):
     options = [self._makeItem(MODULE.INFO, MENU.contextmenu(MODULE.INFO)), self._makeSeparator(), self._makeItem(MODULE.UNLOCK, MENU.contextmenu(MODULE.UNLOCK), {'enabled': NODE_STATE.isAvailable2Unlock(self._nodeState)})]
     if NODE_STATE.isUnlocked(self._nodeState):
         if NODE_STATE.inInventory(self._nodeState) or NODE_STATE.isInstalled(self._nodeState):
             options.extend([self._makeItem(MODULE.EQUIP, MENU.contextmenu(MODULE.EQUIP), {'enabled': self._isAvailable2Install()}), self._makeSeparator(), self._makeItem(MODULE.SELL, MENU.CONTEXTMENU_SELLFROMINVENTORY, {'enabled': not NODE_STATE.isInstalled(self._nodeState)})])
         else:
             options.extend([self._makeItem(MODULE.BUY_AND_EQUIP, MENU.CONTEXTMENU_BUYANDEQUIP, {'enabled': self._isAvailable2Buy()}), self._makeSeparator(), self._makeItem(MODULE.SELL, MENU.CONTEXTMENU_SELLFROMINVENTORY, {'enabled': NODE_STATE.isAvailable2Sell(self._nodeState)})])
     else:
         options.extend([self._makeItem(MODULE.BUY_AND_EQUIP, MENU.CONTEXTMENU_BUYANDEQUIP, {'enabled': False}), self._makeSeparator(), self._makeItem(MODULE.SELL, MENU.CONTEXTMENU_SELLFROMINVENTORY, {'enabled': False})])
     return options
 def _generateOptions(self, ctx = None):
     options = [self._makeItem(MODULE.INFO, MENU.contextmenu(MODULE.INFO)), self._makeSeparator(), self._makeItem(MODULE.UNLOCK, MENU.contextmenu(MODULE.UNLOCK), {'enabled': NODE_STATE.isAvailable2Unlock(self._nodeState)})]
     if NODE_STATE.isUnlocked(self._nodeState):
         if NODE_STATE.inInventory(self._nodeState) or NODE_STATE.isInstalled(self._nodeState):
             options.extend([self._makeItem(MODULE.EQUIP, MENU.contextmenu(MODULE.EQUIP), {'enabled': self._isAvailable2Install()}), self._makeSeparator(), self._makeItem(MODULE.SELL, MENU.CONTEXTMENU_SELLFROMINVENTORY, {'enabled': not NODE_STATE.isInstalled(self._nodeState)})])
         else:
             options.extend([self._makeItem(MODULE.BUY_AND_EQUIP, MENU.CONTEXTMENU_BUYANDEQUIP, {'enabled': self._isAvailable2Buy()}), self._makeSeparator(), self._makeItem(MODULE.SELL, MENU.CONTEXTMENU_SELLFROMINVENTORY, {'enabled': NODE_STATE.isAvailable2Sell(self._nodeState)})])
     else:
         options.extend([self._makeItem(MODULE.BUY_AND_EQUIP, MENU.CONTEXTMENU_BUYANDEQUIP, {'enabled': False}), self._makeSeparator(), self._makeItem(MODULE.SELL, MENU.CONTEXTMENU_SELLFROMINVENTORY, {'enabled': False})])
     return options
Beispiel #10
0
 def _addTopNode(self, nodeCD, node):
     state = node['state']
     if self.__overrideResearch:
         if not NODE_STATE.inInventory(state):
             state = NODE_STATE.addIfNot(state,
                                         NODE_STATE_FLAGS.NOT_CLICKABLE)
             state = NODE_STATE.removeIfHas(state, NODE_STATE_FLAGS.ELITE)
     if nodeCD != self.__firstVehicleNode:
         state = NODE_STATE.addIfNot(state, NODE_STATE_FLAGS.LOCKED)
     node['state'] = state
     return super(BCResearchItemsData, self)._addTopNode(nodeCD, node)
Beispiel #11
0
 def __getMainButtonLabel(self, rootItem, rootNode):
     if NODE_STATE.isCollectible(rootNode.getState()):
         btnLabel = R.strings.menu.research.labels.button.toCollection()
     elif not rootItem.isUnlocked:
         btnLabel = R.strings.menu.unlocks.unlockButton()
     elif NODE_STATE.isRestoreAvailable(rootNode.getState()):
         btnLabel = R.strings.menu.research.labels.button.restore()
     elif NODE_STATE.inInventory(rootNode.getState(
     )) and not rootItem.isRented or rootItem.isHidden:
         btnLabel = R.strings.menu.research.labels.button.showInHangar()
     elif NODE_STATE.canTradeIn(rootNode.getState(
     )) and self.__tradeIn.getActiveTradeOffVehicle() is not None:
         btnLabel = R.strings.menu.research.labels.button.trade_in()
     else:
         btnLabel = R.strings.menu.research.labels.button.buy()
     return backport.text(btnLabel)
Beispiel #12
0
    def getNationTreeData(self, nationName):
        data = super(BCTechTree,
                     self).getNationTreeData(NATION_NAMES[g_bootcamp.nation])
        dataNodes = data.get('nodes', None)
        if dataNodes is not None:
            for node in dataNodes:
                node['state'] = NODE_STATE.removeIfHas(node['state'],
                                                       NODE_STATE_FLAGS.ELITE)
                if 'vehCompareTreeNodeData' in node:
                    node['vehCompareTreeNodeData']['modeAvailable'] = False
                if not NODE_STATE.inInventory(node['state']):
                    node['state'] = NODE_STATE_FLAGS.LOCKED

        data['nodes'][0]['displayInfo']['position'] = [16, 90]
        data['nodes'][0]['displayInfo']['lines'][0]['outPin'] = [144, 108]
        return data
Beispiel #13
0
    def getNationTreeData(self, nationName):
        data = super(BCTechTree, self).getNationTreeData(NATION_NAMES[g_bootcamp.nation])
        dataNodes = data.get('nodes', None)
        if dataNodes is not None:
            for node in dataNodes:
                if 'vehCompareTreeNodeData' in node:
                    node['vehCompareTreeNodeData']['modeAvailable'] = False
                nodeState = node['state']
                if not NODE_STATE.inInventory(nodeState) and not NODE_STATE.isPremium(nodeState):
                    node['state'] = NODE_STATE_FLAGS.LOCKED
                    if NODE_STATE.isAnnouncement(nodeState):
                        node['state'] |= NODE_STATE_FLAGS.ANNOUNCEMENT
                        node['state'] |= NODE_STATE_FLAGS.NOT_CLICKABLE

        data['nodes'][0]['displayInfo']['position'] = [16, 90]
        data['nodes'][0]['displayInfo']['lines'][0]['outPin'] = [144, 108]
        return data
 def _generateOptions(self, ctx=None):
     vehicle = g_itemsCache.items.getItemByCD(self._nodeCD)
     options = [
         self._makeItem(VEHICLE.INFO, MENU.CONTEXTMENU_VEHICLEINFOEX),
         self._makeItem(
             VEHICLE.STATS,
             MENU.CONTEXTMENU_SHOWVEHICLESTATISTICS,
             {"enabled": NODE_STATE.isWasInBattle(self._nodeState)},
         ),
         self._makeSeparator(),
         self._makeItem(
             VEHICLE.UNLOCK,
             MENU.CONTEXTMENU_UNLOCK,
             {
                 "enabled": NODE_STATE.isAvailable2Unlock(self._nodeState)
                 and not NODE_STATE.isPremium(self._nodeState)
             },
         ),
     ]
     if not vehicle.isPremiumIGR:
         options.extend(
             [
                 self._makeItem(
                     VEHICLE.BUY, MENU.CONTEXTMENU_BUY, {"enabled": NODE_STATE.isAvailable2Buy(self._nodeState)}
                 ),
                 self._makeItem(
                     VEHICLE.SELL,
                     MENU.CONTEXTMENU_VEHICLEREMOVE if vehicle.isRented else MENU.CONTEXTMENU_SELL,
                     {"enabled": NODE_STATE.isAvailable2Sell(self._nodeState)},
                 ),
                 self._makeSeparator(),
                 self._makeItem(
                     VEHICLE.SELECT,
                     MENU.CONTEXTMENU_SELECTVEHICLEINHANGAR,
                     {
                         "enabled": NODE_STATE.inInventory(self._nodeState)
                         and NODE_STATE.isVehicleCanBeChanged(self._nodeState)
                     },
                 ),
             ]
         )
     return options
 def _isAvailable2Install(self):
     return not NODE_STATE.isInstalled(
         self._nodeState) and NODE_STATE.inInventory(
             self._nodeState) and self._canInstallItems()
 def _isAvailable2Install(self):
     return not NODE_STATE.isInstalled(self._nodeState) and NODE_STATE.inInventory(self._nodeState) and self._canInstallItems()
Beispiel #17
0
 def _getRootData(self):
     root = self.vehicle
     rootNode = self._data.getRootNode()
     nodeState = rootNode.getState()
     bpfProps = rootNode.getBpfProps()
     isNext2Unlock = NODE_STATE.isNext2Unlock(nodeState)
     isPremium = NODE_STATE.isCollectibleActionVehicle(
         nodeState) or NODE_STATE.isPremium(nodeState)
     comparisonState, comparisonTooltip = resolveStateTooltip(
         self._cmpBasket,
         root,
         enabledTooltip='',
         fullTooltip=TOOLTIPS.RESEARCHPAGE_VEHICLE_BUTTON_COMPARE_DISABLED)
     tankTier = int2roman(root.level)
     tankHasNationGroup = (root.isInInventory
                           or root.isRented) and root.hasNationGroup
     isNationChangeAvailable = root.isNationChangeAvailable
     isShownNationChangeTooltip = tankHasNationGroup and not isNationChangeAvailable
     result = {
         'vehicleTitle': {
             'intCD': self._data.getRootCD(),
             'tankTierStr': text_styles.grandTitle(tankTier),
             'tankNameStr': text_styles.grandTitle(root.userName),
             'tankTierStrSmall': text_styles.promoTitle(tankTier),
             'tankNameStrSmall': text_styles.promoTitle(root.userName),
             'typeIconPath': getTypeBigIconPath(root.type, root.isElite),
             'isElite': root.isElite,
             'statusStr': self.__getRootStatusStr(root),
             'roleText': getRoleTextWithIcon(root.role, root.roleLabel)
         },
         'vehicleButton': {
             'shopIconPath':
             RES_SHOP.getVehicleIcon(STORE_CONSTANTS.ICON_SIZE_MEDIUM,
                                     root.name.split(':')[1]),
             'compareBtnVisible':
             not self.__bootcamp.isInBootcamp(),
             'compareBtnEnabled':
             comparisonState,
             'compareBtnLabel':
             backport.text(
                 R.strings.menu.research.labels.button.addToCompare()),
             'compareBtnTooltip':
             comparisonTooltip,
             'previewBtnEnabled':
             root.isPreviewAllowed(),
             'previewBtnLabel':
             backport.text(
                 R.strings.menu.research.labels.button.vehiclePreview()),
             'isPremium':
             isPremium,
             'vehicleId':
             self._data.getRootCD(),
             'vehicleState':
             nodeState,
             'isInInventory':
             NODE_STATE.inInventory(nodeState),
             'previewAlias':
             VIEW_ALIAS.LOBBY_RESEARCH,
             'cmHandlerType':
             CONTEXT_MENU_HANDLER_TYPE.RESEARCH_VEHICLE
         },
         'isInteractive':
         self.__getIsInteractive(root, rootNode),
         'buttonLabel':
         self.__getMainButtonLabel(root, rootNode),
         'blueprintLabel':
         self.__getResearchPageBlueprintLabel(rootNode),
         'blueprintProgress':
         rootNode.getBlueprintProgress(),
         'blueprintCanConvert':
         bpfProps.canConvert if bpfProps is not None else False,
         'bpbGlowEnabled':
         isNext2Unlock,
         'itemPrices':
         rootNode.getItemPrices(),
         'discountStr':
         self.__getDiscountBannerStr(root, rootNode),
         'rentBtnLabel':
         self.__getRentButtonLabel(rootNode),
         'changeNationBtnVisibility':
         tankHasNationGroup,
         'isTankNationChangeAvailable':
         isNationChangeAvailable,
         'nationChangeIsNew':
         not AccountSettings.getSettings(NATION_CHANGE_VIEWED),
         'nationChangeTooltip':
         self.__getNationChangeTooltip(root)
         if isShownNationChangeTooltip else ''
     }
     return result
 def _generateOptions(self, ctx = None):
     vehicle = g_itemsCache.items.getItemByCD(self._nodeCD)
     options = [self._makeItem(VEHICLE.INFO, MENU.CONTEXTMENU_VEHICLEINFOEX)]
     if vehicle.isPreviewAllowed():
         options.append(self._makeItem(VEHICLE.PREVIEW, MENU.CONTEXTMENU_SHOWVEHICLEPREVIEW))
     if NODE_STATE.isWasInBattle(self._nodeState):
         options.append(self._makeItem(VEHICLE.STATS, MENU.CONTEXTMENU_SHOWVEHICLESTATISTICS))
     options.append(self._makeSeparator())
     if vehicle.isUnlocked:
         if not vehicle.isPremiumIGR and (not vehicle.isInInventory or vehicle.isRented):
             options.append(self._makeItem(VEHICLE.BUY, MENU.CONTEXTMENU_BUY, {'enabled': NODE_STATE.isAvailable2Buy(self._nodeState)}))
     else:
         options.append(self._makeItem(VEHICLE.UNLOCK, MENU.CONTEXTMENU_UNLOCK, {'enabled': NODE_STATE.isAvailable2Unlock(self._nodeState) and not NODE_STATE.isPremium(self._nodeState)}))
     if not vehicle.isPremiumIGR:
         isAvailable2SellOrRemove = NODE_STATE.isAvailable2Sell(self._nodeState)
         if isAvailable2SellOrRemove:
             options.append(self._makeItem(VEHICLE.SELL, MENU.CONTEXTMENU_VEHICLEREMOVE if vehicle.isRented else MENU.CONTEXTMENU_SELL, {'enabled': isAvailable2SellOrRemove}))
     options.extend([self._makeSeparator(), self._makeItem(VEHICLE.SELECT, MENU.CONTEXTMENU_SELECTVEHICLEINHANGAR, {'enabled': (NODE_STATE.inInventory(self._nodeState) or NODE_STATE.isRentalOver(self._nodeState)) and NODE_STATE.isVehicleCanBeChanged(self._nodeState)})])
     return options