Compare commits

...

88 Commits

Author SHA1 Message Date
DarkPhoenix
be07d8e338 Bump version 2022-10-26 21:57:32 +04:00
DarkPhoenix
242fbba6d6 Update staticdata to 2143320 2022-10-26 21:57:00 +04:00
DarkPhoenix
7f1e0fcc58 Bump version 2022-10-25 01:53:07 +04:00
DarkPhoenix
072a53eabc Fix a couple of effects 2022-10-25 01:51:18 +04:00
DarkPhoenix
3115268fb8 Implement effect changes 2022-10-25 01:32:52 +04:00
DarkPhoenix
0631bd65e1 Update static data to 2141324 and update effect doctrings 2022-10-24 22:19:23 +04:00
DarkPhoenix
6b7a4b3f9d Bump appimage version 2022-10-23 08:27:05 +04:00
DarkPhoenix
0ba65cab1f Bump version 2022-10-23 08:02:38 +04:00
Anton Vorobyov
d75419d858 Merge pull request #2470 from pyfa-org/crowdin_master
New Crowdin updates
2022-10-22 20:35:35 +03:00
DarkPhoenix
771dfca1c8 Remove obsolete invasion-related system-wide effects and move destructible beacons one level above 2022-10-22 21:34:36 +04:00
DarkPhoenix
73a5f62d90 Update static data & effects to 2138646 2022-10-21 23:08:02 +04:00
Anton Vorobyov
3982670dff New translations lang.pot (Japanese) 2022-10-21 21:43:38 +03:00
Anton Vorobyov
79d2ded836 New translations lang.pot (Japanese) 2022-10-20 21:38:33 +03:00
Anton Vorobyov
55bc0cd40f New translations lang.pot (Japanese) 2022-10-19 21:11:18 +03:00
Anton Vorobyov
9da09a279e New translations lang.pot (Japanese) 2022-10-17 06:43:14 +03:00
Anton Vorobyov
889047f891 New translations lang.pot (Japanese) 2022-10-16 06:14:15 +03:00
DarkPhoenix
8f645fa425 Sort drone/fighter export the same was as in the additions panel 2022-10-15 07:12:12 +04:00
DarkPhoenix
e3e7f92b8d Add missing renders 2022-09-30 20:52:17 +04:00
DarkPhoenix
22f37995cf Bump appimage version 2022-09-30 19:25:43 +04:00
DarkPhoenix
92119c01f6 Change item comparison highlight implementation 2022-09-30 19:03:43 +04:00
DarkPhoenix
95841c44dc Remove eve.db which slipped in with the merge 2022-09-30 17:47:38 +04:00
Anton Vorobyov
e7b3040c0f Merge pull request #2466 from yeaido/feature/compare_highlight
Feature/compare highlight
2022-09-30 16:40:43 +03:00
DarkPhoenix
78af68cac2 Fix #2467 2022-09-30 17:37:20 +04:00
DarkPhoenix
3e5eb989f9 Bump version 2022-09-30 16:49:37 +04:00
DarkPhoenix
975d6f8776 Update images 2022-09-30 16:48:58 +04:00
DarkPhoenix
4e89a87ec1 Update effects 2022-09-30 16:43:05 +04:00
DarkPhoenix
eef644fb4c Update static data to 2123216 2022-09-30 13:56:52 +04:00
yeaido
8131dd4ace tidy 2022-09-05 08:12:57 +01:00
yeaido
c8059d6132 format 2022-09-04 20:18:11 +01:00
yeaido
cc008a57e1 vscode ignore 2022-09-04 20:16:47 +01:00
yeaido
ce6910fd63 Added highlight feature to the compare item window. Double click and item to highlight and bold it. 2022-09-04 12:32:07 +01:00
DarkPhoenix
7892e637b2 Force min query limit to be 1 for CJK languages in the market browser too 2022-08-29 15:33:47 +04:00
DarkPhoenix
6543a2c225 Revert "Use binary distribution of wx for appimage build"
This reverts commit 1e59d3d6ac.
2022-08-29 15:22:32 +04:00
DarkPhoenix
1e59d3d6ac Use binary distribution of wx for appimage build 2022-08-29 14:36:15 +04:00
DarkPhoenix
11d0566433 Bump version 2022-08-29 02:52:48 +04:00
DarkPhoenix
b8d84d3af2 Add new name conversions 2022-08-29 02:51:55 +04:00
DarkPhoenix
1831fea819 Update effects file 2022-08-29 02:50:00 +04:00
DarkPhoenix
d15322a57c Update static data to 2099371 2022-08-29 02:37:11 +04:00
DarkPhoenix
48981460ab Add drone EHP and shield regen columns 2022-08-29 01:56:15 +04:00
Anton Vorobyov
eaca4a179f Merge pull request #2461 from wereii/fix-appimage
Fix AppImage build
2022-08-28 21:10:18 +03:00
wereii
e249cf917b Fix AppImage build 2022-08-15 17:24:47 +02:00
DarkPhoenix
1de7a4ea82 Update static data to 2073715 2022-07-12 23:42:51 +04:00
DarkPhoenix
289acc099c Fix electropunch damage profile 2022-07-11 03:07:29 +04:00
DarkPhoenix
ce3678debb Fix a couple of effects 2022-07-10 02:50:00 +04:00
DarkPhoenix
0e36794578 Use raw attribute value for maxGroupFitted restriction 2022-07-10 02:49:44 +04:00
DarkPhoenix
6d67b23a7e Update static data to 2072413 2022-07-09 15:39:25 +04:00
DarkPhoenix
a95d69623b Hide mining blitz boosters 2022-07-04 22:22:12 +04:00
DarkPhoenix
7578532949 Update effects' definitions 2022-07-04 05:52:43 +04:00
DarkPhoenix
a067c77c4c Forcefully publish AIR boosters 2022-07-04 05:46:49 +04:00
DarkPhoenix
c6dd22f04f Bump version 2022-07-04 05:24:30 +04:00
DarkPhoenix
2e1f53184a Merge branch 'master' of github.com:pyfa-org/Pyfa 2022-07-04 05:24:13 +04:00
Anton Vorobyov
3159d399a6 Merge pull request #2452 from sajuukthanatoskhar/EFS_BurstJammer_Optimal_Not_Showing
Issue 2450 : ECM Burst Jammers burst range is 0 when exported to EFS
2022-07-04 04:09:38 +03:00
Anton Vorobyov
357dab2964 Merge pull request #2451 from sajuukthanatoskhar/Issue2425
Issue 2425 : Remote Capacitor Transmitters not being correctly written in EFS format
2022-07-04 03:43:53 +03:00
Anton Vorobyov
41c93efd83 Merge pull request #2441 from pyfa-org/crowdin_master
New Crowdin updates
2022-07-04 03:27:24 +03:00
DarkPhoenix
628aa9d905 Update static data to 2069533 2022-07-04 03:45:02 +04:00
DarkPhoenix
f9248dec6f Update effects' descriptions 2022-06-27 01:10:59 +04:00
DarkPhoenix
9d5ea487d5 Update static data to 2064776 2022-06-27 01:01:34 +04:00
DarkPhoenix
e76ce71701 Fix expanded cargohold penalty 2022-06-27 00:44:54 +04:00
Sajuukthanatoskhar
5a91e01746 MOD: version upped to 0.06
ADD: Added Remote Capacitor Transmitters!
2022-06-19 12:56:19 +02:00
Sajuukthanatoskhar
355e6dd0fe MOD: version upped to 0.06
FIX: Added check to correct add the burst jammer's burst radius
2022-06-19 12:45:16 +02:00
Anton Vorobyov
49da362dc3 New translations lang.pot (Chinese Simplified) 2022-06-13 13:20:08 +03:00
Anton Vorobyov
460cf26236 New translations lang.pot (Chinese Simplified) 2022-05-08 19:40:32 +03:00
blitzmann
cceaed8d61 rename gh_pages -> docs 2022-05-08 12:34:00 -04:00
Ryan Holmes
d9df4958a6 Merge pull request #2440 from pyfa-org/merge-gh-pages
Merge gh pages
2022-05-08 12:32:07 -04:00
blitzmann
e43e7ba51e move gh pages files to subdirectory 2022-05-08 12:31:47 -04:00
blitzmann
50e76deab7 Merge branch 'gh-pages' into merge-gh-pages 2022-05-08 12:30:05 -04:00
blitzmann
e109cce36b Update the callback to always allow the code to be shown 2022-05-07 22:44:51 -04:00
Anton Vorobyov
893f9f8467 Merge pull request #2424 from pyfa-org/issue2402
Add option in settings to disregard JWT exp issues
2022-05-05 20:53:49 +03:00
DarkPhoenix
c612545636 Bump version 2022-05-05 21:43:44 +04:00
DarkPhoenix
4fe729c512 Move Bobook to limited issue ships 2022-05-05 21:43:09 +04:00
DarkPhoenix
a7d52c9fc2 Update icons 2022-05-05 21:15:58 +04:00
DarkPhoenix
207e9018a8 Update effects 2022-05-05 21:12:17 +04:00
DarkPhoenix
a9598d4fc9 Update static data 2022-05-05 19:35:51 +04:00
Ryan Holmes
60015fb3b8 Merge branch 'master' into issue2402 2022-05-03 13:31:29 -04:00
DarkPhoenix
ebd7a1a4ad Fix lock amount effect 2022-04-08 21:45:25 +03:00
DarkPhoenix
63c9d98e3f Bump version 2022-04-05 21:20:52 +03:00
DarkPhoenix
14aafef866 Update effects 2022-04-05 21:20:16 +03:00
DarkPhoenix
55d6bb57d6 Process renames 2022-04-05 18:00:47 +03:00
DarkPhoenix
4bb71dbdb8 Update effects 2022-04-05 17:29:01 +03:00
DarkPhoenix
c9117c2a73 Merge branch 'master' of github.com:pyfa-org/Pyfa 2022-04-05 17:04:17 +03:00
DarkPhoenix
0a193939ed Update static data to 2027534 2022-04-05 17:03:42 +03:00
Anton Vorobyov
a0a27720ef Merge pull request #2426 from nmalaguti/feature/fix-readme-linux-standalone
Update README for self-contained Linux AppImage.
2022-04-03 17:19:08 +03:00
Nick Malaguti
d38417de9e Update README for self-contained Linux AppImage.
Also update OS X to macOS.
2022-04-01 21:50:40 -04:00
Ryan Holmes
9dc18ac81b Add option in settings to disregard JWT exp issues 2022-03-30 15:17:11 -04:00
Ryan Holmes
2731e9962b Implement pyfa callback 2021-10-19 00:13:21 -04:00
Ryan Holmes
76536a5dcc Create callback.html 2021-10-16 12:56:11 -04:00
Ryan Holmes
41d6828024 Create index.md 2021-10-16 12:53:08 -04:00
Ryan Holmes
bf4b4ab3c0 Set theme jekyll-theme-midnight 2021-10-16 12:49:45 -04:00
162 changed files with 255423 additions and 104793 deletions

View File

@@ -11,7 +11,7 @@ for:
environment:
APPVEYOR_SSH_KEY: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJDW/+oYNGOiPvwuwAL9tc/LQgg58aosIVpMYfepQZ20V+VZnHpZh8IRDA8Jo5xht19p2PksA+hFgqA0kpKtrSkuiWdE8rATQItfk4gf7yB0yGasJGGQZYazy9k/9XtmYkq2HHOOeEqdxvrICddJQ88MLCLT9lJENSUP/YS/yGcjZFXVxE11pTeIcqlCRU+3eYa1v7BeNvXIKNhZoK5orXWrtuH3cy8jrSns/u70aYfJ6B2jA8CnWnDbuvpeQtEY61SQqlKUsSArNa8NAsXj41wr3Ar9gAG9330w7EMTqlutk8HZO35uHI0q5qinUhaQYufPPrVkb2L/N+ZCfu0fnh appveyor"
APPIMAGE_TOOL: appimagetool-x86_64.AppImage
PYTHON_APPIMAGE: python3.7.13-cp37-cp37m-manylinux2014_x86_64.AppImage
PYTHON_APPIMAGE: python3.7.15-cp37-cp37m-manylinux2014_x86_64.AppImage
DEPLOY_DIR: AppDir/opt/pyfa
# APPVEYOR_SSH_BLOCK: true
cache:
@@ -33,11 +33,14 @@ for:
- 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 ../
@@ -53,9 +56,10 @@ for:
# 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 org.pyfa.pyfa.appdata.xml ../../build/AppDir/usr/share/metainfo/
- sh: cp pyfa.appdata.xml ../../build/AppDir/usr/share/metainfo/
- sh: chmod +x pyfa && cp pyfa ../../build/AppDir/usr/bin
- sh: cd ../../
@@ -211,4 +215,4 @@ for:
force_update: false
# deploy on tag push only
on:
APPVEYOR_REPO_TAG: true
APPVEYOR_REPO_TAG: true

4
.gitignore vendored
View File

@@ -90,6 +90,7 @@ target/
# pyenv
.python-version
PyfaEnv/
# celery beat schedule file
celerybeat-schedule
@@ -123,3 +124,6 @@ gitversion
*.fsdbinary
/locale/progress.json
# vscode settings
.vscode

View File

@@ -6,22 +6,25 @@
## What is it?
Pyfa, short for **py**thon **f**itting **a**ssistant, allows you to create, experiment with, and save ship fittings without being in game. Open source and written in Python, it is available on any platform where Python 3 and wxWidgets are available, including Windows, Mac OS X, and Linux.
Pyfa, short for **py**thon **f**itting **a**ssistant, allows you to create, experiment with, and save ship fittings without being in game. Open source and written in Python, it is available on any platform where Python 3 and wxWidgets are available, including Windows, macOS, and Linux.
## Latest Version and Changelogs
The latest version along with release notes can always be found on the project's [releases](https://github.com/pyfa-org/Pyfa/releases) page. Pyfa will notify you if you are running an outdated version.
## Installation
Windows and OS X users are supplied self-contained builds of pyfa on the [latest releases](https://github.com/pyfa-org/Pyfa/releases/latest) page. An `.exe` installer is also available for Windows builds. Linux users can run pyfa using their distribution's Python interpreter. There is no official self-contained package for Linux, however, there are a number of third-party packages available through distribution-specific repositories.
Windows, macOS, and Linux users are supplied self-contained builds of pyfa on the [latest releases](https://github.com/pyfa-org/Pyfa/releases/latest) page.
### OS X
Apart from the official release, there is also a [Homebrew](http://brew.sh) option for installing pyfa on OS X. Please note this is maintained by a third-party and is not tested by pyfa developers. Simply fire up in terminal:
### Third Party Packages
Please note that these packages are maintained by third-parties and are not evaluated by the pyfa developers.
#### macOS
Apart from the official release, there is also a [Homebrew](https://formulae.brew.sh/cask/pyfa) option for installing pyfa on macOS. Simply fire up in terminal:
```
$ brew install Caskroom/cask/pyfa
$ brew install --cask pyfa
```
### Linux Distro-specific Packages
The following is a list of pyfa packages available for certain distributions. Please note that these packages are maintained by third-parties and are not evaluated by the pyfa developers.
#### Linux Distro-specific Packages
The following is a list of pyfa packages available for certain distributions.
* Arch: https://aur.archlinux.org/packages/pyfa/
* Gentoo: https://github.com/ZeroPointEnergy/gentoo-pyfa-overlay

View File

@@ -28,6 +28,7 @@ saveInRoot = False
evemonMinVersion = "4081"
minItemSearchLength = 3
minItemSearchLengthCjk = 1
pyfaPath = None
savePath = None

View File

@@ -139,16 +139,18 @@ def update_db():
for row in data:
if (
# Apparently people really want Civilian modules available
(row['typeName_en-us'].startswith('Civilian') and "Shuttle" not in row['typeName_en-us']) or
row['typeName_en-us'] == 'Capsule' or
row['groupID'] == 4033 # destructible effect beacons
(row['typeName_en-us'].startswith('Civilian') and "Shuttle" not in row['typeName_en-us'])
or row['typeName_en-us'] == 'Capsule'
or row['groupID'] == 4033 # destructible effect beacons
or re.match('AIR .+Booster.*', row['typeName_en-us'])
):
row['published'] = True
# Nearly useless and clutter search results too much
elif (
row['typeName_en-us'].startswith('Limited Synth ') or
row['typeName_en-us'].startswith('Expired ') or
row['typeName_en-us'].endswith(' Filament') and (
row['typeName_en-us'].startswith('Limited Synth ')
or row['typeName_en-us'].startswith('Expired ')
or re.match('Mining Blitz .+ Booster Dose .+', row['typeName_en-us'])
or row['typeName_en-us'].endswith(' Filament') and (
"'Needlejack'" not in row['typeName_en-us'] and
"'Devana'" not in row['typeName_en-us'] and
"'Pochven'" not in row['typeName_en-us'] and

0
dist_assets/linux/AppRun Normal file → Executable file
View File

1
docs/_config.yml Normal file
View File

@@ -0,0 +1 @@
theme: jekyll-theme-midnight

104
docs/callback.html Normal file
View File

@@ -0,0 +1,104 @@
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
<title>pyfa Authentication Proxy</title>
<style type="text/css">
body { width: 700px; margin: 150px auto; }
h1 { font-size: 40px; }
h2 { font-size: 32px; }
body { font: 20px Helvetica, sans-serif; color: #333; }
#article { display: block; text-align: left; width: 650px; margin: 0 auto; }
.hidden { display:none; }
.success { color: #28a745; }
.error { color: #dc3545; }
textarea { width: 100%; height: 100px; }
hr { border-width: 1px 0 0 0; border-style: solid; border-color: #333; }
button { cursor: pointer; background-color: white; border: 1px solid #333; color: #333; padding: 8px 11px; text-align: center; text-decoration: none; display: inline-block; }
@media (prefers-color-scheme: dark) {
body { background-color: #333; color: white; }
textarea { width: 100%; height: 100px; background-color: #aaa;}
button { background-color: #333; border: 1px solid white; color: white; }
hr { border-color: white; }
}
</style>
</head>
<body>
<!-- Layout from Short Circuit's CREST login. Shout out! https://github.com/farshield/shortcircuit -->
<h1>pyfa</h1>
<div id="mode0" class="hidden">
<p id="mode0-msg">Processing request...</p>
<button id="showBtn" onClick="showCode()">Show Code</button>
</div>
<div id="mode1" class="hidden">
<p id="mode1-p">Please copy and paste the token below into pyfa.</p>
<textarea id="authCodeText" readonly></textarea>
</div>
</div>
<script>
debugger;
function showCode() {
var element = document.getElementById(`mode1`);
element.classList.remove("hidden");
element = document.getElementById(`showBtn`);
element.classList.add("hidden");
}
function httpPostAsync(url, callback)
{
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == XMLHttpRequest.DONE)
callback(xmlHttp);
}
xmlHttp.open("GET", url, true); // true for asynchronous
xmlHttp.send(null);
}
const urlSearchParams = new URLSearchParams(window.location.search);
const params = Object.fromEntries(urlSearchParams.entries());
let stateInfo;
try {
stateInfo = JSON.parse(atob(params.state))
} catch (err) {
// something has happened and we cannot continue.
// todo: show a simple message and exit.
throw err;
}
// we always want to show the text box for manual.
var element = document.getElementById(`mode${stateInfo.mode}`);
element.classList.remove("hidden");
if (stateInfo.mode === 0) {
let p = document.getElementById(`mode1-p`);
p.prepend(document.createElement("hr"))
}
debugger;
document.getElementById(`authCodeText`).value = btoa(JSON.stringify(params))
if (stateInfo.mode == 0) { // auto / server mode
httpPostAsync(stateInfo.redirect + window.location.search, (req)=>{
debugger;
const msgDiv = document.getElementById(`mode0-msg`);
if (req.status === 200) {
msgDiv.innerHTML ="<span class='success'>Success!</span> You may close this window and return to the application.";
return;
} else if (req.status === 0){
msgDiv.innerHTML = "<span class='error'>Error!</span> Server response not received.<p><small>The local pyfa server may have timed out, or may not have started correctly.</small></p>";
} else if (req.status === 400){
msgDiv.innerHTML = `<span class='error'>Error!</span> <p><small>${req.responseText}</small></p>`
} else {
msgDiv.innerHTML = `<span class='error'>Error!</span> <p><small>There was an unknown error. Please report this to the pyfa issues page.</p><p><textarea readdonly>${req.responseText}</textarea></small></p>`
}
showCode()
// todo: bad request error when it's not an error itself, but rather
})
// todo: post message to local EVE server
}
</script>
</body>
</html>

37
docs/index.md Normal file
View File

@@ -0,0 +1,37 @@
## Welcome to GitHub Pages
You can use the [editor on GitHub](https://github.com/pyfa-org/Pyfa/edit/gh-pages/index.md) to maintain and preview the content for your website in Markdown files.
Whenever you commit to this repository, GitHub Pages will run [Jekyll](https://jekyllrb.com/) to rebuild the pages in your site, from the content in your Markdown files.
### Markdown
Markdown is a lightweight and easy-to-use syntax for styling your writing. It includes conventions for
```markdown
Syntax highlighted code block
# Header 1
## Header 2
### Header 3
- Bulleted
- List
1. Numbered
2. List
**Bold** and _Italic_ and `Code` text
[Link](url) and ![Image](src)
```
For more details see [GitHub Flavored Markdown](https://guides.github.com/features/mastering-markdown/).
### Jekyll Themes
Your Pages site will use the layout and styles from the Jekyll theme you have selected in your [repository settings](https://github.com/pyfa-org/Pyfa/settings/pages). The name of this theme is saved in the Jekyll `_config.yml` configuration file.
### Support or Contact
Having trouble with Pages? Check out our [documentation](https://docs.github.com/categories/github-pages-basics/) or [contact support](https://support.github.com/contact) and well help you sort it out.

File diff suppressed because it is too large Load Diff

View File

@@ -66,7 +66,7 @@ BUILTINS = OrderedDict([
(-25, (_c(_t('Condenser Packs')) + _t('SlamBolt'), 23376, 0, 76624, 0)),
(-26, (_c(_t('Condenser Packs')) + _t('BlastShot'), 19820, 0, 80180, 0)),
(-27, (_c(_t('Condenser Packs')) + _t('GalvaSurge'), 80206, 0, 19794, 0)),
(-28, (_c(_t('Condenser Packs')) + '|' + _t('[T2] ElectroPunch'), 0, 50547, 0, 49453)),
(-28, (_c(_t('Condenser Packs')) + '|' + _t('[T2] ElectroPunch'), 50547, 0, 49453, 0)),
(-29, (_c(_t('Hybrid Charges')) + '|' + _t('[T2] Spike'), 0, 4, 4, 0)),
(-30, (_c(_t('Hybrid Charges')) + '|' + _t('[T2] Null'), 0, 6, 5, 0)),
@@ -216,11 +216,11 @@ class DamagePattern:
pattern.builtin = True
cls._builtins[id] = pattern
def calculateEhp(self, fit):
def calculateEhp(self, item):
ehp = {}
for (type, attr) in (('shield', 'shieldCapacity'), ('armor', 'armorHP'), ('hull', 'hp')):
rawCapacity = fit.ship.getModifiedItemAttr(attr)
ehp[type] = self.effectivify(fit, rawCapacity, type)
rawCapacity = item.getModifiedItemAttr(attr)
ehp[type] = self.effectivify(item, rawCapacity, type)
return ehp
@@ -236,10 +236,10 @@ class DamagePattern:
ereps = {}
for field in tankInfo:
if field in typeMap:
ereps[field] = self.effectivify(fit, tankInfo[field], typeMap[field])
ereps[field] = self.effectivify(fit.ship, tankInfo[field], typeMap[field])
return ereps
def effectivify(self, fit, amount, type):
def effectivify(self, item, amount, type):
type = type if type != "hull" else ""
totalDamage = sum((self.emAmount, self.thermalAmount, self.kineticAmount, self.explosiveAmount))
specificDivider = 0
@@ -248,7 +248,7 @@ class DamagePattern:
attrName = "%s%sDamageResonance" % (type, damageType.capitalize())
attrName = attrName[0].lower() + attrName[1:]
resonance = fit.ship.getModifiedItemAttr(attrName)
resonance = item.getModifiedItemAttr(attrName)
damage = getattr(self, "%sAmount" % damageType)
specificDivider += damage / float(totalDamage or 1) * resonance

View File

@@ -82,6 +82,7 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, Mu
self.__baseRRAmount = None
self.__miningYield = None
self.__miningWaste = None
self.__ehp = None
self.__itemModifiedAttributes = ModifiedAttributeDict()
self.__itemModifiedAttributes.original = self._item.attributes
self.__itemModifiedAttributes.overrides = self._item.overrides
@@ -287,6 +288,29 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, Mu
if delay is not None and speed is not None:
return delay / 1000.0 * speed
@property
def hp(self):
hp = {}
for (type, attr) in (('shield', 'shieldCapacity'), ('armor', 'armorHP'), ('hull', 'hp')):
hp[type] = self.getModifiedItemAttr(attr)
return hp
@property
def ehp(self):
if self.__ehp is None:
if self.owner is None or self.owner.damagePattern is None:
ehp = self.hp
else:
ehp = self.owner.damagePattern.calculateEhp(self)
self.__ehp = ehp
return self.__ehp
def calculateShieldRecharge(self):
capacity = self.getModifiedItemAttr("shieldCapacity")
rechargeRate = self.getModifiedItemAttr("shieldRechargeRate") / 1000.0
return 10 / rechargeRate * math.sqrt(0.25) * (1 - math.sqrt(0.25)) * capacity
# Had to add this to match the falloff property in modules.py
# Fscking ship scanners. If you find any other falloff attributes,
# Put them in the attrs tuple.
@@ -318,6 +342,7 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, Mu
self.__baseRRAmount = None
self.__miningYield = None
self.__miningWaste = None
self.__ehp = None
self.itemModifiedAttributes.clear()
self.chargeModifiedAttributes.clear()

View File

@@ -96,6 +96,7 @@ class Fighter(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
self.__charge = None
self.__baseVolley = None
self.__miningyield = None
self.__ehp = None
self.__itemModifiedAttributes = ModifiedAttributeDict()
self.__chargeModifiedAttributes = ModifiedAttributeDict()
@@ -345,6 +346,29 @@ class Fighter(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
if falloff is not None:
return falloff
@property
def hp(self):
hp = {}
for (type, attr) in (('shield', 'shieldCapacity'), ('armor', 'armorHP'), ('hull', 'hp')):
hp[type] = self.getModifiedItemAttr(attr)
return hp
@property
def ehp(self):
if self.__ehp is None:
if self.owner is None or self.owner.damagePattern is None:
ehp = self.hp
else:
ehp = self.owner.damagePattern.calculateEhp(self)
self.__ehp = ehp
return self.__ehp
def calculateShieldRecharge(self):
capacity = self.getModifiedItemAttr("shieldCapacity")
rechargeRate = self.getModifiedItemAttr("shieldRechargeRate") / 1000.0
return 10 / rechargeRate * math.sqrt(0.25) * (1 - math.sqrt(0.25)) * capacity
@validates("ID", "itemID", "chargeID", "amount")
def validator(self, key, val):
map = {
@@ -361,6 +385,7 @@ class Fighter(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
def clear(self):
self.__baseVolley = None
self.__miningyield = None
self.__ehp = None
self.itemModifiedAttributes.clear()
self.chargeModifiedAttributes.clear()
[x.clear() for x in self.abilities]

View File

@@ -1469,7 +1469,7 @@ class Fit:
if self.damagePattern is None:
ehp = self.hp
else:
ehp = self.damagePattern.calculateEhp(self)
ehp = self.damagePattern.calculateEhp(self.ship)
self.__ehp = ehp
return self.__ehp

View File

@@ -696,16 +696,22 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M
return False
# Check max group fitted
max = self.getModifiedItemAttr("maxGroupFitted")
if max:
current = 0 # if self.owner != fit else -1 # Disabled, see #1278
for mod in fit.modules:
if (mod.item and mod.item.groupID == self.item.groupID and
self.getModPosition(fit) != mod.getModPosition(fit)):
current += 1
# use raw value, since it seems what EVE uses. Example is FAXes with their capacitor boosters,
# which have unmodified value of 10, and modified of 1, and you can actually fit multiples
try:
max = self.item.attributes.get('maxGroupFitted').value
except AttributeError:
pass
else:
if max:
current = 0 # if self.owner != fit else -1 # Disabled, see #1278
for mod in fit.modules:
if (mod.item and mod.item.groupID == self.item.groupID and
self.getModPosition(fit) != mod.getModPosition(fit)):
current += 1
if current >= max:
return False
if current >= max:
return False
# Check this only if we're told to do so
if hardpointLimit:

View File

@@ -66,7 +66,7 @@ class FitShieldRegenGraph(FitGraph):
('shieldAmount', '%'): lambda v, src, tgt: v / 100 * src.item.ship.getModifiedItemAttr('shieldCapacity'),
('shieldAmountT0', '%'): lambda v, src, tgt: None if v is None else v / 100 * src.item.ship.getModifiedItemAttr('shieldCapacity'),
# Needed only for "x mark" support, to convert EHP x into normalized value
('shieldAmount', 'EHP'): lambda v, src, tgt: v / src.item.damagePattern.effectivify(src.item, 1, 'shield')}
('shieldAmount', 'EHP'): lambda v, src, tgt: v / src.item.damagePattern.effectivify(src.item.ship, 1, 'shield')}
_limiters = {
'shieldAmount': lambda src, tgt: (0, src.item.ship.getModifiedItemAttr('shieldCapacity')),
'shieldAmountT0': lambda src, tgt: (0, src.item.ship.getModifiedItemAttr('shieldCapacity'))}
@@ -77,5 +77,5 @@ class FitShieldRegenGraph(FitGraph):
('shieldAmount', 'shieldRegen'): ShieldAmount2ShieldRegenGetter}
_denormalizers = {
('shieldAmount', '%'): lambda v, src, tgt: v * 100 / src.item.ship.getModifiedItemAttr('shieldCapacity'),
('shieldAmount', 'EHP'): lambda v, src, tgt: src.item.damagePattern.effectivify(src.item, v, 'shield'),
('shieldRegen', 'EHP/s'): lambda v, src, tgt: src.item.damagePattern.effectivify(src.item, v, 'shield')}
('shieldAmount', 'EHP'): lambda v, src, tgt: src.item.damagePattern.effectivify(src.item.ship, v, 'shield'),
('shieldRegen', 'EHP/s'): lambda v, src, tgt: src.item.damagePattern.effectivify(src.item.ship, v, 'shield')}

View File

@@ -199,7 +199,7 @@ def _getAutoResists(fit):
armorHp = hpData['armor']
hullHp = hpData['hull']
uniformDamagePattern = DamagePattern(emAmount=25, thermalAmount=25, kineticAmount=25, explosiveAmount=25)
ehpData = uniformDamagePattern.calculateEhp(fit)
ehpData = uniformDamagePattern.calculateEhp(fit.ship)
shieldEhp = ehpData['shield']
armorEhp = ehpData['armor']
hullEhp = ehpData['hull']

View File

@@ -66,6 +66,8 @@ class DroneView(Display):
"Max Range",
"Miscellanea",
"attr:maxVelocity",
"Drone HP",
"Drone Regen",
"Price",
]

View File

@@ -151,6 +151,8 @@ class FighterDisplay(d.Display):
# "Max Range",
# "Miscellanea",
"attr:maxVelocity",
"Drone HP",
"Drone Regen",
"Fighter Abilities",
"Price",
]

View File

@@ -123,9 +123,7 @@ class AddEnvironmentEffect(ContextMenuUnconditional):
data.groups[_t('Abyssal Weather')] = self.getAbyssalWeather()
data.groups[_t('Sansha Incursion')] = self.getEffectBeacons(
_t('ContextMenu|ProjectedEffectManipulation|Sansha Incursion'))
data.groups[_t('Triglavian Invasion')] = self.getEffectBeacons(
_t('ContextMenu|ProjectedEffectManipulation|Triglavian Invasion'))
data.groups[_t('Triglavian Invasion')].groups[_t('Destructible Beacons')] = self.getDestructibleBeacons()
data.groups[_t('Triglavian Invasion')] = self.getDestructibleBeacons()
return data
def getEffectBeacons(self, *groups, extra_garbage=()):

View File

@@ -36,6 +36,8 @@ class ItemCompare(wx.Panel):
self.item = item
self.items = sorted(items, key=defaultSort)
self.attrs = {}
self.HighlightOn = wx.Colour(255, 255, 0, wx.ALPHA_OPAQUE)
self.highlightedNames = []
# get a dict of attrName: attrInfo of all unique attributes across all items
for item in self.items:
@@ -88,6 +90,21 @@ class ItemCompare(wx.Panel):
self.toggleViewBtn.Bind(wx.EVT_TOGGLEBUTTON, self.ToggleViewMode)
self.Bind(wx.EVT_LIST_COL_CLICK, self.SortCompareCols)
self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.HighlightRow)
def HighlightRow(self, event):
itemIdx = event.GetIndex()
name = self.paramList.GetItem(itemIdx).Text
if name in self.highlightedNames:
self.highlightedNames.remove(name)
else:
self.highlightedNames.append(name)
self.Freeze()
self.paramList.ClearAll()
self.PopulateList()
self.Thaw()
event.Skip()
def SortCompareCols(self, event):
self.Freeze()
self.paramList.ClearAll()
@@ -155,6 +172,8 @@ class ItemCompare(wx.Panel):
self.paramList.InsertColumn(len(self.attrs) + 1, _t("Price"))
self.paramList.SetColumnWidth(len(self.attrs) + 1, 60)
toHighlight = []
for item in self.items:
i = self.paramList.InsertItem(self.paramList.GetItemCount(), item.name)
for x, attr in enumerate(self.attrs.keys()):
@@ -172,10 +191,19 @@ class ItemCompare(wx.Panel):
# Add prices
self.paramList.SetItem(i, len(self.attrs) + 1, formatAmount(item.price.price, 3, 3, 9, currency=True) if item.price.price else "")
if item.name in self.highlightedNames:
toHighlight.append(i)
self.paramList.RefreshRows()
self.Layout()
# Highlight after layout, otherwise colors are getting overwritten
for itemIdx in toHighlight:
listItem = self.paramList.GetItem(itemIdx)
listItem.SetBackgroundColour(self.HighlightOn)
listItem.SetFont(listItem.GetFont().MakeBold())
self.paramList.SetItem(listItem)
@staticmethod
def TranslateValueUnit(value, unitName, unitDisplayName):
def itemIDCallback():

View File

@@ -34,6 +34,13 @@ class PFEsiPref(PreferenceView):
self.stInfo.Wrap(dlgWidth - 50)
mainSizer.Add(self.stInfo, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
self.enforceJwtExpiration = wx.CheckBox(panel, wx.ID_ANY, _t("Enforce Token Expiration"), wx.DefaultPosition,
wx.DefaultSize,
0)
self.enforceJwtExpiration.SetToolTip(wx.ToolTip(_t("This option is a workaround in case you cannot log into EVE SSO "
"due to 'Signature has expired' error")))
mainSizer.Add(self.enforceJwtExpiration, 0, wx.ALL | wx.EXPAND, 5)
rbSizer = wx.BoxSizer(wx.HORIZONTAL)
self.rbMode = wx.RadioBox(panel, -1, _t("Login Authentication Method"), wx.DefaultPosition, wx.DefaultSize,
[_t('Local Server'), _t('Manual')], 1, wx.RA_SPECIFY_COLS)
@@ -43,11 +50,12 @@ class PFEsiPref(PreferenceView):
" character login. Use this if having issues with the local server."))
self.rbMode.SetSelection(self.settings.get('loginMode'))
self.enforceJwtExpiration.SetValue(self.settings.get("enforceJwtExpiration" or True))
rbSizer.Add(self.rbMode, 1, wx.TOP | wx.RIGHT, 5)
self.rbMode.Bind(wx.EVT_RADIOBOX, self.OnModeChange)
self.enforceJwtExpiration.Bind(wx.EVT_CHECKBOX, self.OnEnforceChange)
mainSizer.Add(rbSizer, 1, wx.ALL | wx.EXPAND, 0)
panel.SetSizer(mainSizer)
@@ -59,6 +67,10 @@ class PFEsiPref(PreferenceView):
def OnModeChange(self, event):
self.settings.set('loginMode', event.GetInt())
def OnEnforceChange(self, event):
self.settings.set('enforceJwtExpiration', self.enforceJwtExpiration.GetValue())
event.Skip()
def getImage(self):
return BitmapLoader.getBitmap("eve", "gui")

View File

@@ -0,0 +1,87 @@
# =============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of pyfa.
#
# pyfa is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# pyfa is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with pyfa. If not, see <http://www.gnu.org/licenses/>.
# =============================================================================
# noinspection PyPackageRequirements
import wx
import gui.mainFrame
from eos.saveddata.drone import Drone
from eos.saveddata.fighter import Fighter
from service.attribute import Attribute
from gui.viewColumn import ViewColumn
from gui.bitmap_loader import BitmapLoader
from gui.utils.numberFormatter import formatAmount
_t = wx.GetTranslation
class DroneEhpColumn(ViewColumn):
name = "Drone HP"
def __init__(self, fittingView, params=None):
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
if params is None:
params = {"showIcon": True, "displayName": False}
ViewColumn.__init__(self, fittingView)
sAttr = Attribute.getInstance()
info = sAttr.getAttributeInfo("shieldCapacity")
self.info = info
if params["showIcon"]:
iconFile = info.iconID
if iconFile:
self.imageId = fittingView.imageList.GetImageIndex(iconFile, "icons")
self.bitmap = BitmapLoader.getBitmap(iconFile, "icons")
else:
self.imageId = -1
self.mask = wx.LIST_MASK_IMAGE
else:
self.imageId = -1
if params["displayName"] or self.imageId == -1:
self.columnText = info.displayName if info.displayName != "" else info.name
self.mask |= wx.LIST_MASK_TEXT
def getText(self, stuff):
if not isinstance(stuff, (Drone, Fighter)):
return ""
if self.mainFrame.statsPane.nameViewMap["resistancesViewFull"].showEffective:
ehp = sum(stuff.ehp.values())
else:
ehp = sum(stuff.hp.values())
return formatAmount(ehp, 3, 0, 9)
def getImageId(self, mod):
return -1
def getParameters(self):
return ("displayName", bool, False), ("showIcon", bool, True)
def getToolTip(self, stuff):
if not isinstance(stuff, (Drone, Fighter)):
return ""
if self.mainFrame.statsPane.nameViewMap["resistancesViewFull"].showEffective:
return _t("Effective HP")
else:
return _t("HP")
DroneEhpColumn.register()

View File

@@ -0,0 +1,81 @@
# =============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of pyfa.
#
# pyfa is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# pyfa is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with pyfa. If not, see <http://www.gnu.org/licenses/>.
# =============================================================================
# noinspection PyPackageRequirements
import wx
import gui.mainFrame
from eos.saveddata.drone import Drone
from eos.saveddata.fighter import Fighter
from gui.viewColumn import ViewColumn
from gui.bitmap_loader import BitmapLoader
from gui.utils.numberFormatter import formatAmount
_t = wx.GetTranslation
class DroneRegenColumn(ViewColumn):
name = "Drone Regen"
def __init__(self, fittingView, params=None):
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
if params is None:
params = {"showIcon": True, "displayName": False}
ViewColumn.__init__(self, fittingView)
if params["showIcon"]:
self.imageId = fittingView.imageList.GetImageIndex("shieldPassive_small", "gui")
self.bitmap = BitmapLoader.getBitmap("shieldPassive_small", "gui")
self.mask = wx.LIST_MASK_IMAGE
else:
self.imageId = -1
if params["displayName"] or self.imageId == -1:
self.columnText = _("Misc data")
self.mask |= wx.LIST_MASK_TEXT
def getText(self, stuff):
if not isinstance(stuff, (Drone, Fighter)):
return ""
regen = stuff.calculateShieldRecharge()
if (
self.mainFrame.statsPane.nameViewMap["resistancesViewFull"].showEffective
and stuff.owner and stuff.owner.damagePattern is not None
):
regen = stuff.owner.damagePattern.effectivify(stuff, regen, 'shield')
return '{}/s'.format(formatAmount(regen, 3, 0, 9))
def getImageId(self, mod):
return -1
def getParameters(self):
return ("displayName", bool, False), ("showIcon", bool, True)
def getToolTip(self, stuff):
if not isinstance(stuff, (Drone, Fighter)):
return ""
if self.mainFrame.statsPane.nameViewMap["resistancesViewFull"].showEffective:
return _t("Effective Shield Regeneration")
else:
return _t("Shield Regeneration")
DroneRegenColumn.register()

View File

@@ -78,6 +78,8 @@ from gui.builtinViewColumns import ( # noqa: E402, F401
baseName,
capacitorUse,
dampScanRes,
droneEhp,
droneRegen,
graphColor,
graphLightness,
graphLineStyle,

Binary file not shown.

After

Width:  |  Height:  |  Size: 662 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 812 B

After

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 944 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 812 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 667 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 827 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 822 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 796 B

After

Width:  |  Height:  |  Size: 787 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 784 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 829 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 833 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 787 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 836 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 846 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 848 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 816 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 778 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 835 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 831 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 829 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 769 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 818 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 823 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 797 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 773 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 817 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 822 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 832 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 812 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 791 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 769 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 799 B

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