Compare commits

...

69 Commits

Author SHA1 Message Date
DarkPhoenix
368f2c33a9 Attempt to work around postgres issue on linux 2023-11-14 19:45:22 +06:00
DarkPhoenix
c445bb4423 Add some debug commands to work around postgres issue in image 2023-11-14 19:28:44 +06:00
DarkPhoenix
4b932d210f Bump version 2023-11-14 18:54:09 +06:00
DarkPhoenix
a1ca29fb30 Update effects 2023-11-14 18:53:50 +06:00
DarkPhoenix
876c85ee19 Update icons 2023-11-14 18:41:56 +06:00
DarkPhoenix
ac1d935712 Update static data to 2420589 2023-11-14 18:39:57 +06:00
DarkPhoenix
2ccc829d3b Merge branch 'singularity' 2023-11-14 18:39:01 +06:00
DarkPhoenix
d127dd9a7e Implement RR diminishing returns 2023-11-13 21:45:40 +06:00
DarkPhoenix
e5d95dd4d8 Fix something which was not supposed to be committed 2023-10-31 00:06:31 +06:00
DarkPhoenix
08c5c9a4b7 Fix an omission 2023-10-31 00:05:21 +06:00
DarkPhoenix
a484698a9d Add option to export implants/boosters via ESI 2023-10-31 00:01:16 +06:00
DarkPhoenix
bafaed1d81 Fix character editor search crash 2023-10-30 23:33:35 +06:00
DarkPhoenix
02f7fbf1b1 Do not stacking penalize shield/armor HP bonuses 2023-10-23 06:46:00 +06:00
DarkPhoenix
3ed85112c6 Bump version 2023-10-19 05:45:24 +06:00
DarkPhoenix
fed39b75e3 Add new icons 2023-10-19 05:44:08 +06:00
DarkPhoenix
8a3defded5 Update metadata and effects to 2395039 2023-10-19 05:42:31 +06:00
DarkPhoenix
88970c7a95 Bump version 2023-10-10 02:50:42 +06:00
DarkPhoenix
fddaf27055 Update icons 2023-10-10 02:47:00 +06:00
DarkPhoenix
dd575bd3a0 Update static data and effects 2023-10-10 02:43:44 +06:00
DarkPhoenix
0c9b73727b Fix DD weapon application 2023-10-10 00:15:47 +06:00
DarkPhoenix
ade9fc389a Bump version 2023-09-19 23:52:50 +03:00
DarkPhoenix
b6c5f67085 Update effects 2023-09-19 23:52:24 +03:00
DarkPhoenix
7d86d58993 Add new icons 2023-09-19 23:34:33 +03:00
DarkPhoenix
a7ab046bc6 Update static data to 2363654 2023-09-19 23:11:22 +03:00
DarkPhoenix
c94693a72d Update icons 2023-09-10 17:30:41 +06:00
DarkPhoenix
ea335b7d41 Bump version 2023-09-10 09:12:59 +06:00
DarkPhoenix
4838f69c40 Add effects for new AT ships 2023-09-10 09:12:29 +06:00
DarkPhoenix
fb81e6c043 Add shapash/cybele hardcoded ships 2023-09-10 08:38:39 +06:00
DarkPhoenix
84716af82b Update effect file 2023-09-10 07:09:28 +06:00
DarkPhoenix
30dd77d462 Add renames 2023-09-10 07:03:24 +06:00
DarkPhoenix
9148611a8e Update static data to 2353888 2023-09-10 06:51:03 +06:00
DarkPhoenix
e7be51b70e Remove evepraiisal market source 2023-09-10 05:44:17 +06:00
DarkPhoenix
194e4657eb Fix appimage build 2023-06-14 05:30:12 +06:00
DarkPhoenix
b08986ba74 Duration is not penalized 2023-06-14 01:09:46 +06:00
DarkPhoenix
57d8a672d9 Fix rep systems-related effect stacking penalties 2023-06-14 01:05:16 +06:00
DarkPhoenix
47dbfbd6d5 Bump version 2023-06-13 22:01:44 +06:00
DarkPhoenix
cbbf4863fb Update static data 2023-06-13 21:56:47 +06:00
DarkPhoenix
369f62bd68 Bump version 2023-06-11 04:34:01 +06:00
DarkPhoenix
885ad4deb3 Update effects 2023-06-11 04:28:18 +06:00
DarkPhoenix
0ce3b861a4 Update EVE images 2023-06-11 00:28:05 +06:00
DarkPhoenix
48ee543c00 Update static data to 2291839 2023-06-11 00:26:27 +06:00
Anton Vorobyov
e07e2bc4f7 Merge pull request #2507 from superusercode/patch-1
Replace dead README badges with current CI badge
2023-06-10 21:19:57 +04:00
Code
17dec4d732 Update README.md 2023-05-11 21:36:00 -04:00
Anton Vorobyov
effb7e6429 Bump version 2023-04-28 01:49:55 +06:00
Anton Vorobyov
63f7762e34 Add option to export missing skills in roman / evemon format 2023-04-28 01:49:31 +06:00
Anton Vorobyov
76ff52aea8 Show seconds, not milliseconds 2023-04-28 01:38:26 +06:00
Anton Vorobyov
cd12279404 Add ADC ability duration 2023-04-28 01:36:45 +06:00
Anton Vorobyov
263929b6e3 Update icons 2023-04-28 01:33:03 +06:00
Anton Vorobyov
759135d3fe Add auto targeting system as acronym 2023-04-28 01:31:32 +06:00
Anton Vorobyov
d240f547cc Update effects & add mobiile depot hold 2023-04-28 01:28:55 +06:00
Anton Vorobyov
0a4f3481da Update static data to 2258955 2023-04-27 23:06:33 +06:00
Anton Vorobyov
b248cdefdd Bump version 2023-03-16 17:50:33 +06:00
Anton Vorobyov
6172ceda0f Update static data to 2232464 2023-03-16 17:25:10 +06:00
Anton Vorobyov
ba236bcb54 Update static data and effects to 2228687 2023-03-10 02:26:12 +06:00
Anton Vorobyov
b4e115eb7b Update icons 2023-02-22 19:07:51 +06:00
Anton Vorobyov
52b567a06d Disable effect overrides for AT18 ships, and add effects for them 2023-02-22 19:06:59 +06:00
Anton Vorobyov
dd1f7e224c Update static data to 2218819 2023-02-22 18:12:42 +06:00
Anton Vorobyov
338b298077 Specify requests version 2023-02-18 03:57:42 +06:00
Anton Vorobyov
512b370e3e Bump version 2023-02-14 19:26:03 +06:00
Anton Vorobyov
a14210f356 Add rename mapping 2023-02-14 19:25:45 +06:00
Anton Vorobyov
f81cf4ee7b Update effects 2023-02-14 19:22:15 +06:00
Anton Vorobyov
87b072b567 Update static data to 2214901 2023-02-14 19:18:36 +06:00
Anton Vorobyov
e21789d29c Fix fof missile application hardwiring 2022-12-21 00:16:45 +04:00
Anton Vorobyov
dd93f348e6 Fix loki SB heat bonus 2022-12-21 00:12:03 +04:00
Anton Vorobyov
cae8088ad3 Bump version 2022-12-18 04:47:57 +04:00
Anton Vorobyov
a92cbe92f1 Update static data 2022-12-18 04:47:25 +04:00
Anton Vorobyov
52fd0bb13f Fix fighters export 2022-12-12 04:50:28 +04:00
Anton Vorobyov
afcddeea70 Bump appimage version 2022-12-11 14:04:12 +04:00
Anton Vorobyov
e5eb001cf3 Fix bestla rof bonus and bump version 2022-12-11 13:49:36 +04:00
128 changed files with 245316 additions and 38737 deletions

View File

@@ -11,7 +11,7 @@ for:
environment:
APPVEYOR_SSH_KEY: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJDW/+oYNGOiPvwuwAL9tc/LQgg58aosIVpMYfepQZ20V+VZnHpZh8IRDA8Jo5xht19p2PksA+hFgqA0kpKtrSkuiWdE8rATQItfk4gf7yB0yGasJGGQZYazy9k/9XtmYkq2HHOOeEqdxvrICddJQ88MLCLT9lJENSUP/YS/yGcjZFXVxE11pTeIcqlCRU+3eYa1v7BeNvXIKNhZoK5orXWrtuH3cy8jrSns/u70aYfJ6B2jA8CnWnDbuvpeQtEY61SQqlKUsSArNa8NAsXj41wr3Ar9gAG9330w7EMTqlutk8HZO35uHI0q5qinUhaQYufPPrVkb2L/N+ZCfu0fnh appveyor"
APPIMAGE_TOOL: appimagetool-x86_64.AppImage
PYTHON_APPIMAGE: python3.7.15-cp37-cp37m-manylinux2014_x86_64.AppImage
PYTHON_APPIMAGE: python3.7.17-cp37-cp37m-manylinux2014_x86_64.AppImage
DEPLOY_DIR: AppDir/opt/pyfa
# APPVEYOR_SSH_BLOCK: true
cache:
@@ -20,6 +20,7 @@ for:
- sh: curl -sflL 'https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-ssh.sh' | bash -e -
install:
- sh: git fetch --prune --unshallow # to fix the version dump issues
- sh: sudo DEBIAN_FRONTEND=noninteractive sed -i '/postgres/d' /etc/apt/sources.list # As of 2023-11-14, postgres repo fail to update, but we don't need them anyway
- sh: sudo DEBIAN_FRONTEND=noninteractive apt-get -y update
- sh: sudo DEBIAN_FRONTEND=noninteractive apt-get -y install python3.7-dev libgtk-3-dev python3-pip libwebkit2gtk-4.0-dev
before_build:

View File

@@ -1,6 +1,6 @@
# pyfa
[![Join us on Slack!](https://pyfainvite.azurewebsites.net/badge.svg)](https://pyfainvite.azurewebsites.net/) [![Build Status](https://travis-ci.org/pyfa-org/Pyfa.svg?branch=master)](https://travis-ci.org/pyfa-org/Pyfa)
[![Build Status](https://ci.appveyor.com/api/projects/status/github/pyfa-org/pyfa?branch=master&svg=true)]([https://travis-ci.org/pyfa-org/Pyfa](https://ci.appveyor.com/project/pyfa-org/pyfa))
![pyfa](https://user-images.githubusercontent.com/275209/66119992-864be080-e5e2-11e9-994a-3a4368c9fad7.png)

View File

@@ -617,6 +617,16 @@ def update_db():
eos.db.gamedata_session.delete(cat)
# Unused normally, can be useful for customizing items
def _copyItem(srcName, tgtTypeID, tgtName):
eveType = eos.db.gamedata_session.query(eos.gamedata.Item).filter(eos.gamedata.Item.name == srcName).one()
eos.db.gamedata_session.expunge(eveType)
sqlalchemy.orm.make_transient(eveType)
eveType.ID = tgtTypeID
for suffix in eos.config.translation_mapping.values():
setattr(eveType, f'typeName{suffix}', tgtName)
eos.db.gamedata_session.add(eveType)
eos.db.gamedata_session.flush()
def _hardcodeAttribs(typeID, attrMap):
for attrName, value in attrMap.items():
try:
@@ -625,7 +635,7 @@ def update_db():
except sqlalchemy.orm.exc.NoResultFound:
attrInfo = eos.db.gamedata_session.query(eos.gamedata.AttributeInfo).filter(eos.gamedata.AttributeInfo.name == attrName).one()
attr = eos.gamedata.Attribute()
attr.ID = attrInfo.ID
attr.attributeID = attrInfo.ID
attr.typeID = typeID
attr.value = value
eos.db.gamedata_session.add(attr)
@@ -641,139 +651,151 @@ def update_db():
effect.effectName = effectName
item.effects[effectName] = effect
def hardcodeGeri():
def hardcodeShapash():
shapashTypeID = 1000000
_copyItem(srcName='Utu', tgtTypeID=shapashTypeID, tgtName='Shapash')
attrMap = {
# Fitting
'powerOutput': 50,
'cpuOutput': 200,
'capacitorCapacity': 325,
'rechargeRate': 130000,
'cpuOutput': 225,
'capacitorCapacity': 420,
'rechargeRate': 187500,
# Slots
'hiSlots': 5,
'hiSlots': 3,
'medSlots': 4,
'lowSlots': 4,
'launcherSlotsLeft': 3,
'turretSlotsLeft': 2,
'launcherSlotsLeft': 0,
'turretSlotsLeft': 3,
# Rigs
'rigSlots': 2,
'rigSize': 1,
'upgradeCapacity': 400,
# Shield
'shieldCapacity': 1000,
'shieldEmDamageResonance': 1 - 0.75,
'shieldCapacity': 575,
'shieldRechargeRate': 625000,
'shieldEmDamageResonance': 1 - 0.0,
'shieldThermalDamageResonance': 1 - 0.6,
'shieldKineticDamageResonance': 1 - 0.4,
'shieldKineticDamageResonance': 1 - 0.85,
'shieldExplosiveDamageResonance': 1 - 0.5,
# Armor
'armorHP': 1000,
'armorEmDamageResonance': 1 - 0.9,
'armorHP': 1015,
'armorEmDamageResonance': 1 - 0.5,
'armorThermalDamageResonance': 1 - 0.675,
'armorKineticDamageResonance': 1 - 0.25,
'armorKineticDamageResonance': 1 - 0.8375,
'armorExplosiveDamageResonance': 1 - 0.1,
# Structure
'hp': 700,
'hp': 1274,
'emDamageResonance': 1 - 0.33,
'thermalDamageResonance': 1 - 0.33,
'kineticDamageResonance': 1 - 0.33,
'explosiveDamageResonance': 1 - 0.33,
'mass': 1309000,
'volume': 27289,
'capacity': 260,
'mass': 1215000,
'volume': 29500,
'capacity': 165,
# Navigation
'maxVelocity': 440,
'agility': 2.5,
'maxVelocity': 325,
'agility': 3.467,
'warpSpeedMultiplier': 5.5,
# Drones
'droneCapacity': 50,
'droneBandwidth': 10,
'droneCapacity': 75,
'droneBandwidth': 25,
# Targeting
'maxTargetRange': 42000,
'maxTargetRange': 49000,
'maxLockedTargets': 6,
'scanRadarStrength': 0,
'scanLadarStrength': 12,
'scanMagnetometricStrength': 0,
'scanLadarStrength': 0,
'scanMagnetometricStrength': 9,
'scanGravimetricStrength': 0,
'signatureRadius': 33,
'scanResolution': 770}
'signatureRadius': 39,
'scanResolution': 550,
# Misc
'energyWarfareResistance': 0,
'stasisWebifierResistance': 0,
'weaponDisruptionResistance': 0}
effectMap = {
100100: 'pyfaCustomGeriAfExploVel',
100101: 'pyfaCustomGeriAfRof',
100102: 'pyfaCustomGeriMfDmg',
100103: 'pyfaCustomGeriMfRep',
100104: 'pyfaCustomGeriRoleWebDroneStr',
100105: 'pyfaCustomGeriRoleWebDroneHP',
100106: 'pyfaCustomGeriRoleWebDroneSpeed',
100107: 'pyfaCustomGeriRoleMWDSigBloom'}
_hardcodeAttribs(74141, attrMap)
_hardcodeEffects(74141, effectMap)
100100: 'pyfaCustomShapashAfArAmount',
100101: 'pyfaCustomShapashAfShtTrackingOptimal',
100102: 'pyfaCustomShapashGfShtDamage',
100103: 'pyfaCustomShapashGfPointRange',
100104: 'pyfaCustomShapashGfPropOverheat',
100105: 'pyfaCustomShapashRolePlateMass',
100106: 'pyfaCustomShapashRoleHeat'}
_hardcodeAttribs(shapashTypeID, attrMap)
_hardcodeEffects(shapashTypeID, effectMap)
def hardcodeBestla():
def hardcodeCybele():
cybeleTypeID = 1000001
_copyItem(srcName='Adrestia', tgtTypeID=cybeleTypeID, tgtName='Cybele')
attrMap = {
# Fitting
'powerOutput': 1300,
'cpuOutput': 500,
'capacitorCapacity': 1500,
'rechargeRate': 200000,
'hiSlots': 6,
'medSlots': 5,
'lowSlots': 5,
'launcherSlotsLeft': 4,
'turretSlotsLeft': 2,
'powerOutput': 1284,
'cpuOutput': 400,
'capacitorCapacity': 2400,
'rechargeRate': 334000,
'hiSlots': 5,
'medSlots': 4,
'lowSlots': 6,
'launcherSlotsLeft': 0,
'turretSlotsLeft': 5,
# Rigs
'rigSlots': 2,
'rigSize': 2,
'upgradeCapacity': 400,
# Shield
'shieldCapacity': 3000,
'shieldEmDamageResonance': 1 - 0.75,
'shieldThermalDamageResonance': 1 - 0.6,
'shieldKineticDamageResonance': 1 - 0.4,
'shieldCapacity': 1200,
'shieldRechargeRate': 1250000,
'shieldEmDamageResonance': 1 - 0.0,
'shieldThermalDamageResonance': 1 - 0.5,
'shieldKineticDamageResonance': 1 - 0.9,
'shieldExplosiveDamageResonance': 1 - 0.5,
# Armor
'armorHP': 3000,
'armorEmDamageResonance': 1 - 0.9,
'armorThermalDamageResonance': 1 - 0.675,
'armorKineticDamageResonance': 1 - 0.25,
'armorHP': 1900,
'armorEmDamageResonance': 1 - 0.5,
'armorThermalDamageResonance': 1 - 0.69,
'armorKineticDamageResonance': 1 - 0.85,
'armorExplosiveDamageResonance': 1 - 0.1,
# Structure
'hp': 1600,
'hp': 2300,
'emDamageResonance': 1 - 0.33,
'thermalDamageResonance': 1 - 0.33,
'kineticDamageResonance': 1 - 0.33,
'explosiveDamageResonance': 1 - 0.33,
'mass': 11650000,
'volume': 96000,
'capacity': 660,
'mass': 11100000,
'volume': 112000,
'capacity': 450,
# Navigation
'maxVelocity': 300,
'agility': 0.47,
'maxVelocity': 235,
'agility': 0.457,
'warpSpeedMultiplier': 4.5,
# Drones
'droneCapacity': 125,
'droneBandwidth': 20,
'droneCapacity': 100,
'droneBandwidth': 50,
# Targeting
'maxTargetRange': 80000,
'maxLockedTargets': 7,
'maxTargetRange': 60000,
'maxLockedTargets': 6,
'scanRadarStrength': 0,
'scanLadarStrength': 22,
'scanMagnetometricStrength': 0,
'scanLadarStrength': 0,
'scanMagnetometricStrength': 15,
'scanGravimetricStrength': 0,
'signatureRadius': 120,
'scanResolution': 340}
'signatureRadius': 115,
'scanResolution': 330,
# Misc
'energyWarfareResistance': 0,
'stasisWebifierResistance': 0,
'weaponDisruptionResistance': 0}
effectMap = {
100200: 'pyfaCustomBestlaHacExploVel',
100201: 'pyfaCustomBestlaHacRof',
100202: 'pyfaCustomBestlaMcDmg',
100203: 'pyfaCustomBestlaMcRep',
100204: 'pyfaCustomBestlaRoleWebDroneStr',
100205: 'pyfaCustomBestlaRoleWebDroneHP',
100206: 'pyfaCustomBestlaRoleWebDroneSpeed'}
_hardcodeAttribs(74316, attrMap)
_hardcodeEffects(74316, effectMap)
hardcodeGeri()
hardcodeBestla()
100200: 'pyfaCustomCybeleHacMhtFalloff',
100201: 'pyfaCustomCybeleHacMhtTracking',
100202: 'pyfaCustomCybeleGcMhtDamage',
100203: 'pyfaCustomCybeleGcArAmount',
100204: 'pyfaCustomCybeleGcPointRange',
100205: 'pyfaCustomCybeleRoleVelocity',
100206: 'pyfaCustomCybeleRolePlateMass'}
_hardcodeAttribs(cybeleTypeID, attrMap)
_hardcodeEffects(cybeleTypeID, effectMap)
hardcodeShapash()
hardcodeCybele()
eos.db.gamedata_session.commit()
eos.db.gamedata_engine.execute('VACUUM')

File diff suppressed because it is too large Load Diff

View File

@@ -159,6 +159,12 @@ class Fit:
self.gangBoosts = None
self.__ecmProjectedList = []
self.commandBonuses = {}
# Reps received, as a list of (amount, cycle time in seconds)
self._hullRr = []
self._armorRr = []
self._armorRrPreSpool = []
self._armorRrFullSpool = []
self._shieldRr = []
def clearFactorReloadDependentData(self):
# Here we clear all data known to rely on cycle parameters
@@ -550,6 +556,12 @@ class Fit:
if stuff is not None and stuff != self:
stuff.clear()
self._hullRr.clear()
self._armorRr.clear()
self._armorRrPreSpool.clear()
self._armorRrFullSpool.clear()
self._shieldRr.clear()
# If this is the active fit that we are clearing, not a projected fit,
# then this will run and clear the projected ships and flag the next
# iteration to skip this part to prevent recursion.
@@ -621,7 +633,7 @@ class Fit:
"duration", value)
if warfareBuffID == 12: # Shield Burst: Shield Extension: Shield HP
self.ship.boostItemAttr("shieldCapacity", value, stackingPenalties=True)
self.ship.boostItemAttr("shieldCapacity", value)
if warfareBuffID == 13: # Armor Burst: Armor Energizing: Armor Resistance
for damageType in ("Em", "Thermal", "Explosive", "Kinetic"):
@@ -640,7 +652,7 @@ class Fit:
"duration", value)
if warfareBuffID == 15: # Armor Burst: Armor Reinforcement: Armor HP
self.ship.boostItemAttr("armorHP", value, stackingPenalties=True)
self.ship.boostItemAttr("armorHP", value)
if warfareBuffID == 16: # Information Burst: Sensor Optimization: Scan Resolution
self.ship.boostItemAttr("scanResolution", value, stackingPenalties=True)
@@ -734,7 +746,7 @@ class Fit:
self.ship.boostItemAttr(attr, value, stackingPenalties=True)
if warfareBuffID == 42: # Erebus Effect Generator : Armor HP bonus
self.ship.boostItemAttr("armorHP", value, stackingPenalties=True)
self.ship.boostItemAttr("armorHP", value)
if warfareBuffID == 43: # Erebus Effect Generator : Explosive resistance bonus
for attr in ("armorExplosiveDamageResonance", "shieldExplosiveDamageResonance", "explosiveDamageResonance"):
@@ -756,7 +768,7 @@ class Fit:
self.ship.boostItemAttr(attr, value, stackingPenalties=True)
if warfareBuffID == 48: # Leviathan Effect Generator : Shield HP bonus
self.ship.boostItemAttr("shieldCapacity", value, stackingPenalties=True)
self.ship.boostItemAttr("shieldCapacity", value)
if warfareBuffID == 49: # Leviathan Effect Generator : EM resistance bonus
for attr in ("armorEmDamageResonance", "shieldEmDamageResonance", "emDamageResonance"):
@@ -1478,11 +1490,11 @@ class Fit:
def tank(self):
reps = {
"passiveShield": self.calculateShieldRecharge(),
"shieldRepair": self.extraAttributes["shieldRepair"],
"armorRepair": self.extraAttributes["armorRepair"],
"armorRepairPreSpool": self.extraAttributes["armorRepairPreSpool"],
"armorRepairFullSpool": self.extraAttributes["armorRepairFullSpool"],
"hullRepair": self.extraAttributes["hullRepair"]
"shieldRepair": self.extraAttributes["shieldRepair"] + self._getAppliedShieldRr(),
"armorRepair": self.extraAttributes["armorRepair"] + self._getAppliedArmorRr(),
"armorRepairPreSpool": self.extraAttributes["armorRepairPreSpool"] + self._getAppliedArmorPreSpoolRr(),
"armorRepairFullSpool": self.extraAttributes["armorRepairFullSpool"] + self._getAppliedArmorFullSpoolRr(),
"hullRepair": self.extraAttributes["hullRepair"] + self._getAppliedHullRr()
}
return reps
@@ -1519,11 +1531,11 @@ class Fit:
if self.__sustainableTank is None:
sustainable = {
"passiveShield": self.calculateShieldRecharge(),
"shieldRepair": self.extraAttributes["shieldRepair"],
"armorRepair": self.extraAttributes["armorRepair"],
"armorRepairPreSpool": self.extraAttributes["armorRepairPreSpool"],
"armorRepairFullSpool": self.extraAttributes["armorRepairFullSpool"],
"hullRepair": self.extraAttributes["hullRepair"]
"shieldRepair": self.extraAttributes["shieldRepair"] + self._getAppliedShieldRr(),
"armorRepair": self.extraAttributes["armorRepair"] + self._getAppliedArmorRr(),
"armorRepairPreSpool": self.extraAttributes["armorRepairPreSpool"] + self._getAppliedArmorPreSpoolRr(),
"armorRepairFullSpool": self.extraAttributes["armorRepairFullSpool"] + self._getAppliedArmorFullSpoolRr(),
"hullRepair": self.extraAttributes["hullRepair"] + self._getAppliedHullRr()
}
if not self.capStable or self.factorReload:
# Map a local repairer type to the attribute it uses
@@ -1760,6 +1772,38 @@ class Fit:
mults.setdefault(stackingGroup, []).append((1 + strength / 100, None))
return calculateMultiplier(mults)
def _getAppliedHullRr(self):
return self.__getAppliedRr(self._hullRr)
def _getAppliedArmorRr(self):
return self.__getAppliedRr(self._armorRr)
def _getAppliedArmorPreSpoolRr(self):
return self.__getAppliedRr(self._armorRrPreSpool)
def _getAppliedArmorFullSpoolRr(self):
return self.__getAppliedRr(self._armorRrFullSpool)
def _getAppliedShieldRr(self):
return self.__getAppliedRr(self._shieldRr)
@staticmethod
def __getAppliedRr(rrList):
totalRaw = 0
for amount, cycleTime in rrList:
# That's right, for considerations of RR diminishing returns cycle time is rounded this way
totalRaw += amount / int(cycleTime)
RR_ADDITION = 7000
RR_MULTIPLIER = 10
appliedRr = 0
for amount, cycleTime in rrList:
rrps = amount / int(cycleTime)
modified_rrps = RR_ADDITION + (rrps * RR_MULTIPLIER)
rrps_mult = 1 - (((rrps + modified_rrps) / (totalRaw + modified_rrps)) - 1) ** 2
appliedRr += rrps_mult * amount / cycleTime
return appliedRr
def __deepcopy__(self, memo=None):
fitCopy = Fit()
# Character and owner are not copied

View File

@@ -477,7 +477,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M
# Some delay attributes have non-0 default value, so we have to pick according to effects
if {'superWeaponAmarr', 'superWeaponCaldari', 'superWeaponGallente', 'superWeaponMinmatar', 'lightningWeapon'}.intersection(self.item.effects):
dmgDelay = self.getModifiedItemAttr("damageDelayDuration", 0)
elif {'doomsdayBeamDOT', 'doomsdaySlash', 'doomsdayConeDOT'}.intersection(self.item.effects):
elif {'doomsdayBeamDOT', 'doomsdaySlash', 'doomsdayConeDOT', 'debuffLance'}.intersection(self.item.effects):
dmgDelay = self.getModifiedItemAttr("doomsdayWarningDuration", 0)
else:
dmgDelay = 0

View File

@@ -211,7 +211,7 @@ def getDoomsdayMult(mod, tgt, distance, tgtSigRadius):
# Disallow only against subcaps, allow against caps and tgt profiles
if tgt.isFit and not tgt.item.ship.item.requiresSkill('Capital Ships'):
return 0
damageSig = mod.getModifiedItemAttr('doomsdayDamageRadius') or mod.getModifiedItemAttr('signatureRadius')
damageSig = mod.getModifiedItemAttr('signatureRadius')
if not damageSig:
return 1
return min(1, tgtSigRadius / damageSig)

View File

@@ -127,7 +127,9 @@ class TargetingMiscViewMinimal(StatsView):
("specialSalvageHoldCapacity", _t("Salvage hold")),
("specialCommandCenterHoldCapacity", _t("Command center hold")),
("specialPlanetaryCommoditiesHoldCapacity", _t("Planetary goods hold")),
("specialQuafeHoldCapacity", _t("Quafe hold"))))
("specialQuafeHoldCapacity", _t("Quafe hold")),
("specialMobileDepotHoldCapacity", _t("Mobile depot hold")),
))
cargoValues = {
"main": lambda: fit.ship.getModifiedItemAttr("capacity"),
@@ -148,7 +150,8 @@ class TargetingMiscViewMinimal(StatsView):
"specialSalvageHoldCapacity": lambda: fit.ship.getModifiedItemAttr("specialSalvageHoldCapacity"),
"specialCommandCenterHoldCapacity": lambda: fit.ship.getModifiedItemAttr("specialCommandCenterHoldCapacity"),
"specialPlanetaryCommoditiesHoldCapacity": lambda: fit.ship.getModifiedItemAttr("specialPlanetaryCommoditiesHoldCapacity"),
"specialQuafeHoldCapacity": lambda: fit.ship.getModifiedItemAttr("specialQuafeHoldCapacity")
"specialQuafeHoldCapacity": lambda: fit.ship.getModifiedItemAttr("specialQuafeHoldCapacity"),
"specialMobileDepotHoldCapacity": lambda: fit.ship.getModifiedItemAttr("specialMobileDepotHoldCapacity"),
}
stats = (("labelTargets", {"main": lambda: fit.maxTargets}, 3, 0, 0, ""),

View File

@@ -182,6 +182,13 @@ class Miscellanea(ViewColumn):
text = "{0} | {1}".format(formatAmount(strength, 3, 0, 3), formatAmount(coherence, 3, 0, 3))
tooltip = "Virus strength and coherence"
return text, tooltip
elif itemGroup == "Damage Control":
duration = stuff.getModifiedItemAttr("duration")
if not duration:
return "", None
text = "{0}s".format(formatAmount(duration / 1000, 3, 0, 0))
tooltip = "Assault ability duration"
return text, tooltip
elif itemGroup in ("Warp Scrambler", "Warp Core Stabilizer", "Structure Warp Scrambler"):
scramStr = stuff.getModifiedItemAttr("warpScrambleStrength")
if not scramStr:

View File

@@ -516,7 +516,10 @@ class SkillTreeView(wx.Panel):
def populateSkillTreeSkillSearch(self, event=None):
sChar = Character.getInstance()
char = self.charEditor.entityEditor.getActiveEntity()
search = self.searchInput.GetLineText(0)
try:
search = self.searchInput.GetLineText(0)
except AttributeError:
search = self.searchInput.GetValue()
root = self.root
tree = self.skillTreeListCtrl

View File

@@ -22,6 +22,7 @@ import traceback
# noinspection PyPackageRequirements
import wx
import roman
from logbook import Logger
import config
@@ -105,6 +106,9 @@ class CharacterSelection(wx.Panel):
exportItem = menu.Append(wx.ID_ANY, _t("Copy Missing Skills"))
self.Bind(wx.EVT_MENU, self.exportSkills, exportItem)
exportItem = menu.Append(wx.ID_ANY, _t("Copy Missing Skills (EVEMon)"))
self.Bind(wx.EVT_MENU, self.exportSkillsEveMon, exportItem)
self.PopupMenu(menu, pos)
event.Skip()
@@ -264,6 +268,15 @@ class CharacterSelection(wx.Panel):
toClipboard(list)
def exportSkillsEveMon(self, evt):
skillsMap = self._buildSkillsTooltipCondensed(self.reqs, skillsMap={})
list = ""
for key in sorted(skillsMap):
list += "%s %s\n" % (key, roman.toRoman(skillsMap[key][0]))
toClipboard(list)
def _buildSkillsTooltip(self, reqs, currItem="", tabulationLevel=0):
tip = ""
sCharacter = Character.getInstance()

View File

@@ -193,7 +193,7 @@ class CopySelectDialog(wx.Dialog):
def exportEsi(self, options, callback):
fit = getFit(self.mainFrame.getActiveFit())
Port.exportESI(fit, True, callback)
Port.exportESI(fit, False, False, False, callback)
def exportXml(self, options, callback):
fit = getFit(self.mainFrame.getActiveFit())

View File

@@ -283,7 +283,7 @@ class ExportToEve(AuxiliaryFrame):
def __init__(self, parent):
super().__init__(
parent, id=wx.ID_ANY, title=_t("Export fit to EVE"), pos=wx.DefaultPosition,
size=wx.Size(400, 140) if "wxGTK" in wx.PlatformInfo else wx.Size(350, 115), resizeable=True)
size=wx.Size(400, 175) if "wxGTK" in wx.PlatformInfo else wx.Size(350, 145), resizeable=True)
self.mainFrame = parent
@@ -305,6 +305,16 @@ class ExportToEve(AuxiliaryFrame):
self.exportChargesCb.Bind(wx.EVT_CHECKBOX, self.OnChargeExportChange)
mainSizer.Add(self.exportChargesCb, 0, 0, 5)
self.exportImplantsCb = wx.CheckBox(self, wx.ID_ANY, _t('Export Implants'), wx.DefaultPosition, wx.DefaultSize, 0)
self.exportImplantsCb.SetValue(EsiSettings.getInstance().get('exportImplants'))
self.exportImplantsCb.Bind(wx.EVT_CHECKBOX, self.OnImplantsExportChange)
mainSizer.Add(self.exportImplantsCb, 0, 0, 5)
self.exportBoostersCb = wx.CheckBox(self, wx.ID_ANY, _t('Export Boosters'), wx.DefaultPosition, wx.DefaultSize, 0)
self.exportBoostersCb.SetValue(EsiSettings.getInstance().get('exportBoosters'))
self.exportBoostersCb.Bind(wx.EVT_CHECKBOX, self.OnBoostersExportChange)
mainSizer.Add(self.exportBoostersCb, 0, 0, 5)
self.exportBtn.Bind(wx.EVT_BUTTON, self.exportFitting)
self.statusbar = wx.StatusBar(self)
@@ -324,6 +334,14 @@ class ExportToEve(AuxiliaryFrame):
EsiSettings.getInstance().set('exportCharges', self.exportChargesCb.GetValue())
event.Skip()
def OnImplantsExportChange(self, event):
EsiSettings.getInstance().set('exportImplants', self.exportImplantsCb.GetValue())
event.Skip()
def OnBoostersExportChange(self, event):
EsiSettings.getInstance().set('exportBoosters', self.exportBoostersCb.GetValue())
event.Skip()
def updateCharList(self):
sEsi = Esi.getInstance()
chars = sEsi.getSsoCharacters()
@@ -360,8 +378,10 @@ class ExportToEve(AuxiliaryFrame):
sFit = Fit.getInstance()
exportCharges = self.exportChargesCb.GetValue()
exportImplants = self.exportImplantsCb.GetValue()
exportBoosters = self.exportBoostersCb.GetValue()
try:
data = sPort.exportESI(sFit.getFit(fitID), exportCharges)
data = sPort.exportESI(sFit.getFit(fitID), exportCharges, exportImplants, exportBoosters)
except ESIExportException as e:
msg = str(e)
if not msg:

BIN
imgs/icons/1168@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 857 B

BIN
imgs/icons/1168@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
imgs/icons/21894@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 B

BIN
imgs/icons/21894@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/24404@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 676 B

BIN
imgs/icons/24404@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
imgs/icons/24419@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 640 B

BIN
imgs/icons/24419@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
imgs/icons/25240@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 784 B

BIN
imgs/icons/25240@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
imgs/icons/25241@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 B

BIN
imgs/icons/25241@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/25242@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 829 B

BIN
imgs/icons/25242@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/25243@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 833 B

BIN
imgs/icons/25243@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/25250@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 782 B

BIN
imgs/icons/25250@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
imgs/icons/25251@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 816 B

BIN
imgs/icons/25251@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/25252@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 823 B

BIN
imgs/icons/25252@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/25253@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 B

BIN
imgs/icons/25253@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/25621@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 825 B

BIN
imgs/icons/25621@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
imgs/icons/25622@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 834 B

BIN
imgs/icons/25622@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
imgs/icons/25624@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 810 B

BIN
imgs/icons/25624@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
imgs/icons/25625@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 833 B

BIN
imgs/icons/25625@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
imgs/icons/25629@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 952 B

BIN
imgs/icons/25629@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
imgs/icons/25631@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 771 B

BIN
imgs/icons/25631@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/25632@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 783 B

BIN
imgs/icons/25632@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/25633@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 768 B

BIN
imgs/icons/25633@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/25634@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 961 B

BIN
imgs/icons/25634@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
imgs/icons/25803@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 894 B

BIN
imgs/icons/25803@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
imgs/icons/25833@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 795 B

BIN
imgs/icons/25833@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
imgs/renders/24531@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/renders/24531@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
imgs/renders/25815@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
imgs/renders/25815@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
imgs/renders/25969@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
imgs/renders/25969@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

BIN
imgs/renders/26204@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/renders/26204@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

BIN
imgs/renders/26216@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
imgs/renders/26216@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
imgs/renders/26378@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
imgs/renders/26378@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

BIN
imgs/renders/26445@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
imgs/renders/26445@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -3,7 +3,7 @@ logbook >= 1.0.0
numpy == 1.19.2
matplotlib == 3.2.2
python-dateutil
requests >= 2.0.0
requests == 2.28.1
sqlalchemy == 1.3.23
cryptography >= 2.3
markdown2 >= 2.3.5

View File

@@ -0,0 +1,16 @@
"""
Conversion pack for February 2023 release
"""
CONVERSIONS = {
# Renamed items
"Restrained Interdiction Nullifier": "Enduring Interdiction Nullifier",
"Synthetic Hull Conversion Inertia Stabilizers": "Synthetic Hull Conversion Inertial Stabilizers",
"Tobias's Modified Torpedo Launcher": "Tobias' Modified Torpedo Launcher",
"Vepas's Modified Torpedo Launcher": "Vepas' Modified Torpedo Launcher",
"Vepas's Modified Kinetic Shield Hardener": "Vepas' Modified Kinetic Shield Hardener",
"Vepas's Modified EM Shield Hardener": "Vepas' Modified EM Shield Hardener",
"Vepas's Modified Explosive Shield Hardener": "Vepas' Modified Explosive Shield Hardener",
"Vepas's Modified Thermal Shield Hardener": "Vepas' Modified Thermal Shield Hardener",
"Vepas's Modified Multispectrum Shield Hardener": "Vepas' Modified Multispectrum Shield Hardener",
}

View File

@@ -0,0 +1,10 @@
"""
Actually renamed somewhere during summer, but updated only in september
"""
CONVERSIONS = {
# Renamed items
"Atgeir Explosive Disruptive Lance": "'Atgeir' Explosive Disruptive Lance",
"Steel Yari Kinetic Disruptive Lance": "'Steel Yari' Kinetic Disruptive Lance",
"Sarissa Thermal Disruptive Lance": "'Sarissa' Thermal Disruptive Lance",
}

View File

@@ -976,6 +976,9 @@ cdfe:
cp:
- 'cp'
- 'command processor'
ats:
- 'ats'
- 'auto targeting system'
# Implants
lg:

View File

@@ -321,6 +321,9 @@ class Market:
"Boobook" : self.les_grp, # 19th EVE anniversary gift
"Geri" : self.les_grp, # AT18 prize
"Bestla" : self.les_grp, # AT18 prize
"Metamorphosis" : self.les_grp, # Seems to be anniversary gift
"Shapash" : self.les_grp, # AT19 prize
"Cybele" : self.les_grp, # AT19 prize
}
self.ITEMS_FORCEGROUP_R = self.__makeRevDict(self.ITEMS_FORCEGROUP)

Some files were not shown because too many files have changed in this diff Show More