def addDrone(self, fitID, itemID): if fitID is None: return False fit = getFit(fitID) item = getItem(itemID, eager=("attributes", "group.category")) if item.category.name == "Drone": drone = None for d in fit.drones.find(item): if d is not None and d.amountActive == 0 and d.amount < max( 5, fit.extraAttributes["maxActiveDrones"]): drone = d break if drone is None: drone = es_Drone(item) if drone.fits(fit) is True: fit.drones.append(drone) else: return False drone.amount += 1 eds_queries.commit() self.recalc(fit) return True else: return False
def addCargo(self, fitID, itemID, amount=1, replace=False): """ Adds cargo via typeID of item. If replace = True, we replace amount with given parameter, otherwise we increment """ if fitID is None: return False fit = getFit(fitID) item = getItem(itemID) cargo = None # adding from market for x in fit.cargo.find(item): if x is not None: # found item already in cargo, use previous value and remove old cargo = x fit.cargo.remove(x) break if cargo is None: # if we don't have the item already in cargo, use default values cargo = es_Cargo(item) fit.cargo.append(cargo) if replace: cargo.amount = amount else: cargo.amount += amount self.recalc(fit) eds_queries.commit() return True
def toggleImplantSource(self, fitID, source): fit = getFit(fitID) fit.implantSource = source eds_queries.commit() self.recalc(fit) return True
def getFit(self, fitID, projected=False, basic=False): ''' Gets fit from database, and populates fleet data. Projected is a recursion flag that is set to reduce recursions into projected fits Basic is a flag to simply return the fit without any other processing ''' if fitID is None: return None fit = getFit(fitID) if basic: return fit inited = getattr(fit, "inited", None) if inited is None or inited is False: sFleet = Fleet.getInstance() f = sFleet.getLinearFleet(fit) if f is None: sFleet.removeAssociatedFleetData(fit) fit.fleet = None else: fit.fleet = f if not projected: for fitP in fit.projectedFits: self.getFit(fitP.ID, projected=True) self.recalc(fit, withBoosters=True) fit.fill() # Check that the states of all modules are valid self.checkStates(fit, None) eds_queries.commit() fit.inited = True return fit
def changeModule(self, fitID, position, newItemID): fit = getFit(fitID) # Dummy it out in case the next bit fails fit.modules.toDummy(position) item = getItem(newItemID, eager=("attributes", "group.category")) try: m = es_Module(item) except ValueError: return False if m.fits(fit): m.owner = fit fit.modules.toModule(position, m) if m.isValidState(State.ACTIVE): m.state = State.ACTIVE # As some items may affect state-limiting attributes of the ship, calculate new attributes first self.recalc(fit) # Then, check states of all modules and change where needed. This will recalc if needed self.checkStates(fit, m) fit.fill() eds_queries.commit() return True else: return None
def refreshFit(self, fitID): if fitID is None: return None fit = getFit(fitID) eds_queries.commit() self.recalc(fit)
def appendModule(self, fitID, itemID): fit = getFit(fitID) item = getItem(itemID, eager=("attributes", "group.category")) try: m = es_Module(item) except ValueError: return False if m.item.category.name == "Subsystem": fit.modules.freeSlot(m.getModifiedItemAttr("subSystemSlot")) if m.fits(fit): m.owner = fit numSlots = len(fit.modules) fit.modules.append(m) if m.isValidState(State.ACTIVE): m.state = State.ACTIVE # As some items may affect state-limiting attributes of the ship, calculate new attributes first self.recalc(fit) # Then, check states of all modules and change where needed. This will recalc if needed self.checkStates(fit, m) fit.fill() eds_queries.commit() return numSlots != len(fit.modules) else: return None
def toggleBooster(self, fitID, i): fit = getFit(fitID) booster = fit.boosters[i] booster.active = not booster.active eds_queries.commit() self.recalc(fit) return True
def toggleFighter(self, fitID, i): fit = getFit(fitID) f = fit.fighters[i] f.active = not f.active eds_queries.commit() self.recalc(fit) return True
def removeFighter(self, fitID, i): fit = getFit(fitID) f = fit.fighters[i] fit.fighters.remove(f) eds_queries.commit() self.recalc(fit) return True
def toggleCommandFit(self, fitID, thing): fit = getFit(fitID) commandInfo = thing.getCommandInfo(fitID) if commandInfo: commandInfo.active = not commandInfo.active eds_queries.commit() self.recalc(fit)
def toggleFactorReload(self, fitID): if fitID is None: return None fit = getFit(fitID) fit.factorReload = not fit.factorReload eds_queries.commit() self.recalc(fit)
def toggleImplant(self, fitID, i): fit = getFit(fitID) implant = fit.implants[i] implant.active = not implant.active eds_queries.commit() self.recalc(fit) return True
def setTargetResists(self, fitID, pattern): if fitID is None: return fit = getFit(fitID) fit.targetResists = pattern eds_queries.commit() self.recalc(fit)
def setDamagePattern(self, fitID, pattern): if fitID is None: return fit = getFit(fitID) fit.damagePattern = self.pattern = pattern eds_queries.commit() self.recalc(fit)
def saveLevels(self): if self == self.getAll5() or self == self.getAll0(): raise ReadOnlyException("This character is read-only") for skill in self.dirtySkills.copy(): skill.saveLevel() self.dirtySkills = set() eds_queries.commit()
def setMode(self, fitID, mode): if fitID is None: return fit = getFit(fitID) fit.mode = mode eds_queries.commit() self.recalc(fit)
def addImplant(self, charID, itemID): char = getCharacter(charID) if char.ro: logger.error("Trying to add implant to read-only character") return implant = es_Implant(getItem(itemID)) char.implants.append(implant) eds_queries.commit()
def changeAmount(self, fitID, projected_fit, amount): """Change amount of projected fits""" fit = getFit(fitID) amount = min(20, max(1, amount)) # 1 <= a <= 20 projectionInfo = projected_fit.getProjectionInfo(fitID) if projectionInfo: projectionInfo.amount = amount eds_queries.commit() self.recalc(fit)
def getItemsWithOverrides(self): overrides = getAllOverrides() items = set() for x in overrides: if (x.item is None): sqlAlchemy.saveddata_session.delete(x) commit() else: items.add(x.item) return list(items)
def splitDrones(self, fit, d, amount, l): total = d.amount active = d.amountActive > 0 d.amount = amount d.amountActive = amount if active else 0 newD = es_Drone(d.item) newD.amount = total - amount newD.amountActive = newD.amount if active else 0 l.append(newD) eds_queries.commit()
def toggleDrone(self, fitID, i): fit = getFit(fitID) d = fit.drones[i] if d.amount == d.amountActive: d.amountActive = 0 else: d.amountActive = d.amount eds_queries.commit() self.recalc(fit) return True
def removeModule(self, fitID, position): fit = getFit(fitID) if fit.modules[position].isEmpty: return None numSlots = len(fit.modules) fit.modules.toDummy(position) self.recalc(fit) self.checkStates(fit, None) fit.fill() eds_queries.commit() return numSlots != len(fit.modules)
def changeLevel(self, charID, skillID, level, persist=False): char = getCharacter(charID) skill = char.getSkill(skillID) if isinstance(level, basestring) or level > 5 or level < 0: skill.level = None else: skill.level = level if persist: skill.saveLevel() eds_queries.commit()
def swapModules(self, fitID, src, dst): fit = getFit(fitID) # Gather modules srcMod = fit.modules[src] dstMod = fit.modules[dst] # To swap, we simply remove mod and insert at destination. fit.modules.remove(srcMod) fit.modules.insert(dst, srcMod) fit.modules.remove(dstMod) fit.modules.insert(src, dstMod) eds_queries.commit()
def removeDrone(self, fitID, i, numDronesToRemove=1): fit = getFit(fitID) d = fit.drones[i] d.amount -= numDronesToRemove if d.amountActive > 0: d.amountActive -= numDronesToRemove if d.amount == 0: del fit.drones[i] eds_queries.commit() self.recalc(fit) return True
def moveCargoToModule(self, fitID, moduleIdx, cargoIdx, copyMod=False): """ Moves cargo to fitting window. Can either do a copy, move, or swap with current module If we try to copy/move into a spot with a non-empty module, we swap instead. To avoid redundancy in converting Cargo item, this function does the sanity checks as opposed to the GUI View. This is different than how the normal .swapModules() does things, which is mostly a blind swap. """ fit = getFit(fitID) module = fit.modules[moduleIdx] cargo = fit.cargo[cargoIdx] # Gather modules and convert Cargo item to Module, silently return if not a module try: cargoP = Module(cargo.item) cargoP.owner = fit if cargoP.isValidState(State.ACTIVE): cargoP.state = State.ACTIVE except: return if cargoP.slot != module.slot: # can't swap modules to different racks return # remove module that we are trying to move cargo to fit.modules.remove(module) if not cargoP.fits(fit): # if cargo doesn't fit, rollback and return fit.modules.insert(moduleIdx, module) return fit.modules.insert(moduleIdx, cargoP) if not copyMod: # remove existing cargo if not cloning if cargo.amount == 1: fit.cargo.remove(cargo) else: cargo.amount -= 1 if not module.isEmpty: # if module is placeholder, we don't want to convert/add it for x in fit.cargo.find(module.item): x.amount += 1 break else: moduleP = es_Cargo(module.item) moduleP.amount = 1 fit.cargo.insert(cargoIdx, moduleP) eds_queries.commit() self.recalc(fit)
def removeProjected(self, fitID, thing): fit = getFit(fitID) if isinstance(thing, es_Drone): fit.projectedDrones.remove(thing) elif isinstance(thing, es_Module): fit.projectedModules.remove(thing) elif isinstance(thing, es_Fighter): fit.projectedFighters.remove(thing) else: del fit.__projectedFits[thing.ID] # fit.projectedFits.remove(thing) eds_queries.commit() self.recalc(fit)
def addFighter(self, fitID, itemID): if fitID is None: return False fit = getFit(fitID) item = getItem(itemID, eager=("attributes", "group.category")) if item.category.name == "Fighter": fighter = None ''' for d in fit.fighters.find(item): if d is not None and d.amountActive == 0 and d.amount < max(5, fit.extraAttributes["maxActiveDrones"]): drone = d break ''' if fighter is None: fighter = es_Fighter(item) used = fit.getSlotsUsed(fighter.slot) total = fit.getNumSlots(fighter.slot) standardAttackActive = False for ability in fighter.abilities: if (ability.effect.isImplemented and ability.effect.handlerName == u'fighterabilityattackm'): # Activate "standard attack" if available ability.active = True standardAttackActive = True else: # Activate all other abilities (Neut, Web, etc) except propmods if no standard attack is active if (ability.effect.isImplemented and standardAttackActive is False and ability.effect.handlerName != u'fighterabilitymicrowarpdrive' and ability.effect.handlerName != u'fighterabilityevasivemaneuvers'): ability.active = True if used >= total: fighter.active = False if fighter.fits(fit) is True: fit.fighters.append(fighter) else: return False eds_queries.commit() self.recalc(fit) return True else: return False
def toggleModulesState(self, fitID, base, modules, click): proposedState = self.__getProposedState(base, click) if proposedState != base.state: base.state = proposedState for mod in modules: if mod != base: mod.state = self.__getProposedState( mod, click, proposedState) eds_queries.commit() fit = getFit(fitID) # As some items may affect state-limiting attributes of the ship, calculate new attributes first self.recalc(fit) # Then, check states of all modules and change where needed. This will recalc if needed self.checkStates(fit, base)