Compare commits
169 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
21a9b779f3 | ||
|
|
b8dc55a3a6 | ||
|
|
b7a5b33ff6 | ||
|
|
3593d16bd1 | ||
|
|
57830fd5a5 | ||
|
|
313d793175 | ||
|
|
f8e20e23bb | ||
|
|
1959681250 | ||
|
|
0192c77df1 | ||
|
|
b709629d7b | ||
|
|
3071aead5c | ||
|
|
3f2df69022 | ||
|
|
e9a48817a7 | ||
|
|
ed19ea5f2f | ||
|
|
19366a09b4 | ||
|
|
f8f01cd63c | ||
|
|
21a0e2b9c5 | ||
|
|
0ba8ba33ef | ||
|
|
346184d06a | ||
|
|
46fc9e65bb | ||
|
|
2d51da4d02 | ||
|
|
b5e77415cf | ||
|
|
4c75daf36c | ||
|
|
4a120b8abf | ||
|
|
fc43510fbc | ||
|
|
28c7ff54aa | ||
|
|
89f1e0a126 | ||
|
|
b6ff1cada9 | ||
|
|
cc0d6465d6 | ||
|
|
c49a914584 | ||
|
|
e6e6568571 | ||
|
|
7120000202 | ||
|
|
c3f7078053 | ||
|
|
b70f02fa3e | ||
|
|
8d893ce648 | ||
|
|
c230480464 | ||
|
|
da7a4a2df0 | ||
|
|
62bde4b8c9 | ||
|
|
43967b70ae | ||
|
|
782c007200 | ||
|
|
5812d333d9 | ||
|
|
c461bf469e | ||
|
|
d5c8c92b48 | ||
|
|
1abffd6c5d | ||
|
|
a824cc5e48 | ||
|
|
db7afffd65 | ||
|
|
4d02a1292f | ||
|
|
00f72294d4 | ||
|
|
0d45be0597 | ||
|
|
f60090fc79 | ||
|
|
713807df13 | ||
|
|
c020bd8898 | ||
|
|
39ee8586d4 | ||
|
|
653a1585dc | ||
|
|
2dcf011020 | ||
|
|
555e72a27a | ||
|
|
85e740d75a | ||
|
|
d604ed300a | ||
|
|
3aea4e5f23 | ||
|
|
a54adddc74 | ||
|
|
dda397fea3 | ||
|
|
3cd718350e | ||
|
|
e87860a700 | ||
|
|
451d21eaa0 | ||
|
|
718f9ef859 | ||
|
|
193adc4ba5 | ||
|
|
cdfa52e9ed | ||
|
|
2752b288ad | ||
|
|
8dce968780 | ||
|
|
b889da7e68 | ||
|
|
0dd7dea708 | ||
|
|
8af1c8da7d | ||
|
|
8d4f83156d | ||
|
|
798bdf3fe0 | ||
|
|
a7cf4aab76 | ||
|
|
d910e324f3 | ||
|
|
d800db5ccb | ||
|
|
6c5d0a3e4f | ||
|
|
9389a0421f | ||
|
|
6f3ab6cee8 | ||
|
|
258dcd49a0 | ||
|
|
5f0320d1e3 | ||
|
|
54052899f9 | ||
|
|
eda53e9318 | ||
|
|
4d8a891fd8 | ||
|
|
2d4b97afe6 | ||
|
|
49d1ec17e8 | ||
|
|
cfecacacf9 | ||
|
|
a9112c04a3 | ||
|
|
5f2a74691c | ||
|
|
17c22df0f4 | ||
|
|
c53bc82929 | ||
|
|
7113f41b9a | ||
|
|
aa66d63085 | ||
|
|
140ee70dc3 | ||
|
|
5023a6cbae | ||
|
|
aafa77baed | ||
|
|
16dabd57ca | ||
|
|
8668d2dd55 | ||
|
|
5c5f37a9ae | ||
|
|
621c36f1cd | ||
|
|
be2cc523c2 | ||
|
|
bd83c403a1 | ||
|
|
043f533a10 | ||
|
|
57a23affd0 | ||
|
|
b678152ac6 | ||
|
|
747bbc8200 | ||
|
|
871cf42d88 | ||
|
|
28533d60d3 | ||
|
|
ca12b3c94f | ||
|
|
81e449dd83 | ||
|
|
9b216b5d48 | ||
|
|
061ab27286 | ||
|
|
6d13ab8bcb | ||
|
|
115ea9a36c | ||
|
|
c56f274a5f | ||
|
|
96214eaa27 | ||
|
|
2fef60eaaa | ||
|
|
807622a1ec | ||
|
|
d126b62d63 | ||
|
|
9e50de96f3 | ||
|
|
e67083a79b | ||
|
|
b103e576d2 | ||
|
|
b472adb404 | ||
|
|
7e5150be8c | ||
|
|
261d510ccb | ||
|
|
858b0b243a | ||
|
|
53385f2458 | ||
|
|
7d3371c379 | ||
|
|
d94116ea1c | ||
|
|
5d95663f63 | ||
|
|
b21b756fa6 | ||
|
|
492adb4dfd | ||
|
|
5fa7b2c86a | ||
|
|
f6120f09ac | ||
|
|
4995c7994f | ||
|
|
620ce89a05 | ||
|
|
73dc056e61 | ||
|
|
97625d11ab | ||
|
|
21bd4272d9 | ||
|
|
332c91d661 | ||
|
|
719125657f | ||
|
|
9621a54257 | ||
|
|
bfc580cf7c | ||
|
|
fd2f76ee41 | ||
|
|
9e01d15e60 | ||
|
|
23ee164a76 | ||
|
|
99ddc36027 | ||
|
|
a33f48a83b | ||
|
|
11c060103a | ||
|
|
ac6b6f70eb | ||
|
|
baf10b24d6 | ||
|
|
0ab485115c | ||
|
|
f8895a14c5 | ||
|
|
22eabcea8d | ||
|
|
ccd3498594 | ||
|
|
71d088b90a | ||
|
|
17712d8b7d | ||
|
|
4a224ea9a5 | ||
|
|
6664b5620a | ||
|
|
a98e898bd8 | ||
|
|
e98ae5de39 | ||
|
|
a51fbbc238 | ||
|
|
f9b4c7b5ea | ||
|
|
4e83f52532 | ||
|
|
ec0b543393 | ||
|
|
cff94a12ee | ||
|
|
da39975ba8 | ||
|
|
82515343ee |
105
.appveyor.yml
@@ -1,76 +1,48 @@
|
||||
image:
|
||||
- Visual Studio 2019
|
||||
- Ubuntu
|
||||
- macos
|
||||
clone_depth: 1
|
||||
- Ubuntu2204
|
||||
- Visual Studio 2022
|
||||
- macos-catalina
|
||||
for:
|
||||
-
|
||||
matrix:
|
||||
only:
|
||||
- image: Ubuntu
|
||||
- image: Ubuntu2204
|
||||
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.17-cp37-cp37m-manylinux2014_x86_64.AppImage
|
||||
APPVEYOR_SSH_KEY: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDhb96UEXy8yOy/f+riX/8kKbNx/lOfIZ4pP4Cw3Gj3DmnTwEnxtRtyc+xtaxOsKbt+7+EAXFpCzYX+jHMhtd0QtWB7dbey8DBg31g0f8C5EPquqROibVbhzr/F3f6/d52FFfq6Y/CWaAvLjezvipr+zOOsIFcVusqtXdPJQ/LtUJ0LS5d4lFiw5ELHSxHIpqwGwyb7PbR3ufEFoqbr8eYiCH+vlBob72ArPfo2f3u0sMvpGYmjVVu2jj4FEY2h89sLrGyFdNWBoyumRhkb38+WSAuyPa/Y21+g+S8sRzIlkwbxicGNMtrMIi6zHEIGAgA06Sw2psP807h730PPOVaWjUcU3ojNW8hH3nPizF74pT82+iP7/fFC4PXLP+tBa+8OoHC5yiO7QKUKprMSqVa1qOm8fHbrzglplKJXfzSfUtSE+AQ+HtHhuUWKI+0LBLDrsOJwI5hbsPOAuiZ5I3VfqfAOck6SH9TcmlapVmQEypc7d7oeeUtZSOuIWKXp068= dfx@aw"
|
||||
APPIMAGE_TOOL: appimage-builder-x86_64.AppImage
|
||||
DEPLOY_DIR: AppDir/opt/pyfa
|
||||
# APPVEYOR_SSH_BLOCK: true
|
||||
# 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 -
|
||||
# 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 sed -i '/postgres/d' /etc/apt/sources.list # As of 2023-11-14, postgres repo fail to update, but we don't need them anyway
|
||||
- sh: sudo DEBIAN_FRONTEND=noninteractive apt-get -y update
|
||||
- sh: sudo DEBIAN_FRONTEND=noninteractive apt-get -y install python3.7-dev libgtk-3-dev python3-pip libwebkit2gtk-4.0-dev
|
||||
# AppImage dependencies
|
||||
- sh: sudo DEBIAN_FRONTEND=noninteractive apt-get -y install libfuse2
|
||||
# Preparation script dependencies
|
||||
- sh: sudo DEBIAN_FRONTEND=noninteractive apt-get -y install python3-wxgtk4.0 python3-sqlalchemy python3-logbook
|
||||
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 ../
|
||||
# Prepare pyfa data
|
||||
- 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
|
||||
- sh: python3 -B scripts/compile_lang.py
|
||||
- sh: python3 -B scripts/dump_crowdin_progress.py
|
||||
- sh: python3 -B db_update.py
|
||||
- sh: export PYFA_VERSION="$(python3 -B scripts/dump_version.py)"
|
||||
- sh: mkdir build
|
||||
# Download packaging tool
|
||||
- sh: curl -o $APPIMAGE_TOOL -L https://github.com/AppImageCrafters/appimage-builder/releases/download/v1.1.0/appimage-builder-1.1.0-x86_64.AppImage
|
||||
- sh: chmod +x $APPIMAGE_TOOL
|
||||
build_script:
|
||||
- sh: mkdir -p AppDir/opt/pyfa
|
||||
- sh: cp -r eos graphs gui imgs locale service utils eve.db config.py pyfa.py db_update.py README.md LICENSE version.yml AppDir/opt/pyfa/
|
||||
- sh: mkdir -p AppDir/usr/share/icons/hicolor/64x64/apps/
|
||||
- sh: cp imgs/gui/pyfa64.png AppDir/usr/share/icons/hicolor/64x64/apps/pyfa.png
|
||||
- sh: ./$APPIMAGE_TOOL --recipe dist_assets/linux/AppImageBuilder.yml
|
||||
after_build:
|
||||
- sh: ls -la build
|
||||
- sh: ls -la
|
||||
artifacts:
|
||||
- path: dist/pyfa-$PYFA_VERSION-linux.AppImage
|
||||
- path: pyfa-$PYFA_VERSION-linux.AppImage
|
||||
deploy:
|
||||
tag: $PYFA_VERSION
|
||||
release: pyfa $PYFA_VERSION
|
||||
@@ -86,17 +58,15 @@ for:
|
||||
-
|
||||
matrix:
|
||||
only:
|
||||
- image: Visual Studio 2019
|
||||
- image: Visual Studio 2022
|
||||
environment:
|
||||
PYTHON: "C:\\Python37-x64"
|
||||
PYTHON: "C:\\Python311-x64"
|
||||
# Should be enabled only for build process debugging
|
||||
# init:
|
||||
# - 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:
|
||||
- cmd: git fetch --prune --unshallow # to fix the version dump issues
|
||||
|
||||
- ps: echo("OS version:")
|
||||
- ps: "[System.Environment]::OSVersion.Version"
|
||||
|
||||
@@ -132,10 +102,8 @@ for:
|
||||
# pip will build them from source using the MSVC compiler matching the
|
||||
# target Python version and architecture
|
||||
- ps: echo("Install pip requirements:")
|
||||
# This one is needed to build wxpython 4.0.6 on windows
|
||||
- cmd: "python -m pip install pathlib2"
|
||||
- cmd: "python -m pip install -r requirements.txt"
|
||||
- cmd: "python -m pip install PyInstaller==3.6"
|
||||
- cmd: "python -m pip install PyInstaller==6.1.0"
|
||||
before_build:
|
||||
# directory that will contain the built files
|
||||
- ps: $env:PYFA_DIST_DIR = "c:\projects\$env:APPVEYOR_PROJECT_SLUG\dist"
|
||||
@@ -151,7 +119,7 @@ for:
|
||||
# Build gamedata DB
|
||||
- cmd: "python db_update.py"
|
||||
# Build command for PyInstaller
|
||||
- cmd: "python -m PyInstaller --noupx --clean --windowed --noconsole -y pyfa.spec"
|
||||
- cmd: "python -m PyInstaller --clean -y pyfa.spec"
|
||||
# Copy over manifest (See pyfa-org/pyfa#1622)
|
||||
- ps: xcopy /y dist_assets\win\pyfa.exe.manifest $env:PYFA_DIST_DIR\pyfa\
|
||||
# InnoScript EXE building. This is in a separate script because I don't feel like copying over the logic to AppVeyor script right now...
|
||||
@@ -178,16 +146,15 @@ for:
|
||||
-
|
||||
matrix:
|
||||
only:
|
||||
- image: macos
|
||||
- image: macos-catalina
|
||||
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:
|
||||
# - 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.11/bin/activate
|
||||
install:
|
||||
- sh: git fetch --prune --unshallow # to fix the version dump issues
|
||||
- sh: bash scripts/osx-setup.sh
|
||||
build_script:
|
||||
- sh: bash scripts/osx-translations.sh
|
||||
|
||||
@@ -794,8 +794,8 @@ def update_db():
|
||||
_hardcodeAttribs(cybeleTypeID, attrMap)
|
||||
_hardcodeEffects(cybeleTypeID, effectMap)
|
||||
|
||||
hardcodeShapash()
|
||||
hardcodeCybele()
|
||||
# hardcodeShapash()
|
||||
# hardcodeCybele()
|
||||
|
||||
eos.db.gamedata_session.commit()
|
||||
eos.db.gamedata_engine.execute('VACUUM')
|
||||
|
||||
70
dist_assets/linux/AppImageBuilder.yml
Normal file
@@ -0,0 +1,70 @@
|
||||
version: 1
|
||||
|
||||
AppDir:
|
||||
path: ./AppDir
|
||||
|
||||
app_info:
|
||||
id: pyfa
|
||||
name: pyfa
|
||||
icon: pyfa
|
||||
version: '{{PYFA_VERSION}}'
|
||||
exec: usr/bin/python3.11
|
||||
exec_args: "-s $APPDIR/opt/pyfa/pyfa.py $@"
|
||||
|
||||
apt:
|
||||
arch: [ amd64 ]
|
||||
sources:
|
||||
- sourceline: 'deb http://us.archive.ubuntu.com/ubuntu jammy main restricted universe multiverse'
|
||||
key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x871920d1991bc93c'
|
||||
- sourceline: 'deb http://us.archive.ubuntu.com/ubuntu jammy-updates main restricted universe multiverse'
|
||||
key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x871920d1991bc93c'
|
||||
- sourceline: 'deb http://us.archive.ubuntu.com/ubuntu jammy-backports main restricted universe multiverse'
|
||||
key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x871920d1991bc93c'
|
||||
- sourceline: 'deb http://us.archive.ubuntu.com/ubuntu jammy-security main restricted universe multiverse'
|
||||
key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x871920d1991bc93c'
|
||||
- sourceline: 'deb https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu jammy main'
|
||||
key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xf23c5a6cf475977595c89f51ba6932366a755776'
|
||||
|
||||
include:
|
||||
- python3.11
|
||||
# wx dependencies
|
||||
- libgtk-3-0
|
||||
- librsvg2-common # GTK3 recommendation; without it, search in char editor crashes
|
||||
- libwebkit2gtk-4.0-37 # Needed for wx's HTML lib
|
||||
exclude:
|
||||
- hicolor-icon-theme
|
||||
- humanity-icon-theme
|
||||
- ubuntu-mono
|
||||
|
||||
after_bundle:
|
||||
# Install python dependencies to bundled interpreter
|
||||
- export PYTHONHOME="AppDir/usr"
|
||||
- export PYTHONPATH="AppDir/usr/lib/python3.11/site-packages"
|
||||
- curl -L https://bootstrap.pypa.io/get-pip.py -o get-pip.py
|
||||
- AppDir/usr/bin/python3.11 get-pip.py
|
||||
# Just to bundle certificates with AppImage
|
||||
- AppDir/usr/bin/python3.11 -s -m pip install certifi
|
||||
- AppDir/usr/bin/python3.11 -s -m pip install -f https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-22.04 -r requirements.txt
|
||||
|
||||
files:
|
||||
exclude:
|
||||
- usr/lib/x86_64-linux-gnu/gconv
|
||||
- usr/share/man
|
||||
- usr/share/doc/*/README.*
|
||||
- usr/share/doc/*/changelog.*
|
||||
- usr/share/doc/*/NEWS.*
|
||||
- usr/share/doc/*/TODO.*
|
||||
- usr/include
|
||||
|
||||
runtime:
|
||||
env:
|
||||
PYTHONHOME: '${APPDIR}/usr'
|
||||
PYTHONPATH: '${APPDIR}/usr/lib/python3.11/site-packages'
|
||||
SSL_CERT_FILE: '${APPDIR}/usr/local/lib/python3.11/dist-packages/certifi/cacert.pem'
|
||||
# Workaround for https://github.com/AppImageCrafters/appimage-builder/issues/336
|
||||
XDG_DATA_DIRS: '${APPDIR}/usr/local/share:${APPDIR}/usr/share:/usr/local/share:/usr/share:$XDG_DATA_DIRS'
|
||||
|
||||
AppImage:
|
||||
sign-key: None
|
||||
arch: x86_64
|
||||
file_name: 'pyfa-{{PYFA_VERSION}}-linux.AppImage'
|
||||
@@ -1,19 +0,0 @@
|
||||
#! /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 "$@"
|
||||
@@ -1,3 +0,0 @@
|
||||
#! /bin/bash
|
||||
|
||||
${APPDIR}/usr/bin/python3.7 -s "${APPDIR}/opt/pyfa/pyfa.py" "$@"
|
||||
@@ -1,17 +0,0 @@
|
||||
<?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>
|
||||
@@ -1,7 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=Pyfa
|
||||
Exec=pyfa
|
||||
Comment=Python Fitting Assistant for EVE: Online
|
||||
Icon=python
|
||||
Categories=Game;
|
||||
@@ -80,6 +80,7 @@ exe = EXE(pyz,
|
||||
app = BUNDLE(
|
||||
exe,
|
||||
name='pyfa.app',
|
||||
version=os.getenv('PYFA_VERSION'),
|
||||
icon=icon,
|
||||
bundle_identifier=None,
|
||||
info_plist={
|
||||
@@ -88,5 +89,7 @@ app = BUNDLE(
|
||||
'CFBundleName': 'pyfa',
|
||||
'CFBundleDisplayName': 'pyfa',
|
||||
'CFBundleIdentifier': 'org.pyfaorg.pyfa',
|
||||
'CFBundleVersion': os.getenv('PYFA_VERSION'),
|
||||
'CFBundleShortVersionString': os.getenv('PYFA_VERSION'),
|
||||
}
|
||||
)
|
||||
|
||||
@@ -42,10 +42,10 @@ CloseApplications=yes
|
||||
DefaultDirName={pf}\{#MyAppName}
|
||||
DefaultGroupName={#MyAppName}
|
||||
AllowNoIcons=yes
|
||||
LicenseFile={#MyAppDir}\LICENSE
|
||||
LicenseFile={#MyAppDir}\app\LICENSE
|
||||
OutputDir={#MyOutputDir}
|
||||
OutputBaseFilename={#MyOutputFile}
|
||||
SetupIconFile={#MyAppDir}\pyfa.ico
|
||||
SetupIconFile={#MyAppDir}\app\pyfa.ico
|
||||
SolidCompression=yes
|
||||
|
||||
[Languages]
|
||||
|
||||
@@ -51,7 +51,7 @@ mapper(DynamicItemAttribute, dynamicAttributes_table,
|
||||
properties={"info": relation(AttributeInfo, lazy=False)})
|
||||
|
||||
mapper(DynamicItemItem, dynamicApplicable_table, properties={
|
||||
"mutaplasmid": relation(DynamicItem),
|
||||
"mutaplasmid": relation(DynamicItem, viewonly=True),
|
||||
})
|
||||
|
||||
DynamicItemAttribute.ID = association_proxy("info", "attributeID")
|
||||
|
||||
@@ -69,7 +69,8 @@ props = {
|
||||
primaryjoin=dynamicApplicable_table.c.applicableTypeID == items_table.c.typeID,
|
||||
secondaryjoin=dynamicApplicable_table.c.typeID == DynamicItem.typeID,
|
||||
secondary=dynamicApplicable_table,
|
||||
backref="applicableItems"
|
||||
backref="applicableItems",
|
||||
viewonly=True
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -175,12 +175,13 @@ mapper(es_Fit, fits_table,
|
||||
collection_class=HandledModuleList,
|
||||
primaryjoin=and_(modules_table.c.fitID == fits_table.c.ID, modules_table.c.projected == False), # noqa
|
||||
order_by=modules_table.c.position,
|
||||
overlaps='owner',
|
||||
cascade='all, delete, delete-orphan'),
|
||||
"_Fit__projectedModules": relation(
|
||||
Module,
|
||||
collection_class=HandledProjectedModList,
|
||||
overlaps='owner, _Fit__modules',
|
||||
cascade='all, delete, delete-orphan',
|
||||
single_parent=True,
|
||||
primaryjoin=and_(modules_table.c.fitID == fits_table.c.ID, modules_table.c.projected == True)), # noqa
|
||||
"owner": relation(
|
||||
User,
|
||||
@@ -190,37 +191,37 @@ mapper(es_Fit, fits_table,
|
||||
"_Fit__boosters": relation(
|
||||
Booster,
|
||||
collection_class=HandledBoosterList,
|
||||
cascade='all, delete, delete-orphan',
|
||||
single_parent=True),
|
||||
overlaps='owner',
|
||||
cascade='all, delete, delete-orphan'),
|
||||
"_Fit__drones": relation(
|
||||
Drone,
|
||||
collection_class=HandledDroneCargoList,
|
||||
overlaps='owner',
|
||||
cascade='all, delete, delete-orphan',
|
||||
single_parent=True,
|
||||
primaryjoin=and_(drones_table.c.fitID == fits_table.c.ID, drones_table.c.projected == False)), # noqa
|
||||
"_Fit__fighters": relation(
|
||||
Fighter,
|
||||
collection_class=HandledDroneCargoList,
|
||||
overlaps='owner',
|
||||
cascade='all, delete, delete-orphan',
|
||||
single_parent=True,
|
||||
primaryjoin=and_(fighters_table.c.fitID == fits_table.c.ID, fighters_table.c.projected == False)), # noqa
|
||||
"_Fit__cargo": relation(
|
||||
Cargo,
|
||||
collection_class=HandledDroneCargoList,
|
||||
overlaps='owner',
|
||||
cascade='all, delete, delete-orphan',
|
||||
single_parent=True,
|
||||
primaryjoin=and_(cargo_table.c.fitID == fits_table.c.ID)),
|
||||
"_Fit__projectedDrones": relation(
|
||||
Drone,
|
||||
collection_class=HandledProjectedDroneList,
|
||||
overlaps='owner, _Fit__drones',
|
||||
cascade='all, delete, delete-orphan',
|
||||
single_parent=True,
|
||||
primaryjoin=and_(drones_table.c.fitID == fits_table.c.ID, drones_table.c.projected == True)), # noqa
|
||||
"_Fit__projectedFighters": relation(
|
||||
Fighter,
|
||||
collection_class=HandledProjectedDroneList,
|
||||
overlaps='owner, _Fit__fighters',
|
||||
cascade='all, delete, delete-orphan',
|
||||
single_parent=True,
|
||||
primaryjoin=and_(fighters_table.c.fitID == fits_table.c.ID, fighters_table.c.projected == True)), # noqa
|
||||
"_Fit__implants": relation(
|
||||
Implant,
|
||||
|
||||
415
eos/effects.py
@@ -1304,6 +1304,7 @@ class Effect446(BaseEffect):
|
||||
Implants named like: Festival only 'Rock' SH Dose (4 of 4)
|
||||
Implants named like: Halcyon G Booster (5 of 5)
|
||||
Implants named like: Serenity Limited 'Hardshell' Dose (3 of 3)
|
||||
Implants named like: Wightstorm Nirvana Booster (4 of 4)
|
||||
Implants named like: Zainou 'Gnome' Shield Management SM (6 of 6)
|
||||
Modules named like: Core Defense Field Extender (8 of 8)
|
||||
Implant: AIR Nirvana Booster II
|
||||
@@ -1328,6 +1329,7 @@ class Effect485(BaseEffect):
|
||||
Implants named like: Halcyon G Booster (5 of 5)
|
||||
Implants named like: Halcyon R Booster (5 of 5)
|
||||
Implants named like: Inherent Implants 'Squire' Capacitor Systems Operation EO (6 of 6)
|
||||
Implants named like: Wightstorm Rapture Booster (4 of 4)
|
||||
Implants named like: grade Rapture (15 of 18)
|
||||
Modules named like: Capacitor Control Circuit (8 of 8)
|
||||
Implant: AIR Overclocker Booster III
|
||||
@@ -1511,6 +1513,7 @@ class Effect512(BaseEffect):
|
||||
Ship: Atron
|
||||
Ship: Federation Navy Comet
|
||||
Ship: Pacifier
|
||||
Ship: Shapash
|
||||
Ship: Taranis
|
||||
"""
|
||||
|
||||
@@ -1712,6 +1715,7 @@ class Effect562(BaseEffect):
|
||||
Variations of ship: Vexor (3 of 4)
|
||||
Ship: Adrestia
|
||||
Ship: Arazu
|
||||
Ship: Cybele
|
||||
Ship: Deimos
|
||||
Ship: Enforcer
|
||||
Ship: Exequror Navy Issue
|
||||
@@ -8390,6 +8394,7 @@ class Effect2803(BaseEffect):
|
||||
|
||||
Used by:
|
||||
Implants named like: Harvest Damage Booster (4 of 4)
|
||||
Implants named like: Wightstorm Vitarka Booster (4 of 4)
|
||||
Modules named like: Energy Collision Accelerator (8 of 8)
|
||||
Implant: Wisdom of Gheinok
|
||||
"""
|
||||
@@ -9665,6 +9670,7 @@ class Effect3196(BaseEffect):
|
||||
thermodynamicsSkillDamageBonus
|
||||
|
||||
Used by:
|
||||
Implants named like: Wightstorm Sunyata Booster (4 of 4)
|
||||
Skill: Thermodynamics
|
||||
"""
|
||||
|
||||
@@ -14883,6 +14889,7 @@ class Effect4473(BaseEffect):
|
||||
|
||||
Used by:
|
||||
Ship: Adrestia
|
||||
Ship: Cybele
|
||||
Ship: Mimir
|
||||
"""
|
||||
|
||||
@@ -15443,6 +15450,7 @@ class Effect4620(BaseEffect):
|
||||
|
||||
Used by:
|
||||
Ship: Garmur
|
||||
Ship: Shapash
|
||||
Ship: Utu
|
||||
"""
|
||||
|
||||
@@ -15461,6 +15469,7 @@ class Effect4621(BaseEffect):
|
||||
Used by:
|
||||
Ship: Cambion
|
||||
Ship: Etana
|
||||
Ship: Shapash
|
||||
Ship: Utu
|
||||
"""
|
||||
|
||||
@@ -15542,6 +15551,7 @@ class Effect4626(BaseEffect):
|
||||
|
||||
Used by:
|
||||
Ship: Adrestia
|
||||
Ship: Cybele
|
||||
Ship: Orthrus
|
||||
"""
|
||||
|
||||
@@ -18041,6 +18051,7 @@ class Effect5189(BaseEffect):
|
||||
|
||||
Used by:
|
||||
Implants named like: Tetrimon Precision Booster (4 of 4)
|
||||
Implants named like: Wightstorm Manasikara Booster (4 of 4)
|
||||
Modules named like: Energy Metastasis Adjuster (8 of 8)
|
||||
"""
|
||||
|
||||
@@ -37801,6 +37812,23 @@ class Effect8279(BaseEffect):
|
||||
skill='Industrial Command Ships', **kwargs)
|
||||
|
||||
|
||||
class Effect8291(BaseEffect):
|
||||
"""
|
||||
afterburnerSpeedBoostBonusPassive
|
||||
|
||||
Used by:
|
||||
Implants named like: Wightstorm Cetana Booster (4 of 4)
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, booster, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Afterburner'), 'speedFactor',
|
||||
booster.getModifiedItemAttr('speedFBonus'), **kwargs)
|
||||
|
||||
|
||||
class Effect8294(BaseEffect):
|
||||
"""
|
||||
industrialCommandBonusDroneOreMiningYield
|
||||
@@ -40117,6 +40145,23 @@ class Effect11764(BaseEffect):
|
||||
'speed', ship.getModifiedItemAttr('shipBonusRole7'), **kwargs)
|
||||
|
||||
|
||||
class Effect11767(BaseEffect):
|
||||
"""
|
||||
shipBonusHybridTrackingATC3
|
||||
|
||||
Used by:
|
||||
Ship: Cybele
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, src, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Medium Hybrid Turret'), 'trackingSpeed',
|
||||
src.getModifiedItemAttr('eliteBonusHeavyGunship1'), skill='Heavy Assault Cruisers', **kwargs)
|
||||
|
||||
|
||||
class Effect11919(BaseEffect):
|
||||
"""
|
||||
shipBonusDestroyerMD1Falloff
|
||||
@@ -40342,6 +40387,143 @@ class Effect11953(BaseEffect):
|
||||
stackingPenalties=True, penaltyGroup='postMul', **kwargs)
|
||||
|
||||
|
||||
class Effect11992(BaseEffect):
|
||||
"""
|
||||
shipBonusArmorPlateMassAT
|
||||
|
||||
Used by:
|
||||
Ship: Cybele
|
||||
Ship: Shapash
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, ship, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.group.name == 'Armor Plate', 'massAddition',
|
||||
ship.getModifiedItemAttr('shipBonusATF3'), **kwargs)
|
||||
|
||||
|
||||
class Effect11993(BaseEffect):
|
||||
"""
|
||||
shipBonusRepairSystemsBonusATC3
|
||||
|
||||
Used by:
|
||||
Ship: Cybele
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, src, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Repair Systems'), 'armorDamageAmount',
|
||||
src.getModifiedItemAttr('shipBonusGC3'), skill='Gallente Cruiser', **kwargs)
|
||||
|
||||
|
||||
class Effect11994(BaseEffect):
|
||||
"""
|
||||
shipBonusHybridFalloffATC3
|
||||
|
||||
Used by:
|
||||
Ship: Cybele
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, src, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Medium Hybrid Turret'), 'falloff',
|
||||
src.getModifiedItemAttr('eliteBonusHeavyGunship2'), skill='Heavy Assault Cruisers', **kwargs)
|
||||
|
||||
|
||||
class Effect11995(BaseEffect):
|
||||
"""
|
||||
shipBonusHeatAfterburnerATGF
|
||||
|
||||
Used by:
|
||||
Ship: Shapash
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, src, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Afterburner'), 'overloadSpeedFactorBonus',
|
||||
src.getModifiedItemAttr('shipBonusGF2'), skill='Gallente Frigate', **kwargs)
|
||||
|
||||
|
||||
class Effect11996(BaseEffect):
|
||||
"""
|
||||
shipBonusMWDHeatATGF
|
||||
|
||||
Used by:
|
||||
Ship: Shapash
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, src, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('High Speed Maneuvering'), 'overloadSpeedFactorBonus',
|
||||
src.getModifiedItemAttr('shipBonusGF2'), skill='Gallente Frigate', **kwargs)
|
||||
|
||||
|
||||
class Effect11997(BaseEffect):
|
||||
"""
|
||||
shipBonusArmorRepATGF
|
||||
|
||||
Used by:
|
||||
Ship: Shapash
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, src, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Repair Systems'), 'armorDamageAmount',
|
||||
src.getModifiedItemAttr('eliteBonusGunship1'), skill='Assault Frigates', **kwargs)
|
||||
|
||||
|
||||
class Effect11998(BaseEffect):
|
||||
"""
|
||||
shipBonusSmallHybridMaxRangeATF3
|
||||
|
||||
Used by:
|
||||
Ship: Shapash
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, src, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Small Hybrid Turret'), 'maxRange',
|
||||
src.getModifiedItemAttr('eliteBonusGunship2'), skill='Assault Frigates', **kwargs)
|
||||
|
||||
|
||||
class Effect11999(BaseEffect):
|
||||
"""
|
||||
shipBonusSmallHybridTrackingSpeedATF3
|
||||
|
||||
Used by:
|
||||
Ship: Shapash
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, src, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Small Hybrid Turret'), 'trackingSpeed',
|
||||
src.getModifiedItemAttr('eliteBonusGunship2'), skill='Assault Frigates', **kwargs)
|
||||
|
||||
|
||||
class Effect12003(BaseEffect):
|
||||
"""
|
||||
vortonTurretSpeeBonusPostPercentSpeedLocationShipModulesRequiringVortonProjectorOperation
|
||||
@@ -40357,236 +40539,3 @@ class Effect12003(BaseEffect):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Vorton Projector Operation'), 'speed',
|
||||
booster.getModifiedItemAttr('turretSpeeBonus'), **kwargs)
|
||||
|
||||
|
||||
class Effect100100(BaseEffect):
|
||||
"""
|
||||
pyfaCustomShapashAfArAmount
|
||||
|
||||
Used by:
|
||||
Ship: Shapash
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, ship, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Repair Systems'),
|
||||
'armorDamageAmount', 10, skill='Assault Frigates', **kwargs)
|
||||
|
||||
|
||||
class Effect100101(BaseEffect):
|
||||
"""
|
||||
pyfaCustomShapashAfShtTrackingOptimal
|
||||
|
||||
Used by:
|
||||
Ship: Shapash
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, ship, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Small Hybrid Turret'),
|
||||
'maxRange', 10, skill='Assault Frigates', **kwargs)
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Small Hybrid Turret'),
|
||||
'trackingSpeed', 10, skill='Assault Frigates', **kwargs)
|
||||
|
||||
|
||||
class Effect100102(BaseEffect):
|
||||
"""
|
||||
pyfaCustomShapashGfShtDamage
|
||||
|
||||
Used by:
|
||||
Ship: Shapash
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, ship, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Small Hybrid Turret'),
|
||||
'damageMultiplier', 10, skill='Gallente Frigate', **kwargs)
|
||||
|
||||
|
||||
class Effect100103(BaseEffect):
|
||||
"""
|
||||
pyfaCustomShapashGfPointRange
|
||||
|
||||
Used by:
|
||||
Ship: Shapash
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, ship, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.group.name == 'Warp Scrambler',
|
||||
'maxRange', 10, skill='Gallente Frigate', **kwargs)
|
||||
|
||||
|
||||
class Effect100104(BaseEffect):
|
||||
"""
|
||||
pyfaCustomShapashGfPropOverheat
|
||||
|
||||
Used by:
|
||||
Ship: Shapash
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, ship, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Afterburner') or mod.item.requiresSkill('High Speed Maneuvering'),
|
||||
'overloadSpeedFactorBonus', 10, skill='Gallente Frigate', **kwargs)
|
||||
|
||||
|
||||
class Effect100105(BaseEffect):
|
||||
"""
|
||||
pyfaCustomShapashRolePlateMass
|
||||
|
||||
Used by:
|
||||
Ship: Shapash
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, ship, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == 'Armor Plate', 'massAddition', -100, **kwargs)
|
||||
|
||||
|
||||
class Effect100106(BaseEffect):
|
||||
"""
|
||||
pyfaCustomShapashRoleHeat
|
||||
|
||||
Used by:
|
||||
Ship: Shapash
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, ship, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(lambda mod: True, 'heatDamage', -50, **kwargs)
|
||||
|
||||
|
||||
class Effect100200(BaseEffect):
|
||||
"""
|
||||
pyfaCustomCybeleHacMhtFalloff
|
||||
|
||||
Used by:
|
||||
Ship: Cybele
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, ship, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Medium Hybrid Turret'),
|
||||
'falloff', 10, skill='Heavy Assault Cruisers', **kwargs)
|
||||
|
||||
|
||||
class Effect100201(BaseEffect):
|
||||
"""
|
||||
pyfaCustomCybeleHacMhtTracking
|
||||
|
||||
Used by:
|
||||
Ship: Cybele
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, ship, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Medium Hybrid Turret'),
|
||||
'trackingSpeed', 7.5, skill='Heavy Assault Cruisers', **kwargs)
|
||||
|
||||
|
||||
class Effect100202(BaseEffect):
|
||||
"""
|
||||
pyfaCustomCybeleGcMhtDamage
|
||||
|
||||
Used by:
|
||||
Ship: Cybele
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, ship, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Medium Hybrid Turret'),
|
||||
'damageMultiplier', 20, skill='Gallente Cruiser', **kwargs)
|
||||
|
||||
|
||||
class Effect100203(BaseEffect):
|
||||
"""
|
||||
pyfaCustomCybeleGcArAmount
|
||||
|
||||
Used by:
|
||||
Ship: Cybele
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, ship, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill('Repair Systems'),
|
||||
'armorDamageAmount', 10, skill='Gallente Cruiser', **kwargs)
|
||||
|
||||
|
||||
class Effect100204(BaseEffect):
|
||||
"""
|
||||
pyfaCustomCybeleGcPointRange
|
||||
|
||||
Used by:
|
||||
Ship: Cybele
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, ship, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.group.name == 'Warp Scrambler',
|
||||
'maxRange', 25, skill='Gallente Cruiser', **kwargs)
|
||||
|
||||
|
||||
class Effect100205(BaseEffect):
|
||||
"""
|
||||
pyfaCustomCybeleRoleVelocity
|
||||
|
||||
Used by:
|
||||
Ship: Cybele
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, ship, context, projectionRange, **kwargs):
|
||||
fit.ship.boostItemAttr('maxVelocity', 30, **kwargs)
|
||||
|
||||
|
||||
class Effect100206(BaseEffect):
|
||||
"""
|
||||
pyfaCustomCybeleRolePlateMass
|
||||
|
||||
Used by:
|
||||
Ship: Cybele
|
||||
"""
|
||||
|
||||
type = 'passive'
|
||||
|
||||
@staticmethod
|
||||
def handler(fit, ship, context, projectionRange, **kwargs):
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == 'Armor Plate', 'massAddition', -100, **kwargs)
|
||||
|
||||
@@ -882,6 +882,14 @@ class Fit:
|
||||
if warfareBuffID == 100: # Weather_caustic_toxin_scan_resolution_bonus
|
||||
self.ship.boostItemAttr("scanResolution", value, stackingPenalties=True)
|
||||
|
||||
if warfareBuffID == 2405: # Insurgency Suppression Bonus: Interdiction Range
|
||||
self.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill("Navigation"),
|
||||
"maxRange", value, stackingPenalties=True)
|
||||
self.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.group.name == "Stasis Web",
|
||||
"maxRange", value, stackingPenalties=True)
|
||||
|
||||
del self.commandBonuses[warfareBuffID]
|
||||
|
||||
def __resetDependentCalcs(self):
|
||||
|
||||
@@ -114,7 +114,7 @@ class GraphFrame(AuxiliaryFrame):
|
||||
newW = max(curW, bestW)
|
||||
newH = max(curH, bestH)
|
||||
if newW > curW or newH > curH:
|
||||
newSize = wx.Size(newW, newH)
|
||||
newSize = wx.Size(round(newW), round(newH))
|
||||
self.SetSize(newSize)
|
||||
self.SetMinSize(newSize)
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ class VectorPicker(wx.Window):
|
||||
self._directionOnly = kwargs.pop('directionOnly', False)
|
||||
super().__init__(*args, **kwargs)
|
||||
self._fontsize = max(1, float(kwargs.pop('fontsize', 8 / self.GetContentScaleFactor())))
|
||||
self._font = wx.Font(self._fontsize, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False)
|
||||
self._font = wx.Font(round(self._fontsize), wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False)
|
||||
self._angle = 0
|
||||
self.__length = 1
|
||||
self._left = False
|
||||
@@ -76,7 +76,7 @@ class VectorPicker(wx.Window):
|
||||
self.__length = newLength
|
||||
|
||||
def DoGetBestSize(self):
|
||||
return wx.Size(self._size, self._size)
|
||||
return wx.Size(round(self._size), round(self._size))
|
||||
|
||||
def AcceptsFocusFromKeyboard(self):
|
||||
return False
|
||||
@@ -121,35 +121,37 @@ class VectorPicker(wx.Window):
|
||||
|
||||
radius = min(width, height) / 2 - 2
|
||||
dc.SetBrush(wx.WHITE_BRUSH)
|
||||
dc.DrawCircle(radius + 2, radius + 2, radius)
|
||||
dc.DrawCircle(round(radius + 2), round(radius + 2), round(radius))
|
||||
a = math.radians(self._angle + self._offset)
|
||||
x = math.cos(a) * radius
|
||||
y = math.sin(a) * radius
|
||||
# See PR #2260 on why this is needed
|
||||
pointRadius = 2 / self.GetContentScaleFactor() if 'wxGTK' in wx.PlatformInfo else 2
|
||||
dc.DrawLine(radius + 2, radius + 2, radius + 2 + x * self._length, radius + 2 - y * self._length)
|
||||
dc.DrawLine(
|
||||
round(radius + 2), round(radius + 2),
|
||||
round(radius + 2 + x * self._length), round(radius + 2 - y * self._length))
|
||||
dc.SetBrush(wx.BLACK_BRUSH)
|
||||
dc.DrawCircle(radius + 2 + x * self._length, radius + 2 - y * self._length, pointRadius)
|
||||
dc.DrawCircle(round(radius + 2 + x * self._length), round(radius + 2 - y * self._length), round(pointRadius))
|
||||
|
||||
if self._label:
|
||||
labelText = self._label
|
||||
labelTextW, labelTextH = dc.GetTextExtent(labelText)
|
||||
labelTextX = (radius * 2 + 4 - labelTextW) if (self._labelpos & 1) else 0
|
||||
labelTextY = (radius * 2 + 4 - labelTextH) if (self._labelpos & 2) else 0
|
||||
dc.DrawText(labelText, labelTextX, labelTextY)
|
||||
dc.DrawText(labelText, round(labelTextX), round(labelTextY))
|
||||
|
||||
if not self._directionOnly:
|
||||
lengthText = '%d%%' % (100 * self._length,)
|
||||
lengthTextW, lengthTextH = dc.GetTextExtent(lengthText)
|
||||
lengthTextX = radius + 2 + x / 2 - y / 3 - lengthTextW / 2
|
||||
lengthTextY = radius + 2 - y / 2 - x / 3 - lengthTextH / 2
|
||||
dc.DrawText(lengthText, lengthTextX, lengthTextY)
|
||||
dc.DrawText(lengthText, round(lengthTextX), round(lengthTextY))
|
||||
|
||||
angleText = '%d\u00B0' % (self._angle,)
|
||||
angleTextW, angleTextH = dc.GetTextExtent(angleText)
|
||||
angleTextX = radius + 2 - x / 2 - angleTextW / 2
|
||||
angleTextY = radius + 2 + y / 2 - angleTextH / 2
|
||||
dc.DrawText(angleText, angleTextX, angleTextY)
|
||||
dc.DrawText(angleText, round(angleTextX), round(angleTextY))
|
||||
|
||||
def OnEraseBackground(self, event):
|
||||
pass
|
||||
|
||||
@@ -212,7 +212,7 @@ class AttributeGauge(wx.Window):
|
||||
for x in range(1, 20):
|
||||
dc.SetBrush(wx.Brush(wx.LIGHT_GREY))
|
||||
dc.SetPen(wx.Pen(wx.LIGHT_GREY))
|
||||
dc.DrawRectangle(x * 10, 1, 1, rect.height)
|
||||
dc.DrawRectangle(round(x * 10), 1, 1, round(rect.height))
|
||||
|
||||
dc.SetBrush(wx.Brush(colour))
|
||||
dc.SetPen(wx.Pen(colour))
|
||||
@@ -222,19 +222,19 @@ class AttributeGauge(wx.Window):
|
||||
|
||||
if value >= 0:
|
||||
padding = (half if is_even else math.ceil(half - 1)) + 1
|
||||
dc.DrawRectangle(padding, 1, w, rect.height)
|
||||
dc.DrawRectangle(round(padding), 1, round(w), round(rect.height))
|
||||
else:
|
||||
padding = half - w + 1 if is_even else math.ceil(half) - (w - 1)
|
||||
dc.DrawRectangle(padding, 1, w, rect.height)
|
||||
dc.DrawRectangle(round(padding), 1, round(w), round(rect.height))
|
||||
|
||||
if self.leading_edge and (self.edge_on_neutral or value != 0):
|
||||
dc.SetPen(wx.Pen(wx.WHITE))
|
||||
dc.SetBrush(wx.Brush(wx.WHITE))
|
||||
|
||||
if value > 0:
|
||||
dc.DrawRectangle(min(padding + w, rect.width), 1, 1, rect.height)
|
||||
dc.DrawRectangle(round(min(padding + w, rect.width)), 1, 1, round(rect.height))
|
||||
else:
|
||||
dc.DrawRectangle(max(padding - 1, 1), 1, 1, rect.height)
|
||||
dc.DrawRectangle(round(max(padding - 1, 1)), 1, 1, round(rect.height))
|
||||
|
||||
def OnTimer(self, event):
|
||||
old_value = self._old_percentage
|
||||
|
||||
@@ -103,10 +103,9 @@ class BitmapLoader:
|
||||
pyfalog.warning("Missing icon file: {0}/{1}".format(location, filename))
|
||||
return None
|
||||
|
||||
bmp: wx.Bitmap = img.ConvertToBitmap()
|
||||
if scale > 1:
|
||||
bmp.SetSize((bmp.GetWidth() // scale, bmp.GetHeight() // scale))
|
||||
return bmp
|
||||
return img.Scale(round(img.GetWidth() // scale), round(img.GetHeight() // scale)).ConvertToBitmap()
|
||||
return img.ConvertToBitmap()
|
||||
|
||||
@classmethod
|
||||
def loadScaledBitmap(cls, name, location, scale=0):
|
||||
|
||||
@@ -124,6 +124,8 @@ class AddEnvironmentEffect(ContextMenuUnconditional):
|
||||
data.groups[_t('Sansha Incursion')] = self.getEffectBeacons(
|
||||
_t('ContextMenu|ProjectedEffectManipulation|Sansha Incursion'))
|
||||
data.groups[_t('Triglavian Invasion')] = self.getInvasionBeacons()
|
||||
# data.groups[_t('Pirate Insurgency')] = self.getEffectBeacons(
|
||||
# _t('ContextMenu|ProjectedEffectManipulation|Insurgency'))
|
||||
return data
|
||||
|
||||
def getEffectBeacons(self, *groups, extra_garbage=()):
|
||||
@@ -238,5 +240,12 @@ class AddEnvironmentEffect(ContextMenuUnconditional):
|
||||
data.items.append(Entry(item.ID, item.name, item.name))
|
||||
return data
|
||||
|
||||
def getInsurgencyBeacons(self):
|
||||
data = self.getDestructibleBeacons()
|
||||
# Suppression Interdiction Range Beacon
|
||||
item = Market.getInstance().getItem(79839)
|
||||
data.items.append(Entry(item.ID, item.name, item.name))
|
||||
return data
|
||||
|
||||
|
||||
AddEnvironmentEffect.register()
|
||||
|
||||
@@ -253,8 +253,8 @@ class PFSearchBox(wx.Window):
|
||||
else:
|
||||
spad = 0
|
||||
|
||||
dc.DrawBitmap(self.searchBitmapShadow, self.searchButtonX + 1, self.searchButtonY + 1)
|
||||
dc.DrawBitmap(self.searchBitmap, self.searchButtonX + spad, self.searchButtonY + spad)
|
||||
dc.DrawBitmap(self.searchBitmapShadow, round(self.searchButtonX + 1), round(self.searchButtonY + 1))
|
||||
dc.DrawBitmap(self.searchBitmap, round(self.searchButtonX + spad), round(self.searchButtonY + spad))
|
||||
|
||||
if self.isCancelButtonVisible:
|
||||
if self.cancelBitmap:
|
||||
@@ -262,8 +262,8 @@ class PFSearchBox(wx.Window):
|
||||
cpad = 1
|
||||
else:
|
||||
cpad = 0
|
||||
dc.DrawBitmap(self.cancelBitmapShadow, self.cancelButtonX + 1, self.cancelButtonY + 1)
|
||||
dc.DrawBitmap(self.cancelBitmap, self.cancelButtonX + cpad, self.cancelButtonY + cpad)
|
||||
dc.DrawBitmap(self.cancelBitmapShadow, round(self.cancelButtonX + 1), round(self.cancelButtonY + 1))
|
||||
dc.DrawBitmap(self.cancelBitmap, round(self.cancelButtonX + cpad), round(self.cancelButtonY + cpad))
|
||||
|
||||
dc.SetPen(wx.Pen(sepColor, 1))
|
||||
dc.DrawLine(0, rect.height - 1, rect.width, rect.height - 1)
|
||||
|
||||
@@ -40,7 +40,7 @@ class PFGeneralPref(PreferenceView):
|
||||
|
||||
langSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
self.langChoices = sorted([langInfo for lang, langInfo in LocaleSettings.supported_langauges().items()], key=lambda x: x.Description)
|
||||
self.langChoices = sorted([langInfo for lang, langInfo in LocaleSettings.supported_languages().items()], key=lambda x: x.Description)
|
||||
pyfaLangsEnabled = bool(self.langChoices)
|
||||
|
||||
if pyfaLangsEnabled:
|
||||
@@ -64,7 +64,7 @@ class PFGeneralPref(PreferenceView):
|
||||
langBox.Add(hl.HyperLinkCtrl(panel, -1,
|
||||
_t("Interested in helping with translations?"),
|
||||
URL="https://github.com/pyfa-org/Pyfa/blob/master/locale/README.md"
|
||||
), 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 15)
|
||||
), 0, wx.LEFT, 15)
|
||||
else:
|
||||
self.stLangLabel = wx.StaticText(panel, wx.ID_ANY, _t("Pyfa language selection disabled. Please check if .mo files have been generated.\nRefer to locale/README.md for info."), wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stLangLabel.Wrap(-1)
|
||||
@@ -93,7 +93,7 @@ class PFGeneralPref(PreferenceView):
|
||||
langBox.Add(wx.StaticText(panel, wx.ID_ANY,
|
||||
_t("Auto will use the same language pyfa uses if available, otherwise English"),
|
||||
wx.DefaultPosition,
|
||||
wx.DefaultSize, 0), 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 15)
|
||||
wx.DefaultSize, 0), 0, wx.LEFT, 15)
|
||||
|
||||
self.cbGlobalChar = wx.CheckBox(panel, wx.ID_ANY, _t("Use global character"), wx.DefaultPosition, wx.DefaultSize,
|
||||
0)
|
||||
|
||||
@@ -104,14 +104,14 @@ class CategoryItem(SFBrowserItem):
|
||||
textColor = colorUtils.GetSuitable(windowColor, 1)
|
||||
|
||||
mdc.SetTextForeground(textColor)
|
||||
mdc.DrawBitmap(self.dropShadowBitmap, self.shipBmpx + 1, self.shipBmpy + 1)
|
||||
mdc.DrawBitmap(self.shipBmp, self.shipBmpx, self.shipBmpy, 0)
|
||||
mdc.DrawBitmap(self.dropShadowBitmap, round(self.shipBmpx + 1), round(self.shipBmpy + 1))
|
||||
mdc.DrawBitmap(self.shipBmp, round(self.shipBmpx), round(self.shipBmpy), 0)
|
||||
|
||||
mdc.SetFont(self.fontBig)
|
||||
|
||||
categoryName, fittings = self.fittingInfo
|
||||
|
||||
mdc.DrawText(categoryName, self.catx, self.caty)
|
||||
mdc.DrawText(categoryName, round(self.catx), round(self.caty))
|
||||
|
||||
|
||||
# =============================================================================
|
||||
|
||||
@@ -416,9 +416,18 @@ class FitItem(SFItem.SFBrowserItem):
|
||||
if self.dragging:
|
||||
if not self.dragged:
|
||||
if self.dragMotionTrigger < 0:
|
||||
if not self.dragTLFBmp:
|
||||
tdc = wx.MemoryDC()
|
||||
bmpWidth = self.toolbarx if self.toolbarx < 200 else 200
|
||||
self.dragTLFBmp = wx.Bitmap(round(bmpWidth), round(self.GetRect().height))
|
||||
tdc.SelectObject(self.dragTLFBmp)
|
||||
tdc.SetBrush(wx.Brush(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)))
|
||||
tdc.DrawRectangle(0, 0, bmpWidth, self.GetRect().height)
|
||||
self.DrawItem(tdc)
|
||||
tdc.SelectObject(wx.NullBitmap)
|
||||
if not self.HasCapture():
|
||||
self.CaptureMouse()
|
||||
self.dragWindow = PFBitmapFrame(self, pos, self.dragTLFBmp)
|
||||
self.dragWindow = PFBitmapFrame(self, pos, self.dragTLFBmp)
|
||||
self.dragWindow.Show()
|
||||
self.dragged = True
|
||||
self.dragMotionTrigger = self.dragMotionTrail
|
||||
@@ -493,9 +502,9 @@ class FitItem(SFItem.SFBrowserItem):
|
||||
else:
|
||||
shipEffBk = self.shipEffBk
|
||||
|
||||
mdc.DrawBitmap(shipEffBk, self.shipEffx, self.shipEffy, 0)
|
||||
mdc.DrawBitmap(shipEffBk, round(self.shipEffx), round(self.shipEffy), 0)
|
||||
|
||||
mdc.DrawBitmap(self.shipBmp, self.shipBmpx, self.shipBmpy, 0)
|
||||
mdc.DrawBitmap(self.shipBmp, round(self.shipBmpx), round(self.shipBmpy), 0)
|
||||
|
||||
mdc.SetFont(self.fontNormal)
|
||||
|
||||
@@ -504,26 +513,21 @@ class FitItem(SFItem.SFBrowserItem):
|
||||
pfdate = drawUtils.GetPartialText(mdc, fitLocalDate,
|
||||
self.toolbarx - self.textStartx - self.padding * 2 - self.thoverw)
|
||||
|
||||
mdc.DrawText(pfdate, self.textStartx, self.timestampy)
|
||||
mdc.DrawText(pfdate, round(self.textStartx), round(self.timestampy))
|
||||
|
||||
mdc.SetFont(self.fontSmall)
|
||||
mdc.DrawText(self.toolbar.hoverLabel, self.thoverx, self.thovery)
|
||||
mdc.DrawText(self.toolbar.hoverLabel, round(self.thoverx), round(self.thovery))
|
||||
|
||||
mdc.SetFont(self.fontBig)
|
||||
|
||||
psname = drawUtils.GetPartialText(mdc, self.fitName,
|
||||
self.toolbarx - self.textStartx - self.padding * 2 - self.thoverw)
|
||||
|
||||
mdc.DrawText(psname, self.textStartx, self.fitNamey)
|
||||
mdc.DrawText(psname, round(self.textStartx), round(self.fitNamey))
|
||||
|
||||
if self.tcFitName.IsShown():
|
||||
self.AdjustControlSizePos(self.tcFitName, self.textStartx, self.toolbarx - self.editWidth - self.padding)
|
||||
|
||||
tdc = wx.MemoryDC()
|
||||
self.dragTLFBmp = wx.Bitmap((self.toolbarx if self.toolbarx < 200 else 200), rect.height, 24)
|
||||
tdc.SelectObject(self.dragTLFBmp)
|
||||
tdc.Blit(0, 0, (self.toolbarx if self.toolbarx < 200 else 200), rect.height, mdc, 0, 0, wx.COPY)
|
||||
tdc.SelectObject(wx.NullBitmap)
|
||||
|
||||
def AdjustControlSizePos(self, editCtl, start, end):
|
||||
fnEditSize = editCtl.GetSize()
|
||||
|
||||
@@ -231,7 +231,7 @@ class NavigationPanel(SFItem.SFBrowserItem):
|
||||
|
||||
self.toolbar.SetPosition((self.toolbarx, self.toolbary))
|
||||
mdc.SetFont(self.fontSmall)
|
||||
mdc.DrawText(self.toolbar.hoverLabel, self.thoverx, self.thovery)
|
||||
mdc.DrawText(self.toolbar.hoverLabel, round(self.thoverx), round(self.thovery))
|
||||
mdc.SetPen(wx.Pen(sepColor, 1))
|
||||
mdc.DrawLine(0, rect.height - 1, rect.width, rect.height - 1)
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ class PFBitmapFrame(wx.Frame):
|
||||
# todo: evaluate wx.DragImage, might make this class obsolete, however might also lose our customizations
|
||||
# (like the sexy fade-in animation)
|
||||
rect = self.GetRect()
|
||||
canvas = wx.Bitmap(rect.width, rect.height)
|
||||
canvas = wx.Bitmap(round(rect.width), round(rect.height))
|
||||
# todo: convert to context manager after updating to wxPython >v4.0.1 (4.0.1 has a bug, see #1421)
|
||||
# See #1418 for discussion
|
||||
mdc = wx.BufferedPaintDC(self)
|
||||
@@ -63,4 +63,4 @@ class PFBitmapFrame(wx.Frame):
|
||||
mdc.DrawBitmap(self.bitmap, 0, 0)
|
||||
mdc.SetPen(wx.Pen("#000000", width=1))
|
||||
mdc.SetBrush(wx.TRANSPARENT_BRUSH)
|
||||
mdc.DrawRectangle(0, 0, rect.width, rect.height)
|
||||
mdc.DrawRectangle(0, 0, round(rect.width), round(rect.height))
|
||||
|
||||
@@ -57,7 +57,7 @@ class PFListPane(wx.ScrolledWindow):
|
||||
|
||||
posy = self.GetScrollPos(wx.VERTICAL)
|
||||
posy -= self.itemsHeight
|
||||
self.Scroll(0, posy)
|
||||
self.Scroll(0, round(posy))
|
||||
|
||||
event.Skip()
|
||||
|
||||
@@ -65,7 +65,7 @@ class PFListPane(wx.ScrolledWindow):
|
||||
|
||||
posy = self.GetScrollPos(wx.VERTICAL)
|
||||
posy += self.itemsHeight
|
||||
self.Scroll(0, posy)
|
||||
self.Scroll(0, round(posy))
|
||||
|
||||
event.Skip()
|
||||
|
||||
@@ -109,7 +109,7 @@ class PFListPane(wx.ScrolledWindow):
|
||||
|
||||
# if we need to adjust
|
||||
if new_vs_x != -1 or new_vs_y != -1:
|
||||
self.Scroll(new_vs_x, new_vs_y)
|
||||
self.Scroll(round(new_vs_x), round(new_vs_y))
|
||||
|
||||
def AddWidget(self, widget):
|
||||
widget.Reparent(self)
|
||||
|
||||
@@ -68,7 +68,7 @@ class RaceSelector(wx.Window):
|
||||
img = img.Rotate90(False)
|
||||
img.Replace(0, 0, 0, sysTextColour[0], sysTextColour[1], sysTextColour[2])
|
||||
if layout == wx.VERTICAL:
|
||||
img = img.Scale(self.minWidth, 8, wx.IMAGE_QUALITY_HIGH)
|
||||
img = img.Scale(round(self.minWidth), 8, wx.IMAGE_QUALITY_HIGH)
|
||||
|
||||
self.bmpArrow = wx.Bitmap(img)
|
||||
|
||||
@@ -194,25 +194,25 @@ class RaceSelector(wx.Window):
|
||||
bmp = wx.Bitmap(img)
|
||||
|
||||
if self.layout == wx.VERTICAL:
|
||||
mdc.DrawBitmap(dropShadow, rect.width - self.buttonsPadding - bmp.GetWidth() + 1, y + 1)
|
||||
mdc.DrawBitmap(bmp, rect.width - self.buttonsPadding - bmp.GetWidth(), y)
|
||||
mdc.DrawBitmap(dropShadow, round(rect.width - self.buttonsPadding - bmp.GetWidth() + 1), round(y + 1))
|
||||
mdc.DrawBitmap(bmp, round(rect.width - self.buttonsPadding - bmp.GetWidth()), round(y))
|
||||
y += raceBmp.GetHeight() + self.buttonsPadding
|
||||
mdc.SetPen(wx.Pen(sepColor, 1))
|
||||
mdc.DrawLine(rect.width - 1, 0, rect.width - 1, rect.height)
|
||||
else:
|
||||
mdc.DrawBitmap(dropShadow, x + 1, self.buttonsPadding + 1)
|
||||
mdc.DrawBitmap(bmp, x, self.buttonsPadding)
|
||||
mdc.DrawBitmap(dropShadow, round(x + 1), round(self.buttonsPadding + 1))
|
||||
mdc.DrawBitmap(bmp, round(x), round(self.buttonsPadding))
|
||||
x += raceBmp.GetWidth() + self.buttonsPadding
|
||||
mdc.SetPen(wx.Pen(sepColor, 1))
|
||||
mdc.DrawLine(0, 0, rect.width, 0)
|
||||
|
||||
if self.direction < 1:
|
||||
if self.layout == wx.VERTICAL:
|
||||
mdc.DrawBitmap(self.bmpArrow, -2, (rect.height - self.bmpArrow.GetHeight()) / 2)
|
||||
mdc.DrawBitmap(self.bmpArrow, -2, round((rect.height - self.bmpArrow.GetHeight()) / 2))
|
||||
else:
|
||||
mdc.SetPen(wx.Pen(sepColor, 1))
|
||||
mdc.DrawLine(0, 0, rect.width, 0)
|
||||
mdc.DrawBitmap(self.bmpArrow, (rect.width - self.bmpArrow.GetWidth()) / 2, -2)
|
||||
mdc.DrawBitmap(self.bmpArrow, round((rect.width - self.bmpArrow.GetWidth()) / 2), -2)
|
||||
|
||||
def OnTimer(self, event):
|
||||
if event.GetId() == self.animTimerID:
|
||||
|
||||
@@ -233,8 +233,8 @@ class PFToolbar:
|
||||
|
||||
bmpWidth = bmp.GetWidth()
|
||||
|
||||
pdc.DrawBitmap(dropShadowBmp, bx + self.padding / 2, self.toolbarY + self.padding / 2)
|
||||
pdc.DrawBitmap(bmp, tbx, by)
|
||||
pdc.DrawBitmap(dropShadowBmp, round(bx + self.padding / 2), round(self.toolbarY + self.padding / 2))
|
||||
pdc.DrawBitmap(bmp, round(tbx), round(by))
|
||||
|
||||
bx += bmpWidth + self.padding
|
||||
|
||||
|
||||
@@ -247,12 +247,12 @@ class ShipItem(SFItem.SFBrowserItem):
|
||||
else:
|
||||
shipEffBk = self.shipEffBk
|
||||
|
||||
mdc.DrawBitmap(shipEffBk, self.shipEffx, self.shipEffy, 0)
|
||||
mdc.DrawBitmap(shipEffBk, round(self.shipEffx), round(self.shipEffy), 0)
|
||||
|
||||
mdc.DrawBitmap(self.shipBmp, self.shipBmpx, self.shipBmpy, 0)
|
||||
mdc.DrawBitmap(self.shipBmp, round(self.shipBmpx), round(self.shipBmpy), 0)
|
||||
|
||||
mdc.DrawBitmap(self.raceDropShadowBmp, self.raceBmpx + 1, self.raceBmpy + 1)
|
||||
mdc.DrawBitmap(self.raceBmp, self.raceBmpx, self.raceBmpy)
|
||||
mdc.DrawBitmap(self.raceDropShadowBmp, round(self.raceBmpx + 1), round(self.raceBmpy + 1))
|
||||
mdc.DrawBitmap(self.raceBmp, round(self.raceBmpx), round(self.raceBmpy))
|
||||
|
||||
shipName, shipTrait, fittings = self.shipFittingInfo
|
||||
|
||||
@@ -264,17 +264,17 @@ class ShipItem(SFItem.SFBrowserItem):
|
||||
fformat = "%d fits"
|
||||
|
||||
mdc.SetFont(self.fontNormal)
|
||||
mdc.DrawText(fformat % fittings if fittings > 0 else fformat, self.textStartx, self.fittingsy)
|
||||
mdc.DrawText(fformat % fittings if fittings > 0 else fformat, round(self.textStartx), round(self.fittingsy))
|
||||
|
||||
mdc.SetFont(self.fontSmall)
|
||||
mdc.DrawText(self.toolbar.hoverLabel, self.thoverx, self.thovery)
|
||||
mdc.DrawText(self.toolbar.hoverLabel, round(self.thoverx), round(self.thovery))
|
||||
|
||||
mdc.SetFont(self.fontBig)
|
||||
|
||||
psname = drawUtils.GetPartialText(mdc, shipName,
|
||||
self.toolbarx - self.textStartx - self.padding * 2 - self.thoverw)
|
||||
|
||||
mdc.DrawText(psname, self.textStartx, self.shipNamey)
|
||||
mdc.DrawText(psname, round(self.textStartx), round(self.shipNamey))
|
||||
|
||||
if self.tcFitName.IsShown():
|
||||
self.AdjustControlSizePos(self.tcFitName, self.textStartx, self.toolbarx - self.editWidth - self.padding)
|
||||
|
||||
@@ -146,8 +146,8 @@ class ResistancesViewFull(StatsView):
|
||||
|
||||
lbl = PyGauge(contentPanel, font, 100)
|
||||
lbl.SetMinSize((48, 16))
|
||||
lbl.SetBackgroundColour(wx.Colour(bc[0], bc[1], bc[2]))
|
||||
lbl.SetBarColour(wx.Colour(fc[0], fc[1], fc[2]))
|
||||
lbl.SetBackgroundColour(wx.Colour(round(bc[0]), round(bc[1]), round(bc[2])))
|
||||
lbl.SetBarColour(wx.Colour(round(fc[0]), round(fc[1]), round(fc[2])))
|
||||
lbl.SetBarGradient()
|
||||
lbl.SetFractionDigits(1)
|
||||
|
||||
|
||||
@@ -895,7 +895,7 @@ class FittingView(d.Display):
|
||||
opts.m_labelText = name
|
||||
|
||||
if imgId != -1:
|
||||
opts.m_labelBitmap = wx.Bitmap(isize, isize)
|
||||
opts.m_labelBitmap = wx.Bitmap(round(isize), round(isize))
|
||||
|
||||
width = render.DrawHeaderButton(self, tdc, (0, 0, 16, 16), sortArrow=wx.HDR_SORT_ICON_NONE, params=opts)
|
||||
|
||||
@@ -911,7 +911,7 @@ class FittingView(d.Display):
|
||||
maxWidth += columnsWidths[i]
|
||||
|
||||
mdc = wx.MemoryDC()
|
||||
mbmp = wx.Bitmap(maxWidth, maxRowHeight * rows + padding * 4 + headerSize)
|
||||
mbmp = wx.Bitmap(round(maxWidth), round(maxRowHeight * rows + padding * 4 + headerSize))
|
||||
|
||||
mdc.SelectObject(mbmp)
|
||||
|
||||
@@ -956,7 +956,7 @@ class FittingView(d.Display):
|
||||
cx = padding
|
||||
|
||||
if slotMap[st.slot]:
|
||||
mdc.DrawRectangle(cx, cy, maxWidth - cx, maxRowHeight)
|
||||
mdc.DrawRectangle(round(cx), round(cy), round(maxWidth - cx), round(maxRowHeight))
|
||||
|
||||
for i, col in enumerate(self.activeColumns):
|
||||
if i > maxColumns:
|
||||
|
||||
@@ -533,7 +533,7 @@ class SkillTreeView(wx.Panel):
|
||||
iconId = self.skillBookDirtyImageId
|
||||
|
||||
childId = tree.AppendItem(root, name, iconId, data=('skill', id))
|
||||
tree.SetItemText(childId, 1, _t("Level {}d").format(int(level)) if isinstance(level, float) else level)
|
||||
tree.SetItemText(childId, 1, _t("Level {}").format(int(level)) if isinstance(level, float) else level)
|
||||
|
||||
def populateSkillTree(self, event=None):
|
||||
sChar = Character.getInstance()
|
||||
@@ -591,7 +591,6 @@ class SkillTreeView(wx.Panel):
|
||||
iconId = self.skillBookDirtyImageId
|
||||
|
||||
childId = tree.AppendItem(root, name, iconId, data=('skill', id))
|
||||
|
||||
tree.SetItemText(childId, 1, _t("Level {}").format(int(level)) if isinstance(level, float) else level)
|
||||
|
||||
def spawnMenu(self, event):
|
||||
|
||||
@@ -514,7 +514,7 @@ class _TabRenderer:
|
||||
Creates the tab background bitmap based upon calculated dimension values
|
||||
and modified bitmaps via InitBitmaps()
|
||||
"""
|
||||
bk_bmp = wx.Bitmap(self.tab_width, self.tab_height)
|
||||
bk_bmp = wx.Bitmap(round(self.tab_width), round(self.tab_height))
|
||||
|
||||
mdc = wx.MemoryDC()
|
||||
mdc.SelectObject(bk_bmp)
|
||||
@@ -525,16 +525,16 @@ class _TabRenderer:
|
||||
|
||||
# convert middle bitmap and scale to tab width
|
||||
cm = self.ctab_middle_bmp.ConvertToImage()
|
||||
mimg = cm.Scale(self.content_width, self.ctab_middle.GetHeight(),
|
||||
mimg = cm.Scale(round(self.content_width), round(self.ctab_middle.GetHeight()),
|
||||
wx.IMAGE_QUALITY_NORMAL)
|
||||
mbmp = wx.Bitmap(mimg)
|
||||
|
||||
# draw middle bitmap, offset by left
|
||||
mdc.DrawBitmap(mbmp, self.left_width, 0)
|
||||
mdc.DrawBitmap(mbmp, round(self.left_width), 0)
|
||||
|
||||
# draw right bitmap offset by left + middle
|
||||
mdc.DrawBitmap(self.ctab_right_bmp,
|
||||
self.content_width + self.left_width, 0)
|
||||
round(self.content_width + self.left_width), 0)
|
||||
|
||||
mdc.SelectObject(wx.NullBitmap)
|
||||
|
||||
@@ -555,7 +555,7 @@ class _TabRenderer:
|
||||
+ self.left_width \
|
||||
- self.ctab_close_bmp.GetWidth() / 2
|
||||
y_offset = (self.tab_height - self.ctab_close_bmp.GetHeight()) / 2
|
||||
self.close_region.Offset(x_offset, y_offset)
|
||||
self.close_region.Offset(round(x_offset), round(y_offset))
|
||||
|
||||
def InitColors(self):
|
||||
"""Determines colors used for tab, based on system settings"""
|
||||
@@ -573,7 +573,7 @@ class _TabRenderer:
|
||||
|
||||
height = self.tab_height
|
||||
|
||||
canvas = wx.Bitmap(self.tab_width, self.tab_height, 24)
|
||||
canvas = wx.Bitmap(round(self.tab_width), round(self.tab_height), 24)
|
||||
|
||||
mdc = wx.MemoryDC()
|
||||
|
||||
@@ -590,8 +590,8 @@ class _TabRenderer:
|
||||
# Draw tab icon
|
||||
mdc.DrawBitmap(
|
||||
bmp,
|
||||
self.left_width + self.padding - bmp.GetWidth() / 2,
|
||||
(height - bmp.GetHeight()) / 2)
|
||||
round(self.left_width + self.padding - bmp.GetWidth() / 2),
|
||||
round((height - bmp.GetHeight()) / 2))
|
||||
|
||||
# draw close button
|
||||
if self.closeable:
|
||||
@@ -604,8 +604,8 @@ class _TabRenderer:
|
||||
|
||||
mdc.DrawBitmap(
|
||||
cbmp,
|
||||
self.content_width + self.left_width - cbmp.GetWidth() / 2,
|
||||
(height - cbmp.GetHeight()) / 2)
|
||||
round(self.content_width + self.left_width - cbmp.GetWidth() / 2),
|
||||
round((height - cbmp.GetHeight()) / 2))
|
||||
|
||||
mdc.SelectObject(wx.NullBitmap)
|
||||
|
||||
@@ -640,7 +640,7 @@ class _TabRenderer:
|
||||
# draw text (with no ellipses)
|
||||
text = draw.GetPartialText(dc, self.text, maxsize, "")
|
||||
tx, ty = dc.GetTextExtent(text)
|
||||
dc.DrawText(text, text_start + self.padding, height / 2 - ty / 2)
|
||||
dc.DrawText(text, round(text_start + self.padding), round(height / 2 - ty / 2))
|
||||
|
||||
def __repr__(self):
|
||||
return "_TabRenderer(text={}, disabled={}) at {}".format(
|
||||
@@ -1005,7 +1005,7 @@ class _TabsContainer(wx.Panel):
|
||||
|
||||
region = tab.GetCloseButtonRegion()
|
||||
posx, posy = tab.GetPosition()
|
||||
region.Offset(posx, posy)
|
||||
region.Offset(round(posx), round(posy))
|
||||
|
||||
if region.Contains(x, y):
|
||||
index = self.tabs.index(tab)
|
||||
@@ -1036,7 +1036,7 @@ class _TabsContainer(wx.Panel):
|
||||
|
||||
region = self.add_button.GetRegion()
|
||||
ax, ay = self.add_button.GetPosition()
|
||||
region.Offset(ax, ay)
|
||||
region.Offset(round(ax), round(ay))
|
||||
|
||||
if region.Contains(x, y):
|
||||
ev = PageAdding()
|
||||
@@ -1058,7 +1058,7 @@ class _TabsContainer(wx.Panel):
|
||||
for tab in self.tabs:
|
||||
region = tab.GetCloseButtonRegion()
|
||||
posx, posy = tab.GetPosition()
|
||||
region.Offset(posx, posy)
|
||||
region.Offset(round(posx), round(posy))
|
||||
|
||||
if region.Contains(x, y):
|
||||
if not tab.GetCloseButtonHoverStatus():
|
||||
@@ -1093,7 +1093,7 @@ class _TabsContainer(wx.Panel):
|
||||
tabRegion = tab.GetTabRegion()
|
||||
tabPos = tab.GetPosition()
|
||||
tabPosX, tabPosY = tabPos
|
||||
tabRegion.Offset(tabPosX, tabPosY)
|
||||
tabRegion.Offset(round(tabPosX), round(tabPosY))
|
||||
|
||||
if tabRegion.Contains(x, y):
|
||||
return True
|
||||
@@ -1166,7 +1166,7 @@ class _TabsContainer(wx.Panel):
|
||||
|
||||
region = self.add_button.GetRegion()
|
||||
ax, ay = self.add_button.GetPosition()
|
||||
region.Offset(ax, ay)
|
||||
region.Offset(round(ax), round(ay))
|
||||
|
||||
if region.Contains(x, y):
|
||||
if not self.add_button.IsHighlighted():
|
||||
@@ -1198,7 +1198,7 @@ class _TabsContainer(wx.Panel):
|
||||
|
||||
if self.show_add_button:
|
||||
ax, ay = self.add_button.GetPosition()
|
||||
mdc.DrawBitmap(self.add_button.Render(), ax, ay, True)
|
||||
mdc.DrawBitmap(self.add_button.Render(), round(ax), round(ay), True)
|
||||
|
||||
for i in range(len(self.tabs) - 1, -1, -1):
|
||||
tab = self.tabs[i]
|
||||
@@ -1206,14 +1206,14 @@ class _TabsContainer(wx.Panel):
|
||||
|
||||
if not tab.IsSelected():
|
||||
# drop shadow first
|
||||
mdc.DrawBitmap(self.fxBmps[tab], posx, posy, True)
|
||||
mdc.DrawBitmap(self.fxBmps[tab], round(posx), (posy), True)
|
||||
bmp = tab.Render()
|
||||
img = bmp.ConvertToImage()
|
||||
img = img.AdjustChannels(1, 1, 1, 0.85)
|
||||
bmp = wx.Bitmap(img)
|
||||
mdc.DrawBitmap(bmp, posx, posy, True)
|
||||
mdc.DrawBitmap(bmp, round(posx), (posy), True)
|
||||
|
||||
mdc.SetDeviceOrigin(posx, posy)
|
||||
mdc.SetDeviceOrigin(round(posx), round(posy))
|
||||
tab.DrawText(mdc)
|
||||
mdc.SetDeviceOrigin(0, 0)
|
||||
else:
|
||||
@@ -1224,7 +1224,7 @@ class _TabsContainer(wx.Panel):
|
||||
if selected:
|
||||
posx, posy = selected.GetPosition()
|
||||
# drop shadow first
|
||||
mdc.DrawBitmap(self.fxBmps[selected], posx, posy, True)
|
||||
mdc.DrawBitmap(self.fxBmps[selected], round(posx), round(posy), True)
|
||||
|
||||
bmp = selected.Render()
|
||||
|
||||
@@ -1233,9 +1233,9 @@ class _TabsContainer(wx.Panel):
|
||||
img = img.AdjustChannels(1.2, 1.2, 1.2, 0.7)
|
||||
bmp = wx.Bitmap(img)
|
||||
|
||||
mdc.DrawBitmap(bmp, posx, posy, True)
|
||||
mdc.DrawBitmap(bmp, round(posx), round(posy), True)
|
||||
|
||||
mdc.SetDeviceOrigin(posx, posy)
|
||||
mdc.SetDeviceOrigin(round(posx), round(posy))
|
||||
selected.DrawText(mdc)
|
||||
mdc.SetDeviceOrigin(0, 0)
|
||||
|
||||
@@ -1501,7 +1501,7 @@ class PFNotebookPagePreview(wx.Frame):
|
||||
|
||||
def OnWindowPaint(self, event):
|
||||
rect = self.GetRect()
|
||||
canvas = wx.Bitmap(rect.width, rect.height)
|
||||
canvas = wx.Bitmap(round(rect.width), round(rect.height))
|
||||
mdc = wx.BufferedPaintDC(self)
|
||||
mdc.SelectObject(canvas)
|
||||
color = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
@@ -1514,7 +1514,7 @@ class PFNotebookPagePreview(wx.Frame):
|
||||
x, y = mdc.GetTextExtent(self.title)
|
||||
|
||||
mdc.SetBrush(wx.Brush(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT)))
|
||||
mdc.DrawRectangle(0, 0, rect.width, 16)
|
||||
mdc.DrawRectangle(0, 0, round(rect.width), 16)
|
||||
|
||||
mdc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW))
|
||||
|
||||
@@ -1523,4 +1523,4 @@ class PFNotebookPagePreview(wx.Frame):
|
||||
mdc.SetPen(wx.Pen("#000000", width=1))
|
||||
mdc.SetBrush(wx.TRANSPARENT_BRUSH)
|
||||
|
||||
mdc.DrawRectangle(0, 16, rect.width, rect.height - 16)
|
||||
mdc.DrawRectangle(0, 16, round(rect.width), round(rect.height - 16))
|
||||
|
||||
@@ -42,7 +42,7 @@ class DmgPatternNameValidator(BaseValidator):
|
||||
return DmgPatternNameValidator()
|
||||
|
||||
def Validate(self, win):
|
||||
entityEditor = win.parent
|
||||
entityEditor = win.Parent.parent
|
||||
textCtrl = self.GetWindow()
|
||||
text = textCtrl.GetValue().strip()
|
||||
|
||||
|
||||
@@ -257,7 +257,7 @@ class PyGauge(wx.Window):
|
||||
else:
|
||||
w = rect.width * (float(value) / 100)
|
||||
r = copy.copy(rect)
|
||||
r.width = w
|
||||
r.width = round(w)
|
||||
dc.DrawRectangle(r)
|
||||
else:
|
||||
# if bar color is not set, then we use pre-defined transitions
|
||||
@@ -269,7 +269,7 @@ class PyGauge(wx.Window):
|
||||
else:
|
||||
w = rect.width * (float(value) / 100)
|
||||
r = copy.copy(rect)
|
||||
r.width = w
|
||||
r.width = round(w)
|
||||
|
||||
# determine transition range number and calculate xv (which is the
|
||||
# progress between the two transition ranges)
|
||||
@@ -317,7 +317,7 @@ class PyGauge(wx.Window):
|
||||
gradient_color
|
||||
)
|
||||
if gradient_bitmap is not None:
|
||||
dc.DrawBitmap(gradient_bitmap, r.left, r.top)
|
||||
dc.DrawBitmap(gradient_bitmap, round(r.left), round(r.top))
|
||||
|
||||
# font stuff begins here
|
||||
dc.SetFont(self.font)
|
||||
|
||||
@@ -39,7 +39,7 @@ class ImplantTextValidor(BaseValidator):
|
||||
return ImplantTextValidor()
|
||||
|
||||
def Validate(self, win):
|
||||
entityEditor = win.parent
|
||||
entityEditor = win.Parent.parent
|
||||
textCtrl = self.GetWindow()
|
||||
text = textCtrl.GetValue().strip()
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ class TargetProfileNameValidator(BaseValidator):
|
||||
return TargetProfileNameValidator()
|
||||
|
||||
def Validate(self, win):
|
||||
entityEditor = win.parent
|
||||
entityEditor = win.Parent.parent
|
||||
textCtrl = self.GetWindow()
|
||||
text = textCtrl.GetValue().strip()
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ class LoadAnimation(wx.Window):
|
||||
bh = rect.height
|
||||
y = 0
|
||||
|
||||
dc.DrawRectangle(x, y, barWidth, bh)
|
||||
dc.DrawRectangle(round(x), round(y), round(barWidth), round(bh))
|
||||
x += barWidth
|
||||
|
||||
textColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT)
|
||||
|
||||
@@ -12,7 +12,7 @@ def Brighten(color, factor):
|
||||
b += (255 - b) * factor
|
||||
g += (255 - g) * factor
|
||||
|
||||
return wx.Colour(r, g, b, a)
|
||||
return wx.Colour(round(r), round(g), round(b), round(a))
|
||||
|
||||
|
||||
def Darken(color, factor):
|
||||
@@ -30,7 +30,7 @@ def Darken(color, factor):
|
||||
b = min(max(b, 0), 255)
|
||||
g = min(max(g, 0), 255)
|
||||
|
||||
return wx.Colour(r, g, b, a)
|
||||
return wx.Colour(round(r), round(g), round(b), round(a))
|
||||
|
||||
|
||||
def _getBrightness(color):
|
||||
@@ -70,4 +70,4 @@ def CalculateTransition(s_color, e_color, delta):
|
||||
tG = sG + (eG - sG) * delta
|
||||
tB = sB + (eB - sB) * delta
|
||||
|
||||
return wx.Colour(tR, tG, tB, (sA + eA) / 2)
|
||||
return wx.Colour(round(tR), round(tG), round(tB), round((sA + eA) / 2))
|
||||
|
||||
@@ -21,7 +21,7 @@ def RenderGradientBar(windowColor, width, height, sFactor, eFactor, mFactor=None
|
||||
|
||||
|
||||
def DrawFilledBitmap(width, height, color):
|
||||
canvas = wx.Bitmap(width, height)
|
||||
canvas = wx.Bitmap(round(width), round(height))
|
||||
|
||||
mdc = wx.MemoryDC()
|
||||
mdc.SelectObject(canvas)
|
||||
@@ -37,20 +37,20 @@ def DrawFilledBitmap(width, height, color):
|
||||
def DrawGradientBar(width, height, gStart, gEnd, gMid=None, fillRatio=4):
|
||||
if width == 0 or height == 0:
|
||||
return None
|
||||
canvas = wx.Bitmap(width, height)
|
||||
canvas = wx.Bitmap(round(width), round(height))
|
||||
|
||||
mdc = wx.MemoryDC()
|
||||
mdc.SelectObject(canvas)
|
||||
|
||||
r = wx.Rect(0, 0, width, height)
|
||||
r.SetHeight(height / fillRatio)
|
||||
r.SetHeight(round(height / fillRatio))
|
||||
|
||||
if gMid is None:
|
||||
gMid = gStart
|
||||
|
||||
mdc.GradientFillLinear(r, gStart, gMid, wx.SOUTH)
|
||||
r.SetTop(r.GetHeight())
|
||||
r.SetHeight(height * (fillRatio - 1) / fillRatio + (1 if height % fillRatio != 0 else 0))
|
||||
r.SetHeight(round(height * (fillRatio - 1) / fillRatio + (1 if height % fillRatio != 0 else 0)))
|
||||
|
||||
mdc.GradientFillLinear(r, gMid, gEnd, wx.SOUTH)
|
||||
|
||||
|
||||
@@ -244,7 +244,7 @@ class exportHtmlThread(threading.Thread):
|
||||
# Market group header
|
||||
HTML += (
|
||||
' <li data-role="collapsible" data-iconpos="right" data-shadow="false" data-corners="false">\n'
|
||||
' <h2>' + group.groupName + ' <span class="ui-li-count">' + str(groupFits) + '</span></h2>\n'
|
||||
' <h2>' + group.name + ' <span class="ui-li-count">' + str(groupFits) + '</span></h2>\n'
|
||||
' <ul data-role="listview" data-shadow="false" data-inset="true" data-corners="false">\n' +
|
||||
HTMLgroup +
|
||||
' </ul>\n'
|
||||
|
||||
BIN
imgs/icons/25235@1x.png
Normal file
|
After Width: | Height: | Size: 780 B |
BIN
imgs/icons/25235@2x.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
imgs/icons/25236@1x.png
Normal file
|
After Width: | Height: | Size: 829 B |
BIN
imgs/icons/25236@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/25237@1x.png
Normal file
|
After Width: | Height: | Size: 821 B |
BIN
imgs/icons/25237@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25238@1x.png
Normal file
|
After Width: | Height: | Size: 824 B |
BIN
imgs/icons/25238@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25245@1x.png
Normal file
|
After Width: | Height: | Size: 783 B |
BIN
imgs/icons/25245@2x.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
imgs/icons/25246@1x.png
Normal file
|
After Width: | Height: | Size: 814 B |
BIN
imgs/icons/25246@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/25247@1x.png
Normal file
|
After Width: | Height: | Size: 825 B |
BIN
imgs/icons/25247@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25248@1x.png
Normal file
|
After Width: | Height: | Size: 821 B |
BIN
imgs/icons/25248@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 7.2 KiB |
BIN
imgs/renders/26515@1x.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
imgs/renders/26515@2x.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
imgs/renders/26516@1x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/renders/26516@2x.png
Normal file
|
After Width: | Height: | Size: 7.6 KiB |
1419
locale/lang.pot
@@ -92,7 +92,8 @@ exe = EXE(
|
||||
upx=upx,
|
||||
icon= icon,
|
||||
# version='win-version-info.txt',
|
||||
console=False
|
||||
console=False,
|
||||
contents_directory='app',
|
||||
)
|
||||
|
||||
coll = COLLECT(
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
wxPython == 4.0.6
|
||||
logbook >= 1.0.0
|
||||
numpy == 1.19.2
|
||||
matplotlib == 3.2.2
|
||||
python-dateutil
|
||||
requests == 2.28.1
|
||||
sqlalchemy == 1.3.23
|
||||
cryptography >= 2.3
|
||||
markdown2 >= 2.3.5
|
||||
packaging >= 16.8
|
||||
roman >= 2.0.0
|
||||
beautifulsoup4 >= 4.6.0
|
||||
pyyaml >= 5.1
|
||||
python-jose==3.0.1
|
||||
requests-cache==0.8.1
|
||||
wxPython==4.2.1
|
||||
logbook==1.7.0.post0
|
||||
numpy==1.26.2
|
||||
matplotlib==3.8.2
|
||||
python-dateutil==2.8.2
|
||||
requests==2.31.0
|
||||
sqlalchemy==1.4.50
|
||||
cryptography==41.0.7
|
||||
markdown2==2.4.11
|
||||
packaging==23.2
|
||||
roman==4.1
|
||||
beautifulsoup4==4.12.2
|
||||
pyyaml==6.0.1
|
||||
python-jose==3.3.0
|
||||
requests-cache==1.1.1
|
||||
|
||||
@@ -19,8 +19,8 @@ params = {
|
||||
resp = requests.get('https://api.crowdin.com/api/project/pyfa/status', params=params)
|
||||
data = resp.json()
|
||||
|
||||
if resp.status_code is not 200:
|
||||
print("Error fetching Crowdin progress. Error: {}; {}".format(data['error']['message']))
|
||||
if resp.status_code != 200:
|
||||
print("Error fetching Crowdin progress. Error: {}".format(data['error']['message']))
|
||||
sys.exit()
|
||||
|
||||
for x in data:
|
||||
@@ -36,4 +36,4 @@ data = {x['canonical_name']: x for x in data}
|
||||
with open("locale/progress.json", 'w') as file:
|
||||
file.seek(0)
|
||||
file.truncate()
|
||||
json.dump(data, file)
|
||||
json.dump(data, file)
|
||||
|
||||
@@ -4,10 +4,8 @@ echo "${PYFA_VERSION}"
|
||||
echo "Pyfa version (YAML):"
|
||||
cat version.yml
|
||||
echo "Building distributive..."
|
||||
python3 -m PyInstaller -y --clean --windowed dist_assets/mac/pyfa.spec
|
||||
python3 -m PyInstaller -y --clean dist_assets/mac/pyfa.spec
|
||||
echo "Compressing distributive..."
|
||||
cd dist
|
||||
/usr/libexec/PlistBuddy -c "Add :CFBundleVersion string ${PYFA_VERSION}" "pyfa.app/Contents/Info.plist" # Add missing
|
||||
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${PYFA_VERSION}" "pyfa.app/Contents/Info.plist" # Modify existing
|
||||
zip -r "pyfa-$PYFA_VERSION-mac.zip" pyfa.app
|
||||
md5 -r "pyfa-$PYFA_VERSION-mac.zip"
|
||||
|
||||
@@ -3,9 +3,7 @@ echo "Python version:"
|
||||
python3 --version
|
||||
echo "Upgrading pip..."
|
||||
python3 -m pip install --upgrade pip
|
||||
echo "Installing pathlib2 (wxpython issue workaround)..."
|
||||
python3 -m pip install pathlib2
|
||||
echo "Installing app requirements..."
|
||||
python3 -m pip install -r requirements.txt
|
||||
echo "Installing packaging tools..."
|
||||
python3 -m pip install PyInstaller==3.6
|
||||
python3 -m pip install PyInstaller==6.2.0
|
||||
|
||||
@@ -88,7 +88,7 @@ class Fit:
|
||||
"enableGaugeAnimation": True,
|
||||
"openFitInNew": False,
|
||||
"priceSystem": "Jita",
|
||||
"priceSource": "evemarketer",
|
||||
"priceSource": "fuzzwork market",
|
||||
"showShipBrowserTooltip": True,
|
||||
"marketSearchDelay": 250,
|
||||
"ammoChangeAll": False,
|
||||
|
||||
@@ -1 +1 @@
|
||||
__all__ = ['evemarketer', 'evemarketdata', 'fuzzwork', 'cevemarket']
|
||||
__all__ = ['evetycoon', 'evemarketdata', 'fuzzwork', 'cevemarket']
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
# =============================================================================
|
||||
# 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/>.
|
||||
# =============================================================================
|
||||
|
||||
|
||||
from xml.dom import minidom
|
||||
|
||||
from logbook import Logger
|
||||
|
||||
from eos.saveddata.price import PriceStatus
|
||||
from service.network import Network
|
||||
from service.price import Price
|
||||
|
||||
pyfalog = Logger(__name__)
|
||||
|
||||
|
||||
class EveMarketer:
|
||||
|
||||
name = 'evemarketer'
|
||||
group = 'tranquility'
|
||||
|
||||
def __init__(self, priceMap, system, fetchTimeout):
|
||||
# Try selected system first
|
||||
self.fetchPrices(priceMap, max(2 * fetchTimeout / 3, 2), system)
|
||||
# If price was not available - try globally
|
||||
if priceMap:
|
||||
self.fetchPrices(priceMap, max(fetchTimeout / 3, 2))
|
||||
|
||||
@staticmethod
|
||||
def fetchPrices(priceMap, fetchTimeout, system=None):
|
||||
params = {'typeid': {typeID for typeID in priceMap}}
|
||||
if system is not None:
|
||||
params['usesystem'] = system
|
||||
baseurl = 'https://api.evemarketer.com/ec/marketstat'
|
||||
network = Network.getInstance()
|
||||
data = network.get(url=baseurl, type=network.PRICES, params=params, timeout=fetchTimeout)
|
||||
xml = minidom.parseString(data.text)
|
||||
types = xml.getElementsByTagName('marketstat').item(0).getElementsByTagName('type')
|
||||
# Cycle through all types we've got from request
|
||||
for type_ in types:
|
||||
# Get data out of each typeID details tree
|
||||
typeID = int(type_.getAttribute('id'))
|
||||
sell = type_.getElementsByTagName('sell').item(0)
|
||||
# If price data wasn't there, skip the item
|
||||
try:
|
||||
percprice = float(sell.getElementsByTagName('percentile').item(0).firstChild.data)
|
||||
except (TypeError, ValueError):
|
||||
pyfalog.warning('Failed to get price for: {0}', type_)
|
||||
continue
|
||||
|
||||
# Price is 0 if evemarketer has info on this item, but it is not available
|
||||
# for current scope limit. If we provided scope limit - make sure to skip
|
||||
# such items to check globally, and do not skip if requested globally
|
||||
if percprice == 0 and system is not None:
|
||||
continue
|
||||
priceMap[typeID].update(PriceStatus.fetchSuccess, percprice)
|
||||
del priceMap[typeID]
|
||||
|
||||
|
||||
Price.register(EveMarketer)
|
||||
65
service/marketSources/evetycoon.py
Normal file
@@ -0,0 +1,65 @@
|
||||
# =============================================================================
|
||||
# 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/>.
|
||||
# =============================================================================
|
||||
|
||||
from logbook import Logger
|
||||
|
||||
from eos.saveddata.price import PriceStatus
|
||||
from service.network import Network
|
||||
from service.price import Price
|
||||
|
||||
pyfalog = Logger(__name__)
|
||||
|
||||
locations = {
|
||||
30000142: (10000002, 60003760), # Jita 4-4 CNAP
|
||||
30002187: (10000043, 60008494), # Amarr VIII
|
||||
30002659: (10000032, 60011866), # Dodixie
|
||||
30002510: (10000030, 60004588), # Rens
|
||||
30002053: (10000042, 60005686)} # Hek
|
||||
|
||||
|
||||
class EveTycoon:
|
||||
|
||||
name = 'evetycoon'
|
||||
group = 'tranquility'
|
||||
|
||||
def __init__(self, priceMap, system, fetchTimeout):
|
||||
# Try selected system first
|
||||
self.fetchPrices(priceMap, max(2 * fetchTimeout / 3, 2), system)
|
||||
|
||||
@staticmethod
|
||||
def fetchPrices(priceMap, fetchTimeout, system=None):
|
||||
# Default to jita when system is not found
|
||||
regionID, stationID = locations.get(system, locations[30000142])
|
||||
baseurl = 'https://evetycoon.com/api/v1/market/stats'
|
||||
network = Network.getInstance()
|
||||
# Cycle through all types we've got from request
|
||||
for typeID in tuple(priceMap):
|
||||
url = f'{baseurl}/{regionID}/{typeID}'
|
||||
resp = network.get(url=url, params={'locationId': stationID}, type=network.PRICES, timeout=fetchTimeout)
|
||||
if resp.status_code != 200:
|
||||
continue
|
||||
price = resp.json()['sellAvgFivePercent']
|
||||
# Price is 0 - no data
|
||||
if price == 0:
|
||||
continue
|
||||
priceMap[typeID].update(PriceStatus.fetchSuccess, price)
|
||||
del priceMap[typeID]
|
||||
|
||||
|
||||
Price.register(EveTycoon)
|
||||
@@ -276,4 +276,4 @@ class PriceWorkerThread(threading.Thread):
|
||||
|
||||
|
||||
# Import market sources only to initialize price source modules, they register on their own
|
||||
from service.marketSources import evemarketer, evemarketdata, fuzzwork, cevemarket # noqa: E402
|
||||
from service.marketSources import evemarketdata, fuzzwork, cevemarket, evetycoon # noqa: E402
|
||||
|
||||
@@ -222,9 +222,9 @@ class NetworkSettings:
|
||||
if prefix not in proxydict:
|
||||
continue
|
||||
proxyline = proxydict[prefix]
|
||||
proto = "{0}://".format(prefix)
|
||||
if proxyline[:len(proto)] == proto:
|
||||
proxyline = proxyline[len(proto):]
|
||||
proto_pos = proxyline.find('://')
|
||||
if proto_pos != -1:
|
||||
proxyline = proxyline[proto_pos+3:]
|
||||
# sometimes proxyline contains "user:password@" section before proxy address
|
||||
# remove it if present, so later split by ":" works
|
||||
if '@' in proxyline:
|
||||
@@ -559,7 +559,7 @@ class LocaleSettings:
|
||||
with open(os.path.join(config.pyfaPath, 'locale', 'progress.json'), "r") as f:
|
||||
self.progress_data = json.load(f)
|
||||
except FileNotFoundError:
|
||||
self.progress_data = None
|
||||
self.progress_data = {}
|
||||
|
||||
@classmethod
|
||||
def getInstance(cls):
|
||||
@@ -568,14 +568,14 @@ class LocaleSettings:
|
||||
return cls._instance
|
||||
|
||||
def get_progress(self, lang):
|
||||
if self.progress_data is None:
|
||||
if not self.progress_data:
|
||||
return None
|
||||
if lang == self.defaults['locale']:
|
||||
return None
|
||||
return self.progress_data[lang]
|
||||
return self.progress_data.get(lang)
|
||||
|
||||
@classmethod
|
||||
def supported_langauges(cls):
|
||||
def supported_languages(cls):
|
||||
"""Requires the application to be initialized, otherwise wx.Translation isn't set."""
|
||||
pyfalog.info(f'using "{config.CATALOG}" to fetch languages, relatively base path "{os.getcwd()}"')
|
||||
return {x: wx.Locale.FindLanguageInfo(x) for x in wx.Translations.Get().GetAvailableTranslations(config.CATALOG)}
|
||||
@@ -590,6 +590,6 @@ class LocaleSettings:
|
||||
return val if val != self.defaults['eos_locale'] else self.settings['locale'].split("_")[0]
|
||||
|
||||
def set(self, key, value):
|
||||
if key == 'locale' and value not in self.supported_langauges():
|
||||
if key == 'locale' and value not in self.supported_languages():
|
||||
self.settings[key] = self.DEFAULT
|
||||
self.settings[key] = value
|
||||
|
||||
@@ -47291,6 +47291,53 @@
|
||||
"published": 0,
|
||||
"stackable": 0
|
||||
},
|
||||
"5469": {
|
||||
"attributeID": 5469,
|
||||
"categoryID": 52,
|
||||
"dataType": 5,
|
||||
"defaultValue": 0.0,
|
||||
"description": "Alliance Tournament Ship Overheat Bonus",
|
||||
"displayName_de": "Überhitzungsbonus",
|
||||
"displayName_en-us": "Overheat Bonus",
|
||||
"displayName_es": "Bonificación de sobrecalentamiento",
|
||||
"displayName_fr": "Bonus de surchauffe",
|
||||
"displayName_it": "Overheat Bonus",
|
||||
"displayName_ja": "Overheat Bonus",
|
||||
"displayName_ko": "과부하 보너스",
|
||||
"displayName_ru": "Повышение эффективности при перегрузке",
|
||||
"displayName_zh": "过载损伤降低",
|
||||
"displayNameID": 665013,
|
||||
"displayWhenZero": 1,
|
||||
"highIsGood": 1,
|
||||
"name": "roleBonusOverheatATHAC",
|
||||
"published": 0,
|
||||
"stackable": 1,
|
||||
"unitID": 105
|
||||
},
|
||||
"5470": {
|
||||
"attributeID": 5470,
|
||||
"categoryID": 6,
|
||||
"dataType": 0,
|
||||
"defaultValue": 0.0,
|
||||
"description": "Tracking Speed Bonus",
|
||||
"displayName_de": "Zielverfolgungsgeschwindigkeit-Bonus",
|
||||
"displayName_en-us": "Tracking Speed Bonus",
|
||||
"displayName_es": "Bonificación de velocidad de rastreo",
|
||||
"displayName_fr": "Bonus de vitesse de poursuite",
|
||||
"displayName_it": "Tracking Speed Bonus",
|
||||
"displayName_ja": "Tracking Speed Bonus",
|
||||
"displayName_ko": "트래킹 속도 보너스",
|
||||
"displayName_ru": "Влияние на скорость слежения",
|
||||
"displayName_zh": "跟踪速度加成",
|
||||
"displayNameID": 665059,
|
||||
"displayWhenZero": 0,
|
||||
"highIsGood": 1,
|
||||
"iconID": 1398,
|
||||
"name": "shipBonusTrackingATC1",
|
||||
"published": 1,
|
||||
"stackable": 1,
|
||||
"unitID": 105
|
||||
},
|
||||
"5561": {
|
||||
"attributeID": 5561,
|
||||
"categoryID": 9,
|
||||
@@ -47396,5 +47443,40 @@
|
||||
"name": "captureProximityInteractivesOnly",
|
||||
"published": 0,
|
||||
"stackable": 0
|
||||
},
|
||||
"5603": {
|
||||
"attributeID": 5603,
|
||||
"categoryID": 9,
|
||||
"dataType": 5,
|
||||
"defaultValue": 0.0,
|
||||
"description": "used for alliance tournament ships 2023, plate mass reduction",
|
||||
"displayWhenZero": 0,
|
||||
"highIsGood": 1,
|
||||
"name": "shipBonusATF3",
|
||||
"published": 0,
|
||||
"stackable": 1
|
||||
},
|
||||
"5604": {
|
||||
"attributeID": 5604,
|
||||
"categoryID": 7,
|
||||
"dataType": 0,
|
||||
"defaultValue": 0.0,
|
||||
"description": "Alliance Tournament Ship Bonus",
|
||||
"displayName_de": "Bonus für besondere Fähigkeit",
|
||||
"displayName_en-us": "Special Ability Bonus",
|
||||
"displayName_es": "Bonificación de capacidad especial",
|
||||
"displayName_fr": "Bonus d'aptitude particulière",
|
||||
"displayName_it": "Special Ability Bonus",
|
||||
"displayName_ja": "Special Ability Bonus",
|
||||
"displayName_ko": "특수 능력 보너스",
|
||||
"displayName_ru": "Усиление особого умения",
|
||||
"displayName_zh": "特殊能力加成",
|
||||
"displayNameID": 696793,
|
||||
"displayWhenZero": 0,
|
||||
"highIsGood": 1,
|
||||
"name": "shipBonusATC3",
|
||||
"published": 0,
|
||||
"stackable": 1,
|
||||
"unitID": 105
|
||||
}
|
||||
}
|
||||
@@ -94012,7 +94012,7 @@
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "charID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"func": "OwnerRequiredSkillModifier",
|
||||
"modifiedAttributeID": 117,
|
||||
"modifyingAttributeID": 747,
|
||||
"operation": 6,
|
||||
@@ -94125,6 +94125,98 @@
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"11765": {
|
||||
"description_de": "Automatisch erzeugter Effekt",
|
||||
"description_en-us": "Automatically generated effect",
|
||||
"description_es": "Efecto generado automáticamente.",
|
||||
"description_fr": "Effet généré automatiquement",
|
||||
"description_it": "Automatically generated effect",
|
||||
"description_ja": "Automatically generated effect",
|
||||
"description_ko": "자동 생성 효과",
|
||||
"description_ru": "Автоматически созданный эффект",
|
||||
"description_zh": "自动生成效果",
|
||||
"descriptionID": 665014,
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 11765,
|
||||
"effectName": "shipMWDHeatBonusATShip",
|
||||
"electronicChance": 0,
|
||||
"guid": "",
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"modifiedAttributeID": 1223,
|
||||
"modifyingAttributeID": 5469,
|
||||
"operation": 6,
|
||||
"skillTypeID": 3454
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeAttributeID": 54,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"11766": {
|
||||
"description_de": "Automatisch erzeugter Effekt",
|
||||
"description_en-us": "Automatically generated effect",
|
||||
"description_es": "Efecto generado automáticamente.",
|
||||
"description_fr": "Effet généré automatiquement",
|
||||
"description_it": "Automatically generated effect",
|
||||
"description_ja": "Automatically generated effect",
|
||||
"description_ko": "자동 생성 효과",
|
||||
"description_ru": "Автоматически созданный эффект",
|
||||
"description_zh": "自动生成效果",
|
||||
"descriptionID": 665015,
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 11766,
|
||||
"effectName": "shipABHeatBonusATShip",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"modifiedAttributeID": 1223,
|
||||
"modifyingAttributeID": 5469,
|
||||
"operation": 6,
|
||||
"skillTypeID": 3450
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"11767": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 11767,
|
||||
"effectName": "shipBonusHybridTrackingATC3",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"modifiedAttributeID": 160,
|
||||
"modifyingAttributeID": 692,
|
||||
"operation": 6,
|
||||
"skillTypeID": 3304
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeAttributeID": 54,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"11774": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
@@ -94462,6 +94554,232 @@
|
||||
"rangeAttributeID": 54,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"11992": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 11992,
|
||||
"effectName": "shipBonusArmorPlateMassAT",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationGroupModifier",
|
||||
"groupID": 329,
|
||||
"modifiedAttributeID": 796,
|
||||
"modifyingAttributeID": 5603,
|
||||
"operation": 6
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"11993": {
|
||||
"description_de": "Automatisch erzeugter Effekt",
|
||||
"description_en-us": "Automatically generated effect",
|
||||
"description_es": "Efecto generado automáticamente.",
|
||||
"description_fr": "Effet généré automatiquement",
|
||||
"description_it": "Automatically generated effect",
|
||||
"description_ja": "Automatically generated effect",
|
||||
"description_ko": "자동 생성 효과",
|
||||
"description_ru": "Автоматически созданный эффект",
|
||||
"description_zh": "自动生成效果",
|
||||
"descriptionID": 696792,
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 11993,
|
||||
"effectName": "shipBonusRepairSystemsBonusATC3",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"modifiedAttributeID": 84,
|
||||
"modifyingAttributeID": 2014,
|
||||
"operation": 6,
|
||||
"skillTypeID": 3393
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeAttributeID": 54,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"11994": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 11994,
|
||||
"effectName": "shipBonusHybridFalloffATC3",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"modifiedAttributeID": 158,
|
||||
"modifyingAttributeID": 693,
|
||||
"operation": 6,
|
||||
"skillTypeID": 3304
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"11995": {
|
||||
"description_de": "Automatisch erzeugter Effekt",
|
||||
"description_en-us": "Automatically generated effect",
|
||||
"description_es": "Efecto generado automáticamente.",
|
||||
"description_fr": "Effet généré automatiquement",
|
||||
"description_it": "Automatically generated effect",
|
||||
"description_ja": "Automatically generated effect",
|
||||
"description_ko": "자동 생성 효과",
|
||||
"description_ru": "Автоматически созданный эффект",
|
||||
"description_zh": "自动生成效果",
|
||||
"descriptionID": 696810,
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 11995,
|
||||
"effectName": "shipBonusHeatAfterburnerATGF",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"modifiedAttributeID": 1223,
|
||||
"modifyingAttributeID": 586,
|
||||
"operation": 6,
|
||||
"skillTypeID": 3450
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeAttributeID": 54,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"11996": {
|
||||
"description_de": "Automatisch erzeugter Effekt",
|
||||
"description_en-us": "Automatically generated effect",
|
||||
"description_es": "Efecto generado automáticamente.",
|
||||
"description_fr": "Effet généré automatiquement",
|
||||
"description_it": "Automatically generated effect",
|
||||
"description_ja": "Automatically generated effect",
|
||||
"description_ko": "자동 생성 효과",
|
||||
"description_ru": "Автоматически созданный эффект",
|
||||
"description_zh": "自动生成效果",
|
||||
"descriptionID": 696813,
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 11996,
|
||||
"effectName": "shipBonusMWDHeatATGF",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"modifiedAttributeID": 1223,
|
||||
"modifyingAttributeID": 586,
|
||||
"operation": 6,
|
||||
"skillTypeID": 3454
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"11997": {
|
||||
"description_de": "Automatisch erzeugter Effekt",
|
||||
"description_en-us": "Automatically generated effect",
|
||||
"description_es": "Efecto generado automáticamente.",
|
||||
"description_fr": "Effet généré automatiquement",
|
||||
"description_it": "Automatically generated effect",
|
||||
"description_ja": "Automatically generated effect",
|
||||
"description_ko": "자동 생성 효과",
|
||||
"description_ru": "Автоматически созданный эффект",
|
||||
"description_zh": "自动生成效果",
|
||||
"descriptionID": 696932,
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 11997,
|
||||
"effectName": "shipBonusArmorRepATGF",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"modifiedAttributeID": 84,
|
||||
"modifyingAttributeID": 673,
|
||||
"operation": 6,
|
||||
"skillTypeID": 3393
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"11998": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 11998,
|
||||
"effectName": "shipBonusSmallHybridMaxRangeATF3",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"modifiedAttributeID": 54,
|
||||
"modifyingAttributeID": 675,
|
||||
"operation": 6,
|
||||
"skillTypeID": 3301
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"11999": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 11999,
|
||||
"effectName": "shipBonusSmallHybridTrackingSpeedATF3",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"modifiedAttributeID": 160,
|
||||
"modifyingAttributeID": 675,
|
||||
"operation": 6,
|
||||
"skillTypeID": 3301
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"12002": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"dischargeAttributeID": 2637,
|
||||
|
||||
@@ -12112,5 +12112,8 @@
|
||||
},
|
||||
"25849": {
|
||||
"iconFile": "res:/ui/texture/icons/84_64_15.png"
|
||||
},
|
||||
"25862": {
|
||||
"iconFile": "res:/ui/texture/icons/26_64_5.png"
|
||||
}
|
||||
}
|
||||
@@ -44881,30 +44881,30 @@
|
||||
"3567": {
|
||||
"hasTypes": 1,
|
||||
"iconID": 21420,
|
||||
"name_de": "Pirate Faction",
|
||||
"name_de": "Piratenfraktion",
|
||||
"name_en-us": "Pirate Faction",
|
||||
"name_es": "Pirate Faction",
|
||||
"name_fr": "Pirate Faction",
|
||||
"name_es": "Facción pirata",
|
||||
"name_fr": "Faction pirate",
|
||||
"name_it": "Pirate Faction",
|
||||
"name_ja": "Pirate Faction",
|
||||
"name_ko": "Pirate Faction",
|
||||
"name_ru": "Pirate Faction",
|
||||
"name_zh": "Pirate Faction",
|
||||
"name_ja": "海賊勢力",
|
||||
"name_ko": "해적 팩션",
|
||||
"name_ru": "Пиратская организация",
|
||||
"name_zh": "海盗势力",
|
||||
"nameID": 697888,
|
||||
"parentGroupID": 2100
|
||||
},
|
||||
"3568": {
|
||||
"hasTypes": 1,
|
||||
"iconID": 21420,
|
||||
"name_de": "Pirate Faction",
|
||||
"name_de": "Piratenfraktion",
|
||||
"name_en-us": "Pirate Faction",
|
||||
"name_es": "Pirate Faction",
|
||||
"name_fr": "Pirate Faction",
|
||||
"name_es": "Facción pirata",
|
||||
"name_fr": "Faction pirate",
|
||||
"name_it": "Pirate Faction",
|
||||
"name_ja": "Pirate Faction",
|
||||
"name_ko": "Pirate Faction",
|
||||
"name_ru": "Pirate Faction",
|
||||
"name_zh": "Pirate Faction",
|
||||
"name_ja": "海賊勢力",
|
||||
"name_ko": "해적 팩션",
|
||||
"name_ru": "Пиратская организация",
|
||||
"name_zh": "海盗势力",
|
||||
"nameID": 697889,
|
||||
"parentGroupID": 3496
|
||||
}
|
||||
|
||||
@@ -28493,6 +28493,10 @@
|
||||
"3398": 4,
|
||||
"22242": 4
|
||||
},
|
||||
"77726": {
|
||||
"3332": 5,
|
||||
"16591": 1
|
||||
},
|
||||
"77738": {
|
||||
"11433": 4,
|
||||
"20533": 4,
|
||||
@@ -28625,6 +28629,10 @@
|
||||
"33097": 2,
|
||||
"33098": 2
|
||||
},
|
||||
"78414": {
|
||||
"3328": 5,
|
||||
"12095": 1
|
||||
},
|
||||
"78576": {
|
||||
"3344": 1,
|
||||
"3345": 1,
|
||||
@@ -28633,6 +28641,93 @@
|
||||
"78621": {
|
||||
"3318": 4
|
||||
},
|
||||
"78631": {
|
||||
"3405": 1
|
||||
},
|
||||
"78633": {
|
||||
"3405": 1
|
||||
},
|
||||
"78634": {
|
||||
"3405": 1
|
||||
},
|
||||
"78636": {
|
||||
"3405": 1
|
||||
},
|
||||
"78637": {
|
||||
"3405": 1
|
||||
},
|
||||
"78638": {
|
||||
"3405": 1
|
||||
},
|
||||
"78639": {
|
||||
"3405": 1
|
||||
},
|
||||
"78640": {
|
||||
"3405": 1
|
||||
},
|
||||
"78641": {
|
||||
"3405": 1
|
||||
},
|
||||
"78642": {
|
||||
"3405": 1
|
||||
},
|
||||
"78649": {
|
||||
"3405": 1
|
||||
},
|
||||
"78650": {
|
||||
"3405": 1
|
||||
},
|
||||
"78652": {
|
||||
"3405": 1
|
||||
},
|
||||
"78653": {
|
||||
"3405": 1
|
||||
},
|
||||
"78655": {
|
||||
"3405": 1
|
||||
},
|
||||
"78656": {
|
||||
"3405": 1
|
||||
},
|
||||
"78657": {
|
||||
"3405": 1
|
||||
},
|
||||
"78659": {
|
||||
"3405": 1
|
||||
},
|
||||
"78660": {
|
||||
"3405": 1
|
||||
},
|
||||
"78661": {
|
||||
"3405": 1
|
||||
},
|
||||
"78663": {
|
||||
"3405": 1
|
||||
},
|
||||
"78664": {
|
||||
"3405": 1
|
||||
},
|
||||
"78665": {
|
||||
"3405": 1
|
||||
},
|
||||
"78666": {
|
||||
"3405": 1
|
||||
},
|
||||
"78667": {
|
||||
"3405": 1
|
||||
},
|
||||
"78668": {
|
||||
"3402": 1
|
||||
},
|
||||
"78669": {
|
||||
"3402": 1
|
||||
},
|
||||
"78670": {
|
||||
"3402": 1
|
||||
},
|
||||
"78676": {
|
||||
"3405": 1
|
||||
},
|
||||
"78677": {
|
||||
"22578": 1
|
||||
},
|
||||
|
||||
@@ -156198,6 +156198,10 @@
|
||||
{
|
||||
"attributeID": 622,
|
||||
"value": 5000000.0
|
||||
},
|
||||
{
|
||||
"attributeID": 854,
|
||||
"value": 1.0
|
||||
}
|
||||
],
|
||||
"dogmaEffects": []
|
||||
@@ -367378,6 +367382,10 @@
|
||||
{
|
||||
"attributeID": 622,
|
||||
"value": 5000000.0
|
||||
},
|
||||
{
|
||||
"attributeID": 854,
|
||||
"value": 1.0
|
||||
}
|
||||
],
|
||||
"dogmaEffects": []
|
||||
@@ -817048,6 +817056,10 @@
|
||||
{
|
||||
"attributeID": 622,
|
||||
"value": 5000000.0
|
||||
},
|
||||
{
|
||||
"attributeID": 854,
|
||||
"value": 1.0
|
||||
}
|
||||
],
|
||||
"dogmaEffects": []
|
||||
|
||||
@@ -89352,6 +89352,10 @@
|
||||
{
|
||||
"attributeID": 622,
|
||||
"value": 5000000.0
|
||||
},
|
||||
{
|
||||
"attributeID": 854,
|
||||
"value": 1.0
|
||||
}
|
||||
],
|
||||
"dogmaEffects": []
|
||||
@@ -222377,6 +222381,10 @@
|
||||
{
|
||||
"attributeID": 622,
|
||||
"value": 5000000.0
|
||||
},
|
||||
{
|
||||
"attributeID": 854,
|
||||
"value": 1.0
|
||||
}
|
||||
],
|
||||
"dogmaEffects": []
|
||||
@@ -489297,6 +489305,10 @@
|
||||
{
|
||||
"attributeID": 622,
|
||||
"value": 5000000.0
|
||||
},
|
||||
{
|
||||
"attributeID": 854,
|
||||
"value": 1.0
|
||||
}
|
||||
],
|
||||
"dogmaEffects": []
|
||||
@@ -849434,6 +849446,10 @@
|
||||
{
|
||||
"attributeID": 622,
|
||||
"value": 5000000.0
|
||||
},
|
||||
{
|
||||
"attributeID": 854,
|
||||
"value": 1.0
|
||||
}
|
||||
],
|
||||
"dogmaEffects": []
|
||||
@@ -968633,6 +968649,10 @@
|
||||
{
|
||||
"attributeID": 622,
|
||||
"value": 5000000.0
|
||||
},
|
||||
{
|
||||
"attributeID": 854,
|
||||
"value": 1.0
|
||||
}
|
||||
],
|
||||
"dogmaEffects": []
|
||||
|
||||
@@ -84724,6 +84724,7 @@
|
||||
"descriptionID": 94305,
|
||||
"graphicID": 2341,
|
||||
"groupID": 366,
|
||||
"isDynamicType": 0,
|
||||
"mass": 100000.0,
|
||||
"portionSize": 1,
|
||||
"published": 0,
|
||||
@@ -156652,6 +156653,7 @@
|
||||
"descriptionID": 83536,
|
||||
"graphicID": 2341,
|
||||
"groupID": 366,
|
||||
"isDynamicType": 0,
|
||||
"mass": 100000.0,
|
||||
"portionSize": 1,
|
||||
"published": 0,
|
||||
@@ -273347,6 +273349,7 @@
|
||||
"descriptionID": 83537,
|
||||
"graphicID": 2341,
|
||||
"groupID": 366,
|
||||
"isDynamicType": 0,
|
||||
"mass": 100000.0,
|
||||
"portionSize": 1,
|
||||
"published": 0,
|
||||
|
||||
@@ -87841,6 +87841,7 @@
|
||||
"descriptionID": 83539,
|
||||
"graphicID": 2341,
|
||||
"groupID": 366,
|
||||
"isDynamicType": 0,
|
||||
"mass": 100000.0,
|
||||
"portionSize": 1,
|
||||
"published": 0,
|
||||
@@ -167146,6 +167147,7 @@
|
||||
"descriptionID": 82631,
|
||||
"graphicID": 1217,
|
||||
"groupID": 366,
|
||||
"isDynamicType": 0,
|
||||
"mass": 0.0,
|
||||
"portionSize": 1,
|
||||
"published": 0,
|
||||
|
||||
@@ -32280,6 +32280,7 @@
|
||||
"descriptionID": 505996,
|
||||
"graphicID": 3468,
|
||||
"groupID": 366,
|
||||
"isDynamicType": 0,
|
||||
"mass": 100000.0,
|
||||
"portionSize": 1,
|
||||
"published": 0,
|
||||
@@ -61413,17 +61414,18 @@
|
||||
"basePrice": 0.0,
|
||||
"capacity": 0.0,
|
||||
"description_de": "Von Heaven kommend folgen die Kommandeure von Domination einem geheimen Plan, der so dunkel und böse ist wie ihr Ruf. \n\n\n\nRSS-Geheimdienstmeldungen deuten darauf hin, dass die Ingenieure der Salvation Angel großen Nutzen aus der Zusammenarbeit mit der Serpentis Corporation ziehen konnten. Kombiniertes Wissen aus dem Nachbau dem Titan FNS Molyneux und den leichter verfügbaren Titan-Blaupausen der Promethean hat es dem Angel Cartel ermöglicht, ihre eigene tödliche Variante der Ragnarok zu entwickeln.\n\n\n\nBedrohungsstufe: \"Wir werden ein größeres Boot brauchen.\"",
|
||||
"description_en-us": "Scuttling from Heaven the Domination Commanders pursue a secret agenda as dark and sinister as their reputation. \r\n\r\nRSS intelligence indicate that the Salvation Angel engineers have been benefiting greatly from their partnership with the Serpentis Corporation. Combining technology reverse engineered from the titanic FNS Molyneux with more readily available Promethean titan blueprints has allowed the Angel Cartel to develop their own deadly variation of the Ragnarok.\r\n\r\nThreat level: \"We're going to need a bigger ship\"",
|
||||
"description_es": "Los planes de los comandantes de los Ángeles Dominantes siempre son un misterio, pero tan oscuros y siniestros como la reputación que los precede. \n\n\n\nLa información de los SSR apunta a que los ingenieros de los Ángeles de la Salvación se han beneficiado considerablemente de su colaboración con la Corporación Serpentis. La combinación de la tecnología copiada del titán FNS Molyneux y los planos del titán Promethean, más fáciles de conseguir, ha permitido que el Cártel de los Ángeles desarrolle su propia variación letal de la Ragnarok.\n\n\n\nNivel de amenaza: «Vamos a necesitar una nave más grande».",
|
||||
"description_en-us": "Reaching out from Heaven Domination warlords pursue a secret agenda as dark and sinister as their reputation. \r\n\r\nDominations fleets once used heavily-modified <i>Ragnarok</i>-class vessels using technology based on the stolen Promethean \"FNS Molyneux\" and sourced by Salvation Angel engineers from their Serpentis Corporation allies. Since the Angel Cartel gained greater access to remnants of Jove technology through their alliance with the Deathless Circle, their long-awaited <i>Azariel</i>-class Titan has been completed and has replaced the older supercapitals among the ranks of the highest Domination fleet commanders.\r\n\r\n<b>Threat level: \"We're going to need a bigger ship\"</b>\r\n\r\n<i>Fleeing the wrath of the unholy legions we chanced upon the ruins of Heaven and knew that we had found our home among the cursed stars. We took our rest by crumbling monuments to the ancient truths and repaired our arms in the broken halls of a science divine. When once again we took up the fight it was with the power and wisdom of the lords of this lost realm at our backs.\r\n\r\nHere in Utopia was forged the compact of the book and our might. Our law and no other shall guide and command us, as only the law of the fallen guided those who came before us. With the speed of Dramiel shall we strike. With the strength of Machariel shall we rule. With the power of Azariel shall we gather the lost to us.</i>\r\n\r\n– excerpts from \"The Secret Doctrine of the Fallen Angels\"",
|
||||
"description_es": "Desde el cielo, los planes de los señores de la guerra de los Dominantes siempre son un misterio, pero tan oscuros y siniestros como la reputación que los precede. \r\n\r\nLas flotas de los Dominantes alguna vez emplearon naves de clase <i>Ragnarok</i> muy modificadas que usaban tecnología basada en el «FNS Molyneux» prometeico robado y obtenido por los ingenieros de los Ángeles de la Salvación de sus aliados de la Corporación Serpentis. Desde que el Cártel de los Ángeles obtuvo un mayor acceso a los restos de la tecnología joviana a través de su alianza con el Círculo Inmortal, su tan esperado titán de clase <i>Azariel</i> se completó y reemplazó a las naves supercapitales más antiguas entre los comandantes de la flota de Dominio de mayor rango.\r\n\r\n<b>Nivel de amenaza: «Vamos a necesitar una nave más grande».</b>\r\n\r\n<i>Tras huir de la ira de las legiones impías, nos topamos con las ruinas del cielo y supimos que habíamos encontrado nuestro hogar entre las estrellas malditas. Descansamos derrumbando monumentos erigidos a las verdades antiguas y reparamos nuestras armas en los pasillos rotos de una ciencia divina. Cuando una vez más retomamos la lucha, fue con el poder y la sabiduría de los señores de este reino perdido a nuestras espaldas.\r\n\r\nAquí en Utopia se forjó el pacto del libro y nuestro poder. Nuestra ley y ninguna otra nos guiará y ordenará, como solo la ley de los caídos guió a los que vinieron antes que nosotros. Con la velocidad de Dramiel atacaremos. Con la fuerza de Machariel gobernaremos. Con el poder de Azariel reuniremos a los perdidos.</i>\r\n\r\n— Extracto de «La doctrina secreta de los ángeles caídos»",
|
||||
"description_fr": "Retranchés dans la constellation de Heaven, les sinistres commandants Domination nourrissent leurs noirs desseins. \n\n\n\nLes services de renseignement des SSR révèlent que les ingénieurs angel profitent largement de leur partenariat avec la corporation serpentis. La combinaison des technologies extraites de la rétro-ingénierie du titanesque FNS Molyneux, jadis dérobé à la Navy fédérale par les Serpentis, et des plans de construction facilement accessibles des titans prométhéens, a permis au cartel angel de développer leur propre variante destructrice du Ragnarok.\n\n\n\nNiveau de menace : « Sortez l'artillerie lourde »",
|
||||
"description_it": "Scuttling from Heaven the Domination Commanders pursue a secret agenda as dark and sinister as their reputation. \r\n\r\nRSS intelligence indicate that the Salvation Angel engineers have been benefiting greatly from their partnership with the Serpentis Corporation. Combining technology reverse engineered from the titanic FNS Molyneux with more readily available Promethean titan blueprints has allowed the Angel Cartel to develop their own deadly variation of the Ragnarok.\r\n\r\nThreat level: \"We're going to need a bigger ship\"",
|
||||
"description_ja": "ヘブンから脱出したドミネーションの指揮官たちは、自らの評判に似つかわしい陰惨な秘密計画を目論んでいる。RSS諜報部員によると、サルベーションエンジェルのエンジニアらはサーペンティスコーポレーションと協力関係を築くことで相当な恩恵をこうむっているという。巨大なFNSモリヌーのリバースエンジニアリングによって得られた技術と、比較的容易に入手できるプロメテウス・タイタンのブループリントを組み合わせることで、エンジェルカルテルはさらに破壊力が増したラグナロクの亜種を開発することに成功した。危険度: 「大型の艦船が必要になってくる」",
|
||||
"description_ko": "도미네이션 커맨더는 헤븐 성좌를 본거지로 삼고 있는 악명높은 사악한 집단입니다. <br><br>RSS 정보부에 의하면 셀베이션 엔젤의 엔지니어들이 서펜티스 코퍼레이션과의 동업으로 많은 이득을 취하고 있다고 합니다. 엔젤 카르텔은 FNS 몰리뉴를 역설계하여 얻은 기술을 프로메테우스 타이탄 블루프린트에 적용하여 그들만의 강대한 함선 라그나로크를 개발해냈습니다. <br><br>위험도: \"더 큰 함선이 필요할 것 같습니다.\"",
|
||||
"description_it": "Reaching out from Heaven Domination warlords pursue a secret agenda as dark and sinister as their reputation. \r\n\r\nDominations fleets once used heavily-modified <i>Ragnarok</i>-class vessels using technology based on the stolen Promethean \"FNS Molyneux\" and sourced by Salvation Angel engineers from their Serpentis Corporation allies. Since the Angel Cartel gained greater access to remnants of Jove technology through their alliance with the Deathless Circle, their long-awaited <i>Azariel</i>-class Titan has been completed and has replaced the older supercapitals among the ranks of the highest Domination fleet commanders.\r\n\r\n<b>Threat level: \"We're going to need a bigger ship\"</b>\r\n\r\n<i>Fleeing the wrath of the unholy legions we chanced upon the ruins of Heaven and knew that we had found our home among the cursed stars. We took our rest by crumbling monuments to the ancient truths and repaired our arms in the broken halls of a science divine. When once again we took up the fight it was with the power and wisdom of the lords of this lost realm at our backs.\r\n\r\nHere in Utopia was forged the compact of the book and our might. Our law and no other shall guide and command us, as only the law of the fallen guided those who came before us. With the speed of Dramiel shall we strike. With the strength of Machariel shall we rule. With the power of Azariel shall we gather the lost to us.</i>\r\n\r\n– excerpts from \"The Secret Doctrine of the Fallen Angels\"",
|
||||
"description_ja": "ヘブンでドミネーションズを率いる将軍が、評判に違わぬ邪悪な企みを密かに遂行しようと呼び掛けている。 \r\n\r\nドミネーションズのフリートは、かつては大幅に改造した<i>ラグナロク</i>級艦を採用していた。この艦のベースとなった技術は、サルベーションエンジェルの技術者たちがサーペンティスコーポレーション内の協力者から手に入れた、強奪されたプロメシアン級艦『FNS モリニュー』のものだった。エンジェルカルテルはデスレス・サークルとの同盟関係を通じ、ジョビが残したテクノロジーを手に入れやすい状況にあり、待望の<i>アザリエル</i>級タイタンが完成すると、ドミネーションズのフリート司令官が使用していたスーパーキャピタル艦はアザリエルに更新された。\r\n\r\n<b>危険度:「我々にはもっと大きな船が必要となる」</b>\r\n\r\n<i>不浄なる軍団の怒りから逃れている最中、我々は偶然ヘブンの遺跡に出くわし、この呪われた星の海の中で安住の地を見つけたことを悟った。我々は古代の真理を今に伝える朽ちかけた遺跡のそばで休息を取り、科学に仕える聖職者たちの崩壊したホールで武器を修理した。そして闘争を再開した時、この滅びし場所を治めていた者たちの力と英知が我々のものとなっていた。\r\n\r\nここユートピアで啓典は書かれ、我々の力は培われた。以前この場所を訪れた滅びし者が自らの法にのみ従っていたように、我々もまた自らの法にのみ従おう。我々はドラミエルの速さで襲いかかり、マカリエルの強靭さで支配し、そしてアザリエルの力で失われしものを集めるのだ。</i>\r\n\r\n– 「堕天使の密やかなるドクトリン」より抜粋",
|
||||
"description_ko": "악명 높은 도미네이션 워로드가 본거지인 헤븐 지역으로부터 진출해 어둡고 소름 끼치는 교리를 실천하고 있습니다.<br><br>과거 도미네이션 함대는 특수하게 개조된 라그나로크급 함선을 운용했습니다. 개조에 사용된 기술력은 서펜티스가 탈취한 프로메테우스 'FNS 몰리뉴'로부터 확보한 것으로, 엔젤 카르텔은 서펜티스의 동맹 세력이었기에 셀베이션 엔젤을 파견해 몰리뉴의 기술력을 추출할 수 있었습니다. 그러다 이후에 전환점이 찾아왔는데, 데스리스 서클과 동맹을 맺게 되면서 고대 조브 기술을 심층적으로 연구할 수 있게 된 것이었습니다. 엔젤 카르텔은 곧바로 오랜 염원을 이루는 일에 착수했습니다. 각고의 노력은 결실을 보았고, 마침내 </i>아자리엘<i> 타이탄이 완성되었습니다. 도미네이션의 지휘관급이 사용하던 기존의 슈퍼캐피탈급 함선은 곧바로 아자리엘로 대체되었습니다.<br><br><b>위험도: \"더 큰 함선이 필요할 것 같습니다.\"</b><br><br><i>우리는 사악한 군세의 분노를 피해 달아나 천국의 폐허에 도달했다. 저주받은 우주에서 우리가 쉴 수 있는 유일한 안식처는 그곳뿐이었다. 우리는 진실이 잠든 천국의 유적을 하나하나 파헤치며 평안을 찾았고, 신성한 과학의 옛 전당에서 무기를 다시 정비했다. 고대의 지배자들이 남긴 힘과 지혜를 남김없이 습득한 우리는 마침내 다시 일어나 싸웠다.<br><br>이곳 유토피아에서 우리는 우리의 경전을 완성하고 힘을 길렀다. 우리보다 앞선 이들을 이끌었던 것은 오로지 앞선 이들의 법이었듯, 우리를 이끄는 것은 오로지 우리의 법뿐이다. 드라미엘의 신속함으로 우리의 적을 몰아치리라. 마케리엘의 강건함으로 우리의 지배를 굳건히 하리라. 그리고, 아자리엘의 압도적인 힘으로 우리가 잃어버린 모든 것들을 되찾으리라.</i><br><br>- '타락한 천사의 비전 강령'에서 발췌",
|
||||
"description_ru": "Базируясь в секторе Хэвен, командиры «Господств» реализуют свои тайные планы, такие же зловещие и темные, как и их репутация. \n\n\n\nСогласно разведданным Службы безопасности Республики, инженеры «Ангелов-спасителей» получают огромную выгоду от партнерства с корпорацией «Серпентис». Опираясь на технологии, полученные инженерным ретроанализом гигантского FNS Molyneux, и более доступных чертежей титана «Прометей», «ангелы» смогли разработать собственную смертоносную версию «Рагнарёка».\n\n\n\n«Нам нужен корабль помощнее»",
|
||||
"description_zh": "从天堂逃出来的主天使指挥官们从事着一项和他们的名声一样黑暗邪恶的秘密计划。 \n\n\n\n共和安全局情报表明天使打捞工程师从和天蛇集团的合作中获利颇丰。从巨大的FNS莫利纽克斯级逆向工程获得了科技,又唾手可得普罗米修斯泰坦蓝图,天使联合企业终于得以研发属于他们自己的威力无比的拉格纳洛克级的衍生型泰坦。\n\n\n\n威胁等级:“我们需要一艘更大的船”",
|
||||
"description_zh": "主天使军阀们从天堂星座向外扩张,开展着一项和他们的名声一样黑暗邪恶的秘密计划。以往主天使舰队使用的是大幅改装过<i>拉格纳洛克级</i>战舰,其使用的技术基于偷窃而来的普罗米修斯“FNS莫利纽克斯级”,以及由拯救天使工程师们从他们的天蛇集团盟友处获取的技术。通过与不死循环结盟,天使得以接触到更多的朱庇特残留技术,而他们期盼已久的<i>艾扎利尔</i>级泰坦也终于完工。在主天使舰队最高指挥官当中,艾扎利尔级已经取代了旧款超级旗舰。<b>威胁等级:“我们需要一艘更大的船”</b><i>在躲避不洁军团猛烈攻击的途中,我们偶然发现了天堂的废墟,我们认识到自己在诅咒的群星中找到了家园。我们在镌刻着古老真理的残破纪念碑旁休憩,在破败的神圣科学殿堂中修整武器。当我们再次与敌人交锋时,这一失落国度领主的力量和智慧将支持我们作战。在这个乌托邦之地,铸就了圣籍与我们力量的契约。惟有我们的律令可指引和命令我们,一如只有逝去之人的律令能够指引我们的先辈。我们当以德拉米尔级的速度征战袭掠。我们当以马克瑞级的力量统御四方。我们当以艾扎利尔级的伟力召集迷途之人。</i>–节选自“堕落天使的秘密教义”",
|
||||
"descriptionID": 510091,
|
||||
"graphicID": 21276,
|
||||
"graphicID": 26445,
|
||||
"groupID": 1682,
|
||||
"isDynamicType": 0,
|
||||
"mass": 2075625000.0,
|
||||
"portionSize": 1,
|
||||
"published": 0,
|
||||
@@ -186391,6 +186393,7 @@
|
||||
"descriptionID": 519376,
|
||||
"graphicID": 2907,
|
||||
"groupID": 366,
|
||||
"isDynamicType": 0,
|
||||
"mass": 100000.0,
|
||||
"portionSize": 1,
|
||||
"published": 0,
|
||||
@@ -231116,7 +231119,7 @@
|
||||
"typeID": 44995,
|
||||
"typeName_de": "Enforcer",
|
||||
"typeName_en-us": "Enforcer",
|
||||
"typeName_es": "Enforcer",
|
||||
"typeName_es": "Ejecutor",
|
||||
"typeName_fr": "Enforcer",
|
||||
"typeName_it": "Enforcer",
|
||||
"typeName_ja": "エンフォーサー",
|
||||
|
||||
@@ -197695,18 +197695,18 @@
|
||||
"iconID": 1157,
|
||||
"mass": 0.0,
|
||||
"portionSize": 1,
|
||||
"published": 1,
|
||||
"published": 0,
|
||||
"radius": 1.0,
|
||||
"typeID": 56907,
|
||||
"typeName_de": "Peculiar Icebound Salvage",
|
||||
"typeName_en-us": "Peculiar Icebound Salvage",
|
||||
"typeName_es": "Recuperación de hielo peculiar",
|
||||
"typeName_fr": "Objet de récupération étrange piégé dans la glace",
|
||||
"typeName_it": "Peculiar Icebound Salvage",
|
||||
"typeName_ja": "奇妙な氷のサルベージ",
|
||||
"typeName_ko": "특이한 얼음 잔해",
|
||||
"typeName_ru": "Peculiar Icebound Salvage",
|
||||
"typeName_zh": "特殊的冰封打捞物",
|
||||
"typeName_de": "Winter Nexus Y124 Peculiar Icebound Salvage",
|
||||
"typeName_en-us": "Yoiul Y124 Peculiar Icebound Salvage",
|
||||
"typeName_es": "Recuperación de hielo peculiar de Nexus Invernal 124 Y",
|
||||
"typeName_fr": "Objet de récupération étrange piégé dans la glace du Winter Nexus 124 après CY",
|
||||
"typeName_it": "Yoiul Y124 Peculiar Icebound Salvage",
|
||||
"typeName_ja": "奇妙な氷のサルベージ(Winter Nexus YC124)",
|
||||
"typeName_ko": "겨울 넥서스 YC126 특이한 얼음 잔해",
|
||||
"typeName_ru": "Winter Nexus Y124 Peculiar Icebound Salvage",
|
||||
"typeName_zh": "凛冬将至Y124年特殊的冰封打捞物",
|
||||
"typeNameID": 572529,
|
||||
"volume": 1.0
|
||||
},
|
||||
@@ -201342,18 +201342,18 @@
|
||||
"iconID": 1157,
|
||||
"mass": 0.0,
|
||||
"portionSize": 1,
|
||||
"published": 1,
|
||||
"published": 0,
|
||||
"radius": 1.0,
|
||||
"typeID": 57038,
|
||||
"typeName_de": "Rare Icebound Salvage",
|
||||
"typeName_en-us": "Rare Icebound Salvage",
|
||||
"typeName_es": "Recuperación de hielo poco común",
|
||||
"typeName_fr": "Objet de récupération rare piégé dans la glace",
|
||||
"typeName_it": "Rare Icebound Salvage",
|
||||
"typeName_ja": "レアな氷のサルベージ",
|
||||
"typeName_ko": "희귀한 얼음 잔해",
|
||||
"typeName_ru": "Rare Icebound Salvage",
|
||||
"typeName_zh": "稀有的冰封打捞物",
|
||||
"typeName_de": "Winter Nexus Y124 Rare Icebound Salvage",
|
||||
"typeName_en-us": "Yoiul Y124 Rare Icebound Salvage",
|
||||
"typeName_es": "Recuperación de hielo poco común de Nexus Invernal 124 Y",
|
||||
"typeName_fr": "Objet de récupération rare piégé dans la glace du Winter Nexus 124 après CY",
|
||||
"typeName_it": "Yoiul Y124 Rare Icebound Salvage",
|
||||
"typeName_ja": "レアな氷のサルベージ(Winter Nexus YC124)",
|
||||
"typeName_ko": "겨울 넥서스 YC126 희귀한 얼음 잔해",
|
||||
"typeName_ru": "Winter Nexus Y124 Rare Icebound Salvage",
|
||||
"typeName_zh": "凛冬将至Y124年稀有冰封打捞物",
|
||||
"typeNameID": 572856,
|
||||
"volume": 1.0
|
||||
},
|
||||
@@ -201374,18 +201374,18 @@
|
||||
"iconID": 1157,
|
||||
"mass": 0.0,
|
||||
"portionSize": 1,
|
||||
"published": 1,
|
||||
"published": 0,
|
||||
"radius": 1.0,
|
||||
"typeID": 57039,
|
||||
"typeName_de": "Unusual Icebound Salvage",
|
||||
"typeName_en-us": "Unusual Icebound Salvage",
|
||||
"typeName_es": "Recuperación de hielo inusual",
|
||||
"typeName_fr": "Objet de récupération inhabituel piégé dans la glace",
|
||||
"typeName_it": "Unusual Icebound Salvage",
|
||||
"typeName_ja": "珍しい氷のサルベージ",
|
||||
"typeName_ko": "특수한 얼음 잔해",
|
||||
"typeName_ru": "Unusual Icebound Salvage",
|
||||
"typeName_zh": "罕见的冰封打捞物",
|
||||
"typeName_de": "Winter Nexus Y124 Unusual Icebound Salvage",
|
||||
"typeName_en-us": "Yoiul Y124 Unusual Icebound Salvage",
|
||||
"typeName_es": "Recuperación de hielo inusual de Nexus Invernal 124 Y",
|
||||
"typeName_fr": "Objet de récupération inhabituel piégé dans la glace du Winter Nexus 124 après CY",
|
||||
"typeName_it": "Yoiul Y124 Unusual Icebound Salvage",
|
||||
"typeName_ja": "珍しい氷のサルベージ(Winter Nexus YC124)",
|
||||
"typeName_ko": "겨울 넥서스 YC126 특수한 얼음 잔해",
|
||||
"typeName_ru": "Winter Nexus Y124 Unusual Icebound Salvage",
|
||||
"typeName_zh": "凛冬将至Y124年罕见冰封打捞物",
|
||||
"typeNameID": 572857,
|
||||
"volume": 1.0
|
||||
},
|
||||
@@ -201406,18 +201406,18 @@
|
||||
"iconID": 24272,
|
||||
"mass": 0.0,
|
||||
"portionSize": 1,
|
||||
"published": 1,
|
||||
"published": 0,
|
||||
"radius": 1.0,
|
||||
"typeID": 57040,
|
||||
"typeName_de": "ORE Green Salvage Package",
|
||||
"typeName_en-us": "ORE Green Salvage Package",
|
||||
"typeName_es": "Paquete de recuperación verde de ORE",
|
||||
"typeName_fr": "Pack de récupération ORE vert",
|
||||
"typeName_it": "ORE Green Salvage Package",
|
||||
"typeName_ja": "OREグリーンサルベージパッケージ",
|
||||
"typeName_ko": "ORE 그린 샐비지 패키지",
|
||||
"typeName_ru": "ORE Green Salvage Package",
|
||||
"typeName_zh": "联合矿业绿色打捞箱",
|
||||
"typeName_de": "Winter Nexus Y124 ORE Green Salvage Package",
|
||||
"typeName_en-us": "Yoiul Y124 ORE Green Salvage Package",
|
||||
"typeName_es": "Paquete de recuperación verde de ORE de Nexus Invernal 124 Y",
|
||||
"typeName_fr": "Pack de récupération ORE vert du Winter Nexus 124 après CY",
|
||||
"typeName_it": "Yoiul Y124 ORE Green Salvage Package",
|
||||
"typeName_ja": "OREグリーンサルベージパッケージ(Winter Nexus YC124)",
|
||||
"typeName_ko": "겨울 넥서스 YC126 ORE 그린 샐비지 패키지",
|
||||
"typeName_ru": "Winter Nexus Y124 ORE Green Salvage Package",
|
||||
"typeName_zh": "凛冬将至Y124年联合矿业绿色打捞箱",
|
||||
"typeNameID": 572858,
|
||||
"volume": 1.0
|
||||
},
|
||||
@@ -201425,10 +201425,10 @@
|
||||
"basePrice": 0.0,
|
||||
"capacity": 0.0,
|
||||
"description_de": "Diese stark umgewandelte Orca wurde von der Outer Ring Excavations Corporation als mobile Aufbereitungsanlage für unbeständiges Eiserz eingerichtet. Dieser Prozessor arbeitet im Hochsicherheitsraum und nimmt schwindendes unbeständiges Eiserz im Tausch gegen ein grünes ORE-Bergungspaket entgegen. Im Tausch gegen nützliche Eiserze werden verschiedene Bergungsgegenstände angeboten, die von ORE durch Kampfeinsätze erlangt oder durch Filtern von weiterverarbeitetem Eis erhalten wurden.",
|
||||
"description_en-us": "This heavily-converted Orca has been set up as a mobile volatile ice ore processing facility by the Outer Ring Excavations corporation.\r\n\r\nThis processor operates in high-security space and takes Faded Volatile Ice ore in exchange for an ORE Green Salvage Package.\r\n\r\nVarious salvage items obtained by ORE through combat operations or filtered out of processed ice are offered in trade for useful ice ores.",
|
||||
"description_en-us": "This heavily-converted Orca has been set up as a mobile volatile ice ore processing facility by the Outer Ring Excavations corporation.\r\n\r\nThis processor takes Faded Volatile Ice ore in exchange for an ORE Green Salvage Package.\r\n\r\nVarious salvage items obtained by ORE through combat operations or filtered out of processed ice are offered in trade for useful ice ores.",
|
||||
"description_es": "La corporación Outer Ring Excavations ha convertido esta Orca profundamente transformada en una instalación móvil para el procesamiento de menas de hielo volátil.\n\n\n\nEste procesador opera en espacios de seguridad alta y toma menas de hielo volátil rebajado a cambio de un paquete de recuperación verde de ORE.\n\n\n\nA cambio de útiles menas de hielo, se ofrecen varios artículos que ORE ha recuperado en acciones bélicas o que ha filtrado a partir de hielo procesado.",
|
||||
"description_fr": "Cet Orca a été intégralement converti en installation de traitement mobile pour le minerai de glace par la corporation Outer Ring Excavations. Ce processeur fonctionne dans l'espace de haute sécurité et accepte les minerais de glace volatile appauvrie en échange d'un pack de récupération ORE vert. Différents objets de récupération obtenus par ORE au cours des opérations de combat ou filtrés de la glace traitée sont offerts en échange de minerai de glace utile.",
|
||||
"description_it": "This heavily-converted Orca has been set up as a mobile volatile ice ore processing facility by the Outer Ring Excavations corporation.\r\n\r\nThis processor operates in high-security space and takes Faded Volatile Ice ore in exchange for an ORE Green Salvage Package.\r\n\r\nVarious salvage items obtained by ORE through combat operations or filtered out of processed ice are offered in trade for useful ice ores.",
|
||||
"description_it": "This heavily-converted Orca has been set up as a mobile volatile ice ore processing facility by the Outer Ring Excavations corporation.\r\n\r\nThis processor takes Faded Volatile Ice ore in exchange for an ORE Green Salvage Package.\r\n\r\nVarious salvage items obtained by ORE through combat operations or filtered out of processed ice are offered in trade for useful ice ores.",
|
||||
"description_ja": "このオルカは、アウターリング発掘調査コーポレーションの移動式揮発性アイス鉱石処理施設として設置されている。\n\n\n\nこのプロセッサーはハイセキュリティ宙域で稼働し、OREグリーンサルベージパッケージと引き換えに弱体化した揮発性アイス鉱石を採取する。\n\n\n\n戦闘行動や、加工処理したアイスをろ過して入手した様々なサルベージアイテムは、有用なアイス鉱石との取引に使用される。",
|
||||
"description_ko": "아우터링 채굴조합에 의해 이동식 정제 시설로 개조된 오르카로 아이스 처리 작업에 사용되고 있습니다.<br><br>하이 시큐리티 지역에 파견된 정제선으로 빛바랜 아이스를 투입하면 ORE 그린 샐비지 패키지를 획득할 수 있습니다.<br><br>아이스 교환 시 ORE가 작전 중 수집한 각종 아이템을 비롯하여 정제 과정에서 남은 재료를 입수할 수 있습니다.",
|
||||
"description_ru": "Этот модифицированный вариант «Орки», созданный корпорацией «Окраинная рудная экспедиция», по сути является мобильным заводом по переработке нестабильной ледяной руды. Это перерабатывающее судно работает в системах с высоким уровнем безопасности и забирает свежую нестабильную ледяную руду в обмен на белый герметичный контейнер ОРЭ. За качественную ледяную руду ОРЭ предлагает различные находки, полученные в ходе боевых действий или же извлечённые из переработанного льда.",
|
||||
@@ -201506,15 +201506,15 @@
|
||||
"57047": {
|
||||
"basePrice": 0.0,
|
||||
"capacity": 0.0,
|
||||
"description_de": "Diese stark umgewandelte Orca wurde von der Outer Ring Excavations Corporation als mobile Aufbereitungsanlage für unbeständiges Eiserz eingerichtet. Dieser Prozessor nimmt frisches unbeständiges Eiserz im Tausch gegen ein weißes ORE-Bergungspaket entgegen. Im Tausch gegen nützliche Eiserze werden verschiedene Bergungsgegenstände angeboten, die von ORE durch Kampfeinsätze erlangt oder durch Filtern von weiterverarbeitetem Eis erhalten wurden.",
|
||||
"description_en-us": "This heavily-converted Orca has been set up as a mobile volatile ice ore processing facility by the Outer Ring Excavations corporation.\r\n\r\nThis processor takes Fresh Volatile Ice ore in exchange for an ORE White Salvage Package.\r\n\r\nVarious salvage items obtained by ORE through combat operations or filtered out of processed ice are offered in trade for useful ice ores.",
|
||||
"description_es": "La corporación Outer Ring Excavations ha convertido esta Orca profundamente transformada en una instalación móvil para el procesamiento de menas de hielo volátil.\n\nEste procesador acepta menas de hielo volátil fresco a cambio de un paquete de recuperación blanco de ORE.\n\nA cambio de útiles menas de hielo, se ofrecen varios artículos que ORE ha recuperado en acciones bélicas o que ha filtrado a partir de hielo procesado.",
|
||||
"description_fr": "Cet Orca a été intégralement converti en installation de traitement mobile pour le minerai de glace par la corporation Outer Ring Excavations. Ce processeur accepte les minerais de glace volatile fraîche en échange d'un pack de récupération ORE blanc. Différents objets de récupération obtenus par ORE au cours des opérations de combat ou filtrés de la glace traitée sont offerts en échange de minerai de glace utile.",
|
||||
"description_it": "This heavily-converted Orca has been set up as a mobile volatile ice ore processing facility by the Outer Ring Excavations corporation.\r\n\r\nThis processor takes Fresh Volatile Ice ore in exchange for an ORE White Salvage Package.\r\n\r\nVarious salvage items obtained by ORE through combat operations or filtered out of processed ice are offered in trade for useful ice ores.",
|
||||
"description_ja": "このオルカは、アウターリング発掘調査コーポレーションの移動式揮発性アイス鉱石処理施設として設置されている。\n\n\n\nこのプロセッサーは、OREホワイトサルベージパッケージと引き換えに新鮮な揮発性アイス鉱石を採取する。\n\n\n\n戦闘行動や、加工処理したアイスをろ過して入手した様々なサルベージアイテムは、有用なアイス鉱石との取引に使用される。",
|
||||
"description_ko": "아우터링 채굴조합에 의해 이동식 정제 시설로 개조된 오르카로 아이스 처리 작업에 사용되고 있습니다.<br><br>선명한 아이스를 투입하면 ORE 화이트 샐비지 패키지를 획득할 수 있습니다.<br><br>아이스 교환 시 ORE가 작전 중 수집한 각종 아이템을 비롯하여 정제 과정에서 남은 재료를 입수할 수 있습니다.",
|
||||
"description_ru": "Этот модифицированный вариант «Орки», созданный корпорацией «Окраинная рудная экспедиция», по сути является мобильным заводом по переработке нестабильной ледяной руды. Это перерабатывающее судно забирает свежую нестабильную ледяную руду в обмен на белый герметичный контейнер ОРЭ. За качественную ледяную руду ОРЭ предлагает различные находки, полученные в ходе боевых действий или же извлечённые из переработанного льда.",
|
||||
"description_zh": "这艘大幅改装过的逆戟鲸级被联合矿业集团用作一个可移动的不稳定冰矿石处理设施。\n\n\n\n可以在这里用新生的不稳定冰矿石交换联合矿业白色打捞包裹。\n\n\n\n联合矿业将自己在战斗或提炼矿石的过程中获得的各种打捞物品用来交换冰矿石。",
|
||||
"description_de": "Diese stark umgewandelte Orca wurde von der Outer Ring Excavations Corporation als mobile Aufbereitungsanlage für unbeständiges Eiserz eingerichtet. Dieser Prozessor nimmt brüchiges unbeständiges Eiserz im Tausch gegen ein rotes ORE-Bergungspaket entgegen. Im Tausch gegen nützliche Eiserze werden verschiedene Bergungsgegenstände angeboten, die von ORE durch Kampfeinsätze erlangt oder durch Filtern von weiterverarbeitetem Eis erhalten wurden.",
|
||||
"description_en-us": "This heavily-converted Orca has been set up as a mobile volatile ice ore processing facility by the Outer Ring Excavations corporation.\r\n\r\nThis processor takes Friable Volatile Ice ore in exchange for an ORE Red Salvage Package.\r\n\r\nVarious salvage items obtained by ORE through combat operations or filtered out of processed ice are offered in trade for useful ice ores.",
|
||||
"description_es": "La corporación Outer Ring Excavations ha convertido esta Orca profundamente transformada en una instalación móvil para el procesamiento de menas de hielo volátil.\r\n\r\nEste procesador acepta menas de hielo volátil quebradizo a cambio de un paquete de recuperación rojo de ORE.\r\n\r\nA cambio de útiles menas de hielo, se ofrecen varios artículos que ORE ha recuperado en acciones bélicas o que ha filtrado a partir de hielo procesado.",
|
||||
"description_fr": "Cet Orca a été intégralement converti en installation de traitement mobile pour le minerai de glace volatile par la corporation Outer Ring Excavations. Ce dispositif de traitement prend du minerai de glace volatile friable en échange d'un pack de récupération ORE rouge. Divers objets de récupération obtenus par l'ORE lors d'opérations de combat ou filtrés à partir de glace traitée sont proposés en échange de minerais de glace utiles.",
|
||||
"description_it": "This heavily-converted Orca has been set up as a mobile volatile ice ore processing facility by the Outer Ring Excavations corporation.\r\n\r\nThis processor takes Friable Volatile Ice ore in exchange for an ORE Red Salvage Package.\r\n\r\nVarious salvage items obtained by ORE through combat operations or filtered out of processed ice are offered in trade for useful ice ores.",
|
||||
"description_ja": "このオルカは、アウターリング発掘調査コーポレーションの移動式揮発性アイス鉱石処理施設として設置されている。\r\n\r\nこのプロセッサーは、OREレッドサルベージパッケージと引き換えに脆い揮発性アイス鉱石を採取する。\r\n\r\n戦闘行動や、加工処理したアイスをろ過して入手した様々なサルベージアイテムは、有用なアイス鉱石との取引に使用される。",
|
||||
"description_ko": "아우터링 채굴조합이 이동식 정제 시설로 개조한 오르카입니다. 아이스 처리 작업에 사용되고 있습니다.<br><br>취약한 불안정한 아이스를 투입하면 ORE 레드 샐비지 패키지를 획득할 수 있습니다.<br><br>아이스를 교환해서 ORE가 작전 중 수집한 각종 아이템 및 정제 과정에서 남은 재료를 입수할 수 있습니다.",
|
||||
"description_ru": "Этот модифицированный вариант корабля Orca, созданный корпорацией «Окраинная рудная экспедиция», по сути, является мобильным заводом по переработке нестабильной ледяной руды. Это перерабатывающее судно забирает рыхлую нестабильную ледяную руду в обмен на красный герметичный контейнер ОРЭ. За качественную ледяную руду ОРЭ предлагает различные находки, полученные в ходе боевых действий или же извлечённые из переработанного льда.",
|
||||
"description_zh": "这艘大幅改装过的逆戟鲸级被外空联合矿业集团用作一个可移动的不稳定冰矿石处理设施。可以在这里用易碎的不稳定冰矿石交换联合矿业红色打捞箱。联合矿业将自己在战斗或提炼矿石的过程中获得的各种打捞物品用来交换冰矿石。",
|
||||
"descriptionID": 572882,
|
||||
"graphicID": 3466,
|
||||
"groupID": 494,
|
||||
@@ -201525,30 +201525,30 @@
|
||||
"radius": 550.0,
|
||||
"soundID": 20221,
|
||||
"typeID": 57047,
|
||||
"typeName_de": "ORE Fresh Volatile Ice Processor",
|
||||
"typeName_en-us": "ORE Fresh Volatile Ice Processor",
|
||||
"typeName_es": "Procesador de hielo volátil fresco de ORE",
|
||||
"typeName_fr": "Processeur de glace volatile fraîche ORE",
|
||||
"typeName_it": "ORE Fresh Volatile Ice Processor",
|
||||
"typeName_ja": "ORE新鮮な揮発性アイスプロセッサ",
|
||||
"typeName_ko": "ORE 선명한 불안정한 아이스 정제선",
|
||||
"typeName_ru": "ORE Fresh Volatile Ice Processor",
|
||||
"typeName_zh": "联合矿业新生的不稳定冰矿提炼中心",
|
||||
"typeName_de": "ORE Friable Volatile Ice Processor",
|
||||
"typeName_en-us": "ORE Friable Volatile Ice Processor",
|
||||
"typeName_es": "Procesador de hielo volátil quebradizo de ORE",
|
||||
"typeName_fr": "Processeur de glace volatile friable ORE",
|
||||
"typeName_it": "ORE Friable Volatile Ice Processor",
|
||||
"typeName_ja": "ORE脆い揮発性アイスプロセッサ",
|
||||
"typeName_ko": "ORE 취약한 불안정한 아이스 정제선",
|
||||
"typeName_ru": "ORE Friable Volatile Ice Processor",
|
||||
"typeName_zh": "联合矿业易碎的不稳定冰矿提炼中心",
|
||||
"typeNameID": 572881,
|
||||
"volume": 10250000.0
|
||||
},
|
||||
"57048": {
|
||||
"basePrice": 0.0,
|
||||
"capacity": 0.0,
|
||||
"description_de": "Diese stark umgewandelte Orca wurde von der Outer Ring Excavations Corporation als mobile Aufbereitungsanlage für unbeständiges Eiserz eingerichtet. Dieser Prozessor nimmt brüchiges unbeständiges Eiserz im Tausch gegen ein rotes ORE-Bergungspaket entgegen. Im Tausch gegen nützliche Eiserze werden verschiedene Bergungsgegenstände angeboten, die von ORE durch Kampfeinsätze erlangt oder durch Filtern von weiterverarbeitetem Eis erhalten wurden.",
|
||||
"description_en-us": "This heavily-converted Orca has been set up as a mobile volatile ice ore processing facility by the Outer Ring Excavations corporation.\r\n\r\nThis processor takes Friable Volatile Ice ore in exchange for an ORE Red Salvage Package.\r\n\r\nVarious salvage items obtained by ORE through combat operations or filtered out of processed ice are offered in trade for useful ice ores.",
|
||||
"description_es": "La corporación Outer Ring Excavations ha convertido esta Orca profundamente transformada en una instalación móvil para el procesamiento de menas de hielo volátil.\n\n\n\nEste procesador acepta menas de hielo volátil quebradizo a cambio de un paquete de recuperación rojo de ORE.\n\n\n\nA cambio de útiles menas de hielo, se ofrecen varios artículos que ORE ha recuperado en acciones bélicas o que ha filtrado a partir de hielo procesado.",
|
||||
"description_fr": "Cet Orca a été intégralement converti en installation de traitement mobile pour le minerai de glace par la corporation Outer Ring Excavations. Ce processeur accepte les minerais de glace volatile friable en échange d'un pack de récupération ORE rouge. Différents objets de récupération obtenus par ORE au cours des opérations de combat ou filtrés de la glace traitée sont offerts en échange de minerai de glace utile.",
|
||||
"description_it": "This heavily-converted Orca has been set up as a mobile volatile ice ore processing facility by the Outer Ring Excavations corporation.\r\n\r\nThis processor takes Friable Volatile Ice ore in exchange for an ORE Red Salvage Package.\r\n\r\nVarious salvage items obtained by ORE through combat operations or filtered out of processed ice are offered in trade for useful ice ores.",
|
||||
"description_ja": "このオルカは、アウターリング発掘調査コーポレーションの移動式揮発性アイス鉱石処理施設として設置されている。\n\n\n\nこのプロセッサーは、OREレッドサルベージパッケージと引き換えに脆い揮発性アイス鉱石を採取する。\n\n\n\n戦闘行動や、加工処理したアイスをろ過して入手した様々なサルベージアイテムは、有用なアイス鉱石との取引に使用される。",
|
||||
"description_ko": "아우터링 채굴조합에 의해 이동식 정제 시설로 개조된 오르카로 아이스 처리 작업에 사용되고 있습니다.<br><br>취약한 아이스를 투입하면 ORE 레드 샐비지 패키지를 획득할 수 있습니다.<br><br>아이스 교환 시 ORE가 작전 중 수집한 각종 아이템을 비롯하여 정제 과정에서 남은 재료를 입수할 수 있습니다.",
|
||||
"description_ru": "Этот модифицированный вариант «Орки», созданный корпорацией «Окраинная рудная экспедиция», по сути является мобильным заводом по переработке нестабильной ледяной руды. Это перерабатывающее судно забирает рыхлую нестабильную ледяную руду в обмен на красный герметичный контейнер ОРЭ. За качественную ледяную руду ОРЭ предлагает различные находки, полученные в ходе боевых действий или же извлечённые из переработанного льда.",
|
||||
"description_zh": "这艘大幅改装过的逆戟鲸级被联合矿业集团用作一个可移动的不稳定冰矿石处理设施。\n\n\n\n可以在这里用易碎的不稳定冰矿石交换联合矿业红色打捞包裹。\n\n\n\n联合矿业将自己在战斗或提炼矿石的过程中获得的各种打捞物品用来交换冰矿石。",
|
||||
"description_de": "Diese stark umgewandelte Orca wurde von der Outer Ring Excavations Corporation als mobile Aufbereitungsanlage für unbeständiges Eiserz eingerichtet. Dieser Prozessor nimmt frisches unbeständiges Eiserz im Tausch gegen ein weißes ORE-Bergungspaket entgegen. Im Tausch gegen nützliche Eiserze werden verschiedene Bergungsgegenstände angeboten, die von ORE durch Kampfeinsätze erlangt oder durch Filtern von weiterverarbeitetem Eis erhalten wurden.",
|
||||
"description_en-us": "This heavily-converted Orca has been set up as a mobile volatile ice ore processing facility by the Outer Ring Excavations corporation.\r\n\r\nThis processor takes Fresh Volatile Ice ore in exchange for an ORE White Salvage Package.\r\n\r\nVarious salvage items obtained by ORE through combat operations or filtered out of processed ice are offered in trade for useful ice ores.",
|
||||
"description_es": "La corporación Outer Ring Excavations ha convertido esta Orca profundamente transformada en una instalación móvil para el procesamiento de menas de hielo volátil.\r\n\r\nEste procesador acepta menas de hielo volátil fresco a cambio de un paquete de recuperación blanco de ORE.\r\n\r\nA cambio de útiles menas de hielo, se ofrecen varios artículos que ORE ha recuperado en acciones bélicas o que ha filtrado a partir de hielo procesado.",
|
||||
"description_fr": "Cet Orca a été intégralement converti en installation de traitement mobile pour le minerai de glace volatile par la corporation Outer Ring Excavations. Ce processeur prend du minerai de glace volatile fraîche en échange d'un pack de récupération ORE blanc. Divers objets de récupération obtenus par l'ORE lors d'opérations de combat ou filtrés à partir de glace traitée sont proposés en échange de minerais de glace utiles.",
|
||||
"description_it": "This heavily-converted Orca has been set up as a mobile volatile ice ore processing facility by the Outer Ring Excavations corporation.\r\n\r\nThis processor takes Fresh Volatile Ice ore in exchange for an ORE White Salvage Package.\r\n\r\nVarious salvage items obtained by ORE through combat operations or filtered out of processed ice are offered in trade for useful ice ores.",
|
||||
"description_ja": "このオルカは、アウターリング発掘調査コーポレーションの移動式揮発性アイス鉱石処理施設として設置されている。\r\n\r\nこのプロセッサーは、OREホワイトサルベージパッケージと引き換えに新鮮な揮発性アイス鉱石を採取する。\r\n\r\n戦闘行動や、加工処理したアイスをろ過して入手した様々なサルベージアイテムは、有用なアイス鉱石との取引に使用される。",
|
||||
"description_ko": "아우터링 채굴조합이 이동식 정제 시설로 개조한 오르카로, 아이스 처리 작업에 사용되고 있습니다.<br><br>선명한 불안정한 아이스를 투입하면 ORE 화이트 샐비지 패키지를 획득할 수 있습니다.<br><br>아이스 교환 시 ORE가 작전 중 수집한 각종 아이템 및 정제 과정에서 남은 재료를 입수할 수 있습니다.",
|
||||
"description_ru": "Этот модифицированный вариант корабля Orca, созданный корпорацией «Окраинная рудная экспедиция», по сути, является мобильным заводом по переработке нестабильной ледяной руды. За качественную ледяную руду ОРЭ предлагает различные находки, полученные в ходе боевых действий или же извлечённые из переработанного льда.",
|
||||
"description_zh": "这艘大幅改装过的逆戟鲸级被外空联合矿业集团用作一个可移动的不稳定冰矿石处理设施。可以在这里用新生的不稳定冰矿石交换联合矿业白色打捞箱。联合矿业将自己在战斗或提炼矿石的过程中获得的各种打捞物品用来交换冰矿石。",
|
||||
"descriptionID": 572884,
|
||||
"graphicID": 3466,
|
||||
"groupID": 494,
|
||||
@@ -201559,15 +201559,15 @@
|
||||
"radius": 550.0,
|
||||
"soundID": 20221,
|
||||
"typeID": 57048,
|
||||
"typeName_de": "ORE Friable Volatile Ice Processor",
|
||||
"typeName_en-us": "ORE Friable Volatile Ice Processor",
|
||||
"typeName_es": "Procesador de hielo volátil quebradizo de ORE",
|
||||
"typeName_fr": "Processeur de glace volatile friable ORE",
|
||||
"typeName_it": "ORE Friable Volatile Ice Processor",
|
||||
"typeName_ja": "ORE脆い揮発性アイスプロセッサ",
|
||||
"typeName_ko": "ORE 취약한 불안정한 아이스 정제선",
|
||||
"typeName_ru": "ORE Friable Volatile Ice Processor",
|
||||
"typeName_zh": "联合矿业易碎的不稳定冰矿提炼中心",
|
||||
"typeName_de": "ORE Fresh Volatile Ice Processor",
|
||||
"typeName_en-us": "ORE Fresh Volatile Ice Processor",
|
||||
"typeName_es": "Procesador de hielo volátil fresco de ORE",
|
||||
"typeName_fr": "Processeur de glace volatile fraîche ORE",
|
||||
"typeName_it": "ORE Fresh Volatile Ice Processor",
|
||||
"typeName_ja": "ORE新鮮な揮発性アイスプロセッサ",
|
||||
"typeName_ko": "ORE 선명한 불안정한 아이스 정제선",
|
||||
"typeName_ru": "ORE Fresh Volatile Ice Processor",
|
||||
"typeName_zh": "联合矿业新生的不稳定冰矿提炼中心",
|
||||
"typeNameID": 572883,
|
||||
"volume": 10250000.0
|
||||
},
|
||||
@@ -201588,18 +201588,18 @@
|
||||
"iconID": 24275,
|
||||
"mass": 0.0,
|
||||
"portionSize": 1,
|
||||
"published": 1,
|
||||
"published": 0,
|
||||
"radius": 1.0,
|
||||
"typeID": 57050,
|
||||
"typeName_de": "ORE White Salvage Package",
|
||||
"typeName_en-us": "ORE White Salvage Package",
|
||||
"typeName_es": "Paquete de recuperación blanco de ORE",
|
||||
"typeName_fr": "Pack de récupération ORE blanc",
|
||||
"typeName_it": "ORE White Salvage Package",
|
||||
"typeName_ja": "OREホワイトサルベージパッケージ",
|
||||
"typeName_ko": "ORE 화이트 샐비지 패키지",
|
||||
"typeName_ru": "ORE White Salvage Package",
|
||||
"typeName_zh": "联合矿业白色打捞箱",
|
||||
"typeName_de": "Winter Nexus Y124 ORE White Salvage Package",
|
||||
"typeName_en-us": "Yoiul Y124 ORE White Salvage Package",
|
||||
"typeName_es": "Paquete de recuperación blanco de ORE de Nexus Invernal 124 Y",
|
||||
"typeName_fr": "Pack de récupération ORE blanc du Winter Nexus 124 après CY",
|
||||
"typeName_it": "Yoiul Y124 ORE White Salvage Package",
|
||||
"typeName_ja": "OREホワイトサルベージパッケージ(Winter Nexus YC124)",
|
||||
"typeName_ko": "겨울 넥서스 YC126 ORE 화이트 샐비지 패키지",
|
||||
"typeName_ru": "Winter Nexus Y124 ORE White Salvage Package",
|
||||
"typeName_zh": "凛冬将至Y124年联合矿业白色打捞箱",
|
||||
"typeNameID": 572889,
|
||||
"volume": 1.0
|
||||
},
|
||||
@@ -201620,18 +201620,18 @@
|
||||
"iconID": 24271,
|
||||
"mass": 0.0,
|
||||
"portionSize": 1,
|
||||
"published": 1,
|
||||
"published": 0,
|
||||
"radius": 1.0,
|
||||
"typeID": 57051,
|
||||
"typeName_de": "ORE Red Salvage Package",
|
||||
"typeName_en-us": "ORE Red Salvage Package",
|
||||
"typeName_es": "Paquete de recuperación rojo de ORE",
|
||||
"typeName_fr": "Pack de récupération ORE rouge",
|
||||
"typeName_it": "ORE Red Salvage Package",
|
||||
"typeName_ja": "OREレッドサルベージパッケージ",
|
||||
"typeName_ko": "ORE 레드 샐비지 패키지",
|
||||
"typeName_ru": "ORE Red Salvage Package",
|
||||
"typeName_zh": "联合矿业红色打捞箱",
|
||||
"typeName_de": "Winter Nexus Y124 ORE Red Salvage Package",
|
||||
"typeName_en-us": "Yoiul Y124 ORE Red Salvage Package",
|
||||
"typeName_es": "Paquete de recuperación rojo de ORE de Nexus Invernal 124 Y",
|
||||
"typeName_fr": "Pack de récupération ORE rouge du Winter Nexus 124 après CY",
|
||||
"typeName_it": "Yoiul Y124 ORE Red Salvage Package",
|
||||
"typeName_ja": "OREレッドサルベージパッケージ(Winter Nexus YC124)",
|
||||
"typeName_ko": "겨울 넥서스 YC126 ORE 레드 샐비지 패키지",
|
||||
"typeName_ru": "Winter Nexus Y124 ORE Red Salvage Package",
|
||||
"typeName_zh": "凛冬将至Y124年联合矿业红色打捞箱",
|
||||
"typeNameID": 572890,
|
||||
"volume": 1.0
|
||||
},
|
||||
@@ -260376,6 +260376,16 @@
|
||||
"60926": {
|
||||
"basePrice": 0.0,
|
||||
"capacity": 0.0,
|
||||
"description_de": "Auroras, auch Polarlichter genannt, sind ein universelles Konzept und eine gemeinsame Erfahrung der Menschen von New Eden. Besonders auf den stark bevölkerten terrestrischen Heimatplaneten gibt es viele Geschichten und Mythen zu diesen eindrucksvollen tanzenden Lichtern am Himmel. Die Amarr verbinden Auroras mit alten religiösen Geschichten und nennen sie manchmal „Sefrim-Banner“, was sich auf die Engelsgestalten bezieht, die als Boten Gottes betrachtet werden. Während der Rückforderung von Athra erschienen die Lichter immer wieder und wurden von den Armeen der Amarr als Zeichen göttlicher Zustimmung betrachtet. Die Caldari sehen in den Polarlichtern den rätselhaften „Flammenwind“, eine mysteriöse Kraft in der animistischen Mythologie aus der vorindustriellen Zeit von Caldari Prime. Auf ihrem Heimatplaneten brachten die Caldari die Auroras mit Wetterschwankungen und plötzlich auftretenden Tierwanderungen in Verbindung. Die verschiedenen Nationen von Gallente Prime hatten ihre alten Legenden über Polarlichter, aber aus der Zeit der „Luftschiffkriege“ wussten sie, dass eine Aurora durch eine Wechselwirkung zwischen Atmosphäre, Magnetfeldern und Sternwinden entsteht. Ausflüge in die Polarregionen von Gallente Prime sind bei Touristen wegen der Aurora überaus beliebt. Die Minmatar haben eine etwas gemischte Meinung zur Aurora. Manche glauben, dass solche Lichter in den Stürmen gesehen wurden, die Matar am „Tag der Dunkelheit“ zerstört haben, kurz vor der Invasion der Amarr. Für die meisten bringt diese Vorstellung die lückenhaften Erzählungen dessen, was damals geschah, und die traditionelle Sicht auf die Polarlichter durcheinander, denn zumindest für Stämme wie die Brutor und die Sebiestor stellen die Lichter eine „stehende Zusammenkunft“ oder Versammlung von Stammesgeistern dar. Zur Zeit des Yoiul-Festivals erinnern die Polarlichter der Welten von New Eden an die gemeinsame Geschichte der Menschen des Clusters, und für manche sind sie zu einem Symbol ihrer universellen Verbindungen untereinander geworden.",
|
||||
"description_en-us": "Auroras, or polar lights, are a universal concept and shared experience among the peoples of New Eden. The heavily-populated terrestrial home planets are particularly noted for stories and myths involving these striking, dancing lights in the sky.\r\n\r\nTo the Amarr, the aurora are linked to ancient religious stories and are sometimes known as \"Sefrim Banners\", alluding to the angelic figures considered messengers from God. A tradition of the appearance of these lights heralding divine approval for the armies of Amarr during the Reclaiming of Athra is well attested.\r\n\r\nFor the Caldari, the polar lights are the enigmatic \"Flame Wind\", a mysterious force in the animistic mythology of Caldari Prime's pre-industrial era. On the cold Caldari home world, the appearance of the aurora was associated with unusual weather and sudden migrations of animals.\r\n\r\nThe various nations of Gallente Prime had their ancient legends about polar lights but knew the aurora to be an interaction of atmosphere, magnetic fields and stellar winds from the time of the \"Airship Wars\". Viewing aurora on airship trips to the polar regions of Gallente Prime is a popular tourist activity on the planet.\r\n\r\nThe Minmatar have a somewhat mixed viewpoint on aurora with some believing that such lights were seen during the storms that wracked Matar during the \"Day of Darkness\" that heralded the Amarr invasion. Most think this notion mixes up the fragmentary tales of what happened in those times and the traditional view of the polar lights, at least for tribes such as the Brutor and Sebiestor, is that they represent a \"standing place gathering\" or moot of tribal spirits.\r\n\r\nAt the time of the Yoiul Festival, the aurora lights of the worlds of New Eden are one reminder of the shared history of the people of the cluster and have becomes a symbol to some of their universal connections with one another.",
|
||||
"description_es": "Las auroras boreales son un concepto universal y una experiencia compartida entre los pueblos de Nuevo Edén. Los planetas natales terrestres densamente poblados son especialmente conocidos por las historias y los mitos de estas impresionantes luces que parecen bailar en el cielo.\r\n\r\nPara los amarrianos, las auroras se relacionan con antiguas historias religiosas y se las conoce como «banderas de sefrim», en alusión a las figuras angelicales que actúan como mensajeros de Dios. Hay una tradición atestiguada de que estas luces aparecieron para anunciar la aprobación divina de los ejércitos amarrianos durante la Recuperación de Athra.\r\n\r\nPara los caldaris, las auroras boreales son el enigmático «Viento Ígneo», una fuerza misteriosa en la mitología animista de la época preindustrial de Caldari Prime. En el frío mundo natal de los caldaris, la aparición de la aurora se asoció con una meteorología inusual y migraciones repentinas de animales.\r\n\r\nLas diversas naciones de Gallente Prime tenían leyendas antiguas sobre la aurora boreal, pero sabían que era una interacción entre la atmósfera, los campos magnéticos y los vientos estelares desde la época de las llamadas «guerras de las aeronaves». Una de las excursiones turísticas más populares en Gallente Prime consiste en viajar a las regiones australes para ver estas luces.\r\n\r\nLos minmatarianos tienen opiniones encontradas sobre las auroras boreales y algunos creen que se avistaron durante las tormentas que arrasaron Matar el Día de la Oscuridad, que anunció la invasión amarriana. La mayoría cree que esta idea mezcla las historias fragmentadas de lo ocurrido en esos tiempos con la interpretación tradicional, al menos para tribus como los brutors y los sebiestors, que consideran que las luces representan una reunión o una discusión de los espíritus tribales.\r\n\r\nEn el momento del Festival de Yoiul, las luces boreales de los mundos de Nuevo Edén recuerdan la historia que comparten las personas del cúmulo y se han convertido en el símbolo de algunas de las conexiones universales entre ellas.",
|
||||
"description_fr": "Les aurores, ou lumières polaires, sont un concept universel et une expérience commune parmi les peuples de New Eden. Les planètes terrestres densément peuplées sont particulièrement connues pour les histoires et mythes impliquant ces lumières dansantes et saisissantes dans le ciel. Pour les Amarr, les aurores sont liées à d'anciennes légendes religieuses et sont parfois appelées « Bannières des Sefrim », en référence aux figures angéliques considérées comme des messagers de Dieu. Une tradition selon laquelle l'apparition de ces lumières annoncerait l'approbation divine pour les armées amarr lors de la Reconquête d'Athra est bien attestée. Pour les Caldari, les lumières polaires sont l'énigmatique « Vent enflammé », une force mystérieuse dans la mythologie animiste de l'ère préindustrielle de Caldari Prime. Sur le monde natal froid des Caldari, l'apparition de l'aurore était associée à des conditions météorologiques inhabituelles et à des migrations soudaines d'animaux. Les diverses nations de Gallente Prime possédaient leurs anciennes légendes autour des aurores polaires, mais dès l'époque des « Guerres de dirigeables », elles savaient que les aurores boréales n'étaient que le fruit d'interactions entre l'atmosphère, les champs magnétiques et les vents stellaires. Sur cette planète, l'observation des aurores boréales à bord d'un dirigeable vers les régions polaires de Gallente Prime est une attraction touristique très prisée. Persuadés que ce type de lumières est apparu lors des tempêtes qui ont ravagé Matar pendant le « Jour sombre » qui a annoncé l'invasion amarr, les Minmatar ont une approche quelque peu mitigée des aurores boréales. La plupart d'entre eux pensent que cette notion mélange les différents récits incomplets des événements de cette époque. Selon la vision traditionnelle des aurores polaires, du moins pour les tribus comme les Brutor et les Sebiestor, elles représentent un « rassemblement debout » ou un débat entre esprits tribaux. Lors du festival de Yoiul, les aurores des mondes de New Eden sont un rappel de l'histoire partagée des peuples de la galaxie et sont devenues un symbole pour certains de leurs liens universels les uns avec les autres.",
|
||||
"description_it": "Auroras, or polar lights, are a universal concept and shared experience among the peoples of New Eden. The heavily-populated terrestrial home planets are particularly noted for stories and myths involving these striking, dancing lights in the sky.\r\n\r\nTo the Amarr, the aurora are linked to ancient religious stories and are sometimes known as \"Sefrim Banners\", alluding to the angelic figures considered messengers from God. A tradition of the appearance of these lights heralding divine approval for the armies of Amarr during the Reclaiming of Athra is well attested.\r\n\r\nFor the Caldari, the polar lights are the enigmatic \"Flame Wind\", a mysterious force in the animistic mythology of Caldari Prime's pre-industrial era. On the cold Caldari home world, the appearance of the aurora was associated with unusual weather and sudden migrations of animals.\r\n\r\nThe various nations of Gallente Prime had their ancient legends about polar lights but knew the aurora to be an interaction of atmosphere, magnetic fields and stellar winds from the time of the \"Airship Wars\". Viewing aurora on airship trips to the polar regions of Gallente Prime is a popular tourist activity on the planet.\r\n\r\nThe Minmatar have a somewhat mixed viewpoint on aurora with some believing that such lights were seen during the storms that wracked Matar during the \"Day of Darkness\" that heralded the Amarr invasion. Most think this notion mixes up the fragmentary tales of what happened in those times and the traditional view of the polar lights, at least for tribes such as the Brutor and Sebiestor, is that they represent a \"standing place gathering\" or moot of tribal spirits.\r\n\r\nAt the time of the Yoiul Festival, the aurora lights of the worlds of New Eden are one reminder of the shared history of the people of the cluster and have becomes a symbol to some of their universal connections with one another.",
|
||||
"description_ja": "オーロラまたはポーラーライツと呼ばれる現象は、ニューエデンの住民が広く共有する普遍的概念である。多くの人々が母星としている星々は、この空に踊る衝撃的な光にまつわる物語や神話に満ちている。\r\n\r\nアマーにとって、オーロラは古代の宗教物語に関連するものであり、時には「セラフィムバナー」と呼ばれ、神の使者である天使の如き存在とみなされる。先駆けとして現れるこうした伝統的な光は神による軍の承認とみなされ、その効果はアスラ奪還戦においても証明されている。\r\n\r\nカルダリにとってポーラーライツは神の「炎の風」であり、カルダリプライムの神話代以前のアニミズム神話の神秘の軍勢である。カルダリの極寒の母星では、オーロラの出現は異常気象と動物の大移動の前触れを意味する。\r\n\r\nガレンテプライムの様々な国は、それぞれポーラーライツに関する伝説を持っていたが、オーロラは大気と磁場と「エアシップ戦争」以来の惑星風の干渉が原因で起こるということは知られていた。ガレンテプライムのエアシップ発着場からのオーロラ鑑賞は観光客に人気である。\r\n\r\nミンマターはオーロラに対して様々な見方を持っており、こうした光はアマーの侵略の前触れとなった「暗黒の日」において、嵐がマターを襲った際にも見られたと信じる者もいる。多くの者は、このような見方は当時の出来事の断片と、ポーラーライツに対する伝統的な考え方が混ざったものと考えている。少なくともブルトーやセビースターといった部族は、ポーラーライツは「永遠に続く集会」または部族の精霊が議論をする場だとみなしている。\r\n\r\nヨイウル祭では、ニューエデンの世界におけるオーロラは集団が共有する歴史を想起させるものであり、互いの普遍的繋がりを象徴するシンボルともなっている。",
|
||||
"description_ko": "오로라는 뉴에덴 전역의 행성에서 목격할 수 있는 자연 현상으로, '극광'이라고도 불립니다. 인구 밀도가 높은 지구형 행성에서는 하늘에서 춤추는 이 아름다운 빛에 관한 수많은 이야기와 전설이 전해져 내려옵니다.<br><br>아마르인들은 오로라를 고대부터 전해지는 종교적 설화와 연결 지어 바라봅니다. 신의 뜻을 전달하는 천사들의 모습에 빗대어 '세프림 배너즈'라 부르는 이들도 있습니다. 아스라 수복 당시 아마르 함대를 이끌었던 오로라의 빛은 오늘날까지도 신이 직접 내린 계시라 여겨집니다.<br><br>칼다리인들에게 오로라란 신비로운 ‘불꽃 바람’입니다. 산업화 이전의 칼다리 프라임 사회에 널리 퍼져 있었던 애니미즘 신화에서 이 불꽃 바람의 기원을 찾을 수 있습니다. 차디찬 칼다리의 모성에 거주하는 사람들에게 오로라는 흔히 이상 기후 및 동물 이주의 징조로 비춰졌습니다.<br><br>갈란테 프라임의 여러 국가는 저마다 오로라에 대한 전설을 가지고 있습니다. 다만 ‘비행선 전쟁’ 당시부터 오로라는 항성풍, 대기, 행성 자기장의 상호작용으로 인해 나타나는 자연현상임이 이미 밝혀진 상태였습니다. 갈란테 프라임 현지에서는 비행선을 타고 극지방을 비행하며 오로라를 감상하는 관광 상품이 매우 인기가 많습니다.<br><br>민마타인들은 오로라를 다양한 관점에서 바라봅니다. 아마르가 침공해 왔던 ‘어둠의 날’ 당시 마타르 행성을 휩쓸었던 폭풍과 함께 오로라가 나타났다고 믿는 민마타인들도 있습니다. 그러나 대부분은 당시 있었던 일들에 대한 기록이 드문드문 남아있는 것을 잘못 해석해서 그러한 견해가 나왔다고 여깁니다. 브루터 부족 및 세비에스터 부족 등 보다 전통적인 견해를 지닌 민마타인들의 말에 따르면 오로라는 선조들의 영혼이 ‘회합’하는 모습을 나타내는 것이라고 합니다.<br><br>요이얼 축제의 시기가 다가오면 오로라의 밝은 빛이 뉴에덴에 드리웁니다. 뉴에덴의 모든 이들이 함께해 온 역사의 상징이자 모두를 이어주는 연결고리입니다.",
|
||||
"description_ru": "Аврора, или северное сияние, занимает важное место в самых разных культурах Нового Эдема. У жителей густонаселённых планет земного типа есть множество историй и мифов, связанных с этими поразительными сполохами света, танцующими в небесах. Для амаррцев Аврора — часть древних религиозных сказаний; иногда они называют северное сияние знамёнами сефримов — ангелов и посланников бога. Доподлинно известно, что во время Войны за Атру амаррские армии считали появление этих таинственных огней в небе символом божественного благословения. Для калдарцев полярное сияние — это загадочный «Пламенный ветер», таинственная сила из мифологии Калдари Прайм доиндустриальной эпохи. На холодной центральной планете Государства Калдари появление Авроры всегда связывалось с погодными аномалиями и внезапными миграциями животных. Народы, населяющие Галленте Прайм, также хранят древние легенды о небесных огнях, однако они ещё со времён «Воздушных войн» знают, что это всего лишь эффектное природное явление, появляющееся в результате воздействия магнитных полей и звёздных ветров на атмосферу планеты. И всё же отрицать красоту этого явления нельзя, а поездки на воздушном судне в полярные районы планеты Галленте Прайм, где можно наблюдать за северным сиянием, и по сей день неизменно пользуются популярностью у туристов. У минматаров отношение к северному сиянию весьма неоднозначное. Некоторые из них уверены, что такие огни озаряли небо во время бури, обрушившейся на Матар в преддверии амаррского вторжения — тот день вошёл в историю как «День мрака». Большинство же считает, что такое мнение — не более чем смесь из обрывков рассказов о тех далёких временах и традиционных представлений о сущности полярного сияния. К примеру, племена бруторов и себьесторов считали, что Аврора представляет собрание племенных духов. Во время Йольского фестиваля небесные огни, озаряющие миры Нового Эдема, напоминают об общей истории всех его обитателей и служат символом, подчёркивающим их связь друг с другом.",
|
||||
"description_zh": "对新伊甸的居民来说,极光是一种常见的宇宙天象。尤其在那些人口稠密的首星上,更是流传着许多关于这种美丽眩目的景象的神话传说。在艾玛帝国,极光通常与古老的宗教故事联系在一起,有人称它为“瑟夫林的旗帜”,暗指传达神之旨意的信使。在阿提拉夺还之战中,艾玛军队将这种极光视为神的降临。对加达里人而言,极光象征着神秘的“烈焰之风”——加达里首星工业时代之前的精灵传说中一支神秘的军队。在寒冷的加达里首星上,极光的出现往往代表着极端天气或动物大迁徙的到来。自“飞艇大战”时代以来,盖伦特首星上的众多政体有着自己的关于极光的传说,但他们知道极光是一种大气现象,是磁场和星际风作用的产物。坐在飞艇上去看极光可是盖伦特首星上的热门旅游项目。米玛塔尔人对极光的感情则比较复杂。有些人相信在“黑暗时代”毁灭了玛塔尔的风暴中出现的极光预示着之后艾玛人的侵略,不过大多数人认为这种想法是对当时的一些只言片语的传说故事的曲解。而至少对布鲁特和赛毕斯托部族来说,对极光的传统看法是它象征着“部族英灵的聚集”。在尤尔节期间,新伊甸中的极光提醒着生活在宇宙中的人民对历史进行缅怀,并成为了许多人与他人之间的联系的象征。",
|
||||
"descriptionID": 697778,
|
||||
"groupID": 1950,
|
||||
"marketGroupID": 3540,
|
||||
"mass": 0.0,
|
||||
|
||||
@@ -3558,5 +3558,35 @@
|
||||
"locationRequiredSkillModifiers": [],
|
||||
"operationName": "PostPercent",
|
||||
"showOutputValueInUI": "ShowNormal"
|
||||
},
|
||||
"2405": {
|
||||
"aggregateMode": "Maximum",
|
||||
"developerDescription": "Insurgency Suppression Bonus: Interdiction Range",
|
||||
"displayName_de": "Reichweitenbonus auf Stasisnetz und Warpunterbrecher für Anti-Piraten",
|
||||
"displayName_en-us": "Webifier and scrambler range bonus for anti-pirates",
|
||||
"displayName_es": "Bonificación al alcance de la red ralentizadora y el distorsionador para antipiratas",
|
||||
"displayName_fr": "Bonus de portée de générateur de stase et d'inhibiteur pour les antipirates",
|
||||
"displayName_it": "Webifier and scrambler range bonus for anti-pirates",
|
||||
"displayName_ja": "対海賊勢力のウェビファイヤーとスクランブラーの射程ボーナス",
|
||||
"displayName_ko": "진압군 스테이시스 웹 생성기 및 워프 스크램블러 사거리 증가",
|
||||
"displayName_ru": "Бонус к дальности стазис-индуктора и варп-глушителя для борцов с пиратами",
|
||||
"displayName_zh": "反海盗势力的停滞缠绕光束和跃迁扰频器距离加成",
|
||||
"displayNameID": 698669,
|
||||
"itemModifiers": [],
|
||||
"locationGroupModifiers": [
|
||||
{
|
||||
"dogmaAttributeID": 54,
|
||||
"groupID": 65
|
||||
}
|
||||
],
|
||||
"locationModifiers": [],
|
||||
"locationRequiredSkillModifiers": [
|
||||
{
|
||||
"dogmaAttributeID": 54,
|
||||
"skillID": 3449
|
||||
}
|
||||
],
|
||||
"operationName": "PostPercent",
|
||||
"showOutputValueInUI": "ShowNormal"
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,10 @@
|
||||
[
|
||||
{
|
||||
"field_name": "client_build",
|
||||
"field_value": 2420589
|
||||
"field_value": 2443636
|
||||
},
|
||||
{
|
||||
"field_name": "dump_time",
|
||||
"field_value": 1699964528
|
||||
"field_value": 1701776227
|
||||
}
|
||||
]
|
||||
@@ -1 +1 @@
|
||||
version: v2.55.0
|
||||
version: v2.57.2
|
||||
|
||||