Merge branch 'development' into feature/commandmenu
This commit is contained in:
0
_development/__init__.py
Normal file
0
_development/__init__.py
Normal file
143
_development/helpers.py
Normal file
143
_development/helpers.py
Normal file
@@ -0,0 +1,143 @@
|
||||
# noinspection PyPackageRequirements
|
||||
import pytest
|
||||
|
||||
import os
|
||||
import sys
|
||||
import threading
|
||||
|
||||
from sqlalchemy import MetaData, create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
# Add root folder to python paths
|
||||
sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..')))
|
||||
sys._called_from_test = True
|
||||
|
||||
# noinspection PyUnresolvedReferences,PyUnusedLocal
|
||||
@pytest.fixture
|
||||
def DBInMemory_test():
|
||||
def rollback():
|
||||
with sd_lock:
|
||||
saveddata_session.rollback()
|
||||
|
||||
|
||||
print("Creating database in memory")
|
||||
from os.path import realpath, join, dirname, abspath
|
||||
|
||||
debug = False
|
||||
gamedataCache = True
|
||||
saveddataCache = True
|
||||
gamedata_version = ""
|
||||
gamedata_connectionstring = 'sqlite:///' + realpath(join(dirname(abspath(unicode(__file__))), "..", "eve.db"))
|
||||
saveddata_connectionstring = 'sqlite:///:memory:'
|
||||
|
||||
class ReadOnlyException(Exception):
|
||||
pass
|
||||
|
||||
if callable(gamedata_connectionstring):
|
||||
gamedata_engine = create_engine("sqlite://", creator=gamedata_connectionstring, echo=debug)
|
||||
else:
|
||||
gamedata_engine = create_engine(gamedata_connectionstring, echo=debug)
|
||||
|
||||
gamedata_meta = MetaData()
|
||||
gamedata_meta.bind = gamedata_engine
|
||||
gamedata_session = sessionmaker(bind=gamedata_engine, autoflush=False, expire_on_commit=False)()
|
||||
|
||||
# This should be moved elsewhere, maybe as an actual query. Current, without try-except, it breaks when making a new
|
||||
# game db because we haven't reached gamedata_meta.create_all()
|
||||
try:
|
||||
gamedata_version = gamedata_session.execute(
|
||||
"SELECT `field_value` FROM `metadata` WHERE `field_name` LIKE 'client_build'"
|
||||
).fetchone()[0]
|
||||
except Exception as e:
|
||||
print("Missing gamedata version.")
|
||||
gamedata_version = None
|
||||
|
||||
if saveddata_connectionstring is not None:
|
||||
if callable(saveddata_connectionstring):
|
||||
saveddata_engine = create_engine(creator=saveddata_connectionstring, echo=debug)
|
||||
else:
|
||||
saveddata_engine = create_engine(saveddata_connectionstring, echo=debug)
|
||||
|
||||
saveddata_meta = MetaData()
|
||||
saveddata_meta.bind = saveddata_engine
|
||||
saveddata_session = sessionmaker(bind=saveddata_engine, autoflush=False, expire_on_commit=False)()
|
||||
else:
|
||||
saveddata_meta = None
|
||||
|
||||
# Lock controlling any changes introduced to session
|
||||
sd_lock = threading.Lock()
|
||||
|
||||
# Import all the definitions for all our database stuff
|
||||
# noinspection PyPep8
|
||||
#from eos.db.gamedata import alphaClones, attribute, category, effect, group, icon, item, marketGroup, metaData, metaGroup, queries, traits, unit
|
||||
# noinspection PyPep8
|
||||
#from eos.db.saveddata import booster, cargo, character, crest, damagePattern, databaseRepair, drone, fighter, fit, implant, implantSet, loadDefaultDatabaseValues, miscData, module, override, price, queries, skill, targetResists, user
|
||||
|
||||
# If using in memory saveddata, you'll want to reflect it so the data structure is good.
|
||||
if saveddata_connectionstring == "sqlite:///:memory:":
|
||||
saveddata_meta.create_all()
|
||||
|
||||
# Output debug info to help us troubleshoot Travis
|
||||
print(saveddata_engine)
|
||||
print(gamedata_engine)
|
||||
|
||||
helper = {
|
||||
#'config': eos.config,
|
||||
'gamedata_session' : gamedata_session,
|
||||
'saveddata_session' : saveddata_session,
|
||||
}
|
||||
return helper
|
||||
|
||||
# noinspection PyUnresolvedReferences,PyUnusedLocal
|
||||
@pytest.fixture
|
||||
def DBInMemory():
|
||||
print("Creating database in memory")
|
||||
|
||||
import eos.config
|
||||
|
||||
import eos
|
||||
import eos.db
|
||||
|
||||
# Output debug info to help us troubleshoot Travis
|
||||
print(eos.db.saveddata_engine)
|
||||
print(eos.db.gamedata_engine)
|
||||
|
||||
helper = {
|
||||
'config': eos.config,
|
||||
'db' : eos.db,
|
||||
'gamedata_session' : eos.db.gamedata_session,
|
||||
'saveddata_session' : eos.db.saveddata_session,
|
||||
}
|
||||
return helper
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def Gamedata():
|
||||
print("Building Gamedata")
|
||||
from eos.gamedata import Item
|
||||
|
||||
helper = {
|
||||
'Item': Item,
|
||||
}
|
||||
return helper
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def Saveddata():
|
||||
print("Building Saveddata")
|
||||
from eos.saveddata.ship import Ship
|
||||
from eos.saveddata.fit import Fit
|
||||
from eos.saveddata.character import Character
|
||||
from eos.saveddata.module import Module, State
|
||||
from eos.saveddata.citadel import Citadel
|
||||
|
||||
helper = {
|
||||
'Structure': Citadel,
|
||||
'Ship' : Ship,
|
||||
'Fit' : Fit,
|
||||
'Character': Character,
|
||||
'Module' : Module,
|
||||
'State' : State,
|
||||
}
|
||||
return helper
|
||||
28
_development/helpers_fits.py
Normal file
28
_development/helpers_fits.py
Normal file
@@ -0,0 +1,28 @@
|
||||
import pytest
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
|
||||
|
||||
|
||||
# noinspection PyShadowingNames
|
||||
@pytest.fixture
|
||||
def RifterFit(DB, Gamedata, Saveddata):
|
||||
print("Creating Rifter")
|
||||
item = DB['gamedata_session'].query(Gamedata['Item']).filter(Gamedata['Item'].name == "Rifter").first()
|
||||
ship = Saveddata['Ship'](item)
|
||||
# setup fit
|
||||
fit = Saveddata['Fit'](ship, "My Rifter Fit")
|
||||
|
||||
return fit
|
||||
|
||||
|
||||
# noinspection PyShadowingNames
|
||||
@pytest.fixture
|
||||
def KeepstarFit(DB, Gamedata, Saveddata):
|
||||
print("Creating Keepstar")
|
||||
item = DB['gamedata_session'].query(Gamedata['Item']).filter(Gamedata['Item'].name == "Keepstar").first()
|
||||
ship = Saveddata['Structure'](item)
|
||||
# setup fit
|
||||
fit = Saveddata['Fit'](ship, "Keepstar Fit")
|
||||
|
||||
return fit
|
||||
@@ -1,14 +1,25 @@
|
||||
import sys
|
||||
from os.path import realpath, join, dirname, abspath
|
||||
|
||||
from logbook import Logger
|
||||
import os
|
||||
istravis = os.environ.get('TRAVIS') == 'true'
|
||||
pyfalog = Logger(__name__)
|
||||
|
||||
debug = False
|
||||
gamedataCache = True
|
||||
saveddataCache = True
|
||||
gamedata_version = ""
|
||||
gamedata_connectionstring = 'sqlite:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "eve.db")),
|
||||
sys.getfilesystemencoding())
|
||||
saveddata_connectionstring = 'sqlite:///' + unicode(
|
||||
realpath(join(dirname(abspath(__file__)), "..", "saveddata", "saveddata.db")), sys.getfilesystemencoding())
|
||||
gamedata_connectionstring = 'sqlite:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "eve.db")), sys.getfilesystemencoding())
|
||||
pyfalog.debug("Gamedata connection string: {0}", gamedata_connectionstring)
|
||||
|
||||
if istravis is True or hasattr(sys, '_called_from_test'):
|
||||
# Running in Travis. Run saveddata database in memory.
|
||||
saveddata_connectionstring = 'sqlite:///:memory:'
|
||||
else:
|
||||
saveddata_connectionstring = 'sqlite:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "saveddata", "saveddata.db")), sys.getfilesystemencoding())
|
||||
|
||||
pyfalog.debug("Saveddata connection string: {0}", saveddata_connectionstring)
|
||||
|
||||
settings = {
|
||||
"setting1": True
|
||||
|
||||
@@ -19,6 +19,9 @@
|
||||
|
||||
import collections
|
||||
from math import exp
|
||||
# TODO: This needs to be moved out, we shouldn't have *ANY* dependencies back to other modules/methods inside eos.
|
||||
# This also breaks writing any tests. :(
|
||||
from eos.db.gamedata.queries import getAttributeInfo
|
||||
|
||||
defaultValuesCache = {}
|
||||
cappingAttrKeyCache = {}
|
||||
@@ -26,22 +29,26 @@ cappingAttrKeyCache = {}
|
||||
|
||||
class ItemAttrShortcut(object):
|
||||
def getModifiedItemAttr(self, key, default=None):
|
||||
if key in self.itemModifiedAttributes:
|
||||
return self.itemModifiedAttributes[key]
|
||||
else:
|
||||
return default
|
||||
return_value = self.itemModifiedAttributes.get(key)
|
||||
|
||||
if return_value is None and default is not None:
|
||||
return_value = default
|
||||
|
||||
return return_value
|
||||
|
||||
|
||||
class ChargeAttrShortcut(object):
|
||||
def getModifiedChargeAttr(self, key, default=None):
|
||||
if key in self.chargeModifiedAttributes:
|
||||
return self.chargeModifiedAttributes[key]
|
||||
else:
|
||||
return default
|
||||
return_value = self.chargeModifiedAttributes.get(key)
|
||||
|
||||
if return_value is None and default is not None:
|
||||
return_value = default
|
||||
|
||||
return return_value
|
||||
|
||||
|
||||
class ModifiedAttributeDict(collections.MutableMapping):
|
||||
OVERRIDES = False
|
||||
overrides_enabled = False
|
||||
|
||||
class CalculationPlaceholder(object):
|
||||
def __init__(self):
|
||||
@@ -98,15 +105,23 @@ class ModifiedAttributeDict(collections.MutableMapping):
|
||||
|
||||
def __getitem__(self, key):
|
||||
# Check if we have final calculated value
|
||||
if key in self.__modified:
|
||||
if self.__modified[key] == self.CalculationPlaceholder:
|
||||
self.__modified[key] = self.__calculateValue(key)
|
||||
return self.__modified[key]
|
||||
key_value = self.__modified.get(key)
|
||||
if key_value is self.CalculationPlaceholder:
|
||||
key_value = self.__modified[key] = self.__calculateValue(key)
|
||||
|
||||
if key_value is not None:
|
||||
return key_value
|
||||
|
||||
# Then in values which are not yet calculated
|
||||
elif key in self.__intermediary:
|
||||
return self.__intermediary[key]
|
||||
# Original value is the least priority
|
||||
if self.__intermediary:
|
||||
val = self.__intermediary.get(key)
|
||||
else:
|
||||
val = None
|
||||
|
||||
if val is not None:
|
||||
return val
|
||||
else:
|
||||
# Original value is the least priority
|
||||
return self.getOriginal(key)
|
||||
|
||||
def __delitem__(self, key):
|
||||
@@ -115,12 +130,18 @@ class ModifiedAttributeDict(collections.MutableMapping):
|
||||
if key in self.__intermediary:
|
||||
del self.__intermediary[key]
|
||||
|
||||
def getOriginal(self, key):
|
||||
if self.OVERRIDES and key in self.__overrides:
|
||||
return self.__overrides.get(key).value
|
||||
val = self.__original.get(key)
|
||||
def getOriginal(self, key, default=None):
|
||||
if self.overrides_enabled and self.overrides:
|
||||
val = self.overrides.get(key, None)
|
||||
else:
|
||||
val = None
|
||||
|
||||
if val is None:
|
||||
return None
|
||||
if self.original:
|
||||
val = self.original.get(key, None)
|
||||
|
||||
if val is None and val != default:
|
||||
val = default
|
||||
|
||||
return val.value if hasattr(val, "value") else val
|
||||
|
||||
@@ -128,12 +149,12 @@ class ModifiedAttributeDict(collections.MutableMapping):
|
||||
self.__intermediary[key] = val
|
||||
|
||||
def __iter__(self):
|
||||
all = dict(self.__original, **self.__modified)
|
||||
return (key for key in all)
|
||||
all_dict = dict(self.original, **self.__modified)
|
||||
return (key for key in all_dict)
|
||||
|
||||
def __contains__(self, key):
|
||||
return (self.__original is not None and key in self.__original) or \
|
||||
key in self.__modified or key in self.__intermediary
|
||||
return (self.original is not None and key in self.original) or \
|
||||
key in self.__modified or key in self.__intermediary
|
||||
|
||||
def __placehold(self, key):
|
||||
"""Create calculation placeholder in item's modified attribute dict"""
|
||||
@@ -141,7 +162,7 @@ class ModifiedAttributeDict(collections.MutableMapping):
|
||||
|
||||
def __len__(self):
|
||||
keys = set()
|
||||
keys.update(self.__original.iterkeys())
|
||||
keys.update(self.original.iterkeys())
|
||||
keys.update(self.__modified.iterkeys())
|
||||
keys.update(self.__intermediary.iterkeys())
|
||||
return len(keys)
|
||||
@@ -152,7 +173,6 @@ class ModifiedAttributeDict(collections.MutableMapping):
|
||||
try:
|
||||
cappingKey = cappingAttrKeyCache[key]
|
||||
except KeyError:
|
||||
from eos.db.gamedata.queries import getAttributeInfo
|
||||
attrInfo = getAttributeInfo(key)
|
||||
if attrInfo is None:
|
||||
cappingId = cappingAttrKeyCache[key] = None
|
||||
@@ -166,12 +186,8 @@ class ModifiedAttributeDict(collections.MutableMapping):
|
||||
cappingKey = None if cappingAttrInfo is None else cappingAttrInfo.name
|
||||
|
||||
if cappingKey:
|
||||
if cappingKey in self.original:
|
||||
# some items come with their own caps (ie: carriers). If they do, use this
|
||||
cappingValue = self.original.get(cappingKey).value
|
||||
else:
|
||||
# If not, get info about the default value
|
||||
cappingValue = self.__calculateValue(cappingKey)
|
||||
cappingValue = self.original.get(cappingKey, self.__calculateValue(cappingKey))
|
||||
cappingValue = cappingValue.value if hasattr(cappingValue, "value") else cappingValue
|
||||
else:
|
||||
cappingValue = None
|
||||
|
||||
@@ -183,25 +199,28 @@ class ModifiedAttributeDict(collections.MutableMapping):
|
||||
force = min(force, cappingValue)
|
||||
return force
|
||||
# Grab our values if they're there, otherwise we'll take default values
|
||||
preIncrease = self.__preIncreases[key] if key in self.__preIncreases else 0
|
||||
multiplier = self.__multipliers[key] if key in self.__multipliers else 1
|
||||
penalizedMultiplierGroups = self.__penalizedMultipliers[key] if key in self.__penalizedMultipliers else {}
|
||||
postIncrease = self.__postIncreases[key] if key in self.__postIncreases else 0
|
||||
preIncrease = self.__preIncreases.get(key, 0)
|
||||
multiplier = self.__multipliers.get(key, 1)
|
||||
penalizedMultiplierGroups = self.__penalizedMultipliers.get(key, {})
|
||||
postIncrease = self.__postIncreases.get(key, 0)
|
||||
|
||||
# Grab initial value, priorities are:
|
||||
# Results of ongoing calculation > preAssign > original > 0
|
||||
try:
|
||||
default = defaultValuesCache[key]
|
||||
except KeyError:
|
||||
from eos.db.gamedata.queries import getAttributeInfo
|
||||
attrInfo = getAttributeInfo(key)
|
||||
if attrInfo is None:
|
||||
default = defaultValuesCache[key] = 0.0
|
||||
else:
|
||||
dv = attrInfo.defaultValue
|
||||
default = defaultValuesCache[key] = dv if dv is not None else 0.0
|
||||
val = self.__intermediary[key] if key in self.__intermediary else self.__preAssigns[
|
||||
key] if key in self.__preAssigns else self.getOriginal(key) if key in self.__original else default
|
||||
|
||||
val = self.__intermediary.get(key,
|
||||
self.__preAssigns.get(key,
|
||||
self.getOriginal(key, default)
|
||||
)
|
||||
)
|
||||
|
||||
# We'll do stuff in the following order:
|
||||
# preIncrease > multiplier > stacking penalized multipliers > postIncrease
|
||||
@@ -254,7 +273,7 @@ class ModifiedAttributeDict(collections.MutableMapping):
|
||||
return skill.level
|
||||
|
||||
def getAfflictions(self, key):
|
||||
return self.__affectedBy[key] if key in self.__affectedBy else {}
|
||||
return self.__affectedBy.get(key, {})
|
||||
|
||||
def iterAfflictions(self):
|
||||
return self.__affectedBy.__iter__()
|
||||
@@ -360,6 +379,6 @@ class ModifiedAttributeDict(collections.MutableMapping):
|
||||
|
||||
|
||||
class Affliction(object):
|
||||
def __init__(self, type, amount):
|
||||
self.type = type
|
||||
def __init__(self, affliction_type, amount):
|
||||
self.type = affliction_type
|
||||
self.amount = amount
|
||||
|
||||
@@ -545,12 +545,10 @@ class Fit(object):
|
||||
|
||||
if warfareBuffID == 21: # Skirmish Burst: Interdiction Maneuvers: Tackle Range
|
||||
groups = ("Stasis Web", "Warp Scrambler")
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.group.name in groups, "maxRange", value,
|
||||
stackingPenalties=True)
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.group.name in groups, "maxRange", value, stackingPenalties=True)
|
||||
|
||||
if warfareBuffID == 22: # Skirmish Burst: Rapid Deployment: AB/MWD Speed Increase
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Afterburner") or
|
||||
mod.item.requiresSkill("High Speed Maneuvering"),
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Afterburner") or mod.item.requiresSkill("High Speed Maneuvering"),
|
||||
"speedFactor", value, stackingPenalties=True)
|
||||
|
||||
if warfareBuffID == 23: # Mining Burst: Mining Laser Field Enhancement: Mining/Survey Range
|
||||
@@ -559,8 +557,7 @@ class Fit(object):
|
||||
mod.item.requiresSkill("Gas Cloud Harvesting"),
|
||||
"maxRange", value, stackingPenalties=True)
|
||||
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("CPU Management"),
|
||||
"surveyScanRange", value, stackingPenalties=True)
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("CPU Management"), "surveyScanRange", value, stackingPenalties=True)
|
||||
|
||||
if warfareBuffID == 24: # Mining Burst: Mining Laser Optimization: Mining Capacitor/Duration
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Mining") or
|
||||
@@ -574,8 +571,7 @@ class Fit(object):
|
||||
"duration", value, stackingPenalties=True)
|
||||
|
||||
if warfareBuffID == 25: # Mining Burst: Mining Equipment Preservation: Crystal Volatility
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Mining"),
|
||||
"crystalVolatilityChance", value, stackingPenalties=True)
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Mining"), "crystalVolatilityChance", value, stackingPenalties=True)
|
||||
|
||||
if warfareBuffID == 60: # Skirmish Burst: Evasive Maneuvers: Agility
|
||||
self.ship.boostItemAttr("agility", value, stackingPenalties=True)
|
||||
|
||||
@@ -114,6 +114,10 @@ class CapacitorViewFull(StatsView):
|
||||
("label%sCapacitorRecharge", lambda: fit.capRecharge, 3, 0, 0),
|
||||
("label%sCapacitorDischarge", lambda: fit.capUsed, 3, 0, 0),
|
||||
)
|
||||
if fit:
|
||||
neut_resist = fit.ship.getModifiedItemAttr("energyWarfareResistance", 0)
|
||||
else:
|
||||
neut_resist = 0
|
||||
|
||||
panel = "Full"
|
||||
for labelName, value, prec, lowest, highest in stats:
|
||||
@@ -127,6 +131,12 @@ class CapacitorViewFull(StatsView):
|
||||
label.SetLabel(formatAmount(value, prec, lowest, highest))
|
||||
label.SetToolTip(wx.ToolTip("%.1f" % value))
|
||||
|
||||
if labelName == "label%sCapacitorDischarge":
|
||||
if neut_resist:
|
||||
neut_resist = 100 - (neut_resist * 100)
|
||||
label_tooltip = "Neut Resistance: {0:.0f}%".format(neut_resist)
|
||||
label.SetToolTip(wx.ToolTip(label_tooltip))
|
||||
|
||||
capState = fit.capState if fit is not None else 0
|
||||
capStable = fit.capStable if fit is not None else False
|
||||
lblNameTime = "label%sCapacitorTime"
|
||||
|
||||
@@ -1043,7 +1043,7 @@ class ItemAffectedBy(wx.Panel):
|
||||
container = {}
|
||||
for attrName in attributes.iterAfflictions():
|
||||
# if value is 0 or there has been no change from original to modified, return
|
||||
if attributes[attrName] == (attributes.getOriginal(attrName) or 0):
|
||||
if attributes[attrName] == (attributes.getOriginal(attrName, 0)):
|
||||
continue
|
||||
|
||||
for fit, afflictors in attributes.getAfflictions(attrName).iteritems():
|
||||
@@ -1170,7 +1170,7 @@ class ItemAffectedBy(wx.Panel):
|
||||
container = {}
|
||||
for attrName in attributes.iterAfflictions():
|
||||
# if value is 0 or there has been no change from original to modified, return
|
||||
if attributes[attrName] == (attributes.getOriginal(attrName) or 0):
|
||||
if attributes[attrName] == (attributes.getOriginal(attrName, 0)):
|
||||
continue
|
||||
|
||||
for fit, afflictors in attributes.getAfflictions(attrName).iteritems():
|
||||
|
||||
@@ -651,11 +651,11 @@ class MainFrame(wx.Frame):
|
||||
dlg.Show()
|
||||
|
||||
def toggleOverrides(self, event):
|
||||
ModifiedAttributeDict.OVERRIDES = not ModifiedAttributeDict.OVERRIDES
|
||||
ModifiedAttributeDict.overrides_enabled = not ModifiedAttributeDict.overrides_enabled
|
||||
wx.PostEvent(self, GE.FitChanged(fitID=self.getActiveFit()))
|
||||
menu = self.GetMenuBar()
|
||||
menu.SetLabel(menu.toggleOverridesId,
|
||||
"Turn Overrides Off" if ModifiedAttributeDict.OVERRIDES else "Turn Overrides On")
|
||||
"Turn Overrides Off" if ModifiedAttributeDict.overrides_enabled else "Turn Overrides On")
|
||||
|
||||
def saveChar(self, event):
|
||||
sChr = Character.getInstance()
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
import copy
|
||||
from logbook import Logger
|
||||
from time import time
|
||||
|
||||
import eos.db
|
||||
from eos.saveddata.booster import Booster as es_Booster
|
||||
@@ -1084,9 +1085,12 @@ class Fit(object):
|
||||
self.recalc(fit)
|
||||
|
||||
def recalc(self, fit, withBoosters=True):
|
||||
start_time = time()
|
||||
pyfalog.info("=" * 10 + "recalc" + "=" * 10)
|
||||
if fit.factorReload is not self.serviceFittingOptions["useGlobalForceReload"]:
|
||||
fit.factorReload = self.serviceFittingOptions["useGlobalForceReload"]
|
||||
fit.clear()
|
||||
|
||||
fit.calculateModifiedAttributes(withBoosters=False)
|
||||
|
||||
pyfalog.info("=" * 10 + "recalc time: " + str(time() - start_time) + "=" * 10)
|
||||
|
||||
@@ -229,6 +229,7 @@ class Market(object):
|
||||
"Apotheosis" : self.les_grp, # 5th EVE anniversary present
|
||||
"Zephyr" : self.les_grp, # 2010 new year gift
|
||||
"Primae" : self.les_grp, # Promotion of planetary interaction
|
||||
"Council Diplomatic Shuttle" : self.les_grp, # CSM X celebration
|
||||
"Freki" : self.les_grp, # AT7 prize
|
||||
"Mimir" : self.les_grp, # AT7 prize
|
||||
"Utu" : self.les_grp, # AT8 prize
|
||||
@@ -274,7 +275,6 @@ class Market(object):
|
||||
"Guristas Shuttle" : False,
|
||||
"Mobile Decoy Unit" : False, # Seems to be left over test mod for deployables
|
||||
"Tournament Micro Jump Unit" : False, # Normally seen only on tournament arenas
|
||||
"Council Diplomatic Shuttle" : False, # CSM X celebration
|
||||
"Civilian Gatling Railgun" : True,
|
||||
"Civilian Gatling Pulse Laser" : True,
|
||||
"Civilian Gatling Autocannon" : True,
|
||||
|
||||
@@ -29,7 +29,8 @@ pyfalog = Logger(__name__)
|
||||
|
||||
|
||||
class SettingsProvider(object):
|
||||
BASE_PATH = os.path.join(config.savePath, 'settings')
|
||||
if config.savePath:
|
||||
BASE_PATH = os.path.join(config.savePath, 'settings')
|
||||
settings = {}
|
||||
_instance = None
|
||||
|
||||
@@ -41,13 +42,15 @@ class SettingsProvider(object):
|
||||
return cls._instance
|
||||
|
||||
def __init__(self):
|
||||
if not os.path.exists(self.BASE_PATH):
|
||||
os.mkdir(self.BASE_PATH)
|
||||
if hasattr(self, 'BASE_PATH'):
|
||||
if not os.path.exists(self.BASE_PATH):
|
||||
os.mkdir(self.BASE_PATH)
|
||||
|
||||
def getSettings(self, area, defaults=None):
|
||||
|
||||
s = self.settings.get(area)
|
||||
if s is None:
|
||||
|
||||
if s is None and hasattr(self, 'BASE_PATH'):
|
||||
p = os.path.join(self.BASE_PATH, area)
|
||||
|
||||
if not os.path.exists(p):
|
||||
@@ -71,6 +74,8 @@ class SettingsProvider(object):
|
||||
info[item] = defaults[item]
|
||||
|
||||
self.settings[area] = s = Settings(p, info)
|
||||
else:
|
||||
s = None
|
||||
|
||||
return s
|
||||
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
from gui.aboutData import versionString, licenses, developers, credits, description
|
||||
|
||||
|
||||
def test_aboutData():
|
||||
assert versionString.__len__() > 0
|
||||
assert licenses.__len__() > 0
|
||||
assert developers.__len__() > 0
|
||||
assert credits.__len__() > 0
|
||||
assert description.__len__() > 0
|
||||
17
tests/test_modules/test_eos/test_gamedata.py
Normal file
17
tests/test_modules/test_eos/test_gamedata.py
Normal file
@@ -0,0 +1,17 @@
|
||||
# Add root folder to python paths
|
||||
# This must be done on every test in order to pass in Travis
|
||||
import os
|
||||
import sys
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..', '..')))
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
|
||||
from _development.helpers_fits import RifterFit, KeepstarFit
|
||||
|
||||
def test_race(DB, RifterFit, KeepstarFit):
|
||||
"""
|
||||
Test race code
|
||||
"""
|
||||
assert RifterFit.ship.item.race == 'minmatar'
|
||||
assert KeepstarFit.ship.item.race == 'upwell'
|
||||
50
tests/test_modules/test_eos/test_modifiedAttributeDict.py
Normal file
50
tests/test_modules/test_eos/test_modifiedAttributeDict.py
Normal file
@@ -0,0 +1,50 @@
|
||||
# Add root folder to python paths
|
||||
# This must be done on every test in order to pass in Travis
|
||||
import math
|
||||
import os
|
||||
import sys
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
script_dir = os.path.realpath(os.path.join(script_dir, '..', '..', '..'))
|
||||
print script_dir
|
||||
sys.path.append(script_dir)
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
|
||||
from _development.helpers_fits import RifterFit
|
||||
|
||||
def test_multiply_stacking_penalties(DB, Saveddata, RifterFit):
|
||||
"""
|
||||
Tests the stacking penalties under multiply
|
||||
"""
|
||||
char0 = Saveddata['Character'].getAll0()
|
||||
|
||||
RifterFit.character = char0
|
||||
starting_em_resist = RifterFit.ship.getModifiedItemAttr("shieldEmDamageResonance")
|
||||
|
||||
mod = Saveddata['Module'](DB['db'].getItem("EM Ward Amplifier II"))
|
||||
item_modifer = mod.item.getAttribute("emDamageResistanceBonus")
|
||||
|
||||
RifterFit.calculateModifiedAttributes()
|
||||
|
||||
for _ in range(10):
|
||||
if _ == 0:
|
||||
# First run we have no modules, se don't try and calculate them.
|
||||
calculated_resist = RifterFit.ship.getModifiedItemAttr("shieldEmDamageResonance")
|
||||
else:
|
||||
# Calculate what our next resist should be
|
||||
# Denominator: [math.exp((i / 2.67) ** 2.0) for i in xrange(8)]
|
||||
current_effectiveness = 1 / math.exp(((_ - 1) / 2.67) ** 2.0)
|
||||
new_item_modifier = 1 + ((item_modifer * current_effectiveness) / 100)
|
||||
calculated_resist = (em_resist * new_item_modifier)
|
||||
|
||||
# Add another resist module to our fit.
|
||||
RifterFit.modules.append(mod)
|
||||
|
||||
# Modify our fit so that Eos generates new numbers for us.
|
||||
RifterFit.clear()
|
||||
RifterFit.calculateModifiedAttributes()
|
||||
|
||||
em_resist = RifterFit.ship.getModifiedItemAttr("shieldEmDamageResonance")
|
||||
|
||||
assert em_resist == calculated_resist
|
||||
# print(str(em_resist) + "==" + str(calculated_resist))
|
||||
19
tests/test_modules/test_gui/test_aboutData.py
Normal file
19
tests/test_modules/test_gui/test_aboutData.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# Add root folder to python paths
|
||||
# This must be done on every test in order to pass in Travis
|
||||
import os
|
||||
import sys
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..', '..')))
|
||||
|
||||
from gui.aboutData import versionString, licenses, developers, credits, description
|
||||
|
||||
|
||||
def test_aboutData():
|
||||
"""
|
||||
Simple test to validate all about data exists
|
||||
"""
|
||||
assert versionString.__len__() > 0
|
||||
assert licenses.__len__() > 0
|
||||
assert developers.__len__() > 0
|
||||
assert credits.__len__() > 0
|
||||
assert description.__len__() > 0
|
||||
@@ -1,9 +1,16 @@
|
||||
# Add root folder to python paths
|
||||
# This must be done on every test in order to pass in Travis
|
||||
import os
|
||||
import sys
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..', '..')))
|
||||
|
||||
from service.attribute import Attribute
|
||||
|
||||
|
||||
def test_attribute():
|
||||
"""
|
||||
We don't really have much to test here, to throw a generic attribute at it and validate we get the expected results
|
||||
We don't really have much to test here, so throw a generic attribute at it and validate we get the expected results
|
||||
|
||||
:return:
|
||||
"""
|
||||
37
tests/test_modules/test_service/test_fit.py
Normal file
37
tests/test_modules/test_service/test_fit.py
Normal file
@@ -0,0 +1,37 @@
|
||||
# Add root folder to python paths
|
||||
# This must be done on every test in order to pass in Travis
|
||||
# import os
|
||||
# import sys
|
||||
# script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
# sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..', '..')))
|
||||
#
|
||||
# # noinspection PyPackageRequirements
|
||||
# from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
|
||||
# # noinspection PyPackageRequirements
|
||||
# from _development.helpers_fits import RifterFit, KeepstarFit
|
||||
# from service.fit import Fit
|
||||
#
|
||||
# # Fake import wx
|
||||
# # todo: fix this
|
||||
# # from types import ModuleType
|
||||
# # wx = ModuleType("fake_module")
|
||||
# # sys.modules[wx.__name__] = wx
|
||||
#
|
||||
# def test_getAllFits(DB, RifterFit, KeepstarFit):
|
||||
# assert len(Fit.getAllFits()) == 0
|
||||
# DB['db'].save(RifterFit)
|
||||
# assert len(Fit.getAllFits()) == 1
|
||||
# DB['db'].save(KeepstarFit)
|
||||
# assert len(Fit.getAllFits()) == 2
|
||||
#
|
||||
# # Cleanup after ourselves
|
||||
# DB['db'].remove(RifterFit)
|
||||
# DB['db'].remove(KeepstarFit)
|
||||
#
|
||||
#
|
||||
# def test_getFitsWithShip_RifterFit(DB, RifterFit):
|
||||
# DB['db'].save(RifterFit)
|
||||
#
|
||||
# assert Fit.getFitsWithShip(587)[0][1] == 'My Rifter Fit'
|
||||
#
|
||||
# DB['db'].remove(RifterFit)
|
||||
@@ -1,58 +0,0 @@
|
||||
"""import tests."""
|
||||
|
||||
import os
|
||||
import sys
|
||||
# import importlib
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
# import pytest
|
||||
|
||||
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
# Add root to python paths, this allows us to import submodules
|
||||
sys.path.append(os.path.realpath(os.path.join(script_dir, '..')))
|
||||
|
||||
# noinspection PyPep8
|
||||
import service
|
||||
# noinspection PyPep8
|
||||
import gui
|
||||
# noinspection PyPep8
|
||||
import eos
|
||||
# noinspection PyPep8
|
||||
import utils
|
||||
|
||||
|
||||
def test_packages():
|
||||
assert service
|
||||
assert gui
|
||||
assert eos
|
||||
assert utils
|
||||
|
||||
|
||||
def service_modules():
|
||||
for root, folders, files in os.walk("service"):
|
||||
for file_ in files:
|
||||
if file_.endswith(".py") and not file_.startswith("_"):
|
||||
mod_name = "{}.{}".format(
|
||||
root.replace("/", "."),
|
||||
file_.split(".py")[0],
|
||||
)
|
||||
yield mod_name
|
||||
|
||||
|
||||
def eos_modules():
|
||||
for root, folders, files in os.walk("eos"):
|
||||
for file_ in files:
|
||||
if file_.endswith(".py") and not file_.startswith("_"):
|
||||
mod_name = "{}.{}".format(
|
||||
root.replace("/", "."),
|
||||
file_.split(".py")[0],
|
||||
)
|
||||
yield mod_name
|
||||
|
||||
# TODO: Disable walk through Eos paths until eos.types is killed. eos.types causes the import to break
|
||||
'''
|
||||
@pytest.mark.parametrize("mod_name", eos_modules())
|
||||
def test_eos_imports(mod_name):
|
||||
assert importlib.import_module(mod_name)
|
||||
'''
|
||||
235
tests/test_smoketests/test_rifter.py
Normal file
235
tests/test_smoketests/test_rifter.py
Normal file
@@ -0,0 +1,235 @@
|
||||
# Add root folder to python paths
|
||||
# This must be done on every test in order to pass in Travis
|
||||
import os
|
||||
import sys
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..')))
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
|
||||
from _development.helpers_fits import RifterFit
|
||||
|
||||
|
||||
# noinspection PyShadowingNames
|
||||
def test_rifter_empty_char0(DB, Saveddata, RifterFit):
|
||||
"""
|
||||
We test an empty ship because if we use this as a base for testing our V skills,
|
||||
and CCP ever fucks with the base states, all our derived stats will be wrong.
|
||||
"""
|
||||
char0 = Saveddata['Character'].getAll0()
|
||||
|
||||
RifterFit.character = char0
|
||||
RifterFit.calculateModifiedAttributes()
|
||||
|
||||
assert RifterFit.ship.getModifiedItemAttr("agility") == 3.2
|
||||
assert RifterFit.ship.getModifiedItemAttr("armorEmDamageResonance") == 0.4
|
||||
assert RifterFit.ship.getModifiedItemAttr("armorExplosiveDamageResonance") == 0.9
|
||||
assert RifterFit.ship.getModifiedItemAttr("armorHP") == 450.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("armorKineticDamageResonance") == 0.75
|
||||
assert RifterFit.ship.getModifiedItemAttr("armorThermalDamageResonance") == 0.65
|
||||
assert RifterFit.ship.getModifiedItemAttr("armorUniformity") == 0.75
|
||||
assert RifterFit.ship.getModifiedItemAttr("baseWarpSpeed") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("capacitorCapacity") == 250.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("capacity") == 140.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("cpuLoad") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("cpuOutput") == 130.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("damage") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("droneBandwidth") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("droneCapacity") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("emDamageResonance") == 0.67
|
||||
assert RifterFit.ship.getModifiedItemAttr("explosiveDamageResonance") == 0.67
|
||||
assert RifterFit.ship.getModifiedItemAttr("fwLpKill") == 25.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("gfxBoosterID") == 397.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatAttenuationHi") == 0.63
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatAttenuationLow") == 0.5
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatAttenuationMed") == 0.5
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatCapacityHi") == 100.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatCapacityLow") == 100.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatCapacityMed") == 100.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatDissipationRateHi") == 0.01
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatDissipationRateLow") == 0.01
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatDissipationRateMed") == 0.01
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatGenerationMultiplier") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("hiSlots") == 4.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("hp") == 350.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("hullEmDamageResonance") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("hullExplosiveDamageResonance") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("hullKineticDamageResonance") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("hullThermalDamageResonance") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("kineticDamageResonance") == 0.67
|
||||
assert RifterFit.ship.getModifiedItemAttr("launcherSlotsLeft") == 2.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("lowSlots") == 3.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("mainColor") == 16777215.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("mass") == 1067000.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("maxDirectionalVelocity") == 3000.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("maxLockedTargets") == 4.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("maxPassengers") == 2.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("maxTargetRange") == 22500.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("maxVelocity") == 365.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("medSlots") == 3.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("metaLevel") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("minTargetVelDmgMultiplier") == 0.05
|
||||
assert RifterFit.ship.getModifiedItemAttr("powerLoad") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("powerOutput") == 41.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("powerToSpeed") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("propulsionGraphicID") == 397.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("radius") == 31.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("rechargeRate") == 125000.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("requiredSkill1") == 3329.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("requiredSkill1Level") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("rigSize") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("rigSlots") == 3.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("scanGravimetricStrength") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("scanLadarStrength") == 8.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("scanMagnetometricStrength") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("scanRadarStrength") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("scanResolution") == 660.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("scanSpeed") == 1500.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("shieldCapacity") == 450.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("shieldEmDamageResonance") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("shieldExplosiveDamageResonance") == 0.5
|
||||
assert RifterFit.ship.getModifiedItemAttr("shieldKineticDamageResonance") == 0.6
|
||||
assert RifterFit.ship.getModifiedItemAttr("shieldRechargeRate") == 625000.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("shieldThermalDamageResonance") == 0.8
|
||||
assert RifterFit.ship.getModifiedItemAttr("shieldUniformity") == 0.75
|
||||
assert RifterFit.ship.getModifiedItemAttr("shipBonusMF") == 5.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("shipBonusMF2") == 10.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("shipScanResistance") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("signatureRadius") == 35.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("structureUniformity") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("techLevel") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("thermalDamageResonance") == 0.67
|
||||
assert RifterFit.ship.getModifiedItemAttr("turretSlotsLeft") == 3.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("typeColorScheme") == 11342.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("uniformity") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("upgradeCapacity") == 400.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("upgradeSlotsLeft") == 3.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("volume") == 27289.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("warpCapacitorNeed") == 2.24e-06
|
||||
assert RifterFit.ship.getModifiedItemAttr("warpFactor") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("warpSpeedMultiplier") == 5.0
|
||||
|
||||
|
||||
# noinspection PyShadowingNames
|
||||
def test_rifter_empty_char5(DB, Saveddata, RifterFit):
|
||||
"""
|
||||
Test char skills applying to a ship
|
||||
"""
|
||||
char5 = Saveddata['Character'].getAll5()
|
||||
|
||||
RifterFit.character = char5
|
||||
RifterFit.calculateModifiedAttributes()
|
||||
|
||||
assert RifterFit.ship.getModifiedItemAttr("agility") == 2.16
|
||||
assert RifterFit.ship.getModifiedItemAttr("armorEmDamageResonance") == 0.4
|
||||
assert RifterFit.ship.getModifiedItemAttr("armorExplosiveDamageResonance") == 0.9
|
||||
assert RifterFit.ship.getModifiedItemAttr("armorHP") == 562.5
|
||||
assert RifterFit.ship.getModifiedItemAttr("armorKineticDamageResonance") == 0.75
|
||||
assert RifterFit.ship.getModifiedItemAttr("armorThermalDamageResonance") == 0.65
|
||||
assert RifterFit.ship.getModifiedItemAttr("armorUniformity") == 0.75
|
||||
assert RifterFit.ship.getModifiedItemAttr("baseWarpSpeed") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("capacitorCapacity") == 312.5
|
||||
assert RifterFit.ship.getModifiedItemAttr("capacity") == 140.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("cpuLoad") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("cpuOutput") == 162.5
|
||||
assert RifterFit.ship.getModifiedItemAttr("damage") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("droneBandwidth") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("droneCapacity") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("emDamageResonance") == 0.67
|
||||
assert RifterFit.ship.getModifiedItemAttr("explosiveDamageResonance") == 0.67
|
||||
assert RifterFit.ship.getModifiedItemAttr("fwLpKill") == 25.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("gfxBoosterID") == 397.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatAttenuationHi") == 0.63
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatAttenuationLow") == 0.5
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatAttenuationMed") == 0.5
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatCapacityHi") == 100.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatCapacityLow") == 100.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatCapacityMed") == 100.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatDissipationRateHi") == 0.01
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatDissipationRateLow") == 0.01
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatDissipationRateMed") == 0.01
|
||||
assert RifterFit.ship.getModifiedItemAttr("heatGenerationMultiplier") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("hiSlots") == 4.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("hp") == 437.5
|
||||
assert RifterFit.ship.getModifiedItemAttr("hullEmDamageResonance") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("hullExplosiveDamageResonance") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("hullKineticDamageResonance") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("hullThermalDamageResonance") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("kineticDamageResonance") == 0.67
|
||||
assert RifterFit.ship.getModifiedItemAttr("launcherSlotsLeft") == 2.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("lowSlots") == 3.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("mainColor") == 16777215.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("mass") == 1067000.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("maxDirectionalVelocity") == 3000.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("maxLockedTargets") == 4.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("maxPassengers") == 2.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("maxTargetRange") == 28125.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("maxVelocity") == 456.25
|
||||
assert RifterFit.ship.getModifiedItemAttr("medSlots") == 3.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("metaLevel") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("minTargetVelDmgMultiplier") == 0.05
|
||||
assert RifterFit.ship.getModifiedItemAttr("powerLoad") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("powerOutput") == 51.25
|
||||
assert RifterFit.ship.getModifiedItemAttr("powerToSpeed") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("propulsionGraphicID") == 397.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("radius") == 31.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("rechargeRate") == 93750.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("requiredSkill1") == 3329.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("requiredSkill1Level") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("rigSize") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("rigSlots") == 3.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("scanGravimetricStrength") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("scanLadarStrength") == 9.6
|
||||
assert RifterFit.ship.getModifiedItemAttr("scanMagnetometricStrength") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("scanRadarStrength") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("scanResolution") == 825.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("scanSpeed") == 1500.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("shieldCapacity") == 562.5
|
||||
assert RifterFit.ship.getModifiedItemAttr("shieldEmDamageResonance") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("shieldExplosiveDamageResonance") == 0.5
|
||||
assert RifterFit.ship.getModifiedItemAttr("shieldKineticDamageResonance") == 0.6
|
||||
assert RifterFit.ship.getModifiedItemAttr("shieldRechargeRate") == 468750.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("shieldThermalDamageResonance") == 0.8
|
||||
assert RifterFit.ship.getModifiedItemAttr("shieldUniformity") == 1
|
||||
assert RifterFit.ship.getModifiedItemAttr("shipBonusMF") == 5.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("shipBonusMF2") == 10.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("shipScanResistance") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("signatureRadius") == 35.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("structureUniformity") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("techLevel") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("thermalDamageResonance") == 0.67
|
||||
assert RifterFit.ship.getModifiedItemAttr("turretSlotsLeft") == 3.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("typeColorScheme") == 11342.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("uniformity") == 1.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("upgradeCapacity") == 400.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("upgradeSlotsLeft") == 3.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("volume") == 27289.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("warpCapacitorNeed") == 1.12e-06
|
||||
assert RifterFit.ship.getModifiedItemAttr("warpFactor") == 0.0
|
||||
assert RifterFit.ship.getModifiedItemAttr("warpSpeedMultiplier") == 5.0
|
||||
|
||||
|
||||
# noinspection PyShadowingNames
|
||||
def test_rifter_coprocessor(DB, Saveddata, RifterFit):
|
||||
char5 = Saveddata['Character'].getAll5()
|
||||
char0 = Saveddata['Character'].getAll0()
|
||||
|
||||
RifterFit.character = char0
|
||||
mod = Saveddata['Module'](DB['db'].getItem("Co-Processor II"))
|
||||
mod.state = Saveddata['State'].OFFLINE
|
||||
RifterFit.modules.append(mod)
|
||||
|
||||
assert RifterFit.ship.getModifiedItemAttr("cpuOutput") == 130
|
||||
|
||||
RifterFit.calculateModifiedAttributes()
|
||||
assert RifterFit.ship.getModifiedItemAttr("cpuOutput") == 130
|
||||
|
||||
mod.state = Saveddata['State'].ONLINE
|
||||
RifterFit.clear()
|
||||
RifterFit.calculateModifiedAttributes()
|
||||
assert RifterFit.ship.getModifiedItemAttr("cpuOutput") == 143
|
||||
|
||||
RifterFit.character = char5
|
||||
RifterFit.clear()
|
||||
RifterFit.calculateModifiedAttributes()
|
||||
assert RifterFit.ship.getModifiedItemAttr("cpuOutput") == 178.75
|
||||
Reference in New Issue
Block a user