Compare commits

...

169 Commits

Author SHA1 Message Date
DarkPhoenix
21a9b779f3 Bump version 2023-12-07 19:27:18 +06:00
DarkPhoenix
b8dc55a3a6 Fix HTML export 2023-12-07 18:51:18 +06:00
DarkPhoenix
b7a5b33ff6 Ensure ints are passed to SetDeviceOrigin() 2023-12-06 22:47:59 +06:00
DarkPhoenix
3593d16bd1 Ensure ints are passed to Scale() 2023-12-06 21:19:00 +06:00
DarkPhoenix
57830fd5a5 Bump version 2023-12-06 08:58:33 +06:00
DarkPhoenix
313d793175 Remove debug print 2023-12-06 08:58:17 +06:00
DarkPhoenix
f8e20e23bb Restore debugging in pyfa 2023-12-06 08:35:53 +06:00
DarkPhoenix
1959681250 Attempt to workaround appimage builder issue 2023-12-06 08:35:32 +06:00
DarkPhoenix
0192c77df1 Give up on debugging XDG_DATA_DIRS since it's appimage-builder bug 2023-12-06 08:08:48 +06:00
DarkPhoenix
b709629d7b Try defining substitution without dollar sign 2023-12-06 07:28:07 +06:00
DarkPhoenix
3071aead5c Remove escaping from xdg variable 2023-12-06 06:55:11 +06:00
DarkPhoenix
3f2df69022 Add print to debug XDG issues 2023-12-06 06:35:49 +06:00
DarkPhoenix
e9a48817a7 Try to "escape" xdg variable 2023-12-06 05:30:36 +06:00
DarkPhoenix
ed19ea5f2f Downgrade pyinstaller 1 step 2023-12-06 04:51:33 +06:00
DarkPhoenix
19366a09b4 Exclude some icon resources from linux build 2023-12-06 04:51:14 +06:00
DarkPhoenix
f8f01cd63c Round numbers in calls to bitmaps 2023-12-06 04:19:34 +06:00
DarkPhoenix
21a0e2b9c5 Remove unused import 2023-12-06 02:59:20 +06:00
DarkPhoenix
0ba8ba33ef Append bundled share path to XDG_DATA_DIRS 2023-12-06 02:26:21 +06:00
DarkPhoenix
346184d06a Set default XDG_DATA_DIRS for linux build 2023-12-06 02:00:36 +06:00
DarkPhoenix
46fc9e65bb Do minor file cleanup 2023-12-06 01:44:28 +06:00
DarkPhoenix
2d51da4d02 Update pot file 2023-12-05 19:18:02 +06:00
DarkPhoenix
b5e77415cf Bump version 2023-12-05 18:34:14 +06:00
DarkPhoenix
4c75daf36c Add icons 2023-12-05 18:33:25 +06:00
DarkPhoenix
4a120b8abf Update static data and effects 2023-12-05 18:32:15 +06:00
DarkPhoenix
fc43510fbc Merge remote-tracking branch 'origin/master' 2023-12-05 17:46:03 +06:00
Anton Vorobyov
28c7ff54aa Merge pull request #2485 from kols/fix-proxy-proto-strip
fix proxy proto string strip
2023-12-05 15:11:23 +04:00
DarkPhoenix
89f1e0a126 Remove all the things which are handled by AppImage builder now 2023-12-05 16:36:09 +06:00
DarkPhoenix
b6ff1cada9 Pin current versions of dependencies 2023-12-05 16:17:10 +06:00
DarkPhoenix
cc0d6465d6 Do not crash on failure to fetch localization percentage 2023-12-05 15:31:18 +06:00
DarkPhoenix
c49a914584 Fix crowdin script error printing 2023-12-05 15:26:34 +06:00
DarkPhoenix
e6e6568571 Fix path to certificate bundle 2023-12-05 02:10:27 +06:00
DarkPhoenix
7120000202 Bundle svg image loader lib for linux 2023-12-05 01:36:52 +06:00
DarkPhoenix
c3f7078053 Bundle webkit lib for linux 2023-12-05 01:06:24 +06:00
DarkPhoenix
b70f02fa3e Bump version 2023-12-05 00:17:51 +06:00
DarkPhoenix
8d893ce648 Replace tiff/jpg libs by full GTK package 2023-12-05 00:01:10 +06:00
DarkPhoenix
c230480464 Do not modify package after it was built 2023-12-04 23:11:34 +06:00
DarkPhoenix
da7a4a2df0 Bundle certificates with AppImage 2023-12-04 17:28:18 +06:00
DarkPhoenix
62bde4b8c9 Bump version 2023-12-04 16:35:05 +06:00
DarkPhoenix
43967b70ae Add tiff lib 2023-12-04 15:58:21 +06:00
DarkPhoenix
782c007200 Add libjpeg dependency 2023-12-04 08:51:17 +06:00
DarkPhoenix
5812d333d9 Keep pyfa source in /opt/ 2023-12-04 08:36:00 +06:00
DarkPhoenix
c461bf469e Adjust path to artifact 2023-12-04 08:18:12 +06:00
DarkPhoenix
d5c8c92b48 Build linux binaries first 2023-12-04 08:08:47 +06:00
DarkPhoenix
1abffd6c5d Fix file extension 2023-12-04 08:08:00 +06:00
DarkPhoenix
a824cc5e48 Fix path to python, and disable debugging once again 2023-12-04 08:06:18 +06:00
DarkPhoenix
db7afffd65 Re-enable debugging again 2023-12-04 07:42:22 +06:00
DarkPhoenix
4d02a1292f A few minor fixes, and disable ssh 2023-12-04 07:16:12 +06:00
DarkPhoenix
00f72294d4 Fix variable name 2023-12-04 06:55:52 +06:00
DarkPhoenix
0d45be0597 Add missing dependency 2023-12-04 06:52:57 +06:00
DarkPhoenix
f60090fc79 Move lots of preprocessing out of appimg recipe (to support calculation of app version) 2023-12-04 06:39:28 +06:00
DarkPhoenix
713807df13 Get pip since provided python doesn't have it 2023-12-04 05:53:30 +06:00
DarkPhoenix
c020bd8898 More progress on linux build job 2023-12-04 05:29:11 +06:00
DarkPhoenix
39ee8586d4 Do build process using system interpreter, then install dependencies into bundled one 2023-12-04 04:59:04 +06:00
DarkPhoenix
653a1585dc Use appdir variable instead of "hardcoded" path 2023-12-04 04:03:01 +06:00
DarkPhoenix
2dcf011020 Move script to execute after runtime 2023-12-04 02:26:45 +06:00
DarkPhoenix
555e72a27a Another attempt to bundle python with appimg 2023-12-04 00:57:09 +06:00
DarkPhoenix
85e740d75a Add keys to repositories 2023-12-03 23:41:47 +06:00
DarkPhoenix
d604ed300a Fetch full repo right away 2023-12-03 22:15:05 +06:00
DarkPhoenix
3aea4e5f23 Remove empty section 2023-12-03 21:50:51 +06:00
DarkPhoenix
a54adddc74 Use python package from repo 2023-12-03 21:50:35 +06:00
DarkPhoenix
dda397fea3 Use AppDir variable instead of BuildDir 2023-12-03 17:03:31 +06:00
Anton Vorobyov
3cd718350e Merge pull request #2545 from Grange-Nagy/dep_facelift
fix infinite redraws on macos
2023-12-03 14:01:38 +04:00
Grange Nagy
e87860a700 Merge branch 'pyfa-org:dep_facelift' into dep_facelift 2023-12-03 02:24:54 -05:00
Grange Nagy
451d21eaa0 let go of drag object 2023-12-03 02:24:13 -05:00
Grange Nagy
718f9ef859 allow fit drag bmp to be smaller 2023-12-03 02:18:51 -05:00
Grange Nagy
193adc4ba5 fix fit drag bitmap causing redraws on macos 2023-12-03 01:47:32 -05:00
Grange Nagy
cdfa52e9ed remove drag rendering entirely for now 2023-12-02 21:53:31 -05:00
Anton Vorobyov
2752b288ad Merge pull request #2544 from Grange-Nagy/dep_facelift
fix runtime bitmap scaling error on macos sonoma
2023-12-03 06:49:06 +04:00
DarkPhoenix
8dce968780 Add one dependency just to detect bundle arch 2023-12-03 08:46:12 +06:00
Grange Nagy
b889da7e68 fix runtime bitmap scaling error on mac 2023-12-02 18:09:02 -05:00
DarkPhoenix
0dd7dea708 More work on new appimage build process 2023-12-02 11:16:31 +06:00
DarkPhoenix
8af1c8da7d Add script which extracts config values 2023-12-02 01:09:46 +06:00
DarkPhoenix
8d4f83156d Strip python appimage from linux build 2023-12-01 18:44:46 +06:00
DarkPhoenix
798bdf3fe0 Enable SSH for debugging 2023-12-01 17:25:42 +06:00
DarkPhoenix
a7cf4aab76 Specify architecture 2023-12-01 03:43:36 +06:00
DarkPhoenix
d910e324f3 Specify apt architecture 2023-12-01 01:49:01 +06:00
DarkPhoenix
d800db5ccb Do not specify package name 2023-12-01 00:56:56 +06:00
DarkPhoenix
6c5d0a3e4f Try to make use of AppImageBuilder for linux 2023-12-01 00:41:00 +06:00
DarkPhoenix
9389a0421f Merge branch 'master' into dep_facelift 2023-12-01 00:13:09 +06:00
DarkPhoenix
6f3ab6cee8 Remove evemarketer price source, add evetycoon 2023-12-01 00:11:50 +06:00
DarkPhoenix
258dcd49a0 Merge branch 'master' into dep_facelift 2023-11-30 23:05:34 +06:00
DarkPhoenix
5f0320d1e3 Bump version 2023-11-30 22:59:01 +06:00
DarkPhoenix
54052899f9 Add new suppression effect as dark code (looks like it's not active yet) 2023-11-30 22:58:22 +06:00
DarkPhoenix
eda53e9318 Merge branch 'master' into dep_facelift 2023-11-30 22:32:43 +06:00
DarkPhoenix
4d8a891fd8 Update effects 2023-11-30 22:32:04 +06:00
DarkPhoenix
2d4b97afe6 Update renders 2023-11-30 17:55:01 +06:00
DarkPhoenix
49d1ec17e8 Update static data to 2438956 2023-11-30 17:53:30 +06:00
DarkPhoenix
cfecacacf9 Add appimagebuilder spec file 2023-11-30 17:39:10 +06:00
DarkPhoenix
a9112c04a3 Set it up to debug manually 2023-11-30 06:44:13 +06:00
DarkPhoenix
5f2a74691c Fix python appimage download command 2023-11-30 06:23:25 +06:00
DarkPhoenix
17c22df0f4 Update debug key 2023-11-30 06:08:39 +06:00
DarkPhoenix
c53bc82929 Try out new package tool 2023-11-30 05:51:45 +06:00
DarkPhoenix
7113f41b9a Try adding libjpeg (current appimage fails to launch due to this dep) 2023-11-30 05:02:58 +06:00
DarkPhoenix
aa66d63085 Do not hardcode python version for startup script 2023-11-30 04:28:49 +06:00
DarkPhoenix
140ee70dc3 Update python appimage 2023-11-30 03:50:18 +06:00
DarkPhoenix
5023a6cbae Try to fix binary distributive of wx on linux 2023-11-30 03:20:56 +06:00
DarkPhoenix
aafa77baed Try to fix binary distributive of wx on linux 2023-11-30 02:48:51 +06:00
DarkPhoenix
16dabd57ca Attempt to fix macos pyinstaller 2023-11-30 02:10:48 +06:00
DarkPhoenix
8668d2dd55 Try to fix binary distributive of wx on linux 2023-11-30 02:09:52 +06:00
DarkPhoenix
5c5f37a9ae Use binary distributive of wx on linux 2023-11-30 00:19:15 +06:00
DarkPhoenix
621c36f1cd Use newer pyinstaller on macos 2023-11-29 23:27:17 +06:00
DarkPhoenix
be2cc523c2 Fix skill level suffix 2023-11-29 23:03:32 +06:00
DarkPhoenix
bd83c403a1 Fix spec file again 2023-11-29 22:51:10 +06:00
DarkPhoenix
043f533a10 Move contents-directory specification to spec file 2023-11-29 22:31:09 +06:00
DarkPhoenix
57a23affd0 Adapt to changes in pyinstaller 2023-11-29 21:47:16 +06:00
DarkPhoenix
b678152ac6 Change pyinstaller command for windows 2023-11-29 20:50:14 +06:00
DarkPhoenix
747bbc8200 Revert to python 3.11 2023-11-29 20:36:25 +06:00
DarkPhoenix
871cf42d88 Fix crowdin script on newer python versions 2023-11-29 20:16:17 +06:00
DarkPhoenix
28533d60d3 Update appveyor images 2023-11-29 20:07:39 +06:00
DarkPhoenix
ca12b3c94f Pin older sqlalchemy 2023-11-29 20:01:44 +06:00
DarkPhoenix
81e449dd83 Merge branch 'master' into dep_facelift 2023-11-14 20:13:50 +06:00
DarkPhoenix
9b216b5d48 Merge branch 'master' into dep_facelift 2023-11-14 18:54:35 +06:00
DarkPhoenix
061ab27286 Merge branch 'singularity' into dep_facelift 2023-11-13 21:45:51 +06:00
DarkPhoenix
6d13ab8bcb Merge branch 'master' into dep_facelift 2023-10-31 00:06:47 +06:00
DarkPhoenix
115ea9a36c Merge branch 'master' into dep_facelift 2023-10-31 00:02:35 +06:00
DarkPhoenix
c56f274a5f Merge branch 'singularity' into dep_facelift 2023-10-23 06:46:36 +06:00
DarkPhoenix
96214eaa27 Merge branch 'singularity' into dep_facelift 2023-10-19 05:46:01 +06:00
DarkPhoenix
2fef60eaaa Merge branch 'master' into dep_facelift 2023-10-10 02:59:39 +06:00
DarkPhoenix
807622a1ec Merge branch 'master' into dep_facelift 2023-09-19 23:56:38 +03:00
DarkPhoenix
d126b62d63 Merge branch 'master' into dep_facelift 2023-09-10 17:30:53 +06:00
DarkPhoenix
9e50de96f3 Merge branch 'master' into dep_facelift 2023-09-10 17:27:49 +06:00
DarkPhoenix
e67083a79b Add effects for new AT ships 2023-09-10 09:11:42 +06:00
DarkPhoenix
b103e576d2 Merge branch 'master' into dep_facelift 2023-09-10 08:42:32 +06:00
DarkPhoenix
b472adb404 Merge branch 'master' into dep_facelift 2023-06-14 01:09:58 +06:00
DarkPhoenix
7e5150be8c Merge branch 'master' into dep_facelift 2023-06-14 01:05:32 +06:00
DarkPhoenix
261d510ccb Merge branch 'master' into dep_facelift 2023-06-13 22:07:40 +06:00
DarkPhoenix
858b0b243a Merge branch 'singularity' into dep_facelift 2023-06-11 06:41:09 +06:00
DarkPhoenix
53385f2458 Merge branch 'singularity' into dep_facelift 2023-06-11 04:28:36 +06:00
DarkPhoenix
7d3371c379 Merge branch 'singularity' into dep_facelift 2023-06-11 00:29:49 +06:00
Anton Vorobyov
d94116ea1c Merge branch 'master' into dep_facelift 2023-05-23 01:11:07 +06:00
kane
5d95663f63 fix proxy proto string strip 2022-11-28 14:20:23 +08:00
DarkPhoenix
b21b756fa6 Merge branch 'singularity' into dep_facelift 2022-10-25 01:53:45 +04:00
DarkPhoenix
492adb4dfd Merge branch 'singularity' into dep_facelift 2022-10-25 01:33:18 +04:00
DarkPhoenix
5fa7b2c86a Merge branch 'master' into dep_facelift 2022-10-23 10:19:39 +04:00
DarkPhoenix
f6120f09ac Bump version 2022-10-23 07:58:00 +04:00
DarkPhoenix
4995c7994f Merge branch 'master' into dep_facelift 2022-10-22 21:36:54 +04:00
DarkPhoenix
620ce89a05 Merge branch 'master' into dep_facelift 2022-10-21 23:09:03 +04:00
DarkPhoenix
73dc056e61 Fix creating of new implant sets / damage patterns / target profiles on new wx 2022-10-21 07:21:57 +04:00
DarkPhoenix
97625d11ab Merge branch 'master' into dep_facelift 2022-10-15 07:12:26 +04:00
DarkPhoenix
21bd4272d9 Merge branch 'master' into dep_facelift 2022-09-30 20:52:40 +04:00
DarkPhoenix
332c91d661 Merge branch 'master' into dep_facelift 2022-09-30 20:50:36 +04:00
DarkPhoenix
719125657f Merge branch 'master' into dep_facelift 2022-09-30 17:50:31 +04:00
DarkPhoenix
9621a54257 Merge branch 'master' into dep_facelift 2022-09-30 16:50:07 +04:00
DarkPhoenix
bfc580cf7c Merge branch 'master' into dep_facelift 2022-08-29 15:49:54 +04:00
DarkPhoenix
fd2f76ee41 Merge branch 'master' into dep_facelift 2022-08-29 02:53:09 +04:00
DarkPhoenix
9e01d15e60 Merge branch 'master' into dep_facelift 2022-08-29 02:32:12 +04:00
DarkPhoenix
23ee164a76 Merge branch 'master' into dep_facelift 2022-07-13 00:58:29 +04:00
DarkPhoenix
99ddc36027 Merge branch 'master' into dep_facelift 2022-07-10 02:52:44 +04:00
DarkPhoenix
a33f48a83b Merge branch 'master' into dep_facelift 2022-07-04 22:32:43 +04:00
DarkPhoenix
11c060103a Merge branch 'master' into dep_facelift 2022-07-04 05:55:43 +04:00
DarkPhoenix
ac6b6f70eb Merge branch 'master' into dep_facelift 2022-07-04 05:24:52 +04:00
DarkPhoenix
baf10b24d6 Merge branch 'master' into dep_facelift 2022-07-04 04:09:49 +04:00
DarkPhoenix
0ab485115c Merge branch 'master' into dep_facelift 2022-06-27 01:13:26 +04:00
DarkPhoenix
f8895a14c5 Merge branch 'master' into dep_facelift 2022-05-05 21:54:14 +04:00
DarkPhoenix
22eabcea8d Merge branch 'master' into dep_facelift 2022-05-05 21:17:17 +04:00
DarkPhoenix
ccd3498594 Even more fixes for silent coercion, which is no more 2022-05-05 18:41:17 +04:00
DarkPhoenix
71d088b90a More fixes for silent coercion, which is no more 2022-04-24 02:19:26 +04:00
DarkPhoenix
17712d8b7d More fixes for silent coercion, which is no more 2022-04-20 15:58:46 +04:00
DarkPhoenix
4a224ea9a5 Fix preferences panel 2022-04-20 15:25:52 +04:00
DarkPhoenix
6664b5620a Fix type casts for graphs
See #2391 for more info
2022-04-20 15:23:03 +04:00
DarkPhoenix
a98e898bd8 Cast coordinates passed to various wx objects into ints
See #2391 for more info
2022-04-20 02:12:46 +04:00
DarkPhoenix
e98ae5de39 Cast colors into ints before passing to wx
See #2391 for more info
2022-04-20 01:26:52 +04:00
DarkPhoenix
a51fbbc238 Merge branch 'master' into dep_facelift
# Conflicts:
#	.appveyor.yml
#	requirements.txt
2022-04-20 00:42:04 +04:00
DarkPhoenix
f9b4c7b5ea Merge branch 'singularity' into dep_facelift 2022-03-01 13:23:03 +03:00
DarkPhoenix
4e83f52532 Silence more SQLAlchemy warnings 2022-02-22 23:54:33 +03:00
DarkPhoenix
ec0b543393 Silence some of SQLAlchemy warnings 2022-02-22 23:45:09 +03:00
DarkPhoenix
cff94a12ee Set a few gamedata relations view-only
New sqlalchemy complains about them, and we never set them via those relations anyway
2022-02-22 01:12:02 +03:00
DarkPhoenix
da39975ba8 Update requirements specified in CI specification 2022-02-21 23:26:27 +03:00
DarkPhoenix
82515343ee Update requirements to "latest" version of every package 2022-02-21 23:00:25 +03:00
94 changed files with 9719 additions and 2355 deletions

View File

@@ -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

View File

@@ -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')

View 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'

View File

@@ -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 "$@"

View File

@@ -1,3 +0,0 @@
#! /bin/bash
${APPDIR}/usr/bin/python3.7 -s "${APPDIR}/opt/pyfa/pyfa.py" "$@"

View File

@@ -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>

View File

@@ -1,7 +0,0 @@
[Desktop Entry]
Type=Application
Name=Pyfa
Exec=pyfa
Comment=Python Fitting Assistant for EVE: Online
Icon=python
Categories=Game;

View File

@@ -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'),
}
)

View File

@@ -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]

View File

@@ -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")

View File

@@ -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
)
}

View File

@@ -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,

View File

@@ -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)

View File

@@ -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):

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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):

View File

@@ -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()

View File

@@ -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)

View File

@@ -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)

View File

@@ -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))
# =============================================================================

View File

@@ -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()

View File

@@ -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)

View File

@@ -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))

View File

@@ -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)

View File

@@ -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:

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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:

View File

@@ -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):

View File

@@ -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))

View File

@@ -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()

View File

@@ -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)

View File

@@ -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()

View File

@@ -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()

View File

@@ -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)

View File

@@ -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))

View File

@@ -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)

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 780 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 829 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 783 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 825 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -92,7 +92,8 @@ exe = EXE(
upx=upx,
icon= icon,
# version='win-version-info.txt',
console=False
console=False,
contents_directory='app',
)
coll = COLLECT(

View File

@@ -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

View File

@@ -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)

View 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"

View File

@@ -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

View File

@@ -88,7 +88,7 @@ class Fit:
"enableGaugeAnimation": True,
"openFitInNew": False,
"priceSystem": "Jita",
"priceSource": "evemarketer",
"priceSource": "fuzzwork market",
"showShipBrowserTooltip": True,
"marketSearchDelay": 250,
"ammoChangeAll": False,

View File

@@ -1 +1 @@
__all__ = ['evemarketer', 'evemarketdata', 'fuzzwork', 'cevemarket']
__all__ = ['evetycoon', 'evemarketdata', 'fuzzwork', 'cevemarket']

View File

@@ -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)

View 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)

View File

@@ -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

View File

@@ -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

View File

@@ -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
}
}

View File

@@ -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,

View File

@@ -12112,5 +12112,8 @@
},
"25849": {
"iconFile": "res:/ui/texture/icons/84_64_15.png"
},
"25862": {
"iconFile": "res:/ui/texture/icons/26_64_5.png"
}
}

View File

@@ -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
}

View File

@@ -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
},

View File

@@ -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": []

View File

@@ -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": []

File diff suppressed because it is too large Load Diff

View File

@@ -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,

View File

@@ -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,

View File

@@ -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": "エンフォーサー",

View File

@@ -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,

File diff suppressed because it is too large Load Diff

View File

@@ -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"
}
}

View File

@@ -1,10 +1,10 @@
[
{
"field_name": "client_build",
"field_value": 2420589
"field_value": 2443636
},
{
"field_name": "dump_time",
"field_value": 1699964528
"field_value": 1701776227
}
]

File diff suppressed because it is too large Load Diff

View File

@@ -1 +1 @@
version: v2.55.0
version: v2.57.2