Example #1
0
class ResearchView(LobbySubView, ResearchViewMeta):

    def __init__(self, data):
        super(ResearchView, self).__init__(backAlpha=0)
        self._data = data
        self._canBeClosed = True
        self._listener = TTListenerDecorator()

    def redraw(self):
        raise NotImplementedError, 'Must be overridden in subclass'

    def showSystemMessage(self, typeString, message):
        msgType = SystemMessages.SM_TYPE.lookup(typeString)
        if msgType is None:
            msgType = SystemMessages.SM_TYPE.Error
        SystemMessages.pushMessage(message, msgType)
        return

    def invalidateCredits(self):
        result = self._data.invalidateCredits()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.ENOUGH_MONEY, result)

    def invalidateGold(self):
        result = self._data.invalidateGold()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.ENOUGH_MONEY, result)
        self.invalidateFreeXP()
        self.invalidateCredits()

    def invalidateFreeXP(self):
        result = self._data.invalidateFreeXP()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.ENOUGH_XP, result)

    def invalidateElites(self, elites):
        result = self._data.invalidateElites(elites)
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.ELITE, result)

    def invalidateVTypeXP(self, xps):
        self.as_setVehicleTypeXPS(xps.items())
        result = self._data.invalidateVTypeXP()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.ENOUGH_XP, result)

    def invalidateUnlocks(self, unlocks):
        next2Unlock, unlocked = self._data.invalidateUnlocks(unlocks)
        if len(unlocked):
            LOG_DEBUG('unlocked', unlocked)
            self.as_setNodesStatesS(NODE_STATE.UNLOCKED, unlocked)
        if len(next2Unlock):
            LOG_DEBUG('next2Unlock', next2Unlock)
            self.as_setNext2UnlockS(next2Unlock)

    def invalidateInventory(self, data):
        result = self._data.invalidateInventory(data)
        if len(result):
            self.as_setInventoryItemsS(result)

    def invalidatePrbState(self):
        result = self._data.invalidatePrbState()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.VEHICLE_CAN_BE_CHANGED, result)

    def invalidateVehLocks(self, locks):
        raise NotImplementedError, 'Must be overridden in subclass'

    def invalidateWalletStatus(self, status):
        raise NotImplementedError, 'Must be overridden in subclass'

    def invalidateRent(self, vehicles):
        raise NotImplementedError, 'Must be overridden in subclass'

    def request4SelectInHangar(self, itemCD):
        shared_events.selectVehicleInHangar(itemCD)

    def request4Info(self, itemCD, rootCD):
        vehicle = g_itemsCache.items.getItemByCD(int(rootCD))
        if vehicle:
            shared_events.showModuleInfo(int(itemCD), vehicle.descriptor)

    def _populate(self):
        super(ResearchView, self)._populate()
        self._listener.startListen(self)

    def _dispose(self):
        self._listener.stopListen()
        super(ResearchView, self)._dispose()
        if self._data is not None:
            self._data.clear(full=True)
            self._data = None
        return
Example #2
0
 def __init__(self, data):
     super(ResearchView, self).__init__()
     self._data = data
     self._canBeClosed = True
     self._listener = TTListenerDecorator()
Example #3
0
 def __init__(self, data):
     super(ResearchView, self).__init__(backAlpha=0)
     self._data = data
     self._canBeClosed = True
     self._listener = TTListenerDecorator()
Example #4
0
class ResearchView(LobbySubView, ResearchViewMeta):
    __sound_env__ = LobbySubViewEnv
    _COMMON_SOUND_SPACE = TECHTREE_SOUND_SPACE
    _itemsCache = dependency.descriptor(IItemsCache)
    _wallet = dependency.descriptor(IWalletController)
    _cmpBasket = dependency.descriptor(IVehicleComparisonBasket)
    _lobbyContext = dependency.descriptor(ILobbyContext)

    def __init__(self, data):
        super(ResearchView, self).__init__()
        self._data = data
        self._canBeClosed = True
        self._listener = TTListenerDecorator()

    def goToBlueprintView(self, vehicleCD):
        shared_events.showBlueprintView(vehicleCD, self._createExitEvent())

    def goToNationChangeView(self, vehicleCD):
        shared_events.showChangeVehicleNationDialog(vehicleCD)

    def goToVehicleCollection(self, nationName):
        nationID = nations.INDICES.get(nationName, nations.NONE_INDEX)
        shared_events.showCollectibleVehicles(nationID)

    def redraw(self):
        raise NotImplementedError('Must be overridden in subclass')

    def showSystemMessage(self, typeString, message):
        msgType = SystemMessages.SM_TYPE.lookup(typeString)
        if msgType is None:
            msgType = SystemMessages.SM_TYPE.Error
        SystemMessages.pushMessage(message, msgType)
        return

    def invalidateCredits(self):
        result = self._data.invalidateCredits()
        if result:
            self.as_setNodesStatesS(NODE_STATE_FLAGS.ENOUGH_MONEY, result)

    def invalidateGold(self):
        result = self._data.invalidateGold()
        if result:
            self.as_setNodesStatesS(NODE_STATE_FLAGS.ENOUGH_MONEY, result)
        self.invalidateFreeXP()
        self.invalidateCredits()

    def invalidateFreeXP(self):
        result = self._data.invalidateFreeXP()
        if result:
            self.as_setNodesStatesS(NODE_STATE_FLAGS.ENOUGH_XP, result)

    def invalidateElites(self, elites):
        result = self._data.invalidateElites(elites)
        if result:
            self.as_setNodesStatesS(NODE_STATE_FLAGS.ELITE, result)

    def invalidateVTypeXP(self, xps):
        self.as_setVehicleTypeXPS(xps.items())
        result = self._data.invalidateVTypeXP()
        if result:
            self.as_setNodesStatesS(NODE_STATE_FLAGS.ENOUGH_XP, result)

    def invalidateUnlocks(self, unlocks):
        next2Unlock, unlocked, prevUnlocked = self._data.invalidateUnlocks(unlocks)
        if unlocked:
            _logger.debug('unlocked: %s', ' '.join((str(intCD) for intCD in unlocked)))
            self._updateUnlockedItems(unlocked)
        if next2Unlock:
            _logger.debug('next2Unlock: %s', ' '.join((str(intCD) for intCD in next2Unlock)))
            self.as_setNext2UnlockS(next2Unlock)
        if prevUnlocked:
            _logger.info('previouslyUnlocked %s', prevUnlocked)
            self.as_setNodesStatesS(NODE_STATE_FLAGS.LAST_2_BUY, prevUnlocked)

    def invalidateInventory(self, data):
        result = self._data.invalidateInventory(data)
        if result:
            self.as_setInventoryItemsS(result)

    def invalidateBlueprints(self, blueprints):
        raise NotImplementedError('Must be overridden in subclass')

    def invalidatePrbState(self):
        result = self._data.invalidatePrbState()
        if result:
            self.as_setNodesStatesS(NODE_STATE_FLAGS.VEHICLE_CAN_BE_CHANGED, result)

    def invalidateDiscounts(self, data):
        if self._data.invalidateDiscounts(data):
            self._data.invalidateCredits()
            self._data.invalidateGold()
            self.redraw()

    def invalidateVehLocks(self, locks):
        raise NotImplementedError('Must be overridden in subclass')

    def invalidateWalletStatus(self, status):
        raise NotImplementedError('Must be overridden in subclass')

    def invalidateRent(self, vehicles):
        raise NotImplementedError('Must be overridden in subclass')

    def invalidateRestore(self, vehicles):
        raise NotImplementedError('Must be overridden in subclass')

    def request4Info(self, itemCD, rootCD):
        vehicle = self._itemsCache.items.getItemByCD(int(rootCD))
        if vehicle:
            shared_events.showModuleInfo(int(itemCD), vehicle.descriptor)

    def invalidateVehCompare(self):
        getVehicle = self._itemsCache.items.getItemByCD

        def getNodeData(vehCD):
            return getTreeNodeCompareData(getVehicle(vehCD))

        self.as_setNodeVehCompareDataS([ (v, getNodeData(v)) for v in self._data.getVehicleCDs() ])

    def invalidateVehicleCollectorState(self):
        result = self._data.invalidateVehicleCollectorState()
        if result:
            self.as_setNodesStatesS(NODE_STATE_FLAGS.PURCHASE_DISABLED, result)

    def invalidateVehPostProgression(self):
        pass

    def _updateUnlockedItems(self, unlocked):
        self.as_setNodesStatesS(NODE_STATE_FLAGS.UNLOCKED, unlocked)

    def _createExitEvent(self):
        return None

    def _populate(self):
        super(ResearchView, self)._populate()
        self._listener.startListen(self)

    def _dispose(self):
        self._listener.stopListen()
        super(ResearchView, self)._dispose()
        if self._data is not None:
            self._data.clear(full=True)
            self._data = None
        return
Example #5
0
class ResearchView(LobbySubView, ResearchViewMeta):
    """
    Common interface to items (vehicle, module) in window of research modules, nation tree:
    - unlocks item;
    - buy vehicles;
    - shows messages in service channel.
    - refreshes data by server diff.
    """
    __background_alpha__ = 0.0
    itemsCache = dependency.descriptor(IItemsCache)
    wallet = dependency.descriptor(IWalletController)
    cmpBasket = dependency.descriptor(IVehicleComparisonBasket)

    def __init__(self, data):
        super(ResearchView, self).__init__()
        self._data = data
        self._canBeClosed = True
        self._listener = TTListenerDecorator()

    def redraw(self):
        """
        Redraws all nodes in view.
        """
        raise NotImplementedError('Must be overridden in subclass')

    def showSystemMessage(self, typeString, message):
        """
        Shows system message.
        :param typeString: string containing 'Error', 'Warning' or 'Information'.
        :param message: text of message.
        """
        msgType = SystemMessages.SM_TYPE.lookup(typeString)
        if msgType is None:
            msgType = SystemMessages.SM_TYPE.Error
        SystemMessages.pushMessage(message, msgType)
        return

    def invalidateCredits(self):
        """
        Value of credits updated.
        """
        result = self._data.invalidateCredits()
        if result:
            self.as_setNodesStatesS(NODE_STATE_FLAGS.ENOUGH_MONEY, result)

    def invalidateGold(self):
        """
        Value of gold updated.
        """
        result = self._data.invalidateGold()
        if result:
            self.as_setNodesStatesS(NODE_STATE_FLAGS.ENOUGH_MONEY, result)
        self.invalidateFreeXP()
        self.invalidateCredits()

    def invalidateFreeXP(self):
        """
        Value of free experience updated.
        """
        result = self._data.invalidateFreeXP()
        if result:
            self.as_setNodesStatesS(NODE_STATE_FLAGS.ENOUGH_XP, result)

    def invalidateElites(self, elites):
        """
        Set of elite vehicles updated.
        :param elites: set([<compactDescr>, ...])
        """
        result = self._data.invalidateElites(elites)
        if result:
            self.as_setNodesStatesS(NODE_STATE_FLAGS.ELITE, result)

    def invalidateVTypeXP(self, xps):
        """
        Dict of vehicles experience updated.
        :param xps: dict(<int:vehicle compact descriptor> : <XP>, ...)
        """
        self.as_setVehicleTypeXPS(xps.items())
        result = self._data.invalidateVTypeXP()
        if result:
            self.as_setNodesStatesS(NODE_STATE_FLAGS.ENOUGH_XP, result)

    def invalidateUnlocks(self, unlocks):
        """
        Set of unlocks items updated.
        :param unlocks: set([<int:compactDescr>, ...])
        """
        next2Unlock, unlocked = self._data.invalidateUnlocks(unlocks)
        if unlocked:
            LOG_DEBUG('unlocked', unlocked)
            self.as_setNodesStatesS(NODE_STATE_FLAGS.UNLOCKED, unlocked)
        if next2Unlock:
            LOG_DEBUG('next2Unlock', next2Unlock)
            self.as_setNext2UnlockS(next2Unlock)

    def invalidateInventory(self, data):
        """
        Inventory items are updated, invalidate information about inventory on current page.
        :param data: set of int-type compact descriptors for  modified items (vehicles/modules).
        """
        result = self._data.invalidateInventory(data)
        if result:
            self.as_setInventoryItemsS(result)

    def invalidatePrbState(self):
        """
        Player's state has been changed in prebattle, unit, prequeue.
        """
        result = self._data.invalidatePrbState()
        if result:
            self.as_setNodesStatesS(NODE_STATE_FLAGS.VEHICLE_CAN_BE_CHANGED,
                                    result)

    def invalidateDiscounts(self, data):
        """
        Updates discount prices of nodes
        """
        if self._data.invalidateDiscounts(data):
            self._data.invalidateCredits()
            self._data.invalidateGold()
            self.redraw()

    def invalidateVehLocks(self, locks):
        """
        Updates lock status of vehicles (in inventory) that received new value.
        :param locks: dict(<inventory ID> : <value of lock>, ...), see AccountCommands.LOCK_REASON.
        """
        raise NotImplementedError('Must be overridden in subclass')

    def invalidateWalletStatus(self, status):
        raise NotImplementedError('Must be overridden in subclass')

    def invalidateRent(self, vehicles):
        raise NotImplementedError('Must be overridden in subclass')

    def invalidateRestore(self, vehicles):
        raise NotImplementedError('Must be overridden in subclass')

    def request4Info(self, itemCD, rootCD):
        """
        Overridden method of the class ResearchViewMeta.request4Info
        """
        vehicle = self.itemsCache.items.getItemByCD(int(rootCD))
        if vehicle:
            shared_events.showModuleInfo(int(itemCD), vehicle.descriptor)

    def invalidateVehCompare(self):
        """
        Updates compare add icon status of nodes if change status of comparison basket fullness.
        """
        getVehicle = self.itemsCache.items.getItemByCD

        def getNodeData(vehCD):
            return getTreeNodeCompareData(getVehicle(vehCD))

        self.as_setNodeVehCompareDataS([(v, getNodeData(v))
                                        for v in self._data.getVehicleCDs()])

    def _populate(self):
        super(ResearchView, self)._populate()
        self._listener.startListen(self)

    def _dispose(self):
        self._listener.stopListen()
        super(ResearchView, self)._dispose()
        if self._data is not None:
            self._data.clear(full=True)
            self._data = None
        return
Example #6
0
class ResearchView(LobbySubView, ResearchViewMeta):
    __background_alpha__ = 0.0

    def __init__(self, data):
        super(ResearchView, self).__init__()
        self._data = data
        self._canBeClosed = True
        self._listener = TTListenerDecorator()

    def redraw(self):
        raise NotImplementedError('Must be overridden in subclass')

    def showSystemMessage(self, typeString, message):
        msgType = SystemMessages.SM_TYPE.lookup(typeString)
        if msgType is None:
            msgType = SystemMessages.SM_TYPE.Error
        SystemMessages.pushMessage(message, msgType)
        return

    def invalidateCredits(self):
        result = self._data.invalidateCredits()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.ENOUGH_MONEY, result)

    def invalidateGold(self):
        result = self._data.invalidateGold()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.ENOUGH_MONEY, result)
        self.invalidateFreeXP()
        self.invalidateCredits()

    def invalidateFreeXP(self):
        result = self._data.invalidateFreeXP()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.ENOUGH_XP, result)

    def invalidateElites(self, elites):
        result = self._data.invalidateElites(elites)
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.ELITE, result)

    def invalidateVTypeXP(self, xps):
        self.as_setVehicleTypeXPS(xps.items())
        result = self._data.invalidateVTypeXP()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.ENOUGH_XP, result)

    def invalidateUnlocks(self, unlocks):
        next2Unlock, unlocked = self._data.invalidateUnlocks(unlocks)
        if len(unlocked):
            LOG_DEBUG('unlocked', unlocked)
            self.as_setNodesStatesS(NODE_STATE.UNLOCKED, unlocked)
        if len(next2Unlock):
            LOG_DEBUG('next2Unlock', next2Unlock)
            self.as_setNext2UnlockS(next2Unlock)

    def invalidateInventory(self, data):
        result = self._data.invalidateInventory(data)
        if len(result):
            self.as_setInventoryItemsS(result)

    def invalidatePrbState(self):
        result = self._data.invalidatePrbState()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.VEHICLE_CAN_BE_CHANGED, result)

    def invalidateVehLocks(self, locks):
        raise NotImplementedError('Must be overridden in subclass')

    def invalidateWalletStatus(self, status):
        raise NotImplementedError('Must be overridden in subclass')

    def invalidateRent(self, vehicles):
        raise NotImplementedError('Must be overridden in subclass')

    def request4Info(self, itemCD, rootCD):
        vehicle = g_itemsCache.items.getItemByCD(int(rootCD))
        if vehicle:
            shared_events.showModuleInfo(int(itemCD), vehicle.descriptor)

    def _populate(self):
        super(ResearchView, self)._populate()
        self._listener.startListen(self)

    def _dispose(self):
        self._listener.stopListen()
        super(ResearchView, self)._dispose()
        if self._data is not None:
            self._data.clear(full=True)
            self._data = None
        return
Example #7
0
class ResearchView(LobbySubView, ResearchViewMeta):
    """
    Common interface to items (vehicle, module) in window of research modules, nation tree:
    - unlocks item;
    - buy vehicles;
    - shows messages in service channel.
    - refreshes data by server diff.
    """
    __background_alpha__ = 0.0

    def __init__(self, data):
        super(ResearchView, self).__init__()
        self._data = data
        self._canBeClosed = True
        self._listener = TTListenerDecorator()

    def redraw(self):
        """
        Redraws all nodes in view.
        """
        raise NotImplementedError('Must be overridden in subclass')

    def showSystemMessage(self, typeString, message):
        """
        Shows system message.
        :param typeString: string containing 'Error', 'Warning' or 'Information'.
        :param message: text of message.
        """
        msgType = SystemMessages.SM_TYPE.lookup(typeString)
        if msgType is None:
            msgType = SystemMessages.SM_TYPE.Error
        SystemMessages.pushMessage(message, msgType)
        return

    def invalidateCredits(self):
        """
        Value of credits updated.
        """
        result = self._data.invalidateCredits()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE_FLAGS.ENOUGH_MONEY, result)

    def invalidateGold(self):
        """
        Value of gold updated.
        """
        result = self._data.invalidateGold()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE_FLAGS.ENOUGH_MONEY, result)
        self.invalidateFreeXP()
        self.invalidateCredits()

    def invalidateFreeXP(self):
        """
        Value of free experience updated.
        """
        result = self._data.invalidateFreeXP()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE_FLAGS.ENOUGH_XP, result)

    def invalidateElites(self, elites):
        """
        Set of elite vehicles updated.
        :param elites: set([<compactDescr>, ...])
        """
        result = self._data.invalidateElites(elites)
        if len(result):
            self.as_setNodesStatesS(NODE_STATE_FLAGS.ELITE, result)

    def invalidateVTypeXP(self, xps):
        """
        Dict of vehicles experience updated.
        :param xps: dict(<int:vehicle compact descriptor> : <XP>, ...)
        """
        self.as_setVehicleTypeXPS(xps.items())
        result = self._data.invalidateVTypeXP()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE_FLAGS.ENOUGH_XP, result)

    def invalidateUnlocks(self, unlocks):
        """
        Set of unlocks items updated.
        :param unlocks: set([<int:compactDescr>, ...])
        """
        next2Unlock, unlocked = self._data.invalidateUnlocks(unlocks)
        if len(unlocked):
            LOG_DEBUG('unlocked', unlocked)
            self.as_setNodesStatesS(NODE_STATE_FLAGS.UNLOCKED, unlocked)
        if len(next2Unlock):
            LOG_DEBUG('next2Unlock', next2Unlock)
            self.as_setNext2UnlockS(next2Unlock)

    def invalidateInventory(self, data):
        """
        Inventory items are updated, invalidate information about inventory on current page.
        :param data: set of int-type compact descriptors for  modified items (vehicles/modules).
        """
        result = self._data.invalidateInventory(data)
        if len(result):
            self.as_setInventoryItemsS(result)

    def invalidatePrbState(self):
        """
        Player's state has been changed in prebattle, unit, prequeue.
        """
        result = self._data.invalidatePrbState()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE_FLAGS.VEHICLE_CAN_BE_CHANGED, result)

    def invalidateVehLocks(self, locks):
        """
        Updates lock status of vehicles (in inventory) that received new value.
        :param locks: dict(<inventory ID> : <value of lock>, ...), see AccountCommands.LOCK_REASON.
        """
        raise NotImplementedError('Must be overridden in subclass')

    def invalidateWalletStatus(self, status):
        raise NotImplementedError('Must be overridden in subclass')

    def invalidateRent(self, vehicles):
        raise NotImplementedError('Must be overridden in subclass')

    def request4Info(self, itemCD, rootCD):
        """
        Overridden method of the class ResearchViewMeta.request4Info
        """
        vehicle = g_itemsCache.items.getItemByCD(int(rootCD))
        if vehicle:
            shared_events.showModuleInfo(int(itemCD), vehicle.descriptor)

    def invalidateVehCompare(self):
        """
        Updates compare add icon status of nodes if change status of comparison basket fullness.
        """
        getVehicle = g_itemsCache.items.getItemByCD
        getNodeData = lambda vehCD: getTreeNodeCompareData(getVehicle(vehCD))
        self.as_setNodeVehCompareDataS([ (v, getNodeData(v)) for v in self._data.getVehicleCDs() ])

    def _populate(self):
        super(ResearchView, self)._populate()
        self._listener.startListen(self)

    def _dispose(self):
        self._listener.stopListen()
        super(ResearchView, self)._dispose()
        if self._data is not None:
            self._data.clear(full=True)
            self._data = None
        return
Example #8
0
class ResearchView(LobbySubView, ResearchViewMeta):
    MSG_SCOPE = enumerations.Enumeration('Message scope', [('Unlocks', lambda entity, msg: '#system_messages:unlocks/{0:>s}/{1:>s}'.format(entity, msg)),
     ('Shop', lambda entity, msg: '#system_messages:shop/{0:>s}/{1:>s}'.format(entity, msg)),
     ('Inventory', lambda entity, msg: '#system_messages:inventory/{0:>s}/{1:>s}'.format(entity, msg)),
     ('Dialog', lambda entity, msg: '#dialogs:techtree/{0:>s}/{1:>s}'.format(entity, msg))], instance=enumerations.CallabbleEnumItem)

    def __init__(self, data):
        super(ResearchView, self).__init__(backAlpha=0)
        self._data = data
        self._canBeClosed = True
        self._listener = TTListenerDecorator()

    def showModuleInfo(self, itemCD):
        itemCD = int(itemCD)
        vehicleDescr = self._data.getRootItem().descriptor
        self.fireEvent(events.ShowWindowEvent(events.ShowWindowEvent.SHOW_MODULE_INFO_WINDOW, {'moduleCompactDescr': itemCD,
         'vehicleDescr': vehicleDescr}))

    def showVehicleInfo(self, itemCD):
        self.fireEvent(events.ShowWindowEvent(events.ShowWindowEvent.SHOW_VEHICLE_INFO_WINDOW, {'vehicleCompactDescr': int(itemCD)}))

    def selectVehicleInHangar(self, itemCD):
        veh = self._data.getItem(int(itemCD))
        assert veh.isInInventory, 'Vehicle must be in inventory.'
        g_currentVehicle.selectVehicle(veh.invID)

    def showVehicleStatistics(self, itemCD):
        self.fireEvent(events.LoadEvent(events.LoadEvent.LOAD_PROFILE, {'itemCD': itemCD}), scope=EVENT_BUS_SCOPE.LOBBY)

    def redraw(self):
        raise NotImplementedError, 'Must be overridden in subclass'

    def unlockItem(self, unlockCD, vehCD, unlockIdx, xpCost):
        costCtx = self.getCostCtx(vehCD, xpCost)
        unlockCtx = unlock.UnlockItemCtx(unlockCD, vehCD, unlockIdx, xpCost)
        plugins = [unlock.UnlockItemConfirmator(unlockCtx, costCtx), unlock.UnlockItemValidator(unlockCtx)]
        self._doUnlockItem(unlockCtx, costCtx, plugins)

    def getCostCtx(self, vehCD, xpCost):
        return unlock.makeCostCtx(self._data.getUnlockStats().getVehXP(vehCD), xpCost)

    def buyVehicle(self, vehCD):
        item = self._data.getItem(vehCD)
        if item.itemTypeID is not GUI_ITEM_TYPE.VEHICLE:
            LOG_ERROR('Value of int-type descriptor is not refer to vehicle', vehCD)
            return
        if item.isInInventory and not item.isRented:
            self._showMessage(self.MSG_SCOPE.Inventory, 'already_exists', item, msgType=SystemMessages.SM_TYPE.Warning)
        else:
            price = item.minRentPrice or item.buyPrice
            money = g_itemsCache.items.stats.money
            if price is None:
                self._showMessage(self.MSG_SCOPE.Shop, 'not_found', item)
                return
            canRentOrBuy, reason = item.mayRentOrBuy(money)
            if canRentOrBuy:
                self._showVehicleBuyWindow(item)
            else:
                self._showMessage(self.MSG_SCOPE.Shop, 'common_rent_or_buy_error', item)
                LOG_WARNING('Vehicle ' + item.userName + ' cannot be buy or rent, reason: ' + reason)

    def _showVehicleBuyWindow(self, item):
        self.fireEvent(events.ShowWindowEvent(events.ShowWindowEvent.SHOW_VEHICLE_BUY_WINDOW, {'nationID': item.nationID,
         'itemID': item.innationID}))

    def _sendMoneyValidationMsg(self, price, item, errorID):
        stats = g_itemsCache.items.stats
        money = [price[0] - stats.credits if price[0] > 0 else 0, price[1] - stats.gold if price[1] > 0 else 0]
        self._showMessage(self.MSG_SCOPE.Shop, errorID, item, price=gui_items.formatPrice(money))

    def sellVehicle(self, vehCD):
        item = self._data.getItem(vehCD)
        if item.itemTypeID is not GUI_ITEM_TYPE.VEHICLE:
            LOG_ERROR('Value of int-type descriptor is not refer to vehicle', vehCD)
            return
        if item.isInInventory:
            self.fireEvent(events.ShowWindowEvent(events.ShowWindowEvent.SHOW_VEHICLE_SELL_DIALOG, {'vehInvID': item.inventoryID}))
        else:
            self._showMessage(self.MSG_SCOPE.Inventory, 'not_found', item)

    def showSystemMessage(self, typeString, message):
        msgType = SystemMessages.SM_TYPE.lookup(typeString)
        if msgType is None:
            msgType = SystemMessages.SM_TYPE.Error
        SystemMessages.pushMessage(message, msgType)

    def invalidateCredits(self):
        result = self._data.invalidateCredits()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.ENOUGH_MONEY, result)

    def invalidateGold(self):
        result = self._data.invalidateGold()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.ENOUGH_MONEY, result)

    def invalidateFreeXP(self):
        result = self._data.invalidateFreeXP()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.ENOUGH_XP, result)

    def invalidateElites(self, elites):
        result = self._data.invalidateElites(elites)
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.ELITE, result)

    def invalidateVTypeXP(self, xps):
        self.as_setVehicleTypeXPS(xps.items())
        result = self._data.invalidateVTypeXP()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.ENOUGH_XP, result)

    def invalidateUnlocks(self, unlocks):
        next2Unlock, unlocked = self._data.invalidateUnlocks(unlocks)
        if len(unlocked):
            LOG_DEBUG('unlocked', unlocked)
            self.as_setNodesStatesS(NODE_STATE.UNLOCKED, unlocked)
        if len(next2Unlock):
            LOG_DEBUG('next2Unlock', next2Unlock)
            self.as_setNext2UnlockS(next2Unlock)

    def invalidateInventory(self, data):
        result = self._data.invalidateInventory(data)
        if len(result):
            self.as_setInventoryItemsS(result)

    def invalidatePrbState(self):
        result = self._data.invalidatePrbState()
        if len(result):
            self.as_setNodesStatesS(NODE_STATE.VEHICLE_CAN_BE_CHANGED, result)

    def invalidateVehLocks(self, locks):
        raise NotImplementedError, 'Must be overridden in subclass'

    def invalidateWalletStatus(self, status):
        raise NotImplementedError, 'Must be overridden in subclass'

    def invalidateRent(self, vehicles):
        raise NotImplementedError, 'Must be overridden in subclass'

    def _populate(self):
        super(ResearchView, self)._populate()
        self._listener.startListen(self)

    def _dispose(self):
        self._listener.stopListen()
        super(ResearchView, self)._dispose()
        if self._data is not None:
            self._data.clear(full=True)
            self._data = None

    def _showMessage(self, scope, msg, item, msgType = SystemMessages.SM_TYPE.Error, **kwargs):
        kwargs['userString'] = item.userName
        if item.itemTypeID == GUI_ITEM_TYPE.VEHICLE:
            key = scope('vehicle', msg)
        else:
            key = scope('item', msg)
            kwargs['typeString'] = item.userType
        SystemMessages.pushMessage(i18n.makeString(key, **kwargs), type=msgType)

    @process('research')
    def _doUnlockItem(self, unlockCtx, costCtx, plugins):
        self._canBeClosed = False
        result = yield unlock.UnlockItemProcessor(unlockCtx.vehCD, unlockCtx.unlockIdx, plugins=plugins).request()
        self._canBeClosed = True
        if result.success:
            costCtx['xpCost'] = BigWorld.wg_getIntegralFormat(costCtx['xpCost'])
            costCtx['freeXP'] = BigWorld.wg_getIntegralFormat(costCtx['freeXP'])
            self._showMessage(self.MSG_SCOPE.Unlocks, 'unlock_success', self._data.getItem(unlockCtx.unlockCD), msgType=SystemMessages.SM_TYPE.PowerLevel, **costCtx)
        elif len(result.userMsg):
            self._showMessage(self.MSG_SCOPE.Unlocks, result.userMsg, self._data.getItem(unlockCtx.unlockCD))