def getInitialVehicleData(self):
        basketVehicle = self.getBasketVehCmpData()
        if basketVehicle.isInInventory():
            strCD = basketVehicle.getInvVehStrCD()
            crewLvl, crewSkills = basketVehicle.getInventoryCrewData()
            equipment = basketVehicle.getInvEquipment()
        else:
            strCD = basketVehicle.getStockVehStrCD()
            crewLvl = basketVehicle.getStockCrewLvl()
            crewSkills = basketVehicle.getStockCrewSkills()
            equipment = basketVehicle.getStockEquipment()
        vehicle = Vehicle(strCD)
        for slotIndex, equipmentSlot in enumerate(equipment):
            vehicle_adjusters.installEquipment(vehicle, equipmentSlot,
                                               slotIndex)

        cmp_helpers.applyCamouflage(vehicle, basketVehicle.invHasCamouflage())
        battleBooster = basketVehicle.getBattleBooster()
        if battleBooster is not None:
            vehicle_adjusters.installBattleBoosterOnVehicle(
                vehicle, battleBooster.intCD)
        postProgressionState = basketVehicle.getInvPostProgressionState()
        vehicle.installPostProgression(postProgressionState,
                                       rebuildAttrs=False)
        dynSlotType = basketVehicle.getInvDynSlotType()
        vehicle.optDevices.dynSlotType = dynSlotType
        return (vehicle, _CrewSkillsManager(vehicle, crewLvl, crewSkills))
    def getCurrentVehicleCopy(self):
        vehicle = Vehicle(
            strCompactDescr=self.__vehicle.descriptor.makeCompactDescr())
        vehicle.crew = self.__vehicle.crew[:]
        for i, equipmentIntCD in enumerate(
                self.__vehicle.consumables.installed.getIntCDs(default=None)):
            vehicle_adjusters.installEquipment(vehicle, equipmentIntCD, i)

        vehicle.descriptor.activeGunShotIndex = self.__vehicle.descriptor.activeGunShotIndex
        vehicle.optDevices.dynSlotType = self.__vehicle.optDevices.dynSlotType
        vehicle.installPostProgression(
            self.__vehicle.postProgression.getState(), True)
        cmp_helpers.applyCamouflage(
            vehicle, cmp_helpers.isCamouflageSet(self.__vehicle))
        for battleBooster in self.__vehicle.battleBoosters.installed.getItems(
        ):
            vehicle_adjusters.installBattleBoosterOnVehicle(
                vehicle, battleBooster.intCD)

        return vehicle
class VehicleCompareConfiguratorMain(LobbySubView,
                                     VehicleCompareConfiguratorMainMeta):
    itemsCache = dependency.descriptor(IItemsCache)
    comparisonBasket = dependency.descriptor(IVehicleComparisonBasket)
    uiLoader = dependency.descriptor(IGuiLoader)

    def __init__(self, ctx=None):
        super(VehicleCompareConfiguratorMain, self).__init__(ctx)
        self.__vehIndex = ctx.get('index')
        if not isinstance(self.__vehIndex, int):
            raise UserWarning('Index of vehicle should be integer: {}'.format(
                self.__vehIndex))
        if self.__vehIndex < 0 or self.__vehIndex >= self.comparisonBasket.getVehiclesCount(
        ):
            raise UserWarning(
                'Index of vehicle out of range: {} not in (0, {})'.format(
                    self.__vehIndex, self.comparisonBasket.getVehiclesCount()))
        self.__backAlias = ctx.get('previewAlias', VIEW_ALIAS.VEHICLE_COMPARE)
        self.__vehicle = None
        self.__vehItem = None
        self.__crewSkillsManager = None
        self.__views = {}
        self.__topModules = None
        self.__stockModules = None
        self.__selectedShellIndex = None
        return

    def as_showViewS(self, alias):
        result = super(VehicleCompareConfiguratorMain,
                       self).as_showViewS(alias)
        if alias in self.__views:
            self.__views[alias].onShow()
        return result

    def getCurrentVehicle(self):
        return self.__vehicle

    def getCurrentVehicleItem(self):
        return self.__vehItem

    def getCurrentVehicleCopy(self):
        vehicle = Vehicle(
            strCompactDescr=self.__vehicle.descriptor.makeCompactDescr())
        vehicle.crew = self.__vehicle.crew[:]
        for i, equipmentIntCD in enumerate(
                self.__vehicle.consumables.installed.getIntCDs(default=None)):
            vehicle_adjusters.installEquipment(vehicle, equipmentIntCD, i)

        vehicle.descriptor.activeGunShotIndex = self.__vehicle.descriptor.activeGunShotIndex
        vehicle.optDevices.dynSlotType = self.__vehicle.optDevices.dynSlotType
        vehicle.installPostProgression(
            self.__vehicle.postProgression.getState(), True)
        cmp_helpers.applyCamouflage(
            vehicle, cmp_helpers.isCamouflageSet(self.__vehicle))
        for battleBooster in self.__vehicle.battleBoosters.installed.getItems(
        ):
            vehicle_adjusters.installBattleBoosterOnVehicle(
                vehicle, battleBooster.intCD)

        return vehicle

    def getInitialVehicleData(self):
        basketVehicle = self.getBasketVehCmpData()
        if basketVehicle.isInInventory():
            strCD = basketVehicle.getInvVehStrCD()
            crewLvl, crewSkills = basketVehicle.getInventoryCrewData()
            equipment = basketVehicle.getInvEquipment()
        else:
            strCD = basketVehicle.getStockVehStrCD()
            crewLvl = basketVehicle.getStockCrewLvl()
            crewSkills = basketVehicle.getStockCrewSkills()
            equipment = basketVehicle.getStockEquipment()
        vehicle = Vehicle(strCD)
        for slotIndex, equipmentSlot in enumerate(equipment):
            vehicle_adjusters.installEquipment(vehicle, equipmentSlot,
                                               slotIndex)

        cmp_helpers.applyCamouflage(vehicle, basketVehicle.invHasCamouflage())
        battleBooster = basketVehicle.getBattleBooster()
        if battleBooster is not None:
            vehicle_adjusters.installBattleBoosterOnVehicle(
                vehicle, battleBooster.intCD)
        postProgressionState = basketVehicle.getInvPostProgressionState()
        vehicle.installPostProgression(postProgressionState,
                                       rebuildAttrs=False)
        dynSlotType = basketVehicle.getInvDynSlotType()
        vehicle.optDevices.dynSlotType = dynSlotType
        return (vehicle, _CrewSkillsManager(vehicle, crewLvl, crewSkills))

    def getCurrentCrewSkills(self):
        return self.__crewSkillsManager.getSelectedSkills()

    def getCurrentCrewSkillLevel(self):
        return self.__crewSkillsManager.getCrewSkillLevel()

    def getBasketVehCmpData(self):
        return self.comparisonBasket.getVehicleAt(self.__vehIndex)

    def getVehicleWithAppliedSkill(self, skillName):
        vehicle = self.getCurrentVehicleCopy()
        return vehicle if self.__crewSkillsManager.applySkillForTheSameVehicle(
            vehicle, skillName) else None

    def getCurrentShellIndex(self):
        return self.__selectedShellIndex

    def isTopModulesFromStock(self):
        topModules = self.__getTopModules()
        stockModules = self.__getStockModules()
        return all((bool(item in stockModules) for item in topModules))

    def isTopModulesSelected(self):
        topModules = self.__getTopModules()
        selectedModules = cmp_helpers.getVehicleModules(self.__vehicle)
        return all((bool(item in selectedModules) for item in topModules))

    def isCamouflageSet(self):
        return cmp_helpers.isCamouflageSet(self.__vehicle)

    def applyNewParameters(self):
        self.comparisonBasket.applyNewParameters(
            self.__vehIndex, self.__vehicle, self.getCurrentCrewSkillLevel(),
            self.getCurrentCrewSkills(), self.getCurrentShellIndex())

    def isDifferentWithInitialBasketVeh(self):
        basketVehicle = self.getBasketVehCmpData()
        if basketVehicle.isInInventory():
            basketVehCrewLvl, basketVehCrewSkills = basketVehicle.getInventoryCrewData(
            )
            equipment = basketVehicle.getInvEquipment()
            strCD = basketVehicle.getInvVehStrCD()
        else:
            basketVehCrewLvl = basketVehicle.getStockCrewLvl()
            basketVehCrewSkills = basketVehicle.getStockCrewSkills()
            equipment = basketVehicle.getStockEquipment()
            strCD = basketVehicle.getStockVehStrCD()
        return self.__isHasDifferences(
            strCD, equipment, basketVehCrewLvl, basketVehCrewSkills,
            basketVehicle.getInventoryShellIndex(),
            basketVehicle.invHasCamouflage(), basketVehicle.getBattleBooster(),
            basketVehicle.getInvDynSlotType(),
            basketVehicle.getInvPostProgressionState())

    def isCurrentVehicleModified(self):
        basketVehicle = self.getBasketVehCmpData()
        crewLvl, crewSkills = basketVehicle.getCrewData()
        return self.__isHasDifferences(basketVehicle.getVehicleStrCD(),
                                       basketVehicle.getEquipment(), crewLvl,
                                       crewSkills,
                                       basketVehicle.getSelectedShellIndex(),
                                       basketVehicle.hasCamouflage(),
                                       basketVehicle.getBattleBooster(),
                                       basketVehicle.getDynSlotType(),
                                       basketVehicle.getPostProgressionState())

    def setModules(self, modules):
        if modules:
            notFittedReasons = []
            oldGunIntCD = self.__vehicle.gun.intCD
            vehicle_adjusters.installModulesSet(self.__vehicle,
                                                list(modules[:]),
                                                notFittedReasons)
            self.__checkAndRemoveIncompatibleEquipments()
            if notFittedReasons:
                for notFitReason in notFittedReasons:
                    LOG_DEBUG(
                        'Module has not been installed properly, reason: {}'.
                        format(notFitReason))

            if oldGunIntCD != self.__vehicle.gun.intCD:
                firstShellIndex = 0
                newShellIndex = -1
                if self.__updateSelectedShell(firstShellIndex):
                    newShellIndex = firstShellIndex
                self.__notifyViews('onShellsUpdated',
                                   updateShells=True,
                                   selectedIndex=newShellIndex)
            else:
                newGunToInstall = findFirst(
                    lambda module: module.itemTypeID == GUI_ITEM_TYPE.GUN,
                    modules, None)
                if newGunToInstall is not None:
                    self.__vehicle.descriptor.activeGunShotIndex = self.__selectedShellIndex
            self.__notifyViews('onModulesUpdated')
        return

    def selectTopModules(self, select):
        if select:
            modules = self.__getTopModules()
        else:
            modules = self.__getStockModules()
        self.setModules(modules)

    def selectShell(self, slotIndex):
        if self.__updateSelectedShell(slotIndex):
            self.__notifyViews('onShellsUpdated', selectedIndex=slotIndex)

    def selectCamouflage(self, select):
        cmp_helpers.applyCamouflage(self.__vehicle, select)
        self.__notifyViews('onCamouflageUpdated')

    def resetToDefault(self):
        self.__vehicle, self.__crewSkillsManager = self.getInitialVehicleData()
        self.__vehItem.setItem(self.__vehicle)
        basketShellIndex = self.getBasketVehCmpData().getInventoryShellIndex()
        self.__updateSelectedShell(basketShellIndex)
        self.__notifyViews('onResetToDefault')

    def installOptionalDevice(self, newId, slotIndex):
        isInstalled, _ = vehicle_adjusters.installOptionalDevice(
            self.__vehicle, newId, slotIndex)
        if isInstalled:
            self.__notifyViews('onOptDeviceUpdated')

    def swapOptionalDevice(self, leftID, rightID):
        isSwapped, _ = vehicle_adjusters.swapOptionalDevice(
            self.__vehicle, leftID, rightID)
        if isSwapped:
            self.__notifyViews('onOptDeviceUpdated')

    def removeOptionalDevice(self, slotIndex):
        self.__launchOptDeviceRemoving(slotIndex)

    def installEquipment(self, newId, slotIndex):
        self.__installEquipment(newId, slotIndex)
        self.__notifyViews('onEquipmentUpdated')

    def removeEquipment(self, slotIndex):
        self.__installEquipment(None, slotIndex)
        self.__notifyViews('onEquipmentUpdated')
        return

    def swapEquipment(self, leftID, rightID):
        vehicle_adjusters.swapEquipment(self.__vehicle, leftID, rightID)
        self.__notifyViews('onEquipmentUpdated')

    def installBattleBooster(self, newId):
        self.__installBattleBooster(newId)
        self.__notifyViews('onBattleBoosterUpdated')

    def removeBattleBooster(self):
        self.__installBattleBooster(None)
        self.__notifyViews('onBattleBoosterUpdated')
        return

    def installPostProgression(self, state):
        self.__installPostProgression(state)
        self.__notifyViews('onPostProgressionUpdated')

    def changeDynRoleSlot(self, slotID):
        self.__vehicle.optDevices.dynSlotType = vehicles.g_cache.supplySlots(
        ).slotDescrs[slotID] if slotID else None
        self.__notifyViews('onChangeDynSlot')
        return

    def removePostProgression(self):
        self.__installPostProgression(VehicleState())
        self.__notifyViews('onPostProgressionUpdated')

    def selectCrewSkill(self, skillType, selected):
        savedValue = skillType in self.__crewSkillsManager.getSelectedSkills()
        if selected != savedValue:
            if self.__crewSkillsManager.toggleSkill(skillType):
                self.__notifyViews('onCrewSkillUpdated')
        else:
            LOG_WARNING('Attempt to apply the same value for {} = {}'.format(
                skillType, selected))

    def selectCrewLevel(self, crewLevelId):
        if self.__crewSkillsManager.changeCrewSkillLevel(crewLevelId):
            self.__notifyViews('onCrewLevelUpdated', crewLevelId)

    def closeView(self, forcedBackAliace=None):
        if self.__canClose():
            event = g_entitiesFactories.makeLoadEvent(
                SFViewLoadParams(forcedBackAliace or self.__backAlias))
            self.fireEvent(event, scope=EVENT_BUS_SCOPE.LOBBY)

    def _populate(self):
        super(VehicleCompareConfiguratorMain, self)._populate()
        self.comparisonBasket.onSwitchChange += self.__onBasketStateChanged
        self.comparisonBasket.onParametersChange += self.__onBasketParametersChanged
        basketVehicleData = self.getBasketVehCmpData()
        basketVehCrewLvl, basketVehCrewSkills = basketVehicleData.getCrewData()
        self.__vehicle = Vehicle(basketVehicleData.getVehicleStrCD())
        g_cmpConfiguratorVehicle.setVehicle(self.__vehicle)
        self.__vehItem = CompareInteractingItem(self.__vehicle)
        self.__crewSkillsManager = _CrewSkillsManager(self.__vehicle,
                                                      basketVehCrewLvl,
                                                      basketVehCrewSkills)
        equipment = basketVehicleData.getEquipment()
        for slotIndex, equipmentSlot in enumerate(equipment):
            self.__installEquipment(equipmentSlot, slotIndex)

        cmp_helpers.applyCamouflage(self.__vehicle,
                                    basketVehicleData.hasCamouflage())
        battleBooster = basketVehicleData.getBattleBooster()
        if battleBooster is not None:
            vehicle_adjusters.installBattleBoosterOnVehicle(
                self.__vehicle, battleBooster.intCD)
        dynSlotType = basketVehicleData.getDynSlotType()
        self.__vehicle.optDevices.dynSlotType = dynSlotType
        postProgressionState = basketVehicleData.getPostProgressionState()
        self.__vehicle.installPostProgression(postProgressionState, True)
        self.__updateSelectedShell(basketVehicleData.getSelectedShellIndex())
        self.as_showViewS(VEHICLE_COMPARE_CONSTANTS.VEHICLE_CONFIGURATOR_VIEW)
        self.comparisonBasket.isLocked = True
        return

    def _dispose(self):
        self.comparisonBasket.onSwitchChange -= self.__onBasketStateChanged
        self.comparisonBasket.onParametersChange -= self.__onBasketParametersChanged
        g_cmpConfiguratorVehicle.clear()
        self.__vehItem.clear()
        self.__vehItem = None
        if self.__crewSkillsManager is not None:
            self.__crewSkillsManager.dispose()
            self.__crewSkillsManager = None
        self.__views = None
        self.comparisonBasket.isLocked = False
        super(VehicleCompareConfiguratorMain, self)._dispose()
        return

    def _onRegisterFlashComponent(self, viewPy, alias):
        super(VehicleCompareConfiguratorMain,
              self)._onRegisterFlashComponent(viewPy, alias)
        if isinstance(viewPy, VehicleCompareConfiguratorBaseView):
            self.__views[alias] = viewPy
            viewPy.setContainer(self)

    def __canClose(self):
        resID = R.views.lobby.tanksetup.VehicleCompareAmmunitionSetup()
        return self.uiLoader.windowsManager.getViewByLayoutID(resID) is None

    @process
    def __launchOptDeviceRemoving(self, slotIndex):
        installedDevice = self.__vehicle.optDevices.installed[slotIndex]
        if installedDevice is not None:
            result = yield _CmpOptDeviceRemover(self.__vehicle,
                                                installedDevice,
                                                slotIndex).request()
            if result.success:
                self.__notifyViews('onOptDeviceUpdated')
            else:
                pushMessagesFromResult(result)
        return

    def __isHasDifferences(self, strCD, equipment, basketVehCrewLvl,
                           basketVehCrewSkills, selShellIndex, hasCamouflage,
                           battleBooster, dynSlotType, postProgressionState):
        if basketVehCrewLvl != self.getCurrentCrewSkillLevel():
            return True
        elif basketVehCrewSkills != self.getCurrentCrewSkills():
            return True
        elif not cmp_helpers.isEquipmentSame(
                equipment,
                self.__vehicle.consumables.installed.getIntCDs(default=None)):
            return True
        elif selShellIndex != self.__selectedShellIndex:
            return True
        currVehHasCamouflage = cmp_helpers.isCamouflageSet(self.__vehicle)
        if hasCamouflage != currVehHasCamouflage:
            return True
        currVehBattleBoosters = self.__vehicle.battleBoosters.installed
        if currVehBattleBoosters.getCapacity(
        ) > 0 and not battleBooster == currVehBattleBoosters[0]:
            return True
        if currVehHasCamouflage:
            targetVehicle = Vehicle(
                self.__vehicle.descriptor.makeCompactDescr())
            cmp_helpers.removeVehicleCamouflages(targetVehicle)
        else:
            targetVehicle = self.__vehicle
        if strCD != targetVehicle.descriptor.makeCompactDescr():
            return True
        elif dynSlotType != self.__vehicle.optDevices.dynSlotType:
            return True
        else:
            return True if postProgressionState != self.__vehicle.postProgression.getState(
                implicitCopy=False) else False

    def __getTopModules(self):
        if self.__topModules is None:
            self.__topModules = cmp_helpers.getVehicleTopModules(
                self.__vehicle)
        return self.__topModules

    def __getStockModules(self):
        if self.__stockModules is None:
            self.__stockModules = tuple(
                reversed(
                    cmp_helpers.getVehicleModules(
                        Vehicle(
                            self.getBasketVehCmpData().getStockVehStrCD()))))
        return self.__stockModules

    def __installEquipment(self, intCD, slotIndex):
        vehicle_adjusters.installEquipment(self.__vehicle, intCD, slotIndex)

    def __installBattleBooster(self, intCD):
        vehicle_adjusters.installBattleBoosterOnVehicle(self.__vehicle, intCD)

    def __installPostProgression(self, state):
        vehicle = self.getCurrentVehicle()
        vehicle.installPostProgression(state, True)
        if not vehicle.isRoleSlotExists():
            vehicle.optDevices.dynSlotType = None
        return

    def __updateSelectedShell(self, slotIndex):
        slotIndex = int(slotIndex)
        if self.__selectedShellIndex != slotIndex:
            vehicle_adjusters.changeShell(self.__vehicle, slotIndex)
            self.__selectedShellIndex = slotIndex
            return True
        return False

    def __onBasketStateChanged(self):
        if not self.comparisonBasket.isEnabled():
            self.closeView(VIEW_ALIAS.LOBBY_HANGAR)

    def __onBasketParametersChanged(self, data):
        if self.__vehIndex not in data:
            return
        self.__notifyViews('onBasketParametersChanged',
                           self.getBasketVehCmpData())

    def __notifyViews(self, event, *args, **kwargs):
        if self.__views is None:
            return
        else:
            for component in self.__views.itervalues():
                notifier = getattr(component, event, None)
                if notifier and callable(notifier):
                    notifier(*args, **kwargs)

            return

    def __checkAndRemoveIncompatibleEquipments(self):
        for i, equipmentIntCD in enumerate(
                self.__vehicle.consumables.installed.getIntCDs(default=None)):
            if equipmentIntCD:
                equipment = self.itemsCache.items.getItemByCD(
                    int(equipmentIntCD))
                success, _ = equipment.mayInstall(self.__vehicle, i)
                if not success:
                    self.removeEquipment(i)

        return
class _VehCompareParametersData(object):
    def __init__(self, cache, vehCompareData):
        super(_VehCompareParametersData, self).__init__()
        self.__crewLvl = None
        self.__skills = None
        self.__configurationType = None
        self.__isInInventory = None
        self.__currentVehParams = None
        self.__vehicleStrCD = None
        self.__equipment = []
        self.__hasCamouflage = False
        self.__selectedShellIdx = 0
        self.__vehicle = None
        self.__battleBooster = None
        self.__dynSlotType = None
        self.__postProgressionState = VehicleState()
        self.__isCrewInvalid = False
        self.__isInInvInvalid = False
        self.__isConfigurationTypesInvalid = False
        self.__isCurrVehParamsInvalid = False
        self.__vehicleIntCD = vehCompareData.getVehicleCD()
        self.setIsInInventory(vehCompareData.isInInventory())
        self.setVehicleData(vehCompareData)
        self.setCrewData(*vehCompareData.getCrewData())
        self.setConfigurationType(vehCompareData.getConfigurationType())
        self.__cache = cache
        self.__paramGenerator = _VehParamsValuesGenerator(*_COLOR_SCHEMES)
        self.__parameters = self.__initParameters(
            vehCompareData.getVehicleCD(), self.__vehicle)
        return

    def setCrewData(self, crewLvl, skills):
        if self.__crewLvl != crewLvl or self.__skills != skills:
            self.__crewLvl = crewLvl
            self.__skills = skills
            skillsDict = {}
            skillsByRoles = cmp_helpers.getVehicleCrewSkills(self.__vehicle)
            for idx, (_, skillsSet) in enumerate(skillsByRoles):
                sameSkills = skillsSet.intersection(self.__skills)
                if sameSkills:
                    skillsDict[idx] = sameSkills

            if crewLvl == CrewTypes.CURRENT:
                levelsByIndexes, nativeVehiclesByIndexes = cmp_helpers.getVehCrewInfo(
                    self.__vehicle.intCD)
                defRoleLevel = None
            else:
                levelsByIndexes = {}
                defRoleLevel = self.__crewLvl
                nativeVehiclesByIndexes = None
            self.__vehicle.crew = self.__vehicle.getCrewBySkillLevels(
                defRoleLevel,
                skillsDict,
                levelsByIndexes,
                nativeVehiclesByIndexes,
                activateBrotherhood=True)
            self.__isCrewInvalid = True
            self.__isCurrVehParamsInvalid = True
        return self.__isCrewInvalid

    def setVehicleData(self, vehCompareData):
        vehicleStrCD = vehCompareData.getVehicleStrCD()
        equipment = vehCompareData.getEquipment()
        hasCamouflage = vehCompareData.hasCamouflage()
        selectedShellIdx = vehCompareData.getSelectedShellIndex()
        battleBooster = vehCompareData.getBattleBooster()
        dynSlotType = vehCompareData.getDynSlotType()
        postProgressionState = vehCompareData.getPostProgressionState()
        isDifferent = False
        camouflageInvalid = self.__hasCamouflage != hasCamouflage
        equipInvalid = equipment != self.__equipment
        shellInvalid = selectedShellIdx != self.__selectedShellIdx
        battleBoosterInvalid = battleBooster != self.__battleBooster
        dynSlotsInvalid = dynSlotType != self.__dynSlotType
        postProgressionInvalid = postProgressionState != self.__postProgressionState
        if vehicleStrCD != self.__vehicleStrCD:
            self.__vehicleStrCD = vehicleStrCD
            self.__vehicle = Vehicle(self.__vehicleStrCD)
            self.__isCurrVehParamsInvalid = True
            isDifferent = True
            equipInvalid = True
            camouflageInvalid = True
            dynSlotsInvalid = True
            postProgressionInvalid = True
        if equipInvalid:
            for i, eq in enumerate(equipment):
                vehicle_adjusters.installEquipment(self.__vehicle, eq, i)

            self.__equipment = equipment
            isDifferent = True
        if battleBoosterInvalid:
            self.__battleBooster = battleBooster
            vehicle_adjusters.installBattleBoosterOnVehicle(
                self.__vehicle, battleBooster.intCD)
            isDifferent = True
        if camouflageInvalid:
            cmp_helpers.applyCamouflage(self.__vehicle, hasCamouflage)
            self.__hasCamouflage = hasCamouflage
            isDifferent = True
        if shellInvalid:
            self.__vehicle.descriptor.activeGunShotIndex = selectedShellIdx
            self.__selectedShellIdx = selectedShellIdx
            isDifferent = True
        if dynSlotsInvalid:
            self.__dynSlotType = dynSlotType
            self.__vehicle.optDevices.dynSlotType = dynSlotType
            self.__isCurrVehParamsInvalid = True
            isDifferent = True
        if postProgressionInvalid:
            self.__postProgressionState = postProgressionState
            self.__vehicle.installPostProgression(postProgressionState, True)
            self.__isCurrVehParamsInvalid = True
            isDifferent = True
        return isDifferent

    def setConfigurationType(self, newVal):
        if self.__configurationType != newVal:
            self.__configurationType = newVal
            self.__isConfigurationTypesInvalid = True
            self.__isCurrVehParamsInvalid = True
        return self.__isConfigurationTypesInvalid

    def setIsInInventory(self, newVal):
        if self.__isInInventory != newVal:
            self.__isInInventory = newVal
            self.__isInInvInvalid = True
        return self.__isInInvInvalid

    def dispose(self):
        self.__skills = None
        self.__vehicleStrCD = None
        self.__equipment = None
        self.__cache = None
        self.__paramGenerator = None
        self.__currentVehParams = None
        self.__parameters = None
        self.__battleBooster = None
        self.__dynSlotType = None
        self.__postProgressionState = None
        return

    def getVehicleIntCD(self):
        return self.__vehicleIntCD

    def getFormattedParameters(self, vehMaxParams):
        self.__isCrewInvalid = False
        if self.__isInInvInvalid:
            self.__isInInvInvalid = False
            self.__parameters['isInHangar'] = self.__isInInventory
        if self.__isConfigurationTypesInvalid:
            self.__parameters.update(elite=self.__vehicle.isElite,
                                     moduleType=self._getConfigurationType(
                                         self.__configurationType),
                                     showRevertBtn=self.__showRevertButton())
            self.__isConfigurationTypesInvalid = False
        if vehMaxParams:
            currentDataIndex = self.__cache.index(self)
            if currentDataIndex == 0:
                scheme = _NO_COLOR_SCHEMES if len(
                    self.__cache) == 1 else _COLOR_SCHEMES
                self.__paramGenerator.setColorSchemes(*scheme)
            self.__parameters.update(
                params=self.__paramGenerator.getFormattedParams(
                    VehiclesComparator(self.getParams(), vehMaxParams)),
                index=currentDataIndex)
        return self.__parameters

    def getParams(self):
        if self.__isCurrVehParamsInvalid:
            self.__isCurrVehParamsInvalid = False
            self.__currentVehParams = VehicleParams(
                self.__vehicle).getParamsDict()
        return self.__currentVehParams

    def getDeltaParams(self, paramName, paramValue):
        params = self.getParams()
        if paramName in params:
            pInfo = getParamExtendedData(paramName, params[paramName],
                                         paramValue)
            return formatters.formatParameterDelta(pInfo,
                                                   _DELTA_PARAM_COLOR_SCHEME,
                                                   FORMAT_SETTINGS)

    @classmethod
    def _getConfigurationType(cls, mType):
        format_style = text_styles.neutral if mType == CONFIGURATION_TYPES.CUSTOM else text_styles.main
        return format_style(
            '#veh_compare:vehicleCompareView/configurationType/{}'.format(
                mType))

    @classmethod
    def __initParameters(cls, vehCD, vehicle):
        return {
            'id':
            vehCD,
            'nation':
            vehicle.nationID,
            'image':
            vehicle.icon,
            'label':
            text_styles.main(vehicle.shortUserName),
            'level':
            vehicle.level,
            'premium':
            vehicle.isPremium,
            'tankType':
            vehicle.type,
            'isAttention':
            False,
            'index':
            -1,
            'isInHangar':
            False,
            'moduleType':
            cls._getConfigurationType(
                VEH_COMPARE.VEHICLECOMPAREVIEW_CONFIGURATIONTYPE_BASIC),
            'elite':
            vehicle.isElite,
            'params': [],
            'showRevertBtn':
            False
        }

    def __showRevertButton(self):
        return self.__configurationType == CONFIGURATION_TYPES.CUSTOM