Compare commits
125 Commits
v2.40.0
...
v2.48.0dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
be07d8e338 | ||
|
|
242fbba6d6 | ||
|
|
7f1e0fcc58 | ||
|
|
072a53eabc | ||
|
|
3115268fb8 | ||
|
|
0631bd65e1 | ||
|
|
6b7a4b3f9d | ||
|
|
0ba65cab1f | ||
|
|
d75419d858 | ||
|
|
771dfca1c8 | ||
|
|
73a5f62d90 | ||
|
|
3982670dff | ||
|
|
79d2ded836 | ||
|
|
55bc0cd40f | ||
|
|
9da09a279e | ||
|
|
889047f891 | ||
|
|
8f645fa425 | ||
|
|
e3e7f92b8d | ||
|
|
22f37995cf | ||
|
|
92119c01f6 | ||
|
|
95841c44dc | ||
|
|
e7b3040c0f | ||
|
|
78af68cac2 | ||
|
|
3e5eb989f9 | ||
|
|
975d6f8776 | ||
|
|
4e89a87ec1 | ||
|
|
eef644fb4c | ||
|
|
8131dd4ace | ||
|
|
c8059d6132 | ||
|
|
cc008a57e1 | ||
|
|
ce6910fd63 | ||
|
|
7892e637b2 | ||
|
|
6543a2c225 | ||
|
|
1e59d3d6ac | ||
|
|
11d0566433 | ||
|
|
b8d84d3af2 | ||
|
|
1831fea819 | ||
|
|
d15322a57c | ||
|
|
48981460ab | ||
|
|
eaca4a179f | ||
|
|
e249cf917b | ||
|
|
1de7a4ea82 | ||
|
|
289acc099c | ||
|
|
ce3678debb | ||
|
|
0e36794578 | ||
|
|
6d67b23a7e | ||
|
|
a95d69623b | ||
|
|
7578532949 | ||
|
|
a067c77c4c | ||
|
|
c6dd22f04f | ||
|
|
2e1f53184a | ||
|
|
3159d399a6 | ||
|
|
357dab2964 | ||
|
|
41c93efd83 | ||
|
|
628aa9d905 | ||
|
|
f9248dec6f | ||
|
|
9d5ea487d5 | ||
|
|
e76ce71701 | ||
|
|
5a91e01746 | ||
|
|
355e6dd0fe | ||
|
|
49da362dc3 | ||
|
|
460cf26236 | ||
|
|
cceaed8d61 | ||
|
|
d9df4958a6 | ||
|
|
e43e7ba51e | ||
|
|
50e76deab7 | ||
|
|
e109cce36b | ||
|
|
893f9f8467 | ||
|
|
c612545636 | ||
|
|
4fe729c512 | ||
|
|
a7d52c9fc2 | ||
|
|
207e9018a8 | ||
|
|
a9598d4fc9 | ||
|
|
60015fb3b8 | ||
|
|
ebd7a1a4ad | ||
|
|
63c9d98e3f | ||
|
|
14aafef866 | ||
|
|
55d6bb57d6 | ||
|
|
4bb71dbdb8 | ||
|
|
c9117c2a73 | ||
|
|
0a193939ed | ||
|
|
a0a27720ef | ||
|
|
d38417de9e | ||
|
|
2de214d7cd | ||
|
|
d9d546ca25 | ||
|
|
2c0e6fa73b | ||
|
|
9dc18ac81b | ||
|
|
86e171f13d | ||
|
|
20f222b9bf | ||
|
|
01721f9dac | ||
|
|
e57b7e5a8f | ||
|
|
4ba037d6e1 | ||
|
|
f89061a9d8 | ||
|
|
52b8b4bc6c | ||
|
|
51e351d1ba | ||
|
|
518b4abf8c | ||
|
|
67119fcff1 | ||
|
|
b1beebda26 | ||
|
|
f7ea438ebc | ||
|
|
ee6b57ecc1 | ||
|
|
e17fe434ee | ||
|
|
7cad0b2658 | ||
|
|
9e06106a1c | ||
|
|
ae115b640a | ||
|
|
0c292e8d6e | ||
|
|
bb38ba6564 | ||
|
|
3f6aa91966 | ||
|
|
e86e5933b5 | ||
|
|
000c1bc38f | ||
|
|
8b1553df03 | ||
|
|
2731e9962b | ||
|
|
89d0ee4c77 | ||
|
|
76536a5dcc | ||
|
|
41d6828024 | ||
|
|
bf4b4ab3c0 | ||
|
|
d7d4643a33 | ||
|
|
166635d0a1 | ||
|
|
076e1999af | ||
|
|
69caff50c3 | ||
|
|
0db72f7a8c | ||
|
|
43ac76ac1f | ||
|
|
279c912703 | ||
|
|
e54cec47f2 | ||
|
|
50293081d1 | ||
|
|
4f526d7cc4 |
@@ -1,9 +1,87 @@
|
|||||||
image:
|
image:
|
||||||
- Visual Studio 2019
|
- Visual Studio 2019
|
||||||
|
- Ubuntu
|
||||||
- macos
|
- macos
|
||||||
clone_depth: 400
|
clone_depth: 1
|
||||||
|
|
||||||
for:
|
for:
|
||||||
|
-
|
||||||
|
matrix:
|
||||||
|
only:
|
||||||
|
- image: Ubuntu
|
||||||
|
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
|
||||||
|
DEPLOY_DIR: AppDir/opt/pyfa
|
||||||
|
# APPVEYOR_SSH_BLOCK: true
|
||||||
|
cache:
|
||||||
|
- /home/appveyor/.cache/pip -> requirements.txt
|
||||||
|
init:
|
||||||
|
- 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 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:
|
||||||
|
- sh: mkdir build && cd build
|
||||||
|
- sh: curl -LO https://github.com/AppImage/AppImageKit/releases/download/13/$APPIMAGE_TOOL && chmod +x $APPIMAGE_TOOL
|
||||||
|
- sh: curl -LO https://github.com/niess/python-appimage/releases/download/python3.7/$PYTHON_APPIMAGE && chmod +x $PYTHON_APPIMAGE
|
||||||
|
build_script:
|
||||||
|
# Prepare Python base AppImage, stripping Python metadata
|
||||||
|
- sh: ./$PYTHON_APPIMAGE --appimage-extract
|
||||||
|
- sh: mv squashfs-root AppDir
|
||||||
|
- sh: rm AppDir/python*.desktop
|
||||||
|
- sh: rm AppDir/usr/share/applications/*.desktop
|
||||||
|
- sh: rm AppDir/usr/share/metainfo/*.appdata.xml
|
||||||
|
- sh: unlink AppDir/AppRun
|
||||||
|
- sh: mkdir -p $DEPLOY_DIR
|
||||||
|
# run install pyfa packages and any other requirements
|
||||||
|
|
||||||
|
- sh: AppDir/usr/bin/python -s -m pip install -U pip setuptools==41.6.0 wheel pathlib2
|
||||||
|
- sh: AppDir/usr/bin/python -s -m pip install -r ../requirements.txt
|
||||||
|
# Speedup, but causes runtime incompatiblities
|
||||||
|
#- sh: AppDir/usr/bin/python -s -m pip install -f https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-18.04 -r ../requirements.txt
|
||||||
|
|
||||||
|
# Run scripts to prep pyfa data and build database
|
||||||
|
- sh: cd ../
|
||||||
|
- sh: find locale/ -type f -name "*.po" -exec msgen "{}" -o "{}" \;
|
||||||
|
- sh: build/AppDir/usr/bin/python scripts/compile_lang.py
|
||||||
|
- sh: build/AppDir/usr/bin/python scripts/dump_crowdin_progress.py
|
||||||
|
- sh: build/AppDir/usr/bin/python db_update.py
|
||||||
|
- sh: export PYFA_VERSION="$(python3.7 scripts/dump_version.py)"
|
||||||
|
|
||||||
|
# Copy pyfa files to host
|
||||||
|
- sh: cp -r eos graphs gui imgs locale service utils eve.db config.py pyfa.py db_update.py README.md LICENSE version.yml ./build/$DEPLOY_DIR
|
||||||
|
- sh: find ./build/$DEPLOY_DIR | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
|
||||||
|
|
||||||
|
# Copy static AppImage files
|
||||||
|
- sh: cd dist_assets/linux
|
||||||
|
- sh: chmod +x AppRun
|
||||||
|
- sh: cp AppRun pyfa.desktop ../../build/AppDir/
|
||||||
|
- sh: cp pyfa.desktop ../../build/AppDir/usr/share/applications/
|
||||||
|
- sh: cp pyfa.appdata.xml ../../build/AppDir/usr/share/metainfo/
|
||||||
|
- sh: chmod +x pyfa && cp pyfa ../../build/AppDir/usr/bin
|
||||||
|
- sh: cd ../../
|
||||||
|
|
||||||
|
# Package it all up
|
||||||
|
- sh: mkdir dist
|
||||||
|
- sh: ./build/$APPIMAGE_TOOL build/AppDir dist/pyfa-$PYFA_VERSION-linux.AppImage
|
||||||
|
after_build:
|
||||||
|
- sh: ls -la build
|
||||||
|
artifacts:
|
||||||
|
- path: dist/pyfa-$PYFA_VERSION-linux.AppImage
|
||||||
|
deploy:
|
||||||
|
tag: $PYFA_VERSION
|
||||||
|
release: pyfa $PYFA_VERSION
|
||||||
|
description: 'Release description'
|
||||||
|
provider: GitHub
|
||||||
|
auth_token:
|
||||||
|
secure: M94o0xMtzxrvlKpqMcXU2KfbJdd3aYJ3UxWzePUz/pkT1/Ojiis052CiLsLVyzJg
|
||||||
|
draft: true
|
||||||
|
force_update: false
|
||||||
|
# deploy on tag push only
|
||||||
|
on:
|
||||||
|
APPVEYOR_REPO_TAG: true
|
||||||
-
|
-
|
||||||
matrix:
|
matrix:
|
||||||
only:
|
only:
|
||||||
@@ -13,7 +91,11 @@ for:
|
|||||||
# Should be enabled only for build process debugging
|
# Should be enabled only for build process debugging
|
||||||
# init:
|
# init:
|
||||||
# - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
# - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
||||||
|
cache:
|
||||||
|
- C:\users\appveyor\appdata\local\pip\cache\ -> requirements.txt
|
||||||
install:
|
install:
|
||||||
|
- cmd: git fetch --prune --unshallow # to fix the version dump issues
|
||||||
|
|
||||||
- ps: echo("OS version:")
|
- ps: echo("OS version:")
|
||||||
- ps: "[System.Environment]::OSVersion.Version"
|
- ps: "[System.Environment]::OSVersion.Version"
|
||||||
|
|
||||||
@@ -96,11 +178,15 @@ for:
|
|||||||
matrix:
|
matrix:
|
||||||
only:
|
only:
|
||||||
- image: macos
|
- image: macos
|
||||||
# Should be enabled only for build process debugging
|
environment:
|
||||||
|
APPVEYOR_SSH_KEY: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJDW/+oYNGOiPvwuwAL9tc/LQgg58aosIVpMYfepQZ20V+VZnHpZh8IRDA8Jo5xht19p2PksA+hFgqA0kpKtrSkuiWdE8rATQItfk4gf7yB0yGasJGGQZYazy9k/9XtmYkq2HHOOeEqdxvrICddJQ88MLCLT9lJENSUP/YS/yGcjZFXVxE11pTeIcqlCRU+3eYa1v7BeNvXIKNhZoK5orXWrtuH3cy8jrSns/u70aYfJ6B2jA8CnWnDbuvpeQtEY61SQqlKUsSArNa8NAsXj41wr3Ar9gAG9330w7EMTqlutk8HZO35uHI0q5qinUhaQYufPPrVkb2L/N+ZCfu0fnh appveyor"
|
||||||
|
cache:
|
||||||
|
- /Users/appveyor/Library/Caches/pip/ -> requirements.txt
|
||||||
init:
|
init:
|
||||||
# - sh: curl -sflL 'https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-ssh.sh' | bash -e -
|
# - sh: curl -sflL 'https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-ssh.sh' | bash -e -
|
||||||
- sh: source ~/venv3.7/bin/activate
|
- sh: source ~/venv3.7/bin/activate
|
||||||
install:
|
install:
|
||||||
|
- sh: git fetch --prune --unshallow # to fix the version dump issues
|
||||||
- sh: bash scripts/osx-setup.sh
|
- sh: bash scripts/osx-setup.sh
|
||||||
build_script:
|
build_script:
|
||||||
- sh: bash scripts/osx-translations.sh
|
- sh: bash scripts/osx-translations.sh
|
||||||
@@ -110,6 +196,9 @@ for:
|
|||||||
after_build:
|
after_build:
|
||||||
- sh: export PYFA_VERSION="$(python3 scripts/dump_version.py)"
|
- sh: export PYFA_VERSION="$(python3 scripts/dump_version.py)"
|
||||||
- sh: bash scripts/osx-package.sh
|
- sh: bash scripts/osx-package.sh
|
||||||
|
# on_finish:
|
||||||
|
# - sh: export APPVEYOR_SSH_BLOCK=true
|
||||||
|
# - sh: curl -sflL 'https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-ssh.sh' | bash -e -
|
||||||
artifacts:
|
artifacts:
|
||||||
- path: dist/pyfa*-mac.zip
|
- path: dist/pyfa*-mac.zip
|
||||||
before_deploy:
|
before_deploy:
|
||||||
|
|||||||
4
.gitignore
vendored
@@ -90,6 +90,7 @@ target/
|
|||||||
|
|
||||||
# pyenv
|
# pyenv
|
||||||
.python-version
|
.python-version
|
||||||
|
PyfaEnv/
|
||||||
|
|
||||||
# celery beat schedule file
|
# celery beat schedule file
|
||||||
celerybeat-schedule
|
celerybeat-schedule
|
||||||
@@ -123,3 +124,6 @@ gitversion
|
|||||||
|
|
||||||
*.fsdbinary
|
*.fsdbinary
|
||||||
/locale/progress.json
|
/locale/progress.json
|
||||||
|
|
||||||
|
# vscode settings
|
||||||
|
.vscode
|
||||||
17
README.md
@@ -6,22 +6,25 @@
|
|||||||
|
|
||||||
## What is it?
|
## What is it?
|
||||||
|
|
||||||
Pyfa, short for **py**thon **f**itting **a**ssistant, allows you to create, experiment with, and save ship fittings without being in game. Open source and written in Python, it is available on any platform where Python 3 and wxWidgets are available, including Windows, Mac OS X, and Linux.
|
Pyfa, short for **py**thon **f**itting **a**ssistant, allows you to create, experiment with, and save ship fittings without being in game. Open source and written in Python, it is available on any platform where Python 3 and wxWidgets are available, including Windows, macOS, and Linux.
|
||||||
|
|
||||||
## Latest Version and Changelogs
|
## Latest Version and Changelogs
|
||||||
The latest version along with release notes can always be found on the project's [releases](https://github.com/pyfa-org/Pyfa/releases) page. Pyfa will notify you if you are running an outdated version.
|
The latest version along with release notes can always be found on the project's [releases](https://github.com/pyfa-org/Pyfa/releases) page. Pyfa will notify you if you are running an outdated version.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
Windows and OS X users are supplied self-contained builds of pyfa on the [latest releases](https://github.com/pyfa-org/Pyfa/releases/latest) page. An `.exe` installer is also available for Windows builds. Linux users can run pyfa using their distribution's Python interpreter. There is no official self-contained package for Linux, however, there are a number of third-party packages available through distribution-specific repositories.
|
Windows, macOS, and Linux users are supplied self-contained builds of pyfa on the [latest releases](https://github.com/pyfa-org/Pyfa/releases/latest) page.
|
||||||
|
|
||||||
### OS X
|
### Third Party Packages
|
||||||
Apart from the official release, there is also a [Homebrew](http://brew.sh) option for installing pyfa on OS X. Please note this is maintained by a third-party and is not tested by pyfa developers. Simply fire up in terminal:
|
Please note that these packages are maintained by third-parties and are not evaluated by the pyfa developers.
|
||||||
|
|
||||||
|
#### macOS
|
||||||
|
Apart from the official release, there is also a [Homebrew](https://formulae.brew.sh/cask/pyfa) option for installing pyfa on macOS. Simply fire up in terminal:
|
||||||
```
|
```
|
||||||
$ brew install Caskroom/cask/pyfa
|
$ brew install --cask pyfa
|
||||||
```
|
```
|
||||||
|
|
||||||
### Linux Distro-specific Packages
|
#### Linux Distro-specific Packages
|
||||||
The following is a list of pyfa packages available for certain distributions. Please note that these packages are maintained by third-parties and are not evaluated by the pyfa developers.
|
The following is a list of pyfa packages available for certain distributions.
|
||||||
|
|
||||||
* Arch: https://aur.archlinux.org/packages/pyfa/
|
* Arch: https://aur.archlinux.org/packages/pyfa/
|
||||||
* Gentoo: https://github.com/ZeroPointEnergy/gentoo-pyfa-overlay
|
* Gentoo: https://github.com/ZeroPointEnergy/gentoo-pyfa-overlay
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ saveInRoot = False
|
|||||||
evemonMinVersion = "4081"
|
evemonMinVersion = "4081"
|
||||||
|
|
||||||
minItemSearchLength = 3
|
minItemSearchLength = 3
|
||||||
|
minItemSearchLengthCjk = 1
|
||||||
|
|
||||||
pyfaPath = None
|
pyfaPath = None
|
||||||
savePath = None
|
savePath = None
|
||||||
|
|||||||
14
db_update.py
@@ -139,16 +139,18 @@ def update_db():
|
|||||||
for row in data:
|
for row in data:
|
||||||
if (
|
if (
|
||||||
# Apparently people really want Civilian modules available
|
# Apparently people really want Civilian modules available
|
||||||
(row['typeName_en-us'].startswith('Civilian') and "Shuttle" not in row['typeName_en-us']) or
|
(row['typeName_en-us'].startswith('Civilian') and "Shuttle" not in row['typeName_en-us'])
|
||||||
row['typeName_en-us'] == 'Capsule' or
|
or row['typeName_en-us'] == 'Capsule'
|
||||||
row['groupID'] == 4033 # destructible effect beacons
|
or row['groupID'] == 4033 # destructible effect beacons
|
||||||
|
or re.match('AIR .+Booster.*', row['typeName_en-us'])
|
||||||
):
|
):
|
||||||
row['published'] = True
|
row['published'] = True
|
||||||
# Nearly useless and clutter search results too much
|
# Nearly useless and clutter search results too much
|
||||||
elif (
|
elif (
|
||||||
row['typeName_en-us'].startswith('Limited Synth ') or
|
row['typeName_en-us'].startswith('Limited Synth ')
|
||||||
row['typeName_en-us'].startswith('Expired ') or
|
or row['typeName_en-us'].startswith('Expired ')
|
||||||
row['typeName_en-us'].endswith(' Filament') and (
|
or re.match('Mining Blitz .+ Booster Dose .+', row['typeName_en-us'])
|
||||||
|
or row['typeName_en-us'].endswith(' Filament') and (
|
||||||
"'Needlejack'" not in row['typeName_en-us'] and
|
"'Needlejack'" not in row['typeName_en-us'] and
|
||||||
"'Devana'" not in row['typeName_en-us'] and
|
"'Devana'" not in row['typeName_en-us'] and
|
||||||
"'Pochven'" not in row['typeName_en-us'] and
|
"'Pochven'" not in row['typeName_en-us'] and
|
||||||
|
|||||||
19
dist_assets/linux/AppRun
Executable file
@@ -0,0 +1,19 @@
|
|||||||
|
#! /bin/bash -i
|
||||||
|
|
||||||
|
# Export APPRUN if running from an extracted image
|
||||||
|
self="$(readlink -f -- $0)"
|
||||||
|
here="${self%/*}"
|
||||||
|
APPDIR="${APPDIR:-${here}}"
|
||||||
|
|
||||||
|
# Export TCl/Tk
|
||||||
|
export TCL_LIBRARY="${APPDIR}/usr/share/tcltk/tcl8.4"
|
||||||
|
export TK_LIBRARY="${APPDIR}/usr/share/tcltk/tk8.4"
|
||||||
|
export TKPATH="${TK_LIBRARY}"
|
||||||
|
|
||||||
|
# Export SSL certificate
|
||||||
|
export SSL_CERT_FILE="${APPDIR}/opt/_internal/certs.pem"
|
||||||
|
|
||||||
|
# Call the entry point
|
||||||
|
#! /bin/bash -i
|
||||||
|
|
||||||
|
${APPDIR}/usr/bin/pyfa "$@"
|
||||||
3
dist_assets/linux/pyfa
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
${APPDIR}/usr/bin/python3.7 -s "${APPDIR}/opt/pyfa/pyfa.py" "$@"
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
# -*- mode: python -*-
|
|
||||||
|
|
||||||
import os
|
|
||||||
from itertools import chain
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
label = subprocess.check_output([
|
|
||||||
"git", "describe", "--tags"]).strip()
|
|
||||||
|
|
||||||
with open('gitversion', 'w+') as f:
|
|
||||||
f.write(label.decode())
|
|
||||||
|
|
||||||
block_cipher = None
|
|
||||||
|
|
||||||
|
|
||||||
added_files = [
|
|
||||||
( 'imgs/gui/*.png', 'imgs/gui' ),
|
|
||||||
( 'imgs/gui/*.gif', 'imgs/gui' ),
|
|
||||||
( 'imgs/icons/*.png', 'imgs/icons' ),
|
|
||||||
( 'imgs/renders/*.png', 'imgs/renders' ),
|
|
||||||
( 'dist_assets/win/pyfa.ico', '.' ),
|
|
||||||
( 'dist_assets/cacert.pem', '.' ),
|
|
||||||
( 'eve.db', '.' ),
|
|
||||||
( 'README.md', '.' ),
|
|
||||||
( 'LICENSE', '.' ),
|
|
||||||
( 'gitversion', '.' ),
|
|
||||||
]
|
|
||||||
|
|
||||||
import_these = []
|
|
||||||
|
|
||||||
# Walk directories that do dynamic importing
|
|
||||||
paths = ('eos/effects', 'eos/db/migrations', 'service/conversions')
|
|
||||||
for root, folders, files in chain.from_iterable(os.walk(path) for path in paths):
|
|
||||||
for file_ in files:
|
|
||||||
if file_.endswith(".py") and not file_.startswith("_"):
|
|
||||||
mod_name = "{}.{}".format(
|
|
||||||
root.replace("/", "."),
|
|
||||||
file_.split(".py")[0],
|
|
||||||
)
|
|
||||||
import_these.append(mod_name)
|
|
||||||
|
|
||||||
|
|
||||||
a = Analysis(['pyfa.py'],
|
|
||||||
pathex=[],
|
|
||||||
binaries=[],
|
|
||||||
datas=added_files,
|
|
||||||
hiddenimports=import_these,
|
|
||||||
hookspath=[],
|
|
||||||
runtime_hooks=[],
|
|
||||||
excludes=[],
|
|
||||||
win_no_prefer_redirects=False,
|
|
||||||
win_private_assemblies=False,
|
|
||||||
cipher=block_cipher)
|
|
||||||
pyz = PYZ(a.pure, a.zipped_data,
|
|
||||||
cipher=block_cipher)
|
|
||||||
exe = EXE(pyz,
|
|
||||||
a.scripts,
|
|
||||||
exclude_binaries=True,
|
|
||||||
name='pyfa',
|
|
||||||
debug=False,
|
|
||||||
strip=False,
|
|
||||||
upx=True,
|
|
||||||
console=True )
|
|
||||||
coll = COLLECT(exe,
|
|
||||||
a.binaries,
|
|
||||||
a.zipfiles,
|
|
||||||
a.datas,
|
|
||||||
strip=False,
|
|
||||||
upx=True,
|
|
||||||
name='pyfa')
|
|
||||||
17
dist_assets/linux/pyfa.appdata.xml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<component type="desktop-application">
|
||||||
|
<id>org.pyfa.pyfa</id>
|
||||||
|
<metadata_license>MIT</metadata_license>
|
||||||
|
<project_license>GPL-3</project_license>
|
||||||
|
<name>Pyfa</name>
|
||||||
|
<summary>Pyfa </summary>
|
||||||
|
<description>
|
||||||
|
<p> Python Fitting Assitant for EVE Online
|
||||||
|
</p>
|
||||||
|
</description>
|
||||||
|
<launchable type="desktop-id">pyfa.desktop</launchable>
|
||||||
|
<url type="homepage">https://github.com/pyfa-org/Pyfa</url>
|
||||||
|
<provides>
|
||||||
|
<binary>pyfa</binary>
|
||||||
|
</provides>
|
||||||
|
</component>
|
||||||
7
dist_assets/linux/pyfa.desktop
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
Name=Pyfa
|
||||||
|
Exec=pyfa
|
||||||
|
Comment=Python Fitting Assistant for EVE: Online
|
||||||
|
Icon=python
|
||||||
|
Categories=Game;
|
||||||
1
docs/_config.yml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
theme: jekyll-theme-midnight
|
||||||
104
docs/callback.html
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
|
||||||
|
<title>pyfa Authentication Proxy</title>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
|
||||||
|
body { width: 700px; margin: 150px auto; }
|
||||||
|
h1 { font-size: 40px; }
|
||||||
|
h2 { font-size: 32px; }
|
||||||
|
body { font: 20px Helvetica, sans-serif; color: #333; }
|
||||||
|
#article { display: block; text-align: left; width: 650px; margin: 0 auto; }
|
||||||
|
.hidden { display:none; }
|
||||||
|
.success { color: #28a745; }
|
||||||
|
.error { color: #dc3545; }
|
||||||
|
textarea { width: 100%; height: 100px; }
|
||||||
|
hr { border-width: 1px 0 0 0; border-style: solid; border-color: #333; }
|
||||||
|
button { cursor: pointer; background-color: white; border: 1px solid #333; color: #333; padding: 8px 11px; text-align: center; text-decoration: none; display: inline-block; }
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
body { background-color: #333; color: white; }
|
||||||
|
textarea { width: 100%; height: 100px; background-color: #aaa;}
|
||||||
|
button { background-color: #333; border: 1px solid white; color: white; }
|
||||||
|
hr { border-color: white; }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<!-- Layout from Short Circuit's CREST login. Shout out! https://github.com/farshield/shortcircuit -->
|
||||||
|
<h1>pyfa</h1>
|
||||||
|
<div id="mode0" class="hidden">
|
||||||
|
<p id="mode0-msg">Processing request...</p>
|
||||||
|
<button id="showBtn" onClick="showCode()">Show Code</button>
|
||||||
|
</div>
|
||||||
|
<div id="mode1" class="hidden">
|
||||||
|
<p id="mode1-p">Please copy and paste the token below into pyfa.</p>
|
||||||
|
<textarea id="authCodeText" readonly></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
debugger;
|
||||||
|
function showCode() {
|
||||||
|
var element = document.getElementById(`mode1`);
|
||||||
|
element.classList.remove("hidden");
|
||||||
|
element = document.getElementById(`showBtn`);
|
||||||
|
element.classList.add("hidden");
|
||||||
|
}
|
||||||
|
|
||||||
|
function httpPostAsync(url, callback)
|
||||||
|
{
|
||||||
|
var xmlHttp = new XMLHttpRequest();
|
||||||
|
xmlHttp.onreadystatechange = function() {
|
||||||
|
if (xmlHttp.readyState == XMLHttpRequest.DONE)
|
||||||
|
callback(xmlHttp);
|
||||||
|
}
|
||||||
|
xmlHttp.open("GET", url, true); // true for asynchronous
|
||||||
|
xmlHttp.send(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
const urlSearchParams = new URLSearchParams(window.location.search);
|
||||||
|
const params = Object.fromEntries(urlSearchParams.entries());
|
||||||
|
let stateInfo;
|
||||||
|
try {
|
||||||
|
stateInfo = JSON.parse(atob(params.state))
|
||||||
|
} catch (err) {
|
||||||
|
// something has happened and we cannot continue.
|
||||||
|
// todo: show a simple message and exit.
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we always want to show the text box for manual.
|
||||||
|
var element = document.getElementById(`mode${stateInfo.mode}`);
|
||||||
|
element.classList.remove("hidden");
|
||||||
|
|
||||||
|
if (stateInfo.mode === 0) {
|
||||||
|
let p = document.getElementById(`mode1-p`);
|
||||||
|
p.prepend(document.createElement("hr"))
|
||||||
|
}
|
||||||
|
debugger;
|
||||||
|
document.getElementById(`authCodeText`).value = btoa(JSON.stringify(params))
|
||||||
|
|
||||||
|
if (stateInfo.mode == 0) { // auto / server mode
|
||||||
|
httpPostAsync(stateInfo.redirect + window.location.search, (req)=>{
|
||||||
|
debugger;
|
||||||
|
const msgDiv = document.getElementById(`mode0-msg`);
|
||||||
|
if (req.status === 200) {
|
||||||
|
msgDiv.innerHTML ="<span class='success'>Success!</span> You may close this window and return to the application.";
|
||||||
|
return;
|
||||||
|
} else if (req.status === 0){
|
||||||
|
msgDiv.innerHTML = "<span class='error'>Error!</span> Server response not received.<p><small>The local pyfa server may have timed out, or may not have started correctly.</small></p>";
|
||||||
|
} else if (req.status === 400){
|
||||||
|
msgDiv.innerHTML = `<span class='error'>Error!</span> <p><small>${req.responseText}</small></p>`
|
||||||
|
} else {
|
||||||
|
msgDiv.innerHTML = `<span class='error'>Error!</span> <p><small>There was an unknown error. Please report this to the pyfa issues page.</p><p><textarea readdonly>${req.responseText}</textarea></small></p>`
|
||||||
|
}
|
||||||
|
showCode()
|
||||||
|
// todo: bad request error when it's not an error itself, but rather
|
||||||
|
})
|
||||||
|
// todo: post message to local EVE server
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
37
docs/index.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
## Welcome to GitHub Pages
|
||||||
|
|
||||||
|
You can use the [editor on GitHub](https://github.com/pyfa-org/Pyfa/edit/gh-pages/index.md) to maintain and preview the content for your website in Markdown files.
|
||||||
|
|
||||||
|
Whenever you commit to this repository, GitHub Pages will run [Jekyll](https://jekyllrb.com/) to rebuild the pages in your site, from the content in your Markdown files.
|
||||||
|
|
||||||
|
### Markdown
|
||||||
|
|
||||||
|
Markdown is a lightweight and easy-to-use syntax for styling your writing. It includes conventions for
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
Syntax highlighted code block
|
||||||
|
|
||||||
|
# Header 1
|
||||||
|
## Header 2
|
||||||
|
### Header 3
|
||||||
|
|
||||||
|
- Bulleted
|
||||||
|
- List
|
||||||
|
|
||||||
|
1. Numbered
|
||||||
|
2. List
|
||||||
|
|
||||||
|
**Bold** and _Italic_ and `Code` text
|
||||||
|
|
||||||
|
[Link](url) and 
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details see [GitHub Flavored Markdown](https://guides.github.com/features/mastering-markdown/).
|
||||||
|
|
||||||
|
### Jekyll Themes
|
||||||
|
|
||||||
|
Your Pages site will use the layout and styles from the Jekyll theme you have selected in your [repository settings](https://github.com/pyfa-org/Pyfa/settings/pages). The name of this theme is saved in the Jekyll `_config.yml` configuration file.
|
||||||
|
|
||||||
|
### Support or Contact
|
||||||
|
|
||||||
|
Having trouble with Pages? Check out our [documentation](https://docs.github.com/categories/github-pages-basics/) or [contact support](https://support.github.com/contact) and we’ll help you sort it out.
|
||||||
1414
eos/effects.py
@@ -59,106 +59,115 @@ BUILTINS = OrderedDict([
|
|||||||
(-20, (_c(_t('Exotic Plasma')) + _t('Baryon'), 0, 59737, 0, 40263)),
|
(-20, (_c(_t('Exotic Plasma')) + _t('Baryon'), 0, 59737, 0, 40263)),
|
||||||
(-21, (_c(_t('Exotic Plasma')) + _t('Tetryon'), 0, 69208, 0, 30792)),
|
(-21, (_c(_t('Exotic Plasma')) + _t('Tetryon'), 0, 69208, 0, 30792)),
|
||||||
(-22, (_c(_t('Exotic Plasma')) + '|' + _t('[T2] Occult'), 0, 55863, 0, 44137)),
|
(-22, (_c(_t('Exotic Plasma')) + '|' + _t('[T2] Occult'), 0, 55863, 0, 44137)),
|
||||||
(-23, (_c(_t('Hybrid Charges')) + '|' + _t('[T2] Spike'), 0, 4, 4, 0)),
|
# Different sizes of packs do different damage ratios, the values here
|
||||||
(-24, (_c(_t('Hybrid Charges')) + '|' + _t('[T2] Null'), 0, 6, 5, 0)),
|
# are average of ratios across sizes
|
||||||
(-25, (_c(_t('Hybrid Charges')) + _t('Iron'), 0, 2, 3, 0)),
|
(-23, (_c(_t('Condenser Packs')) + '|' + _t('[T2] StrikeSnipe'), 51817, 0, 48183, 0)),
|
||||||
(-26, (_c(_t('Hybrid Charges')) + _t('Tungsten'), 0, 2, 4, 0)),
|
(-24, (_c(_t('Condenser Packs')) + _t('MesmerFlux'), 76476, 0, 23524, 0)),
|
||||||
(-27, (_c(_t('Hybrid Charges')) + _t('Iridium'), 0, 3, 4, 0)),
|
(-25, (_c(_t('Condenser Packs')) + _t('SlamBolt'), 23376, 0, 76624, 0)),
|
||||||
(-28, (_c(_t('Hybrid Charges')) + _t('Lead'), 0, 3, 5, 0)),
|
(-26, (_c(_t('Condenser Packs')) + _t('BlastShot'), 19820, 0, 80180, 0)),
|
||||||
(-29, (_c(_t('Hybrid Charges')) + _t('Thorium'), 0, 4, 5, 0)),
|
(-27, (_c(_t('Condenser Packs')) + _t('GalvaSurge'), 80206, 0, 19794, 0)),
|
||||||
(-30, (_c(_t('Hybrid Charges')) + _t('Uranium'), 0, 4, 6, 0)),
|
(-28, (_c(_t('Condenser Packs')) + '|' + _t('[T2] ElectroPunch'), 50547, 0, 49453, 0)),
|
||||||
(-31, (_c(_t('Hybrid Charges')) + _t('Plutonium'), 0, 5, 6, 0)),
|
|
||||||
(-32, (_c(_t('Hybrid Charges')) + _t('Antimatter'), 0, 5, 7, 0)),
|
(-29, (_c(_t('Hybrid Charges')) + '|' + _t('[T2] Spike'), 0, 4, 4, 0)),
|
||||||
(-33, (_c(_t('Hybrid Charges')) + '|' + _t('[T2] Javelin'), 0, 8, 6, 0)),
|
(-30, (_c(_t('Hybrid Charges')) + '|' + _t('[T2] Null'), 0, 6, 5, 0)),
|
||||||
(-34, (_c(_t('Hybrid Charges')) + '|' + _t('[T2] Void'), 0, 7.7, 7.7, 0)),
|
(-31, (_c(_t('Hybrid Charges')) + _t('Iron'), 0, 2, 3, 0)),
|
||||||
(-35, (_c(_t('Projectile Ammo')) + '|' + _t('[T2] Tremor'), 0, 0, 3, 5)),
|
(-32, (_c(_t('Hybrid Charges')) + _t('Tungsten'), 0, 2, 4, 0)),
|
||||||
(-36, (_c(_t('Projectile Ammo')) + '|' + _t('[T2] Barrage'), 0, 0, 5, 6)),
|
(-33, (_c(_t('Hybrid Charges')) + _t('Iridium'), 0, 3, 4, 0)),
|
||||||
(-37, (_c(_t('Projectile Ammo')) + _t('Carbonized Lead'), 0, 0, 4, 1)),
|
(-34, (_c(_t('Hybrid Charges')) + _t('Lead'), 0, 3, 5, 0)),
|
||||||
(-38, (_c(_t('Projectile Ammo')) + _t('Nuclear'), 0, 0, 1, 4)),
|
(-35, (_c(_t('Hybrid Charges')) + _t('Thorium'), 0, 4, 5, 0)),
|
||||||
(-39, (_c(_t('Projectile Ammo')) + _t('Proton'), 3, 0, 2, 0)),
|
(-36, (_c(_t('Hybrid Charges')) + _t('Uranium'), 0, 4, 6, 0)),
|
||||||
(-40, (_c(_t('Projectile Ammo')) + _t('Depleted Uranium'), 0, 3, 2, 3)),
|
(-37, (_c(_t('Hybrid Charges')) + _t('Plutonium'), 0, 5, 6, 0)),
|
||||||
(-41, (_c(_t('Projectile Ammo')) + _t('Titanium Sabot'), 0, 0, 6, 2)),
|
(-38, (_c(_t('Hybrid Charges')) + _t('Antimatter'), 0, 5, 7, 0)),
|
||||||
(-42, (_c(_t('Projectile Ammo')) + _t('EMP'), 9, 0, 1, 2)),
|
(-39, (_c(_t('Hybrid Charges')) + '|' + _t('[T2] Javelin'), 0, 8, 6, 0)),
|
||||||
(-43, (_c(_t('Projectile Ammo')) + _t('Phased Plasma'), 0, 10, 2, 0)),
|
(-40, (_c(_t('Hybrid Charges')) + '|' + _t('[T2] Void'), 0, 7.7, 7.7, 0)),
|
||||||
(-44, (_c(_t('Projectile Ammo')) + _t('Fusion'), 0, 0, 2, 10)),
|
(-41, (_c(_t('Projectile Ammo')) + '|' + _t('[T2] Tremor'), 0, 0, 3, 5)),
|
||||||
(-45, (_c(_t('Projectile Ammo')) + '|' + _t('[T2] Quake'), 0, 0, 5, 9)),
|
(-42, (_c(_t('Projectile Ammo')) + '|' + _t('[T2] Barrage'), 0, 0, 5, 6)),
|
||||||
(-46, (_c(_t('Projectile Ammo')) + '|' + _t('[T2] Hail'), 0, 0, 3.3, 12.1)),
|
(-43, (_c(_t('Projectile Ammo')) + _t('Carbonized Lead'), 0, 0, 4, 1)),
|
||||||
(-47, (_c(_t('Missiles')) + _t('Mjolnir'), 1, 0, 0, 0)),
|
(-44, (_c(_t('Projectile Ammo')) + _t('Nuclear'), 0, 0, 1, 4)),
|
||||||
(-48, (_c(_t('Missiles')) + _t('Inferno'), 0, 1, 0, 0)),
|
(-45, (_c(_t('Projectile Ammo')) + _t('Proton'), 3, 0, 2, 0)),
|
||||||
(-49, (_c(_t('Missiles')) + _t('Scourge'), 0, 0, 1, 0)),
|
(-46, (_c(_t('Projectile Ammo')) + _t('Depleted Uranium'), 0, 3, 2, 3)),
|
||||||
(-50, (_c(_t('Missiles')) + _t('Nova'), 0, 0, 0, 1)),
|
(-47, (_c(_t('Projectile Ammo')) + _t('Titanium Sabot'), 0, 0, 6, 2)),
|
||||||
(-51, (_c(_t('Bombs')) + _t('Electron Bomb'), 6400, 0, 0, 0)),
|
(-48, (_c(_t('Projectile Ammo')) + _t('EMP'), 9, 0, 1, 2)),
|
||||||
(-52, (_c(_t('Bombs')) + _t('Scorch Bomb'), 0, 6400, 0, 0)),
|
(-49, (_c(_t('Projectile Ammo')) + _t('Phased Plasma'), 0, 10, 2, 0)),
|
||||||
(-53, (_c(_t('Bombs')) + _t('Concussion Bomb'), 0, 0, 6400, 0)),
|
(-50, (_c(_t('Projectile Ammo')) + _t('Fusion'), 0, 0, 2, 10)),
|
||||||
(-54, (_c(_t('Bombs')) + _t('Shrapnel Bomb'), 0, 0, 0, 6400)),
|
(-51, (_c(_t('Projectile Ammo')) + '|' + _t('[T2] Quake'), 0, 0, 5, 9)),
|
||||||
|
(-52, (_c(_t('Projectile Ammo')) + '|' + _t('[T2] Hail'), 0, 0, 3.3, 12.1)),
|
||||||
|
(-53, (_c(_t('Missiles')) + _t('Mjolnir'), 1, 0, 0, 0)),
|
||||||
|
(-54, (_c(_t('Missiles')) + _t('Inferno'), 0, 1, 0, 0)),
|
||||||
|
(-55, (_c(_t('Missiles')) + _t('Scourge'), 0, 0, 1, 0)),
|
||||||
|
(-56, (_c(_t('Missiles')) + _t('Nova'), 0, 0, 0, 1)),
|
||||||
|
(-57, (_c(_t('Bombs')) + _t('Electron Bomb'), 6400, 0, 0, 0)),
|
||||||
|
(-58, (_c(_t('Bombs')) + _t('Scorch Bomb'), 0, 6400, 0, 0)),
|
||||||
|
(-59, (_c(_t('Bombs')) + _t('Concussion Bomb'), 0, 0, 6400, 0)),
|
||||||
|
(-60, (_c(_t('Bombs')) + _t('Shrapnel Bomb'), 0, 0, 0, 6400)),
|
||||||
# Source: ticket #2067 and #2265
|
# Source: ticket #2067 and #2265
|
||||||
(-55, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('All'), 126, 427, 218, 230)),
|
(-61, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('All'), 126, 427, 218, 230)),
|
||||||
(-109, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Angel'), 450, 72, 80, 398)),
|
(-62, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Angel'), 450, 72, 80, 398)),
|
||||||
(-107, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Concord'), 53, 559, 94, 295)),
|
(-63, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Concord'), 53, 559, 94, 295)),
|
||||||
(-56, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Drifter'), 250, 250, 250, 250)),
|
(-64, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Drifter'), 250, 250, 250, 250)),
|
||||||
(-57, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Drones'), 250, 250, 250, 250)),
|
(-65, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Drones'), 250, 250, 250, 250)),
|
||||||
(-58, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Overmind'), 0, 410, 590, 0)),
|
(-66, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Overmind'), 0, 410, 590, 0)),
|
||||||
(-108, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Sansha'), 569, 431, 0, 0)),
|
(-67, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Sansha'), 569, 431, 0, 0)),
|
||||||
(-59, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Seeker'), 402, 402, 98, 98)),
|
(-68, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Seeker'), 402, 402, 98, 98)),
|
||||||
(-60, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Sleeper'), 313, 313, 187, 187)),
|
(-69, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Sleeper'), 313, 313, 187, 187)),
|
||||||
(-61, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Triglavian'), 0, 615, 0, 385)),
|
(-70, (_c(_t('NPC')) + _c(_t('Abyssal')) + _t('Triglavian'), 0, 615, 0, 385)),
|
||||||
(-62, (_c(_t('NPC')) + _c(_t('Asteroid')) + _t('Angel Cartel'), 1838, 562, 2215, 3838)),
|
(-71, (_c(_t('NPC')) + _c(_t('Asteroid')) + _t('Angel Cartel'), 1838, 562, 2215, 3838)),
|
||||||
(-63, (_c(_t('NPC')) + _c(_t('Asteroid')) + _t('Blood Raiders'), 5067, 4214, 0, 0)),
|
(-72, (_c(_t('NPC')) + _c(_t('Asteroid')) + _t('Blood Raiders'), 5067, 4214, 0, 0)),
|
||||||
(-64, (_c(_t('NPC')) + _c(_t('Asteroid')) + _t('Guristas'), 0, 1828, 7413, 0)),
|
(-73, (_c(_t('NPC')) + _c(_t('Asteroid')) + _t('Guristas'), 0, 1828, 7413, 0)),
|
||||||
(-65, (_c(_t('NPC')) + _c(_t('Asteroid')) + _t('Rogue Drone'), 394, 666, 1090, 1687)),
|
(-74, (_c(_t('NPC')) + _c(_t('Asteroid')) + _t('Rogue Drone'), 394, 666, 1090, 1687)),
|
||||||
(-66, (_c(_t('NPC')) + _c(_t('Asteroid')) + _t('Sanshas Nation'), 5586, 4112, 0, 0)),
|
(-75, (_c(_t('NPC')) + _c(_t('Asteroid')) + _t('Sanshas Nation'), 5586, 4112, 0, 0)),
|
||||||
(-67, (_c(_t('NPC')) + _c(_t('Asteroid')) + _t('Serpentis'), 0, 5373, 4813, 0)),
|
(-76, (_c(_t('NPC')) + _c(_t('Asteroid')) + _t('Serpentis'), 0, 5373, 4813, 0)),
|
||||||
(-68, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Cruor (Blood Raiders)'), 90, 90, 0, 0)),
|
(-77, (_c(_t('NPC')) + _c(_t('Burner')) + _c(_t('Team')) + _t('Enyo'), 0, 147, 147, 0)),
|
||||||
(-69, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Dramiel (Angel)'), 55, 0, 20, 96)),
|
(-78, (_c(_t('NPC')) + _c(_t('Burner')) + _c(_t('Team')) + _t('Hawk'), 0, 0, 247, 0)),
|
||||||
(-70, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Daredevil (Serpentis)'), 0, 110, 154, 0)),
|
(-79, (_c(_t('NPC')) + _c(_t('Burner')) + _c(_t('Team')) + _t('Jaguar'), 36, 0, 50, 182)),
|
||||||
(-71, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Succubus (Sanshas Nation)'), 135, 30, 0, 0)),
|
(-80, (_c(_t('NPC')) + _c(_t('Burner')) + _c(_t('Team')) + _t('Vengeance'), 232, 0, 0, 0)),
|
||||||
(-72, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Worm (Guristas)'), 0, 0, 228, 0)),
|
(-81, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Cruor'), 90, 90, 0, 0)),
|
||||||
(-73, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Enyo'), 0, 147, 147, 0)),
|
(-82, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Dramiel'), 55, 0, 20, 96)),
|
||||||
(-74, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Hawk'), 0, 0, 247, 0)),
|
(-83, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Daredevil'), 0, 110, 154, 0)),
|
||||||
(-75, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Jaguar'), 36, 0, 50, 182)),
|
(-84, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Succubus'), 135, 30, 0, 0)),
|
||||||
(-76, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Vengeance'), 232, 0, 0, 0)),
|
(-85, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Worm'), 0, 0, 228, 0)),
|
||||||
(-77, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Ashimmu (Blood Raiders)'), 260, 100, 0, 0)),
|
(-86, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Ashimmu'), 260, 100, 0, 0)),
|
||||||
(-78, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Talos'), 0, 413, 413, 0)),
|
(-87, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Talos'), 0, 413, 413, 0)),
|
||||||
(-79, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Sentinel'), 0, 75, 0, 90)),
|
(-88, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Sentinel'), 0, 0, 75, 90)),
|
||||||
(-80, (_c(_t('NPC')) + _c(_t('Deadspace')) + _t('Angel Cartel'), 369, 533, 1395, 3302)),
|
(-89, (_c(_t('NPC')) + _c(_t('Deadspace')) + _t('Angel Cartel'), 369, 533, 1395, 3302)),
|
||||||
(-81, (_c(_t('NPC')) + _c(_t('Deadspace')) + _t('Blood Raiders'), 6040, 5052, 10, 15)),
|
(-90, (_c(_t('NPC')) + _c(_t('Deadspace')) + _t('Blood Raiders'), 6040, 5052, 10, 15)),
|
||||||
(-82, (_c(_t('NPC')) + _c(_t('Deadspace')) + _t('Guristas'), 0, 1531, 9680, 0)),
|
(-91, (_c(_t('NPC')) + _c(_t('Deadspace')) + _t('Guristas'), 0, 1531, 9680, 0)),
|
||||||
(-83, (_c(_t('NPC')) + _c(_t('Deadspace')) + _t('Rogue Drone'), 276, 1071, 1069, 871)),
|
(-92, (_c(_t('NPC')) + _c(_t('Deadspace')) + _t('Rogue Drone'), 276, 1071, 1069, 871)),
|
||||||
(-84, (_c(_t('NPC')) + _c(_t('Deadspace')) + _t('Sanshas Nation'), 3009, 2237, 0, 0)),
|
(-93, (_c(_t('NPC')) + _c(_t('Deadspace')) + _t('Sanshas Nation'), 3009, 2237, 0, 0)),
|
||||||
(-85, (_c(_t('NPC')) + _c(_t('Deadspace')) + _t('Serpentis'), 0, 3110, 1929, 0)),
|
(-94, (_c(_t('NPC')) + _c(_t('Deadspace')) + _t('Serpentis'), 0, 3110, 1929, 0)),
|
||||||
# Source: ticket #2067
|
# Source: ticket #2067
|
||||||
(-86, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Triglavian Entities')) + _t('Dread'), 0, 417, 0, 583)),
|
(-95, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Triglavian Entities')) + _t('Dread'), 0, 417, 0, 583)),
|
||||||
(-87, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Triglavian Entities')) + _t('Normal Subcaps'), 0, 610, 0, 390)),
|
(-96, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Triglavian Entities')) + _t('Normal Subcaps'), 0, 610, 0, 390)),
|
||||||
# To avoid errors on msgfmt, we have to mark that '0%' is meaning literally 0% with no-python-format.
|
# To avoid errors on msgfmt, we have to mark that '0%' is meaning literally 0% with no-python-format.
|
||||||
# See also: https://github.com/vslavik/poedit/issues/645
|
# See also: https://github.com/vslavik/poedit/issues/645
|
||||||
(-88, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Triglavian Entities')) +
|
(-97, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Triglavian Entities')) +
|
||||||
# xgettext:no-python-format
|
# xgettext:no-python-format
|
||||||
_t('Subcaps w/missiles 0% spool up'), 367, 155, 367, 112)),
|
_t('Subcaps w/missiles 0% spool up'), 367, 155, 367, 112)),
|
||||||
(-89, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Triglavian Entities')) +
|
(-98, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Triglavian Entities')) +
|
||||||
# xgettext:no-python-format
|
# xgettext:no-python-format
|
||||||
_t('Subcaps w/missiles 50% spool up'), 291, 243, 291, 175)),
|
_t('Subcaps w/missiles 50% spool up'), 291, 243, 291, 175)),
|
||||||
(-90, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Triglavian Entities')) +
|
(-99, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Triglavian Entities')) +
|
||||||
# xgettext:no-python-format
|
# xgettext:no-python-format
|
||||||
_t('Subcaps w/missiles 100% spool up'), 241, 301, 241, 217)),
|
_t('Subcaps w/missiles 100% spool up'), 241, 301, 241, 217)),
|
||||||
(-91, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Amarr EDENCOM Entities')) + _t('Dread/Subcaps'), 583, 417, 0, 0)),
|
(-100, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Amarr EDENCOM Entities')) + _t('Dread/Subcaps'), 583, 417, 0, 0)),
|
||||||
(-92, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Caldari EDENCOM Entities')) + _t('Dread'), 1000, 0, 0, 0)),
|
(-101, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Caldari EDENCOM Entities')) + _t('Dread'), 1000, 0, 0, 0)),
|
||||||
(-93, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Caldari EDENCOM Entities')) + _t('Subcaps'), 511, 21, 29, 440)),
|
(-102, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Caldari EDENCOM Entities')) + _t('Subcaps'), 511, 21, 29, 440)),
|
||||||
(-94, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Gallente EDENCOM Entities')) + _t('Dread/Subcaps'), 0, 417, 583, 0)),
|
(-103, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Gallente EDENCOM Entities')) + _t('Dread/Subcaps'), 0, 417, 583, 0)),
|
||||||
(-95, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Minmatar EDENCOM Entities')) + _t('Dread'), 0, 0, 583, 417)),
|
(-104, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Minmatar EDENCOM Entities')) + _t('Dread'), 0, 0, 583, 417)),
|
||||||
(-96, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Minmatar EDENCOM Entities')) + _t('Subcaps'), 302, 136, 328, 234)),
|
(-105, (_c(_t('NPC')) + _c(_t('Invasion')) + _c(_t('Minmatar EDENCOM Entities')) + _t('Subcaps'), 302, 136, 328, 234)),
|
||||||
(-110, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Drifter Entities'), 250, 250, 250, 250)),
|
(-106, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Drifter Entities'), 250, 250, 250, 250)),
|
||||||
(-112, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Sleeper Entities'), 265, 265, 235, 235)),
|
(-107, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Sleeper Entities'), 265, 265, 235, 235)),
|
||||||
(-111, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Rogue Drone Entities'), 250, 250, 250, 250)),
|
(-108, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Rogue Drone Entities'), 250, 250, 250, 250)),
|
||||||
(-97, (_c(_t('NPC')) + _c(_t('Mission')) + _t('Amarr Empire'), 4464, 3546, 97, 0)),
|
(-109, (_c(_t('NPC')) + _c(_t('Mission')) + _t('Amarr Empire'), 4464, 3546, 97, 0)),
|
||||||
(-98, (_c(_t('NPC')) + _c(_t('Mission')) + _t('Caldari State'), 0, 2139, 4867, 0)),
|
(-110, (_c(_t('NPC')) + _c(_t('Mission')) + _t('Caldari State'), 0, 2139, 4867, 0)),
|
||||||
(-99, (_c(_t('NPC')) + _c(_t('Mission')) + _t('CONCORD'), 336, 134, 212, 412)),
|
(-111, (_c(_t('NPC')) + _c(_t('Mission')) + _t('CONCORD'), 336, 134, 212, 412)),
|
||||||
(-100, (_c(_t('NPC')) + _c(_t('Mission')) + _t('Gallente Federation'), 9, 3712, 2758, 0)),
|
(-112, (_c(_t('NPC')) + _c(_t('Mission')) + _t('Gallente Federation'), 9, 3712, 2758, 0)),
|
||||||
(-101, (_c(_t('NPC')) + _c(_t('Mission')) + _t('Khanid'), 612, 483, 43, 6)),
|
(-113, (_c(_t('NPC')) + _c(_t('Mission')) + _t('Khanid'), 612, 483, 43, 6)),
|
||||||
(-102, (_c(_t('NPC')) + _c(_t('Mission')) + _t('Minmatar Republic'), 1024, 388, 1655, 4285)),
|
(-114, (_c(_t('NPC')) + _c(_t('Mission')) + _t('Minmatar Republic'), 1024, 388, 1655, 4285)),
|
||||||
(-103, (_c(_t('NPC')) + _c(_t('Mission')) + _t('Mordus Legion'), 25, 262, 625, 0)),
|
(-115, (_c(_t('NPC')) + _c(_t('Mission')) + _t('Mordus Legion'), 25, 262, 625, 0)),
|
||||||
(-104, (_c(_t('NPC')) + _c(_t('Mission')) + _t('Thukker'), 0, 52, 10, 79)),
|
(-116, (_c(_t('NPC')) + _c(_t('Mission')) + _t('Thukker'), 0, 52, 10, 79)),
|
||||||
(-105, (_c(_t('NPC')) + _t('Sansha Incursion'), 1682, 1347, 3678, 3678)),
|
(-117, (_c(_t('NPC')) + _t('Sansha Incursion'), 1682, 1347, 3678, 3678)),
|
||||||
(-106, (_c(_t('NPC')) + _t('Sleepers'), 1472, 1472, 1384, 1384))])
|
(-118, (_c(_t('NPC')) + _t('Sleepers'), 1472, 1472, 1384, 1384))])
|
||||||
|
|
||||||
|
|
||||||
class DamagePattern:
|
class DamagePattern:
|
||||||
@@ -207,11 +216,11 @@ class DamagePattern:
|
|||||||
pattern.builtin = True
|
pattern.builtin = True
|
||||||
cls._builtins[id] = pattern
|
cls._builtins[id] = pattern
|
||||||
|
|
||||||
def calculateEhp(self, fit):
|
def calculateEhp(self, item):
|
||||||
ehp = {}
|
ehp = {}
|
||||||
for (type, attr) in (('shield', 'shieldCapacity'), ('armor', 'armorHP'), ('hull', 'hp')):
|
for (type, attr) in (('shield', 'shieldCapacity'), ('armor', 'armorHP'), ('hull', 'hp')):
|
||||||
rawCapacity = fit.ship.getModifiedItemAttr(attr)
|
rawCapacity = item.getModifiedItemAttr(attr)
|
||||||
ehp[type] = self.effectivify(fit, rawCapacity, type)
|
ehp[type] = self.effectivify(item, rawCapacity, type)
|
||||||
|
|
||||||
return ehp
|
return ehp
|
||||||
|
|
||||||
@@ -227,10 +236,10 @@ class DamagePattern:
|
|||||||
ereps = {}
|
ereps = {}
|
||||||
for field in tankInfo:
|
for field in tankInfo:
|
||||||
if field in typeMap:
|
if field in typeMap:
|
||||||
ereps[field] = self.effectivify(fit, tankInfo[field], typeMap[field])
|
ereps[field] = self.effectivify(fit.ship, tankInfo[field], typeMap[field])
|
||||||
return ereps
|
return ereps
|
||||||
|
|
||||||
def effectivify(self, fit, amount, type):
|
def effectivify(self, item, amount, type):
|
||||||
type = type if type != "hull" else ""
|
type = type if type != "hull" else ""
|
||||||
totalDamage = sum((self.emAmount, self.thermalAmount, self.kineticAmount, self.explosiveAmount))
|
totalDamage = sum((self.emAmount, self.thermalAmount, self.kineticAmount, self.explosiveAmount))
|
||||||
specificDivider = 0
|
specificDivider = 0
|
||||||
@@ -239,7 +248,7 @@ class DamagePattern:
|
|||||||
attrName = "%s%sDamageResonance" % (type, damageType.capitalize())
|
attrName = "%s%sDamageResonance" % (type, damageType.capitalize())
|
||||||
attrName = attrName[0].lower() + attrName[1:]
|
attrName = attrName[0].lower() + attrName[1:]
|
||||||
|
|
||||||
resonance = fit.ship.getModifiedItemAttr(attrName)
|
resonance = item.getModifiedItemAttr(attrName)
|
||||||
damage = getattr(self, "%sAmount" % damageType)
|
damage = getattr(self, "%sAmount" % damageType)
|
||||||
|
|
||||||
specificDivider += damage / float(totalDamage or 1) * resonance
|
specificDivider += damage / float(totalDamage or 1) * resonance
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, Mu
|
|||||||
self.__baseRRAmount = None
|
self.__baseRRAmount = None
|
||||||
self.__miningYield = None
|
self.__miningYield = None
|
||||||
self.__miningWaste = None
|
self.__miningWaste = None
|
||||||
|
self.__ehp = None
|
||||||
self.__itemModifiedAttributes = ModifiedAttributeDict()
|
self.__itemModifiedAttributes = ModifiedAttributeDict()
|
||||||
self.__itemModifiedAttributes.original = self._item.attributes
|
self.__itemModifiedAttributes.original = self._item.attributes
|
||||||
self.__itemModifiedAttributes.overrides = self._item.overrides
|
self.__itemModifiedAttributes.overrides = self._item.overrides
|
||||||
@@ -287,6 +288,29 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, Mu
|
|||||||
if delay is not None and speed is not None:
|
if delay is not None and speed is not None:
|
||||||
return delay / 1000.0 * speed
|
return delay / 1000.0 * speed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def hp(self):
|
||||||
|
hp = {}
|
||||||
|
for (type, attr) in (('shield', 'shieldCapacity'), ('armor', 'armorHP'), ('hull', 'hp')):
|
||||||
|
hp[type] = self.getModifiedItemAttr(attr)
|
||||||
|
|
||||||
|
return hp
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ehp(self):
|
||||||
|
if self.__ehp is None:
|
||||||
|
if self.owner is None or self.owner.damagePattern is None:
|
||||||
|
ehp = self.hp
|
||||||
|
else:
|
||||||
|
ehp = self.owner.damagePattern.calculateEhp(self)
|
||||||
|
self.__ehp = ehp
|
||||||
|
return self.__ehp
|
||||||
|
|
||||||
|
def calculateShieldRecharge(self):
|
||||||
|
capacity = self.getModifiedItemAttr("shieldCapacity")
|
||||||
|
rechargeRate = self.getModifiedItemAttr("shieldRechargeRate") / 1000.0
|
||||||
|
return 10 / rechargeRate * math.sqrt(0.25) * (1 - math.sqrt(0.25)) * capacity
|
||||||
|
|
||||||
# Had to add this to match the falloff property in modules.py
|
# Had to add this to match the falloff property in modules.py
|
||||||
# Fscking ship scanners. If you find any other falloff attributes,
|
# Fscking ship scanners. If you find any other falloff attributes,
|
||||||
# Put them in the attrs tuple.
|
# Put them in the attrs tuple.
|
||||||
@@ -318,6 +342,7 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, Mu
|
|||||||
self.__baseRRAmount = None
|
self.__baseRRAmount = None
|
||||||
self.__miningYield = None
|
self.__miningYield = None
|
||||||
self.__miningWaste = None
|
self.__miningWaste = None
|
||||||
|
self.__ehp = None
|
||||||
self.itemModifiedAttributes.clear()
|
self.itemModifiedAttributes.clear()
|
||||||
self.chargeModifiedAttributes.clear()
|
self.chargeModifiedAttributes.clear()
|
||||||
|
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ class Fighter(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
|
|||||||
self.__charge = None
|
self.__charge = None
|
||||||
self.__baseVolley = None
|
self.__baseVolley = None
|
||||||
self.__miningyield = None
|
self.__miningyield = None
|
||||||
|
self.__ehp = None
|
||||||
self.__itemModifiedAttributes = ModifiedAttributeDict()
|
self.__itemModifiedAttributes = ModifiedAttributeDict()
|
||||||
self.__chargeModifiedAttributes = ModifiedAttributeDict()
|
self.__chargeModifiedAttributes = ModifiedAttributeDict()
|
||||||
|
|
||||||
@@ -345,6 +346,29 @@ class Fighter(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
|
|||||||
if falloff is not None:
|
if falloff is not None:
|
||||||
return falloff
|
return falloff
|
||||||
|
|
||||||
|
@property
|
||||||
|
def hp(self):
|
||||||
|
hp = {}
|
||||||
|
for (type, attr) in (('shield', 'shieldCapacity'), ('armor', 'armorHP'), ('hull', 'hp')):
|
||||||
|
hp[type] = self.getModifiedItemAttr(attr)
|
||||||
|
|
||||||
|
return hp
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ehp(self):
|
||||||
|
if self.__ehp is None:
|
||||||
|
if self.owner is None or self.owner.damagePattern is None:
|
||||||
|
ehp = self.hp
|
||||||
|
else:
|
||||||
|
ehp = self.owner.damagePattern.calculateEhp(self)
|
||||||
|
self.__ehp = ehp
|
||||||
|
return self.__ehp
|
||||||
|
|
||||||
|
def calculateShieldRecharge(self):
|
||||||
|
capacity = self.getModifiedItemAttr("shieldCapacity")
|
||||||
|
rechargeRate = self.getModifiedItemAttr("shieldRechargeRate") / 1000.0
|
||||||
|
return 10 / rechargeRate * math.sqrt(0.25) * (1 - math.sqrt(0.25)) * capacity
|
||||||
|
|
||||||
@validates("ID", "itemID", "chargeID", "amount")
|
@validates("ID", "itemID", "chargeID", "amount")
|
||||||
def validator(self, key, val):
|
def validator(self, key, val):
|
||||||
map = {
|
map = {
|
||||||
@@ -361,6 +385,7 @@ class Fighter(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
|
|||||||
def clear(self):
|
def clear(self):
|
||||||
self.__baseVolley = None
|
self.__baseVolley = None
|
||||||
self.__miningyield = None
|
self.__miningyield = None
|
||||||
|
self.__ehp = None
|
||||||
self.itemModifiedAttributes.clear()
|
self.itemModifiedAttributes.clear()
|
||||||
self.chargeModifiedAttributes.clear()
|
self.chargeModifiedAttributes.clear()
|
||||||
[x.clear() for x in self.abilities]
|
[x.clear() for x in self.abilities]
|
||||||
|
|||||||
@@ -1469,7 +1469,7 @@ class Fit:
|
|||||||
if self.damagePattern is None:
|
if self.damagePattern is None:
|
||||||
ehp = self.hp
|
ehp = self.hp
|
||||||
else:
|
else:
|
||||||
ehp = self.damagePattern.calculateEhp(self)
|
ehp = self.damagePattern.calculateEhp(self.ship)
|
||||||
self.__ehp = ehp
|
self.__ehp = ehp
|
||||||
|
|
||||||
return self.__ehp
|
return self.__ehp
|
||||||
|
|||||||
@@ -122,6 +122,8 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M
|
|||||||
if self.__charge and self.__charge.category.name != "Charge":
|
if self.__charge and self.__charge.category.name != "Charge":
|
||||||
self.__charge = None
|
self.__charge = None
|
||||||
|
|
||||||
|
self.rahPatternOverride = None
|
||||||
|
|
||||||
self.__baseVolley = None
|
self.__baseVolley = None
|
||||||
self.__baseRRAmount = None
|
self.__baseRRAmount = None
|
||||||
self.__miningYield = None
|
self.__miningYield = None
|
||||||
@@ -694,16 +696,22 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
# Check max group fitted
|
# Check max group fitted
|
||||||
max = self.getModifiedItemAttr("maxGroupFitted")
|
# use raw value, since it seems what EVE uses. Example is FAXes with their capacitor boosters,
|
||||||
if max:
|
# which have unmodified value of 10, and modified of 1, and you can actually fit multiples
|
||||||
current = 0 # if self.owner != fit else -1 # Disabled, see #1278
|
try:
|
||||||
for mod in fit.modules:
|
max = self.item.attributes.get('maxGroupFitted').value
|
||||||
if (mod.item and mod.item.groupID == self.item.groupID and
|
except AttributeError:
|
||||||
self.getModPosition(fit) != mod.getModPosition(fit)):
|
pass
|
||||||
current += 1
|
else:
|
||||||
|
if max:
|
||||||
|
current = 0 # if self.owner != fit else -1 # Disabled, see #1278
|
||||||
|
for mod in fit.modules:
|
||||||
|
if (mod.item and mod.item.groupID == self.item.groupID and
|
||||||
|
self.getModPosition(fit) != mod.getModPosition(fit)):
|
||||||
|
current += 1
|
||||||
|
|
||||||
if current >= max:
|
if current >= max:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# Check this only if we're told to do so
|
# Check this only if we're told to do so
|
||||||
if hardpointLimit:
|
if hardpointLimit:
|
||||||
@@ -1075,6 +1083,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M
|
|||||||
copy.spoolType = self.spoolType
|
copy.spoolType = self.spoolType
|
||||||
copy.spoolAmount = self.spoolAmount
|
copy.spoolAmount = self.spoolAmount
|
||||||
copy.projectionRange = self.projectionRange
|
copy.projectionRange = self.projectionRange
|
||||||
|
copy.rahPatternOverride = self.rahPatternOverride
|
||||||
self._mutaApplyMutators(mutatorClass=MutatorModule, targetInstance=copy)
|
self._mutaApplyMutators(mutatorClass=MutatorModule, targetInstance=copy)
|
||||||
|
|
||||||
return copy
|
return copy
|
||||||
@@ -1085,6 +1094,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M
|
|||||||
spoolType = self.spoolType
|
spoolType = self.spoolType
|
||||||
spoolAmount = self.spoolAmount
|
spoolAmount = self.spoolAmount
|
||||||
projectionRange = self.projectionRange
|
projectionRange = self.projectionRange
|
||||||
|
rahPatternOverride = self.rahPatternOverride
|
||||||
|
|
||||||
Module.__init__(self, item, self.baseItem, self.mutaplasmid)
|
Module.__init__(self, item, self.baseItem, self.mutaplasmid)
|
||||||
self.state = state
|
self.state = state
|
||||||
@@ -1093,6 +1103,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M
|
|||||||
self.spoolType = spoolType
|
self.spoolType = spoolType
|
||||||
self.spoolAmount = spoolAmount
|
self.spoolAmount = spoolAmount
|
||||||
self.projectionRange = projectionRange
|
self.projectionRange = projectionRange
|
||||||
|
self.rahPatternOverride = rahPatternOverride
|
||||||
self._mutaApplyMutators(mutatorClass=MutatorModule)
|
self._mutaApplyMutators(mutatorClass=MutatorModule)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
|
|||||||
@@ -78,158 +78,166 @@ BUILTINS = OrderedDict([
|
|||||||
(-37, (_c(_t('NPC')) + _c(_t('Mission')) + _t('Mordus Legion'), 0.32, 0.48, 0.4, 0.62)),
|
(-37, (_c(_t('NPC')) + _c(_t('Mission')) + _t('Mordus Legion'), 0.32, 0.48, 0.4, 0.62)),
|
||||||
(-38, (_c(_t('NPC')) + _c(_t('Other')) + _t('Sleeper'), 0.61, 0.61, 0.61, 0.61)),
|
(-38, (_c(_t('NPC')) + _c(_t('Other')) + _t('Sleeper'), 0.61, 0.61, 0.61, 0.61)),
|
||||||
(-39, (_c(_t('NPC')) + _c(_t('Other')) + _t('Sansha Incursion'), 0.65, 0.63, 0.64, 0.65)),
|
(-39, (_c(_t('NPC')) + _c(_t('Other')) + _t('Sansha Incursion'), 0.65, 0.63, 0.64, 0.65)),
|
||||||
(-40, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Cruor'), 0.795, 0.734, 0.693, 0.672, 900, 18, 20.5)),
|
# Anomic Team, source: client data dump
|
||||||
(-41, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Dramiel'), 0.351, 0.481, 0.611, 0.676, 2100, 11, 25)),
|
(-40, (_c(_t('NPC')) + _c(_t('Burner')) + _c(_t('Team')) + _t('Enyo'), 0.575, 0.724, 0.862, 0.235, 1020, 37, 39)),
|
||||||
(-42, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Daredevil'), 0.685, 0.59, 0.59, 0.433, 1200, 18, 25)),
|
(-41, (_c(_t('NPC')) + _c(_t('Burner')) + _c(_t('Team')) + _t('Navitas'), 0.681, 0.586, 0.522, 0.49, 870, 30, 35)),
|
||||||
(-43, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Succubus'), 0.351, 0.481, 0.611, 0.676, 4750, 30, 59)),
|
(-42, (_c(_t('NPC')) + _c(_t('Burner')) + _c(_t('Team')) + _t('Hawk'), 0.3, 0.86, 0.79, 0.65, 1122, 48, 39)),
|
||||||
(-44, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Worm'), 0.475, 0.58, 0.685, 0.738, 360, 70, 39)),
|
(-43, (_c(_t('NPC')) + _c(_t('Burner')) + _c(_t('Team')) + _t('Bantam'), 0.344, 0.475, 0.606, 0.672, 1016, 45, 27)),
|
||||||
(-45, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Enyo'), 0.58, 0.72, 0.86, 0.24)),
|
(-44, (_c(_t('NPC')) + _c(_t('Burner')) + _c(_t('Team')) + _t('Jaguar'), 0.781, 0.65, 0.475, 0.563, 1400, 42, 31)),
|
||||||
(-46, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Hawk'), 0.3, 0.86, 0.79, 0.65)),
|
(-45, (_c(_t('NPC')) + _c(_t('Burner')) + _c(_t('Team')) + _t('Burst'), 0.344, 0.475, 0.606, 0.672, 1174, 39, 31)),
|
||||||
(-47, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Jaguar'), 0.78, 0.65, 0.48, 0.56)),
|
(-46, (_c(_t('NPC')) + _c(_t('Burner')) + _c(_t('Team')) + _t('Vengeance'), 0.66, 0.558, 0.745, 0.864, 1050, 37, 40)),
|
||||||
(-48, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Vengeance'), 0.66, 0.56, 0.75, 0.86)),
|
(-47, (_c(_t('NPC')) + _c(_t('Burner')) + _c(_t('Team')) + _t('Inquisitor'), 0.681, 0.586, 0.522, 0.49, 920, 29, 20.5)),
|
||||||
(-49, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Ashimmu'), 0.8, 0.76, 0.68, 0.7, 500, 120, 137)),
|
# Anomic Agent & Base, source: client data dump
|
||||||
(-50, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Talos'), 0.681, 0.586, 0.586, 0.426, 150, 125, 266)),
|
(-48, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Cruor'), 0.795, 0.734, 0.693, 0.672, 900, 18, 20.5)),
|
||||||
(-51, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Sentinel'), 0.575, 0.448, 0.522, 0.66, 500, 50, 39)),
|
(-49, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Dramiel'), 0.351, 0.481, 0.611, 0.676, 2100, 11, 25)),
|
||||||
|
(-50, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Daredevil'), 0.685, 0.59, 0.59, 0.433, 1200, 18, 25)),
|
||||||
|
(-51, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Succubus'), 0.351, 0.481, 0.611, 0.676, 4750, 30, 59)),
|
||||||
|
(-52, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Worm'), 0.475, 0.58, 0.685, 0.738, 360, 70, 39)),
|
||||||
|
(-53, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Ashimmu'), 0.8, 0.76, 0.68, 0.7, 500, 120, 137)),
|
||||||
|
(-54, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Sentinel'), 0.575, 0.448, 0.522, 0.66, 500, 50, 39)),
|
||||||
|
(-55, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Talos'), 0.681, 0.586, 0.586, 0.426, 150, 125, 266)),
|
||||||
|
(-56, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Dragonfly'), 0.35, 0.72, 0.70, 0.55, 1200, 15, 35)),
|
||||||
|
(-57, (_c(_t('NPC')) + _c(_t('Burner')) + _t('Mantis'), 0.60, 0.52, 0.71, 0.71, 900, 25, 35)),
|
||||||
# Source: ticket #2067
|
# Source: ticket #2067
|
||||||
(-52, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Triglavian Entities'), 0.422, 0.367, 0.453, 0.411)),
|
(-58, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Triglavian Entities'), 0.422, 0.367, 0.453, 0.411)),
|
||||||
(-53, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Amarr EDENCOM Entities'), 0.360, 0.310, 0.441, 0.602)),
|
(-59, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Amarr EDENCOM Entities'), 0.360, 0.310, 0.441, 0.602)),
|
||||||
(-54, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Caldari EDENCOM Entities'), 0.303, 0.610, 0.487, 0.401)),
|
(-60, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Caldari EDENCOM Entities'), 0.303, 0.610, 0.487, 0.401)),
|
||||||
(-55, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Gallente EDENCOM Entities'), 0.383, 0.414, 0.578, 0.513)),
|
(-61, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Gallente EDENCOM Entities'), 0.383, 0.414, 0.578, 0.513)),
|
||||||
(-56, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Minmatar EDENCOM Entities'), 0.620, 0.422, 0.355, 0.399)),
|
(-62, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Minmatar EDENCOM Entities'), 0.620, 0.422, 0.355, 0.399)),
|
||||||
(-57, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Drones'), 0.439, 0.522, 0.529, 0.435)),
|
(-63, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Drones'), 0.439, 0.522, 0.529, 0.435)),
|
||||||
(-58, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Overmind'), 0.643, 0.593, 0.624, 0.639)),
|
(-64, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Overmind'), 0.643, 0.593, 0.624, 0.639)),
|
||||||
(-59, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Seeker'), 0.082, 0.082, 0.082, 0.082)),
|
(-65, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Seeker'), 0.082, 0.082, 0.082, 0.082)),
|
||||||
(-60, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Triglavian'), 0.494, 0.41, 0.464, 0.376)),
|
(-66, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Triglavian'), 0.494, 0.41, 0.464, 0.376)),
|
||||||
(-61, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Drifter'), 0.415, 0.415, 0.415, 0.415)),
|
(-67, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Drifter'), 0.415, 0.415, 0.415, 0.415)),
|
||||||
(-62, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Sleeper'), 0.435, 0.435, 0.435, 0.435)),
|
(-68, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Sleeper'), 0.435, 0.435, 0.435, 0.435)),
|
||||||
(-63, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('All'), 0.508, 0.474, 0.495, 0.488)),
|
(-69, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('All'), 0.508, 0.474, 0.495, 0.488)),
|
||||||
(-64, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Drones'), 0.323, 0.522, 0.529, 0.435)),
|
(-70, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Drones'), 0.323, 0.522, 0.529, 0.435)),
|
||||||
(-65, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Overmind'), 0.542, 0.593, 0.624, 0.639)),
|
(-71, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Overmind'), 0.542, 0.593, 0.624, 0.639)),
|
||||||
(-66, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Seeker'), 0, 0.082, 0.082, 0.082)),
|
(-72, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Seeker'), 0, 0.082, 0.082, 0.082)),
|
||||||
(-67, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Triglavian'), 0.356, 0.41, 0.464, 0.376)),
|
(-73, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Triglavian'), 0.356, 0.41, 0.464, 0.376)),
|
||||||
(-68, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Drifter'), 0.277, 0.415, 0.415, 0.415)),
|
(-74, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Drifter'), 0.277, 0.415, 0.415, 0.415)),
|
||||||
(-69, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Sleeper'), 0.329, 0.435, 0.435, 0.435)),
|
(-75, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Sleeper'), 0.329, 0.435, 0.435, 0.435)),
|
||||||
(-70, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('All'), 0.381, 0.474, 0.495, 0.488)),
|
(-76, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('All'), 0.381, 0.474, 0.495, 0.488)),
|
||||||
(-71, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Drones'), 0.255, 0.522, 0.529, 0.435)),
|
(-77, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Drones'), 0.255, 0.522, 0.529, 0.435)),
|
||||||
(-72, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Overmind'), 0.48, 0.593, 0.624, 0.639)),
|
(-78, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Overmind'), 0.48, 0.593, 0.624, 0.639)),
|
||||||
(-73, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Seeker'), 0, 0.082, 0.082, 0.0822)),
|
(-79, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Seeker'), 0, 0.082, 0.082, 0.0822)),
|
||||||
(-74, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Triglavian'), 0.268, 0.41, 0.464, 0.376)),
|
(-80, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Triglavian'), 0.268, 0.41, 0.464, 0.376)),
|
||||||
(-75, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Drifter'), 0.191, 0.415, 0.415, 0.415)),
|
(-81, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Drifter'), 0.191, 0.415, 0.415, 0.415)),
|
||||||
(-76, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Sleeper'), 0.268, 0.435, 0.435, 0.435)),
|
(-82, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Sleeper'), 0.268, 0.435, 0.435, 0.435)),
|
||||||
(-77, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('All'), 0.308, 0.474, 0.495, 0.488)),
|
(-83, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('All'), 0.308, 0.474, 0.495, 0.488)),
|
||||||
(-78, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Drones'), 0.193, 0.522, 0.529, 0.435)),
|
(-84, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Drones'), 0.193, 0.522, 0.529, 0.435)),
|
||||||
(-79, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Overmind'), 0.423, 0.593, 0.624, 0.639)),
|
(-85, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Overmind'), 0.423, 0.593, 0.624, 0.639)),
|
||||||
(-80, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Seeker'), 0, 0.082, 0.082, 0.082)),
|
(-86, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Seeker'), 0, 0.082, 0.082, 0.082)),
|
||||||
(-81, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Triglavian'), 0.206, 0.41, 0.464, 0.376)),
|
(-87, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Triglavian'), 0.206, 0.41, 0.464, 0.376)),
|
||||||
(-82, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Drifter'), 0.111, 0.415, 0.415, 0.415)),
|
(-88, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Drifter'), 0.111, 0.415, 0.415, 0.415)),
|
||||||
(-83, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Sleeper'), 0.215, 0.435, 0.435, 0.435)),
|
(-89, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Sleeper'), 0.215, 0.435, 0.435, 0.435)),
|
||||||
(-84, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('All'), 0.247, 0.474, 0.495, 0.488)),
|
(-90, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('All'), 0.247, 0.474, 0.495, 0.488)),
|
||||||
(-85, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Drones'), 0.461, 0.425, 0.541, 0.443)),
|
(-91, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Drones'), 0.461, 0.425, 0.541, 0.443)),
|
||||||
(-86, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Overmind'), 0.666, 0.489, 0.634, 0.646)),
|
(-92, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Overmind'), 0.666, 0.489, 0.634, 0.646)),
|
||||||
(-87, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Seeker'), 0.084, 0, 0.084, 0.084)),
|
(-93, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Seeker'), 0.084, 0, 0.084, 0.084)),
|
||||||
(-88, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Triglavian'), 0.537, 0.269, 0.489, 0.371)),
|
(-94, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Triglavian'), 0.537, 0.269, 0.489, 0.371)),
|
||||||
(-89, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Drifter'), 0.43, 0.289, 0.43, 0.43)),
|
(-95, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Drifter'), 0.43, 0.289, 0.43, 0.43)),
|
||||||
(-90, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Sleeper'), 0.512, 0.402, 0.512, 0.512)),
|
(-96, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Sleeper'), 0.512, 0.402, 0.512, 0.512)),
|
||||||
(-91, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('All'), 0.537, 0.352, 0.512, 0.495)),
|
(-97, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('All'), 0.537, 0.352, 0.512, 0.495)),
|
||||||
(-92, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Drones'), 0.461, 0.36, 0.541, 0.443)),
|
(-98, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Drones'), 0.461, 0.36, 0.541, 0.443)),
|
||||||
(-93, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Overmind'), 0.666, 0.413, 0.634, 0.646)),
|
(-99, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Overmind'), 0.666, 0.413, 0.634, 0.646)),
|
||||||
(-94, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Seeker'), 0.084, 0, 0.084, 0.084)),
|
(-100, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Seeker'), 0.084, 0, 0.084, 0.084)),
|
||||||
(-95, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Triglavian'), 0.537, 0.166, 0.489, 0.371)),
|
(-101, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Triglavian'), 0.537, 0.166, 0.489, 0.371)),
|
||||||
(-96, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Drifter'), 0.43, 0.201, 0.43, 0.43)),
|
(-102, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Drifter'), 0.43, 0.201, 0.43, 0.43)),
|
||||||
(-97, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Sleeper'), 0.512, 0.337, 0.512, 0.512)),
|
(-103, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Sleeper'), 0.512, 0.337, 0.512, 0.512)),
|
||||||
(-98, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('All'), 0.537, 0.269, 0.512, 0.495)),
|
(-104, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('All'), 0.537, 0.269, 0.512, 0.495)),
|
||||||
(-99, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Drones'), 0.461, 0.305, 0.541, 0.443)),
|
(-105, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Drones'), 0.461, 0.305, 0.541, 0.443)),
|
||||||
(-100, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Overmind'), 0.666, 0.345, 0.634, 0.646)),
|
(-106, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Overmind'), 0.666, 0.345, 0.634, 0.646)),
|
||||||
(-101, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Seeker'), 0.084, 0, 0.084, 0.084)),
|
(-107, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Seeker'), 0.084, 0, 0.084, 0.084)),
|
||||||
(-102, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Triglavian'), 0.537, 0.085, 0.489, 0.371)),
|
(-108, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Triglavian'), 0.537, 0.085, 0.489, 0.371)),
|
||||||
(-103, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Drifter'), 0.43, 0.117, 0.43, 0.43)),
|
(-109, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Drifter'), 0.43, 0.117, 0.43, 0.43)),
|
||||||
(-104, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Sleeper'), 0.512, 0.276, 0.512, 0.512)),
|
(-110, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Sleeper'), 0.512, 0.276, 0.512, 0.512)),
|
||||||
(-105, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('All'), 0.537, 0.201, 0.512, 0.495)),
|
(-111, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('All'), 0.537, 0.201, 0.512, 0.495)),
|
||||||
(-106, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Drones'), 0.439, 0.522, 0.417, 0.435)),
|
(-112, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Drones'), 0.439, 0.522, 0.417, 0.435)),
|
||||||
(-107, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Overmind'), 0.643, 0.593, 0.511, 0.639)),
|
(-113, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Overmind'), 0.643, 0.593, 0.511, 0.639)),
|
||||||
(-108, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Seeker'), 0.082, 0.082, 0, 0.082)),
|
(-114, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Seeker'), 0.082, 0.082, 0, 0.082)),
|
||||||
(-109, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Triglavian'), 0.494, 0.41, 0.304, 0.376)),
|
(-115, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Triglavian'), 0.494, 0.41, 0.304, 0.376)),
|
||||||
(-110, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Drifter'), 0.415, 0.415, 0.277, 0.415)),
|
(-116, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Drifter'), 0.415, 0.415, 0.277, 0.415)),
|
||||||
(-111, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Sleeper'), 0.435, 0.435, 0.329, 0.435)),
|
(-117, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Sleeper'), 0.435, 0.435, 0.329, 0.435)),
|
||||||
(-112, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('All'), 0.508, 0.474, 0.359, 0.488)),
|
(-118, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('All'), 0.508, 0.474, 0.359, 0.488)),
|
||||||
(-113, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Drones'), 0.439, 0.522, 0.351, 0.435)),
|
(-119, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Drones'), 0.439, 0.522, 0.351, 0.435)),
|
||||||
(-114, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Overmind'), 0.643, 0.593, 0.435, 0.639)),
|
(-120, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Overmind'), 0.643, 0.593, 0.435, 0.639)),
|
||||||
(-115, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Seeker'), 0.082, 0.082, 0, 0.082)),
|
(-121, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Seeker'), 0.082, 0.082, 0, 0.082)),
|
||||||
(-116, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Triglavian'), 0.494, 0.41, 0.198, 0.376)),
|
(-122, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Triglavian'), 0.494, 0.41, 0.198, 0.376)),
|
||||||
(-117, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Drifter'), 0.415, 0.415, 0.191, 0.415)),
|
(-123, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Drifter'), 0.415, 0.415, 0.191, 0.415)),
|
||||||
(-118, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Sleeper'), 0.435, 0.435, 0.268, 0.435)),
|
(-124, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Sleeper'), 0.435, 0.435, 0.268, 0.435)),
|
||||||
(-119, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('All'), 0.508, 0.474, 0.276, 0.488)),
|
(-125, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('All'), 0.508, 0.474, 0.276, 0.488)),
|
||||||
(-120, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Drones'), 0.439, 0.522, 0.293, 0.435)),
|
(-126, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Drones'), 0.439, 0.522, 0.293, 0.435)),
|
||||||
(-121, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Overmind'), 0.643, 0.593, 0.362, 0.639)),
|
(-127, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Overmind'), 0.643, 0.593, 0.362, 0.639)),
|
||||||
(-122, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Seeker'), 0.082, 0.082, 0, 0.082)),
|
(-128, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Seeker'), 0.082, 0.082, 0, 0.082)),
|
||||||
(-123, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Triglavian'), 0.494, 0.41, 0.122, 0.376)),
|
(-129, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Triglavian'), 0.494, 0.41, 0.122, 0.376)),
|
||||||
(-124, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Drifter'), 0.415, 0.415, 0.111, 0.415)),
|
(-130, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Drifter'), 0.415, 0.415, 0.111, 0.415)),
|
||||||
(-125, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Sleeper'), 0.435, 0.435, 0.215, 0.435)),
|
(-131, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Sleeper'), 0.435, 0.435, 0.215, 0.435)),
|
||||||
(-126, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('All'), 0.508, 0.474, 0.208, 0.488)),
|
(-132, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('All'), 0.508, 0.474, 0.208, 0.488)),
|
||||||
(-127, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Drones'), 0.449, 0.54, 0.549, 0.336)),
|
(-133, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Drones'), 0.449, 0.54, 0.549, 0.336)),
|
||||||
(-128, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Overmind'), 0.619, 0.574, 0.612, 0.522)),
|
(-134, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Overmind'), 0.619, 0.574, 0.612, 0.522)),
|
||||||
(-129, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Seeker'), 0.085, 0.085, 0.085, 0)),
|
(-135, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Seeker'), 0.085, 0.085, 0.085, 0)),
|
||||||
(-130, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Triglavian'), 0.477, 0.4, 0.461, 0.202)),
|
(-136, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Triglavian'), 0.477, 0.4, 0.461, 0.202)),
|
||||||
(-131, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Drifter'), 0.437, 0.437, 0.437, 0.295)),
|
(-137, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Drifter'), 0.437, 0.437, 0.437, 0.295)),
|
||||||
(-132, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Sleeper'), 0.435, 0.435, 0.435, 0.329)),
|
(-138, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Sleeper'), 0.435, 0.435, 0.435, 0.329)),
|
||||||
(-133, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('All'), 0.493, 0.468, 0.492, 0.35)),
|
(-139, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('All'), 0.493, 0.468, 0.492, 0.35)),
|
||||||
(-134, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Drones'), 0.449, 0.54, 0.549, 0.264)),
|
(-140, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Drones'), 0.449, 0.54, 0.549, 0.264)),
|
||||||
(-135, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Overmind'), 0.619, 0.574, 0.612, 0.449)),
|
(-141, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Overmind'), 0.619, 0.574, 0.612, 0.449)),
|
||||||
(-136, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Seeker'), 0.085, 0.085, 0.085, 0)),
|
(-142, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Seeker'), 0.085, 0.085, 0.085, 0)),
|
||||||
(-137, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Triglavian'), 0.477, 0.4, 0.461, 0.081)),
|
(-143, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Triglavian'), 0.477, 0.4, 0.461, 0.081)),
|
||||||
(-138, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Drifter'), 0.437, 0.437, 0.437, 0.206)),
|
(-144, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Drifter'), 0.437, 0.437, 0.437, 0.206)),
|
||||||
(-139, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Sleeper'), 0.435, 0.435, 0.435, 0.268)),
|
(-145, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Sleeper'), 0.435, 0.435, 0.435, 0.268)),
|
||||||
(-140, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('All'), 0.493, 0.468, 0.492, 0.264)),
|
(-146, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('All'), 0.493, 0.468, 0.492, 0.264)),
|
||||||
(-141, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Drones'), 0.449, 0.54, 0.549, 0.197)),
|
(-147, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Drones'), 0.449, 0.54, 0.549, 0.197)),
|
||||||
(-142, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Overmind'), 0.619, 0.574, 0.612, 0.379)),
|
(-148, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Overmind'), 0.619, 0.574, 0.612, 0.379)),
|
||||||
(-143, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Seeker'), 0.085, 0.085, 0.085, 0)),
|
(-149, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Seeker'), 0.085, 0.085, 0.085, 0)),
|
||||||
(-144, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Triglavian'), 0.477, 0.4, 0.461, 0.034)),
|
(-150, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Triglavian'), 0.477, 0.4, 0.461, 0.034)),
|
||||||
(-145, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Drifter'), 0.437, 0.437, 0.437, 0.121)),
|
(-151, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Drifter'), 0.437, 0.437, 0.437, 0.121)),
|
||||||
(-146, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Sleeper'), 0.435, 0.435, 0.435, 0.215)),
|
(-152, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Sleeper'), 0.435, 0.435, 0.435, 0.215)),
|
||||||
(-147, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('All'), 0.493, 0.468, 0.492, 0.196)),
|
(-153, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('All'), 0.493, 0.468, 0.492, 0.196)),
|
||||||
# Source: ticket #2265
|
# Source: ticket #2265
|
||||||
(-148, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Concord'), 0.324, 0.318, 0.369, 0.372)),
|
(-154, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Concord'), 0.324, 0.318, 0.369, 0.372)),
|
||||||
(-149, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Sansha'), 0.137, 0.331, 0.332, 0.322)),
|
(-155, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Sansha'), 0.137, 0.331, 0.332, 0.322)),
|
||||||
(-150, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Angel'), 0.582, 0.508, 0.457, 0.416)),
|
(-156, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Dark Matter All Tiers')) + _t('Angel'), 0.582, 0.508, 0.457, 0.416)),
|
||||||
(-151, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Concord'), 0.121, 0.318, 0.369, 0.372)),
|
(-157, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Concord'), 0.121, 0.318, 0.369, 0.372)),
|
||||||
(-152, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Sansha'), 0.034, 0.331, 0.332, 0.322)),
|
(-158, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Sansha'), 0.034, 0.331, 0.332, 0.322)),
|
||||||
(-153, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Angel'), 0.456, 0.508, 0.457, 0.416)),
|
(-159, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T0/T1/T2')) + _t('Angel'), 0.456, 0.508, 0.457, 0.416)),
|
||||||
(-154, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Concord'), 0.025, 0.318, 0.369, 0.372)),
|
(-160, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Concord'), 0.025, 0.318, 0.369, 0.372)),
|
||||||
(-155, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Sansha'), 0.018, 0.331, 0.332, 0.322)),
|
(-161, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Sansha'), 0.018, 0.331, 0.332, 0.322)),
|
||||||
(-156, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Angel'), 0.373, 0.508, 0.457, 0.416)),
|
(-162, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T3 (Some T5 Rooms)')) + _t('Angel'), 0.373, 0.508, 0.457, 0.416)),
|
||||||
(-157, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Concord'), 0.008, 0.318, 0.369, 0.372)),
|
(-163, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Concord'), 0.008, 0.318, 0.369, 0.372)),
|
||||||
(-158, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Sansha'), 0.009, 0.331, 0.332, 0.322)),
|
(-164, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Sansha'), 0.009, 0.331, 0.332, 0.322)),
|
||||||
(-159, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Angel'), 0.3, 0.508, 0.457, 0.416)),
|
(-165, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Electrical T4/T5/T6')) + _t('Angel'), 0.3, 0.508, 0.457, 0.416)),
|
||||||
(-160, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Concord'), 0.324, 0.107, 0.369, 0.372)),
|
(-166, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Concord'), 0.324, 0.107, 0.369, 0.372)),
|
||||||
(-161, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Sansha'), 0.148, 0.181, 0.329, 0.328)),
|
(-167, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Sansha'), 0.148, 0.181, 0.329, 0.328)),
|
||||||
(-162, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Angel'), 0.587, 0.342, 0.439, 0.39)),
|
(-168, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T0/T1/T2')) + _t('Angel'), 0.587, 0.342, 0.439, 0.39)),
|
||||||
(-163, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Concord'), 0.324, 0.016, 0.369, 0.372)),
|
(-169, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Concord'), 0.324, 0.016, 0.369, 0.372)),
|
||||||
(-164, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Sansha'), 0.148, 0.14, 0.329, 0.328)),
|
(-170, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Sansha'), 0.148, 0.14, 0.329, 0.328)),
|
||||||
(-165, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Angel'), 0.587, 0.241, 0.439, 0.39)),
|
(-171, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T3 (Some T5 Rooms)')) + _t('Angel'), 0.587, 0.241, 0.439, 0.39)),
|
||||||
(-166, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Concord'), 0.324, 0.004, 0.369, 0.372)),
|
(-172, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Concord'), 0.324, 0.004, 0.369, 0.372)),
|
||||||
(-167, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Sansha'), 0.148, 0.106, 0.329, 0.328)),
|
(-173, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Sansha'), 0.148, 0.106, 0.329, 0.328)),
|
||||||
(-168, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Angel'), 0.587, 0.172, 0.439, 0.39)),
|
(-174, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Firestorm T4/T5/T6')) + _t('Angel'), 0.587, 0.172, 0.439, 0.39)),
|
||||||
(-169, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Concord'), 0.324, 0.318, 0.18, 0.372)),
|
(-175, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Concord'), 0.324, 0.318, 0.18, 0.372)),
|
||||||
(-170, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Sansha'), 0.137, 0.331, 0.166, 0.322)),
|
(-176, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Sansha'), 0.137, 0.331, 0.166, 0.322)),
|
||||||
(-171, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Angel'), 0.582, 0.508, 0.295, 0.416)),
|
(-177, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T0/T1/T2')) + _t('Angel'), 0.582, 0.508, 0.295, 0.416)),
|
||||||
(-172, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Concord'), 0.324, 0.318, 0.089, 0.372)),
|
(-178, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Concord'), 0.324, 0.318, 0.089, 0.372)),
|
||||||
(-173, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Sansha'), 0.137, 0.331, 0.108, 0.322)),
|
(-179, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Sansha'), 0.137, 0.331, 0.108, 0.322)),
|
||||||
(-174, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Angel'), 0.582, 0.508, 0.203, 0.416)),
|
(-180, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T3 (Some T5 Rooms)')) + _t('Angel'), 0.582, 0.508, 0.203, 0.416)),
|
||||||
(-175, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Concord'), 0.324, 0.318, 0.068, 0.372)),
|
(-181, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Concord'), 0.324, 0.318, 0.068, 0.372)),
|
||||||
(-176, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Sansha'), 0.137, 0.331, 0.073, 0.322)),
|
(-182, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Sansha'), 0.137, 0.331, 0.073, 0.322)),
|
||||||
(-177, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Angel'), 0.582, 0.508, 0.14, 0.416)),
|
(-183, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Exotic T4/T5/T6')) + _t('Angel'), 0.582, 0.508, 0.14, 0.416)),
|
||||||
(-178, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Concord'), 0.324, 0.318, 0.369, 0.203)),
|
(-184, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Concord'), 0.324, 0.318, 0.369, 0.203)),
|
||||||
(-179, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Sansha'), 0.137, 0.355, 0.352, 0.16)),
|
(-185, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Sansha'), 0.137, 0.355, 0.352, 0.16)),
|
||||||
(-180, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Angel'), 0.59, 0.528, 0.477, 0.286)),
|
(-186, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T0/T1/T2')) + _t('Angel'), 0.59, 0.528, 0.477, 0.286)),
|
||||||
(-181, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Concord'), 0.324, 0.318, 0.369, 0.112)),
|
(-187, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Concord'), 0.324, 0.318, 0.369, 0.112)),
|
||||||
(-182, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Sansha'), 0.137, 0.355, 0.352, 0.05)),
|
(-188, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Sansha'), 0.137, 0.355, 0.352, 0.05)),
|
||||||
(-183, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Angel'), 0.59, 0.528, 0.477, 0.197)),
|
(-189, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T3 (Some T5 Rooms)')) + _t('Angel'), 0.59, 0.528, 0.477, 0.197)),
|
||||||
(-184, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Concord'), 0.324, 0.318, 0.369, 0.086)),
|
(-190, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Concord'), 0.324, 0.318, 0.369, 0.086)),
|
||||||
(-185, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Sansha'), 0.137, 0.355, 0.352, 0)),
|
(-191, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Sansha'), 0.137, 0.355, 0.352, 0)),
|
||||||
(-186, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Angel'), 0.59, 0.528, 0.477, 0.126)),
|
(-192, (_c(_t('NPC')) + _c(_t('Abyssal')) + _c(_t('Gamma T4/T5/T6')) + _t('Angel'), 0.59, 0.528, 0.477, 0.126)),
|
||||||
(-187, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Drifter Entities'), 0.128, 0.375, 0.383, 0.383)),
|
(-193, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Drifter Entities'), 0.128, 0.375, 0.383, 0.383)),
|
||||||
(-188, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Rogue Drone Entities'), 0.104, 0.147, 0.147, 0.102)),
|
(-194, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Rogue Drone Entities'), 0.104, 0.147, 0.147, 0.102)),
|
||||||
(-189, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Sleeper Entities'), 0.563, 0.563, 0.563, 0.563))])
|
(-195, (_c(_t('NPC')) + _c(_t('Invasion')) + _t('Sleeper Entities'), 0.563, 0.563, 0.563, 0.563))])
|
||||||
|
|
||||||
|
|
||||||
class TargetProfile:
|
class TargetProfile:
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ class FitShieldRegenGraph(FitGraph):
|
|||||||
('shieldAmount', '%'): lambda v, src, tgt: v / 100 * src.item.ship.getModifiedItemAttr('shieldCapacity'),
|
('shieldAmount', '%'): lambda v, src, tgt: v / 100 * src.item.ship.getModifiedItemAttr('shieldCapacity'),
|
||||||
('shieldAmountT0', '%'): lambda v, src, tgt: None if v is None else v / 100 * src.item.ship.getModifiedItemAttr('shieldCapacity'),
|
('shieldAmountT0', '%'): lambda v, src, tgt: None if v is None else v / 100 * src.item.ship.getModifiedItemAttr('shieldCapacity'),
|
||||||
# Needed only for "x mark" support, to convert EHP x into normalized value
|
# Needed only for "x mark" support, to convert EHP x into normalized value
|
||||||
('shieldAmount', 'EHP'): lambda v, src, tgt: v / src.item.damagePattern.effectivify(src.item, 1, 'shield')}
|
('shieldAmount', 'EHP'): lambda v, src, tgt: v / src.item.damagePattern.effectivify(src.item.ship, 1, 'shield')}
|
||||||
_limiters = {
|
_limiters = {
|
||||||
'shieldAmount': lambda src, tgt: (0, src.item.ship.getModifiedItemAttr('shieldCapacity')),
|
'shieldAmount': lambda src, tgt: (0, src.item.ship.getModifiedItemAttr('shieldCapacity')),
|
||||||
'shieldAmountT0': lambda src, tgt: (0, src.item.ship.getModifiedItemAttr('shieldCapacity'))}
|
'shieldAmountT0': lambda src, tgt: (0, src.item.ship.getModifiedItemAttr('shieldCapacity'))}
|
||||||
@@ -77,5 +77,5 @@ class FitShieldRegenGraph(FitGraph):
|
|||||||
('shieldAmount', 'shieldRegen'): ShieldAmount2ShieldRegenGetter}
|
('shieldAmount', 'shieldRegen'): ShieldAmount2ShieldRegenGetter}
|
||||||
_denormalizers = {
|
_denormalizers = {
|
||||||
('shieldAmount', '%'): lambda v, src, tgt: v * 100 / src.item.ship.getModifiedItemAttr('shieldCapacity'),
|
('shieldAmount', '%'): lambda v, src, tgt: v * 100 / src.item.ship.getModifiedItemAttr('shieldCapacity'),
|
||||||
('shieldAmount', 'EHP'): lambda v, src, tgt: src.item.damagePattern.effectivify(src.item, v, 'shield'),
|
('shieldAmount', 'EHP'): lambda v, src, tgt: src.item.damagePattern.effectivify(src.item.ship, v, 'shield'),
|
||||||
('shieldRegen', 'EHP/s'): lambda v, src, tgt: src.item.damagePattern.effectivify(src.item, v, 'shield')}
|
('shieldRegen', 'EHP/s'): lambda v, src, tgt: src.item.damagePattern.effectivify(src.item.ship, v, 'shield')}
|
||||||
|
|||||||
@@ -199,7 +199,7 @@ def _getAutoResists(fit):
|
|||||||
armorHp = hpData['armor']
|
armorHp = hpData['armor']
|
||||||
hullHp = hpData['hull']
|
hullHp = hpData['hull']
|
||||||
uniformDamagePattern = DamagePattern(emAmount=25, thermalAmount=25, kineticAmount=25, explosiveAmount=25)
|
uniformDamagePattern = DamagePattern(emAmount=25, thermalAmount=25, kineticAmount=25, explosiveAmount=25)
|
||||||
ehpData = uniformDamagePattern.calculateEhp(fit)
|
ehpData = uniformDamagePattern.calculateEhp(fit.ship)
|
||||||
shieldEhp = ehpData['shield']
|
shieldEhp = ehpData['shield']
|
||||||
armorEhp = ehpData['armor']
|
armorEhp = ehpData['armor']
|
||||||
hullEhp = ehpData['hull']
|
hullEhp = ehpData['hull']
|
||||||
|
|||||||
@@ -66,6 +66,8 @@ class DroneView(Display):
|
|||||||
"Max Range",
|
"Max Range",
|
||||||
"Miscellanea",
|
"Miscellanea",
|
||||||
"attr:maxVelocity",
|
"attr:maxVelocity",
|
||||||
|
"Drone HP",
|
||||||
|
"Drone Regen",
|
||||||
"Price",
|
"Price",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -151,6 +151,8 @@ class FighterDisplay(d.Display):
|
|||||||
# "Max Range",
|
# "Max Range",
|
||||||
# "Miscellanea",
|
# "Miscellanea",
|
||||||
"attr:maxVelocity",
|
"attr:maxVelocity",
|
||||||
|
"Drone HP",
|
||||||
|
"Drone Regen",
|
||||||
"Fighter Abilities",
|
"Fighter Abilities",
|
||||||
"Price",
|
"Price",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ from gui.builtinContextMenus import graphFitAmmoPicker
|
|||||||
from gui.builtinContextMenus import shipModeChange
|
from gui.builtinContextMenus import shipModeChange
|
||||||
from gui.builtinContextMenus import moduleAmmoChange
|
from gui.builtinContextMenus import moduleAmmoChange
|
||||||
from gui.builtinContextMenus import moduleSpool
|
from gui.builtinContextMenus import moduleSpool
|
||||||
|
from gui.builtinContextMenus import moduleRahPattern
|
||||||
from gui.builtinContextMenus import boosterSideEffects
|
from gui.builtinContextMenus import boosterSideEffects
|
||||||
from gui.builtinContextMenus import fighterAbilities
|
from gui.builtinContextMenus import fighterAbilities
|
||||||
from gui.builtinContextMenus import resistMode
|
from gui.builtinContextMenus import resistMode
|
||||||
|
|||||||
@@ -1,20 +1,16 @@
|
|||||||
from collections import OrderedDict
|
|
||||||
from itertools import chain
|
|
||||||
|
|
||||||
# noinspection PyPackageRequirements
|
# noinspection PyPackageRequirements
|
||||||
import wx
|
import wx
|
||||||
|
|
||||||
import gui.globalEvents as GE
|
import gui.globalEvents as GE
|
||||||
import gui.mainFrame
|
import gui.mainFrame
|
||||||
|
from gui.builtinContextMenus.shared.patterns import DamagePatternMixin
|
||||||
from gui.contextMenu import ContextMenuUnconditional
|
from gui.contextMenu import ContextMenuUnconditional
|
||||||
from gui.utils.sorter import smartSort
|
|
||||||
from service.damagePattern import DamagePattern as DmgPatternSvc
|
|
||||||
from service.fit import Fit
|
from service.fit import Fit
|
||||||
|
|
||||||
_t = wx.GetTranslation
|
_t = wx.GetTranslation
|
||||||
|
|
||||||
|
|
||||||
class ChangeDamagePattern(ContextMenuUnconditional):
|
class ChangeDamagePattern(ContextMenuUnconditional, DamagePatternMixin):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
||||||
@@ -27,29 +23,12 @@ class ChangeDamagePattern(ContextMenuUnconditional):
|
|||||||
return self.mainFrame.getActiveFit() is not None
|
return self.mainFrame.getActiveFit() is not None
|
||||||
|
|
||||||
def getText(self, callingWindow, itmContext):
|
def getText(self, callingWindow, itmContext):
|
||||||
sDP = DmgPatternSvc.getInstance()
|
|
||||||
sFit = Fit.getInstance()
|
sFit = Fit.getInstance()
|
||||||
fitID = self.mainFrame.getActiveFit()
|
fitID = self.mainFrame.getActiveFit()
|
||||||
self.fit = sFit.getFit(fitID)
|
self.fit = sFit.getFit(fitID)
|
||||||
|
|
||||||
builtinPatterns = sDP.getBuiltinDamagePatternList()
|
|
||||||
userPatterns = sorted(sDP.getUserDamagePatternList(), key=lambda p: smartSort(p.fullName))
|
|
||||||
# Order here is important: patterns with duplicate names from the latter will overwrite
|
|
||||||
# patterns from the former
|
|
||||||
self.patterns = sorted(
|
|
||||||
chain(builtinPatterns, userPatterns),
|
|
||||||
key=lambda p: p.fullName not in ["Uniform", "Selected Ammo"])
|
|
||||||
|
|
||||||
self.patternEventMap = {}
|
self.patternEventMap = {}
|
||||||
self.items = (OrderedDict(), OrderedDict())
|
self.patterns = self._getPatterns()
|
||||||
for pattern in self.patterns:
|
self.items = self._getItems(self.patterns)
|
||||||
container = self.items
|
|
||||||
for categoryName in pattern.hierarchy:
|
|
||||||
categoryName = _t(categoryName) if pattern.builtin else categoryName
|
|
||||||
container = container[1].setdefault(categoryName, (OrderedDict(), OrderedDict()))
|
|
||||||
shortName = _t(pattern.shortName) if pattern.builtin else pattern.shortName
|
|
||||||
container[0][shortName] = pattern
|
|
||||||
|
|
||||||
return list(self.items[0].keys()) + list(self.items[1].keys())
|
return list(self.items[0].keys()) + list(self.items[1].keys())
|
||||||
|
|
||||||
def _addPattern(self, parentMenu, pattern, name):
|
def _addPattern(self, parentMenu, pattern, name):
|
||||||
|
|||||||
@@ -123,9 +123,7 @@ class AddEnvironmentEffect(ContextMenuUnconditional):
|
|||||||
data.groups[_t('Abyssal Weather')] = self.getAbyssalWeather()
|
data.groups[_t('Abyssal Weather')] = self.getAbyssalWeather()
|
||||||
data.groups[_t('Sansha Incursion')] = self.getEffectBeacons(
|
data.groups[_t('Sansha Incursion')] = self.getEffectBeacons(
|
||||||
_t('ContextMenu|ProjectedEffectManipulation|Sansha Incursion'))
|
_t('ContextMenu|ProjectedEffectManipulation|Sansha Incursion'))
|
||||||
data.groups[_t('Triglavian Invasion')] = self.getEffectBeacons(
|
data.groups[_t('Triglavian Invasion')] = self.getDestructibleBeacons()
|
||||||
_t('ContextMenu|ProjectedEffectManipulation|Triglavian Invasion'))
|
|
||||||
data.groups[_t('Triglavian Invasion')].groups[_t('Destructible Beacons')] = self.getDestructibleBeacons()
|
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def getEffectBeacons(self, *groups, extra_garbage=()):
|
def getEffectBeacons(self, *groups, extra_garbage=()):
|
||||||
|
|||||||
97
gui/builtinContextMenus/moduleRahPattern.py
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
from collections import OrderedDict
|
||||||
|
|
||||||
|
# noinspection PyPackageRequirements
|
||||||
|
import wx
|
||||||
|
|
||||||
|
import gui.globalEvents as GE
|
||||||
|
import gui.mainFrame
|
||||||
|
from gui.builtinContextMenus.shared.patterns import DamagePatternMixin
|
||||||
|
from gui.contextMenu import ContextMenuSingle
|
||||||
|
from service.fit import Fit
|
||||||
|
|
||||||
|
_t = wx.GetTranslation
|
||||||
|
|
||||||
|
|
||||||
|
class ChangeRahPattern(ContextMenuSingle, DamagePatternMixin):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
||||||
|
|
||||||
|
def display(self, callingWindow, srcContext, mainItem):
|
||||||
|
if srcContext != 'fittingModule':
|
||||||
|
return False
|
||||||
|
|
||||||
|
if self.mainFrame.getActiveFit() is None:
|
||||||
|
return False
|
||||||
|
|
||||||
|
if (mainItem is None or getattr(mainItem, "isEmpty", False)) and srcContext != "fittingShip":
|
||||||
|
return False
|
||||||
|
|
||||||
|
if mainItem.item.group.name != 'Armor Resistance Shift Hardener':
|
||||||
|
return False
|
||||||
|
|
||||||
|
self.module = mainItem
|
||||||
|
self.patternEventMap = {}
|
||||||
|
self.patterns = self._getPatterns()
|
||||||
|
self.items = self._getItems(self.patterns)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def getText(self, callingWindow, itmContext, mainItem):
|
||||||
|
return _t('RAH Damage Pattern')
|
||||||
|
|
||||||
|
def _addPattern(self, parentMenu, pattern, name):
|
||||||
|
id = ContextMenuSingle.nextID()
|
||||||
|
self.patternEventMap[id] = pattern
|
||||||
|
menuItem = wx.MenuItem(parentMenu, id, name, kind=wx.ITEM_CHECK)
|
||||||
|
parentMenu.Bind(wx.EVT_MENU, self.handlePatternSwitch, menuItem)
|
||||||
|
|
||||||
|
checked = self.module.rahPatternOverride is pattern
|
||||||
|
return menuItem, checked
|
||||||
|
|
||||||
|
def _addCategory(self, parentMenu, name):
|
||||||
|
id = ContextMenuSingle.nextID()
|
||||||
|
menuItem = wx.MenuItem(parentMenu, id, name)
|
||||||
|
parentMenu.Bind(wx.EVT_MENU, self.handlePatternSwitch, menuItem)
|
||||||
|
return menuItem
|
||||||
|
|
||||||
|
def getSubMenu(self, callingWindow, context, mainItem, rootMenu, i, pitem):
|
||||||
|
# Category as menu item - expands further
|
||||||
|
msw = "wxMSW" in wx.PlatformInfo
|
||||||
|
|
||||||
|
def makeMenu(container, parentMenu, root=False):
|
||||||
|
menu = wx.Menu()
|
||||||
|
if root:
|
||||||
|
menuItem, checked = self._addPattern(rootMenu if msw else parentMenu, None, 'Fit Pattern')
|
||||||
|
menu.Append(menuItem)
|
||||||
|
menuItem.Check(checked)
|
||||||
|
menuItem, checked = self._addPattern(rootMenu if msw else parentMenu, 'disable', 'Do Not Adapt')
|
||||||
|
menu.Append(menuItem)
|
||||||
|
menuItem.Check(checked)
|
||||||
|
menu.AppendSeparator()
|
||||||
|
for name, subcontainer in container[1].items():
|
||||||
|
menuItem = self._addCategory(rootMenu if msw else parentMenu, name)
|
||||||
|
subMenu = makeMenu(subcontainer, menu)
|
||||||
|
menuItem.SetSubMenu(subMenu)
|
||||||
|
menu.Append(menuItem)
|
||||||
|
for name, pattern in container[0].items():
|
||||||
|
menuItem, checked = self._addPattern(rootMenu if msw else parentMenu, pattern, name)
|
||||||
|
menu.Append(menuItem)
|
||||||
|
menuItem.Check(checked)
|
||||||
|
menu.Bind(wx.EVT_MENU, self.handlePatternSwitch)
|
||||||
|
return menu
|
||||||
|
|
||||||
|
subMenu = makeMenu(self.items, rootMenu, root=True)
|
||||||
|
return subMenu
|
||||||
|
|
||||||
|
def handlePatternSwitch(self, event):
|
||||||
|
pattern = self.patternEventMap.get(event.Id, False)
|
||||||
|
if pattern is False:
|
||||||
|
event.Skip()
|
||||||
|
return
|
||||||
|
sFit = Fit.getInstance()
|
||||||
|
fitID = self.mainFrame.getActiveFit()
|
||||||
|
sFit.setRahPattern(fitID, self.module, pattern)
|
||||||
|
wx.PostEvent(self.mainFrame, GE.FitChanged(fitIDs=(fitID,)))
|
||||||
|
|
||||||
|
|
||||||
|
ChangeRahPattern.register()
|
||||||
0
gui/builtinContextMenus/shared/__init__.py
Normal file
35
gui/builtinContextMenus/shared/patterns.py
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
from collections import OrderedDict
|
||||||
|
from itertools import chain
|
||||||
|
|
||||||
|
# noinspection PyPackageRequirements
|
||||||
|
import wx
|
||||||
|
|
||||||
|
from gui.utils.sorter import smartSort
|
||||||
|
from service.damagePattern import DamagePattern as DmgPatternSvc
|
||||||
|
|
||||||
|
_t = wx.GetTranslation
|
||||||
|
|
||||||
|
|
||||||
|
class DamagePatternMixin:
|
||||||
|
|
||||||
|
def _getPatterns(self):
|
||||||
|
sDP = DmgPatternSvc.getInstance()
|
||||||
|
builtinPatterns = sDP.getBuiltinDamagePatternList()
|
||||||
|
userPatterns = sorted(sDP.getUserDamagePatternList(), key=lambda p: smartSort(p.fullName))
|
||||||
|
# Order here is important: patterns with duplicate names from the latter will overwrite
|
||||||
|
# patterns from the former
|
||||||
|
patterns = sorted(
|
||||||
|
chain(builtinPatterns, userPatterns),
|
||||||
|
key=lambda p: p.fullName not in ["Uniform", "Selected Ammo"])
|
||||||
|
return patterns
|
||||||
|
|
||||||
|
def _getItems(self, patterns):
|
||||||
|
items = (OrderedDict(), OrderedDict())
|
||||||
|
for pattern in patterns:
|
||||||
|
container = items
|
||||||
|
for categoryName in pattern.hierarchy:
|
||||||
|
categoryName = _t(categoryName) if pattern.builtin else categoryName
|
||||||
|
container = container[1].setdefault(categoryName, (OrderedDict(), OrderedDict()))
|
||||||
|
shortName = _t(pattern.shortName) if pattern.builtin else pattern.shortName
|
||||||
|
container[0][shortName] = pattern
|
||||||
|
return items
|
||||||
@@ -36,6 +36,8 @@ class ItemCompare(wx.Panel):
|
|||||||
self.item = item
|
self.item = item
|
||||||
self.items = sorted(items, key=defaultSort)
|
self.items = sorted(items, key=defaultSort)
|
||||||
self.attrs = {}
|
self.attrs = {}
|
||||||
|
self.HighlightOn = wx.Colour(255, 255, 0, wx.ALPHA_OPAQUE)
|
||||||
|
self.highlightedNames = []
|
||||||
|
|
||||||
# get a dict of attrName: attrInfo of all unique attributes across all items
|
# get a dict of attrName: attrInfo of all unique attributes across all items
|
||||||
for item in self.items:
|
for item in self.items:
|
||||||
@@ -88,6 +90,21 @@ class ItemCompare(wx.Panel):
|
|||||||
self.toggleViewBtn.Bind(wx.EVT_TOGGLEBUTTON, self.ToggleViewMode)
|
self.toggleViewBtn.Bind(wx.EVT_TOGGLEBUTTON, self.ToggleViewMode)
|
||||||
self.Bind(wx.EVT_LIST_COL_CLICK, self.SortCompareCols)
|
self.Bind(wx.EVT_LIST_COL_CLICK, self.SortCompareCols)
|
||||||
|
|
||||||
|
self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.HighlightRow)
|
||||||
|
|
||||||
|
def HighlightRow(self, event):
|
||||||
|
itemIdx = event.GetIndex()
|
||||||
|
name = self.paramList.GetItem(itemIdx).Text
|
||||||
|
if name in self.highlightedNames:
|
||||||
|
self.highlightedNames.remove(name)
|
||||||
|
else:
|
||||||
|
self.highlightedNames.append(name)
|
||||||
|
self.Freeze()
|
||||||
|
self.paramList.ClearAll()
|
||||||
|
self.PopulateList()
|
||||||
|
self.Thaw()
|
||||||
|
event.Skip()
|
||||||
|
|
||||||
def SortCompareCols(self, event):
|
def SortCompareCols(self, event):
|
||||||
self.Freeze()
|
self.Freeze()
|
||||||
self.paramList.ClearAll()
|
self.paramList.ClearAll()
|
||||||
@@ -155,6 +172,8 @@ class ItemCompare(wx.Panel):
|
|||||||
self.paramList.InsertColumn(len(self.attrs) + 1, _t("Price"))
|
self.paramList.InsertColumn(len(self.attrs) + 1, _t("Price"))
|
||||||
self.paramList.SetColumnWidth(len(self.attrs) + 1, 60)
|
self.paramList.SetColumnWidth(len(self.attrs) + 1, 60)
|
||||||
|
|
||||||
|
toHighlight = []
|
||||||
|
|
||||||
for item in self.items:
|
for item in self.items:
|
||||||
i = self.paramList.InsertItem(self.paramList.GetItemCount(), item.name)
|
i = self.paramList.InsertItem(self.paramList.GetItemCount(), item.name)
|
||||||
for x, attr in enumerate(self.attrs.keys()):
|
for x, attr in enumerate(self.attrs.keys()):
|
||||||
@@ -172,10 +191,19 @@ class ItemCompare(wx.Panel):
|
|||||||
|
|
||||||
# Add prices
|
# Add prices
|
||||||
self.paramList.SetItem(i, len(self.attrs) + 1, formatAmount(item.price.price, 3, 3, 9, currency=True) if item.price.price else "")
|
self.paramList.SetItem(i, len(self.attrs) + 1, formatAmount(item.price.price, 3, 3, 9, currency=True) if item.price.price else "")
|
||||||
|
if item.name in self.highlightedNames:
|
||||||
|
toHighlight.append(i)
|
||||||
|
|
||||||
self.paramList.RefreshRows()
|
self.paramList.RefreshRows()
|
||||||
self.Layout()
|
self.Layout()
|
||||||
|
|
||||||
|
# Highlight after layout, otherwise colors are getting overwritten
|
||||||
|
for itemIdx in toHighlight:
|
||||||
|
listItem = self.paramList.GetItem(itemIdx)
|
||||||
|
listItem.SetBackgroundColour(self.HighlightOn)
|
||||||
|
listItem.SetFont(listItem.GetFont().MakeBold())
|
||||||
|
self.paramList.SetItem(listItem)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def TranslateValueUnit(value, unitName, unitDisplayName):
|
def TranslateValueUnit(value, unitName, unitDisplayName):
|
||||||
def itemIDCallback():
|
def itemIDCallback():
|
||||||
|
|||||||
@@ -57,12 +57,6 @@ class PFFittingEnginePref(PreferenceView):
|
|||||||
|
|
||||||
mainSizer.Add(self.cbStrictSkillLevels, 0, wx.ALL | wx.EXPAND, 5)
|
mainSizer.Add(self.cbStrictSkillLevels, 0, wx.ALL | wx.EXPAND, 5)
|
||||||
|
|
||||||
self.cbUniversalAdaptiveArmorHardener = wx.CheckBox(panel, wx.ID_ANY,
|
|
||||||
_t("When damage profile is Uniform, set Reactive Armor "
|
|
||||||
"Hardener to match (old behavior)."),
|
|
||||||
wx.DefaultPosition, wx.DefaultSize, 0)
|
|
||||||
mainSizer.Add(self.cbUniversalAdaptiveArmorHardener, 0, wx.ALL | wx.EXPAND, 5)
|
|
||||||
|
|
||||||
spoolup_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
spoolup_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
|
||||||
self.spool_up_label = wx.StaticText(panel, wx.ID_ANY, _t("Global Default Spoolup Percentage:"), wx.DefaultPosition, wx.DefaultSize, 0)
|
self.spool_up_label = wx.StaticText(panel, wx.ID_ANY, _t("Global Default Spoolup Percentage:"), wx.DefaultPosition, wx.DefaultSize, 0)
|
||||||
@@ -110,9 +104,6 @@ class PFFittingEnginePref(PreferenceView):
|
|||||||
self.cbStrictSkillLevels.SetValue(self.engine_settings.get("strictSkillLevels"))
|
self.cbStrictSkillLevels.SetValue(self.engine_settings.get("strictSkillLevels"))
|
||||||
self.cbStrictSkillLevels.Bind(wx.EVT_CHECKBOX, self.OnCBStrictSkillLevelsChange)
|
self.cbStrictSkillLevels.Bind(wx.EVT_CHECKBOX, self.OnCBStrictSkillLevelsChange)
|
||||||
|
|
||||||
self.cbUniversalAdaptiveArmorHardener.SetValue(self.engine_settings.get("useStaticAdaptiveArmorHardener"))
|
|
||||||
self.cbUniversalAdaptiveArmorHardener.Bind(wx.EVT_CHECKBOX, self.OnCBUniversalAdaptiveArmorHardenerChange)
|
|
||||||
|
|
||||||
self.spoolup_value.SetValue(int(self.engine_settings.get("globalDefaultSpoolupPercentage") * 100))
|
self.spoolup_value.SetValue(int(self.engine_settings.get("globalDefaultSpoolupPercentage") * 100))
|
||||||
self.spoolup_value.Bind(wx.lib.intctrl.EVT_INT, self.OnSpoolupChange)
|
self.spoolup_value.Bind(wx.lib.intctrl.EVT_INT, self.OnSpoolupChange)
|
||||||
|
|
||||||
@@ -129,8 +120,6 @@ class PFFittingEnginePref(PreferenceView):
|
|||||||
def OnCBStrictSkillLevelsChange(self, event):
|
def OnCBStrictSkillLevelsChange(self, event):
|
||||||
self.engine_settings.set("strictSkillLevels", self.cbStrictSkillLevels.GetValue())
|
self.engine_settings.set("strictSkillLevels", self.cbStrictSkillLevels.GetValue())
|
||||||
|
|
||||||
def OnCBUniversalAdaptiveArmorHardenerChange(self, event):
|
|
||||||
self.engine_settings.set("useStaticAdaptiveArmorHardener", self.cbUniversalAdaptiveArmorHardener.GetValue())
|
|
||||||
|
|
||||||
def getImage(self):
|
def getImage(self):
|
||||||
return BitmapLoader.getBitmap("settings_fitting", "gui")
|
return BitmapLoader.getBitmap("settings_fitting", "gui")
|
||||||
|
|||||||
@@ -34,6 +34,13 @@ class PFEsiPref(PreferenceView):
|
|||||||
self.stInfo.Wrap(dlgWidth - 50)
|
self.stInfo.Wrap(dlgWidth - 50)
|
||||||
mainSizer.Add(self.stInfo, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
|
mainSizer.Add(self.stInfo, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
|
||||||
|
|
||||||
|
self.enforceJwtExpiration = wx.CheckBox(panel, wx.ID_ANY, _t("Enforce Token Expiration"), wx.DefaultPosition,
|
||||||
|
wx.DefaultSize,
|
||||||
|
0)
|
||||||
|
self.enforceJwtExpiration.SetToolTip(wx.ToolTip(_t("This option is a workaround in case you cannot log into EVE SSO "
|
||||||
|
"due to 'Signature has expired' error")))
|
||||||
|
mainSizer.Add(self.enforceJwtExpiration, 0, wx.ALL | wx.EXPAND, 5)
|
||||||
|
|
||||||
rbSizer = wx.BoxSizer(wx.HORIZONTAL)
|
rbSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
self.rbMode = wx.RadioBox(panel, -1, _t("Login Authentication Method"), wx.DefaultPosition, wx.DefaultSize,
|
self.rbMode = wx.RadioBox(panel, -1, _t("Login Authentication Method"), wx.DefaultPosition, wx.DefaultSize,
|
||||||
[_t('Local Server'), _t('Manual')], 1, wx.RA_SPECIFY_COLS)
|
[_t('Local Server'), _t('Manual')], 1, wx.RA_SPECIFY_COLS)
|
||||||
@@ -43,11 +50,12 @@ class PFEsiPref(PreferenceView):
|
|||||||
" character login. Use this if having issues with the local server."))
|
" character login. Use this if having issues with the local server."))
|
||||||
|
|
||||||
self.rbMode.SetSelection(self.settings.get('loginMode'))
|
self.rbMode.SetSelection(self.settings.get('loginMode'))
|
||||||
|
self.enforceJwtExpiration.SetValue(self.settings.get("enforceJwtExpiration" or True))
|
||||||
|
|
||||||
rbSizer.Add(self.rbMode, 1, wx.TOP | wx.RIGHT, 5)
|
rbSizer.Add(self.rbMode, 1, wx.TOP | wx.RIGHT, 5)
|
||||||
|
|
||||||
self.rbMode.Bind(wx.EVT_RADIOBOX, self.OnModeChange)
|
self.rbMode.Bind(wx.EVT_RADIOBOX, self.OnModeChange)
|
||||||
|
self.enforceJwtExpiration.Bind(wx.EVT_CHECKBOX, self.OnEnforceChange)
|
||||||
mainSizer.Add(rbSizer, 1, wx.ALL | wx.EXPAND, 0)
|
mainSizer.Add(rbSizer, 1, wx.ALL | wx.EXPAND, 0)
|
||||||
|
|
||||||
panel.SetSizer(mainSizer)
|
panel.SetSizer(mainSizer)
|
||||||
@@ -59,6 +67,10 @@ class PFEsiPref(PreferenceView):
|
|||||||
def OnModeChange(self, event):
|
def OnModeChange(self, event):
|
||||||
self.settings.set('loginMode', event.GetInt())
|
self.settings.set('loginMode', event.GetInt())
|
||||||
|
|
||||||
|
def OnEnforceChange(self, event):
|
||||||
|
self.settings.set('enforceJwtExpiration', self.enforceJwtExpiration.GetValue())
|
||||||
|
event.Skip()
|
||||||
|
|
||||||
def getImage(self):
|
def getImage(self):
|
||||||
return BitmapLoader.getBitmap("eve", "gui")
|
return BitmapLoader.getBitmap("eve", "gui")
|
||||||
|
|
||||||
|
|||||||
87
gui/builtinViewColumns/droneEhp.py
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
# =============================================================================
|
||||||
|
# Copyright (C) 2010 Diego Duclos
|
||||||
|
#
|
||||||
|
# This file is part of pyfa.
|
||||||
|
#
|
||||||
|
# pyfa is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# pyfa is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with pyfa. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# noinspection PyPackageRequirements
|
||||||
|
import wx
|
||||||
|
|
||||||
|
import gui.mainFrame
|
||||||
|
from eos.saveddata.drone import Drone
|
||||||
|
from eos.saveddata.fighter import Fighter
|
||||||
|
from service.attribute import Attribute
|
||||||
|
from gui.viewColumn import ViewColumn
|
||||||
|
from gui.bitmap_loader import BitmapLoader
|
||||||
|
from gui.utils.numberFormatter import formatAmount
|
||||||
|
|
||||||
|
|
||||||
|
_t = wx.GetTranslation
|
||||||
|
|
||||||
|
|
||||||
|
class DroneEhpColumn(ViewColumn):
|
||||||
|
name = "Drone HP"
|
||||||
|
|
||||||
|
def __init__(self, fittingView, params=None):
|
||||||
|
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
||||||
|
if params is None:
|
||||||
|
params = {"showIcon": True, "displayName": False}
|
||||||
|
|
||||||
|
ViewColumn.__init__(self, fittingView)
|
||||||
|
|
||||||
|
sAttr = Attribute.getInstance()
|
||||||
|
info = sAttr.getAttributeInfo("shieldCapacity")
|
||||||
|
self.info = info
|
||||||
|
if params["showIcon"]:
|
||||||
|
iconFile = info.iconID
|
||||||
|
if iconFile:
|
||||||
|
self.imageId = fittingView.imageList.GetImageIndex(iconFile, "icons")
|
||||||
|
self.bitmap = BitmapLoader.getBitmap(iconFile, "icons")
|
||||||
|
else:
|
||||||
|
self.imageId = -1
|
||||||
|
self.mask = wx.LIST_MASK_IMAGE
|
||||||
|
else:
|
||||||
|
self.imageId = -1
|
||||||
|
|
||||||
|
if params["displayName"] or self.imageId == -1:
|
||||||
|
self.columnText = info.displayName if info.displayName != "" else info.name
|
||||||
|
self.mask |= wx.LIST_MASK_TEXT
|
||||||
|
|
||||||
|
def getText(self, stuff):
|
||||||
|
if not isinstance(stuff, (Drone, Fighter)):
|
||||||
|
return ""
|
||||||
|
if self.mainFrame.statsPane.nameViewMap["resistancesViewFull"].showEffective:
|
||||||
|
ehp = sum(stuff.ehp.values())
|
||||||
|
else:
|
||||||
|
ehp = sum(stuff.hp.values())
|
||||||
|
return formatAmount(ehp, 3, 0, 9)
|
||||||
|
|
||||||
|
def getImageId(self, mod):
|
||||||
|
return -1
|
||||||
|
|
||||||
|
def getParameters(self):
|
||||||
|
return ("displayName", bool, False), ("showIcon", bool, True)
|
||||||
|
|
||||||
|
def getToolTip(self, stuff):
|
||||||
|
if not isinstance(stuff, (Drone, Fighter)):
|
||||||
|
return ""
|
||||||
|
if self.mainFrame.statsPane.nameViewMap["resistancesViewFull"].showEffective:
|
||||||
|
return _t("Effective HP")
|
||||||
|
else:
|
||||||
|
return _t("HP")
|
||||||
|
|
||||||
|
|
||||||
|
DroneEhpColumn.register()
|
||||||
81
gui/builtinViewColumns/droneRegen.py
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
# =============================================================================
|
||||||
|
# Copyright (C) 2010 Diego Duclos
|
||||||
|
#
|
||||||
|
# This file is part of pyfa.
|
||||||
|
#
|
||||||
|
# pyfa is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# pyfa is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with pyfa. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# noinspection PyPackageRequirements
|
||||||
|
import wx
|
||||||
|
|
||||||
|
import gui.mainFrame
|
||||||
|
from eos.saveddata.drone import Drone
|
||||||
|
from eos.saveddata.fighter import Fighter
|
||||||
|
from gui.viewColumn import ViewColumn
|
||||||
|
from gui.bitmap_loader import BitmapLoader
|
||||||
|
from gui.utils.numberFormatter import formatAmount
|
||||||
|
|
||||||
|
|
||||||
|
_t = wx.GetTranslation
|
||||||
|
|
||||||
|
|
||||||
|
class DroneRegenColumn(ViewColumn):
|
||||||
|
name = "Drone Regen"
|
||||||
|
|
||||||
|
def __init__(self, fittingView, params=None):
|
||||||
|
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
||||||
|
if params is None:
|
||||||
|
params = {"showIcon": True, "displayName": False}
|
||||||
|
|
||||||
|
ViewColumn.__init__(self, fittingView)
|
||||||
|
|
||||||
|
if params["showIcon"]:
|
||||||
|
self.imageId = fittingView.imageList.GetImageIndex("shieldPassive_small", "gui")
|
||||||
|
self.bitmap = BitmapLoader.getBitmap("shieldPassive_small", "gui")
|
||||||
|
self.mask = wx.LIST_MASK_IMAGE
|
||||||
|
else:
|
||||||
|
self.imageId = -1
|
||||||
|
|
||||||
|
if params["displayName"] or self.imageId == -1:
|
||||||
|
self.columnText = _("Misc data")
|
||||||
|
self.mask |= wx.LIST_MASK_TEXT
|
||||||
|
|
||||||
|
def getText(self, stuff):
|
||||||
|
if not isinstance(stuff, (Drone, Fighter)):
|
||||||
|
return ""
|
||||||
|
regen = stuff.calculateShieldRecharge()
|
||||||
|
if (
|
||||||
|
self.mainFrame.statsPane.nameViewMap["resistancesViewFull"].showEffective
|
||||||
|
and stuff.owner and stuff.owner.damagePattern is not None
|
||||||
|
):
|
||||||
|
regen = stuff.owner.damagePattern.effectivify(stuff, regen, 'shield')
|
||||||
|
return '{}/s'.format(formatAmount(regen, 3, 0, 9))
|
||||||
|
|
||||||
|
def getImageId(self, mod):
|
||||||
|
return -1
|
||||||
|
|
||||||
|
def getParameters(self):
|
||||||
|
return ("displayName", bool, False), ("showIcon", bool, True)
|
||||||
|
|
||||||
|
def getToolTip(self, stuff):
|
||||||
|
if not isinstance(stuff, (Drone, Fighter)):
|
||||||
|
return ""
|
||||||
|
if self.mainFrame.statsPane.nameViewMap["resistancesViewFull"].showEffective:
|
||||||
|
return _t("Effective Shield Regeneration")
|
||||||
|
else:
|
||||||
|
return _t("Shield Regeneration")
|
||||||
|
|
||||||
|
|
||||||
|
DroneRegenColumn.register()
|
||||||
@@ -58,7 +58,9 @@ class InternalCommandHistory:
|
|||||||
|
|
||||||
class ModuleInfo:
|
class ModuleInfo:
|
||||||
|
|
||||||
def __init__(self, itemID, baseItemID=None, mutaplasmidID=None, mutations=None, chargeID=None, state=None, spoolType=None, spoolAmount=None):
|
def __init__(
|
||||||
|
self, itemID, baseItemID=None, mutaplasmidID=None, mutations=None, chargeID=None,
|
||||||
|
state=None, spoolType=None, spoolAmount=None, rahPattern=None):
|
||||||
self.itemID = itemID
|
self.itemID = itemID
|
||||||
self.baseItemID = baseItemID
|
self.baseItemID = baseItemID
|
||||||
self.mutaplasmidID = mutaplasmidID
|
self.mutaplasmidID = mutaplasmidID
|
||||||
@@ -67,6 +69,7 @@ class ModuleInfo:
|
|||||||
self.state = state
|
self.state = state
|
||||||
self.spoolType = spoolType
|
self.spoolType = spoolType
|
||||||
self.spoolAmount = spoolAmount
|
self.spoolAmount = spoolAmount
|
||||||
|
self.rahPattern = rahPattern
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def fromModule(cls, mod, unmutate=False):
|
def fromModule(cls, mod, unmutate=False):
|
||||||
@@ -81,7 +84,8 @@ class ModuleInfo:
|
|||||||
chargeID=mod.chargeID,
|
chargeID=mod.chargeID,
|
||||||
state=mod.state,
|
state=mod.state,
|
||||||
spoolType=mod.spoolType,
|
spoolType=mod.spoolType,
|
||||||
spoolAmount=mod.spoolAmount)
|
spoolAmount=mod.spoolAmount,
|
||||||
|
rahPattern=mod.rahPatternOverride)
|
||||||
else:
|
else:
|
||||||
info = cls(
|
info = cls(
|
||||||
itemID=mod.itemID,
|
itemID=mod.itemID,
|
||||||
@@ -91,7 +95,8 @@ class ModuleInfo:
|
|||||||
chargeID=mod.chargeID,
|
chargeID=mod.chargeID,
|
||||||
state=mod.state,
|
state=mod.state,
|
||||||
spoolType=mod.spoolType,
|
spoolType=mod.spoolType,
|
||||||
spoolAmount=mod.spoolAmount)
|
spoolAmount=mod.spoolAmount,
|
||||||
|
rahPattern=mod.rahPatternOverride)
|
||||||
return info
|
return info
|
||||||
|
|
||||||
def toModule(self, fallbackState=None):
|
def toModule(self, fallbackState=None):
|
||||||
@@ -119,6 +124,8 @@ class ModuleInfo:
|
|||||||
mod.spoolType = self.spoolType
|
mod.spoolType = self.spoolType
|
||||||
mod.spoolAmount = self.spoolAmount
|
mod.spoolAmount = self.spoolAmount
|
||||||
|
|
||||||
|
mod.rahPatternOverride = self.rahPattern
|
||||||
|
|
||||||
if self.state is not None:
|
if self.state is not None:
|
||||||
if mod.isValidState(self.state):
|
if mod.isValidState(self.state):
|
||||||
mod.state = self.state
|
mod.state = self.state
|
||||||
@@ -148,12 +155,13 @@ class ModuleInfo:
|
|||||||
self.chargeID == other.chargeID,
|
self.chargeID == other.chargeID,
|
||||||
self.state == other.state,
|
self.state == other.state,
|
||||||
self.spoolType == other.spoolType,
|
self.spoolType == other.spoolType,
|
||||||
self.spoolAmount == other.spoolAmount))
|
self.spoolAmount == other.spoolAmount,
|
||||||
|
self.rahPattern == other.rahPattern))
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return makeReprStr(self, [
|
return makeReprStr(self, [
|
||||||
'itemID', 'baseItemID', 'mutaplasmidID', 'mutations',
|
'itemID', 'baseItemID', 'mutaplasmidID', 'mutations',
|
||||||
'chargeID', 'state', 'spoolType', 'spoolAmount'])
|
'chargeID', 'state', 'spoolType', 'spoolAmount', 'rahPattern'])
|
||||||
|
|
||||||
|
|
||||||
class DroneInfo:
|
class DroneInfo:
|
||||||
|
|||||||
@@ -78,6 +78,8 @@ from gui.builtinViewColumns import ( # noqa: E402, F401
|
|||||||
baseName,
|
baseName,
|
||||||
capacitorUse,
|
capacitorUse,
|
||||||
dampScanRes,
|
dampScanRes,
|
||||||
|
droneEhp,
|
||||||
|
droneRegen,
|
||||||
graphColor,
|
graphColor,
|
||||||
graphLightness,
|
graphLightness,
|
||||||
graphLineStyle,
|
graphLineStyle,
|
||||||
|
|||||||
BIN
imgs/gui/shieldPassive_small.png
Normal file
|
After Width: | Height: | Size: 662 B |
|
Before Width: | Height: | Size: 812 B After Width: | Height: | Size: 433 B |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 944 B |
BIN
imgs/icons/21831@1x.png
Normal file
|
After Width: | Height: | Size: 812 B |
BIN
imgs/icons/21831@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/24296@1x.png
Normal file
|
After Width: | Height: | Size: 667 B |
BIN
imgs/icons/24296@2x.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
imgs/icons/24409@1x.png
Normal file
|
After Width: | Height: | Size: 701 B |
BIN
imgs/icons/24409@2x.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
imgs/icons/24497@1x.png
Normal file
|
After Width: | Height: | Size: 827 B |
BIN
imgs/icons/24497@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 822 B |
|
Before Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/24585@1x.png
Normal file
|
After Width: | Height: | Size: 878 B |
BIN
imgs/icons/24585@2x.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 796 B After Width: | Height: | Size: 787 B |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/25240@1x.png
Normal file
|
After Width: | Height: | Size: 784 B |
BIN
imgs/icons/25240@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/25241@1x.png
Normal file
|
After Width: | Height: | Size: 808 B |
BIN
imgs/icons/25241@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25242@1x.png
Normal file
|
After Width: | Height: | Size: 829 B |
BIN
imgs/icons/25242@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25243@1x.png
Normal file
|
After Width: | Height: | Size: 833 B |
BIN
imgs/icons/25243@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25255@1x.png
Normal file
|
After Width: | Height: | Size: 787 B |
BIN
imgs/icons/25255@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/25256@1x.png
Normal file
|
After Width: | Height: | Size: 836 B |
BIN
imgs/icons/25256@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25257@1x.png
Normal file
|
After Width: | Height: | Size: 846 B |
BIN
imgs/icons/25257@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25258@1x.png
Normal file
|
After Width: | Height: | Size: 848 B |
BIN
imgs/icons/25258@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25259@1x.png
Normal file
|
After Width: | Height: | Size: 816 B |
BIN
imgs/icons/25259@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/25260@1x.png
Normal file
|
After Width: | Height: | Size: 778 B |
BIN
imgs/icons/25260@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/25261@1x.png
Normal file
|
After Width: | Height: | Size: 835 B |
BIN
imgs/icons/25261@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25262@1x.png
Normal file
|
After Width: | Height: | Size: 831 B |
BIN
imgs/icons/25262@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25263@1x.png
Normal file
|
After Width: | Height: | Size: 829 B |
BIN
imgs/icons/25263@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25264@1x.png
Normal file
|
After Width: | Height: | Size: 802 B |
BIN
imgs/icons/25264@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/25265@1x.png
Normal file
|
After Width: | Height: | Size: 769 B |
BIN
imgs/icons/25265@2x.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
imgs/icons/25266@1x.png
Normal file
|
After Width: | Height: | Size: 818 B |
BIN
imgs/icons/25266@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/25267@1x.png
Normal file
|
After Width: | Height: | Size: 823 B |
BIN
imgs/icons/25267@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25268@1x.png
Normal file
|
After Width: | Height: | Size: 821 B |
BIN
imgs/icons/25268@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25269@1x.png
Normal file
|
After Width: | Height: | Size: 797 B |
BIN
imgs/icons/25269@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/25270@1x.png
Normal file
|
After Width: | Height: | Size: 773 B |
BIN
imgs/icons/25270@2x.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
imgs/icons/25271@1x.png
Normal file
|
After Width: | Height: | Size: 817 B |
BIN
imgs/icons/25271@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25272@1x.png
Normal file
|
After Width: | Height: | Size: 822 B |
BIN
imgs/icons/25272@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25273@1x.png
Normal file
|
After Width: | Height: | Size: 832 B |
BIN
imgs/icons/25273@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |