Compare commits
1 Commits
v0.1.2-no-
...
features/r
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7000dbc58c |
@@ -1,21 +0,0 @@
|
||||
---
|
||||
name: An error occurred while parsing the item
|
||||
about: This is probably a bug and you can report it on GitHub.
|
||||
title: "[Parse Error] - item name here"
|
||||
labels: bug, parse error
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Parse Error
|
||||
***Put name of item here, and in the title***
|
||||
|
||||
### Item Text
|
||||
***Please provide the item's description***
|
||||
- Can be copied with `ctrl`+`shift`+`c`
|
||||
- Can also be copied from below the error message
|
||||
|
||||
```
|
||||
Please paste it HERE
|
||||
|
||||
```
|
||||
@@ -1,22 +0,0 @@
|
||||
---
|
||||
name: Not Recognized Modifier
|
||||
about: For "Not Recognized Modifier" errors
|
||||
title: "[Not Recognized Modifier] - PUT MODIFIER HERE"
|
||||
labels: bug, parse error
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Not Recognized Modifier
|
||||
***Put name of item here, and in the title***
|
||||
`Text of the modifier here`
|
||||
|
||||
### Item Text
|
||||
***Please provide the item's description***
|
||||
- Can be copied with `ctrl`+`shift`+`c`
|
||||
- Can also be copied from below the error message
|
||||
|
||||
```
|
||||
Please paste it HERE
|
||||
|
||||
```
|
||||
18
.github/ISSUE_TEMPLATE/other-issue.md
vendored
@@ -1,18 +0,0 @@
|
||||
---
|
||||
name: Other Issue
|
||||
about: Problem Doesn't Fit under other options
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
### Description
|
||||
***Describe what you are experiencing (or other stuff)***
|
||||
|
||||
### Reproduction steps
|
||||
***Steps to reproduce, if needed***
|
||||
|
||||
|
||||
### Screenshot
|
||||
***Attach screenshot if applicable***
|
||||
@@ -1,24 +0,0 @@
|
||||
---
|
||||
name: Something Broken in PoE2
|
||||
about: Use this for things that worked in PoE 1 and do not in PoE 2
|
||||
title: "[PoE2] - Summary"
|
||||
labels: bug
|
||||
assignees: Kvan7
|
||||
|
||||
---
|
||||
|
||||
**Describe the problem**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem. This is very helpful for comparing the PoE1 vs 2 problems
|
||||
22
.github/ISSUE_TEMPLATE/unknown-item.md
vendored
@@ -1,22 +0,0 @@
|
||||
---
|
||||
name: Unknown Item
|
||||
about: If this Item was introduced in this League, it will likely be supported in
|
||||
the next app update.
|
||||
title: "[Unknown Item] - item name here"
|
||||
labels: bug, missing item
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Unknown Item
|
||||
***Put name of item here, and in the title***
|
||||
|
||||
### Item Text
|
||||
***Please provide the item's description***
|
||||
- Can be copied with `ctrl`+`shift`+`c`
|
||||
- Can also be copied from below the error message
|
||||
|
||||
```
|
||||
Please paste it HERE
|
||||
|
||||
```
|
||||
12
.github/workflows/main.yml
vendored
@@ -20,8 +20,8 @@ jobs:
|
||||
working-directory: ./renderer
|
||||
- run: npm run make-index-files
|
||||
working-directory: ./renderer
|
||||
- run: npm run lint
|
||||
working-directory: ./renderer
|
||||
# - run: npm run lint
|
||||
# working-directory: ./renderer
|
||||
- run: npm run build
|
||||
working-directory: ./renderer
|
||||
- uses: actions/upload-artifact@v4
|
||||
@@ -34,7 +34,7 @@ jobs:
|
||||
needs: renderer
|
||||
strategy:
|
||||
matrix:
|
||||
os: [windows-2019, ubuntu-20.04, macos-14] # ubuntu-20.04, macos-14 is a missing runner
|
||||
os: [windows-2019] # ubuntu-20.04, macos-14 is a missing runner
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@@ -43,11 +43,11 @@ jobs:
|
||||
with:
|
||||
name: renderer-dist
|
||||
path: ./renderer/dist
|
||||
- run: npm ci
|
||||
- run: yarn --frozen-lockfile
|
||||
working-directory: ./main
|
||||
- run: npm run build
|
||||
- run: yarn build
|
||||
working-directory: ./main
|
||||
- run: npm run package "--" -p onTagOrDraft
|
||||
- run: yarn package -p onTagOrDraft
|
||||
working-directory: ./main
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
10
.github/workflows/pages.yml
vendored
@@ -19,15 +19,15 @@ jobs:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
- run: npm install
|
||||
working-directory: ./docs
|
||||
- run: npx vitepress build
|
||||
working-directory: ./docs
|
||||
- uses: actions/configure-pages@v4
|
||||
- uses: actions/upload-pages-artifact@v3
|
||||
- uses: actions/configure-pages@v2
|
||||
- uses: actions/upload-pages-artifact@v1
|
||||
with:
|
||||
path: ./docs/.vitepress/dist
|
||||
- id: deployment
|
||||
uses: actions/deploy-pages@v4
|
||||
uses: actions/deploy-pages@v2
|
||||
|
||||
3
.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
.DS_Store
|
||||
node_modules
|
||||
*/dist/**
|
||||
|
||||
@@ -25,5 +26,3 @@ yarn-error.log*
|
||||
# vitepress
|
||||
docs/.vitepress/dist
|
||||
docs/.vitepress/cache
|
||||
|
||||
*.bin
|
||||
@@ -11,45 +11,33 @@ Note that these 2 both depend on each other, and one cannot run without the othe
|
||||
|
||||
The most up-to-date instructions can always be derived from CI:
|
||||
|
||||
[.github/workflows/main.yml](https://github.com/Kvan7/exiled-exchange-2/blob/master/.github/workflows/main.yml)
|
||||
[.github/workflows/main.yml](https://github.com/Kvan7/exalted-poe2-trade/blob/master/.github/workflows/main.yml)
|
||||
|
||||
Here's what that looks like as of 2023-12-03.
|
||||
|
||||
```shell
|
||||
cd renderer
|
||||
npm install
|
||||
npm run make-index-files
|
||||
npm run dev
|
||||
yarn install
|
||||
yarn make-index-files
|
||||
yarn dev
|
||||
|
||||
# In a second shell
|
||||
cd main
|
||||
npm install
|
||||
npm run dev
|
||||
yarn install
|
||||
yarn dev
|
||||
```
|
||||
|
||||
# How to build
|
||||
|
||||
```shell
|
||||
cd renderer
|
||||
npm install
|
||||
npm run make-index-files
|
||||
npm run build
|
||||
yarn install
|
||||
yarn make-index-files
|
||||
yarn build
|
||||
|
||||
cd ../main
|
||||
npm run build
|
||||
yarn build
|
||||
# We want to sign with a distribution certificate to ensure other users can
|
||||
# install without errors
|
||||
CSC_NAME="Certificate name in Keychain" yarn package
|
||||
```
|
||||
|
||||
# How to release a build
|
||||
|
||||
1. Commit all changes
|
||||
2. Bump version in `main/package.json`
|
||||
3. `npm i` in renderer & main (update `package-lock.json` with new version)
|
||||
4. `npm run build` in renderer & main
|
||||
5. Stage & commit bumped version
|
||||
6. `git push`
|
||||
7. `git tag vX.X.X`
|
||||
8. `git push origin vX.X.X`
|
||||
9. Open release page, create release with tag & title as text of tag & save as draft
|
||||
|
||||
24
README.md
@@ -1,28 +1,16 @@
|
||||
#  Exiled Exchange 2
|
||||
#  Exalted PoE2 Trade
|
||||
|
||||
## Moving from POE1/Awakened PoE Trade
|
||||
## Moving from POE1
|
||||
|
||||
1. Download latest release from [releases](https://github.com/Kvan7/exiled-exchange-2/releases)
|
||||
1. Download latest release from [releases](https://github.com/Kvan7/exalted-poe2-trade/releases)
|
||||
- Currently only Windows is supported
|
||||
- Only available as pre-release right now
|
||||
2. Run installer
|
||||
3. Run Exiled Exchange 2
|
||||
4. Launch PoE2 to generate correct files
|
||||
5. Quit PoE2 and EE2 after seeing the banner popup that EE2 loaded
|
||||
6. Copy `apt-data` from `%APPDATA%\awakened-poe-trade` to `%APPDATA%\exiled-exchange-2` to copy your previous settings
|
||||
3. Copy `apt-data` from `%APPDATA%\awakened-poe-trade` to `%APPDATA%\exalted-poe2-trade` to copy your previous settings
|
||||
- Resulting directory structure should look like this:
|
||||
- `%APPDATA%\exiled-exchange-2\apt-data\`
|
||||
- `%APPDATA%\exalted-poe2-trade\apt-data\`
|
||||
- `config.json`
|
||||
7. Edit `config.json` and change the value of "windowTitle": "Path of Exile" to instead be "Path of Exile 2", otherwise it will open only for poe1
|
||||
8. Start Exiled Exchange 2 and PoE2
|
||||
|
||||
#### Updating from 0.0.1 -> 0.0.10
|
||||
|
||||
Follow same steps as tranfering from PoE1, instead of copying from `%APPDATA%\awakened-poe-trade` to `%APPDATA%\exiled-exchange-2` instead copy from `%APPDATA%\awakened-poe2-trade` or `%APPDATA%\awakened-poe2-trade2` to `%APPDATA%\exiled-exchange-2`. After copying files feel free to run the uninstaller for `awakened-poe2-trade` to remove old executables, or delete `%APPDATA%\awakened-poe2-trade` and `Local\Programs\awakened-poe2-trade`
|
||||
|
||||
## FAQ
|
||||
|
||||
https://kvan7.github.io/Exiled-Exchange-2/faq
|
||||
4. Run Exalted PoE2 Trade
|
||||
|
||||
## Tool showcase
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { defineConfig } from 'vitepress'
|
||||
|
||||
const BASE = '/Exiled-Exchange-2/'
|
||||
const BASE = '/exalted-poe2-trade/'
|
||||
|
||||
export default defineConfig({
|
||||
title: 'Exiled Exchange 2',
|
||||
title: 'Exalted PoE2 Trade',
|
||||
description: 'App for price-checking items in Path of Exile 2',
|
||||
base: BASE,
|
||||
mpa: true,
|
||||
@@ -20,15 +20,20 @@ export default defineConfig({
|
||||
},
|
||||
themeConfig: {
|
||||
// logo: 'TODO', https://github.com/vuejs/vitepress/issues/1401
|
||||
appVersion: '0.1.2',
|
||||
appVersion: '3.25.101',
|
||||
github: {
|
||||
releasesUrl: 'https://github.com/Kvan7/Exiled-Exchange-2/releases'
|
||||
releasesUrl: 'https://github.com/Kvan7/exalted-poe2-trade/releases'
|
||||
},
|
||||
socialLinks: [
|
||||
{
|
||||
text: 'Patreon',
|
||||
color: '#FF424D',
|
||||
link: 'https://patreon.com/awakened_poe_trade'
|
||||
},
|
||||
{
|
||||
text: 'GitHub',
|
||||
color: '#181717',
|
||||
link: 'https://github.com/Kvan7/Exiled-Exchange-2'
|
||||
link: 'https://github.com/Kvan7/exalted-poe2-trade'
|
||||
}
|
||||
],
|
||||
sidebar: [
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
---
|
||||
title: Too Complex Query
|
||||
---
|
||||
|
||||
This is the standard error message you will see for this error:
|
||||
|
||||

|
||||
|
||||
Either you have to log in using the built-in browser to raise the limit, reduce the query(remove total ele res), or open the query in your default browser.
|
||||
|
||||
Hitting "Browser" from the error message will open in the built-in browser.
|
||||
|
||||
To open in your default browser, hit the arrow to the right of "trade" before searching the item. Selecting "Trade" will open the trade page in the built-in browser.
|
||||
|
||||

|
||||
@@ -7,24 +7,21 @@ import { useData } from 'vitepress'
|
||||
|
||||
const { theme } = useData()
|
||||
</script>
|
||||
<div style="background-color: #7c2d12; color: white; padding: 10px; text-align: center; font-weight: bold; border-radius: 5px;">
|
||||
⚠️ This is in beta for PoE2. <br/> Please be aware that there may be bugs or issues.
|
||||
</div>
|
||||
You can download Exiled Exchange 2 here. Any other mirrors are not known
|
||||
|
||||
You can download Exalted Poe Trade here. Any other mirrors are not known
|
||||
to the developer, downloading from them may be unsafe.
|
||||
|
||||
| Download link | Automatic updates | Startup time |
|
||||
| -------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | ------------ |
|
||||
| <a :href="`${theme.github.releasesUrl}/download/v${theme.appVersion}/exiled-exchange-2-Setup-${theme.appVersion}.exe`">Windows 10+ (installer)</a> | ✔ | Fast |
|
||||
| <a :href="`${theme.github.releasesUrl}/download/v${theme.appVersion}/exiled-exchange-2-${theme.appVersion}.exe`">Windows 10+ (portable)</a> | ❌ | Slower |
|
||||
| <a :href="`${theme.github.releasesUrl}/download/v${theme.appVersion}/exiled-exchange-2-${theme.appVersion}.AppImage`">Linux (AppImage)</a> | ✔ | n/a |
|
||||
| <a :href="`${theme.github.releasesUrl}/download/v${theme.appVersion}/exiled-exchange-2-${theme.appVersion}-universal.dmg`">macOS (dmg)</a> | ❌ | n/a |
|
||||
| Download link | Automatic updates | Startup time |
|
||||
| --------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | ------------ |
|
||||
| <a :href="`${theme.github.releasesUrl}/download/v${theme.appVersion}/Exalted-PoE2-Trade-Setup-${theme.appVersion}.exe`">Windows 10+ (installer)</a> | ✔ | Fast |
|
||||
| <a :href="`${theme.github.releasesUrl}/download/v${theme.appVersion}/Exalted-PoE2-Trade-${theme.appVersion}.exe`">Windows 10+ (portable)</a> | ❌ | Slower |
|
||||
| <a :href="`${theme.github.releasesUrl}/download/v${theme.appVersion}/Exalted-PoE2-Trade-${theme.appVersion}.AppImage`">Linux (AppImage)</a> | ✔ | n/a |
|
||||
| <a :href="`${theme.github.releasesUrl}/download/v${theme.appVersion}/Exalted-PoE2-Trade-${theme.appVersion}-universal.dmg`">macOS (dmg)</a> | ❌ | n/a |
|
||||
|
||||
Latest version is <span class="bg-gray-100 border rounded px-1">{{ theme.appVersion }}</span>
|
||||
|
||||
*The app is unsigned, which means you'll have to bypass security
|
||||
warnings on Windows to open it.{:.text-sm}
|
||||
|
||||
warnings on Windows and [macOS](https://support.apple.com/en-us/HT202491#openanyway) to open it.{:.text-sm}
|
||||
|
||||
---
|
||||
|
||||
@@ -34,11 +31,11 @@ warnings on Windows to open it.{:.text-sm}
|
||||
- ✔ Windowed Fullscreen, Windowed
|
||||
- ❌ Fullscreen
|
||||
- PoE language
|
||||
- ✔ English
|
||||
- ❌ Russian, Portuguese, Thai, French, German, Spanish, Korean
|
||||
- ✔ English, Russian
|
||||
- ❌ Portuguese, Thai, French, German, Spanish, Korean
|
||||
|
||||
No Administrator rights required, but\
|
||||
⚠ **If you run PoE client as Admin, OS security boundaries take effect.
|
||||
In order for Exiled Exchange 2 to have access to the PoE window, it must be started with Administrator rights.**
|
||||
In order for Exalted PoE2 Trade to have access to the PoE window, it must be started with Administrator rights.**
|
||||
|
||||
❌ **Not compatible with "GeForce Now" or any other cloud gaming service that do not forward clipboard data.**
|
||||
|
||||
@@ -30,8 +30,15 @@ title: FAQ
|
||||
|
||||
- **Will my language be supported?**
|
||||
|
||||
No plans to support other languages. I know Awakened PoE has Russian, but I don't have plans to add other languages since I am still fixing this to work with the new game.
|
||||
No plans to support other languages. Why is there Russian language?
|
||||
Because:
|
||||
1 - this is the native language of developer;
|
||||
2 - helps to create cleaner abstractions in code and test it;
|
||||
3 - has the most active community, at least according to the numbers I can measure.
|
||||
|
||||
09/21/2020
|
||||
|
||||

|
||||
|
||||
- **I downloaded a zip with a bunch of files, but no .exe inside?**
|
||||
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
---
|
||||
title: Common issues
|
||||
---
|
||||
|
||||
This is the standard error message you will see for this error:
|
||||
|
||||

|
||||
|
||||
This is one of two things:
|
||||
|
||||
- Trade site is down
|
||||
- A stricter bot protection is enabled on the trade site currently
|
||||
|
||||
Before reporting this issue, please check if the trade site is down. If it is not those, please be incredibly detailed in the bug report, since this is commonly mis-reported when it was in fact a bot protection issue or trade site issue.
|
||||
@@ -11,10 +11,10 @@ title: Common issues
|
||||
|
||||
3. Are you playing with Vulkan renderer? Update GPU drivers.
|
||||
|
||||
If EE2 works for you with DirectX11/12 renderer,
|
||||
If Awakened works for you with DirectX11/12 renderer,
|
||||
then problem is old Vulkan drivers for sure.
|
||||
|
||||
4. Delete `%appdata%\exiled-exchange-2`
|
||||
4. Delete `%appdata%\exalted-poe2-trade`
|
||||
|
||||
If needed, backup `apt-data` folder with your configuration inside.
|
||||
|
||||
@@ -22,7 +22,7 @@ title: Common issues
|
||||
|
||||
Launch them later one at a time to identify **conflict**.
|
||||
|
||||
6. Restart Exiled Exchange 2.
|
||||
6. Restart Exalted PoE2 Trade.
|
||||
|
||||
*(don't forget to quit first, otherwise launching second instance will do nothing).*
|
||||
|
||||
@@ -36,11 +36,6 @@ title: Common issues
|
||||
- [How to remove the stopwatch in center of screen?](https://github.com/SnosMe/awakened-poe-trade/issues/219)
|
||||
- [Sends a whisper when doing price-check](https://github.com/SnosMe/awakened-poe-trade/issues/178)
|
||||
|
||||
## PoE2
|
||||
|
||||
- 🔥[Query is too complex](/complex-query)
|
||||
- 🔥[Unexpected token ..... is not valid JSON](/invalid-json)
|
||||
|
||||
## Windows
|
||||
|
||||
- 🔥[Nothing happens when I try to price check](/nothing-happens)
|
||||
|
||||
3855
docs/package-lock.json
generated
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 13 KiB |
@@ -5,7 +5,7 @@ title: Quick Start
|
||||
#### First of all, how does it work? {:style="margin-top: 0;"}
|
||||
|
||||
When you press `Ctrl + C` Path of Exile 2 copies the item's text (under cursor, if any) to the clipboard.
|
||||
All that remains is to parse text in Exiled Exchange 2 and show to you in a fancy way.
|
||||
All that remains is to parse text in Exalted PoE2 Trade and show to you in a fancy way.
|
||||
|
||||
### Usage
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 591 KiB |
|
Before Width: | Height: | Size: 103 KiB |
|
Before Width: | Height: | Size: 102 KiB |
|
Before Width: | Height: | Size: 1.0 MiB |
|
Before Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 400 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
@@ -8,10 +8,6 @@
|
||||
"name": "main",
|
||||
"path": "main"
|
||||
},
|
||||
{
|
||||
"name": "DataStore",
|
||||
"path": "./renderer/public/.DS_Store"
|
||||
},
|
||||
{
|
||||
"name": "docs",
|
||||
"path": "docs"
|
||||
@@ -29,21 +25,8 @@
|
||||
"dist/": true
|
||||
},
|
||||
"editor.tabSize": 2,
|
||||
"editor.insertSpaces": true,
|
||||
"conventionalCommits.scopes": [
|
||||
"Update to 2"
|
||||
],
|
||||
"cSpell.words": [
|
||||
"edps",
|
||||
"ilvl",
|
||||
"nonunique",
|
||||
"onlineleague",
|
||||
"pdps",
|
||||
"uniquefoil",
|
||||
"WAYSTONE"
|
||||
],
|
||||
"files.associations": {
|
||||
"*.ndjson": "jsonl"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
publish:
|
||||
- "github"
|
||||
productName: "Exiled Exchange 2"
|
||||
productName: "Exalted PoE2 Trade"
|
||||
npmRebuild: false
|
||||
files:
|
||||
- "package.json"
|
||||
|
||||
5656
main/package-lock.json
generated
@@ -1,20 +1,18 @@
|
||||
{
|
||||
"name": "exiled-exchange-2",
|
||||
"version": "0.1.2-no-pseudo",
|
||||
"name": "exalted-poe2-trade",
|
||||
"version": "0.0.1",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "node build/script.mjs",
|
||||
"build": "tsc --noEmit && node build/script.mjs --prod",
|
||||
"package": "electron-builder build",
|
||||
"lint": "eslint src",
|
||||
"fix": "eslint src --fix"
|
||||
"package": "electron-builder build"
|
||||
},
|
||||
"author": {
|
||||
"name": "Garrett Parker"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/Kvan7/exiled-exchange-2.git"
|
||||
"url": "https://github.com/Kvan7/exalted-poe2-trade.git"
|
||||
},
|
||||
"main": "dist/main.js",
|
||||
"dependencies": {
|
||||
@@ -27,12 +25,15 @@
|
||||
"@types/ws": "^8.5.3",
|
||||
"@wokwi/bmp-ts": "^3.0.0",
|
||||
"comlink": "^4.3.1",
|
||||
"electron": "33.2.1",
|
||||
"electron-builder": "25.1.8",
|
||||
"electron-updater": "^6.3.0",
|
||||
"esbuild": "^0.24.0",
|
||||
"ini": "^5.0.0",
|
||||
"typescript": "5.6.x",
|
||||
"electron": "31.3.1",
|
||||
"electron-builder": "24.13.3",
|
||||
"electron-updater": "^6.1.0",
|
||||
"esbuild": "^0.23.0",
|
||||
"ini": "^4.0.0",
|
||||
"typescript": "5.5.x",
|
||||
"ws": "^8.16.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16"
|
||||
}
|
||||
}
|
||||
@@ -23,7 +23,7 @@ export class AppTray {
|
||||
}
|
||||
|
||||
this.tray = new Tray(trayImage);
|
||||
this.tray.setToolTip(`Exiled Exchange 2 v${app.getVersion()}`);
|
||||
this.tray.setToolTip(`Exalted PoE2 Trade v${app.getVersion()}`);
|
||||
this.rebuildMenu();
|
||||
|
||||
server.onEventAnyClient("CLIENT->MAIN::user-action", ({ action }) => {
|
||||
|
||||
@@ -1,82 +1,76 @@
|
||||
import { autoUpdater } from "electron-updater";
|
||||
import type { ServerEvents } from "./server";
|
||||
import type { UpdateInfo } from "../../ipc/types";
|
||||
import { autoUpdater } from 'electron-updater'
|
||||
import type { ServerEvents } from './server'
|
||||
import type { UpdateInfo } from '../../ipc/types'
|
||||
|
||||
export class AppUpdater {
|
||||
private _checkedAtStartup = false;
|
||||
private _info: UpdateInfo = { state: "initial" };
|
||||
private _checkedAtStartup = false
|
||||
private _info: UpdateInfo = { state: 'initial' }
|
||||
|
||||
public readonly noAutoUpdatesReason: Extract<
|
||||
UpdateInfo,
|
||||
{ state: "update-available" }
|
||||
>["noDownloadReason"] = null;
|
||||
public readonly noAutoUpdatesReason:
|
||||
Extract<UpdateInfo, { state: 'update-available' }>['noDownloadReason'] = null
|
||||
|
||||
get info() {
|
||||
return this._info;
|
||||
}
|
||||
set info(info: UpdateInfo) {
|
||||
this._info = info;
|
||||
this.server.sendEventTo("broadcast", {
|
||||
name: "MAIN->CLIENT::updater-state",
|
||||
payload: info,
|
||||
});
|
||||
get info () { return this._info }
|
||||
set info (info: UpdateInfo) {
|
||||
this._info = info
|
||||
this.server.sendEventTo('broadcast', {
|
||||
name: 'MAIN->CLIENT::updater-state',
|
||||
payload: info
|
||||
})
|
||||
}
|
||||
|
||||
constructor(private server: ServerEvents) {
|
||||
setInterval(this.check, 16 * 60 * 60 * 1000);
|
||||
constructor (
|
||||
private server: ServerEvents
|
||||
) {
|
||||
setInterval(this.check, 16 * 60 * 60 * 1000)
|
||||
|
||||
this.server.onEventAnyClient("CLIENT->MAIN::user-action", ({ action }) => {
|
||||
if (action === "check-for-update") {
|
||||
this.check();
|
||||
} else if (action === "update-and-restart") {
|
||||
autoUpdater.quitAndInstall(false);
|
||||
this.server.onEventAnyClient('CLIENT->MAIN::user-action', ({ action }) => {
|
||||
if (action === 'check-for-update') {
|
||||
this.check()
|
||||
} else if (action === 'update-and-restart') {
|
||||
autoUpdater.quitAndInstall(false)
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
// https://www.electron.build/configuration/nsis.html#portable
|
||||
autoUpdater.autoDownload = !process.env.PORTABLE_EXECUTABLE_DIR;
|
||||
autoUpdater.autoDownload = !process.env.PORTABLE_EXECUTABLE_DIR
|
||||
|
||||
if (!autoUpdater.autoDownload || process.platform === "darwin") {
|
||||
this.noAutoUpdatesReason = "not-supported";
|
||||
} else if (process.argv.includes("--no-updates")) {
|
||||
autoUpdater.autoDownload = false;
|
||||
this.noAutoUpdatesReason = "disabled-by-flag";
|
||||
if (!autoUpdater.autoDownload || process.platform === 'darwin') {
|
||||
this.noAutoUpdatesReason = 'not-supported'
|
||||
} else if (process.argv.includes('--no-updates')) {
|
||||
autoUpdater.autoDownload = false
|
||||
this.noAutoUpdatesReason = 'disabled-by-flag'
|
||||
}
|
||||
|
||||
autoUpdater.on("checking-for-update", () => {
|
||||
this.info = { state: "checking-for-update" };
|
||||
});
|
||||
autoUpdater.on("update-available", (info: { version: string }) => {
|
||||
this.info = {
|
||||
state: "update-available",
|
||||
version: info.version,
|
||||
noDownloadReason: this.noAutoUpdatesReason,
|
||||
};
|
||||
});
|
||||
autoUpdater.on("update-not-available", () => {
|
||||
this.info = { state: "update-not-available", checkedAt: Date.now() };
|
||||
});
|
||||
autoUpdater.on("error", () => {
|
||||
this.info = { state: "error", checkedAt: Date.now() };
|
||||
});
|
||||
autoUpdater.on("update-downloaded", (info: { version: string }) => {
|
||||
this.info = { state: "update-downloaded", version: info.version };
|
||||
});
|
||||
autoUpdater.on('checking-for-update', () => {
|
||||
this.info = { state: 'checking-for-update' }
|
||||
})
|
||||
autoUpdater.on('update-available', (info: { version: string }) => {
|
||||
this.info = { state: 'update-available', version: info.version, noDownloadReason: this.noAutoUpdatesReason }
|
||||
})
|
||||
autoUpdater.on('update-not-available', () => {
|
||||
this.info = { state: 'update-not-available', checkedAt: Date.now() }
|
||||
})
|
||||
autoUpdater.on('error', () => {
|
||||
this.info = { state: 'error', checkedAt: Date.now() }
|
||||
})
|
||||
autoUpdater.on('update-downloaded', (info: { version: string }) => {
|
||||
this.info = { state: 'update-downloaded', version: info.version }
|
||||
})
|
||||
// on('download-progress') https://github.com/electron-userland/electron-builder/issues/2521
|
||||
}
|
||||
|
||||
checkAtStartup() {
|
||||
checkAtStartup () {
|
||||
if (!this._checkedAtStartup) {
|
||||
this._checkedAtStartup = true;
|
||||
this.check();
|
||||
this._checkedAtStartup = true
|
||||
this.check()
|
||||
}
|
||||
}
|
||||
|
||||
private check = async () => {
|
||||
try {
|
||||
await autoUpdater.checkForUpdates();
|
||||
await autoUpdater.checkForUpdates()
|
||||
} catch {
|
||||
// handled by event
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,25 +12,25 @@ const POSSIBLE_PATH =
|
||||
? [
|
||||
path.join(
|
||||
app.getPath("documents"),
|
||||
"My Games\\Path of Exile 2\\poe2_production_Config.ini"
|
||||
"My Games\\Path of Exile 2\\production_Config.ini"
|
||||
),
|
||||
]
|
||||
: process.platform === "linux"
|
||||
? [
|
||||
path.join(
|
||||
app.getPath("documents"),
|
||||
"My Games/Path of Exile 2/poe2_production_Config.ini"
|
||||
"My Games/Path of Exile 2/production_Config.ini"
|
||||
),
|
||||
path.join(
|
||||
app.getPath("home"),
|
||||
".local/share/Steam/steamapps/compatdata/238960/pfx/drive_c/users/steamuser/Documents/My Games/Path of Exile 2/poe2_production_Config.ini"
|
||||
".local/share/Steam/steamapps/compatdata/238960/pfx/drive_c/users/steamuser/Documents/My Games/Path of Exile 2/production_Config.ini"
|
||||
),
|
||||
]
|
||||
: process.platform === "darwin"
|
||||
? [
|
||||
path.join(
|
||||
app.getPath("appData"),
|
||||
"Path of Exile 2/Preferences/poe2_production_Config.ini"
|
||||
"Path of Exile 2/Preferences/production_Config.ini"
|
||||
),
|
||||
]
|
||||
: [];
|
||||
|
||||
106
main/src/main.ts
@@ -1,73 +1,61 @@
|
||||
"use strict";
|
||||
'use strict'
|
||||
|
||||
import { app } from "electron";
|
||||
import { uIOhook } from "uiohook-napi";
|
||||
import os from "node:os";
|
||||
import { startServer, eventPipe, server } from "./server";
|
||||
import { Logger } from "./RemoteLogger";
|
||||
import { GameWindow } from "./windowing/GameWindow";
|
||||
import { OverlayWindow } from "./windowing/OverlayWindow";
|
||||
import { GameConfig } from "./host-files/GameConfig";
|
||||
import { Shortcuts } from "./shortcuts/Shortcuts";
|
||||
import { AppUpdater } from "./AppUpdater";
|
||||
import { AppTray } from "./AppTray";
|
||||
import { OverlayVisibility } from "./windowing/OverlayVisibility";
|
||||
import { GameLogWatcher } from "./host-files/GameLogWatcher";
|
||||
import { HttpProxy } from "./proxy";
|
||||
import { app } from 'electron'
|
||||
import { uIOhook } from 'uiohook-napi'
|
||||
import os from 'node:os'
|
||||
import { startServer, eventPipe, server } from './server'
|
||||
import { Logger } from './RemoteLogger'
|
||||
import { GameWindow } from './windowing/GameWindow'
|
||||
import { OverlayWindow } from './windowing/OverlayWindow'
|
||||
import { GameConfig } from './host-files/GameConfig'
|
||||
import { Shortcuts } from './shortcuts/Shortcuts'
|
||||
import { AppUpdater } from './AppUpdater'
|
||||
import { AppTray } from './AppTray'
|
||||
import { OverlayVisibility } from './windowing/OverlayVisibility'
|
||||
import { GameLogWatcher } from './host-files/GameLogWatcher'
|
||||
import { HttpProxy } from './proxy'
|
||||
|
||||
if (!app.requestSingleInstanceLock()) {
|
||||
app.exit();
|
||||
app.exit()
|
||||
}
|
||||
|
||||
if (process.platform !== "darwin") {
|
||||
app.disableHardwareAcceleration();
|
||||
if (process.platform !== 'darwin') {
|
||||
app.disableHardwareAcceleration()
|
||||
}
|
||||
app.enableSandbox();
|
||||
app.enableSandbox()
|
||||
|
||||
let tray: AppTray;
|
||||
let tray: AppTray
|
||||
|
||||
app.on("ready", async () => {
|
||||
tray = new AppTray(eventPipe);
|
||||
const logger = new Logger(eventPipe);
|
||||
const gameLogWatcher = new GameLogWatcher(eventPipe, logger);
|
||||
const gameConfig = new GameConfig(eventPipe, logger);
|
||||
const poeWindow = new GameWindow();
|
||||
const appUpdater = new AppUpdater(eventPipe);
|
||||
const _httpProxy = new HttpProxy(server, logger);
|
||||
app.on('ready', async () => {
|
||||
tray = new AppTray(eventPipe)
|
||||
const logger = new Logger(eventPipe)
|
||||
const gameLogWatcher = new GameLogWatcher(eventPipe, logger)
|
||||
const gameConfig = new GameConfig(eventPipe, logger)
|
||||
const poeWindow = new GameWindow()
|
||||
const appUpdater = new AppUpdater(eventPipe)
|
||||
const _httpProxy = new HttpProxy(server, logger)
|
||||
|
||||
setTimeout(
|
||||
async () => {
|
||||
const overlay = new OverlayWindow(eventPipe, logger, poeWindow);
|
||||
new OverlayVisibility(eventPipe, overlay, gameConfig);
|
||||
const shortcuts = await Shortcuts.create(
|
||||
logger,
|
||||
overlay,
|
||||
poeWindow,
|
||||
gameConfig,
|
||||
eventPipe
|
||||
);
|
||||
eventPipe.onEventAnyClient("CLIENT->MAIN::update-host-config", (cfg) => {
|
||||
overlay.updateOpts(cfg.overlayKey, cfg.windowTitle);
|
||||
shortcuts.updateActions(
|
||||
cfg.shortcuts,
|
||||
cfg.stashScroll,
|
||||
cfg.logKeys,
|
||||
cfg.restoreClipboard,
|
||||
cfg.language
|
||||
);
|
||||
gameLogWatcher.restart(cfg.clientLog ?? "");
|
||||
gameConfig.readConfig(cfg.gameConfig ?? "");
|
||||
appUpdater.checkAtStartup();
|
||||
tray.overlayKey = cfg.overlayKey;
|
||||
});
|
||||
uIOhook.start();
|
||||
const port = await startServer(appUpdater, logger);
|
||||
const overlay = new OverlayWindow(eventPipe, logger, poeWindow)
|
||||
new OverlayVisibility(eventPipe, overlay, gameConfig)
|
||||
const shortcuts = await Shortcuts.create(logger, overlay, poeWindow, gameConfig, eventPipe)
|
||||
eventPipe.onEventAnyClient('CLIENT->MAIN::update-host-config', (cfg) => {
|
||||
overlay.updateOpts(cfg.overlayKey, cfg.windowTitle)
|
||||
shortcuts.updateActions(cfg.shortcuts, cfg.stashScroll, cfg.logKeys, cfg.restoreClipboard, cfg.language)
|
||||
gameLogWatcher.restart(cfg.clientLog ?? '')
|
||||
gameConfig.readConfig(cfg.gameConfig ?? '')
|
||||
appUpdater.checkAtStartup()
|
||||
tray.overlayKey = cfg.overlayKey
|
||||
})
|
||||
uIOhook.start()
|
||||
const port = await startServer(appUpdater, logger)
|
||||
// TODO: move up (currently crashes)
|
||||
logger.write(`info ${os.type()} ${os.release} / v${app.getVersion()}`);
|
||||
overlay.loadAppPage(port);
|
||||
tray.serverPort = port;
|
||||
logger.write(`info ${os.type()} ${os.release} / v${app.getVersion()}`)
|
||||
overlay.loadAppPage(port)
|
||||
tray.serverPort = port
|
||||
},
|
||||
// fixes(linux): window is black instead of transparent
|
||||
process.platform === "linux" ? 1000 : 0
|
||||
);
|
||||
});
|
||||
process.platform === 'linux' ? 1000 : 0
|
||||
)
|
||||
})
|
||||
|
||||
@@ -22,7 +22,7 @@ export class HttpProxy {
|
||||
|
||||
const official = PROXY_HOSTS.find(entry => entry.host === host)?.official
|
||||
if (official === undefined) return req.destroy()
|
||||
|
||||
|
||||
for (const key in req.headers) {
|
||||
if (key.startsWith('sec-') || key === 'host' || key === 'origin' || key === 'content-length') {
|
||||
delete req.headers[key]
|
||||
@@ -36,11 +36,11 @@ export class HttpProxy {
|
||||
...req.headers,
|
||||
'user-agent': app.userAgentFallback
|
||||
},
|
||||
useSessionCookies: true,
|
||||
referrerPolicy: 'no-referrer-when-downgrade'
|
||||
useSessionCookies: true
|
||||
})
|
||||
proxyReq.addListener('response', (proxyRes) => {
|
||||
const resHeaders = { ...proxyRes.headers }
|
||||
// `net.request` returns an already decoded body
|
||||
delete resHeaders['content-encoding']
|
||||
res.writeHead(proxyRes.statusCode, proxyRes.statusMessage, resHeaders)
|
||||
;(proxyRes as unknown as NodeJS.ReadableStream).pipe(res)
|
||||
@@ -49,7 +49,6 @@ export class HttpProxy {
|
||||
logger.write(`error [cors-proxy] ${err.message} (${host})`)
|
||||
res.destroy(err)
|
||||
})
|
||||
|
||||
req.pipe(proxyReq as unknown as NodeJS.WritableStream)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ export async function startServer (
|
||||
socket.on('close', () => {
|
||||
const clients = websocketServer.clients
|
||||
if (clients.size === 1) {
|
||||
lastActiveClient = clients.values().next().value!
|
||||
lastActiveClient = clients.values().next().value
|
||||
evBus.emit('CLIENT->MAIN::used-recently', { isOverlay: true })
|
||||
}
|
||||
})
|
||||
|
||||
@@ -1,178 +1,130 @@
|
||||
import { clipboard, Clipboard } from "electron";
|
||||
import type { Logger } from "../RemoteLogger";
|
||||
import { text } from "stream/consumers";
|
||||
import { clipboard, Clipboard } from 'electron'
|
||||
import type { Logger } from '../RemoteLogger'
|
||||
|
||||
const POLL_DELAY = 48;
|
||||
const POLL_LIMIT = 500;
|
||||
const POLL_DELAY = 48
|
||||
const POLL_LIMIT = 500
|
||||
|
||||
// PoE must read clipboard within this timeframe,
|
||||
// after that we restore clipboard.
|
||||
// If game lagged for some reason, it will read
|
||||
// wrong content (= restored clipboard, potentially containing password).
|
||||
const RESTORE_AFTER = 120;
|
||||
const RESTORE_AFTER = 120
|
||||
|
||||
export class HostClipboard {
|
||||
private pollPromise?: Promise<string>;
|
||||
private elapsed = 0;
|
||||
private shouldRestore = false;
|
||||
private pollPromise?: Promise<string>
|
||||
private elapsed = 0
|
||||
private shouldRestore = false
|
||||
|
||||
private isRestored = true;
|
||||
private isRestored = true
|
||||
|
||||
get isPolling() {
|
||||
return this.pollPromise != null;
|
||||
get isPolling () { return this.pollPromise != null }
|
||||
|
||||
constructor (
|
||||
private logger: Logger
|
||||
) {}
|
||||
|
||||
updateOptions (restoreClipboard: boolean) {
|
||||
this.shouldRestore = restoreClipboard
|
||||
}
|
||||
|
||||
constructor(private logger: Logger) {}
|
||||
|
||||
updateOptions(restoreClipboard: boolean) {
|
||||
this.shouldRestore = restoreClipboard;
|
||||
}
|
||||
|
||||
async readItemText(): Promise<string> {
|
||||
this.elapsed = 0;
|
||||
async readItemText (): Promise<string> {
|
||||
this.elapsed = 0
|
||||
if (this.pollPromise) {
|
||||
return await this.pollPromise;
|
||||
return await this.pollPromise
|
||||
}
|
||||
|
||||
let textBefore = clipboard.readText();
|
||||
let textBefore = clipboard.readText()
|
||||
if (isPoeItem(textBefore)) {
|
||||
textBefore = "";
|
||||
clipboard.writeText("");
|
||||
textBefore = ''
|
||||
clipboard.writeText('')
|
||||
}
|
||||
|
||||
this.pollPromise = new Promise((resolve, reject) => {
|
||||
const poll = () => {
|
||||
let textAfter = clipboard.readText();
|
||||
|
||||
if (isUncutSkillGem(textAfter)) {
|
||||
// Insert item class line at start
|
||||
textAfter = "Item Class: UncutSkillGem\n" + textAfter;
|
||||
}
|
||||
const textAfter = clipboard.readText()
|
||||
|
||||
if (isPoeItem(textAfter)) {
|
||||
if (this.shouldRestore) {
|
||||
clipboard.writeText(textBefore);
|
||||
clipboard.writeText(textBefore)
|
||||
}
|
||||
this.pollPromise = undefined;
|
||||
resolve(textAfter);
|
||||
this.pollPromise = undefined
|
||||
resolve(textAfter)
|
||||
} else {
|
||||
this.elapsed += POLL_DELAY;
|
||||
this.elapsed += POLL_DELAY
|
||||
if (this.elapsed < POLL_LIMIT) {
|
||||
setTimeout(poll, POLL_DELAY);
|
||||
setTimeout(poll, POLL_DELAY)
|
||||
} else {
|
||||
if (this.shouldRestore) {
|
||||
clipboard.writeText(textBefore);
|
||||
clipboard.writeText(textBefore)
|
||||
}
|
||||
this.pollPromise = undefined;
|
||||
this.pollPromise = undefined
|
||||
|
||||
if (!isPoeItem(textAfter)) {
|
||||
this.logger.write("warn [ClipboardPoller] No item text found.");
|
||||
this.logger.write('warn [ClipboardPoller] No item text found.')
|
||||
}
|
||||
reject(new Error("Reading clipboard timed out"));
|
||||
reject(new Error('Reading clipboard timed out'))
|
||||
}
|
||||
}
|
||||
};
|
||||
setTimeout(poll, POLL_DELAY);
|
||||
});
|
||||
}
|
||||
setTimeout(poll, POLL_DELAY)
|
||||
})
|
||||
|
||||
return this.pollPromise;
|
||||
return this.pollPromise
|
||||
}
|
||||
|
||||
// when `shouldRestore` is false, this function continues
|
||||
// to work as a throttler for callback
|
||||
restoreShortly(cb: (clipboard: Clipboard) => void) {
|
||||
restoreShortly (cb: (clipboard: Clipboard) => void) {
|
||||
// Not only do we not overwrite the clipboard, but we don't exec callback.
|
||||
// This throttling helps against disconnects from "Too many actions".
|
||||
if (!this.isRestored) {
|
||||
return;
|
||||
return
|
||||
}
|
||||
|
||||
this.isRestored = false;
|
||||
const saved = clipboard.readText();
|
||||
cb(clipboard);
|
||||
this.isRestored = false
|
||||
const saved = clipboard.readText()
|
||||
cb(clipboard)
|
||||
setTimeout(() => {
|
||||
if (this.shouldRestore) {
|
||||
clipboard.writeText(saved);
|
||||
clipboard.writeText(saved)
|
||||
}
|
||||
this.isRestored = true;
|
||||
}, RESTORE_AFTER);
|
||||
this.isRestored = true
|
||||
}, RESTORE_AFTER)
|
||||
}
|
||||
}
|
||||
|
||||
function isPoeItem(text: string) {
|
||||
return LANGUAGE_DETECTOR.find(({ firstLine }) => text.startsWith(firstLine));
|
||||
function isPoeItem (text: string) {
|
||||
return LANGUAGE_DETECTOR.find(({ firstLine }) => text.startsWith(firstLine))
|
||||
}
|
||||
|
||||
function isUncutSkillGem(text: string) {
|
||||
const lines = text.split("\n");
|
||||
if (lines.length < 2) return false;
|
||||
|
||||
if (
|
||||
lines[0].startsWith("Rarity: Currency") &&
|
||||
UNCUT_SKILL_GEM_DETECTOR.find(({ firstLine }) =>
|
||||
lines[1].startsWith(firstLine)
|
||||
)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
const UNCUT_SKILL_GEM_DETECTOR = [
|
||||
{
|
||||
lang: "en",
|
||||
firstLine: "Uncut Skill Gem",
|
||||
},
|
||||
{
|
||||
lang: "en",
|
||||
firstLine: "Uncut Spirit Gem",
|
||||
},
|
||||
{
|
||||
lang: "en",
|
||||
firstLine: "Uncut Support Gem",
|
||||
},
|
||||
];
|
||||
|
||||
const LANGUAGE_DETECTOR = [
|
||||
{
|
||||
lang: "en",
|
||||
firstLine: "Item Class: ",
|
||||
},
|
||||
{
|
||||
lang: "ru",
|
||||
firstLine: "Класс предмета: ",
|
||||
},
|
||||
{
|
||||
lang: "fr",
|
||||
firstLine: "Classe d'objet: ",
|
||||
},
|
||||
{
|
||||
lang: "de",
|
||||
firstLine: "Gegenstandsklasse: ",
|
||||
},
|
||||
{
|
||||
lang: "pt",
|
||||
firstLine: "Classe do Item: ",
|
||||
},
|
||||
{
|
||||
lang: "es",
|
||||
firstLine: "Clase de objeto: ",
|
||||
},
|
||||
{
|
||||
lang: "th",
|
||||
firstLine: "ชนิดไอเทม: ",
|
||||
},
|
||||
{
|
||||
lang: "ko",
|
||||
firstLine: "아이템 종류: ",
|
||||
},
|
||||
{
|
||||
lang: "cmn-Hant",
|
||||
firstLine: "物品種類: ",
|
||||
},
|
||||
{
|
||||
lang: "cmn-Hans",
|
||||
firstLine: "物品类别: ",
|
||||
},
|
||||
];
|
||||
const LANGUAGE_DETECTOR = [{
|
||||
lang: 'en',
|
||||
firstLine: 'Item Class: '
|
||||
}, {
|
||||
lang: 'ru',
|
||||
firstLine: 'Класс предмета: '
|
||||
}, {
|
||||
lang: 'fr',
|
||||
firstLine: 'Classe d\'objet: '
|
||||
}, {
|
||||
lang: 'de',
|
||||
firstLine: 'Gegenstandsklasse: '
|
||||
}, {
|
||||
lang: 'pt',
|
||||
firstLine: 'Classe do Item: '
|
||||
}, {
|
||||
lang: 'es',
|
||||
firstLine: 'Clase de objeto: '
|
||||
}, {
|
||||
lang: 'th',
|
||||
firstLine: 'ชนิดไอเทม: '
|
||||
}, {
|
||||
lang: 'ko',
|
||||
firstLine: '아이템 종류: '
|
||||
}, {
|
||||
lang: 'cmn-Hant',
|
||||
firstLine: '物品種類: '
|
||||
}, {
|
||||
lang: 'cmn-Hans',
|
||||
firstLine: '物品类别: '
|
||||
}]
|
||||
|
||||
@@ -1,53 +1,40 @@
|
||||
import { screen, globalShortcut } from "electron";
|
||||
import { uIOhook, UiohookKey, UiohookWheelEvent } from "uiohook-napi";
|
||||
import {
|
||||
isModKey,
|
||||
KeyToElectron,
|
||||
mergeTwoHotkeys,
|
||||
} from "../../../ipc/KeyToCode";
|
||||
import { typeInChat, stashSearch } from "./text-box";
|
||||
import { WidgetAreaTracker } from "../windowing/WidgetAreaTracker";
|
||||
import { HostClipboard } from "./HostClipboard";
|
||||
import { OcrWorker } from "../vision/link-main";
|
||||
import type { ShortcutAction } from "../../../ipc/types";
|
||||
import type { Logger } from "../RemoteLogger";
|
||||
import type { OverlayWindow } from "../windowing/OverlayWindow";
|
||||
import type { GameWindow } from "../windowing/GameWindow";
|
||||
import type { GameConfig } from "../host-files/GameConfig";
|
||||
import type { ServerEvents } from "../server";
|
||||
import { screen, globalShortcut } from 'electron'
|
||||
import { uIOhook, UiohookKey, UiohookWheelEvent } from 'uiohook-napi'
|
||||
import { isModKey, KeyToElectron, mergeTwoHotkeys } from '../../../ipc/KeyToCode'
|
||||
import { typeInChat, stashSearch } from './text-box'
|
||||
import { WidgetAreaTracker } from '../windowing/WidgetAreaTracker'
|
||||
import { HostClipboard } from './HostClipboard'
|
||||
import { OcrWorker } from '../vision/link-main'
|
||||
import type { ShortcutAction } from '../../../ipc/types'
|
||||
import type { Logger } from '../RemoteLogger'
|
||||
import type { OverlayWindow } from '../windowing/OverlayWindow'
|
||||
import type { GameWindow } from '../windowing/GameWindow'
|
||||
import type { GameConfig } from '../host-files/GameConfig'
|
||||
import type { ServerEvents } from '../server'
|
||||
|
||||
type UiohookKeyT = keyof typeof UiohookKey;
|
||||
const UiohookToName = Object.fromEntries(
|
||||
Object.entries(UiohookKey).map(([k, v]) => [v, k])
|
||||
);
|
||||
type UiohookKeyT = keyof typeof UiohookKey
|
||||
const UiohookToName = Object.fromEntries(Object.entries(UiohookKey).map(([k, v]) => ([v, k])))
|
||||
|
||||
export class Shortcuts {
|
||||
private actions: ShortcutAction[] = [];
|
||||
private stashScroll = false;
|
||||
private logKeys = false;
|
||||
private areaTracker: WidgetAreaTracker;
|
||||
private clipboard: HostClipboard;
|
||||
private actions: ShortcutAction[] = []
|
||||
private stashScroll = false
|
||||
private logKeys = false
|
||||
private areaTracker: WidgetAreaTracker
|
||||
private clipboard: HostClipboard
|
||||
|
||||
static async create(
|
||||
static async create (
|
||||
logger: Logger,
|
||||
overlay: OverlayWindow,
|
||||
poeWindow: GameWindow,
|
||||
gameConfig: GameConfig,
|
||||
server: ServerEvents
|
||||
) {
|
||||
const ocrWorker = await OcrWorker.create();
|
||||
const shortcuts = new Shortcuts(
|
||||
logger,
|
||||
overlay,
|
||||
poeWindow,
|
||||
gameConfig,
|
||||
server,
|
||||
ocrWorker
|
||||
);
|
||||
return shortcuts;
|
||||
const ocrWorker = await OcrWorker.create()
|
||||
const shortcuts = new Shortcuts(logger, overlay, poeWindow, gameConfig, server, ocrWorker)
|
||||
return shortcuts
|
||||
}
|
||||
|
||||
private constructor(
|
||||
private constructor (
|
||||
private logger: Logger,
|
||||
private overlay: OverlayWindow,
|
||||
private poeWindow: GameWindow,
|
||||
@@ -55,306 +42,242 @@ export class Shortcuts {
|
||||
private server: ServerEvents,
|
||||
private ocrWorker: OcrWorker
|
||||
) {
|
||||
this.areaTracker = new WidgetAreaTracker(server, overlay);
|
||||
this.clipboard = new HostClipboard(logger);
|
||||
this.areaTracker = new WidgetAreaTracker(server, overlay)
|
||||
this.clipboard = new HostClipboard(logger)
|
||||
|
||||
this.poeWindow.on("active-change", (isActive) => {
|
||||
this.poeWindow.on('active-change', (isActive) => {
|
||||
process.nextTick(() => {
|
||||
if (isActive === this.poeWindow.isActive) {
|
||||
if (isActive) {
|
||||
this.register();
|
||||
this.register()
|
||||
} else {
|
||||
this.unregister();
|
||||
this.unregister()
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
|
||||
this.server.onEventAnyClient("CLIENT->MAIN::user-action", (e) => {
|
||||
if (e.action === "stash-search") {
|
||||
stashSearch(e.text, this.clipboard, this.overlay);
|
||||
this.server.onEventAnyClient('CLIENT->MAIN::user-action', (e) => {
|
||||
if (e.action === 'stash-search') {
|
||||
stashSearch(e.text, this.clipboard, this.overlay)
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
uIOhook.on("keydown", (e) => {
|
||||
if (!this.logKeys) return;
|
||||
const pressed = eventToString(e);
|
||||
this.logger.write(`debug [Shortcuts] Keydown ${pressed}`);
|
||||
});
|
||||
uIOhook.on("keyup", (e) => {
|
||||
if (!this.logKeys) return;
|
||||
this.logger.write(
|
||||
`debug [Shortcuts] Keyup ${
|
||||
UiohookToName[e.keycode] || "not_supported_key"
|
||||
}`
|
||||
);
|
||||
});
|
||||
uIOhook.on('keydown', (e) => {
|
||||
if (!this.logKeys) return
|
||||
const pressed = eventToString(e)
|
||||
this.logger.write(`debug [Shortcuts] Keydown ${pressed}`)
|
||||
})
|
||||
uIOhook.on('keyup', (e) => {
|
||||
if (!this.logKeys) return
|
||||
this.logger.write(`debug [Shortcuts] Keyup ${UiohookToName[e.keycode] || 'not_supported_key'}`)
|
||||
})
|
||||
|
||||
uIOhook.on("wheel", (e) => {
|
||||
if (!e.ctrlKey || !this.poeWindow.isActive || !this.stashScroll) return;
|
||||
uIOhook.on('wheel', (e) => {
|
||||
if (!e.ctrlKey || !this.poeWindow.isActive || !this.stashScroll) return
|
||||
|
||||
if (!isStashArea(e, this.poeWindow)) {
|
||||
if (e.rotation > 0) {
|
||||
uIOhook.keyTap(UiohookKey.ArrowRight);
|
||||
uIOhook.keyTap(UiohookKey.ArrowRight)
|
||||
} else if (e.rotation < 0) {
|
||||
uIOhook.keyTap(UiohookKey.ArrowLeft);
|
||||
uIOhook.keyTap(UiohookKey.ArrowLeft)
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
updateActions(
|
||||
updateActions (
|
||||
actions: ShortcutAction[],
|
||||
stashScroll: boolean,
|
||||
logKeys: boolean,
|
||||
restoreClipboard: boolean,
|
||||
language: string
|
||||
) {
|
||||
this.stashScroll = stashScroll;
|
||||
this.logKeys = logKeys;
|
||||
this.clipboard.updateOptions(restoreClipboard);
|
||||
this.ocrWorker.updateOptions(language);
|
||||
this.stashScroll = stashScroll
|
||||
this.logKeys = logKeys
|
||||
this.clipboard.updateOptions(restoreClipboard)
|
||||
this.ocrWorker.updateOptions(language)
|
||||
|
||||
const copyItemShortcut = mergeTwoHotkeys(
|
||||
"Ctrl + C",
|
||||
this.gameConfig.showModsKey
|
||||
);
|
||||
if (copyItemShortcut !== "Ctrl + C") {
|
||||
const copyItemShortcut = mergeTwoHotkeys('Ctrl + C', this.gameConfig.showModsKey)
|
||||
if (copyItemShortcut !== 'Ctrl + C') {
|
||||
actions.push({
|
||||
shortcut: copyItemShortcut,
|
||||
action: { type: "test-only" },
|
||||
});
|
||||
action: { type: 'test-only' }
|
||||
})
|
||||
}
|
||||
|
||||
const allShortcuts = new Set([
|
||||
"Ctrl + C",
|
||||
"Ctrl + V",
|
||||
"Ctrl + A",
|
||||
"Ctrl + F",
|
||||
"Ctrl + Enter",
|
||||
"Home",
|
||||
"Delete",
|
||||
"Enter",
|
||||
"ArrowUp",
|
||||
"ArrowRight",
|
||||
"ArrowLeft",
|
||||
copyItemShortcut,
|
||||
]);
|
||||
'Ctrl + C', 'Ctrl + V', 'Ctrl + A',
|
||||
'Ctrl + F',
|
||||
'Ctrl + Enter',
|
||||
'Home', 'Delete', 'Enter',
|
||||
'ArrowUp', 'ArrowRight', 'ArrowLeft',
|
||||
copyItemShortcut
|
||||
])
|
||||
|
||||
for (const action of actions) {
|
||||
if (
|
||||
allShortcuts.has(action.shortcut) &&
|
||||
action.action.type !== "test-only"
|
||||
) {
|
||||
this.logger.write(
|
||||
`error [Shortcuts] Hotkey "${action.shortcut}" reserved by the game will not be registered.`
|
||||
);
|
||||
if (allShortcuts.has(action.shortcut) && action.action.type !== 'test-only') {
|
||||
this.logger.write(`error [Shortcuts] Hotkey "${action.shortcut}" reserved by the game will not be registered.`)
|
||||
}
|
||||
}
|
||||
actions = actions.filter((action) => !allShortcuts.has(action.shortcut));
|
||||
actions = actions.filter(action => !allShortcuts.has(action.shortcut))
|
||||
|
||||
const duplicates = new Set<string>();
|
||||
const duplicates = new Set<string>()
|
||||
for (const action of actions) {
|
||||
if (allShortcuts.has(action.shortcut)) {
|
||||
this.logger.write(
|
||||
`error [Shortcuts] It is not possible to use the same hotkey "${action.shortcut}" for multiple actions.`
|
||||
);
|
||||
duplicates.add(action.shortcut);
|
||||
this.logger.write(`error [Shortcuts] It is not possible to use the same hotkey "${action.shortcut}" for multiple actions.`)
|
||||
duplicates.add(action.shortcut)
|
||||
} else {
|
||||
allShortcuts.add(action.shortcut);
|
||||
allShortcuts.add(action.shortcut)
|
||||
}
|
||||
}
|
||||
this.actions = actions.filter(
|
||||
(action) =>
|
||||
!duplicates.has(action.shortcut) ||
|
||||
action.action.type === "toggle-overlay"
|
||||
);
|
||||
this.actions = actions.filter(action =>
|
||||
!duplicates.has(action.shortcut) ||
|
||||
action.action.type === 'toggle-overlay')
|
||||
}
|
||||
|
||||
private register() {
|
||||
private register () {
|
||||
for (const entry of this.actions) {
|
||||
const isOk = globalShortcut.register(
|
||||
shortcutToElectron(entry.shortcut),
|
||||
() => {
|
||||
if (this.logKeys) {
|
||||
this.logger.write(
|
||||
`debug [Shortcuts] Action type: ${entry.action.type}`
|
||||
);
|
||||
}
|
||||
|
||||
if (entry.keepModKeys) {
|
||||
const nonModKey = entry.shortcut
|
||||
.split(" + ")
|
||||
.filter((key) => !isModKey(key))[0];
|
||||
uIOhook.keyToggle(UiohookKey[nonModKey as UiohookKeyT], "up");
|
||||
} else {
|
||||
entry.shortcut
|
||||
.split(" + ")
|
||||
.reverse()
|
||||
.forEach((key) => {
|
||||
uIOhook.keyToggle(UiohookKey[key as UiohookKeyT], "up");
|
||||
});
|
||||
}
|
||||
|
||||
if (entry.action.type === "toggle-overlay") {
|
||||
this.areaTracker.removeListeners();
|
||||
this.overlay.toggleActiveState();
|
||||
} else if (entry.action.type === "paste-in-chat") {
|
||||
typeInChat(entry.action.text, entry.action.send, this.clipboard);
|
||||
} else if (entry.action.type === "trigger-event") {
|
||||
this.server.sendEventTo("broadcast", {
|
||||
name: "MAIN->CLIENT::widget-action",
|
||||
payload: { target: entry.action.target },
|
||||
});
|
||||
} else if (entry.action.type === "stash-search") {
|
||||
stashSearch(entry.action.text, this.clipboard, this.overlay);
|
||||
} else if (entry.action.type === "copy-item") {
|
||||
const { action } = entry;
|
||||
|
||||
const pressPosition = screen.getCursorScreenPoint();
|
||||
|
||||
this.clipboard
|
||||
.readItemText()
|
||||
.then((clipboard) => {
|
||||
this.areaTracker.removeListeners();
|
||||
this.server.sendEventTo("last-active", {
|
||||
name: "MAIN->CLIENT::item-text",
|
||||
payload: {
|
||||
target: action.target,
|
||||
clipboard,
|
||||
position: pressPosition,
|
||||
focusOverlay: Boolean(action.focusOverlay),
|
||||
},
|
||||
});
|
||||
if (action.focusOverlay && this.overlay.wasUsedRecently) {
|
||||
this.overlay.assertOverlayActive();
|
||||
}
|
||||
})
|
||||
.catch(() => {});
|
||||
|
||||
pressKeysToCopyItemText(
|
||||
entry.keepModKeys
|
||||
? entry.shortcut.split(" + ").filter((key) => isModKey(key))
|
||||
: undefined,
|
||||
this.gameConfig.showModsKey
|
||||
);
|
||||
} else if (
|
||||
entry.action.type === "ocr-text" &&
|
||||
entry.action.target === "heist-gems"
|
||||
) {
|
||||
if (process.platform !== "win32") return;
|
||||
|
||||
const { action } = entry;
|
||||
const pressTime = Date.now();
|
||||
const imageData = this.poeWindow.screenshot();
|
||||
this.ocrWorker
|
||||
.findHeistGems({
|
||||
width: this.poeWindow.bounds.width,
|
||||
height: this.poeWindow.bounds.height,
|
||||
data: imageData,
|
||||
})
|
||||
.then((result) => {
|
||||
this.server.sendEventTo("last-active", {
|
||||
name: "MAIN->CLIENT::ocr-text",
|
||||
payload: {
|
||||
target: action.target,
|
||||
pressTime,
|
||||
ocrTime: result.elapsed,
|
||||
paragraphs: result.recognized.map((p) => p.text),
|
||||
},
|
||||
});
|
||||
})
|
||||
.catch(() => {});
|
||||
}
|
||||
const isOk = globalShortcut.register(shortcutToElectron(entry.shortcut), () => {
|
||||
if (this.logKeys) {
|
||||
this.logger.write(`debug [Shortcuts] Action type: ${entry.action.type}`)
|
||||
}
|
||||
);
|
||||
|
||||
if (entry.keepModKeys) {
|
||||
const nonModKey = entry.shortcut.split(' + ').filter(key => !isModKey(key))[0]
|
||||
uIOhook.keyToggle(UiohookKey[nonModKey as UiohookKeyT], 'up')
|
||||
} else {
|
||||
entry.shortcut.split(' + ').reverse().forEach(key => { uIOhook.keyToggle(UiohookKey[key as UiohookKeyT], 'up') })
|
||||
}
|
||||
|
||||
if (entry.action.type === 'toggle-overlay') {
|
||||
this.areaTracker.removeListeners()
|
||||
this.overlay.toggleActiveState()
|
||||
} else if (entry.action.type === 'paste-in-chat') {
|
||||
typeInChat(entry.action.text, entry.action.send, this.clipboard)
|
||||
} else if (entry.action.type === 'trigger-event') {
|
||||
this.server.sendEventTo('broadcast', {
|
||||
name: 'MAIN->CLIENT::widget-action',
|
||||
payload: { target: entry.action.target }
|
||||
})
|
||||
} else if (entry.action.type === 'stash-search') {
|
||||
stashSearch(entry.action.text, this.clipboard, this.overlay)
|
||||
} else if (entry.action.type === 'copy-item') {
|
||||
const { action } = entry
|
||||
|
||||
const pressPosition = screen.getCursorScreenPoint()
|
||||
|
||||
this.clipboard.readItemText()
|
||||
.then(clipboard => {
|
||||
this.areaTracker.removeListeners()
|
||||
this.server.sendEventTo('last-active', {
|
||||
name: 'MAIN->CLIENT::item-text',
|
||||
payload: { target: action.target, clipboard, position: pressPosition, focusOverlay: Boolean(action.focusOverlay) }
|
||||
})
|
||||
if (action.focusOverlay && this.overlay.wasUsedRecently) {
|
||||
this.overlay.assertOverlayActive()
|
||||
}
|
||||
}).catch(() => {})
|
||||
|
||||
pressKeysToCopyItemText(
|
||||
(entry.keepModKeys) ? entry.shortcut.split(' + ').filter(key => isModKey(key)) : undefined,
|
||||
this.gameConfig.showModsKey
|
||||
)
|
||||
} else if (entry.action.type === 'ocr-text' && entry.action.target === 'heist-gems') {
|
||||
if (process.platform !== 'win32') return
|
||||
|
||||
const { action } = entry
|
||||
const pressTime = Date.now()
|
||||
const imageData = this.poeWindow.screenshot()
|
||||
this.ocrWorker.findHeistGems({
|
||||
width: this.poeWindow.bounds.width,
|
||||
height: this.poeWindow.bounds.height,
|
||||
data: imageData
|
||||
}).then(result => {
|
||||
this.server.sendEventTo('last-active', {
|
||||
name: 'MAIN->CLIENT::ocr-text',
|
||||
payload: {
|
||||
target: action.target,
|
||||
pressTime,
|
||||
ocrTime: result.elapsed,
|
||||
paragraphs: result.recognized.map(p => p.text)
|
||||
}
|
||||
})
|
||||
}).catch(() => {})
|
||||
}
|
||||
})
|
||||
|
||||
if (!isOk) {
|
||||
this.logger.write(
|
||||
`error [Shortcuts] Failed to register a shortcut "${entry.shortcut}". It is already registered by another application.`
|
||||
);
|
||||
this.logger.write(`error [Shortcuts] Failed to register a shortcut "${entry.shortcut}". It is already registered by another application.`)
|
||||
}
|
||||
|
||||
if (entry.action.type === "test-only") {
|
||||
globalShortcut.unregister(shortcutToElectron(entry.shortcut));
|
||||
if (entry.action.type === 'test-only') {
|
||||
globalShortcut.unregister(shortcutToElectron(entry.shortcut))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private unregister() {
|
||||
globalShortcut.unregisterAll();
|
||||
private unregister () {
|
||||
globalShortcut.unregisterAll()
|
||||
}
|
||||
}
|
||||
|
||||
function pressKeysToCopyItemText(
|
||||
pressedModKeys: string[] = [],
|
||||
showModsKey: string
|
||||
) {
|
||||
let keys = mergeTwoHotkeys("Ctrl + C", showModsKey).split(" + ");
|
||||
keys = keys.filter((key) => key !== "C");
|
||||
if (process.platform !== "darwin") {
|
||||
function pressKeysToCopyItemText (pressedModKeys: string[] = [], showModsKey: string) {
|
||||
let keys = mergeTwoHotkeys('Ctrl + C', showModsKey).split(' + ')
|
||||
keys = keys.filter(key => key !== 'C')
|
||||
if (process.platform !== 'darwin') {
|
||||
// On non-Mac platforms, don't toggle keys that are already being pressed.
|
||||
//
|
||||
// For unknown reasons, we need to toggle pressed keys on Mac for advanced
|
||||
// mod descriptions to be copied. You can test this by setting the shortcut
|
||||
// to "Alt + any letter". They'll work with this line, but not if it's
|
||||
// commented out.
|
||||
keys = keys.filter((key) => !pressedModKeys.includes(key));
|
||||
keys = keys.filter(key => !pressedModKeys.includes(key))
|
||||
}
|
||||
|
||||
for (const key of keys) {
|
||||
uIOhook.keyToggle(UiohookKey[key as UiohookKeyT], "down");
|
||||
uIOhook.keyToggle(UiohookKey[key as UiohookKeyT], 'down')
|
||||
}
|
||||
|
||||
// finally press `C` to copy text
|
||||
uIOhook.keyTap(UiohookKey.C);
|
||||
uIOhook.keyTap(UiohookKey.C)
|
||||
|
||||
keys.reverse();
|
||||
keys.reverse()
|
||||
for (const key of keys) {
|
||||
uIOhook.keyToggle(UiohookKey[key as UiohookKeyT], "up");
|
||||
uIOhook.keyToggle(UiohookKey[key as UiohookKeyT], 'up')
|
||||
}
|
||||
}
|
||||
|
||||
function isStashArea(mouse: UiohookWheelEvent, poeWindow: GameWindow): boolean {
|
||||
if (
|
||||
!poeWindow.bounds ||
|
||||
mouse.x > poeWindow.bounds.x + poeWindow.uiSidebarWidth
|
||||
)
|
||||
return false;
|
||||
function isStashArea (mouse: UiohookWheelEvent, poeWindow: GameWindow): boolean {
|
||||
if (!poeWindow.bounds ||
|
||||
mouse.x > (poeWindow.bounds.x + poeWindow.uiSidebarWidth)) return false
|
||||
|
||||
return (
|
||||
mouse.y > poeWindow.bounds.y + (poeWindow.bounds.height * 154) / 1600 &&
|
||||
mouse.y < poeWindow.bounds.y + (poeWindow.bounds.height * 1192) / 1600
|
||||
);
|
||||
return (mouse.y > (poeWindow.bounds.y + poeWindow.bounds.height * 154 / 1600) &&
|
||||
mouse.y < (poeWindow.bounds.y + poeWindow.bounds.height * 1192 / 1600))
|
||||
}
|
||||
|
||||
function eventToString(e: {
|
||||
keycode: number;
|
||||
ctrlKey: boolean;
|
||||
altKey: boolean;
|
||||
shiftKey: boolean;
|
||||
}) {
|
||||
const { ctrlKey, shiftKey, altKey } = e;
|
||||
function eventToString (e: { keycode: number, ctrlKey: boolean, altKey: boolean, shiftKey: boolean }) {
|
||||
const { ctrlKey, shiftKey, altKey } = e
|
||||
|
||||
let code = UiohookToName[e.keycode];
|
||||
if (!code) return "not_supported_key";
|
||||
let code = UiohookToName[e.keycode]
|
||||
if (!code) return 'not_supported_key'
|
||||
|
||||
if (code === "Shift" || code === "Alt" || code === "Ctrl") return code;
|
||||
if (code === 'Shift' || code === 'Alt' || code === 'Ctrl') return code
|
||||
|
||||
if (ctrlKey && shiftKey && altKey) code = `Ctrl + Shift + Alt + ${code}`;
|
||||
else if (shiftKey && altKey) code = `Shift + Alt + ${code}`;
|
||||
else if (ctrlKey && shiftKey) code = `Ctrl + Shift + ${code}`;
|
||||
else if (ctrlKey && altKey) code = `Ctrl + Alt + ${code}`;
|
||||
else if (altKey) code = `Alt + ${code}`;
|
||||
else if (ctrlKey) code = `Ctrl + ${code}`;
|
||||
else if (shiftKey) code = `Shift + ${code}`;
|
||||
if (ctrlKey && shiftKey && altKey) code = `Ctrl + Shift + Alt + ${code}`
|
||||
else if (shiftKey && altKey) code = `Shift + Alt + ${code}`
|
||||
else if (ctrlKey && shiftKey) code = `Ctrl + Shift + ${code}`
|
||||
else if (ctrlKey && altKey) code = `Ctrl + Alt + ${code}`
|
||||
else if (altKey) code = `Alt + ${code}`
|
||||
else if (ctrlKey) code = `Ctrl + ${code}`
|
||||
else if (shiftKey) code = `Shift + ${code}`
|
||||
|
||||
return code;
|
||||
return code
|
||||
}
|
||||
|
||||
function shortcutToElectron(shortcut: string) {
|
||||
function shortcutToElectron (shortcut: string) {
|
||||
return shortcut
|
||||
.split(" + ")
|
||||
.map((k) => KeyToElectron[k as keyof typeof KeyToElectron])
|
||||
.join("+");
|
||||
.split(' + ')
|
||||
.map(k => KeyToElectron[k as keyof typeof KeyToElectron])
|
||||
.join('+')
|
||||
}
|
||||
|
||||
@@ -161,7 +161,7 @@ export class OverlayWindow {
|
||||
// ----------------------
|
||||
"Path of Exile 2 is running with administrator rights.\n" +
|
||||
"\n" +
|
||||
"You need to restart Exiled Exchange 2 with administrator rights."
|
||||
"You need to restart Exalted PoE2 Trade with administrator rights."
|
||||
);
|
||||
} else {
|
||||
this.server.sendEventTo("broadcast", {
|
||||
|
||||
1956
main/yarn.lock
Normal file
@@ -1,56 +1,60 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
env: {
|
||||
node: true,
|
||||
},
|
||||
plugins: [
|
||||
"@typescript-eslint",
|
||||
// 'only-warn'
|
||||
],
|
||||
extends: ["plugin:vue/base", "standard-with-typescript", "prettier"],
|
||||
rules: {
|
||||
"no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
|
||||
"no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
|
||||
"quote-props": ["error", "consistent-as-needed"],
|
||||
"no-labels": ["error", { allowLoop: true }],
|
||||
"multiline-ternary": "off",
|
||||
"no-unused-vars": "off",
|
||||
"no-undef": "off",
|
||||
"@typescript-eslint/no-unused-vars": ["error"],
|
||||
"@typescript-eslint/strict-boolean-expressions": "off",
|
||||
"@typescript-eslint/no-non-null-assertion": "off",
|
||||
"@typescript-eslint/explicit-function-return-type": "off",
|
||||
"@typescript-eslint/restrict-template-expressions": "off",
|
||||
"@typescript-eslint/prefer-nullish-coalescing": "off",
|
||||
"@typescript-eslint/prefer-optional-chain": "off",
|
||||
"@typescript-eslint/prefer-readonly": "off",
|
||||
"@typescript-eslint/no-floating-promises": "off",
|
||||
"@typescript-eslint/no-misused-promises": "off",
|
||||
"@typescript-eslint/prefer-reduce-type-parameter": "off",
|
||||
"@typescript-eslint/no-invalid-void-type": "off",
|
||||
"@typescript-eslint/consistent-indexed-object-style": "off",
|
||||
"import/first": "off",
|
||||
"import/no-duplicates": "off",
|
||||
"func-call-spacing": "off",
|
||||
// TODO: refactor IPC and enable
|
||||
"@typescript-eslint/consistent-type-assertions": "off",
|
||||
},
|
||||
overrides: [
|
||||
{
|
||||
files: ["src/main/**/*"],
|
||||
env: {
|
||||
node: true,
|
||||
},
|
||||
root: true,
|
||||
env: {
|
||||
node: true
|
||||
},
|
||||
{
|
||||
files: ["*.ts"],
|
||||
parserOptions: {
|
||||
project: "./tsconfig.json",
|
||||
},
|
||||
plugins: [
|
||||
'@typescript-eslint',
|
||||
'prettier'
|
||||
// 'only-warn'
|
||||
],
|
||||
extends: [
|
||||
'plugin:vue/base',
|
||||
'standard-with-typescript',
|
||||
'plugin:prettier/recommended',
|
||||
'eslint-plugin-prettier/recommended',
|
||||
],
|
||||
rules: {
|
||||
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
||||
'quote-props': ['error', 'consistent-as-needed'],
|
||||
'no-labels': ['error', { allowLoop: true }],
|
||||
'multiline-ternary': 'off',
|
||||
'no-unused-vars': 'off',
|
||||
'no-undef': 'off',
|
||||
'@typescript-eslint/no-unused-vars': ['error'],
|
||||
'@typescript-eslint/strict-boolean-expressions': 'off',
|
||||
'@typescript-eslint/no-non-null-assertion': 'off',
|
||||
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||
'@typescript-eslint/restrict-template-expressions': 'off',
|
||||
'@typescript-eslint/prefer-nullish-coalescing': 'off',
|
||||
'@typescript-eslint/prefer-optional-chain': 'off',
|
||||
'@typescript-eslint/prefer-readonly': 'off',
|
||||
'@typescript-eslint/no-floating-promises': 'off',
|
||||
'@typescript-eslint/no-misused-promises': 'off',
|
||||
'@typescript-eslint/prefer-reduce-type-parameter': 'off',
|
||||
'@typescript-eslint/no-invalid-void-type': 'off',
|
||||
'@typescript-eslint/consistent-indexed-object-style': 'off',
|
||||
'import/first': 'off',
|
||||
'import/no-duplicates': 'off',
|
||||
'func-call-spacing': 'off',
|
||||
// TODO: refactor IPC and enable
|
||||
'@typescript-eslint/consistent-type-assertions': 'off',
|
||||
"indent": ["error", "tab"]
|
||||
},
|
||||
],
|
||||
parserOptions: {
|
||||
parser: "@typescript-eslint/parser",
|
||||
extraFileExtensions: [".vue"],
|
||||
},
|
||||
};
|
||||
overrides: [{
|
||||
files: ['src/main/**/*'],
|
||||
env: {
|
||||
node: true
|
||||
}
|
||||
}, {
|
||||
files: ['*.ts'],
|
||||
parserOptions: {
|
||||
project: './tsconfig.json'
|
||||
}
|
||||
}],
|
||||
parserOptions: {
|
||||
parser: '@typescript-eslint/parser',
|
||||
extraFileExtensions: ['.vue']
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
# Ignore artifacts:
|
||||
build
|
||||
coverage
|
||||
dist
|
||||
node_modules
|
||||
public
|
||||
@@ -1 +1,7 @@
|
||||
{}
|
||||
{
|
||||
"singleQuote": true,
|
||||
"endOfLine": "lf",
|
||||
"tabWidth": 2,
|
||||
"useTabs": true,
|
||||
"trailingComma": "es5"
|
||||
}
|
||||
@@ -1,14 +1,13 @@
|
||||
<!doctype html>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
|
||||
<meta name="color-scheme" content="dark" />
|
||||
<link rel="icon" href="/icon.ico" />
|
||||
<title>Exiled Exchange 2</title>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<meta name="color-scheme" content="dark">
|
||||
<link rel="icon" href="/icon.ico">
|
||||
<title>Exalted PoE2 Trade</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script type="module" src="/src/main.ts"></script>
|
||||
|
||||
599
renderer/package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "exiled-exchange-2",
|
||||
"version": "0.0.0",
|
||||
"name": "exalted-poe2-trade",
|
||||
"version": "0.0.1",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "exiled-exchange-2",
|
||||
"version": "0.0.0",
|
||||
"name": "exalted-poe2-trade",
|
||||
"version": "0.0.1",
|
||||
"dependencies": {
|
||||
"@fortawesome/fontawesome-free": "6.x.x",
|
||||
"@sindresorhus/fnv1a": "^3.0.0",
|
||||
@@ -34,13 +34,11 @@
|
||||
"@vitejs/plugin-vue": "^4.0.0",
|
||||
"autoprefixer": "^10.0.2",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"eslint-plugin-prettier": "^5.2.1",
|
||||
"postcss": "^8.2.14",
|
||||
"prettier": "3.4.2",
|
||||
"typescript": "5.6.x",
|
||||
"vite": "^5.0.0",
|
||||
"vite-tsconfig-paths": "^5.1.4",
|
||||
"vitest": "^2.1.8",
|
||||
"vitest-mock-extended": "^2.0.2",
|
||||
"vue-tsc": "^2.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
@@ -794,6 +792,19 @@
|
||||
"node": ">=14"
|
||||
}
|
||||
},
|
||||
"node_modules/@pkgr/core": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
|
||||
"integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "^12.20.0 || ^14.18.0 || >=16.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/unts"
|
||||
}
|
||||
},
|
||||
"node_modules/@popperjs/core": {
|
||||
"version": "2.11.8",
|
||||
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
|
||||
@@ -1405,149 +1416,6 @@
|
||||
"vue": "^3.2.25"
|
||||
}
|
||||
},
|
||||
"node_modules/@vitest/expect": {
|
||||
"version": "2.1.8",
|
||||
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz",
|
||||
"integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@vitest/spy": "2.1.8",
|
||||
"@vitest/utils": "2.1.8",
|
||||
"chai": "^5.1.2",
|
||||
"tinyrainbow": "^1.2.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/vitest"
|
||||
}
|
||||
},
|
||||
"node_modules/@vitest/mocker": {
|
||||
"version": "2.1.8",
|
||||
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz",
|
||||
"integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@vitest/spy": "2.1.8",
|
||||
"estree-walker": "^3.0.3",
|
||||
"magic-string": "^0.30.12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/vitest"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"msw": "^2.4.9",
|
||||
"vite": "^5.0.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"msw": {
|
||||
"optional": true
|
||||
},
|
||||
"vite": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@vitest/mocker/node_modules/estree-walker": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
|
||||
"integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/estree": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@vitest/mocker/node_modules/magic-string": {
|
||||
"version": "0.30.15",
|
||||
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.15.tgz",
|
||||
"integrity": "sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/sourcemap-codec": "^1.5.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@vitest/pretty-format": {
|
||||
"version": "2.1.8",
|
||||
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz",
|
||||
"integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"tinyrainbow": "^1.2.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/vitest"
|
||||
}
|
||||
},
|
||||
"node_modules/@vitest/runner": {
|
||||
"version": "2.1.8",
|
||||
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz",
|
||||
"integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@vitest/utils": "2.1.8",
|
||||
"pathe": "^1.1.2"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/vitest"
|
||||
}
|
||||
},
|
||||
"node_modules/@vitest/snapshot": {
|
||||
"version": "2.1.8",
|
||||
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz",
|
||||
"integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@vitest/pretty-format": "2.1.8",
|
||||
"magic-string": "^0.30.12",
|
||||
"pathe": "^1.1.2"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/vitest"
|
||||
}
|
||||
},
|
||||
"node_modules/@vitest/snapshot/node_modules/magic-string": {
|
||||
"version": "0.30.15",
|
||||
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.15.tgz",
|
||||
"integrity": "sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/sourcemap-codec": "^1.5.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@vitest/spy": {
|
||||
"version": "2.1.8",
|
||||
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz",
|
||||
"integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"tinyspy": "^3.0.2"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/vitest"
|
||||
}
|
||||
},
|
||||
"node_modules/@vitest/utils": {
|
||||
"version": "2.1.8",
|
||||
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz",
|
||||
"integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@vitest/pretty-format": "2.1.8",
|
||||
"loupe": "^3.1.2",
|
||||
"tinyrainbow": "^1.2.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/vitest"
|
||||
}
|
||||
},
|
||||
"node_modules/@volar/language-core": {
|
||||
"version": "2.4.10",
|
||||
"resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.10.tgz",
|
||||
@@ -2136,16 +2004,6 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/assertion-error": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
|
||||
"integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/autoprefixer": {
|
||||
"version": "10.4.20",
|
||||
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
|
||||
@@ -2291,16 +2149,6 @@
|
||||
"semver": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/cac": {
|
||||
"version": "6.7.14",
|
||||
"resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
|
||||
"integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/call-bind": {
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
|
||||
@@ -2361,23 +2209,6 @@
|
||||
],
|
||||
"license": "CC-BY-4.0"
|
||||
},
|
||||
"node_modules/chai": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz",
|
||||
"integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"assertion-error": "^2.0.1",
|
||||
"check-error": "^2.1.1",
|
||||
"deep-eql": "^5.0.1",
|
||||
"loupe": "^3.1.0",
|
||||
"pathval": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/chalk": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
|
||||
@@ -2395,16 +2226,6 @@
|
||||
"url": "https://github.com/chalk/chalk?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/check-error": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
|
||||
"integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 16"
|
||||
}
|
||||
},
|
||||
"node_modules/chokidar": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
|
||||
@@ -2586,16 +2407,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/deep-eql": {
|
||||
"version": "5.0.2",
|
||||
"resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
|
||||
"integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/deep-is": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
|
||||
@@ -2808,13 +2619,6 @@
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/es-module-lexer": {
|
||||
"version": "1.5.4",
|
||||
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
|
||||
"integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/es-object-atoms": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
|
||||
@@ -3239,6 +3043,37 @@
|
||||
"eslint": ">=7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-prettier": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz",
|
||||
"integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"prettier-linter-helpers": "^1.0.0",
|
||||
"synckit": "^0.9.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.18.0 || >=16.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/eslint-plugin-prettier"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/eslint": ">=8.0.0",
|
||||
"eslint": ">=8.0.0",
|
||||
"eslint-config-prettier": "*",
|
||||
"prettier": ">=3.0.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/eslint": {
|
||||
"optional": true
|
||||
},
|
||||
"eslint-config-prettier": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-promise": {
|
||||
"version": "6.6.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz",
|
||||
@@ -3451,22 +3286,19 @@
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/expect-type": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz",
|
||||
"integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": ">=12.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/fast-deep-equal": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
||||
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/fast-diff": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
|
||||
"integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0"
|
||||
},
|
||||
"node_modules/fast-glob": {
|
||||
"version": "3.3.2",
|
||||
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
|
||||
@@ -3829,13 +3661,6 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/globrex": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
|
||||
"integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/gopd": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
|
||||
@@ -4569,13 +4394,6 @@
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/loupe": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz",
|
||||
"integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lru-cache": {
|
||||
"version": "10.4.3",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
|
||||
@@ -5021,23 +4839,6 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/pathe": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
|
||||
"integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/pathval": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
|
||||
"integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 14.16"
|
||||
}
|
||||
},
|
||||
"node_modules/picocolors": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
|
||||
@@ -5265,6 +5066,19 @@
|
||||
"url": "https://github.com/prettier/prettier?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/prettier-linter-helpers": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
|
||||
"integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"fast-diff": "^1.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/punycode": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
|
||||
@@ -5609,13 +5423,6 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/siginfo": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
|
||||
"integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/signal-exit": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
|
||||
@@ -5675,20 +5482,6 @@
|
||||
"deprecated": "Please use @jridgewell/sourcemap-codec instead",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/stackback": {
|
||||
"version": "0.0.2",
|
||||
"resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
|
||||
"integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/std-env": {
|
||||
"version": "3.8.0",
|
||||
"resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz",
|
||||
"integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/string-width": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
|
||||
@@ -5945,6 +5738,30 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/synckit": {
|
||||
"version": "0.9.2",
|
||||
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
|
||||
"integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@pkgr/core": "^0.1.0",
|
||||
"tslib": "^2.6.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.18.0 || >=16.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/unts"
|
||||
}
|
||||
},
|
||||
"node_modules/synckit/node_modules/tslib": {
|
||||
"version": "2.8.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
||||
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
|
||||
"dev": true,
|
||||
"license": "0BSD"
|
||||
},
|
||||
"node_modules/tailwindcss": {
|
||||
"version": "3.4.15",
|
||||
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.15.tgz",
|
||||
@@ -6010,50 +5827,6 @@
|
||||
"node": ">=0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/tinybench": {
|
||||
"version": "2.9.0",
|
||||
"resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
|
||||
"integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/tinyexec": {
|
||||
"version": "0.3.1",
|
||||
"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz",
|
||||
"integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/tinypool": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz",
|
||||
"integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "^18.0.0 || >=20.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/tinyrainbow": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz",
|
||||
"integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/tinyspy": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
|
||||
"integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/tippy.js": {
|
||||
"version": "6.3.7",
|
||||
"resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz",
|
||||
@@ -6075,48 +5848,12 @@
|
||||
"node": ">=8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/ts-essentials": {
|
||||
"version": "10.0.3",
|
||||
"resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-10.0.3.tgz",
|
||||
"integrity": "sha512-/FrVAZ76JLTWxJOERk04fm8hYENDo0PWSP3YLQKxevLwWtxemGcl5JJEzN4iqfDlRve0ckyfFaOBu4xbNH/wZw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"typescript": ">=4.5.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/ts-interface-checker": {
|
||||
"version": "0.1.13",
|
||||
"resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
|
||||
"integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
|
||||
"license": "Apache-2.0"
|
||||
},
|
||||
"node_modules/tsconfck": {
|
||||
"version": "3.1.4",
|
||||
"resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.4.tgz",
|
||||
"integrity": "sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"tsconfck": "bin/tsconfck.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18 || >=20"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": "^5.0.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/tsconfig-paths": {
|
||||
"version": "3.15.0",
|
||||
"resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
|
||||
@@ -6400,139 +6137,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/vite-node": {
|
||||
"version": "2.1.8",
|
||||
"resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz",
|
||||
"integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cac": "^6.7.14",
|
||||
"debug": "^4.3.7",
|
||||
"es-module-lexer": "^1.5.4",
|
||||
"pathe": "^1.1.2",
|
||||
"vite": "^5.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"vite-node": "vite-node.mjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.0.0 || >=20.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/vitest"
|
||||
}
|
||||
},
|
||||
"node_modules/vite-tsconfig-paths": {
|
||||
"version": "5.1.4",
|
||||
"resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz",
|
||||
"integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"debug": "^4.1.1",
|
||||
"globrex": "^0.1.2",
|
||||
"tsconfck": "^3.0.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"vite": "*"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"vite": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/vitest": {
|
||||
"version": "2.1.8",
|
||||
"resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.8.tgz",
|
||||
"integrity": "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@vitest/expect": "2.1.8",
|
||||
"@vitest/mocker": "2.1.8",
|
||||
"@vitest/pretty-format": "^2.1.8",
|
||||
"@vitest/runner": "2.1.8",
|
||||
"@vitest/snapshot": "2.1.8",
|
||||
"@vitest/spy": "2.1.8",
|
||||
"@vitest/utils": "2.1.8",
|
||||
"chai": "^5.1.2",
|
||||
"debug": "^4.3.7",
|
||||
"expect-type": "^1.1.0",
|
||||
"magic-string": "^0.30.12",
|
||||
"pathe": "^1.1.2",
|
||||
"std-env": "^3.8.0",
|
||||
"tinybench": "^2.9.0",
|
||||
"tinyexec": "^0.3.1",
|
||||
"tinypool": "^1.0.1",
|
||||
"tinyrainbow": "^1.2.0",
|
||||
"vite": "^5.0.0",
|
||||
"vite-node": "2.1.8",
|
||||
"why-is-node-running": "^2.3.0"
|
||||
},
|
||||
"bin": {
|
||||
"vitest": "vitest.mjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.0.0 || >=20.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/vitest"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@edge-runtime/vm": "*",
|
||||
"@types/node": "^18.0.0 || >=20.0.0",
|
||||
"@vitest/browser": "2.1.8",
|
||||
"@vitest/ui": "2.1.8",
|
||||
"happy-dom": "*",
|
||||
"jsdom": "*"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@edge-runtime/vm": {
|
||||
"optional": true
|
||||
},
|
||||
"@types/node": {
|
||||
"optional": true
|
||||
},
|
||||
"@vitest/browser": {
|
||||
"optional": true
|
||||
},
|
||||
"@vitest/ui": {
|
||||
"optional": true
|
||||
},
|
||||
"happy-dom": {
|
||||
"optional": true
|
||||
},
|
||||
"jsdom": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/vitest-mock-extended": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/vitest-mock-extended/-/vitest-mock-extended-2.0.2.tgz",
|
||||
"integrity": "sha512-n3MBqVITKyclZ0n0y66hkT4UiiEYFQn9tteAnIxT0MPz1Z8nFcPUG3Cf0cZOyoPOj/cq6Ab1XFw2lM/qM5EDWQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ts-essentials": ">=10.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": "3.x || 4.x || 5.x",
|
||||
"vitest": ">=2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/vitest/node_modules/magic-string": {
|
||||
"version": "0.30.15",
|
||||
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.15.tgz",
|
||||
"integrity": "sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/sourcemap-codec": "^1.5.0"
|
||||
}
|
||||
},
|
||||
"node_modules/vscode-uri": {
|
||||
"version": "3.0.8",
|
||||
"resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz",
|
||||
@@ -6763,23 +6367,6 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/why-is-node-running": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
|
||||
"integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"siginfo": "^2.0.0",
|
||||
"stackback": "0.0.2"
|
||||
},
|
||||
"bin": {
|
||||
"why-is-node-running": "cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/word-wrap": {
|
||||
"version": "1.2.5",
|
||||
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
{
|
||||
"name": "exiled-exchange-2",
|
||||
"version": "0.0.0",
|
||||
"name": "exalted-poe2-trade",
|
||||
"version": "0.0.1",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"lint": "eslint --ext .ts,.vue src",
|
||||
"lint-fix": "eslint --ext .ts,.vue src --fix",
|
||||
"build": "vue-tsc --noEmit && vite build",
|
||||
"make-index-files": "node src/assets/make-index-files.mjs",
|
||||
"test": "vitest"
|
||||
"make-index-files": "node src/assets/make-index-files.mjs"
|
||||
},
|
||||
"dependencies": {
|
||||
"@fortawesome/fontawesome-free": "6.x.x",
|
||||
@@ -37,13 +35,11 @@
|
||||
"@vitejs/plugin-vue": "^4.0.0",
|
||||
"autoprefixer": "^10.0.2",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"eslint-plugin-prettier": "^5.2.1",
|
||||
"postcss": "^8.2.14",
|
||||
"prettier": "3.4.2",
|
||||
"typescript": "5.6.x",
|
||||
"vite": "^5.0.0",
|
||||
"vite-tsconfig-paths": "^5.1.4",
|
||||
"vitest": "^2.1.8",
|
||||
"vitest-mock-extended": "^2.0.2",
|
||||
"vue-tsc": "^2.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
|
||||
169
renderer/public/.DS_Store/.gitignore
vendored
@@ -1,169 +0,0 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# Snowpack dependency directory (https://snowpack.dev/)
|
||||
web_modules/
|
||||
|
||||
# TypeScript cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Optional stylelint cache
|
||||
.stylelintcache
|
||||
|
||||
# Microbundle cache
|
||||
.rpt2_cache/
|
||||
.rts2_cache_cjs/
|
||||
.rts2_cache_es/
|
||||
.rts2_cache_umd/
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variable files
|
||||
.env
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
.env.local
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
.parcel-cache
|
||||
|
||||
# Next.js build output
|
||||
.next
|
||||
out
|
||||
|
||||
# Nuxt.js build / generate output
|
||||
.nuxt
|
||||
dist
|
||||
|
||||
# Gatsby files
|
||||
.cache/
|
||||
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||
# public
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# vuepress v2.x temp and cache directory
|
||||
.temp
|
||||
.cache
|
||||
|
||||
# Docusaurus cache and generated files
|
||||
.docusaurus
|
||||
|
||||
# Serverless directories
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
# DynamoDB Local files
|
||||
.dynamodb/
|
||||
|
||||
# TernJS port file
|
||||
.tern-port
|
||||
|
||||
# Stores VSCode versions used for testing VSCode extensions
|
||||
.vscode-test
|
||||
|
||||
# yarn v2
|
||||
.yarn/cache
|
||||
.yarn/unplugged
|
||||
.yarn/build-state.yml
|
||||
.yarn/install-state.gz
|
||||
.pnp.*
|
||||
|
||||
__pycache__
|
||||
|
||||
vendor/json-api/*.json
|
||||
vendor/json-api/en/*.json
|
||||
vendor/json-api/ru/*.json
|
||||
vendor/json-api/ko/*.json
|
||||
vendor/json-api/cmn-Hant/*.json
|
||||
vendor/client/tables/*.json
|
||||
vendor/client/descriptions/*
|
||||
!vendor/client/descriptions/.gitkeep
|
||||
|
||||
vendor/client/tables/*
|
||||
!vendor/client/tables/index.ts
|
||||
!vendor/client/tables/ArmourTypesOverride.json
|
||||
!vendor/client/tables/en/.gitkeep
|
||||
!vendor/client/tables/ru/.gitkeep
|
||||
!vendor/client/tables/ko/.gitkeep
|
||||
!vendor/client/tables/cmn-Hant/.gitkeep
|
||||
|
||||
!vendor/client/tables/en/ArmourTypesOverride.json
|
||||
!vendor/client/tables/ru/ArmourTypesOverride.json
|
||||
!vendor/client/tables/ko/ArmourTypesOverride.json
|
||||
!vendor/client/tables/cmn-Hant/ArmourTypesOverride.json
|
||||
|
||||
|
||||
|
||||
!vendor/json-api/.gitkeep
|
||||
!vendor/json-api/en/.gitkeep
|
||||
!vendor/json-api/ru/.gitkeep
|
||||
!vendor/json-api/ko/.gitkeep
|
||||
!vendor/json-api/cmn-Hant/.gitkeep
|
||||
|
||||
|
||||
EXPORT/tables/English/*.json
|
||||
EXPORT/tables/Korean/*.json
|
||||
EXPORT/tables/Russian/*.json
|
||||
EXPORT/tables/Traditional Chinese/*.json
|
||||
|
||||
@@ -1,127 +0,0 @@
|
||||
{
|
||||
"steam": "C:\\Program Files (x86)\\Steam\\steamapps\\common\\Path of Exile 2",
|
||||
"translations": [
|
||||
"English",
|
||||
"Russian"
|
||||
],
|
||||
"tables": [
|
||||
{
|
||||
"name": "BaseItemTypes",
|
||||
"columns": [
|
||||
"Id",
|
||||
"Name",
|
||||
"IsCorrupted",
|
||||
"Width",
|
||||
"Height",
|
||||
"DropLevel",
|
||||
"ItemVisualIdentity",
|
||||
"Implicit_ModsKeys",
|
||||
"ItemClassesKey",
|
||||
"SiteVisibility",
|
||||
"TagsKeys",
|
||||
"TradeMarketCategory"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ItemClasses",
|
||||
"columns": [
|
||||
"Id",
|
||||
"Name",
|
||||
"ItemClassCategory",
|
||||
"TradeMarketCategory"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "WeaponTypes",
|
||||
"columns": [
|
||||
"BaseItemTypesKey",
|
||||
"DamageMin",
|
||||
"DamageMax"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ItemClassCategories",
|
||||
"columns": [
|
||||
"Id",
|
||||
"Text"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "SkillGems",
|
||||
"columns": [
|
||||
"BaseItemTypesKey",
|
||||
"IsVaalVariant",
|
||||
"IsSupport"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "SkillGemInfo",
|
||||
"columns": [
|
||||
"Id",
|
||||
"Description",
|
||||
"SkillGemsKey"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Mods",
|
||||
"columns": [
|
||||
"Id",
|
||||
"Domain",
|
||||
"Name",
|
||||
"StatsKey1",
|
||||
"StatsKey2",
|
||||
"StatsKey3",
|
||||
"StatsKey4"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Tags",
|
||||
"columns": [
|
||||
"Id",
|
||||
"DisplayString"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "UniqueStashLayout",
|
||||
"columns": [
|
||||
"WordsKey",
|
||||
"ItemVisualIdentityKey",
|
||||
"UniqueStashTypesKey",
|
||||
"RenamedVersion",
|
||||
"ShowIfEmptyChallengeLeague"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Words",
|
||||
"columns": [
|
||||
"Wordlist",
|
||||
"Text",
|
||||
"Text2",
|
||||
"SpawnWeight_Tags",
|
||||
"SpawnWeight_Values"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ItemVisualIdentity",
|
||||
"columns": [
|
||||
"Id",
|
||||
"DDSFile",
|
||||
"AOFile"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Stats",
|
||||
"columns": [
|
||||
"Id",
|
||||
"IsLocal",
|
||||
"IsWeaponLocal",
|
||||
"Semantics",
|
||||
"Text",
|
||||
"IsVirtual",
|
||||
"HASH32",
|
||||
"BelongsActiveSkillsKey",
|
||||
"IsScalable"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,758 +0,0 @@
|
||||
[
|
||||
{
|
||||
"_index": 0,
|
||||
"Id": "LifeFlask",
|
||||
"Name": "Флаконы жизни",
|
||||
"TradeMarketCategory": 28,
|
||||
"ItemClassCategory": 0
|
||||
},
|
||||
{
|
||||
"_index": 1,
|
||||
"Id": "ManaFlask",
|
||||
"Name": "Флаконы маны",
|
||||
"TradeMarketCategory": 29,
|
||||
"ItemClassCategory": 0
|
||||
},
|
||||
{
|
||||
"_index": 2,
|
||||
"Id": "DONOTUSE5",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 3,
|
||||
"Id": "Currency",
|
||||
"Name": "Вещи на обмен",
|
||||
"TradeMarketCategory": 39,
|
||||
"ItemClassCategory": 6
|
||||
},
|
||||
{
|
||||
"_index": 4,
|
||||
"Id": "Amulet",
|
||||
"Name": "Амулеты",
|
||||
"TradeMarketCategory": 21,
|
||||
"ItemClassCategory": 7
|
||||
},
|
||||
{
|
||||
"_index": 5,
|
||||
"Id": "Ring",
|
||||
"Name": "Кольца",
|
||||
"TradeMarketCategory": 22,
|
||||
"ItemClassCategory": 8
|
||||
},
|
||||
{
|
||||
"_index": 6,
|
||||
"Id": "Claw",
|
||||
"Name": "Когти",
|
||||
"TradeMarketCategory": 4,
|
||||
"ItemClassCategory": 9
|
||||
},
|
||||
{
|
||||
"_index": 7,
|
||||
"Id": "Dagger",
|
||||
"Name": "Кинжалы",
|
||||
"TradeMarketCategory": 5,
|
||||
"ItemClassCategory": 3
|
||||
},
|
||||
{
|
||||
"_index": 8,
|
||||
"Id": "Wand",
|
||||
"Name": "Жезлы",
|
||||
"TradeMarketCategory": 6,
|
||||
"ItemClassCategory": 10
|
||||
},
|
||||
{
|
||||
"_index": 9,
|
||||
"Id": "One Hand Sword",
|
||||
"Name": "Одноручные мечи",
|
||||
"TradeMarketCategory": 7,
|
||||
"ItemClassCategory": 2
|
||||
},
|
||||
{
|
||||
"_index": 10,
|
||||
"Id": "DONOTUSE6",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 11,
|
||||
"Id": "One Hand Axe",
|
||||
"Name": "Одноручные топоры",
|
||||
"TradeMarketCategory": 9,
|
||||
"ItemClassCategory": 11
|
||||
},
|
||||
{
|
||||
"_index": 12,
|
||||
"Id": "One Hand Mace",
|
||||
"Name": "Одноручные булавы",
|
||||
"TradeMarketCategory": 10,
|
||||
"ItemClassCategory": 1
|
||||
},
|
||||
{
|
||||
"_index": 13,
|
||||
"Id": "Bow",
|
||||
"Name": "Луки",
|
||||
"TradeMarketCategory": 13,
|
||||
"ItemClassCategory": 12
|
||||
},
|
||||
{
|
||||
"_index": 14,
|
||||
"Id": "Staff",
|
||||
"Name": "Посохи",
|
||||
"TradeMarketCategory": 14,
|
||||
"ItemClassCategory": 4
|
||||
},
|
||||
{
|
||||
"_index": 15,
|
||||
"Id": "Two Hand Sword",
|
||||
"Name": "Двуручные мечи",
|
||||
"TradeMarketCategory": 15,
|
||||
"ItemClassCategory": 13
|
||||
},
|
||||
{
|
||||
"_index": 16,
|
||||
"Id": "Two Hand Axe",
|
||||
"Name": "Двуручные топоры",
|
||||
"TradeMarketCategory": 16,
|
||||
"ItemClassCategory": 14
|
||||
},
|
||||
{
|
||||
"_index": 17,
|
||||
"Id": "Two Hand Mace",
|
||||
"Name": "Двуручные булавы",
|
||||
"TradeMarketCategory": 17,
|
||||
"ItemClassCategory": 15
|
||||
},
|
||||
{
|
||||
"_index": 18,
|
||||
"Id": "Active Skill Gem",
|
||||
"Name": "Камни умений",
|
||||
"TradeMarketCategory": 26,
|
||||
"ItemClassCategory": 16
|
||||
},
|
||||
{
|
||||
"_index": 19,
|
||||
"Id": "Support Skill Gem",
|
||||
"Name": "Камни поддержки",
|
||||
"TradeMarketCategory": 27,
|
||||
"ItemClassCategory": 17
|
||||
},
|
||||
{
|
||||
"_index": 20,
|
||||
"Id": "Quiver",
|
||||
"Name": "Колчаны",
|
||||
"TradeMarketCategory": 19,
|
||||
"ItemClassCategory": 18
|
||||
},
|
||||
{
|
||||
"_index": 21,
|
||||
"Id": "Belt",
|
||||
"Name": "Пояса",
|
||||
"TradeMarketCategory": 23,
|
||||
"ItemClassCategory": 19
|
||||
},
|
||||
{
|
||||
"_index": 22,
|
||||
"Id": "Gloves",
|
||||
"Name": "Перчатки",
|
||||
"TradeMarketCategory": 0,
|
||||
"ItemClassCategory": 20
|
||||
},
|
||||
{
|
||||
"_index": 23,
|
||||
"Id": "Boots",
|
||||
"Name": "Обувь",
|
||||
"TradeMarketCategory": 1,
|
||||
"ItemClassCategory": 21
|
||||
},
|
||||
{
|
||||
"_index": 24,
|
||||
"Id": "Body Armour",
|
||||
"Name": "Доспехи",
|
||||
"TradeMarketCategory": 2,
|
||||
"ItemClassCategory": 22
|
||||
},
|
||||
{
|
||||
"_index": 25,
|
||||
"Id": "Helmet",
|
||||
"Name": "Шлемы",
|
||||
"TradeMarketCategory": 3,
|
||||
"ItemClassCategory": 23
|
||||
},
|
||||
{
|
||||
"_index": 26,
|
||||
"Id": "Shield",
|
||||
"Name": "Щиты",
|
||||
"TradeMarketCategory": 20,
|
||||
"ItemClassCategory": 24
|
||||
},
|
||||
{
|
||||
"_index": 27,
|
||||
"Id": "SmallRelic",
|
||||
"Name": "Малые реликвии",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 28,
|
||||
"Id": "MediumRelic",
|
||||
"Name": "Средние реликвии",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 29,
|
||||
"Id": "LargeRelic",
|
||||
"Name": "Большие реликвии",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 30,
|
||||
"Id": "StackableCurrency",
|
||||
"Name": "Валюта",
|
||||
"TradeMarketCategory": 39,
|
||||
"ItemClassCategory": 6
|
||||
},
|
||||
{
|
||||
"_index": 31,
|
||||
"Id": "QuestItem",
|
||||
"Name": "Вещи для заданий",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 25
|
||||
},
|
||||
{
|
||||
"_index": 32,
|
||||
"Id": "Sceptre",
|
||||
"Name": "Скипетры",
|
||||
"TradeMarketCategory": 11,
|
||||
"ItemClassCategory": 61
|
||||
},
|
||||
{
|
||||
"_index": 33,
|
||||
"Id": "UtilityFlask",
|
||||
"Name": "Обереги",
|
||||
"TradeMarketCategory": 31,
|
||||
"ItemClassCategory": 69
|
||||
},
|
||||
{
|
||||
"_index": 34,
|
||||
"Id": "DONOTUSE7",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 35,
|
||||
"Id": "Map",
|
||||
"Name": "Путевые камни",
|
||||
"TradeMarketCategory": 34,
|
||||
"ItemClassCategory": 26
|
||||
},
|
||||
{
|
||||
"_index": 36,
|
||||
"Id": "Unarmed",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 66
|
||||
},
|
||||
{
|
||||
"_index": 37,
|
||||
"Id": "FishingRod",
|
||||
"Name": "Удочки",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 27
|
||||
},
|
||||
{
|
||||
"_index": 38,
|
||||
"Id": "MapFragment",
|
||||
"Name": "Обрывки карт",
|
||||
"TradeMarketCategory": 37,
|
||||
"ItemClassCategory": 28
|
||||
},
|
||||
{
|
||||
"_index": 39,
|
||||
"Id": "HideoutDoodad",
|
||||
"Name": "Предметы убежища",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 40,
|
||||
"Id": "Microtransaction",
|
||||
"Name": "Микротранзакции",
|
||||
"TradeMarketCategory": 53,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 41,
|
||||
"Id": "Jewel",
|
||||
"Name": "Самоцветы",
|
||||
"TradeMarketCategory": 35,
|
||||
"ItemClassCategory": 29
|
||||
},
|
||||
{
|
||||
"_index": 42,
|
||||
"Id": "DivinationCard",
|
||||
"Name": "Гадальные карты",
|
||||
"TradeMarketCategory": 40,
|
||||
"ItemClassCategory": 30
|
||||
},
|
||||
{
|
||||
"_index": 43,
|
||||
"Id": "DONOTUSE8",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 44,
|
||||
"Id": "DONOTUSE9",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 45,
|
||||
"Id": "DONOTUSE10",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 46,
|
||||
"Id": "MiscMapItem",
|
||||
"Name": "Прочие предметы карт",
|
||||
"TradeMarketCategory": 38,
|
||||
"ItemClassCategory": 33
|
||||
},
|
||||
{
|
||||
"_index": 47,
|
||||
"Id": "Leaguestone",
|
||||
"Name": "Камни лиги",
|
||||
"TradeMarketCategory": 33,
|
||||
"ItemClassCategory": 34
|
||||
},
|
||||
{
|
||||
"_index": 48,
|
||||
"Id": "PantheonSoul",
|
||||
"Name": "Души Пантеона",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 35
|
||||
},
|
||||
{
|
||||
"_index": 49,
|
||||
"Id": "UniqueFragment",
|
||||
"Name": "Фрагменты",
|
||||
"TradeMarketCategory": 41,
|
||||
"ItemClassCategory": 36
|
||||
},
|
||||
{
|
||||
"_index": 50,
|
||||
"Id": "AbyssJewel",
|
||||
"Name": "Самоцветы Бездны",
|
||||
"TradeMarketCategory": 36,
|
||||
"ItemClassCategory": 37
|
||||
},
|
||||
{
|
||||
"_index": 51,
|
||||
"Id": "IncursionItem",
|
||||
"Name": "Предметы Вмешательства",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 38
|
||||
},
|
||||
{
|
||||
"_index": 52,
|
||||
"Id": "DelveSocketableCurrency",
|
||||
"Name": "Валюта Спуска",
|
||||
"TradeMarketCategory": 43,
|
||||
"ItemClassCategory": 39
|
||||
},
|
||||
{
|
||||
"_index": 53,
|
||||
"Id": "Incubator",
|
||||
"Name": "Инкубаторы",
|
||||
"TradeMarketCategory": 45,
|
||||
"ItemClassCategory": 40
|
||||
},
|
||||
{
|
||||
"_index": 54,
|
||||
"Id": "UniqueShard",
|
||||
"Name": "Осколки",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 55,
|
||||
"Id": "UniqueShardBase",
|
||||
"Name": "Стержни осколков",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 56,
|
||||
"Id": "DONOTUSE11",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 57,
|
||||
"Id": "Warstaff",
|
||||
"Name": "Боевые посохи",
|
||||
"TradeMarketCategory": 18,
|
||||
"ItemClassCategory": 5
|
||||
},
|
||||
{
|
||||
"_index": 58,
|
||||
"Id": "DelveStackableSocketableCurrency",
|
||||
"Name": "Валюта Спуска",
|
||||
"TradeMarketCategory": 43,
|
||||
"ItemClassCategory": 39
|
||||
},
|
||||
{
|
||||
"_index": 59,
|
||||
"Id": "AtlasUpgradeItem",
|
||||
"Name": "Предметы улучшения Атласа",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 41
|
||||
},
|
||||
{
|
||||
"_index": 60,
|
||||
"Id": "DONOTUSE4",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 61,
|
||||
"Id": "HiddenItem",
|
||||
"Name": "Сокрытые предметы",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 62,
|
||||
"Id": "DONOTUSE1",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 63,
|
||||
"Id": "DONOTUSE2",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 64,
|
||||
"Id": "DONOTUSE3",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 65,
|
||||
"Id": "HeistContract",
|
||||
"Name": "Контракты",
|
||||
"TradeMarketCategory": 48,
|
||||
"ItemClassCategory": 42
|
||||
},
|
||||
{
|
||||
"_index": 66,
|
||||
"Id": "HeistEquipmentWeapon",
|
||||
"Name": "Разбойничьи принадлежности",
|
||||
"TradeMarketCategory": 48,
|
||||
"ItemClassCategory": 43
|
||||
},
|
||||
{
|
||||
"_index": 67,
|
||||
"Id": "HeistEquipmentTool",
|
||||
"Name": "Разбойничий инструмент",
|
||||
"TradeMarketCategory": 48,
|
||||
"ItemClassCategory": 44
|
||||
},
|
||||
{
|
||||
"_index": 68,
|
||||
"Id": "HeistEquipmentUtility",
|
||||
"Name": "Разбойничьи накидки",
|
||||
"TradeMarketCategory": 48,
|
||||
"ItemClassCategory": 45
|
||||
},
|
||||
{
|
||||
"_index": 69,
|
||||
"Id": "HeistEquipmentReward",
|
||||
"Name": "Разбойничьи броши",
|
||||
"TradeMarketCategory": 48,
|
||||
"ItemClassCategory": 46
|
||||
},
|
||||
{
|
||||
"_index": 70,
|
||||
"Id": "HeistBlueprint",
|
||||
"Name": "Чертежи",
|
||||
"TradeMarketCategory": 48,
|
||||
"ItemClassCategory": 47
|
||||
},
|
||||
{
|
||||
"_index": 71,
|
||||
"Id": "Trinket",
|
||||
"Name": "Украшения",
|
||||
"TradeMarketCategory": 25,
|
||||
"ItemClassCategory": 48
|
||||
},
|
||||
{
|
||||
"_index": 72,
|
||||
"Id": "HeistObjective",
|
||||
"Name": "Предметы кражи",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 49
|
||||
},
|
||||
{
|
||||
"_index": 73,
|
||||
"Id": "ExpeditionLogbook",
|
||||
"Name": "Журналы экспедиции",
|
||||
"TradeMarketCategory": 49,
|
||||
"ItemClassCategory": 50
|
||||
},
|
||||
{
|
||||
"_index": 74,
|
||||
"Id": "IncubatorStackable",
|
||||
"Name": "Инкубаторы",
|
||||
"TradeMarketCategory": 45,
|
||||
"ItemClassCategory": 40
|
||||
},
|
||||
{
|
||||
"_index": 75,
|
||||
"Id": "ArchnemesisMod",
|
||||
"Name": "Свойства Возмездия",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 76,
|
||||
"Id": "Meta Skill Gem",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 64
|
||||
},
|
||||
{
|
||||
"_index": 77,
|
||||
"Id": "Spear",
|
||||
"Name": "Копья",
|
||||
"TradeMarketCategory": 55,
|
||||
"ItemClassCategory": 57
|
||||
},
|
||||
{
|
||||
"_index": 78,
|
||||
"Id": "Crossbow",
|
||||
"Name": "Самострелы",
|
||||
"TradeMarketCategory": 56,
|
||||
"ItemClassCategory": 58
|
||||
},
|
||||
{
|
||||
"_index": 79,
|
||||
"Id": "Focus",
|
||||
"Name": "Фокусы",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 59
|
||||
},
|
||||
{
|
||||
"_index": 80,
|
||||
"Id": "InstanceLocalItem",
|
||||
"Name": "Местные предметы области",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 51
|
||||
},
|
||||
{
|
||||
"_index": 81,
|
||||
"Id": "SentinelDrone",
|
||||
"Name": "Часовые",
|
||||
"TradeMarketCategory": 51,
|
||||
"ItemClassCategory": 52
|
||||
},
|
||||
{
|
||||
"_index": 82,
|
||||
"Id": "MemoryLine",
|
||||
"Name": "Воспоминания",
|
||||
"TradeMarketCategory": 52,
|
||||
"ItemClassCategory": 54
|
||||
},
|
||||
{
|
||||
"_index": 83,
|
||||
"Id": "Flail",
|
||||
"Name": "Кистени",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 60
|
||||
},
|
||||
{
|
||||
"_index": 84,
|
||||
"Id": "Relic",
|
||||
"Name": "Реликвии",
|
||||
"TradeMarketCategory": 54,
|
||||
"ItemClassCategory": 53
|
||||
},
|
||||
{
|
||||
"_index": 85,
|
||||
"Id": "SanctumSpecialRelic",
|
||||
"Name": "Священные реликвии",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 53
|
||||
},
|
||||
{
|
||||
"_index": 86,
|
||||
"Id": "Breachstone",
|
||||
"Name": "Камни Разлома",
|
||||
"TradeMarketCategory": 37,
|
||||
"ItemClassCategory": 55
|
||||
},
|
||||
{
|
||||
"_index": 87,
|
||||
"Id": "GiftBox",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 88,
|
||||
"Id": "VaultKey",
|
||||
"Name": "Ключи от хранилищ",
|
||||
"TradeMarketCategory": 38,
|
||||
"ItemClassCategory": 56
|
||||
},
|
||||
{
|
||||
"_index": 89,
|
||||
"Id": "ItemisedSanctum",
|
||||
"Name": "Монеты Испытания",
|
||||
"TradeMarketCategory": 38,
|
||||
"ItemClassCategory": 33
|
||||
},
|
||||
{
|
||||
"_index": 90,
|
||||
"Id": "DONOTUSE12",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 91,
|
||||
"Id": "UncutSkillGem",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 65
|
||||
},
|
||||
{
|
||||
"_index": 92,
|
||||
"Id": "Buckler",
|
||||
"Name": "Баклеры",
|
||||
"TradeMarketCategory": 57,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 93,
|
||||
"Id": "Thrown One Hand Axe",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 94,
|
||||
"Id": "Thrown Two Hand Axe",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 95,
|
||||
"Id": "ConventionTreasure",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 96,
|
||||
"Id": "TrapTool",
|
||||
"Name": "Ловушки",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 63
|
||||
},
|
||||
{
|
||||
"_index": 97,
|
||||
"Id": "Crossbow Attachment REMOVE",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 98,
|
||||
"Id": "SkillGemToken",
|
||||
"Name": "Вещи на обмен",
|
||||
"TradeMarketCategory": 39,
|
||||
"ItemClassCategory": 6
|
||||
},
|
||||
{
|
||||
"_index": 99,
|
||||
"Id": "Nothing",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 100,
|
||||
"Id": "UltimatumKey",
|
||||
"Name": "Начертанные Ультиматумы",
|
||||
"TradeMarketCategory": 38,
|
||||
"ItemClassCategory": 33
|
||||
},
|
||||
{
|
||||
"_index": 101,
|
||||
"Id": "UncutSupportGem",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 65
|
||||
},
|
||||
{
|
||||
"_index": 102,
|
||||
"Id": "UncutReservationGem",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 65
|
||||
},
|
||||
{
|
||||
"_index": 103,
|
||||
"Id": "Thrown Shield",
|
||||
"Name": "",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
},
|
||||
{
|
||||
"_index": 104,
|
||||
"Id": "SoulCore",
|
||||
"Name": "Размещаемое",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 67
|
||||
},
|
||||
{
|
||||
"_index": 105,
|
||||
"Id": "TowerAugmentation",
|
||||
"Name": "Плитки",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 68
|
||||
},
|
||||
{
|
||||
"_index": 106,
|
||||
"Id": "Omen",
|
||||
"Name": "Предзнаменования",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": 70
|
||||
},
|
||||
{
|
||||
"_index": 107,
|
||||
"Id": "PinnacleKey",
|
||||
"Name": "Древние ключи",
|
||||
"TradeMarketCategory": null,
|
||||
"ItemClassCategory": null
|
||||
}
|
||||
]
|
||||
@@ -1,44 +0,0 @@
|
||||
[
|
||||
{
|
||||
"name": "The Beachhead",
|
||||
"basetype": "The Beachhead",
|
||||
"fixedStats": [
|
||||
{
|
||||
"ref": "Base/Armour/BaseArmour",
|
||||
"value": 100
|
||||
},
|
||||
{
|
||||
"ref": "Base/Evasion/BaseEvasion",
|
||||
"value": 100
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "The Burden of Leadership",
|
||||
"basetype": "The Burden of Leadership",
|
||||
"fixedStats": [
|
||||
{
|
||||
"ref": "Base/Armour/BaseArmour",
|
||||
"value": 100
|
||||
},
|
||||
{
|
||||
"ref": "Base/Evasion/BaseEvasion",
|
||||
"value": 100
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "The Burden of Speed",
|
||||
"basetype": "The Burden of Speed",
|
||||
"fixedStats": [
|
||||
{
|
||||
"ref": "Base/Armour/BaseArmour",
|
||||
"value": 100
|
||||
},
|
||||
{
|
||||
"ref": "Base/Evasion/BaseEvasion",
|
||||
"value": 100
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -1,8 +0,0 @@
|
||||
|
||||
|
||||
supported_languages=("en" "ru")
|
||||
|
||||
for lang in "${supported_languages[@]}"; do
|
||||
echo "Copying $lang"
|
||||
cp -R ./vendor/client/pyDumps/$lang/* ./data/$lang/
|
||||
done
|
||||
@@ -1,41 +0,0 @@
|
||||
import json
|
||||
import os
|
||||
|
||||
def get_script_dir():
|
||||
"""Returns the directory where the script is located."""
|
||||
return os.path.dirname(os.path.realpath(__file__))
|
||||
|
||||
def read_ndjson(file_path):
|
||||
"""Reads a newline-delimited JSON file and returns a list of parsed JSON objects."""
|
||||
with open(file_path, 'r', encoding='utf-8') as file:
|
||||
return [json.loads(line) for line in file]
|
||||
|
||||
def write_ndjson(file_path, data):
|
||||
"""Writes a list of JSON objects to a newline-delimited JSON file."""
|
||||
with open(file_path, 'w', encoding='utf-8') as file:
|
||||
for item in data:
|
||||
file.write(json.dumps(item) + '\n')
|
||||
|
||||
def update_icons(new_items, old_items):
|
||||
"""Update icons in new_items if they are missing and present in old_items."""
|
||||
old_icons = {item['refName']: item['icon'] for item in old_items if 'icon' in item}
|
||||
|
||||
for new_item in new_items:
|
||||
ref_name = new_item['refName']
|
||||
if new_item.get('icon') == "%NOT_FOUND%" and ref_name in old_icons:
|
||||
new_item['icon'] = old_icons[ref_name]
|
||||
|
||||
return new_items
|
||||
|
||||
# Determine the directory this script is in
|
||||
script_dir = get_script_dir()
|
||||
|
||||
# Load the old and new items from the respective files in the script's directory
|
||||
old_items = read_ndjson(os.path.join(script_dir, 'items.ndjson.old'))
|
||||
new_items = read_ndjson(os.path.join(script_dir, 'items.ndjson'))
|
||||
|
||||
# Update new_items with icons from old_items where applicable
|
||||
updated_new_items = update_icons(new_items, old_items)
|
||||
|
||||
# Write the updated new items back to the new file or a new file as needed
|
||||
write_ndjson(os.path.join(script_dir, 'items.ndjson'), updated_new_items)
|
||||
@@ -1,141 +0,0 @@
|
||||
export enum ItemCategory {
|
||||
Map = 'Map',
|
||||
CapturedBeast = 'Captured Beast',
|
||||
MetamorphSample = 'Metamorph Sample',
|
||||
Helmet = 'Helmet',
|
||||
BodyArmour = 'Body Armour',
|
||||
Gloves = 'Gloves',
|
||||
Boots = 'Boots',
|
||||
Shield = 'Shield',
|
||||
Amulet = 'Amulet',
|
||||
Belt = 'Belt',
|
||||
Ring = 'Ring',
|
||||
Flask = 'Flask',
|
||||
AbyssJewel = 'Abyss Jewel',
|
||||
Jewel = 'Jewel',
|
||||
Quiver = 'Quiver',
|
||||
Claw = 'Claw',
|
||||
Bow = 'Bow',
|
||||
Sceptre = 'Sceptre',
|
||||
Wand = 'Wand',
|
||||
FishingRod = 'Fishing Rod',
|
||||
Staff = 'Staff',
|
||||
Warstaff = 'Warstaff',
|
||||
Dagger = 'Dagger',
|
||||
RuneDagger = 'Rune Dagger',
|
||||
OneHandedAxe = 'One-Handed Axe',
|
||||
TwoHandedAxe = 'Two-Handed Axe',
|
||||
OneHandedMace = 'One-Handed Mace',
|
||||
TwoHandedMace = 'Two-Handed Mace',
|
||||
OneHandedSword = 'One-Handed Sword',
|
||||
TwoHandedSword = 'Two-Handed Sword',
|
||||
ClusterJewel = 'Cluster Jewel',
|
||||
HeistBlueprint = 'Heist Blueprint',
|
||||
HeistContract = 'Heist Contract',
|
||||
HeistTool = 'Heist Tool',
|
||||
HeistBrooch = 'Heist Brooch',
|
||||
HeistGear = 'Heist Gear',
|
||||
HeistCloak = 'Heist Cloak',
|
||||
Trinket = 'Trinket',
|
||||
Invitation = 'Invitation',
|
||||
Gem = 'Gem',
|
||||
Currency = 'Currency',
|
||||
DivinationCard = 'Divination Card',
|
||||
Voidstone = 'Voidstone',
|
||||
Sentinel = 'Sentinel',
|
||||
MemoryLine = 'Memory Line',
|
||||
SanctumRelic = 'Sanctum Relic',
|
||||
Tincture = 'Tincture',
|
||||
Charm = 'Charm',
|
||||
Crossbow = 'Crossbow',
|
||||
SkillGem = 'Skill Gem',
|
||||
SupportGem = 'Support Gem',
|
||||
MetaGem = 'Meta Gem',
|
||||
}
|
||||
|
||||
export interface StatMatcher {
|
||||
string: string
|
||||
advanced?: string
|
||||
negate?: true
|
||||
value?: number
|
||||
oils?: string // Amulet anointment
|
||||
}
|
||||
|
||||
export enum StatBetter {
|
||||
NegativeRoll = -1,
|
||||
PositiveRoll = 1,
|
||||
NotComparable = 0
|
||||
}
|
||||
|
||||
export interface Stat {
|
||||
ref: string
|
||||
dp?: true
|
||||
matchers: StatMatcher[]
|
||||
better: StatBetter
|
||||
fromAreaMods?: true
|
||||
fromUberAreaMods?: true
|
||||
fromHeistAreaMods?: true
|
||||
anointments?: Array<{ roll: number, oils: string }> // Ring anointments
|
||||
trade: {
|
||||
inverted?: true
|
||||
option?: true
|
||||
ids: {
|
||||
[type: string]: string[]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export interface DropEntry {
|
||||
query: string[]
|
||||
items: string[]
|
||||
}
|
||||
|
||||
export interface BaseType {
|
||||
name: string
|
||||
refName: string
|
||||
namespace: (
|
||||
'DIVINATION_CARD' |
|
||||
'CAPTURED_BEAST' |
|
||||
'UNIQUE' |
|
||||
'ITEM' |
|
||||
'GEM'
|
||||
)
|
||||
icon: string
|
||||
w?: number
|
||||
h?: number
|
||||
tradeTag?: string
|
||||
tradeDisc?: string
|
||||
disc?: {
|
||||
propAR?: true
|
||||
propEV?: true
|
||||
propES?: true
|
||||
hasImplicit?: { ref: Stat['ref'] }
|
||||
hasExplicit?: { ref: Stat['ref'] }
|
||||
sectionText?: string
|
||||
mapTier?: 'W' | 'Y' | 'R'
|
||||
}
|
||||
// extra info
|
||||
craftable?: {
|
||||
category: string
|
||||
corrupted?: true
|
||||
uniqueOnly?: true
|
||||
}
|
||||
unique?: {
|
||||
base: BaseType['refName']
|
||||
fixedStats?: Array<Stat['ref']>
|
||||
}
|
||||
map?: {
|
||||
screenshot?: string
|
||||
}
|
||||
gem?: {
|
||||
vaal?: true
|
||||
awakened?: true
|
||||
transfigured?: true
|
||||
normalVariant?: BaseType['refName']
|
||||
}
|
||||
armour?: {
|
||||
ar?: [min: number, max: number]
|
||||
ev?: [min: number, max: number]
|
||||
es?: [min: number, max: number]
|
||||
}
|
||||
}
|
||||
@@ -1,333 +0,0 @@
|
||||
import * as fs from 'node:fs'
|
||||
import * as Tables from './vendor/client/tables/index'
|
||||
import { BaseType } from './data/interfaces-apt.js'
|
||||
import * as UNIQUE_FIXED_STATS from './base/unique_mods.json'
|
||||
import { API_ALL_ITEMS, API_BULK_ITEMS, API_ITEM_ICONS } from './vendor/trade-api/index'
|
||||
import * as assert from 'node:assert'
|
||||
import * as path from 'node:path';
|
||||
|
||||
// const MAP_SCREENSHOTS = JSON.parse(
|
||||
// fs.readFileSync(path.join(__dirname, './maps.json'), { encoding: 'utf-8' })
|
||||
// ) as Array<[string, { img: string }]>;
|
||||
|
||||
const ITEM_OVERRIDES = new Map([
|
||||
// BaseItemTypes (Id)
|
||||
['Metadata/Items/Armours/Boots/BootsAtlas1', { icon: 'https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvQXJtb3Vycy9Cb290cy9Ud29Ub25lZEJvb3RzIiwidyI6MiwiaCI6Miwic2NhbGUiOjF9XQ/93a61b5672/TwoTonedBoots.png', disc: { propEV: true, propES: true } as const }],
|
||||
['Metadata/Items/Armours/Boots/BootsAtlas2', { icon: 'https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvQXJtb3Vycy9Cb290cy9Ud29Ub25lZEJvb3RzMkIiLCJ3IjoyLCJoIjoyLCJzY2FsZSI6MX1d/c046f556ab/TwoTonedBoots2B.png', disc: { propAR: true, propEV: true } as const }],
|
||||
['Metadata/Items/Armours/Boots/BootsAtlas3', { icon: 'https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvQXJtb3Vycy9Cb290cy9Ud29Ub25lZEJvb3RzM0IiLCJ3IjoyLCJoIjoyLCJzY2FsZSI6MX1d/e3271c5de1/TwoTonedBoots3B.png', disc: { propAR: true, propES: true } as const }],
|
||||
])
|
||||
|
||||
const EXTRA_ITEMS: BaseType[] = [
|
||||
{ name: 'Blighted Map', refName: 'Blighted Map', namespace: 'ITEM', icon: 'https://i.imgur.com/CRmwRkA.png' },
|
||||
{ name: 'Blight-ravaged Map', refName: 'Blight-ravaged Map', namespace: 'ITEM', icon: 'https://i.imgur.com/FpyXU1v.png' }
|
||||
]
|
||||
|
||||
const ITEM_CATEGORY = new Map([
|
||||
['Helmet', { name: 'Helmet', craftable: true }],
|
||||
['Body Armour', { name: 'Body Armour', craftable: true }],
|
||||
['Gloves', { name: 'Gloves', craftable: true }],
|
||||
['Boots', { name: 'Boots', craftable: true }],
|
||||
['Shield', { name: 'Shield', craftable: true }],
|
||||
['Amulet', { name: 'Amulet', craftable: true }],
|
||||
['Belt', { name: 'Belt', craftable: true }],
|
||||
['Ring', { name: 'Ring', craftable: true }],
|
||||
['LifeFlask', { name: 'Flask', craftable: true }],
|
||||
['ManaFlask', { name: 'Flask', craftable: true }],
|
||||
['UtilityFlask', { name: 'Flask', craftable: true }],
|
||||
// ['AbyssJewel', { name: 'Abyss Jewel', craftable: true }],
|
||||
['Jewel', { name: 'Jewel', craftable: true }],
|
||||
// ['Cluster Jewel', { name: 'Cluster Jewel', craftable: true }], // NOTE: manual
|
||||
['Quiver', { name: 'Quiver', craftable: true }],
|
||||
['Claw', { name: 'Claw', craftable: true }],
|
||||
['Dagger', { name: 'Dagger', craftable: true }],
|
||||
['Bow', { name: 'Bow', craftable: true }],
|
||||
['Sceptre', { name: 'Sceptre', craftable: true }],
|
||||
['Wand', { name: 'Wand', craftable: true }],
|
||||
['FishingRod', { name: 'Fishing Rod', craftable: true }],
|
||||
['Staff', { name: 'Staff', craftable: true }],
|
||||
['Warstaff', { name: 'Warstaff', craftable: true }],
|
||||
['One Hand Axe', { name: 'One-Handed Axe', craftable: true }],
|
||||
['Two Hand Axe', { name: 'Two-Handed Axe', craftable: true }],
|
||||
['One Hand Mace', { name: 'One-Handed Mace', craftable: true }],
|
||||
['Two Hand Mace', { name: 'Two-Handed Mace', craftable: true }],
|
||||
['One Hand Sword', { name: 'One-Handed Sword', craftable: true }],
|
||||
// ['Thrusting One Hand Sword', { name: 'One-Handed Sword', craftable: true }],
|
||||
['Two Hand Sword', { name: 'Two-Handed Sword', craftable: true }],
|
||||
|
||||
['Relic', { name: 'Sanctum Relic', craftable: true }],
|
||||
['Tincture', { name: 'Tincture', craftable: true }],
|
||||
['AnimalCharm', { name: 'Charm', craftable: true }],
|
||||
['ExpeditionLogbook', { name: 'Expedition Logbook', craftable: true }],
|
||||
[`Invitation`, { name: `Invitation`, craftable: true }], // NOTE: manual
|
||||
['MemoryLine', { name: 'Memory Line', craftable: true }],
|
||||
['HeistBlueprint', { name: 'Heist Blueprint', craftable: true }],
|
||||
['HeistContract', { name: 'Heist Contract', craftable: true }],
|
||||
['HeistEquipmentTool', { name: 'Heist Tool', craftable: true }],
|
||||
['HeistEquipmentReward', { name: 'Heist Brooch', craftable: true }],
|
||||
['HeistEquipmentWeapon', { name: 'Heist Gear', craftable: true }],
|
||||
['HeistEquipmentUtility', { name: 'Heist Cloak', craftable: true }],
|
||||
['Trinket', { name: 'Trinket', craftable: true }],
|
||||
['UniqueFragment', { name: 'Unique Fragment', craftable: true, uniqueOnly: true }],
|
||||
|
||||
['NecropolisPack', {}],
|
||||
['ItemisedCorpse', {}],
|
||||
['ItemisedSanctum', {}],
|
||||
['MiscMapItem', {}],
|
||||
['Breachstone', {}],
|
||||
['VaultKey', {}],
|
||||
['StackableCurrency', {}],
|
||||
['DelveStackableSocketableCurrency', {}],
|
||||
['IncubatorStackable', {}],
|
||||
['MapFragment', {}],
|
||||
['MetamorphosisDNA', {}],
|
||||
|
||||
|
||||
['Spear', { name: 'Spear', craftable: true }],
|
||||
['Flail', { name: 'Flail', craftable: true }],
|
||||
['Crossbow', { name: 'Crossbow', craftable: true }],
|
||||
['TrapTool', { name: 'Trap Tool', craftable: true }],
|
||||
])
|
||||
const ArmourTypes = Tables.ArmourTypes()
|
||||
function getArmourField(baseRid: number): BaseType['armour'] {
|
||||
const found = ArmourTypes.find(row => row.BaseItemTypesKey === baseRid)
|
||||
return (found) ? {
|
||||
ar: (found.Armour > 0) ? [found.Armour, found.Armour] : undefined,
|
||||
ev: (found.Evasion > 0) ? [found.Evasion, found.Evasion] : undefined,
|
||||
es: (found.EnergyShield > 0) ? [found.EnergyShield, found.EnergyShield] : undefined,
|
||||
} : undefined
|
||||
}
|
||||
|
||||
export function makeGenerator2Bases() {
|
||||
const ITEM_CLASS_BLACKLIST = new Set([
|
||||
'DelveSocketableCurrency',
|
||||
'Microtransaction',
|
||||
'HiddenItem',
|
||||
'QuestItem',
|
||||
'LabyrinthItem',
|
||||
'LabyrinthTrinket',
|
||||
'Leaguestone',
|
||||
'Currency',
|
||||
'Incubator',
|
||||
'SanctumSpecialRelic',
|
||||
'HideoutDoodad',
|
||||
'LabyrinthMapItem',
|
||||
'PantheonSoul',
|
||||
'IncursionItem',
|
||||
'HeistObjective',
|
||||
'AtlasUpgradeItem',
|
||||
'ArchnemesisMod',
|
||||
'SentinelDrone',
|
||||
'GiftBox',
|
||||
'InstanceLocalItem',
|
||||
'Gold',
|
||||
'Map', // ++
|
||||
'DivinationCard', // ++
|
||||
'Active Skill Gem', // ++
|
||||
'Support Skill Gem', // ++
|
||||
'Meta Skill Gem', // ++
|
||||
'SoulCore',
|
||||
'UncutSkillGem',
|
||||
'UncutSupportGem',
|
||||
'ConventionTreasure',
|
||||
'SkillGemToken',
|
||||
'PinnacleKey',
|
||||
'UltimatumKey',
|
||||
'UncutReservationGem',
|
||||
'TowerAugmentation',
|
||||
'Omen',
|
||||
'Focus',
|
||||
])
|
||||
|
||||
const ItemClasses = Tables.ItemClasses()
|
||||
const Tags = Tables.Tags()
|
||||
|
||||
const bulkItems = API_BULK_ITEMS().filter(s =>
|
||||
s.id !== 'Coffins' &&
|
||||
s.id !== 'Cards' &&
|
||||
s.id !== 'Sanctum' &&
|
||||
!s.id.startsWith('Maps')
|
||||
).flatMap(s => s.entries.map((i => ({ ...i, image: i.image && `https://web.poecdn.com${i.image}` }))))
|
||||
|
||||
const baseIcons = API_ITEM_ICONS().filter(i => !i.unique)
|
||||
|
||||
|
||||
const baseTypes = Tables.BaseItemTypes()
|
||||
.filter(row => {
|
||||
const itemClass = ItemClasses[row.ItemClassesKey as unknown as number].Id
|
||||
if (!ITEM_CATEGORY.has(itemClass)) {
|
||||
assert.ok(ITEM_CLASS_BLACKLIST.has(itemClass), itemClass)
|
||||
return false
|
||||
}
|
||||
return !((
|
||||
row.Name !== 'Albino Rhoa Feather' &&
|
||||
row.Name !== 'Fishing Rod' &&
|
||||
row.Name !== 'Two-Stone Ring' &&
|
||||
row.Name !== 'Two-Toned Boots' &&
|
||||
(
|
||||
row.Name === 'Imprinted Bestiary Orb' ||
|
||||
row.Name === 'Uncarved Gemstone' ||
|
||||
(itemClass === 'ItemisedSanctum' && row.TagsKeys.length < 2) ||
|
||||
row.SiteVisibility !== 1
|
||||
)
|
||||
))
|
||||
})
|
||||
.map(row => ({
|
||||
...row,
|
||||
armour: getArmourField(row._index),
|
||||
tradeTag: bulkItems.find(e => e.text === row.Name)?.id,
|
||||
icon: bulkItems.find(e => e.text === row.Name)?.image ??
|
||||
baseIcons.find(e => e.baseType === row.Name)?.icon
|
||||
}))
|
||||
|
||||
return (lang: string) => {
|
||||
const BaseItemTypes = Tables.BaseItemTypes(lang)
|
||||
|
||||
return baseTypes.map<BaseType>(row => {
|
||||
let itemClass = ItemClasses[row.ItemClassesKey as unknown as number].Id
|
||||
if (itemClass === 'Jewel' && row.TagsKeys.some(rid => Tags[rid as unknown as number].Id.startsWith('expansion_jewel_'))) {
|
||||
itemClass = 'Cluster Jewel'
|
||||
}
|
||||
if (itemClass === 'MiscMapItem' && row.TagsKeys.some(rid =>
|
||||
Tags[rid as unknown as number].Id === 'maven_map' || Tags[rid as unknown as number].Id === 'primordial_map'
|
||||
)) {
|
||||
itemClass = 'Invitation'
|
||||
}
|
||||
|
||||
const category = ITEM_CATEGORY.get(itemClass) ?? assert.fail()
|
||||
|
||||
return {
|
||||
name: BaseItemTypes[row._index].Name,
|
||||
refName: row.Name,
|
||||
namespace: 'ITEM',
|
||||
craftable: (category.craftable)
|
||||
? {
|
||||
category: category.name,
|
||||
corrupted: row.IsCorrupted || undefined,
|
||||
uniqueOnly: category.uniqueOnly || undefined
|
||||
}
|
||||
: undefined,
|
||||
tradeTag: row.tradeTag,
|
||||
armour: row.armour,
|
||||
icon: (category.uniqueOnly) ? '' : (row.icon ?? '%NOT_FOUND%'),
|
||||
w: (row.Width > 1) ? row.Width : undefined,
|
||||
h: (row.Height > 1) ? row.Height : undefined,
|
||||
...(ITEM_OVERRIDES.get(row.Id) ?? {} as object)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export function makeGenerator4Uniques() {
|
||||
const ndjsonBaseTypes = [
|
||||
// ...makeGenerator2Map()('en'),
|
||||
...makeGenerator2Bases()('en')
|
||||
]
|
||||
|
||||
const WORDLIST_UNIQUE = 6
|
||||
const Words = Tables.Words()
|
||||
|
||||
const UNIQUE_ICONS = API_ITEM_ICONS().filter(i => i.unique)
|
||||
|
||||
const tradeUniqueItems = API_ALL_ITEMS().flatMap(s => s.entries)
|
||||
.filter(i => i.flags?.unique && (!i.disc || i.disc === 'warfortheatlas'))
|
||||
|
||||
const words = Tables.UniquesStashLayout()
|
||||
.filter(row =>
|
||||
row.ShowIfEmptyChallengeLeague &&
|
||||
row.RenamedVersion === null &&
|
||||
row.UniqueStashTypesKey !== 20 /* Watchstone */
|
||||
)
|
||||
.map(row => Words[row.WordsKey])
|
||||
// .filter(row =>
|
||||
// row.Text2 !== "UNIQUE_NAME_NOT_ON_TRADE_YET" &&
|
||||
// true)
|
||||
|
||||
const extraUniqueItems = Words
|
||||
.filter(row => (row.Wordlist === WORDLIST_UNIQUE) && (
|
||||
// Unique Pieces
|
||||
row.Text2.startsWith('First Piece of ') ||
|
||||
row.Text2.startsWith('Second Piece of ') ||
|
||||
row.Text2.startsWith('Third Piece of ') ||
|
||||
row.Text2.startsWith('Fourth Piece of ')
|
||||
))
|
||||
words.push(...extraUniqueItems)
|
||||
|
||||
return (lang: string) => {
|
||||
const Words = Tables.Words(lang)
|
||||
|
||||
return words.flatMap(row => {
|
||||
const baseTypes = tradeUniqueItems.filter(i => i.name === row.Text2)
|
||||
assert.ok(baseTypes.length >= 1, row.Text2)
|
||||
|
||||
if (baseTypes.length > 1) {
|
||||
if (row.Text2 !== 'Grand Spectrum' &&
|
||||
row.Text2 !== 'Combat Focus' &&
|
||||
row.Text2 !== "Precursor's Emblem" &&
|
||||
row.Text2 !== "Doryani's Delusion" &&
|
||||
row.Text2 !== "The Beachhead"
|
||||
) {
|
||||
assert.ok(baseTypes.length === 1, row.Text2)
|
||||
}
|
||||
}
|
||||
|
||||
return baseTypes.flatMap<BaseType>(({ type: baseTypeString }) => {
|
||||
const baseTypeDb = ndjsonBaseTypes.find(entry => entry.refName === baseTypeString)
|
||||
assert.ok(baseTypeDb, `Basetype "${baseTypeString}" of unique item "${row.Text2}" not found`)
|
||||
|
||||
const template: BaseType = {
|
||||
name: Words[row._index].Text2,
|
||||
refName: row.Text2,
|
||||
namespace: 'UNIQUE' as const,
|
||||
unique: {
|
||||
base: baseTypeString,
|
||||
fixedStats: UNIQUE_FIXED_STATS.find(entry =>
|
||||
entry.name === row.Text2 &&
|
||||
entry.basetype === baseTypeString
|
||||
)?.fixedStats.map(_ => _.ref)
|
||||
},
|
||||
map: (baseTypeDb.craftable?.category === 'Map')
|
||||
? {
|
||||
screenshot: "MAP_SCREENSHOTS.find(([name]) => name === row.Text2)?.[1].img"
|
||||
}
|
||||
: undefined,
|
||||
icon: UNIQUE_ICONS.find(i => i.unique === row.Text2 && i.baseType === baseTypeString)?.icon
|
||||
?? '%NOT_FOUND%'
|
||||
}
|
||||
if (row.Text2 === 'The Beachhead') {
|
||||
return [
|
||||
'HarbingerLow/Unique', 'HarbingerMid/Unique', 'HarbingerHigh/Unique',
|
||||
].map<BaseType>(baseId => ({
|
||||
...template,
|
||||
...(ITEM_OVERRIDES.get(baseId) ?? assert.fail())
|
||||
}))
|
||||
}
|
||||
return [template]
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
; (async function main() {
|
||||
const generators = [
|
||||
// makeGenerator1Beasts(),
|
||||
// makeGenerator2Map(),
|
||||
// makeGenerator2Divcard(),
|
||||
// makeGenerator2Gems(),
|
||||
makeGenerator2Bases(),
|
||||
// makeGenerator4Uniques(),
|
||||
(_lang: string) => EXTRA_ITEMS
|
||||
]
|
||||
|
||||
for (const lang of ['en']) {
|
||||
const items = generators.flatMap(g => g(lang))
|
||||
items.sort((a, b) => a.namespace.localeCompare(b.namespace) || a.refName.localeCompare(b.refName))
|
||||
|
||||
|
||||
const jsonLines = Array.from(
|
||||
new Set(items.map(item => JSON.stringify(item))))
|
||||
|
||||
const filePath = path.join(__dirname, 'data', lang, 'items.ndjson');
|
||||
fs.writeFileSync(filePath, jsonLines.join('\n') + '\n');
|
||||
|
||||
}
|
||||
})()
|
||||
269
renderer/public/.DS_Store/package-lock.json
generated
@@ -1,269 +0,0 @@
|
||||
{
|
||||
"name": "data-importer",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "data-importer",
|
||||
"version": "1.0.0",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"acorn": "^8.14.0",
|
||||
"acorn-walk": "^8.3.4",
|
||||
"arg": "^4.1.3",
|
||||
"create-require": "^1.1.1",
|
||||
"diff": "^4.0.2",
|
||||
"make-error": "^1.3.6",
|
||||
"ooz-wasm": "^2.0.0",
|
||||
"pathofexile-dat": "^11.0.1",
|
||||
"pathofexile-dat-schema": "^6.0.1",
|
||||
"undici-types": "^6.20.0",
|
||||
"v8-compile-cache-lib": "^3.0.1",
|
||||
"yn": "^3.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"ts-node": "^10.9.2",
|
||||
"typescript": "^5.7.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@cspotcode/source-map-support": {
|
||||
"version": "0.8.1",
|
||||
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
|
||||
"integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/trace-mapping": "0.3.9"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@jridgewell/resolve-uri": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
|
||||
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@jridgewell/sourcemap-codec": {
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
|
||||
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@jridgewell/trace-mapping": {
|
||||
"version": "0.3.9",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
|
||||
"integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/resolve-uri": "^3.0.3",
|
||||
"@jridgewell/sourcemap-codec": "^1.4.10"
|
||||
}
|
||||
},
|
||||
"node_modules/@tsconfig/node10": {
|
||||
"version": "1.0.11",
|
||||
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
|
||||
"integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@tsconfig/node12": {
|
||||
"version": "1.0.11",
|
||||
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
|
||||
"integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@tsconfig/node14": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
|
||||
"integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@tsconfig/node16": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
|
||||
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "22.10.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz",
|
||||
"integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"undici-types": "~6.20.0"
|
||||
}
|
||||
},
|
||||
"node_modules/acorn": {
|
||||
"version": "8.14.0",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
|
||||
"integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"acorn": "bin/acorn"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/acorn-walk": {
|
||||
"version": "8.3.4",
|
||||
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
|
||||
"integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"acorn": "^8.11.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/arg": {
|
||||
"version": "4.1.3",
|
||||
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
|
||||
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/create-require": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
|
||||
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/diff": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
|
||||
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
|
||||
"license": "BSD-3-Clause",
|
||||
"engines": {
|
||||
"node": ">=0.3.1"
|
||||
}
|
||||
},
|
||||
"node_modules/make-error": {
|
||||
"version": "1.3.6",
|
||||
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
|
||||
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/ooz-wasm": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ooz-wasm/-/ooz-wasm-2.0.0.tgz",
|
||||
"integrity": "sha512-Ewk+Vga2m9niFGV5qT+4EKfBnFEQSQfnTdOWSlnQcpDB2OAdk7TpRHfKqxLSLhDKRjKjw9R+sGlOreWW8ABR0A==",
|
||||
"license": "GPL-3.0-or-later"
|
||||
},
|
||||
"node_modules/pathofexile-dat": {
|
||||
"version": "11.0.1",
|
||||
"resolved": "https://registry.npmjs.org/pathofexile-dat/-/pathofexile-dat-11.0.1.tgz",
|
||||
"integrity": "sha512-q2mvVLaEAk3pPgYYZF/hSQB9xcv6ifaAHiIw26WqxdUIlcGPSCGbp1EmkDdyk/1VF6Qn2iegvY+nESiB8bJmYw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ooz-wasm": "^2.0.0",
|
||||
"pathofexile-dat-schema": "^6.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"pathofexile-dat": "dist/cli/run.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/pathofexile-dat-schema": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/pathofexile-dat-schema/-/pathofexile-dat-schema-6.0.1.tgz",
|
||||
"integrity": "sha512-VP8dc2KXqM0KTQw5n6SvO0rQVLJeZil79ReRwbb7z7M8KT7r5qVYkGm5Klf8tzk5aVxyexrX+52Xj4C2mSxF5g==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/ts-node": {
|
||||
"version": "10.9.2",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
|
||||
"integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@cspotcode/source-map-support": "^0.8.0",
|
||||
"@tsconfig/node10": "^1.0.7",
|
||||
"@tsconfig/node12": "^1.0.7",
|
||||
"@tsconfig/node14": "^1.0.0",
|
||||
"@tsconfig/node16": "^1.0.2",
|
||||
"acorn": "^8.4.1",
|
||||
"acorn-walk": "^8.1.1",
|
||||
"arg": "^4.1.0",
|
||||
"create-require": "^1.1.0",
|
||||
"diff": "^4.0.1",
|
||||
"make-error": "^1.1.1",
|
||||
"v8-compile-cache-lib": "^3.0.1",
|
||||
"yn": "3.1.1"
|
||||
},
|
||||
"bin": {
|
||||
"ts-node": "dist/bin.js",
|
||||
"ts-node-cwd": "dist/bin-cwd.js",
|
||||
"ts-node-esm": "dist/bin-esm.js",
|
||||
"ts-node-script": "dist/bin-script.js",
|
||||
"ts-node-transpile-only": "dist/bin-transpile.js",
|
||||
"ts-script": "dist/bin-script-deprecated.js"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@swc/core": ">=1.2.50",
|
||||
"@swc/wasm": ">=1.2.50",
|
||||
"@types/node": "*",
|
||||
"typescript": ">=2.7"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@swc/core": {
|
||||
"optional": true
|
||||
},
|
||||
"@swc/wasm": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/typescript": {
|
||||
"version": "5.7.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz",
|
||||
"integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
"tsserver": "bin/tsserver"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.17"
|
||||
}
|
||||
},
|
||||
"node_modules/undici-types": {
|
||||
"version": "6.20.0",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
|
||||
"integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/v8-compile-cache-lib": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
|
||||
"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/yn": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
|
||||
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
{
|
||||
"name": "data-importer",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"acorn": "^8.14.0",
|
||||
"acorn-walk": "^8.3.4",
|
||||
"arg": "^4.1.3",
|
||||
"create-require": "^1.1.1",
|
||||
"diff": "^4.0.2",
|
||||
"make-error": "^1.3.6",
|
||||
"ooz-wasm": "^2.0.0",
|
||||
"pathofexile-dat": "^11.0.1",
|
||||
"pathofexile-dat-schema": "^6.0.1",
|
||||
"undici-types": "^6.20.0",
|
||||
"v8-compile-cache-lib": "^3.0.1",
|
||||
"yn": "^3.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"ts-node": "^10.9.2",
|
||||
"typescript": "^5.7.2"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"start": "node dist/index.js",
|
||||
"items": "ts-node items.ts",
|
||||
"stats": "ts-node stats.ts",
|
||||
"copy-files": "cp -R EXPORT/tables/English/* vendor/client/tables/",
|
||||
"push-ndjson": "bash ./push-ndjson.sh",
|
||||
"anon-vodka-python": "python ./vendor/client/parser.py",
|
||||
"langs-anon-vodka-python": "python ./vendor/client/parserRunner.py",
|
||||
"temp-images": "python ./data/en/imageFix.py",
|
||||
"copy-py-ndjson": "bash ./copy-py-ndjson.sh",
|
||||
"fetch-json": "bash ./pull-json.sh"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"description": ""
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Array of language codes and their corresponding base URLs
|
||||
declare -A lang_urls=(
|
||||
["en"]="https://www.pathofexile.com"
|
||||
["ru"]="https://ru.pathofexile.com"
|
||||
["ko"]="https://poe.game.daum.net"
|
||||
)
|
||||
|
||||
# URLs to fetch JSON from (relative paths)
|
||||
urls=(
|
||||
"/api/trade2/data/filters"
|
||||
"/api/trade2/data/stats"
|
||||
"/api/trade2/data/items"
|
||||
"/api/trade2/data/static"
|
||||
)
|
||||
|
||||
# Loop through each language
|
||||
for lang in "${!lang_urls[@]}"; do
|
||||
# Directory to save the JSON files for the current language
|
||||
output_dir="./vendor/json-api/$lang"
|
||||
|
||||
# Create output directory if it doesn't exist
|
||||
mkdir -p "$output_dir"
|
||||
|
||||
# Loop through each URL
|
||||
for relative_url in "${urls[@]}"; do
|
||||
# Construct the full URL
|
||||
url="${lang_urls[$lang]}$relative_url"
|
||||
|
||||
# Extract the filename from the relative URL
|
||||
filename=$(basename "$relative_url")
|
||||
|
||||
echo "Fetching JSON from: $url for language: $lang"
|
||||
|
||||
# Fetch the JSON data and save it to a file
|
||||
curl -s "$url" -o "$output_dir/$filename.json"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Saved JSON to: $output_dir/$filename.json"
|
||||
else
|
||||
echo "Failed to fetch JSON from: $url"
|
||||
fi
|
||||
done
|
||||
done
|
||||
@@ -1,21 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# This script pushes data from our data/en directory to the actual data/en directory
|
||||
|
||||
# Get the current directory
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
||||
|
||||
# Get the data directory
|
||||
DATA_DIR="./data"
|
||||
SUPPORTED_LANG=("en" "ru")
|
||||
# Get all *.ndjson files in the data directory
|
||||
|
||||
for lang in "${SUPPORTED_LANG[@]}"; do
|
||||
FILES=$(find $DATA_DIR/$lang -name "*.ndjson")
|
||||
|
||||
# Loop through each file and push it to the actual data directory, overwriting any existing files
|
||||
for file in $FILES; do
|
||||
echo "Pushing $file to data/$lang"
|
||||
cp $file ../data/$lang
|
||||
done
|
||||
done
|
||||
@@ -1,125 +0,0 @@
|
||||
import { Stat } from "./data/interfaces-apt";
|
||||
import { Stats } from "./vendor/client/tables/index";
|
||||
import * as fs from "node:fs";
|
||||
import * as path from "node:path";
|
||||
import { API_STATS } from "./vendor/trade-api";
|
||||
import { StatEntry } from "./vendor/trade-api/index-interfaces";
|
||||
|
||||
export function makeGeneratorStats(): (lang: string) => Stat[] {
|
||||
const stats = API_STATS();
|
||||
const statsFlattened = stats.flatMap((s) => s.entries);
|
||||
const addStatId = (s: StatEntry) => {
|
||||
return {
|
||||
...s,
|
||||
statId: s.id.substring(s.type.length + 1),
|
||||
statIdNumber: s.id.substring(s.type.length + 1 + 5) as unknown as number,
|
||||
};
|
||||
};
|
||||
|
||||
const statsWithStatId = statsFlattened.map(addStatId);
|
||||
|
||||
const statsGroupedByStatId = statsWithStatId.reduce(
|
||||
(acc, curr) => {
|
||||
const statId = curr.statId;
|
||||
if (acc[statId]) {
|
||||
acc[statId].push(curr);
|
||||
} else {
|
||||
acc[statId] = [curr];
|
||||
}
|
||||
return acc;
|
||||
},
|
||||
{} as Record<string, StatEntry[]>,
|
||||
);
|
||||
|
||||
const FormatRef = (ref: string) => {
|
||||
// Get all parts of string in [ ]
|
||||
|
||||
let outString = "";
|
||||
|
||||
for (let i = 0; i < ref.length; i++) {
|
||||
if (ref[i] === "[") {
|
||||
i++;
|
||||
let localOutString = "";
|
||||
while (ref[i] !== "]") {
|
||||
if (ref[i] === "|") {
|
||||
localOutString = "";
|
||||
} else {
|
||||
localOutString += ref[i];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
outString += localOutString;
|
||||
} else {
|
||||
outString += ref[i];
|
||||
}
|
||||
}
|
||||
return outString;
|
||||
};
|
||||
|
||||
return (lang: string) => {
|
||||
const statsArray: Stat[] = [];
|
||||
|
||||
for (const statId in statsGroupedByStatId) {
|
||||
const statEntries = statsGroupedByStatId[statId];
|
||||
const combinedStat = {
|
||||
ref: FormatRef(statEntries[0].text),
|
||||
better: 0,
|
||||
matchers: [{ string: "StatMatcher" }],
|
||||
trade: {
|
||||
ids: {
|
||||
...(statEntries.filter((e) => e.type == "explicit").length > 0 && {
|
||||
explicit: statEntries
|
||||
.filter((e) => e.type == "explicit")
|
||||
.map((e) => e.id),
|
||||
}),
|
||||
...(statEntries.filter((e) => e.type == "implicit").length > 0 && {
|
||||
implicit: statEntries
|
||||
.filter((e) => e.type == "implicit")
|
||||
.map((e) => e.id),
|
||||
}),
|
||||
...(statEntries.filter((e) => e.type == "fractured").length > 0 && {
|
||||
fractured: statEntries
|
||||
.filter((e) => e.type == "fractured")
|
||||
.map((e) => e.id),
|
||||
}),
|
||||
...(statEntries.filter((e) => e.type == "scourge").length > 0 && {
|
||||
scourge: statEntries
|
||||
.filter((e) => e.type == "scourge")
|
||||
.map((e) => e.id),
|
||||
}),
|
||||
...(statEntries.filter((e) => e.type == "crafted").length > 0 && {
|
||||
crafted: statEntries
|
||||
.filter((e) => e.type == "crafted")
|
||||
.map((e) => e.id),
|
||||
}),
|
||||
...(statEntries.filter((e) => e.type == "pseudo").length > 0 && {
|
||||
pseudo: statEntries
|
||||
.filter((e) => e.type == "pseudo")
|
||||
.map((e) => e.id),
|
||||
}),
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
statsArray.push(combinedStat);
|
||||
}
|
||||
|
||||
return statsArray;
|
||||
};
|
||||
}
|
||||
|
||||
(async function main() {
|
||||
const generators = [makeGeneratorStats()];
|
||||
|
||||
for (const lang of ["en"]) {
|
||||
const items = generators.flatMap((g) => g(lang));
|
||||
items.sort((a, b) => a.ref.localeCompare(b.ref));
|
||||
|
||||
const jsonLines = Array.from(
|
||||
new Set(items.map((item) => JSON.stringify(item))),
|
||||
);
|
||||
|
||||
const filePath = path.join(__dirname, "data", lang, "stats.ndjson");
|
||||
fs.writeFileSync(filePath, jsonLines.join("\n") + "\n");
|
||||
}
|
||||
})();
|
||||
@@ -1,105 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
/* Visit https://aka.ms/tsconfig to read more about this file */
|
||||
/* Projects */
|
||||
// "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
|
||||
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
|
||||
// "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
|
||||
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
|
||||
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
|
||||
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
|
||||
/* Language and Environment */
|
||||
"target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
|
||||
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
|
||||
// "jsx": "preserve", /* Specify what JSX code is generated. */
|
||||
// "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
|
||||
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
|
||||
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
|
||||
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
|
||||
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
|
||||
// "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
|
||||
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
|
||||
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
|
||||
// "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
|
||||
/* Modules */
|
||||
"module": "commonjs", /* Specify what module code is generated. */
|
||||
// "rootDir": "./", /* Specify the root folder within your source files. */
|
||||
// "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
|
||||
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
|
||||
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
|
||||
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
|
||||
// "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
|
||||
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
|
||||
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
||||
// "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
|
||||
// "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
|
||||
// "rewriteRelativeImportExtensions": true, /* Rewrite '.ts', '.tsx', '.mts', and '.cts' file extensions in relative import paths to their JavaScript equivalent in output files. */
|
||||
// "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
|
||||
// "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
|
||||
// "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
|
||||
// "noUncheckedSideEffectImports": true, /* Check side effect imports. */
|
||||
"resolveJsonModule": true, /* Enable importing .json files. */
|
||||
// "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */
|
||||
// "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
|
||||
/* JavaScript Support */
|
||||
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
|
||||
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
|
||||
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
|
||||
"outDir": "./EXPORT", // Specify the output directory
|
||||
"rootDir": "./",
|
||||
/* Emit */
|
||||
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
|
||||
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
|
||||
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
|
||||
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
|
||||
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
|
||||
// "noEmit": true, /* Disable emitting files from a compilation. */
|
||||
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
|
||||
// "outDir": "./", /* Specify an output folder for all emitted files. */
|
||||
// "removeComments": true, /* Disable emitting comments. */
|
||||
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
|
||||
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
|
||||
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
|
||||
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
|
||||
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
|
||||
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
|
||||
// "newLine": "crlf", /* Set the newline character for emitting files. */
|
||||
// "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
|
||||
// "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
|
||||
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
|
||||
// "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
|
||||
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
|
||||
/* Interop Constraints */
|
||||
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
|
||||
// "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
|
||||
// "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */
|
||||
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
|
||||
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
|
||||
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
|
||||
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
|
||||
/* Type Checking */
|
||||
"strict": true, /* Enable all strict type-checking options. */
|
||||
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
|
||||
// "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
|
||||
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
|
||||
// "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
|
||||
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
|
||||
// "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */
|
||||
// "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
|
||||
// "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
|
||||
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
|
||||
// "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
|
||||
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
|
||||
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
|
||||
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
|
||||
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
|
||||
// "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
|
||||
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
|
||||
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
|
||||
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
|
||||
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
|
||||
/* Completeness */
|
||||
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
|
||||
"skipLibCheck": true /* Skip type checking all .d.ts files. */
|
||||
}
|
||||
}
|
||||
12
renderer/public/.DS_Store/types/global.d.ts
vendored
@@ -1,12 +0,0 @@
|
||||
declare module './base/unique_mods.json.js' {
|
||||
interface FixedStat {
|
||||
ref: string;
|
||||
value: number;
|
||||
}
|
||||
interface UniqueFixedStat {
|
||||
name: string;
|
||||
basetype: string;
|
||||
fixedStats: FixedStat[];
|
||||
}
|
||||
export const UNIQUE_FIXED_STATS: UniqueFixedStat[]; // Replace `any` with a more specific type if possible
|
||||
}
|
||||
509
renderer/public/.DS_Store/vendor/client/parser.py
vendored
@@ -1,509 +0,0 @@
|
||||
"""Tries to prepare the necessary data for poe-trade to work properly.
|
||||
It requires all files from
|
||||
Path of Exile 2/Bundles2/_.index.bin/metadata/statdescriptions
|
||||
NOT
|
||||
Path of Exile 2/Bundles2/_.index.bin/metadata/statdescriptions/specific_skill_stat_descriptions
|
||||
to be in the descriptions folder
|
||||
|
||||
NOTE: This may or may not contain all the necessary data, as the parser is not perfect and neither is the data
|
||||
For example: Unique armor items are missing the "armour" tag, which is required for poe-trade to work properly
|
||||
|
||||
Credits and Resources:
|
||||
SnosMe - https://github.com/SnosMe/poe-dat-viewer
|
||||
SnosMe - https://github.com/SnosMe/awakened-poe-trade
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import urllib.parse
|
||||
|
||||
import requests
|
||||
|
||||
|
||||
class Parser:
|
||||
def get_script_dir(self):
|
||||
"""Returns the directory where the script is located."""
|
||||
return os.path.dirname(os.path.realpath(__file__))
|
||||
|
||||
def load_file(self, file):
|
||||
return json.loads(open(f"{self.base_dir}/{self.lang}/{file}.json").read())
|
||||
|
||||
def __init__(self, lang="en"):
|
||||
self.lang = lang
|
||||
|
||||
self.cwd = self.get_script_dir()
|
||||
self.base_dir = self.cwd + "/tables/"
|
||||
self.out_dir = self.cwd + f"/pyDumps/{self.lang}"
|
||||
self.base_items = self.load_file("BaseItemTypes")
|
||||
self.item_classes = self.load_file("ItemClasses")
|
||||
self.item_class_categories = self.load_file("ItemClassCategories")
|
||||
self.armour_types = self.load_file("ArmourTypes")
|
||||
self.weapon_types = self.load_file("WeaponTypes")
|
||||
self.skill_gems = self.load_file("SkillGems")
|
||||
self.skill_gem_info = self.load_file("SkillGemInfo")
|
||||
self.stats_file = self.load_file("Stats")
|
||||
self.translation_files = os.listdir(f"{self.cwd}/descriptions")
|
||||
self.mods_file = self.load_file("Mods")
|
||||
# NOTE: could need to add local here?
|
||||
self.trade_stats = json.loads(
|
||||
open(f"{self.cwd}/../json-api/en/stats.json").read()
|
||||
) # content of https://www.pathofexile.com/api/trade2/data/stats
|
||||
self.trade_items = json.loads(
|
||||
open(f"{self.cwd}/../json-api/en/items.json").read()
|
||||
) # content of https://www.pathofexile.com/api/trade2/data/items
|
||||
self.trade_exchange_items = json.loads(
|
||||
open(f"{self.cwd}/../json-api/en/static.json").read()
|
||||
) # content of https://www.pathofexile.com/api/trade2/data/static
|
||||
|
||||
self.items = {}
|
||||
self.unique_items = []
|
||||
self.parsed_item_class_categories = {}
|
||||
self.parsed_item_classes = {}
|
||||
self.stats = {}
|
||||
self.stats_trade_ids = {}
|
||||
self.mod_translations = {}
|
||||
self.mods = {}
|
||||
self.matchers_no_trade_ids = []
|
||||
|
||||
def make_poe_cdn_url(self, path):
|
||||
return urllib.parse.urljoin("https://web.poecdn.com/", path)
|
||||
|
||||
def convert_stat_name(self, stat):
|
||||
stat = stat.strip()
|
||||
open_square_bracket = stat.find("[")
|
||||
close_square_bracket = stat.find("]")
|
||||
|
||||
while open_square_bracket >= 0 and close_square_bracket > 0:
|
||||
# resolve brackets, this can be either the plain text or a key|value pair
|
||||
key = stat[open_square_bracket + 1 : close_square_bracket]
|
||||
|
||||
if "|" in key: # key|value pair
|
||||
key = key.split("|")[1] # use value
|
||||
stat = stat[:open_square_bracket] + key + stat[close_square_bracket + 1 :]
|
||||
|
||||
open_square_bracket = stat.find("[")
|
||||
close_square_bracket = stat.find("]")
|
||||
|
||||
pattern = re.compile(r"{\d+}")
|
||||
for match in pattern.findall(stat):
|
||||
stat = stat.replace(match, "#")
|
||||
|
||||
stat = stat.replace("{0:+d}", "+#")
|
||||
|
||||
if len(stat) == 0:
|
||||
return None
|
||||
|
||||
if stat[0] == "{" and stat[1] == "}":
|
||||
stat = "#" + stat[2:]
|
||||
|
||||
return stat
|
||||
|
||||
def parse_trade_ids(self):
|
||||
for res in self.trade_stats["result"]:
|
||||
for entry in res.get("entries"):
|
||||
id = entry.get("id")
|
||||
text = entry.get("text")
|
||||
type = entry.get("type")
|
||||
text = self.convert_stat_name(text)
|
||||
|
||||
if text not in self.stats_trade_ids:
|
||||
self.stats_trade_ids[text] = {}
|
||||
|
||||
if type not in self.stats_trade_ids[text]:
|
||||
self.stats_trade_ids[text][type] = []
|
||||
|
||||
self.stats_trade_ids[text][type].append(id)
|
||||
|
||||
def parse_mod(self, id, english):
|
||||
matchers = []
|
||||
ref = None
|
||||
for lang in english:
|
||||
lang = self.convert_stat_name(lang)
|
||||
|
||||
if lang is None:
|
||||
continue
|
||||
|
||||
matcher = lang
|
||||
# remove prefixes
|
||||
if matcher[0] == "+":
|
||||
matcher = matcher[1:]
|
||||
|
||||
has_negate = matcher.find("negate") > 0
|
||||
|
||||
if has_negate:
|
||||
matcher = matcher[: matcher.find('"')].strip()
|
||||
|
||||
matchers.append({"string": matcher, "negate": has_negate})
|
||||
|
||||
if ref is None:
|
||||
ref = lang
|
||||
|
||||
id = id.split(" ")
|
||||
|
||||
for a in id:
|
||||
if a == "number_of_additional_arrows":
|
||||
matchers.append(
|
||||
{"string": "Bow Attacks fire # additional Arrows", "negate": False}
|
||||
)
|
||||
self.mod_translations[a] = {
|
||||
"ref": ref,
|
||||
"matchers": matchers,
|
||||
}
|
||||
|
||||
def parse_translation_file(self, file):
|
||||
dir = f"{self.cwd}/descriptions/{file}"
|
||||
print("Parsing", dir)
|
||||
stats_translations = open(dir, encoding="utf-16").read().split("\n")
|
||||
for i in range(0, len(stats_translations)):
|
||||
line = stats_translations[i]
|
||||
|
||||
if line == "description":
|
||||
# start of the translation block
|
||||
id = (
|
||||
stats_translations[i + 1].strip()[2:].replace('"', "")
|
||||
) # skip first 2 characters
|
||||
english = stats_translations[i + 3].strip() # skip first 2 characters
|
||||
start = english.find('"')
|
||||
end = english.rfind('"')
|
||||
english = english[start + 1 : end]
|
||||
|
||||
# convert to array so we can add the negated option later on, if one exists
|
||||
english = [english]
|
||||
|
||||
negate_english = stats_translations[i + 4].strip()
|
||||
if "lang" not in negate_english and "negate" in negate_english:
|
||||
# mod has a negated version
|
||||
end = negate_english.find("negate")
|
||||
negate_english = negate_english[
|
||||
negate_english.find('"') + 1 : end + len("negate")
|
||||
]
|
||||
english.append(negate_english)
|
||||
|
||||
self.parse_mod(id, english)
|
||||
|
||||
def parse_mods(self):
|
||||
for stat in self.stats_file:
|
||||
id = stat.get("_index")
|
||||
name = stat.get("Id")
|
||||
self.stats[id] = name
|
||||
|
||||
# translations
|
||||
for file in self.translation_files:
|
||||
if os.path.isdir(f"{self.cwd}/descriptions/{file}"):
|
||||
# traverse directories if it doesnt start with _
|
||||
if not file.startswith("_"):
|
||||
for _file in os.listdir(f"{self.cwd}/descriptions/{file}"):
|
||||
self.parse_translation_file(f"{file}/{_file}")
|
||||
elif ".csd" in file:
|
||||
self.parse_translation_file(file)
|
||||
|
||||
for mod in self.mods_file:
|
||||
id = mod.get("Id")
|
||||
stats_key = mod.get("StatsKey1")
|
||||
if stats_key is not None:
|
||||
stats_id = self.stats.get(stats_key)
|
||||
translation = self.mod_translations.get(stats_id)
|
||||
if translation:
|
||||
ref = translation.get("ref")
|
||||
matchers = translation.get("matchers")
|
||||
ids = self.stats_trade_ids.get(matchers[0].get("string"))
|
||||
# if ref.lower() == "bow attacks fire an additional arrow":
|
||||
# print("ID")
|
||||
# print(f"stats_id: {stats_id}")
|
||||
# print(f"matchers: {matchers}")
|
||||
# print(f"ref: {ref}")
|
||||
# print("break")
|
||||
# print(f"mod: {mod}")
|
||||
# print(f"stats_trade_ids: {stats_trade_ids}")
|
||||
# print(f"ids: {ids}")
|
||||
# print(f"translation: {translation}")
|
||||
if ids is None and len(matchers) > 1:
|
||||
ids = self.stats_trade_ids.get(matchers[1].get("string"))
|
||||
if ids is None:
|
||||
# print(
|
||||
# "No trade ids found for",
|
||||
# matchers[0].get("string"),
|
||||
# "or",
|
||||
# matchers[1].get("string"),
|
||||
# )
|
||||
self.matchers_no_trade_ids.append(matchers[0].get("string"))
|
||||
self.matchers_no_trade_ids.append(matchers[1].get("string"))
|
||||
elif ids is None:
|
||||
# print("No trade ids found for", matchers[0].get("string"))
|
||||
self.matchers_no_trade_ids.append(matchers[0].get("string"))
|
||||
trade = {"ids": ids}
|
||||
self.mods[id] = {
|
||||
"ref": translation.get("ref"),
|
||||
"better": 1,
|
||||
"id": stats_id,
|
||||
"matchers": translation.get("matchers"),
|
||||
"trade": trade,
|
||||
}
|
||||
|
||||
def parse_categories(self):
|
||||
# parse item categories
|
||||
for cat in self.item_class_categories:
|
||||
id = cat.get("_index")
|
||||
if id is None:
|
||||
continue
|
||||
|
||||
text = cat.get("Id")
|
||||
self.parsed_item_class_categories[id] = text
|
||||
|
||||
for cat in self.item_classes:
|
||||
id = cat.get("_index")
|
||||
if id is None:
|
||||
continue
|
||||
|
||||
text = cat.get("Id")
|
||||
self.parsed_item_classes[id] = {
|
||||
"name": text,
|
||||
"short": self.parsed_item_class_categories.get(
|
||||
cat.get("ItemClassCategory")
|
||||
),
|
||||
}
|
||||
|
||||
def parse_items(self):
|
||||
for entry in self.trade_items["result"]:
|
||||
for item in entry.get("entries"):
|
||||
name = item.get("name")
|
||||
if name is None:
|
||||
continue
|
||||
text = item.get("text")
|
||||
type = item.get("type")
|
||||
# unique item
|
||||
flags = item.get("flags")
|
||||
|
||||
self.unique_items.append(
|
||||
{
|
||||
"name": name,
|
||||
"refName": name,
|
||||
"namespace": "UNIQUE",
|
||||
"unique": {"base": type},
|
||||
}
|
||||
)
|
||||
|
||||
# parse base items
|
||||
for item in self.base_items:
|
||||
id = item.get("_index")
|
||||
if id is None:
|
||||
continue
|
||||
|
||||
name = item.get("Name")
|
||||
|
||||
if len(name) == 0:
|
||||
continue
|
||||
|
||||
class_key = item.get("ItemClassesKey")
|
||||
|
||||
self.items[id] = {
|
||||
"name": name,
|
||||
"refName": name,
|
||||
"namespace": "ITEM",
|
||||
"class": class_key,
|
||||
"dropLevel": item.get("DropLevel"),
|
||||
"width": item.get("Width"),
|
||||
"height": item.get("Height"),
|
||||
}
|
||||
|
||||
if class_key is not None:
|
||||
class_info = self.parsed_item_classes.get(class_key).get("short")
|
||||
# if class_info in ["Belt", "Ring", "Amulet"]:
|
||||
if class_info is not None:
|
||||
self.items[id].update({"craftable": {"category": class_info}})
|
||||
|
||||
# convert base items into gems
|
||||
for gem in self.skill_gems:
|
||||
id = gem.get("BaseItemTypesKey")
|
||||
if id in self.items:
|
||||
self.items[id].update(
|
||||
{
|
||||
"namespace": "GEM",
|
||||
"gem": {"awakened": False, "transfigured": False},
|
||||
}
|
||||
)
|
||||
|
||||
# weapons and armor need the craftable tag ("craftable": "type (helmet, boots etc)")
|
||||
# convert base items into weapons
|
||||
for wpn in self.weapon_types:
|
||||
id = wpn.get("BaseItemTypesKey")
|
||||
|
||||
if id in self.items:
|
||||
class_key = self.items[id].get("class")
|
||||
self.items[id].update(
|
||||
{
|
||||
"craftable": {
|
||||
"category": self.parsed_item_classes.get(class_key).get(
|
||||
"short"
|
||||
),
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
# convert base items into armor types
|
||||
# armour needs the armour tag ("armour": "ar": [min, max], "ev": [min, max], "es": [min, max])
|
||||
# Changed since db only has once value for each stat
|
||||
for armour in self.armour_types:
|
||||
id = armour.get("BaseItemTypesKey")
|
||||
|
||||
ar = [armour.get("Armour"), armour.get("Armour")]
|
||||
ev = [armour.get("Evasion"), armour.get("Evasion")]
|
||||
es = [armour.get("EnergyShield"), armour.get("EnergyShield")]
|
||||
|
||||
armour = {}
|
||||
|
||||
if ar[1] > 1:
|
||||
armour["ar"] = ar
|
||||
|
||||
if ev[1] > 1:
|
||||
armour["ev"] = ev
|
||||
|
||||
if es[1] > 1:
|
||||
armour["es"] = es
|
||||
|
||||
if id in self.items:
|
||||
self.items[id].update({"armour": armour})
|
||||
|
||||
def parse_trade_exchange_items(self):
|
||||
items_ids = {}
|
||||
for id, item in self.items.items():
|
||||
items_ids[item.get("name")] = id
|
||||
|
||||
for category in self.trade_exchange_items["result"]:
|
||||
for entry in category.get("entries"):
|
||||
item_name = entry.get("text")
|
||||
|
||||
if item_name not in items_ids:
|
||||
continue
|
||||
|
||||
self.items[items_ids[item_name]].update(
|
||||
{
|
||||
"tradeTag": entry.get("id"),
|
||||
"icon": self.make_poe_cdn_url(entry.get("image")),
|
||||
}
|
||||
)
|
||||
|
||||
def resolve_item_classes(self):
|
||||
for item_class in self.item_classes:
|
||||
id = item_class.get("_index")
|
||||
if id is None:
|
||||
continue
|
||||
|
||||
name = item_class.get("Name")
|
||||
item_class_category = item_class.get("ItemClassCategory")
|
||||
|
||||
if id in self.items:
|
||||
self.items[id].update(
|
||||
{
|
||||
"class": name,
|
||||
"category": self.parsed_item_classes.get(item_class_category),
|
||||
}
|
||||
)
|
||||
|
||||
def write_to_file(self):
|
||||
f = open(f"{self.out_dir}/items.ndjson", "w", encoding="utf-8")
|
||||
items_name = sorted(self.items.values(), key=lambda x: x.get("name"))
|
||||
for item in items_name:
|
||||
name = item.get("name")
|
||||
namespace = item.get("namespace", "ITEM")
|
||||
craftable = item.get("craftable", None)
|
||||
gem = item.get("gem", None)
|
||||
armour = item.get("armour", None)
|
||||
width = item.get("width", None)
|
||||
height = item.get("height", None)
|
||||
tradeTag = item.get("tradeTag", None)
|
||||
icon = item.get("icon", "%NOT_FOUND%")
|
||||
|
||||
out = {
|
||||
"name": name,
|
||||
"refName": name,
|
||||
"namespace": namespace,
|
||||
"icon": icon,
|
||||
}
|
||||
|
||||
if tradeTag:
|
||||
out.update({"tradeTag": tradeTag})
|
||||
|
||||
if craftable:
|
||||
out.update({"craftable": craftable})
|
||||
|
||||
if armour:
|
||||
out.update({"armour": armour})
|
||||
|
||||
if width:
|
||||
out.update({"w": width})
|
||||
|
||||
if height:
|
||||
out.update({"h": height})
|
||||
|
||||
if gem:
|
||||
out.update({"gem": gem})
|
||||
|
||||
f.write(json.dumps(out) + "\n")
|
||||
|
||||
for item in self.unique_items:
|
||||
f.write(json.dumps(item) + "\n")
|
||||
|
||||
f.close()
|
||||
|
||||
# somehow not a thing? - possibly missing some data
|
||||
self.mods["physical_local_damage_+%"] = {
|
||||
"ref": "#% increased Physical Damage",
|
||||
"better": 1,
|
||||
"id": "physical_local_damage_+%",
|
||||
"matchers": [{"string": "#% increased Physical Damage"}],
|
||||
"trade": {
|
||||
"ids": {
|
||||
"explicit": ["explicit.stat_419810844"],
|
||||
"fractured": ["fractured.stat_419810844"],
|
||||
"rune": ["rune.stat_419810844"],
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
seen = set()
|
||||
m = open(f"{self.out_dir}/stats.ndjson", "w", encoding="utf-8")
|
||||
for mod in self.mods.values():
|
||||
id = mod.get("id")
|
||||
|
||||
if id in seen:
|
||||
continue
|
||||
|
||||
m.write(json.dumps(mod) + "\n")
|
||||
seen.add(id)
|
||||
m.close()
|
||||
|
||||
with open(
|
||||
f"{self.get_script_dir()}/pyDumps/{self.lang+'-out'}/items_dump.json",
|
||||
"w",
|
||||
encoding="utf-8",
|
||||
) as f:
|
||||
f.write(json.dumps(self.items, indent=4))
|
||||
|
||||
with open(
|
||||
f"{self.get_script_dir()}/pyDumps/{self.lang+'-out'}/mods_dump.json",
|
||||
"w",
|
||||
encoding="utf-8",
|
||||
) as f:
|
||||
f.write(json.dumps(self.mods, indent=4))
|
||||
|
||||
with open(
|
||||
f"{self.get_script_dir()}/pyDumps/{self.lang+'-out'}/matchers_no_trade_ids.json",
|
||||
"w",
|
||||
encoding="utf-8",
|
||||
) as f:
|
||||
f.write(json.dumps(self.matchers_no_trade_ids, indent=4))
|
||||
|
||||
def run(self):
|
||||
self.parse_trade_ids()
|
||||
self.parse_mods()
|
||||
self.parse_categories()
|
||||
self.parse_items()
|
||||
self.resolve_item_classes()
|
||||
self.parse_trade_exchange_items()
|
||||
self.write_to_file()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
Parser().run()
|
||||
@@ -1,9 +0,0 @@
|
||||
from parser import Parser
|
||||
|
||||
SUPPORTED_LANGUAGES = ["en", "ru"]
|
||||
|
||||
if __name__ == "__main__":
|
||||
for lang in SUPPORTED_LANGUAGES:
|
||||
print(f"Generating {lang} tables")
|
||||
parser = Parser(lang)
|
||||
parser.run()
|
||||
@@ -1,112 +0,0 @@
|
||||
import * as fs from 'node:fs';
|
||||
import * as path from 'node:path';
|
||||
|
||||
interface ArmourTypeRow {
|
||||
BaseItemTypesKey: number;
|
||||
Armour: number;
|
||||
Evasion: number;
|
||||
EnergyShield: number;
|
||||
}
|
||||
|
||||
export function ArmourTypes(): ArmourTypeRow[] {
|
||||
const data = fs.readFileSync(path.join(__dirname, 'ArmourTypes.json'), { encoding: 'utf-8' });
|
||||
return JSON.parse(data) as ArmourTypeRow[];
|
||||
}
|
||||
|
||||
|
||||
interface BaseItemTypeRow {
|
||||
_index: number;
|
||||
Id: string;
|
||||
Width: number;
|
||||
Height: number;
|
||||
Name: string;
|
||||
DropLevel: number;
|
||||
Implicit_ModsKeys: string[];
|
||||
ItemVisualIdentity: number;
|
||||
IsCorrupted: boolean;
|
||||
ItemClassesKey: string;
|
||||
SiteVisibility: number;
|
||||
TagsKeys: string[];
|
||||
}
|
||||
|
||||
export function BaseItemTypes(lang: string = 'en'): BaseItemTypeRow[] {
|
||||
const data = fs.readFileSync(path.join(__dirname, 'BaseItemTypes.json'), { encoding: 'utf-8' });
|
||||
return JSON.parse(data) as BaseItemTypeRow[];
|
||||
}
|
||||
|
||||
interface ItemClassRow {
|
||||
Id: string;
|
||||
}
|
||||
|
||||
export function ItemClasses(): ItemClassRow[] {
|
||||
const data = fs.readFileSync(path.join(__dirname, 'ItemClasses.json'), { encoding: 'utf-8' });
|
||||
return JSON.parse(data) as ItemClassRow[];
|
||||
}
|
||||
|
||||
interface ItemVisualIdentityRow {
|
||||
_index: number;
|
||||
Id: string;
|
||||
DDSFile: string;
|
||||
AOFile: string;
|
||||
}
|
||||
|
||||
export function ItemVisualIdentity(): ItemVisualIdentityRow[] {
|
||||
const data = fs.readFileSync(path.join(__dirname, 'ItemVisualIdentity.json'), { encoding: 'utf-8' });
|
||||
return JSON.parse(data) as ItemVisualIdentityRow[];
|
||||
}
|
||||
|
||||
interface TagRow {
|
||||
Id: string;
|
||||
DisplayString: string;
|
||||
}
|
||||
|
||||
export function Tags(): TagRow[] {
|
||||
const data = fs.readFileSync(path.join(__dirname, 'Tags.json'), { encoding: 'utf-8' });
|
||||
return JSON.parse(data) as TagRow[];
|
||||
}
|
||||
|
||||
interface UniqueStashLayoutRow {
|
||||
WordsKey: number;
|
||||
ShowIfEmptyChallengeLeague: boolean;
|
||||
RenamedVersion: number;
|
||||
UniqueStashTypesKey: number;
|
||||
ItemVisualIdentityKey: number;
|
||||
ShowIfEmptyStandard: boolean;
|
||||
IsAlternateArt: boolean;
|
||||
}
|
||||
|
||||
export function UniquesStashLayout(): UniqueStashLayoutRow[] {
|
||||
const data = fs.readFileSync(path.join(__dirname, 'UniquesStashLayout.json'), { encoding: 'utf-8' });
|
||||
return JSON.parse(data) as UniqueStashLayoutRow[];
|
||||
}
|
||||
|
||||
interface WordRow {
|
||||
_index: number;
|
||||
Wordlist: number;
|
||||
Text: string;
|
||||
SpawnWeight_Tags: number[];
|
||||
SpawnWeight_Values: number[];
|
||||
Text2: string;
|
||||
}
|
||||
|
||||
export function Words(lang: string = 'en'): WordRow[] {
|
||||
const data = fs.readFileSync(path.join(__dirname, 'Words.json'), { encoding: 'utf-8' });
|
||||
return JSON.parse(data) as WordRow[];
|
||||
}
|
||||
|
||||
interface StatsRow {
|
||||
Id: string;
|
||||
IsLocal: boolean;
|
||||
IsWeaponLocal: boolean;
|
||||
Semantics: number;
|
||||
Text: string;
|
||||
IsVirtual: boolean;
|
||||
HASH32: number;
|
||||
BelongsActiveSkillsKey: string[];
|
||||
IsScalable: boolean;
|
||||
}
|
||||
|
||||
export function Stats(): StatsRow[] {
|
||||
const data = fs.readFileSync(path.join(__dirname, 'Stats.json'), { encoding: 'utf-8' });
|
||||
return JSON.parse(data) as StatsRow[];
|
||||
}
|
||||
@@ -1,86 +0,0 @@
|
||||
import json
|
||||
import os
|
||||
|
||||
|
||||
def get_script_dir():
|
||||
"""Returns the directory where the script is located."""
|
||||
return os.path.dirname(os.path.realpath(__file__))
|
||||
|
||||
|
||||
# List of localization codes
|
||||
localizations = ["en", "ru", "ko", "cmn-Hant"]
|
||||
|
||||
|
||||
def process_filtered_pseudo_stats(loc):
|
||||
filtered_file_path = f"{get_script_dir()}/{loc}/pseudo_stats.ndjson"
|
||||
stats_file_path = f"{get_script_dir()}/../../data/{loc}/stats.ndjson"
|
||||
output_file_path = f"{get_script_dir()}/../../data/{loc}/updated_stats.ndjson"
|
||||
|
||||
# Load all stats at the start to avoid repeated loading
|
||||
with open(stats_file_path, "r", encoding="utf-8") as stats_file:
|
||||
original_stats_lines = [json.loads(line) for line in stats_file]
|
||||
|
||||
updated_lines = []
|
||||
matched_keys = set() # To track keys that have been updated
|
||||
|
||||
with open(filtered_file_path, "r", encoding="utf-8") as filtered_file:
|
||||
for line in filtered_file:
|
||||
try:
|
||||
pseudo_object = json.loads(line)
|
||||
# Check for non-pseudo keys
|
||||
if "trade" in pseudo_object and "ids" in pseudo_object["trade"]:
|
||||
non_pseudo_found = any(
|
||||
key in pseudo_object["trade"]["ids"]
|
||||
for key in ["explicit", "implicit", "enchant"]
|
||||
)
|
||||
|
||||
if non_pseudo_found:
|
||||
# Search for the corresponding stat
|
||||
for stats_object in original_stats_lines:
|
||||
# Check if the trade.ids matches with non-pseudo keys
|
||||
for key in ["explicit", "implicit", "enchant"]:
|
||||
if key in pseudo_object["trade"]["ids"]:
|
||||
value_to_find = pseudo_object["trade"]["ids"][key]
|
||||
# Ensure stats_object exists and has 'trade' and 'ids' before accessing
|
||||
if (
|
||||
stats_object.get("trade") is not None
|
||||
and stats_object["trade"].get("ids") is not None
|
||||
and stats_object["trade"]["ids"].get(key)
|
||||
== value_to_find
|
||||
):
|
||||
# Cut the line and add the pseudo value
|
||||
new_stats_object = (
|
||||
stats_object.copy()
|
||||
) # Use copy to avoid modifying original
|
||||
new_stats_object["trade"]["ids"]["pseudo"] = (
|
||||
pseudo_object["trade"]["ids"].get("pseudo")
|
||||
)
|
||||
updated_lines.append(new_stats_object)
|
||||
matched_keys.add(
|
||||
json.dumps(stats_object, ensure_ascii=False)
|
||||
)
|
||||
break
|
||||
|
||||
# If not matched, add the pseudo object as is
|
||||
else:
|
||||
updated_lines.append(pseudo_object)
|
||||
except json.JSONDecodeError:
|
||||
print(f"Error parsing JSON from filtered file: {line}")
|
||||
|
||||
# Write updated lines and remaining original stats to a new stats file
|
||||
with open(output_file_path, "w", encoding="utf-8") as output_file:
|
||||
# Write new lines at the top
|
||||
for updated_line in updated_lines:
|
||||
output_file.write(json.dumps(updated_line, ensure_ascii=False) + "\n")
|
||||
|
||||
# Write the original lines that have not been matched
|
||||
for original_line in original_stats_lines:
|
||||
if json.dumps(original_line, ensure_ascii=False) not in matched_keys:
|
||||
output_file.write(json.dumps(original_line, ensure_ascii=False) + "\n")
|
||||
|
||||
print(f"Updated stats written to {output_file_path} for {loc}.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
for loc in localizations:
|
||||
process_filtered_pseudo_stats(loc)
|
||||
@@ -1,292 +0,0 @@
|
||||
{"ref": "# Crafted Modifiers", "better": 1, "matchers": [{"string": "# Crafted Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_crafted_mods"]}}}
|
||||
{"ref": "# Crafted Prefix Modifiers", "better": 1, "matchers": [{"string": "# Crafted Prefix Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_crafted_prefix_mods"]}}}
|
||||
{"ref": "# Crafted Suffix Modifiers", "better": 1, "matchers": [{"string": "# Crafted Suffix Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_crafted_suffix_mods"]}}}
|
||||
{"ref": "# Empty Modifiers", "better": 1, "matchers": [{"string": "# Empty Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_empty_affix_mods"]}}}
|
||||
{"ref": "# Empty Prefix Modifiers", "better": 1, "matchers": [{"string": "# Empty Prefix Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_empty_prefix_mods"]}}}
|
||||
{"ref": "# Empty Suffix Modifiers", "better": 1, "matchers": [{"string": "# Empty Suffix Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_empty_suffix_mods"]}}}
|
||||
{"ref": "# Enchant Modifiers", "better": 1, "matchers": [{"string": "# Enchant Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_enchant_mods"]}}}
|
||||
{"ref": "# Fractured Modifiers", "better": 1, "matchers": [{"string": "# Fractured Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_fractured_mods"]}}}
|
||||
{"ref": "# Implicit Modifiers", "better": 1, "matchers": [{"string": "# Implicit Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_implicit_mods"]}}}
|
||||
{"ref": "# Life Regenerated per Second", "better": 1, "matchers": [{"string": "# Life Regenerated per Second "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life_regen"]}}}
|
||||
{"ref": "# Modifiers", "better": 1, "matchers": [{"string": "# Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_affix_mods"]}}}
|
||||
{"ref": "# Notable Passive Skills", "better": 1, "matchers": [{"string": "# Notable Passive Skills "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_notable_passive_skills"]}}}
|
||||
{"ref": "# Prefix Modifiers", "better": 1, "matchers": [{"string": "# Prefix Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_prefix_mods"]}}}
|
||||
{"ref": "# Suffix Modifiers", "better": 1, "matchers": [{"string": "# Suffix Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_suffix_mods"]}}}
|
||||
{"ref": "# total Elemental Resistances", "better": 1, "matchers": [{"string": "# total Elemental Resistances "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_count_elemental_resistances"]}}}
|
||||
{"ref": "# total Resistances", "better": 1, "matchers": [{"string": "# total Resistances "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_count_resistances"]}}}
|
||||
{"ref": "#% Base Defence Percentile", "better": 1, "matchers": [{"string": "#% Base Defence Percentile "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_base_defence_percentile"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Atlas Memories", "better": 1, "matchers": [{"string": "#% chance for dropped Maps to convert to Atlas Memories "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_memory_line"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Conqueror Maps", "better": 1, "matchers": [{"string": "#% chance for dropped Maps to convert to Conqueror Maps "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_conqueror_map"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Elder Maps", "better": 1, "matchers": [{"string": "#% chance for dropped Maps to convert to Elder Maps "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_elder_map"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Maven Invitations", "better": 1, "matchers": [{"string": "#% chance for dropped Maps to convert to Maven Invitations "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_maven_invitation"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Scarabs", "better": 1, "matchers": [{"string": "#% chance for dropped Maps to convert to Scarabs "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_scarab"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Shaper Maps", "better": 1, "matchers": [{"string": "#% chance for dropped Maps to convert to Shaper Maps "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_shaper_map"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Unique Maps", "better": 1, "matchers": [{"string": "#% chance for dropped Maps to convert to Unique Maps "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_unique_map"]}}}
|
||||
{"ref": "#% increased Burning Damage", "better": 1, "matchers": [{"string": "#% increased Burning Damage"}, {"string": "#% reduced Burning Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_burning_damage"], "explicit": ["explicit.stat_1175385867"], "implicit": ["implicit.stat_1175385867"], "fractured": ["fractured.stat_1175385867"]}}}
|
||||
{"ref": "#% increased Cold Damage", "better": 1, "matchers": [{"string": "#% increased Cold Damage"}, {"string": "#% reduced Cold Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_damage"], "explicit": ["explicit.stat_3291658075"], "implicit": ["implicit.stat_3291658075"], "fractured": ["fractured.stat_3291658075"], "scourge": ["scourge.stat_3291658075"], "crafted": ["crafted.stat_3291658075"]}}}
|
||||
{"ref": "#% increased Cold Damage with Attack Skills", "better": 1, "matchers": [{"string": "#% increased Cold Damage with Attack Skills"}, {"string": "#% reduced Cold Damage with Attack Skills", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_damage_with_attack_skills"], "explicit": ["explicit.stat_860668586"], "implicit": ["implicit.stat_860668586"]}}}
|
||||
{"ref": "#% increased Cold Spell Damage", "better": 1, "matchers": [{"string": "#% increased Cold Spell Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_spell_damage"]}}}
|
||||
{"ref": "#% increased Elemental Damage", "better": 1, "matchers": [{"string": "#% increased Elemental Damage"}, {"string": "Has #% increased Elemental Damage"}, {"string": "#% reduced Elemental Damage", "negate": true}, {"string": "Has #% reduced Elemental Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage"], "explicit": ["explicit.stat_3141070085"], "implicit": ["implicit.stat_3141070085"], "fractured": ["fractured.stat_3141070085"], "enchant": ["enchant.stat_692420067"], "scourge": ["scourge.stat_3141070085"]}}}
|
||||
{"ref": "#% increased Elemental Damage with Attack Skills", "better": 1, "matchers": [{"string": "#% increased Elemental Damage with Attack Skills"}, {"string": "#% reduced Elemental Damage with Attack Skills", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage_with_attack_skills"], "explicit": ["explicit.stat_387439868"], "implicit": ["implicit.stat_387439868"], "fractured": ["fractured.stat_387439868"], "scourge": ["scourge.stat_387439868"], "crafted": ["crafted.stat_387439868"]}}}
|
||||
{"ref": "#% increased Fire Damage", "better": 1, "matchers": [{"string": "#% increased Fire Damage"}, {"string": "#% reduced Fire Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_damage"], "explicit": ["explicit.stat_3962278098"], "implicit": ["implicit.stat_3962278098"], "fractured": ["fractured.stat_3962278098"], "scourge": ["scourge.stat_3962278098"], "crafted": ["crafted.stat_3962278098"]}}}
|
||||
{"ref": "#% increased Fire Damage with Attack Skills", "better": 1, "matchers": [{"string": "#% increased Fire Damage with Attack Skills"}, {"string": "#% reduced Fire Damage with Attack Skills", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_damage_with_attack_skills"], "implicit": ["implicit.stat_2468413380"]}}}
|
||||
{"ref": "#% increased Fire Spell Damage", "better": 1, "matchers": [{"string": "#% increased Fire Spell Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_spell_damage"]}}}
|
||||
{"ref": "#% increased Lightning Damage", "better": 1, "matchers": [{"string": "#% increased Lightning Damage"}, {"string": "#% reduced Lightning Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_damage"], "explicit": ["explicit.stat_2231156303"], "implicit": ["implicit.stat_2231156303"], "fractured": ["fractured.stat_2231156303"], "scourge": ["scourge.stat_2231156303"], "crafted": ["crafted.stat_2231156303"]}}}
|
||||
{"ref": "#% increased Lightning Damage with Attack Skills", "better": 1, "matchers": [{"string": "#% increased Lightning Damage with Attack Skills"}, {"string": "#% reduced Lightning Damage with Attack Skills", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_damage_with_attack_skills"], "explicit": ["explicit.stat_4208907162"], "implicit": ["implicit.stat_4208907162"]}}}
|
||||
{"ref": "#% increased Lightning Spell Damage", "better": 1, "matchers": [{"string": "#% increased Lightning Spell Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_spell_damage"]}}}
|
||||
{"ref": "#% increased Mana Regeneration Rate", "better": 1, "matchers": [{"string": "#% increased Mana Regeneration Rate"}, {"string": "#% reduced Mana Regeneration Rate", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_mana_regen"], "explicit": ["explicit.stat_789117908"], "implicit": ["implicit.stat_789117908"], "fractured": ["fractured.stat_789117908"], "scourge": ["scourge.stat_789117908"], "crafted": ["crafted.stat_789117908"]}}}
|
||||
{"ref": "#% increased Movement Speed", "better": 1, "matchers": [{"string": "#% increased Movement Speed"}, {"string": "#% reduced Movement Speed", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_movement_speed"], "explicit": ["explicit.stat_2250533757"], "implicit": ["implicit.stat_2250533757"], "fractured": ["fractured.stat_2250533757"], "enchant": ["enchant.stat_2250533757"], "scourge": ["scourge.stat_2250533757"], "crafted": ["crafted.stat_2250533757"]}}}
|
||||
{"ref": "#% increased Rarity of Items found", "better": 1, "matchers": [{"string": "#% increased Rarity of Items found"}, {"string": "#% reduced Rarity of Items found", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_rarity"], "explicit": ["explicit.stat_3917489142"], "implicit": ["implicit.stat_3917489142"], "fractured": ["fractured.stat_3917489142"], "scourge": ["scourge.stat_3917489142"], "crafted": ["crafted.stat_3917489142"]}}}
|
||||
{"ref": "#% increased Spell Damage", "better": 1, "matchers": [{"string": "#% increased Spell Damage"}, {"string": "#% reduced Spell Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_spell_damage"], "explicit": ["explicit.stat_2974417149"], "implicit": ["implicit.stat_2974417149"], "fractured": ["fractured.stat_2974417149"], "enchant": ["enchant.stat_2974417149"], "scourge": ["scourge.stat_2974417149"], "crafted": ["crafted.stat_2974417149"]}}}
|
||||
{"ref": "#% of Life Regenerated per Second", "better": 1, "matchers": [{"string": "#% of Life Regenerated per Second "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_percent_life_regen"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Life", "dp": true, "better": 1, "matchers": [{"string": "#% of Physical Attack Damage Leeched as Life"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_life"], "explicit": ["explicit.stat_3593843976", "explicit.stat_55876295"], "implicit": ["implicit.stat_3593843976", "implicit.stat_55876295"], "fractured": ["fractured.stat_3593843976", "fractured.stat_55876295"], "scourge": ["scourge.stat_3593843976"], "crafted": ["crafted.stat_3593843976", "crafted.stat_55876295"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Mana", "dp": true, "better": 1, "matchers": [{"string": "#% of Physical Attack Damage Leeched as Mana"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_mana"], "explicit": ["explicit.stat_3237948413", "explicit.stat_669069897"], "implicit": ["implicit.stat_3237948413", "implicit.stat_669069897"], "fractured": ["fractured.stat_3237948413", "fractured.stat_669069897"], "enchant": ["enchant.stat_669069897"], "scourge": ["scourge.stat_3237948413"], "crafted": ["crafted.stat_3237948413", "crafted.stat_669069897"]}}}
|
||||
{"ref": "#% total increased maximum Energy Shield", "better": 1, "matchers": [{"string": "#% total increased maximum Energy Shield "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_energy_shield"]}}}
|
||||
{"ref": "#% total increased Physical Damage", "better": 1, "matchers": [{"string": "#% total increased Physical Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_physical_damage"]}}}
|
||||
{"ref": "+# total maximum Energy Shield", "better": 1, "matchers": [{"string": "+# total maximum Energy Shield "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_energy_shield"]}}}
|
||||
{"ref": "+# total maximum Life", "better": 1, "matchers": [{"string": "+# total maximum Life "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life"]}}}
|
||||
{"ref": "+# total maximum Mana", "better": 1, "matchers": [{"string": "+# total maximum Mana "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_mana"]}}}
|
||||
{"ref": "+# total to all Attributes", "better": 1, "matchers": [{"string": "+# total to all Attributes "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_all_attributes"]}}}
|
||||
{"ref": "+# total to Dexterity", "better": 1, "matchers": [{"string": "+# total to Dexterity "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_dexterity"]}}}
|
||||
{"ref": "+# total to Intelligence", "better": 1, "matchers": [{"string": "+# total to Intelligence "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_intelligence"]}}}
|
||||
{"ref": "+# total to Level of Socketed Aura Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Aura Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_aura_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Bow Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Bow Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_bow_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Chaos Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Chaos Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_chaos_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Cold Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Cold Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_cold_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Curse Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Curse Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_curse_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Dexterity Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Dexterity Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_dexterity_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Elemental Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Elemental Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_elemental_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Fire Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Fire Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_fire_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Golem Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Golem Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_golem_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Intelligence Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Intelligence Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_intelligence_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Lightning Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Lightning Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_lightning_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Melee Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Melee Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_melee_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Minion Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Minion Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_minion_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Movement Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Movement Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_movement_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Projectile Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Projectile Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_projectile_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Skill Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Skill Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_skill_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Spell Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Spell Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_spell_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Strength Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Strength Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_strength_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Support Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Support Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_support_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Vaal Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Vaal Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_vaal_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Warcry Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Warcry Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_warcry_gem_levels"]}}}
|
||||
{"ref": "+# total to Strength", "better": 1, "matchers": [{"string": "+# total to Strength "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_strength"]}}}
|
||||
{"ref": "+#% Global Critical Strike Chance", "better": 1, "matchers": [{"string": "+#% Global Critical Strike Chance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_chance"]}}}
|
||||
{"ref": "+#% Global Critical Strike Multiplier", "better": 1, "matchers": [{"string": "+#% Global Critical Strike Multiplier "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_multiplier"]}}}
|
||||
{"ref": "+#% total Attack Speed", "better": 1, "matchers": [{"string": "+#% total Attack Speed "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_attack_speed"]}}}
|
||||
{"ref": "+#% total Cast Speed", "better": 1, "matchers": [{"string": "+#% total Cast Speed "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cast_speed"]}}}
|
||||
{"ref": "+#% total Critical Strike Chance for Spells", "better": 1, "matchers": [{"string": "+#% total Critical Strike Chance for Spells "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_critical_strike_chance_for_spells"]}}}
|
||||
{"ref": "+#% total Elemental Resistance", "better": 1, "matchers": [{"string": "+#% total Elemental Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_elemental_resistance"]}}}
|
||||
{"ref": "+#% total Resistance", "better": 1, "matchers": [{"string": "+#% total Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_resistance"]}}}
|
||||
{"ref": "+#% total to all Elemental Resistances", "better": 1, "matchers": [{"string": "+#% total to all Elemental Resistances "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_all_elemental_resistances"]}}}
|
||||
{"ref": "+#% total to Chaos Resistance", "better": 1, "matchers": [{"string": "+#% total to Chaos Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_chaos_resistance"]}}}
|
||||
{"ref": "+#% total to Cold Resistance", "better": 1, "matchers": [{"string": "+#% total to Cold Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cold_resistance"]}}}
|
||||
{"ref": "+#% total to Fire Resistance", "better": 1, "matchers": [{"string": "+#% total to Fire Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_fire_resistance"]}}}
|
||||
{"ref": "+#% total to Lightning Resistance", "better": 1, "matchers": [{"string": "+#% total to Lightning Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_lightning_resistance"]}}}
|
||||
{"ref": "Adds # to # Chaos Damage", "better": 1, "matchers": [{"string": "Adds # to # Chaos Damage"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_chaos_damage"], "explicit": ["explicit.stat_2223678961", "explicit.stat_3531280422"], "implicit": ["implicit.stat_2223678961", "implicit.stat_3531280422"], "fractured": ["fractured.stat_2223678961"], "enchant": ["enchant.stat_2223678961"], "scourge": ["scourge.stat_2223678961"]}}}
|
||||
{"ref": "Adds # to # Chaos Damage to Attacks", "better": 1, "matchers": [{"string": "Adds # to # Chaos Damage to Attacks"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_chaos_damage_to_attacks"], "explicit": ["explicit.stat_674553446"], "implicit": ["implicit.stat_674553446"], "fractured": ["fractured.stat_674553446"], "crafted": ["crafted.stat_674553446"]}}}
|
||||
{"ref": "Adds # to # Chaos Damage to Spells", "better": 1, "matchers": [{"string": "Adds # to # Chaos Damage to Spells"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_chaos_damage_to_spells"], "explicit": ["explicit.stat_2300399854"], "implicit": ["implicit.stat_2300399854"], "fractured": ["fractured.stat_2300399854"]}}}
|
||||
{"ref": "Adds # to # Cold Damage", "better": 1, "matchers": [{"string": "Adds # to # Cold Damage"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_cold_damage"], "explicit": ["explicit.stat_1037193709", "explicit.stat_2387423236"], "implicit": ["implicit.stat_1037193709", "implicit.stat_2387423236"], "fractured": ["fractured.stat_1037193709", "fractured.stat_2387423236"], "enchant": ["enchant.stat_1037193709"], "scourge": ["scourge.stat_1037193709"], "crafted": ["crafted.stat_1037193709", "crafted.stat_2387423236"]}}}
|
||||
{"ref": "Adds # to # Cold Damage to Attacks", "better": 1, "matchers": [{"string": "Adds # to # Cold Damage to Attacks"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_cold_damage_to_attacks"], "explicit": ["explicit.stat_4067062424"], "implicit": ["implicit.stat_4067062424"], "fractured": ["fractured.stat_4067062424"], "crafted": ["crafted.stat_4067062424"]}}}
|
||||
{"ref": "Adds # to # Cold Damage to Spells", "better": 1, "matchers": [{"string": "Adds # to # Cold Damage to Spells"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_cold_damage_to_spells"], "explicit": ["explicit.stat_2469416729"], "implicit": ["implicit.stat_2469416729"], "fractured": ["fractured.stat_2469416729"], "scourge": ["scourge.stat_2469416729"], "crafted": ["crafted.stat_2469416729"]}}}
|
||||
{"ref": "Adds # to # Damage", "better": 1, "matchers": [{"string": "Adds # to # Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_damage"]}}}
|
||||
{"ref": "Adds # to # Damage to Attacks", "better": 1, "matchers": [{"string": "Adds # to # Damage to Attacks "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_damage_to_attacks"]}}}
|
||||
{"ref": "Adds # to # Damage to Spells", "better": 1, "matchers": [{"string": "Adds # to # Damage to Spells "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_damage_to_spells"]}}}
|
||||
{"ref": "Adds # to # Elemental Damage", "better": 1, "matchers": [{"string": "Adds # to # Elemental Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_elemental_damage"]}}}
|
||||
{"ref": "Adds # to # Elemental Damage to Attacks", "better": 1, "matchers": [{"string": "Adds # to # Elemental Damage to Attacks "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_elemental_damage_to_attacks"]}}}
|
||||
{"ref": "Adds # to # Elemental Damage to Spells", "better": 1, "matchers": [{"string": "Adds # to # Elemental Damage to Spells "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_elemental_damage_to_spells"]}}}
|
||||
{"ref": "Adds # to # Fire Damage", "better": 1, "matchers": [{"string": "Adds # to # Fire Damage"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_fire_damage"], "explicit": ["explicit.stat_321077055", "explicit.stat_709508406"], "implicit": ["implicit.stat_321077055", "implicit.stat_709508406"], "fractured": ["fractured.stat_321077055", "fractured.stat_709508406"], "enchant": ["enchant.stat_709508406"], "scourge": ["scourge.stat_709508406"], "crafted": ["crafted.stat_321077055", "crafted.stat_709508406"]}}}
|
||||
{"ref": "Adds # to # Fire Damage to Attacks", "better": 1, "matchers": [{"string": "Adds # to # Fire Damage to Attacks"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_fire_damage_to_attacks"], "explicit": ["explicit.stat_1573130764"], "implicit": ["implicit.stat_1573130764"], "fractured": ["fractured.stat_1573130764"], "crafted": ["crafted.stat_1573130764"]}}}
|
||||
{"ref": "Adds # to # Fire Damage to Spells", "better": 1, "matchers": [{"string": "Adds # to # Fire Damage to Spells"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_fire_damage_to_spells"], "explicit": ["explicit.stat_1133016593"], "implicit": ["implicit.stat_1133016593"], "fractured": ["fractured.stat_1133016593"], "scourge": ["scourge.stat_1133016593"], "crafted": ["crafted.stat_1133016593"]}}}
|
||||
{"ref": "Adds # to # Lightning Damage", "better": 1, "matchers": [{"string": "Adds # to # Lightning Damage"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_lightning_damage"], "explicit": ["explicit.stat_1334060246", "explicit.stat_3336890334"], "implicit": ["implicit.stat_1334060246", "implicit.stat_3336890334"], "fractured": ["fractured.stat_1334060246", "fractured.stat_3336890334"], "enchant": ["enchant.stat_3336890334"], "scourge": ["scourge.stat_3336890334"], "crafted": ["crafted.stat_1334060246", "crafted.stat_3336890334"]}}}
|
||||
{"ref": "Adds # to # Lightning Damage to Attacks", "better": 1, "matchers": [{"string": "Adds # to # Lightning Damage to Attacks"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_lightning_damage_to_attacks"], "explicit": ["explicit.stat_1754445556"], "implicit": ["implicit.stat_1754445556"], "fractured": ["fractured.stat_1754445556"], "crafted": ["crafted.stat_1754445556"]}}}
|
||||
{"ref": "Adds # to # Lightning Damage to Spells", "better": 1, "matchers": [{"string": "Adds # to # Lightning Damage to Spells"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_lightning_damage_to_spells"], "explicit": ["explicit.stat_2831165374"], "implicit": ["implicit.stat_2831165374"], "fractured": ["fractured.stat_2831165374"], "scourge": ["scourge.stat_2831165374"], "crafted": ["crafted.stat_2831165374"]}}}
|
||||
{"ref": "Adds # to # Physical Damage", "better": 1, "matchers": [{"string": "Adds # to # Physical Damage"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_physical_damage"], "explicit": ["explicit.stat_1940865751", "explicit.stat_960081730"], "implicit": ["implicit.stat_1940865751"], "fractured": ["fractured.stat_1940865751", "fractured.stat_960081730"], "scourge": ["scourge.stat_1940865751"], "crafted": ["crafted.stat_1940865751"]}}}
|
||||
{"ref": "Adds # to # Physical Damage to Attacks", "better": 1, "matchers": [{"string": "Adds # to # Physical Damage to Attacks"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_physical_damage_to_attacks"], "explicit": ["explicit.stat_3032590688"], "implicit": ["implicit.stat_3032590688"], "fractured": ["fractured.stat_3032590688"], "crafted": ["crafted.stat_3032590688"]}}}
|
||||
{"ref": "Adds # to # Physical Damage to Spells", "better": 1, "matchers": [{"string": "Adds # to # Physical Damage to Spells"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_physical_damage_to_spells"], "explicit": ["explicit.stat_2435536961"], "implicit": ["implicit.stat_2435536961"], "fractured": ["fractured.stat_2435536961"], "scourge": ["scourge.stat_2435536961"]}}}
|
||||
{"ref": "Has # Influences", "better": 1, "matchers": [{"string": "Has # Influences "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_influence_count"]}}}
|
||||
{"ref": "Has Crusader Influence", "better": 1, "matchers": [{"string": "Has Crusader Influence "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_crusader_influence"]}}}
|
||||
{"ref": "Has Elder Influence", "better": 1, "matchers": [{"string": "Has Elder Influence "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_elder_influence"]}}}
|
||||
{"ref": "Has Hunter Influence", "better": 1, "matchers": [{"string": "Has Hunter Influence "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_hunter_influence"]}}}
|
||||
{"ref": "Has Logbook Area: Battleground Graves", "better": 1, "matchers": [{"string": "Has Logbook Area: Battleground Graves "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_battleground_graves"]}}}
|
||||
{"ref": "Has Logbook Area: Bluffs", "better": 1, "matchers": [{"string": "Has Logbook Area: Bluffs "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_bluffs"]}}}
|
||||
{"ref": "Has Logbook Area: Cemetery", "better": 1, "matchers": [{"string": "Has Logbook Area: Cemetery "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_cemetery"]}}}
|
||||
{"ref": "Has Logbook Area: Desert Ruins", "better": 1, "matchers": [{"string": "Has Logbook Area: Desert Ruins "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_desert_ruins"]}}}
|
||||
{"ref": "Has Logbook Area: Dried Riverbed", "better": 1, "matchers": [{"string": "Has Logbook Area: Dried Riverbed "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_dried_riverbed"]}}}
|
||||
{"ref": "Has Logbook Area: Forest Ruins", "better": 1, "matchers": [{"string": "Has Logbook Area: Forest Ruins "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_forest_ruins"]}}}
|
||||
{"ref": "Has Logbook Area: Karui Wargraves", "better": 1, "matchers": [{"string": "Has Logbook Area: Karui Wargraves "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_karui_wargraves"]}}}
|
||||
{"ref": "Has Logbook Area: Mountainside", "better": 1, "matchers": [{"string": "Has Logbook Area: Mountainside "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_mountainside"]}}}
|
||||
{"ref": "Has Logbook Area: Rotting Temple", "better": 1, "matchers": [{"string": "Has Logbook Area: Rotting Temple "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_rotting_temple"]}}}
|
||||
{"ref": "Has Logbook Area: Sarn Slums", "better": 1, "matchers": [{"string": "Has Logbook Area: Sarn Slums "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_sarn_slums"]}}}
|
||||
{"ref": "Has Logbook Area: Scrublands", "better": 1, "matchers": [{"string": "Has Logbook Area: Scrublands "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_scrublands"]}}}
|
||||
{"ref": "Has Logbook Area: Shipwreck Reef", "better": 1, "matchers": [{"string": "Has Logbook Area: Shipwreck Reef "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_shipwreck_reef"]}}}
|
||||
{"ref": "Has Logbook Area: Utzaal Outskirts", "better": 1, "matchers": [{"string": "Has Logbook Area: Utzaal Outskirts "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_utzaal_outskirts"]}}}
|
||||
{"ref": "Has Logbook Area: Vaal Temple", "better": 1, "matchers": [{"string": "Has Logbook Area: Vaal Temple "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_vaal_temple"]}}}
|
||||
{"ref": "Has Logbook Area: Volcanic Island", "better": 1, "matchers": [{"string": "Has Logbook Area: Volcanic Island "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_volcano"]}}}
|
||||
{"ref": "Has Logbook Faction: Black Scythe Mercenaries", "better": 0, "matchers": [{"string": "Black Scythe Mercenaries"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_mercenaries"]}}}
|
||||
{"ref": "Has Logbook Faction: Druids of the Broken Circle", "better": 0, "matchers": [{"string": "Druids of the Broken Circle"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_druids"]}}}
|
||||
{"ref": "Has Logbook Faction: Knights of the Sun", "better": 0, "matchers": [{"string": "Knights of the Sun"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_knights"]}}}
|
||||
{"ref": "Has Logbook Faction: Order of the Chalice", "better": 0, "matchers": [{"string": "Order of the Chalice"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_order"]}}}
|
||||
{"ref": "Has Redeemer Influence", "better": 1, "matchers": [{"string": "Has Redeemer Influence "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_redeemer_influence"]}}}
|
||||
{"ref": "Has Room: Antechamber", "better": 0, "matchers": [{"string": "Antechamber"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_antechamber"]}, "option": true}}
|
||||
{"ref": "Has Room: Apex of Ascension (Tier 3)", "better": 0, "matchers": [{"string": "Apex of Ascension (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_sacrifice_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Apex of Atzoatl", "better": 0, "matchers": [{"string": "Apex of Atzoatl"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_apex"]}, "option": true}}
|
||||
{"ref": "Has Room: Arena of Valour (Tier 2)", "better": 0, "matchers": [{"string": "Arena of Valour (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_weapon_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Armourer's Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Armourer's Workshop (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_armour_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Armoury (Tier 2)", "better": 0, "matchers": [{"string": "Armoury (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_armour_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Atlas of Worlds (Tier 3)", "better": 0, "matchers": [{"string": "Atlas of Worlds (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cartography_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Automaton Lab (Tier 2)", "better": 0, "matchers": [{"string": "Automaton Lab (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_minions_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Banquet Hall", "better": 0, "matchers": [{"string": "Banquet Hall"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_banquet_hall"]}, "option": true}}
|
||||
{"ref": "Has Room: Barracks (Tier 2)", "better": 0, "matchers": [{"string": "Barracks (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breeding_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Breach Containment Chamber (Tier 2)", "better": 0, "matchers": [{"string": "Breach Containment Chamber (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breach_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Catalyst of Corruption (Tier 2)", "better": 0, "matchers": [{"string": "Catalyst of Corruption (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_corruption_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Cellar", "better": 0, "matchers": [{"string": "Cellar"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cellar"]}, "option": true}}
|
||||
{"ref": "Has Room: Chamber of Iron (Tier 3)", "better": 0, "matchers": [{"string": "Chamber of Iron (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_armour_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Chasm", "better": 0, "matchers": [{"string": "Chasm"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chasm_room"]}, "option": true}}
|
||||
{"ref": "Has Room: Cloister", "better": 0, "matchers": [{"string": "Cloister"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cloister"]}, "option": true}}
|
||||
{"ref": "Has Room: Conduit of Lightning (Tier 3)", "better": 0, "matchers": [{"string": "Conduit of Lightning (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_lightning_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Corruption Chamber (Tier 1)", "better": 0, "matchers": [{"string": "Corruption Chamber (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_corruption_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Court of Sealed Death (Tier 3)", "better": 0, "matchers": [{"string": "Court of Sealed Death (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_strongbox_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Crucible of Flame (Tier 3)", "better": 0, "matchers": [{"string": "Crucible of Flame (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_fire_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Cultivar Chamber (Tier 2)", "better": 0, "matchers": [{"string": "Cultivar Chamber (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_poison_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Defense Research Lab (Tier 3)", "better": 0, "matchers": [{"string": "Defense Research Lab (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trap_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Demolition Lab (Tier 2)", "better": 0, "matchers": [{"string": "Demolition Lab (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_explosives_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Department of Thaumaturgy (Tier 2)", "better": 0, "matchers": [{"string": "Department of Thaumaturgy (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_gem_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Doryani's Institute (Tier 3)", "better": 0, "matchers": [{"string": "Doryani's Institute (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_gem_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Engineering Department (Tier 2)", "better": 0, "matchers": [{"string": "Engineering Department (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_workshop_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Explosives Room (Tier 1)", "better": 0, "matchers": [{"string": "Explosives Room (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_explosives_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Factory (Tier 3)", "better": 0, "matchers": [{"string": "Factory (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_workshop_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Flame Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Flame Workshop (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_fire_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Gemcutter's Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Gemcutter's Workshop (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_gem_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Glittering Halls (Tier 3)", "better": 0, "matchers": [{"string": "Glittering Halls (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trinket_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Guardhouse (Tier 1)", "better": 0, "matchers": [{"string": "Guardhouse (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breeding_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Champions (Tier 3)", "better": 0, "matchers": [{"string": "Hall of Champions (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_weapon_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Heroes (Tier 2)", "better": 0, "matchers": [{"string": "Hall of Heroes (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_legion_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Legends (Tier 3)", "better": 0, "matchers": [{"string": "Hall of Legends (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_legion_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Locks (Tier 2)", "better": 0, "matchers": [{"string": "Hall of Locks (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_strongbox_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Lords (Tier 2)", "better": 0, "matchers": [{"string": "Hall of Lords (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_queens_chambers_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Mettle (Tier 1)", "better": 0, "matchers": [{"string": "Hall of Mettle (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_legion_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Offerings (Tier 2)", "better": 0, "matchers": [{"string": "Hall of Offerings (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_sacrifice_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of War (Tier 3)", "better": 0, "matchers": [{"string": "Hall of War (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breeding_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Halls", "better": 0, "matchers": [{"string": "Halls"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_halls"]}, "option": true}}
|
||||
{"ref": "Has Room: Hatchery (Tier 1)", "better": 0, "matchers": [{"string": "Hatchery (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_minions_1"]}, "option": true}}
|
||||
{"ref": "Has Room: House of the Others (Tier 3)", "better": 0, "matchers": [{"string": "House of the Others (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breach_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Hurricane Engine (Tier 2)", "better": 0, "matchers": [{"string": "Hurricane Engine (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_storm_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hybridisation Chamber (Tier 3)", "better": 0, "matchers": [{"string": "Hybridisation Chamber (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_minions_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Jeweller's Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Jeweller's Workshop (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trinket_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Jewellery Forge (Tier 2)", "better": 0, "matchers": [{"string": "Jewellery Forge (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trinket_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Lightning Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Lightning Workshop (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_lightning_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Locus of Corruption (Tier 3)", "better": 0, "matchers": [{"string": "Locus of Corruption (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_corruption_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Museum of Artefacts (Tier 3)", "better": 0, "matchers": [{"string": "Museum of Artefacts (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chests_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Office of Cartography (Tier 2)", "better": 0, "matchers": [{"string": "Office of Cartography (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cartography_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Omnitect Forge (Tier 2)", "better": 0, "matchers": [{"string": "Omnitect Forge (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_fire_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Omnitect Reactor Plant (Tier 2)", "better": 0, "matchers": [{"string": "Omnitect Reactor Plant (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_lightning_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Passageways", "better": 0, "matchers": [{"string": "Passageways"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_passageways"]}, "option": true}}
|
||||
{"ref": "Has Room: Pits", "better": 0, "matchers": [{"string": "Pits"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_the_pits"]}, "option": true}}
|
||||
{"ref": "Has Room: Poison Garden (Tier 1)", "better": 0, "matchers": [{"string": "Poison Garden (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_poison_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Pools of Restoration (Tier 1)", "better": 0, "matchers": [{"string": "Pools of Restoration (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_healing_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Royal Meeting Room (Tier 1)", "better": 0, "matchers": [{"string": "Royal Meeting Room (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_queens_chambers_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Sacrificial Chamber (Tier 1)", "better": 0, "matchers": [{"string": "Sacrificial Chamber (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_sacrifice_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Sadist's Den (Tier 3)", "better": 0, "matchers": [{"string": "Sadist's Den (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_torment_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Sanctum of Immortality (Tier 3)", "better": 0, "matchers": [{"string": "Sanctum of Immortality (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_healing_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Sanctum of Unity (Tier 2)", "better": 0, "matchers": [{"string": "Sanctum of Unity (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_empowering_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Sanctum of Vitality (Tier 2)", "better": 0, "matchers": [{"string": "Sanctum of Vitality (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_healing_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Shrine of Empowerment (Tier 1)", "better": 0, "matchers": [{"string": "Shrine of Empowerment (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_empowering_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Shrine of Unmaking (Tier 3)", "better": 0, "matchers": [{"string": "Shrine of Unmaking (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_explosives_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Sparring Room (Tier 1)", "better": 0, "matchers": [{"string": "Sparring Room (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_weapon_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Splinter Research Lab (Tier 1)", "better": 0, "matchers": [{"string": "Splinter Research Lab (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breach_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Storage Room (Tier 1)", "better": 0, "matchers": [{"string": "Storage Room (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chests_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Storm of Corruption (Tier 3)", "better": 0, "matchers": [{"string": "Storm of Corruption (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_storm_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Strongbox Chamber (Tier 1)", "better": 0, "matchers": [{"string": "Strongbox Chamber (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_strongbox_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Surveyor's Study (Tier 1)", "better": 0, "matchers": [{"string": "Surveyor's Study (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cartography_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Tempest Generator (Tier 1)", "better": 0, "matchers": [{"string": "Tempest Generator (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_storm_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Temple Defense Workshop (Tier 2)", "better": 0, "matchers": [{"string": "Temple Defense Workshop (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trap_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Temple Nexus (Tier 3)", "better": 0, "matchers": [{"string": "Temple Nexus (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_empowering_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Throne of Atziri (Tier 3)", "better": 0, "matchers": [{"string": "Throne of Atziri (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_queens_chambers_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Tombs", "better": 0, "matchers": [{"string": "Tombs"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_tombs"]}, "option": true}}
|
||||
{"ref": "Has Room: Torment Cells (Tier 1)", "better": 0, "matchers": [{"string": "Torment Cells (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_torment_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Torture Cages (Tier 2)", "better": 0, "matchers": [{"string": "Torture Cages (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_torment_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Toxic Grove (Tier 3)", "better": 0, "matchers": [{"string": "Toxic Grove (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_poison_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Trap Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Trap Workshop (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trap_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Treasury (Tier 2)", "better": 0, "matchers": [{"string": "Treasury (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_currency_vault_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Tunnels", "better": 0, "matchers": [{"string": "Tunnels"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_tunnels"]}, "option": true}}
|
||||
{"ref": "Has Room: Vault (Tier 1)", "better": 0, "matchers": [{"string": "Vault (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_currency_vault_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Warehouses (Tier 2)", "better": 0, "matchers": [{"string": "Warehouses (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chests_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Wealth of the Vaal (Tier 3)", "better": 0, "matchers": [{"string": "Wealth of the Vaal (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_currency_vault_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Workshop (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_workshop_1"]}, "option": true}}
|
||||
{"ref": "Has Shaper Influence", "better": 1, "matchers": [{"string": "Has Shaper Influence "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_shaper_influence"]}}}
|
||||
{"ref": "Has Warlord Influence", "better": 1, "matchers": [{"string": "Has Warlord Influence "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_warlord_influence"]}}}
|
||||
{"ref": "Mirrored Tablet has # Islands", "better": 1, "matchers": [{"string": "Mirrored Tablet has # Islands "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_lake_number_of_islands"]}}}
|
||||
{"ref": "More Currency: #%", "better": 1, "matchers": [{"string": "More Currency: #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_currency_drops"]}}}
|
||||
{"ref": "More Divination Cards: #%", "better": 1, "matchers": [{"string": "More Divination Cards: #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_card_drops"]}}}
|
||||
{"ref": "More Maps: #%", "better": 1, "matchers": [{"string": "More Maps: #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_map_drops"]}}}
|
||||
{"ref": "More Scarabs: #%", "better": 1, "matchers": [{"string": "More Scarabs: #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_scarab_drops"]}}}
|
||||
{"ref": "Quality (Attack Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Attack Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_attack_quality"]}}}
|
||||
{"ref": "Quality (Attribute Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Attribute Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_attribute_quality"]}}}
|
||||
{"ref": "Quality (Caster Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Caster Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_caster_quality"]}}}
|
||||
{"ref": "Quality (Critical Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Critical Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_critical_quality"]}}}
|
||||
{"ref": "Quality (Currency): #%", "better": 1, "matchers": [{"string": "Quality (Currency): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_currency"]}}}
|
||||
{"ref": "Quality (Defence Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Defence Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_defense_quality"]}}}
|
||||
{"ref": "Quality (Divination Cards): #%", "better": 1, "matchers": [{"string": "Quality (Divination Cards): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_cards"]}}}
|
||||
{"ref": "Quality (Elemental Damage Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Elemental Damage Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_elemental_quality"]}}}
|
||||
{"ref": "Quality (Life and Mana Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Life and Mana Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_resource_quality"]}}}
|
||||
{"ref": "Quality (Pack Size): #%", "better": 1, "matchers": [{"string": "Quality (Pack Size): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_pack_size"]}}}
|
||||
{"ref": "Quality (Physical and Chaos Damage Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Physical and Chaos Damage Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_physical_chaos_quality"]}}}
|
||||
{"ref": "Quality (Rarity): #%", "better": 1, "matchers": [{"string": "Quality (Rarity): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_rarity"]}}}
|
||||
{"ref": "Quality (Resistance Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Resistance Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_resistance_quality"]}}}
|
||||
{"ref": "Quality (Scarabs): #%", "better": 1, "matchers": [{"string": "Quality (Scarabs): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_scarabs"]}}}
|
||||
{"ref": "Quality (Speed Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Speed Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_speed_quality"]}}}
|
||||
{"ref": "Reflection of Abyss (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Abyss (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_38892"]}}}
|
||||
{"ref": "Reflection of Ambush (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Ambush (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_48307"]}}}
|
||||
{"ref": "Reflection of Angling (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Angling (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_40794"]}}}
|
||||
{"ref": "Reflection of Azurite (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Azurite (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_40031"]}}}
|
||||
{"ref": "Reflection of Bestiary (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Bestiary (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_55569"]}}}
|
||||
{"ref": "Reflection of Breach (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Breach (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_62572"]}}}
|
||||
{"ref": "Reflection of Brutality (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Brutality (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_29096"]}}}
|
||||
{"ref": "Reflection of Camaraderie (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Camaraderie (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_35395"]}}}
|
||||
{"ref": "Reflection of Catalysis (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Catalysis (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_57850"]}}}
|
||||
{"ref": "Reflection of Chaos (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Chaos (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_50834"]}}}
|
||||
{"ref": "Reflection of Conflict (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Conflict (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_1931"]}}}
|
||||
{"ref": "Reflection of Darkness (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Darkness (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_34457"]}}}
|
||||
{"ref": "Reflection of Delirium (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Delirium (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_22138"]}}}
|
||||
{"ref": "Reflection of Delve (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Delve (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_18737"]}}}
|
||||
{"ref": "Reflection of Demonfire (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Demonfire (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_28500"]}}}
|
||||
{"ref": "Reflection of Domination (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Domination (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_63412"]}}}
|
||||
{"ref": "Reflection of Entrapment (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Entrapment (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_44399"]}}}
|
||||
{"ref": "Reflection of Essence (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Essence (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_49862"]}}}
|
||||
{"ref": "Reflection of Experimentation (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Experimentation (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_55676"]}}}
|
||||
{"ref": "Reflection of Flame (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Flame (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_42468"]}}}
|
||||
{"ref": "Reflection of Fractured Dimensions (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Fractured Dimensions (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_49488"]}}}
|
||||
{"ref": "Reflection of Frost (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Frost (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_38110"]}}}
|
||||
{"ref": "Reflection of Guilt (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Guilt (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_25480"]}}}
|
||||
{"ref": "Reflection of Imprisonment (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Imprisonment (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_10363"]}}}
|
||||
{"ref": "Reflection of Kalandra (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Kalandra (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_36591"]}}}
|
||||
{"ref": "Reflection of Legion (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Legion (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_403"]}}}
|
||||
{"ref": "Reflection of Metamorph (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Metamorph (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_3699"]}}}
|
||||
{"ref": "Reflection of Occultism (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Occultism (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_24451"]}}}
|
||||
{"ref": "Reflection of Paradise (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Paradise (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_50846"]}}}
|
||||
{"ref": "Reflection of Perverted Faith (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Perverted Faith (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_27678"]}}}
|
||||
{"ref": "Reflection of Phaaryl (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Phaaryl (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_7674"]}}}
|
||||
{"ref": "Reflection of Possession (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Possession (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_25049"]}}}
|
||||
{"ref": "Reflection of Power (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Power (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_35950"]}}}
|
||||
{"ref": "Reflection of Scourge (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Scourge (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_62360"]}}}
|
||||
{"ref": "Reflection of Stasis (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Stasis (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_32968"]}}}
|
||||
{"ref": "Reflection of Sulphite (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Sulphite (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_45086"]}}}
|
||||
{"ref": "Reflection of the Black Scythe (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Black Scythe (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_9662"]}}}
|
||||
{"ref": "Reflection of the Breachlord (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Breachlord (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_62935"]}}}
|
||||
{"ref": "Reflection of the Broken Circle (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Broken Circle (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_43128"]}}}
|
||||
{"ref": "Reflection of the Chalice (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Chalice (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_64561"]}}}
|
||||
{"ref": "Reflection of the Chasm (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Chasm (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_57101"]}}}
|
||||
{"ref": "Reflection of the Dream (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Dream (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_27117"]}}}
|
||||
{"ref": "Reflection of the Harbingers (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Harbingers (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_37203"]}}}
|
||||
{"ref": "Reflection of the Hunter (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Hunter (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_18816"]}}}
|
||||
{"ref": "Reflection of the Monolith (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Monolith (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_34796"]}}}
|
||||
{"ref": "Reflection of the Nightmare (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Nightmare (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_24232"]}}}
|
||||
{"ref": "Reflection of the Storm (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Storm (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_2745"]}}}
|
||||
{"ref": "Reflection of the Sun (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Sun (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_60034"]}}}
|
||||
{"ref": "Reflection of the Trove (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Trove (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_46772"]}}}
|
||||
{"ref": "Reflection of the Wilderness (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Wilderness (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_29224"]}}}
|
||||
{"ref": "Reflection of Thralldom (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Thralldom (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_26813"]}}}
|
||||
{"ref": "Reflection of Torment (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Torment (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_53950"]}}}
|
||||
{"ref": "Reflection of Tyranny (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Tyranny (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_60981"]}}}
|
||||
@@ -1,81 +0,0 @@
|
||||
import json
|
||||
import os
|
||||
|
||||
|
||||
def get_script_dir():
|
||||
"""Returns the directory where the script is located."""
|
||||
return os.path.dirname(os.path.realpath(__file__))
|
||||
|
||||
|
||||
# List of localization codes
|
||||
localizations = ["en", "ru", "ko", "cmn-Hant"]
|
||||
|
||||
# File containing the pseudo keys to filter on
|
||||
keys_file_path = (
|
||||
f"{get_script_dir()}/pseudo_keys.ndjson" # Path to your ndjson pseudo keys file
|
||||
)
|
||||
|
||||
|
||||
def load_pseudo_keys():
|
||||
pseudo_keys = set()
|
||||
with open(keys_file_path, "r", encoding="utf-8") as keys_file:
|
||||
for line in keys_file:
|
||||
try:
|
||||
json_object = json.loads(line)
|
||||
# Assume the pseudo keys are stored under the 'trade.ids.pseudo' path
|
||||
if (
|
||||
"trade" in json_object
|
||||
and "ids" in json_object["trade"]
|
||||
and "pseudo" in json_object["trade"]["ids"]
|
||||
):
|
||||
for key in json_object["trade"]["ids"]["pseudo"]:
|
||||
pseudo_keys.add(key)
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"Error parsing JSON in keys file: {e}")
|
||||
return pseudo_keys
|
||||
|
||||
|
||||
def process_localization_file(input_file_path, output_file_path, pseudo_keys):
|
||||
result_list = []
|
||||
|
||||
with open(input_file_path, "r", encoding="utf-8") as input_file:
|
||||
for line in input_file:
|
||||
try:
|
||||
json_object = json.loads(line)
|
||||
# Check if 'trade.ids.pseudo' exists
|
||||
if has_nested_key(json_object, "trade.ids.pseudo") and any(
|
||||
value in pseudo_keys
|
||||
for value in json_object["trade"]["ids"]["pseudo"]
|
||||
):
|
||||
result_list.append(json_object)
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"Error parsing JSON: {e}")
|
||||
|
||||
with open(output_file_path, "w", encoding="utf-8") as output_file:
|
||||
for item in result_list:
|
||||
output_file.write(json.dumps(item, ensure_ascii=False) + "\n")
|
||||
|
||||
print(
|
||||
f"Processing complete for {input_file_path}. Check {output_file_path} for results."
|
||||
)
|
||||
|
||||
|
||||
def has_nested_key(obj, key_path):
|
||||
keys = key_path.split(".")
|
||||
for key in keys:
|
||||
if isinstance(obj, dict) and key in obj:
|
||||
obj = obj[key]
|
||||
else:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
pseudo_keys = load_pseudo_keys()
|
||||
|
||||
for loc in localizations:
|
||||
input_file_path = f"{get_script_dir()}/../../data/{loc}/stats.ndjson.old" # Path to the input file
|
||||
output_file_path = (
|
||||
f"{get_script_dir()}/{loc}/pseudo_stats.ndjson" # Path to the output file
|
||||
)
|
||||
process_localization_file(input_file_path, output_file_path, pseudo_keys)
|
||||
@@ -1,292 +0,0 @@
|
||||
{"ref": "# Crafted Modifiers", "better": 1, "matchers": [{"string": "# 工藝詞綴 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_crafted_mods"]}}}
|
||||
{"ref": "# Crafted Prefix Modifiers", "better": 1, "matchers": [{"string": "# 工藝前綴 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_crafted_prefix_mods"]}}}
|
||||
{"ref": "# Crafted Suffix Modifiers", "better": 1, "matchers": [{"string": "# 工藝後綴 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_crafted_suffix_mods"]}}}
|
||||
{"ref": "# Empty Modifiers", "better": 1, "matchers": [{"string": "# 空詞綴 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_empty_affix_mods"]}}}
|
||||
{"ref": "# Empty Prefix Modifiers", "better": 1, "matchers": [{"string": "# 空前綴 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_empty_prefix_mods"]}}}
|
||||
{"ref": "# Empty Suffix Modifiers", "better": 1, "matchers": [{"string": "# 空後綴 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_empty_suffix_mods"]}}}
|
||||
{"ref": "# Enchant Modifiers", "better": 1, "matchers": [{"string": "# 附魔詞綴 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_enchant_mods"]}}}
|
||||
{"ref": "# Fractured Modifiers", "better": 1, "matchers": [{"string": "# 破裂詞綴 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_fractured_mods"]}}}
|
||||
{"ref": "# Implicit Modifiers", "better": 1, "matchers": [{"string": "# 固定詞綴 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_implicit_mods"]}}}
|
||||
{"ref": "# Life Regenerated per Second", "better": 1, "matchers": [{"string": "# 每秒生命回復 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life_regen"]}}}
|
||||
{"ref": "# Modifiers", "better": 1, "matchers": [{"string": "# 詞綴 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_affix_mods"]}}}
|
||||
{"ref": "# Notable Passive Skills", "better": 1, "matchers": [{"string": "# 強力天賦 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_notable_passive_skills"]}}}
|
||||
{"ref": "# Prefix Modifiers", "better": 1, "matchers": [{"string": "# 前綴 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_prefix_mods"]}}}
|
||||
{"ref": "# Suffix Modifiers", "better": 1, "matchers": [{"string": "# 後綴 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_suffix_mods"]}}}
|
||||
{"ref": "# total Elemental Resistances", "better": 1, "matchers": [{"string": "# 元素抗性 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_count_elemental_resistances"]}}}
|
||||
{"ref": "# total Resistances", "better": 1, "matchers": [{"string": "# 總抗性 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_count_resistances"]}}}
|
||||
{"ref": "#% Base Defence Percentile", "better": 1, "matchers": [{"string": "#% 基礎防禦百分比 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_base_defence_percentile"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Atlas Memories", "better": 1, "matchers": [{"string": "掉落的地圖有 #% 機率轉化至輿圖記憶 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_memory_line"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Conqueror Maps", "better": 1, "matchers": [{"string": "掉落的地圖有 #% 機率轉化至征服者地圖 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_conqueror_map"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Elder Maps", "better": 1, "matchers": [{"string": "掉落的地圖有 #% 機率轉化至尊師地圖 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_elder_map"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Maven Invitations", "better": 1, "matchers": [{"string": "掉落的地圖有 #% 機率轉化至釋界之邀 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_maven_invitation"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Scarabs", "better": 1, "matchers": [{"string": "掉落的地圖有 #% 機率轉化至聖甲蟲 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_scarab"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Shaper Maps", "better": 1, "matchers": [{"string": "掉落的地圖有 #% 機率轉化至塑界者地圖 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_shaper_map"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Unique Maps", "better": 1, "matchers": [{"string": "掉落的地圖有 #% 機率轉化至傳奇地圖 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_unique_map"]}}}
|
||||
{"ref": "#% increased Burning Damage", "better": 1, "matchers": [{"string": "增加 #% 燃燒傷害"}, {"string": "減少 #% 燃燒傷害", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_burning_damage"], "explicit": ["explicit.stat_1175385867"], "implicit": ["implicit.stat_1175385867"], "fractured": ["fractured.stat_1175385867"]}}}
|
||||
{"ref": "#% increased Cold Damage", "better": 1, "matchers": [{"string": "增加 #% 冰冷傷害"}, {"string": "減少 #% 冰冷傷害", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_damage"], "explicit": ["explicit.stat_3291658075"], "implicit": ["implicit.stat_3291658075"], "fractured": ["fractured.stat_3291658075"], "scourge": ["scourge.stat_3291658075"], "crafted": ["crafted.stat_3291658075"]}}}
|
||||
{"ref": "#% increased Cold Damage with Attack Skills", "better": 1, "matchers": [{"string": "攻擊技能增加 #% 冰冷傷害"}, {"string": "攻擊技能減少 #% 冰冷傷害", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_damage_with_attack_skills"], "explicit": ["explicit.stat_860668586"], "implicit": ["implicit.stat_860668586"]}}}
|
||||
{"ref": "#% increased Cold Spell Damage", "better": 1, "matchers": [{"string": "增加 #% 冰冷法術傷害 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_spell_damage"]}}}
|
||||
{"ref": "#% increased Elemental Damage", "better": 1, "matchers": [{"string": "增加 #% 元素傷害"}, {"string": "有增加 #% 的元素傷害"}, {"string": "有減少 #% 的元素傷害", "negate": true}, {"string": "減少 #% 元素傷害", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage"], "explicit": ["explicit.stat_3141070085"], "implicit": ["implicit.stat_3141070085"], "fractured": ["fractured.stat_3141070085"], "scourge": ["scourge.stat_3141070085"]}}}
|
||||
{"ref": "#% increased Elemental Damage with Attack Skills", "better": 1, "matchers": [{"string": "攻擊技能增加 #% 元素傷害"}, {"string": "攻擊技能減少 #% 元素傷害", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage_with_attack_skills"], "explicit": ["explicit.stat_387439868"], "implicit": ["implicit.stat_387439868"], "fractured": ["fractured.stat_387439868"], "scourge": ["scourge.stat_387439868"], "crafted": ["crafted.stat_387439868"]}}}
|
||||
{"ref": "#% increased Fire Damage", "better": 1, "matchers": [{"string": "增加 #% 火焰傷害"}, {"string": "減少 #% 火焰傷害", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_damage"], "explicit": ["explicit.stat_3962278098"], "implicit": ["implicit.stat_3962278098"], "fractured": ["fractured.stat_3962278098"], "scourge": ["scourge.stat_3962278098"], "crafted": ["crafted.stat_3962278098"]}}}
|
||||
{"ref": "#% increased Fire Damage with Attack Skills", "better": 1, "matchers": [{"string": "攻擊技能增加 #% 火焰傷害"}, {"string": "攻擊技能減少 #% 火焰傷害", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_damage_with_attack_skills"], "implicit": ["implicit.stat_2468413380"]}}}
|
||||
{"ref": "#% increased Fire Spell Damage", "better": 1, "matchers": [{"string": "增加 #% 火焰法術傷害 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_spell_damage"]}}}
|
||||
{"ref": "#% increased Lightning Damage", "better": 1, "matchers": [{"string": "增加 #% 閃電傷害"}, {"string": "減少 #% 閃電傷害", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_damage"], "explicit": ["explicit.stat_2231156303"], "implicit": ["implicit.stat_2231156303"], "fractured": ["fractured.stat_2231156303"], "scourge": ["scourge.stat_2231156303"], "crafted": ["crafted.stat_2231156303"]}}}
|
||||
{"ref": "#% increased Lightning Damage with Attack Skills", "better": 1, "matchers": [{"string": "攻擊技能增加 #% 閃電傷害"}, {"string": "攻擊技能減少 #% 閃電傷害", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_damage_with_attack_skills"], "explicit": ["explicit.stat_4208907162"], "implicit": ["implicit.stat_4208907162"]}}}
|
||||
{"ref": "#% increased Lightning Spell Damage", "better": 1, "matchers": [{"string": "增加 #% 閃電法術傷害 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_spell_damage"]}}}
|
||||
{"ref": "#% increased Mana Regeneration Rate", "better": 1, "matchers": [{"string": "增加 #% 魔力回復率"}, {"string": "減少 #% 魔力回復率", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_mana_regen"], "explicit": ["explicit.stat_789117908"], "implicit": ["implicit.stat_789117908"], "fractured": ["fractured.stat_789117908"], "scourge": ["scourge.stat_789117908"], "crafted": ["crafted.stat_789117908"]}}}
|
||||
{"ref": "#% increased Movement Speed", "better": 1, "matchers": [{"string": "增加 #% 移動速度"}, {"string": "減少 #% 移動速度", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_movement_speed"], "explicit": ["explicit.stat_2250533757"], "implicit": ["implicit.stat_2250533757"], "fractured": ["fractured.stat_2250533757"], "enchant": ["enchant.stat_2250533757"], "scourge": ["scourge.stat_2250533757"], "crafted": ["crafted.stat_2250533757"]}}}
|
||||
{"ref": "#% increased Rarity of Items found", "better": 1, "matchers": [{"string": "增加 #% 物品稀有度"}, {"string": "減少 #% 物品稀有度", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_rarity"], "explicit": ["explicit.stat_3917489142"], "implicit": ["implicit.stat_3917489142"], "fractured": ["fractured.stat_3917489142"], "scourge": ["scourge.stat_3917489142"], "crafted": ["crafted.stat_3917489142"]}}}
|
||||
{"ref": "#% increased Spell Damage", "better": 1, "matchers": [{"string": "增加 #% 法術傷害"}, {"string": "減少 #% 法術傷害", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_spell_damage"], "explicit": ["explicit.stat_2974417149"], "implicit": ["implicit.stat_2974417149"], "fractured": ["fractured.stat_2974417149"], "enchant": ["enchant.stat_2974417149"], "scourge": ["scourge.stat_2974417149"], "crafted": ["crafted.stat_2974417149"]}}}
|
||||
{"ref": "#% of Life Regenerated per Second", "better": 1, "matchers": [{"string": "每秒回復 #% 生命 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_percent_life_regen"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Life", "dp": true, "better": 1, "matchers": [{"string": "#% 的物理攻擊傷害偷取生命"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_life"], "explicit": ["explicit.stat_3593843976", "explicit.stat_55876295"], "implicit": ["implicit.stat_3593843976", "implicit.stat_55876295"], "fractured": ["fractured.stat_3593843976", "fractured.stat_55876295"], "scourge": ["scourge.stat_3593843976"], "crafted": ["crafted.stat_3593843976", "crafted.stat_55876295"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Mana", "dp": true, "better": 1, "matchers": [{"string": "#% 物理攻擊傷害偷取魔力"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_mana"], "explicit": ["explicit.stat_3237948413", "explicit.stat_669069897"], "implicit": ["implicit.stat_3237948413", "implicit.stat_669069897"], "fractured": ["fractured.stat_3237948413", "fractured.stat_669069897"], "scourge": ["scourge.stat_3237948413"], "crafted": ["crafted.stat_3237948413", "crafted.stat_669069897"]}}}
|
||||
{"ref": "#% total increased maximum Energy Shield", "better": 1, "matchers": [{"string": "增加 #% 最大能量護盾 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_energy_shield"]}}}
|
||||
{"ref": "#% total increased Physical Damage", "better": 1, "matchers": [{"string": "增加 #% 物裡傷害 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_physical_damage"]}}}
|
||||
{"ref": "+# total maximum Energy Shield", "better": 1, "matchers": [{"string": "+# 最大能量護盾 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_energy_shield"]}}}
|
||||
{"ref": "+# total maximum Life", "better": 1, "matchers": [{"string": "+# 最大生命 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life"]}}}
|
||||
{"ref": "+# total maximum Mana", "better": 1, "matchers": [{"string": "+# 最大魔力 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_mana"]}}}
|
||||
{"ref": "+# total to all Attributes", "better": 1, "matchers": [{"string": "+# 全能力 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_all_attributes"]}}}
|
||||
{"ref": "+# total to Dexterity", "better": 1, "matchers": [{"string": "+# 敏捷 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_dexterity"]}}}
|
||||
{"ref": "+# total to Intelligence", "better": 1, "matchers": [{"string": "+# 智慧 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_intelligence"]}}}
|
||||
{"ref": "+# total to Level of Socketed Aura Gems", "better": 1, "matchers": [{"string": "+# 插槽中光環寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_aura_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Bow Gems", "better": 1, "matchers": [{"string": "+# 插槽中弓寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_bow_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Chaos Gems", "better": 1, "matchers": [{"string": "+# 插槽中混沌寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_chaos_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Cold Gems", "better": 1, "matchers": [{"string": "+# 插槽中冰冷寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_cold_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Curse Gems", "better": 1, "matchers": [{"string": "+# 插槽中詛咒寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_curse_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Dexterity Gems", "better": 1, "matchers": [{"string": "+# 插槽中敏捷寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_dexterity_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Elemental Gems", "better": 1, "matchers": [{"string": "+# 插槽中元素寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_elemental_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Fire Gems", "better": 1, "matchers": [{"string": "+# 插槽中火焰寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_fire_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Gems", "better": 1, "matchers": [{"string": "+# 插槽中寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Golem Gems", "better": 1, "matchers": [{"string": "+# 插槽中魔像寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_golem_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Intelligence Gems", "better": 1, "matchers": [{"string": "+# 插槽中智慧寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_intelligence_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Lightning Gems", "better": 1, "matchers": [{"string": "+# 插槽中閃電寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_lightning_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Melee Gems", "better": 1, "matchers": [{"string": "+# 插槽中近戰寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_melee_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Minion Gems", "better": 1, "matchers": [{"string": "+# 插槽中召喚物寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_minion_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Movement Gems", "better": 1, "matchers": [{"string": "+# 插槽中位移寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_movement_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Projectile Gems", "better": 1, "matchers": [{"string": "+# 插槽中投射物寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_projectile_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Skill Gems", "better": 1, "matchers": [{"string": "+# 插槽中技能寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_skill_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Spell Gems", "better": 1, "matchers": [{"string": "+# 插槽中法術寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_spell_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Strength Gems", "better": 1, "matchers": [{"string": "+# 插槽中力量寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_strength_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Support Gems", "better": 1, "matchers": [{"string": "+# 插槽中輔助寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_support_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Vaal Gems", "better": 1, "matchers": [{"string": "+# 插槽中瓦爾寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_vaal_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Warcry Gems", "better": 1, "matchers": [{"string": "+# 插槽中戰吼寶石等級 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_warcry_gem_levels"]}}}
|
||||
{"ref": "+# total to Strength", "better": 1, "matchers": [{"string": "+# 力量 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_strength"]}}}
|
||||
{"ref": "+#% Global Critical Strike Chance", "better": 1, "matchers": [{"string": "+#% 全域暴擊機率 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_chance"]}}}
|
||||
{"ref": "+#% Global Critical Strike Multiplier", "better": 1, "matchers": [{"string": "+#% 全域暴擊加成 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_multiplier"]}}}
|
||||
{"ref": "+#% total Attack Speed", "better": 1, "matchers": [{"string": "+#% 攻擊速度 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_attack_speed"]}}}
|
||||
{"ref": "+#% total Cast Speed", "better": 1, "matchers": [{"string": "+#% 施放速度 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cast_speed"]}}}
|
||||
{"ref": "+#% total Critical Strike Chance for Spells", "better": 1, "matchers": [{"string": "+#% 法術暴擊機率 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_critical_strike_chance_for_spells"]}}}
|
||||
{"ref": "+#% total Elemental Resistance", "better": 1, "matchers": [{"string": "+#% 元素抗性 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_elemental_resistance"]}}}
|
||||
{"ref": "+#% total Resistance", "better": 1, "matchers": [{"string": "+#% 總抗性 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_resistance"]}}}
|
||||
{"ref": "+#% total to all Elemental Resistances", "better": 1, "matchers": [{"string": "+#% 元素抗性 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_all_elemental_resistances"]}}}
|
||||
{"ref": "+#% total to Chaos Resistance", "better": 1, "matchers": [{"string": "+#% 總混沌抗性 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_chaos_resistance"]}}}
|
||||
{"ref": "+#% total to Cold Resistance", "better": 1, "matchers": [{"string": "+#% 冰冷抗性 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cold_resistance"]}}}
|
||||
{"ref": "+#% total to Fire Resistance", "better": 1, "matchers": [{"string": "+#% 火焰抗性 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_fire_resistance"]}}}
|
||||
{"ref": "+#% total to Lightning Resistance", "better": 1, "matchers": [{"string": "+#% 閃電抗性 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_lightning_resistance"]}}}
|
||||
{"ref": "Adds # to # Chaos Damage", "better": 1, "matchers": [{"string": "附加 # 至 # 混沌傷害"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_chaos_damage"], "explicit": ["explicit.stat_2223678961", "explicit.stat_3531280422"], "implicit": ["implicit.stat_2223678961", "implicit.stat_3531280422"], "fractured": ["fractured.stat_2223678961"], "enchant": ["enchant.stat_2223678961"], "scourge": ["scourge.stat_2223678961"]}}}
|
||||
{"ref": "Adds # to # Chaos Damage to Attacks", "better": 1, "matchers": [{"string": "攻擊附加 # 至 # 混沌傷害"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_chaos_damage_to_attacks"], "explicit": ["explicit.stat_674553446"], "implicit": ["implicit.stat_674553446"], "fractured": ["fractured.stat_674553446"], "crafted": ["crafted.stat_674553446"]}}}
|
||||
{"ref": "Adds # to # Chaos Damage to Spells", "better": 1, "matchers": [{"string": "法術附加 # 至 # 混沌傷害"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_chaos_damage_to_spells"], "explicit": ["explicit.stat_2300399854"], "implicit": ["implicit.stat_2300399854"], "fractured": ["fractured.stat_2300399854"]}}}
|
||||
{"ref": "Adds # to # Cold Damage", "better": 1, "matchers": [{"string": "附加 # 至 # 冰冷傷害"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_cold_damage"], "explicit": ["explicit.stat_1037193709", "explicit.stat_2387423236"], "implicit": ["implicit.stat_1037193709", "implicit.stat_2387423236"], "fractured": ["fractured.stat_1037193709", "fractured.stat_2387423236"], "enchant": ["enchant.stat_1037193709"], "scourge": ["scourge.stat_1037193709"], "crafted": ["crafted.stat_1037193709", "crafted.stat_2387423236"]}}}
|
||||
{"ref": "Adds # to # Cold Damage to Attacks", "better": 1, "matchers": [{"string": "攻擊附加 # 至 # 冰冷傷害"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_cold_damage_to_attacks"], "explicit": ["explicit.stat_4067062424"], "implicit": ["implicit.stat_4067062424"], "fractured": ["fractured.stat_4067062424"], "crafted": ["crafted.stat_4067062424"]}}}
|
||||
{"ref": "Adds # to # Cold Damage to Spells", "better": 1, "matchers": [{"string": "法術附加 # 至 # 冰冷傷害"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_cold_damage_to_spells"], "explicit": ["explicit.stat_2469416729"], "implicit": ["implicit.stat_2469416729"], "fractured": ["fractured.stat_2469416729"], "scourge": ["scourge.stat_2469416729"], "crafted": ["crafted.stat_2469416729"]}}}
|
||||
{"ref": "Adds # to # Damage", "better": 1, "matchers": [{"string": "附加 # 至 # 傷害 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_damage"]}}}
|
||||
{"ref": "Adds # to # Damage to Attacks", "better": 1, "matchers": [{"string": "攻擊附加 # 至 # 傷害 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_damage_to_attacks"]}}}
|
||||
{"ref": "Adds # to # Damage to Spells", "better": 1, "matchers": [{"string": "法術附加 # 至 # 傷害 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_damage_to_spells"]}}}
|
||||
{"ref": "Adds # to # Elemental Damage", "better": 1, "matchers": [{"string": "附加 # 至 # 元素傷害 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_elemental_damage"]}}}
|
||||
{"ref": "Adds # to # Elemental Damage to Attacks", "better": 1, "matchers": [{"string": "攻擊附加 # 至 # 元素傷害 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_elemental_damage_to_attacks"]}}}
|
||||
{"ref": "Adds # to # Elemental Damage to Spells", "better": 1, "matchers": [{"string": "法術附加 # 至 # 元素傷害 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_elemental_damage_to_spells"]}}}
|
||||
{"ref": "Adds # to # Fire Damage", "better": 1, "matchers": [{"string": "附加 # 至 # 火焰傷害"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_fire_damage"], "explicit": ["explicit.stat_321077055", "explicit.stat_709508406"], "implicit": ["implicit.stat_321077055", "implicit.stat_709508406"], "fractured": ["fractured.stat_321077055", "fractured.stat_709508406"], "enchant": ["enchant.stat_709508406"], "scourge": ["scourge.stat_709508406"], "crafted": ["crafted.stat_321077055", "crafted.stat_709508406"]}}}
|
||||
{"ref": "Adds # to # Fire Damage to Attacks", "better": 1, "matchers": [{"string": "攻擊附加 # 至 # 火焰傷害"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_fire_damage_to_attacks"], "explicit": ["explicit.stat_1573130764"], "implicit": ["implicit.stat_1573130764"], "fractured": ["fractured.stat_1573130764"], "crafted": ["crafted.stat_1573130764"]}}}
|
||||
{"ref": "Adds # to # Fire Damage to Spells", "better": 1, "matchers": [{"string": "法術附加 # 至 # 火焰傷害"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_fire_damage_to_spells"], "explicit": ["explicit.stat_1133016593"], "implicit": ["implicit.stat_1133016593"], "fractured": ["fractured.stat_1133016593"], "scourge": ["scourge.stat_1133016593"], "crafted": ["crafted.stat_1133016593"]}}}
|
||||
{"ref": "Adds # to # Lightning Damage", "better": 1, "matchers": [{"string": "附加 # 至 # 閃電傷害"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_lightning_damage"], "explicit": ["explicit.stat_1334060246", "explicit.stat_3336890334"], "implicit": ["implicit.stat_1334060246", "implicit.stat_3336890334"], "fractured": ["fractured.stat_1334060246", "fractured.stat_3336890334"], "enchant": ["enchant.stat_3336890334"], "scourge": ["scourge.stat_3336890334"], "crafted": ["crafted.stat_1334060246", "crafted.stat_3336890334"]}}}
|
||||
{"ref": "Adds # to # Lightning Damage to Attacks", "better": 1, "matchers": [{"string": "攻擊附加 # 至 # 閃電傷害"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_lightning_damage_to_attacks"], "explicit": ["explicit.stat_1754445556"], "implicit": ["implicit.stat_1754445556"], "fractured": ["fractured.stat_1754445556"], "crafted": ["crafted.stat_1754445556"]}}}
|
||||
{"ref": "Adds # to # Lightning Damage to Spells", "better": 1, "matchers": [{"string": "法術附加 # 至 # 閃電傷害"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_lightning_damage_to_spells"], "explicit": ["explicit.stat_2831165374"], "implicit": ["implicit.stat_2831165374"], "fractured": ["fractured.stat_2831165374"], "scourge": ["scourge.stat_2831165374"], "crafted": ["crafted.stat_2831165374"]}}}
|
||||
{"ref": "Adds # to # Physical Damage", "better": 1, "matchers": [{"string": "附加 # 至 # 物理傷害"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_physical_damage"], "explicit": ["explicit.stat_1940865751", "explicit.stat_960081730"], "implicit": ["implicit.stat_1940865751"], "fractured": ["fractured.stat_1940865751"], "scourge": ["scourge.stat_1940865751"], "crafted": ["crafted.stat_1940865751"]}}}
|
||||
{"ref": "Adds # to # Physical Damage to Attacks", "better": 1, "matchers": [{"string": "攻擊附加 # 至 # 物理傷害"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_physical_damage_to_attacks"], "explicit": ["explicit.stat_3032590688"], "implicit": ["implicit.stat_3032590688"], "fractured": ["fractured.stat_3032590688"], "crafted": ["crafted.stat_3032590688"]}}}
|
||||
{"ref": "Adds # to # Physical Damage to Spells", "better": 1, "matchers": [{"string": "法術附加 # 至 # 物理傷害"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_physical_damage_to_spells"], "explicit": ["explicit.stat_2435536961"], "implicit": ["implicit.stat_2435536961"], "fractured": ["fractured.stat_2435536961"], "scourge": ["scourge.stat_2435536961"]}}}
|
||||
{"ref": "Has # Influences", "better": 1, "matchers": [{"string": "有 # 勢力 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_influence_count"]}}}
|
||||
{"ref": "Has Crusader Influence", "better": 1, "matchers": [{"string": "有聖戰軍王勢力 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_crusader_influence"]}}}
|
||||
{"ref": "Has Elder Influence", "better": 1, "matchers": [{"string": "有尊師勢力 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_elder_influence"]}}}
|
||||
{"ref": "Has Hunter Influence", "better": 1, "matchers": [{"string": "有狩獵者勢力 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_hunter_influence"]}}}
|
||||
{"ref": "Has Logbook Area: Battleground Graves", "better": 1, "matchers": [{"string": "有日誌區域:烽火墳墓 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_battleground_graves"]}}}
|
||||
{"ref": "Has Logbook Area: Bluffs", "better": 1, "matchers": [{"string": "有日誌區域:陡岸峭壁 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_bluffs"]}}}
|
||||
{"ref": "Has Logbook Area: Cemetery", "better": 1, "matchers": [{"string": "有日誌區域:公墓 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_cemetery"]}}}
|
||||
{"ref": "Has Logbook Area: Desert Ruins", "better": 1, "matchers": [{"string": "有日誌區域:沙漠廢墟 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_desert_ruins"]}}}
|
||||
{"ref": "Has Logbook Area: Dried Riverbed", "better": 1, "matchers": [{"string": "有日誌區域:乾枯河床 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_dried_riverbed"]}}}
|
||||
{"ref": "Has Logbook Area: Forest Ruins", "better": 1, "matchers": [{"string": "有日誌區域:森林遺跡 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_forest_ruins"]}}}
|
||||
{"ref": "Has Logbook Area: Karui Wargraves", "better": 1, "matchers": [{"string": "有日誌區域:卡魯戰爭墓地 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_karui_wargraves"]}}}
|
||||
{"ref": "Has Logbook Area: Mountainside", "better": 1, "matchers": [{"string": "有日誌區域:迷黯山腰 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_mountainside"]}}}
|
||||
{"ref": "Has Logbook Area: Rotting Temple", "better": 1, "matchers": [{"string": "有日誌區域:腐朽神殿 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_rotting_temple"]}}}
|
||||
{"ref": "Has Logbook Area: Sarn Slums", "better": 1, "matchers": [{"string": "有日誌區域:薩恩貧民窟 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_sarn_slums"]}}}
|
||||
{"ref": "Has Logbook Area: Scrublands", "better": 1, "matchers": [{"string": "有日誌區域:灌木叢 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_scrublands"]}}}
|
||||
{"ref": "Has Logbook Area: Shipwreck Reef", "better": 1, "matchers": [{"string": "有日誌區域:沉船岩礁 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_shipwreck_reef"]}}}
|
||||
{"ref": "Has Logbook Area: Utzaal Outskirts", "better": 1, "matchers": [{"string": "有日誌區域:奧札爾郊野 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_utzaal_outskirts"]}}}
|
||||
{"ref": "Has Logbook Area: Vaal Temple", "better": 1, "matchers": [{"string": "有日誌區域:瓦爾神殿 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_vaal_temple"]}}}
|
||||
{"ref": "Has Logbook Area: Volcanic Island", "better": 1, "matchers": [{"string": "有日誌區域:火山島 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_volcano"]}}}
|
||||
{"ref": "Has Logbook Faction: Black Scythe Mercenaries", "better": 0, "matchers": [{"string": "黑鐮傭兵"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_mercenaries"]}}}
|
||||
{"ref": "Has Logbook Faction: Druids of the Broken Circle", "better": 0, "matchers": [{"string": "破碎環之德魯伊"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_druids"]}}}
|
||||
{"ref": "Has Logbook Faction: Knights of the Sun", "better": 0, "matchers": [{"string": "豔陽騎士"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_knights"]}}}
|
||||
{"ref": "Has Logbook Faction: Order of the Chalice", "better": 0, "matchers": [{"string": "聖杯之序"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_order"]}}}
|
||||
{"ref": "Has Redeemer Influence", "better": 1, "matchers": [{"string": "有救贖者勢力 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_redeemer_influence"]}}}
|
||||
{"ref": "Has Room: Antechamber", "better": 0, "matchers": [{"string": "神殿前院"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_antechamber"]}, "option": true}}
|
||||
{"ref": "Has Room: Apex of Ascension (Tier 3)", "better": 0, "matchers": [{"string": "祭祀之巔 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_sacrifice_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Apex of Atzoatl", "better": 0, "matchers": [{"string": "阿茲瓦特之巔"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_apex"]}, "option": true}}
|
||||
{"ref": "Has Room: Arena of Valour (Tier 2)", "better": 0, "matchers": [{"string": "傳說對決 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_weapon_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Armourer's Workshop (Tier 1)", "better": 0, "matchers": [{"string": "裝甲磨坊 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_armour_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Armoury (Tier 2)", "better": 0, "matchers": [{"string": "軍械庫 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_armour_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Atlas of Worlds (Tier 3)", "better": 0, "matchers": [{"string": "異界輿圖 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cartography_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Automaton Lab (Tier 2)", "better": 0, "matchers": [{"string": "自運研究所 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_minions_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Banquet Hall", "better": 0, "matchers": [{"string": "神殿宴會場"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_banquet_hall"]}, "option": true}}
|
||||
{"ref": "Has Room: Barracks (Tier 2)", "better": 0, "matchers": [{"string": "軍隊憩所 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breeding_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Breach Containment Chamber (Tier 2)", "better": 0, "matchers": [{"string": "裂痕異域室 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breach_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Catalyst of Corruption (Tier 2)", "better": 0, "matchers": [{"string": "腐敗孳生室 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_corruption_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Cellar", "better": 0, "matchers": [{"string": "神殿地窖"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cellar"]}, "option": true}}
|
||||
{"ref": "Has Room: Chamber of Iron (Tier 3)", "better": 0, "matchers": [{"string": "鋼鍛之室 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_armour_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Chasm", "better": 0, "matchers": [{"string": "神殿裂口"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chasm_room"]}, "option": true}}
|
||||
{"ref": "Has Room: Cloister", "better": 0, "matchers": [{"string": "神殿廟"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cloister"]}, "option": true}}
|
||||
{"ref": "Has Room: Conduit of Lightning (Tier 3)", "better": 0, "matchers": [{"string": "雷霆導管 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_lightning_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Corruption Chamber (Tier 1)", "better": 0, "matchers": [{"string": "腐敗之室 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_corruption_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Court of Sealed Death (Tier 3)", "better": 0, "matchers": [{"string": "封亡院庭 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_strongbox_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Crucible of Flame (Tier 3)", "better": 0, "matchers": [{"string": "烈焰熔爐 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_fire_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Cultivar Chamber (Tier 2)", "better": 0, "matchers": [{"string": "培育秘室 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_poison_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Defense Research Lab (Tier 3)", "better": 0, "matchers": [{"string": "禦防研究所 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trap_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Demolition Lab (Tier 2)", "better": 0, "matchers": [{"string": "拆除庫 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_explosives_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Department of Thaumaturgy (Tier 2)", "better": 0, "matchers": [{"string": "魔法部 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_gem_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Doryani's Institute (Tier 3)", "better": 0, "matchers": [{"string": "多里亞尼之院 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_gem_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Engineering Department (Tier 2)", "better": 0, "matchers": [{"string": "工程部 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_workshop_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Explosives Room (Tier 1)", "better": 0, "matchers": [{"string": "彈藥庫 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_explosives_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Factory (Tier 3)", "better": 0, "matchers": [{"string": "瓦爾工廠 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_workshop_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Flame Workshop (Tier 1)", "better": 0, "matchers": [{"string": "獄炎磨坊 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_fire_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Gemcutter's Workshop (Tier 1)", "better": 0, "matchers": [{"string": "刻石磨坊 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_gem_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Glittering Halls (Tier 3)", "better": 0, "matchers": [{"string": "閃耀聖殿 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trinket_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Guardhouse (Tier 1)", "better": 0, "matchers": [{"string": "衛兵房 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breeding_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Champions (Tier 3)", "better": 0, "matchers": [{"string": "冠軍聖殿 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_weapon_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Heroes (Tier 2)", "better": 0, "matchers": [{"string": "英雄之殿 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_legion_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Legends (Tier 3)", "better": 0, "matchers": [{"string": "神話之殿 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_legion_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Locks (Tier 2)", "better": 0, "matchers": [{"string": "千鎖殿堂 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_strongbox_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Lords (Tier 2)", "better": 0, "matchers": [{"string": "權貴殿堂 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_queens_chambers_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Mettle (Tier 1)", "better": 0, "matchers": [{"string": "勇氣之殿 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_legion_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Offerings (Tier 2)", "better": 0, "matchers": [{"string": "獻祭殿堂 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_sacrifice_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of War (Tier 3)", "better": 0, "matchers": [{"string": "戰爭聖殿 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breeding_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Halls", "better": 0, "matchers": [{"string": "神殿殿堂"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_halls"]}, "option": true}}
|
||||
{"ref": "Has Room: Hatchery (Tier 1)", "better": 0, "matchers": [{"string": "孵化室 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_minions_1"]}, "option": true}}
|
||||
{"ref": "Has Room: House of the Others (Tier 3)", "better": 0, "matchers": [{"string": "異者居所 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breach_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Hurricane Engine (Tier 2)", "better": 0, "matchers": [{"string": "颶風引擎室 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_storm_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hybridisation Chamber (Tier 3)", "better": 0, "matchers": [{"string": "異種之域 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_minions_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Jeweller's Workshop (Tier 1)", "better": 0, "matchers": [{"string": "寶匠磨坊 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trinket_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Jewellery Forge (Tier 2)", "better": 0, "matchers": [{"string": "珠寶冶煉室 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trinket_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Lightning Workshop (Tier 1)", "better": 0, "matchers": [{"string": "風雷磨坊 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_lightning_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Locus of Corruption (Tier 3)", "better": 0, "matchers": [{"string": "腐敗之地 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_corruption_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Museum of Artefacts (Tier 3)", "better": 0, "matchers": [{"string": "文物展館 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chests_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Office of Cartography (Tier 2)", "better": 0, "matchers": [{"string": "製圖研製室 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cartography_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Omnitect Forge (Tier 2)", "better": 0, "matchers": [{"string": "全能冶煉室 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_fire_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Omnitect Reactor Plant (Tier 2)", "better": 0, "matchers": [{"string": "全能反應廠 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_lightning_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Passageways", "better": 0, "matchers": [{"string": "神殿通道"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_passageways"]}, "option": true}}
|
||||
{"ref": "Has Room: Pits", "better": 0, "matchers": [{"string": "神殿舊窖"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_the_pits"]}, "option": true}}
|
||||
{"ref": "Has Room: Poison Garden (Tier 1)", "better": 0, "matchers": [{"string": "監獄花園 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_poison_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Pools of Restoration (Tier 1)", "better": 0, "matchers": [{"string": "治癒之泉 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_healing_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Royal Meeting Room (Tier 1)", "better": 0, "matchers": [{"string": "王室宴客室 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_queens_chambers_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Sacrificial Chamber (Tier 1)", "better": 0, "matchers": [{"string": "獻祭之室 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_sacrifice_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Sadist's Den (Tier 3)", "better": 0, "matchers": [{"string": "虐狂之巢 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_torment_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Sanctum of Immortality (Tier 3)", "better": 0, "matchers": [{"string": "不朽聖殿 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_healing_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Sanctum of Unity (Tier 2)", "better": 0, "matchers": [{"string": "統領聖殿 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_empowering_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Sanctum of Vitality (Tier 2)", "better": 0, "matchers": [{"string": "活力聖殿 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_healing_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Shrine of Empowerment (Tier 1)", "better": 0, "matchers": [{"string": "恩賜神殿 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_empowering_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Shrine of Unmaking (Tier 3)", "better": 0, "matchers": [{"string": "毀滅神殿 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_explosives_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Sparring Room (Tier 1)", "better": 0, "matchers": [{"string": "格鬥場 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_weapon_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Splinter Research Lab (Tier 1)", "better": 0, "matchers": [{"string": "裂界研究所 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breach_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Storage Room (Tier 1)", "better": 0, "matchers": [{"string": "儲物室 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chests_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Storm of Corruption (Tier 3)", "better": 0, "matchers": [{"string": "腐敗風暴 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_storm_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Strongbox Chamber (Tier 1)", "better": 0, "matchers": [{"string": "寶箱之殿 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_strongbox_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Surveyor's Study (Tier 1)", "better": 0, "matchers": [{"string": "研究書房 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cartography_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Tempest Generator (Tier 1)", "better": 0, "matchers": [{"string": "暴雷發電室 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_storm_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Temple Defense Workshop (Tier 2)", "better": 0, "matchers": [{"string": "神殿禦防室 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trap_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Temple Nexus (Tier 3)", "better": 0, "matchers": [{"string": "死神靈殿 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_empowering_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Throne of Atziri (Tier 3)", "better": 0, "matchers": [{"string": "阿茲里宴殿 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_queens_chambers_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Tombs", "better": 0, "matchers": [{"string": "神殿陵寢"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_tombs"]}, "option": true}}
|
||||
{"ref": "Has Room: Torment Cells (Tier 1)", "better": 0, "matchers": [{"string": "磨難牢房 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_torment_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Torture Cages (Tier 2)", "better": 0, "matchers": [{"string": "拷刑大牢 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_torment_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Toxic Grove (Tier 3)", "better": 0, "matchers": [{"string": "劇毒果園 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_poison_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Trap Workshop (Tier 1)", "better": 0, "matchers": [{"string": "陷阱磨坊 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trap_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Treasury (Tier 2)", "better": 0, "matchers": [{"string": "祕寶庫 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_currency_vault_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Tunnels", "better": 0, "matchers": [{"string": "神殿地道"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_tunnels"]}, "option": true}}
|
||||
{"ref": "Has Room: Vault (Tier 1)", "better": 0, "matchers": [{"string": "藏寶庫 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_currency_vault_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Warehouses (Tier 2)", "better": 0, "matchers": [{"string": "倉庫間 (階級 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chests_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Wealth of the Vaal (Tier 3)", "better": 0, "matchers": [{"string": "瓦爾聚寶庫 (階級 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_currency_vault_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Workshop (Tier 1)", "better": 0, "matchers": [{"string": "工作坊 (階級 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_workshop_1"]}, "option": true}}
|
||||
{"ref": "Has Shaper Influence", "better": 1, "matchers": [{"string": "有塑者勢力 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_shaper_influence"]}}}
|
||||
{"ref": "Has Warlord Influence", "better": 1, "matchers": [{"string": "有總督軍勢力 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_warlord_influence"]}}}
|
||||
{"ref": "Mirrored Tablet has # Islands", "better": 1, "matchers": [{"string": "鏡像碑牌有 # 島嶼 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_lake_number_of_islands"]}}}
|
||||
{"ref": "More Currency: #%", "better": 1, "matchers": [{"string": "更多通貨:#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_currency_drops"]}}}
|
||||
{"ref": "More Divination Cards: #%", "better": 1, "matchers": [{"string": "額外命運卡:#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_card_drops"]}}}
|
||||
{"ref": "More Maps: #%", "better": 1, "matchers": [{"string": "更多地圖:#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_map_drops"]}}}
|
||||
{"ref": "More Scarabs: #%", "better": 1, "matchers": [{"string": "更多聖甲蟲:#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_scarab_drops"]}}}
|
||||
{"ref": "Quality (Attack Modifiers): #%", "better": 1, "matchers": [{"string": "品質(攻擊詞綴):#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_attack_quality"]}}}
|
||||
{"ref": "Quality (Attribute Modifiers): #%", "better": 1, "matchers": [{"string": "品質(能力值詞綴):#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_attribute_quality"]}}}
|
||||
{"ref": "Quality (Caster Modifiers): #%", "better": 1, "matchers": [{"string": "品質(法術詞綴):#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_caster_quality"]}}}
|
||||
{"ref": "Quality (Critical Modifiers): #%", "better": 1, "matchers": [{"string": "品質(暴擊詞綴):#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_critical_quality"]}}}
|
||||
{"ref": "Quality (Currency): #%", "better": 1, "matchers": [{"string": "品質(通貨):#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_currency"]}}}
|
||||
{"ref": "Quality (Defence Modifiers): #%", "better": 1, "matchers": [{"string": "品質(防禦詞綴):#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_defense_quality"]}}}
|
||||
{"ref": "Quality (Divination Cards): #%", "better": 1, "matchers": [{"string": "品質(命運卡):#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_cards"]}}}
|
||||
{"ref": "Quality (Elemental Damage Modifiers): #%", "better": 1, "matchers": [{"string": "品質(元素傷害詞綴):#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_elemental_quality"]}}}
|
||||
{"ref": "Quality (Life and Mana Modifiers): #%", "better": 1, "matchers": [{"string": "品質(生命和魔力詞綴):#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_resource_quality"]}}}
|
||||
{"ref": "Quality (Pack Size): #%", "better": 1, "matchers": [{"string": "品質(怪物群大小):#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_pack_size"]}}}
|
||||
{"ref": "Quality (Physical and Chaos Damage Modifiers): #%", "better": 1, "matchers": [{"string": "品質(物理和混沌傷害詞綴):#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_physical_chaos_quality"]}}}
|
||||
{"ref": "Quality (Rarity): #%", "better": 1, "matchers": [{"string": "品質(稀有度):#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_rarity"]}}}
|
||||
{"ref": "Quality (Resistance Modifiers): #%", "better": 1, "matchers": [{"string": "品質(抗性詞綴):#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_resistance_quality"]}}}
|
||||
{"ref": "Quality (Scarabs): #%", "better": 1, "matchers": [{"string": "品質(聖甲蟲):#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_scarabs"]}}}
|
||||
{"ref": "Quality (Speed Modifiers): #%", "better": 1, "matchers": [{"string": "品質(速度詞綴):#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_speed_quality"]}}}
|
||||
{"ref": "Reflection of Abyss (Difficulty #)", "better": 1, "matchers": [{"string": "深淵映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_38892"]}}}
|
||||
{"ref": "Reflection of Ambush (Difficulty #)", "better": 1, "matchers": [{"string": "伏擊映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_48307"]}}}
|
||||
{"ref": "Reflection of Angling (Difficulty #)", "better": 1, "matchers": [{"string": "釣魚映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_40794"]}}}
|
||||
{"ref": "Reflection of Azurite (Difficulty #)", "better": 1, "matchers": [{"string": "碧藍映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_40031"]}}}
|
||||
{"ref": "Reflection of Bestiary (Difficulty #)", "better": 1, "matchers": [{"string": "獸獵映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_55569"]}}}
|
||||
{"ref": "Reflection of Breach (Difficulty #)", "better": 1, "matchers": [{"string": "裂痕映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_62572"]}}}
|
||||
{"ref": "Reflection of Brutality (Difficulty #)", "better": 1, "matchers": [{"string": "殘暴映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_29096"]}}}
|
||||
{"ref": "Reflection of Camaraderie (Difficulty #)", "better": 1, "matchers": [{"string": "友誼映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_35395"]}}}
|
||||
{"ref": "Reflection of Catalysis (Difficulty #)", "better": 1, "matchers": [{"string": "催化映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_57850"]}}}
|
||||
{"ref": "Reflection of Chaos (Difficulty #)", "better": 1, "matchers": [{"string": "混沌映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_50834"]}}}
|
||||
{"ref": "Reflection of Conflict (Difficulty #)", "better": 1, "matchers": [{"string": "衝突映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_1931"]}}}
|
||||
{"ref": "Reflection of Darkness (Difficulty #)", "better": 1, "matchers": [{"string": "黑暗映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_34457"]}}}
|
||||
{"ref": "Reflection of Delirium (Difficulty #)", "better": 1, "matchers": [{"string": "譫妄映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_22138"]}}}
|
||||
{"ref": "Reflection of Delve (Difficulty #)", "better": 1, "matchers": [{"string": "掘獄映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_18737"]}}}
|
||||
{"ref": "Reflection of Demonfire (Difficulty #)", "better": 1, "matchers": [{"string": "業火映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_28500"]}}}
|
||||
{"ref": "Reflection of Domination (Difficulty #)", "better": 1, "matchers": [{"string": "支配映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_63412"]}}}
|
||||
{"ref": "Reflection of Entrapment (Difficulty #)", "better": 1, "matchers": [{"string": "誘捕映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_44399"]}}}
|
||||
{"ref": "Reflection of Essence (Difficulty #)", "better": 1, "matchers": [{"string": "精髓映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_49862"]}}}
|
||||
{"ref": "Reflection of Experimentation (Difficulty #)", "better": 1, "matchers": [{"string": "實驗映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_55676"]}}}
|
||||
{"ref": "Reflection of Flame (Difficulty #)", "better": 1, "matchers": [{"string": "烈焰映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_42468"]}}}
|
||||
{"ref": "Reflection of Fractured Dimensions (Difficulty #)", "better": 1, "matchers": [{"string": "破裂次元映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_49488"]}}}
|
||||
{"ref": "Reflection of Frost (Difficulty #)", "better": 1, "matchers": [{"string": "寒霜映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_38110"]}}}
|
||||
{"ref": "Reflection of Guilt (Difficulty #)", "better": 1, "matchers": [{"string": "責難映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_25480"]}}}
|
||||
{"ref": "Reflection of Imprisonment (Difficulty #)", "better": 1, "matchers": [{"string": "監禁映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_10363"]}}}
|
||||
{"ref": "Reflection of Kalandra (Difficulty #)", "better": 1, "matchers": [{"string": "卡蘭德映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_36591"]}}}
|
||||
{"ref": "Reflection of Legion (Difficulty #)", "better": 1, "matchers": [{"string": "戰亂映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_403"]}}}
|
||||
{"ref": "Reflection of Metamorph (Difficulty #)", "better": 1, "matchers": [{"string": "鍊魔映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_3699"]}}}
|
||||
{"ref": "Reflection of Occultism (Difficulty #)", "better": 1, "matchers": [{"string": "神秘映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_24451"]}}}
|
||||
{"ref": "Reflection of Paradise (Difficulty #)", "better": 1, "matchers": [{"string": "天堂映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_50846"]}}}
|
||||
{"ref": "Reflection of Perverted Faith (Difficulty #)", "better": 1, "matchers": [{"string": "怪其信仰映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_27678"]}}}
|
||||
{"ref": "Reflection of Phaaryl (Difficulty #)", "better": 1, "matchers": [{"string": "法瑞爾映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_7674"]}}}
|
||||
{"ref": "Reflection of Possession (Difficulty #)", "better": 1, "matchers": [{"string": "附身映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_25049"]}}}
|
||||
{"ref": "Reflection of Power (Difficulty #)", "better": 1, "matchers": [{"string": "權力映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_35950"]}}}
|
||||
{"ref": "Reflection of Scourge (Difficulty #)", "better": 1, "matchers": [{"string": "災魘映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_62360"]}}}
|
||||
{"ref": "Reflection of Stasis (Difficulty #)", "better": 1, "matchers": [{"string": "靜止映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_32968"]}}}
|
||||
{"ref": "Reflection of Sulphite (Difficulty #)", "better": 1, "matchers": [{"string": "硫酸映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_45086"]}}}
|
||||
{"ref": "Reflection of the Black Scythe (Difficulty #)", "better": 1, "matchers": [{"string": "黑暗血鐮映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_9662"]}}}
|
||||
{"ref": "Reflection of the Breachlord (Difficulty #)", "better": 1, "matchers": [{"string": "裂痕君主映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_62935"]}}}
|
||||
{"ref": "Reflection of the Broken Circle (Difficulty #)", "better": 1, "matchers": [{"string": "破碎環映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_43128"]}}}
|
||||
{"ref": "Reflection of the Chalice (Difficulty #)", "better": 1, "matchers": [{"string": "聖杯映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_64561"]}}}
|
||||
{"ref": "Reflection of the Chasm (Difficulty #)", "better": 1, "matchers": [{"string": "裂口映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_57101"]}}}
|
||||
{"ref": "Reflection of the Dream (Difficulty #)", "better": 1, "matchers": [{"string": "夢想映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_27117"]}}}
|
||||
{"ref": "Reflection of the Harbingers (Difficulty #)", "better": 1, "matchers": [{"string": "神諭映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_37203"]}}}
|
||||
{"ref": "Reflection of the Hunter (Difficulty #)", "better": 1, "matchers": [{"string": "獵人映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_18816"]}}}
|
||||
{"ref": "Reflection of the Monolith (Difficulty #)", "better": 1, "matchers": [{"string": "石陣映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_34796"]}}}
|
||||
{"ref": "Reflection of the Nightmare (Difficulty #)", "better": 1, "matchers": [{"string": "噩夢映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_24232"]}}}
|
||||
{"ref": "Reflection of the Storm (Difficulty #)", "better": 1, "matchers": [{"string": "風暴映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_2745"]}}}
|
||||
{"ref": "Reflection of the Sun (Difficulty #)", "better": 1, "matchers": [{"string": "豔陽映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_60034"]}}}
|
||||
{"ref": "Reflection of the Trove (Difficulty #)", "better": 1, "matchers": [{"string": "寶庫映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_46772"]}}}
|
||||
{"ref": "Reflection of the Wilderness (Difficulty #)", "better": 1, "matchers": [{"string": "荒野映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_29224"]}}}
|
||||
{"ref": "Reflection of Thralldom (Difficulty #)", "better": 1, "matchers": [{"string": "奴役映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_26813"]}}}
|
||||
{"ref": "Reflection of Torment (Difficulty #)", "better": 1, "matchers": [{"string": "磨難映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_53950"]}}}
|
||||
{"ref": "Reflection of Tyranny (Difficulty #)", "better": 1, "matchers": [{"string": "暴政映像 (難度 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_60981"]}}}
|
||||
@@ -1,32 +0,0 @@
|
||||
{"ref": "# Life Regenerated per Second", "better": 1, "matchers": [{"string": "# 每秒生命回復 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life_regen"]}}}
|
||||
{"ref": "#% increased Burning Damage", "better": 1, "matchers": [{"string": "增加 #% 燃燒傷害"}, {"string": "減少 #% 燃燒傷害", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_burning_damage"], "explicit": ["explicit.stat_1175385867"], "implicit": ["implicit.stat_1175385867"], "fractured": ["fractured.stat_1175385867"]}}}
|
||||
{"ref": "#% increased Cold Damage", "better": 1, "matchers": [{"string": "增加 #% 冰冷傷害"}, {"string": "減少 #% 冰冷傷害", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_damage"], "explicit": ["explicit.stat_3291658075"], "implicit": ["implicit.stat_3291658075"], "fractured": ["fractured.stat_3291658075"], "scourge": ["scourge.stat_3291658075"], "crafted": ["crafted.stat_3291658075"]}}}
|
||||
{"ref": "#% increased Cold Spell Damage", "better": 1, "matchers": [{"string": "增加 #% 冰冷法術傷害 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_spell_damage"]}}}
|
||||
{"ref": "#% increased Elemental Damage", "better": 1, "matchers": [{"string": "增加 #% 元素傷害"}, {"string": "有增加 #% 的元素傷害"}, {"string": "有減少 #% 的元素傷害", "negate": true}, {"string": "減少 #% 元素傷害", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage"], "explicit": ["explicit.stat_3141070085"], "implicit": ["implicit.stat_3141070085"], "fractured": ["fractured.stat_3141070085"], "scourge": ["scourge.stat_3141070085"]}}}
|
||||
{"ref": "#% increased Elemental Damage with Attack Skills", "better": 1, "matchers": [{"string": "攻擊技能增加 #% 元素傷害"}, {"string": "攻擊技能減少 #% 元素傷害", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage_with_attack_skills"], "explicit": ["explicit.stat_387439868"], "implicit": ["implicit.stat_387439868"], "fractured": ["fractured.stat_387439868"], "scourge": ["scourge.stat_387439868"], "crafted": ["crafted.stat_387439868"]}}}
|
||||
{"ref": "#% increased Fire Damage", "better": 1, "matchers": [{"string": "增加 #% 火焰傷害"}, {"string": "減少 #% 火焰傷害", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_damage"], "explicit": ["explicit.stat_3962278098"], "implicit": ["implicit.stat_3962278098"], "fractured": ["fractured.stat_3962278098"], "scourge": ["scourge.stat_3962278098"], "crafted": ["crafted.stat_3962278098"]}}}
|
||||
{"ref": "#% increased Fire Spell Damage", "better": 1, "matchers": [{"string": "增加 #% 火焰法術傷害 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_spell_damage"]}}}
|
||||
{"ref": "#% increased Lightning Damage", "better": 1, "matchers": [{"string": "增加 #% 閃電傷害"}, {"string": "減少 #% 閃電傷害", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_damage"], "explicit": ["explicit.stat_2231156303"], "implicit": ["implicit.stat_2231156303"], "fractured": ["fractured.stat_2231156303"], "scourge": ["scourge.stat_2231156303"], "crafted": ["crafted.stat_2231156303"]}}}
|
||||
{"ref": "#% increased Lightning Spell Damage", "better": 1, "matchers": [{"string": "增加 #% 閃電法術傷害 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_spell_damage"]}}}
|
||||
{"ref": "#% increased Mana Regeneration Rate", "better": 1, "matchers": [{"string": "增加 #% 魔力回復率"}, {"string": "減少 #% 魔力回復率", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_mana_regen"], "explicit": ["explicit.stat_789117908"], "implicit": ["implicit.stat_789117908"], "fractured": ["fractured.stat_789117908"], "scourge": ["scourge.stat_789117908"], "crafted": ["crafted.stat_789117908"]}}}
|
||||
{"ref": "#% increased Movement Speed", "better": 1, "matchers": [{"string": "增加 #% 移動速度"}, {"string": "減少 #% 移動速度", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_movement_speed"], "explicit": ["explicit.stat_2250533757"], "implicit": ["implicit.stat_2250533757"], "fractured": ["fractured.stat_2250533757"], "enchant": ["enchant.stat_2250533757"], "scourge": ["scourge.stat_2250533757"], "crafted": ["crafted.stat_2250533757"]}}}
|
||||
{"ref": "#% increased Spell Damage", "better": 1, "matchers": [{"string": "增加 #% 法術傷害"}, {"string": "減少 #% 法術傷害", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_spell_damage"], "explicit": ["explicit.stat_2974417149"], "implicit": ["implicit.stat_2974417149"], "fractured": ["fractured.stat_2974417149"], "enchant": ["enchant.stat_2974417149"], "scourge": ["scourge.stat_2974417149"], "crafted": ["crafted.stat_2974417149"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Life", "dp": true, "better": 1, "matchers": [{"string": "#% 的物理攻擊傷害偷取生命"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_life"], "explicit": ["explicit.stat_3593843976", "explicit.stat_55876295"], "implicit": ["implicit.stat_3593843976", "implicit.stat_55876295"], "fractured": ["fractured.stat_3593843976", "fractured.stat_55876295"], "scourge": ["scourge.stat_3593843976"], "crafted": ["crafted.stat_3593843976", "crafted.stat_55876295"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Mana", "dp": true, "better": 1, "matchers": [{"string": "#% 物理攻擊傷害偷取魔力"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_mana"], "explicit": ["explicit.stat_3237948413", "explicit.stat_669069897"], "implicit": ["implicit.stat_3237948413", "implicit.stat_669069897"], "fractured": ["fractured.stat_3237948413", "fractured.stat_669069897"], "scourge": ["scourge.stat_3237948413"], "crafted": ["crafted.stat_3237948413", "crafted.stat_669069897"]}}}
|
||||
{"ref": "#% total increased Physical Damage", "better": 1, "matchers": [{"string": "增加 #% 物裡傷害 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_physical_damage"]}}}
|
||||
{"ref": "+# total maximum Energy Shield", "better": 1, "matchers": [{"string": "+# 最大能量護盾 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_energy_shield"]}}}
|
||||
{"ref": "+# total maximum Life", "better": 1, "matchers": [{"string": "+# 最大生命 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life"]}}}
|
||||
{"ref": "+# total maximum Mana", "better": 1, "matchers": [{"string": "+# 最大魔力 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_mana"]}}}
|
||||
{"ref": "+# total to all Attributes", "better": 1, "matchers": [{"string": "+# 全能力 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_all_attributes"]}}}
|
||||
{"ref": "+# total to Dexterity", "better": 1, "matchers": [{"string": "+# 敏捷 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_dexterity"]}}}
|
||||
{"ref": "+# total to Intelligence", "better": 1, "matchers": [{"string": "+# 智慧 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_intelligence"]}}}
|
||||
{"ref": "+# total to Strength", "better": 1, "matchers": [{"string": "+# 力量 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_strength"]}}}
|
||||
{"ref": "+#% Global Critical Strike Chance", "better": 1, "matchers": [{"string": "+#% 全域暴擊機率 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_chance"]}}}
|
||||
{"ref": "+#% Global Critical Strike Multiplier", "better": 1, "matchers": [{"string": "+#% 全域暴擊加成 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_multiplier"]}}}
|
||||
{"ref": "+#% total Attack Speed", "better": 1, "matchers": [{"string": "+#% 攻擊速度 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_attack_speed"]}}}
|
||||
{"ref": "+#% total Cast Speed", "better": 1, "matchers": [{"string": "+#% 施放速度 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cast_speed"]}}}
|
||||
{"ref": "+#% total Elemental Resistance", "better": 1, "matchers": [{"string": "+#% 元素抗性 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_elemental_resistance"]}}}
|
||||
{"ref": "+#% total to Chaos Resistance", "better": 1, "matchers": [{"string": "+#% 總混沌抗性 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_chaos_resistance"]}}}
|
||||
{"ref": "+#% total to Cold Resistance", "better": 1, "matchers": [{"string": "+#% 冰冷抗性 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cold_resistance"]}}}
|
||||
{"ref": "+#% total to Fire Resistance", "better": 1, "matchers": [{"string": "+#% 火焰抗性 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_fire_resistance"]}}}
|
||||
{"ref": "+#% total to Lightning Resistance", "better": 1, "matchers": [{"string": "+#% 閃電抗性 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_lightning_resistance"]}}}
|
||||
@@ -1,292 +0,0 @@
|
||||
{"ref": "# Crafted Modifiers", "better": 1, "matchers": [{"string": "# Crafted Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_crafted_mods"]}}}
|
||||
{"ref": "# Crafted Prefix Modifiers", "better": 1, "matchers": [{"string": "# Crafted Prefix Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_crafted_prefix_mods"]}}}
|
||||
{"ref": "# Crafted Suffix Modifiers", "better": 1, "matchers": [{"string": "# Crafted Suffix Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_crafted_suffix_mods"]}}}
|
||||
{"ref": "# Empty Modifiers", "better": 1, "matchers": [{"string": "# Empty Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_empty_affix_mods"]}}}
|
||||
{"ref": "# Empty Prefix Modifiers", "better": 1, "matchers": [{"string": "# Empty Prefix Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_empty_prefix_mods"]}}}
|
||||
{"ref": "# Empty Suffix Modifiers", "better": 1, "matchers": [{"string": "# Empty Suffix Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_empty_suffix_mods"]}}}
|
||||
{"ref": "# Enchant Modifiers", "better": 1, "matchers": [{"string": "# Enchant Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_enchant_mods"]}}}
|
||||
{"ref": "# Fractured Modifiers", "better": 1, "matchers": [{"string": "# Fractured Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_fractured_mods"]}}}
|
||||
{"ref": "# Implicit Modifiers", "better": 1, "matchers": [{"string": "# Implicit Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_implicit_mods"]}}}
|
||||
{"ref": "# Life Regenerated per Second", "better": 1, "matchers": [{"string": "# Life Regenerated per Second "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life_regen"]}}}
|
||||
{"ref": "# Modifiers", "better": 1, "matchers": [{"string": "# Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_affix_mods"]}}}
|
||||
{"ref": "# Notable Passive Skills", "better": 1, "matchers": [{"string": "# Notable Passive Skills "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_notable_passive_skills"]}}}
|
||||
{"ref": "# Prefix Modifiers", "better": 1, "matchers": [{"string": "# Prefix Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_prefix_mods"]}}}
|
||||
{"ref": "# Suffix Modifiers", "better": 1, "matchers": [{"string": "# Suffix Modifiers "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_suffix_mods"]}}}
|
||||
{"ref": "# total Elemental Resistances", "better": 1, "matchers": [{"string": "# total Elemental Resistances "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_count_elemental_resistances"]}}}
|
||||
{"ref": "# total Resistances", "better": 1, "matchers": [{"string": "# total Resistances "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_count_resistances"]}}}
|
||||
{"ref": "#% Base Defence Percentile", "better": 1, "matchers": [{"string": "#% Base Defence Percentile "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_base_defence_percentile"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Atlas Memories", "better": 1, "matchers": [{"string": "#% chance for dropped Maps to convert to Atlas Memories "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_memory_line"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Conqueror Maps", "better": 1, "matchers": [{"string": "#% chance for dropped Maps to convert to Conqueror Maps "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_conqueror_map"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Elder Maps", "better": 1, "matchers": [{"string": "#% chance for dropped Maps to convert to Elder Maps "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_elder_map"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Maven Invitations", "better": 1, "matchers": [{"string": "#% chance for dropped Maps to convert to Maven Invitations "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_maven_invitation"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Scarabs", "better": 1, "matchers": [{"string": "#% chance for dropped Maps to convert to Scarabs "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_scarab"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Shaper Maps", "better": 1, "matchers": [{"string": "#% chance for dropped Maps to convert to Shaper Maps "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_shaper_map"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Unique Maps", "better": 1, "matchers": [{"string": "#% chance for dropped Maps to convert to Unique Maps "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_unique_map"]}}}
|
||||
{"ref": "#% increased Burning Damage", "better": 1, "matchers": [{"string": "#% increased Burning Damage"}, {"string": "#% reduced Burning Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_burning_damage"], "explicit": ["explicit.stat_1175385867"], "implicit": ["implicit.stat_1175385867"], "fractured": ["fractured.stat_1175385867"]}}}
|
||||
{"ref": "#% increased Cold Damage", "better": 1, "matchers": [{"string": "#% increased Cold Damage"}, {"string": "#% reduced Cold Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_damage"], "explicit": ["explicit.stat_3291658075"], "implicit": ["implicit.stat_3291658075"], "fractured": ["fractured.stat_3291658075"], "scourge": ["scourge.stat_3291658075"], "crafted": ["crafted.stat_3291658075"]}}}
|
||||
{"ref": "#% increased Cold Damage with Attack Skills", "better": 1, "matchers": [{"string": "#% increased Cold Damage with Attack Skills"}, {"string": "#% reduced Cold Damage with Attack Skills", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_damage_with_attack_skills"], "explicit": ["explicit.stat_860668586"], "implicit": ["implicit.stat_860668586"]}}}
|
||||
{"ref": "#% increased Cold Spell Damage", "better": 1, "matchers": [{"string": "#% increased Cold Spell Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_spell_damage"]}}}
|
||||
{"ref": "#% increased Elemental Damage", "better": 1, "matchers": [{"string": "#% increased Elemental Damage"}, {"string": "Has #% increased Elemental Damage"}, {"string": "#% reduced Elemental Damage", "negate": true}, {"string": "Has #% reduced Elemental Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage"], "explicit": ["explicit.stat_3141070085"], "implicit": ["implicit.stat_3141070085"], "fractured": ["fractured.stat_3141070085"], "enchant": ["enchant.stat_692420067"], "scourge": ["scourge.stat_3141070085"]}}}
|
||||
{"ref": "#% increased Elemental Damage with Attack Skills", "better": 1, "matchers": [{"string": "#% increased Elemental Damage with Attack Skills"}, {"string": "#% reduced Elemental Damage with Attack Skills", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage_with_attack_skills"], "explicit": ["explicit.stat_387439868"], "implicit": ["implicit.stat_387439868"], "fractured": ["fractured.stat_387439868"], "scourge": ["scourge.stat_387439868"], "crafted": ["crafted.stat_387439868"]}}}
|
||||
{"ref": "#% increased Fire Damage", "better": 1, "matchers": [{"string": "#% increased Fire Damage"}, {"string": "#% reduced Fire Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_damage"], "explicit": ["explicit.stat_3962278098"], "implicit": ["implicit.stat_3962278098"], "fractured": ["fractured.stat_3962278098"], "scourge": ["scourge.stat_3962278098"], "crafted": ["crafted.stat_3962278098"]}}}
|
||||
{"ref": "#% increased Fire Damage with Attack Skills", "better": 1, "matchers": [{"string": "#% increased Fire Damage with Attack Skills"}, {"string": "#% reduced Fire Damage with Attack Skills", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_damage_with_attack_skills"], "implicit": ["implicit.stat_2468413380"]}}}
|
||||
{"ref": "#% increased Fire Spell Damage", "better": 1, "matchers": [{"string": "#% increased Fire Spell Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_spell_damage"]}}}
|
||||
{"ref": "#% increased Lightning Damage", "better": 1, "matchers": [{"string": "#% increased Lightning Damage"}, {"string": "#% reduced Lightning Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_damage"], "explicit": ["explicit.stat_2231156303"], "implicit": ["implicit.stat_2231156303"], "fractured": ["fractured.stat_2231156303"], "scourge": ["scourge.stat_2231156303"], "crafted": ["crafted.stat_2231156303"]}}}
|
||||
{"ref": "#% increased Lightning Damage with Attack Skills", "better": 1, "matchers": [{"string": "#% increased Lightning Damage with Attack Skills"}, {"string": "#% reduced Lightning Damage with Attack Skills", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_damage_with_attack_skills"], "explicit": ["explicit.stat_4208907162"], "implicit": ["implicit.stat_4208907162"]}}}
|
||||
{"ref": "#% increased Lightning Spell Damage", "better": 1, "matchers": [{"string": "#% increased Lightning Spell Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_spell_damage"]}}}
|
||||
{"ref": "#% increased Mana Regeneration Rate", "better": 1, "matchers": [{"string": "#% increased Mana Regeneration Rate"}, {"string": "#% reduced Mana Regeneration Rate", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_mana_regen"], "explicit": ["explicit.stat_789117908"], "implicit": ["implicit.stat_789117908"], "fractured": ["fractured.stat_789117908"], "scourge": ["scourge.stat_789117908"], "crafted": ["crafted.stat_789117908"]}}}
|
||||
{"ref": "#% increased Movement Speed", "better": 1, "matchers": [{"string": "#% increased Movement Speed"}, {"string": "#% reduced Movement Speed", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_movement_speed"], "explicit": ["explicit.stat_2250533757"], "implicit": ["implicit.stat_2250533757"], "fractured": ["fractured.stat_2250533757"], "enchant": ["enchant.stat_2250533757"], "scourge": ["scourge.stat_2250533757"], "crafted": ["crafted.stat_2250533757"]}}}
|
||||
{"ref": "#% increased Rarity of Items found", "better": 1, "matchers": [{"string": "#% increased Rarity of Items found"}, {"string": "#% reduced Rarity of Items found", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_rarity"], "explicit": ["explicit.stat_3917489142"], "implicit": ["implicit.stat_3917489142"], "fractured": ["fractured.stat_3917489142"], "scourge": ["scourge.stat_3917489142"], "crafted": ["crafted.stat_3917489142"]}}}
|
||||
{"ref": "#% increased Spell Damage", "better": 1, "matchers": [{"string": "#% increased Spell Damage"}, {"string": "#% reduced Spell Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_spell_damage"], "explicit": ["explicit.stat_2974417149"], "implicit": ["implicit.stat_2974417149"], "fractured": ["fractured.stat_2974417149"], "enchant": ["enchant.stat_2974417149"], "scourge": ["scourge.stat_2974417149"], "crafted": ["crafted.stat_2974417149"]}}}
|
||||
{"ref": "#% of Life Regenerated per Second", "better": 1, "matchers": [{"string": "#% of Life Regenerated per Second "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_percent_life_regen"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Life", "dp": true, "better": 1, "matchers": [{"string": "#% of Physical Attack Damage Leeched as Life"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_life"], "explicit": ["explicit.stat_3593843976", "explicit.stat_55876295"], "implicit": ["implicit.stat_3593843976", "implicit.stat_55876295"], "fractured": ["fractured.stat_3593843976", "fractured.stat_55876295"], "scourge": ["scourge.stat_3593843976"], "crafted": ["crafted.stat_3593843976", "crafted.stat_55876295"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Mana", "dp": true, "better": 1, "matchers": [{"string": "#% of Physical Attack Damage Leeched as Mana"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_mana"], "explicit": ["explicit.stat_3237948413", "explicit.stat_669069897"], "implicit": ["implicit.stat_3237948413", "implicit.stat_669069897"], "fractured": ["fractured.stat_3237948413", "fractured.stat_669069897"], "enchant": ["enchant.stat_669069897"], "scourge": ["scourge.stat_3237948413"], "crafted": ["crafted.stat_3237948413", "crafted.stat_669069897"]}}}
|
||||
{"ref": "#% total increased maximum Energy Shield", "better": 1, "matchers": [{"string": "#% total increased maximum Energy Shield "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_energy_shield"]}}}
|
||||
{"ref": "#% total increased Physical Damage", "better": 1, "matchers": [{"string": "#% total increased Physical Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_physical_damage"]}}}
|
||||
{"ref": "+# total maximum Energy Shield", "better": 1, "matchers": [{"string": "+# total maximum Energy Shield "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_energy_shield"]}}}
|
||||
{"ref": "+# total maximum Life", "better": 1, "matchers": [{"string": "+# total maximum Life "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life"]}}}
|
||||
{"ref": "+# total maximum Mana", "better": 1, "matchers": [{"string": "+# total maximum Mana "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_mana"]}}}
|
||||
{"ref": "+# total to all Attributes", "better": 1, "matchers": [{"string": "+# total to all Attributes "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_all_attributes"]}}}
|
||||
{"ref": "+# total to Dexterity", "better": 1, "matchers": [{"string": "+# total to Dexterity "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_dexterity"]}}}
|
||||
{"ref": "+# total to Intelligence", "better": 1, "matchers": [{"string": "+# total to Intelligence "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_intelligence"]}}}
|
||||
{"ref": "+# total to Level of Socketed Aura Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Aura Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_aura_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Bow Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Bow Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_bow_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Chaos Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Chaos Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_chaos_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Cold Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Cold Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_cold_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Curse Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Curse Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_curse_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Dexterity Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Dexterity Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_dexterity_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Elemental Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Elemental Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_elemental_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Fire Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Fire Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_fire_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Golem Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Golem Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_golem_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Intelligence Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Intelligence Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_intelligence_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Lightning Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Lightning Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_lightning_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Melee Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Melee Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_melee_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Minion Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Minion Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_minion_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Movement Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Movement Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_movement_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Projectile Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Projectile Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_projectile_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Skill Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Skill Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_skill_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Spell Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Spell Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_spell_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Strength Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Strength Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_strength_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Support Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Support Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_support_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Vaal Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Vaal Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_vaal_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Warcry Gems", "better": 1, "matchers": [{"string": "+# total to Level of Socketed Warcry Gems "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_warcry_gem_levels"]}}}
|
||||
{"ref": "+# total to Strength", "better": 1, "matchers": [{"string": "+# total to Strength "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_strength"]}}}
|
||||
{"ref": "+#% Global Critical Strike Chance", "better": 1, "matchers": [{"string": "+#% Global Critical Strike Chance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_chance"]}}}
|
||||
{"ref": "+#% Global Critical Strike Multiplier", "better": 1, "matchers": [{"string": "+#% Global Critical Strike Multiplier "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_multiplier"]}}}
|
||||
{"ref": "+#% total Attack Speed", "better": 1, "matchers": [{"string": "+#% total Attack Speed "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_attack_speed"]}}}
|
||||
{"ref": "+#% total Cast Speed", "better": 1, "matchers": [{"string": "+#% total Cast Speed "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cast_speed"]}}}
|
||||
{"ref": "+#% total Critical Strike Chance for Spells", "better": 1, "matchers": [{"string": "+#% total Critical Strike Chance for Spells "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_critical_strike_chance_for_spells"]}}}
|
||||
{"ref": "+#% total Elemental Resistance", "better": 1, "matchers": [{"string": "+#% total Elemental Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_elemental_resistance"]}}}
|
||||
{"ref": "+#% total Resistance", "better": 1, "matchers": [{"string": "+#% total Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_resistance"]}}}
|
||||
{"ref": "+#% total to all Elemental Resistances", "better": 1, "matchers": [{"string": "+#% total to all Elemental Resistances "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_all_elemental_resistances"]}}}
|
||||
{"ref": "+#% total to Chaos Resistance", "better": 1, "matchers": [{"string": "+#% total to Chaos Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_chaos_resistance"]}}}
|
||||
{"ref": "+#% total to Cold Resistance", "better": 1, "matchers": [{"string": "+#% total to Cold Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cold_resistance"]}}}
|
||||
{"ref": "+#% total to Fire Resistance", "better": 1, "matchers": [{"string": "+#% total to Fire Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_fire_resistance"]}}}
|
||||
{"ref": "+#% total to Lightning Resistance", "better": 1, "matchers": [{"string": "+#% total to Lightning Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_lightning_resistance"]}}}
|
||||
{"ref": "Adds # to # Chaos Damage", "better": 1, "matchers": [{"string": "Adds # to # Chaos Damage"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_chaos_damage"], "explicit": ["explicit.stat_2223678961", "explicit.stat_3531280422"], "implicit": ["implicit.stat_2223678961", "implicit.stat_3531280422"], "fractured": ["fractured.stat_2223678961"], "enchant": ["enchant.stat_2223678961"], "scourge": ["scourge.stat_2223678961"]}}}
|
||||
{"ref": "Adds # to # Chaos Damage to Attacks", "better": 1, "matchers": [{"string": "Adds # to # Chaos Damage to Attacks"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_chaos_damage_to_attacks"], "explicit": ["explicit.stat_674553446"], "implicit": ["implicit.stat_674553446"], "fractured": ["fractured.stat_674553446"], "crafted": ["crafted.stat_674553446"]}}}
|
||||
{"ref": "Adds # to # Chaos Damage to Spells", "better": 1, "matchers": [{"string": "Adds # to # Chaos Damage to Spells"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_chaos_damage_to_spells"], "explicit": ["explicit.stat_2300399854"], "implicit": ["implicit.stat_2300399854"], "fractured": ["fractured.stat_2300399854"]}}}
|
||||
{"ref": "Adds # to # Cold Damage", "better": 1, "matchers": [{"string": "Adds # to # Cold Damage"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_cold_damage"], "explicit": ["explicit.stat_1037193709", "explicit.stat_2387423236"], "implicit": ["implicit.stat_1037193709", "implicit.stat_2387423236"], "fractured": ["fractured.stat_1037193709", "fractured.stat_2387423236"], "enchant": ["enchant.stat_1037193709"], "scourge": ["scourge.stat_1037193709"], "crafted": ["crafted.stat_1037193709", "crafted.stat_2387423236"]}}}
|
||||
{"ref": "Adds # to # Cold Damage to Attacks", "better": 1, "matchers": [{"string": "Adds # to # Cold Damage to Attacks"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_cold_damage_to_attacks"], "explicit": ["explicit.stat_4067062424"], "implicit": ["implicit.stat_4067062424"], "fractured": ["fractured.stat_4067062424"], "crafted": ["crafted.stat_4067062424"]}}}
|
||||
{"ref": "Adds # to # Cold Damage to Spells", "better": 1, "matchers": [{"string": "Adds # to # Cold Damage to Spells"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_cold_damage_to_spells"], "explicit": ["explicit.stat_2469416729"], "implicit": ["implicit.stat_2469416729"], "fractured": ["fractured.stat_2469416729"], "scourge": ["scourge.stat_2469416729"], "crafted": ["crafted.stat_2469416729"]}}}
|
||||
{"ref": "Adds # to # Damage", "better": 1, "matchers": [{"string": "Adds # to # Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_damage"]}}}
|
||||
{"ref": "Adds # to # Damage to Attacks", "better": 1, "matchers": [{"string": "Adds # to # Damage to Attacks "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_damage_to_attacks"]}}}
|
||||
{"ref": "Adds # to # Damage to Spells", "better": 1, "matchers": [{"string": "Adds # to # Damage to Spells "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_damage_to_spells"]}}}
|
||||
{"ref": "Adds # to # Elemental Damage", "better": 1, "matchers": [{"string": "Adds # to # Elemental Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_elemental_damage"]}}}
|
||||
{"ref": "Adds # to # Elemental Damage to Attacks", "better": 1, "matchers": [{"string": "Adds # to # Elemental Damage to Attacks "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_elemental_damage_to_attacks"]}}}
|
||||
{"ref": "Adds # to # Elemental Damage to Spells", "better": 1, "matchers": [{"string": "Adds # to # Elemental Damage to Spells "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_elemental_damage_to_spells"]}}}
|
||||
{"ref": "Adds # to # Fire Damage", "better": 1, "matchers": [{"string": "Adds # to # Fire Damage"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_fire_damage"], "explicit": ["explicit.stat_321077055", "explicit.stat_709508406"], "implicit": ["implicit.stat_321077055", "implicit.stat_709508406"], "fractured": ["fractured.stat_321077055", "fractured.stat_709508406"], "enchant": ["enchant.stat_709508406"], "scourge": ["scourge.stat_709508406"], "crafted": ["crafted.stat_321077055", "crafted.stat_709508406"]}}}
|
||||
{"ref": "Adds # to # Fire Damage to Attacks", "better": 1, "matchers": [{"string": "Adds # to # Fire Damage to Attacks"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_fire_damage_to_attacks"], "explicit": ["explicit.stat_1573130764"], "implicit": ["implicit.stat_1573130764"], "fractured": ["fractured.stat_1573130764"], "crafted": ["crafted.stat_1573130764"]}}}
|
||||
{"ref": "Adds # to # Fire Damage to Spells", "better": 1, "matchers": [{"string": "Adds # to # Fire Damage to Spells"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_fire_damage_to_spells"], "explicit": ["explicit.stat_1133016593"], "implicit": ["implicit.stat_1133016593"], "fractured": ["fractured.stat_1133016593"], "scourge": ["scourge.stat_1133016593"], "crafted": ["crafted.stat_1133016593"]}}}
|
||||
{"ref": "Adds # to # Lightning Damage", "better": 1, "matchers": [{"string": "Adds # to # Lightning Damage"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_lightning_damage"], "explicit": ["explicit.stat_1334060246", "explicit.stat_3336890334"], "implicit": ["implicit.stat_1334060246", "implicit.stat_3336890334"], "fractured": ["fractured.stat_1334060246", "fractured.stat_3336890334"], "enchant": ["enchant.stat_3336890334"], "scourge": ["scourge.stat_3336890334"], "crafted": ["crafted.stat_1334060246", "crafted.stat_3336890334"]}}}
|
||||
{"ref": "Adds # to # Lightning Damage to Attacks", "better": 1, "matchers": [{"string": "Adds # to # Lightning Damage to Attacks"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_lightning_damage_to_attacks"], "explicit": ["explicit.stat_1754445556"], "implicit": ["implicit.stat_1754445556"], "fractured": ["fractured.stat_1754445556"], "crafted": ["crafted.stat_1754445556"]}}}
|
||||
{"ref": "Adds # to # Lightning Damage to Spells", "better": 1, "matchers": [{"string": "Adds # to # Lightning Damage to Spells"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_lightning_damage_to_spells"], "explicit": ["explicit.stat_2831165374"], "implicit": ["implicit.stat_2831165374"], "fractured": ["fractured.stat_2831165374"], "scourge": ["scourge.stat_2831165374"], "crafted": ["crafted.stat_2831165374"]}}}
|
||||
{"ref": "Adds # to # Physical Damage", "better": 1, "matchers": [{"string": "Adds # to # Physical Damage"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_physical_damage"], "explicit": ["explicit.stat_1940865751", "explicit.stat_960081730"], "implicit": ["implicit.stat_1940865751"], "fractured": ["fractured.stat_1940865751", "fractured.stat_960081730"], "scourge": ["scourge.stat_1940865751"], "crafted": ["crafted.stat_1940865751"]}}}
|
||||
{"ref": "Adds # to # Physical Damage to Attacks", "better": 1, "matchers": [{"string": "Adds # to # Physical Damage to Attacks"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_physical_damage_to_attacks"], "explicit": ["explicit.stat_3032590688"], "implicit": ["implicit.stat_3032590688"], "fractured": ["fractured.stat_3032590688"], "crafted": ["crafted.stat_3032590688"]}}}
|
||||
{"ref": "Adds # to # Physical Damage to Spells", "better": 1, "matchers": [{"string": "Adds # to # Physical Damage to Spells"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_physical_damage_to_spells"], "explicit": ["explicit.stat_2435536961"], "implicit": ["implicit.stat_2435536961"], "fractured": ["fractured.stat_2435536961"], "scourge": ["scourge.stat_2435536961"]}}}
|
||||
{"ref": "Has # Influences", "better": 1, "matchers": [{"string": "Has # Influences "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_influence_count"]}}}
|
||||
{"ref": "Has Crusader Influence", "better": 1, "matchers": [{"string": "Has Crusader Influence "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_crusader_influence"]}}}
|
||||
{"ref": "Has Elder Influence", "better": 1, "matchers": [{"string": "Has Elder Influence "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_elder_influence"]}}}
|
||||
{"ref": "Has Hunter Influence", "better": 1, "matchers": [{"string": "Has Hunter Influence "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_hunter_influence"]}}}
|
||||
{"ref": "Has Logbook Area: Battleground Graves", "better": 1, "matchers": [{"string": "Has Logbook Area: Battleground Graves "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_battleground_graves"]}}}
|
||||
{"ref": "Has Logbook Area: Bluffs", "better": 1, "matchers": [{"string": "Has Logbook Area: Bluffs "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_bluffs"]}}}
|
||||
{"ref": "Has Logbook Area: Cemetery", "better": 1, "matchers": [{"string": "Has Logbook Area: Cemetery "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_cemetery"]}}}
|
||||
{"ref": "Has Logbook Area: Desert Ruins", "better": 1, "matchers": [{"string": "Has Logbook Area: Desert Ruins "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_desert_ruins"]}}}
|
||||
{"ref": "Has Logbook Area: Dried Riverbed", "better": 1, "matchers": [{"string": "Has Logbook Area: Dried Riverbed "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_dried_riverbed"]}}}
|
||||
{"ref": "Has Logbook Area: Forest Ruins", "better": 1, "matchers": [{"string": "Has Logbook Area: Forest Ruins "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_forest_ruins"]}}}
|
||||
{"ref": "Has Logbook Area: Karui Wargraves", "better": 1, "matchers": [{"string": "Has Logbook Area: Karui Wargraves "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_karui_wargraves"]}}}
|
||||
{"ref": "Has Logbook Area: Mountainside", "better": 1, "matchers": [{"string": "Has Logbook Area: Mountainside "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_mountainside"]}}}
|
||||
{"ref": "Has Logbook Area: Rotting Temple", "better": 1, "matchers": [{"string": "Has Logbook Area: Rotting Temple "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_rotting_temple"]}}}
|
||||
{"ref": "Has Logbook Area: Sarn Slums", "better": 1, "matchers": [{"string": "Has Logbook Area: Sarn Slums "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_sarn_slums"]}}}
|
||||
{"ref": "Has Logbook Area: Scrublands", "better": 1, "matchers": [{"string": "Has Logbook Area: Scrublands "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_scrublands"]}}}
|
||||
{"ref": "Has Logbook Area: Shipwreck Reef", "better": 1, "matchers": [{"string": "Has Logbook Area: Shipwreck Reef "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_shipwreck_reef"]}}}
|
||||
{"ref": "Has Logbook Area: Utzaal Outskirts", "better": 1, "matchers": [{"string": "Has Logbook Area: Utzaal Outskirts "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_utzaal_outskirts"]}}}
|
||||
{"ref": "Has Logbook Area: Vaal Temple", "better": 1, "matchers": [{"string": "Has Logbook Area: Vaal Temple "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_vaal_temple"]}}}
|
||||
{"ref": "Has Logbook Area: Volcanic Island", "better": 1, "matchers": [{"string": "Has Logbook Area: Volcanic Island "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_volcano"]}}}
|
||||
{"ref": "Has Logbook Faction: Black Scythe Mercenaries", "better": 0, "matchers": [{"string": "Black Scythe Mercenaries"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_mercenaries"]}}}
|
||||
{"ref": "Has Logbook Faction: Druids of the Broken Circle", "better": 0, "matchers": [{"string": "Druids of the Broken Circle"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_druids"]}}}
|
||||
{"ref": "Has Logbook Faction: Knights of the Sun", "better": 0, "matchers": [{"string": "Knights of the Sun"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_knights"]}}}
|
||||
{"ref": "Has Logbook Faction: Order of the Chalice", "better": 0, "matchers": [{"string": "Order of the Chalice"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_order"]}}}
|
||||
{"ref": "Has Redeemer Influence", "better": 1, "matchers": [{"string": "Has Redeemer Influence "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_redeemer_influence"]}}}
|
||||
{"ref": "Has Room: Antechamber", "better": 0, "matchers": [{"string": "Antechamber"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_antechamber"]}, "option": true}}
|
||||
{"ref": "Has Room: Apex of Ascension (Tier 3)", "better": 0, "matchers": [{"string": "Apex of Ascension (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_sacrifice_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Apex of Atzoatl", "better": 0, "matchers": [{"string": "Apex of Atzoatl"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_apex"]}, "option": true}}
|
||||
{"ref": "Has Room: Arena of Valour (Tier 2)", "better": 0, "matchers": [{"string": "Arena of Valour (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_weapon_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Armourer's Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Armourer's Workshop (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_armour_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Armoury (Tier 2)", "better": 0, "matchers": [{"string": "Armoury (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_armour_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Atlas of Worlds (Tier 3)", "better": 0, "matchers": [{"string": "Atlas of Worlds (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cartography_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Automaton Lab (Tier 2)", "better": 0, "matchers": [{"string": "Automaton Lab (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_minions_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Banquet Hall", "better": 0, "matchers": [{"string": "Banquet Hall"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_banquet_hall"]}, "option": true}}
|
||||
{"ref": "Has Room: Barracks (Tier 2)", "better": 0, "matchers": [{"string": "Barracks (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breeding_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Breach Containment Chamber (Tier 2)", "better": 0, "matchers": [{"string": "Breach Containment Chamber (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breach_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Catalyst of Corruption (Tier 2)", "better": 0, "matchers": [{"string": "Catalyst of Corruption (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_corruption_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Cellar", "better": 0, "matchers": [{"string": "Cellar"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cellar"]}, "option": true}}
|
||||
{"ref": "Has Room: Chamber of Iron (Tier 3)", "better": 0, "matchers": [{"string": "Chamber of Iron (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_armour_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Chasm", "better": 0, "matchers": [{"string": "Chasm"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chasm_room"]}, "option": true}}
|
||||
{"ref": "Has Room: Cloister", "better": 0, "matchers": [{"string": "Cloister"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cloister"]}, "option": true}}
|
||||
{"ref": "Has Room: Conduit of Lightning (Tier 3)", "better": 0, "matchers": [{"string": "Conduit of Lightning (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_lightning_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Corruption Chamber (Tier 1)", "better": 0, "matchers": [{"string": "Corruption Chamber (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_corruption_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Court of Sealed Death (Tier 3)", "better": 0, "matchers": [{"string": "Court of Sealed Death (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_strongbox_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Crucible of Flame (Tier 3)", "better": 0, "matchers": [{"string": "Crucible of Flame (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_fire_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Cultivar Chamber (Tier 2)", "better": 0, "matchers": [{"string": "Cultivar Chamber (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_poison_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Defense Research Lab (Tier 3)", "better": 0, "matchers": [{"string": "Defense Research Lab (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trap_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Demolition Lab (Tier 2)", "better": 0, "matchers": [{"string": "Demolition Lab (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_explosives_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Department of Thaumaturgy (Tier 2)", "better": 0, "matchers": [{"string": "Department of Thaumaturgy (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_gem_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Doryani's Institute (Tier 3)", "better": 0, "matchers": [{"string": "Doryani's Institute (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_gem_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Engineering Department (Tier 2)", "better": 0, "matchers": [{"string": "Engineering Department (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_workshop_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Explosives Room (Tier 1)", "better": 0, "matchers": [{"string": "Explosives Room (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_explosives_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Factory (Tier 3)", "better": 0, "matchers": [{"string": "Factory (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_workshop_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Flame Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Flame Workshop (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_fire_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Gemcutter's Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Gemcutter's Workshop (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_gem_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Glittering Halls (Tier 3)", "better": 0, "matchers": [{"string": "Glittering Halls (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trinket_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Guardhouse (Tier 1)", "better": 0, "matchers": [{"string": "Guardhouse (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breeding_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Champions (Tier 3)", "better": 0, "matchers": [{"string": "Hall of Champions (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_weapon_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Heroes (Tier 2)", "better": 0, "matchers": [{"string": "Hall of Heroes (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_legion_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Legends (Tier 3)", "better": 0, "matchers": [{"string": "Hall of Legends (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_legion_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Locks (Tier 2)", "better": 0, "matchers": [{"string": "Hall of Locks (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_strongbox_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Lords (Tier 2)", "better": 0, "matchers": [{"string": "Hall of Lords (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_queens_chambers_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Mettle (Tier 1)", "better": 0, "matchers": [{"string": "Hall of Mettle (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_legion_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Offerings (Tier 2)", "better": 0, "matchers": [{"string": "Hall of Offerings (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_sacrifice_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of War (Tier 3)", "better": 0, "matchers": [{"string": "Hall of War (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breeding_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Halls", "better": 0, "matchers": [{"string": "Halls"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_halls"]}, "option": true}}
|
||||
{"ref": "Has Room: Hatchery (Tier 1)", "better": 0, "matchers": [{"string": "Hatchery (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_minions_1"]}, "option": true}}
|
||||
{"ref": "Has Room: House of the Others (Tier 3)", "better": 0, "matchers": [{"string": "House of the Others (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breach_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Hurricane Engine (Tier 2)", "better": 0, "matchers": [{"string": "Hurricane Engine (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_storm_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hybridisation Chamber (Tier 3)", "better": 0, "matchers": [{"string": "Hybridisation Chamber (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_minions_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Jeweller's Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Jeweller's Workshop (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trinket_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Jewellery Forge (Tier 2)", "better": 0, "matchers": [{"string": "Jewellery Forge (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trinket_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Lightning Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Lightning Workshop (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_lightning_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Locus of Corruption (Tier 3)", "better": 0, "matchers": [{"string": "Locus of Corruption (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_corruption_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Museum of Artefacts (Tier 3)", "better": 0, "matchers": [{"string": "Museum of Artefacts (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chests_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Office of Cartography (Tier 2)", "better": 0, "matchers": [{"string": "Office of Cartography (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cartography_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Omnitect Forge (Tier 2)", "better": 0, "matchers": [{"string": "Omnitect Forge (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_fire_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Omnitect Reactor Plant (Tier 2)", "better": 0, "matchers": [{"string": "Omnitect Reactor Plant (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_lightning_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Passageways", "better": 0, "matchers": [{"string": "Passageways"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_passageways"]}, "option": true}}
|
||||
{"ref": "Has Room: Pits", "better": 0, "matchers": [{"string": "Pits"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_the_pits"]}, "option": true}}
|
||||
{"ref": "Has Room: Poison Garden (Tier 1)", "better": 0, "matchers": [{"string": "Poison Garden (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_poison_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Pools of Restoration (Tier 1)", "better": 0, "matchers": [{"string": "Pools of Restoration (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_healing_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Royal Meeting Room (Tier 1)", "better": 0, "matchers": [{"string": "Royal Meeting Room (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_queens_chambers_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Sacrificial Chamber (Tier 1)", "better": 0, "matchers": [{"string": "Sacrificial Chamber (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_sacrifice_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Sadist's Den (Tier 3)", "better": 0, "matchers": [{"string": "Sadist's Den (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_torment_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Sanctum of Immortality (Tier 3)", "better": 0, "matchers": [{"string": "Sanctum of Immortality (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_healing_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Sanctum of Unity (Tier 2)", "better": 0, "matchers": [{"string": "Sanctum of Unity (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_empowering_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Sanctum of Vitality (Tier 2)", "better": 0, "matchers": [{"string": "Sanctum of Vitality (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_healing_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Shrine of Empowerment (Tier 1)", "better": 0, "matchers": [{"string": "Shrine of Empowerment (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_empowering_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Shrine of Unmaking (Tier 3)", "better": 0, "matchers": [{"string": "Shrine of Unmaking (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_explosives_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Sparring Room (Tier 1)", "better": 0, "matchers": [{"string": "Sparring Room (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_weapon_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Splinter Research Lab (Tier 1)", "better": 0, "matchers": [{"string": "Splinter Research Lab (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breach_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Storage Room (Tier 1)", "better": 0, "matchers": [{"string": "Storage Room (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chests_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Storm of Corruption (Tier 3)", "better": 0, "matchers": [{"string": "Storm of Corruption (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_storm_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Strongbox Chamber (Tier 1)", "better": 0, "matchers": [{"string": "Strongbox Chamber (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_strongbox_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Surveyor's Study (Tier 1)", "better": 0, "matchers": [{"string": "Surveyor's Study (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cartography_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Tempest Generator (Tier 1)", "better": 0, "matchers": [{"string": "Tempest Generator (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_storm_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Temple Defense Workshop (Tier 2)", "better": 0, "matchers": [{"string": "Temple Defense Workshop (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trap_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Temple Nexus (Tier 3)", "better": 0, "matchers": [{"string": "Temple Nexus (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_empowering_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Throne of Atziri (Tier 3)", "better": 0, "matchers": [{"string": "Throne of Atziri (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_queens_chambers_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Tombs", "better": 0, "matchers": [{"string": "Tombs"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_tombs"]}, "option": true}}
|
||||
{"ref": "Has Room: Torment Cells (Tier 1)", "better": 0, "matchers": [{"string": "Torment Cells (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_torment_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Torture Cages (Tier 2)", "better": 0, "matchers": [{"string": "Torture Cages (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_torment_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Toxic Grove (Tier 3)", "better": 0, "matchers": [{"string": "Toxic Grove (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_poison_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Trap Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Trap Workshop (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trap_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Treasury (Tier 2)", "better": 0, "matchers": [{"string": "Treasury (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_currency_vault_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Tunnels", "better": 0, "matchers": [{"string": "Tunnels"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_tunnels"]}, "option": true}}
|
||||
{"ref": "Has Room: Vault (Tier 1)", "better": 0, "matchers": [{"string": "Vault (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_currency_vault_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Warehouses (Tier 2)", "better": 0, "matchers": [{"string": "Warehouses (Tier 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chests_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Wealth of the Vaal (Tier 3)", "better": 0, "matchers": [{"string": "Wealth of the Vaal (Tier 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_currency_vault_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Workshop (Tier 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_workshop_1"]}, "option": true}}
|
||||
{"ref": "Has Shaper Influence", "better": 1, "matchers": [{"string": "Has Shaper Influence "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_shaper_influence"]}}}
|
||||
{"ref": "Has Warlord Influence", "better": 1, "matchers": [{"string": "Has Warlord Influence "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_warlord_influence"]}}}
|
||||
{"ref": "Mirrored Tablet has # Islands", "better": 1, "matchers": [{"string": "Mirrored Tablet has # Islands "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_lake_number_of_islands"]}}}
|
||||
{"ref": "More Currency: #%", "better": 1, "matchers": [{"string": "More Currency: #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_currency_drops"]}}}
|
||||
{"ref": "More Divination Cards: #%", "better": 1, "matchers": [{"string": "More Divination Cards: #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_card_drops"]}}}
|
||||
{"ref": "More Maps: #%", "better": 1, "matchers": [{"string": "More Maps: #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_map_drops"]}}}
|
||||
{"ref": "More Scarabs: #%", "better": 1, "matchers": [{"string": "More Scarabs: #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_scarab_drops"]}}}
|
||||
{"ref": "Quality (Attack Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Attack Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_attack_quality"]}}}
|
||||
{"ref": "Quality (Attribute Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Attribute Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_attribute_quality"]}}}
|
||||
{"ref": "Quality (Caster Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Caster Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_caster_quality"]}}}
|
||||
{"ref": "Quality (Critical Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Critical Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_critical_quality"]}}}
|
||||
{"ref": "Quality (Currency): #%", "better": 1, "matchers": [{"string": "Quality (Currency): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_currency"]}}}
|
||||
{"ref": "Quality (Defence Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Defence Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_defense_quality"]}}}
|
||||
{"ref": "Quality (Divination Cards): #%", "better": 1, "matchers": [{"string": "Quality (Divination Cards): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_cards"]}}}
|
||||
{"ref": "Quality (Elemental Damage Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Elemental Damage Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_elemental_quality"]}}}
|
||||
{"ref": "Quality (Life and Mana Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Life and Mana Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_resource_quality"]}}}
|
||||
{"ref": "Quality (Pack Size): #%", "better": 1, "matchers": [{"string": "Quality (Pack Size): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_pack_size"]}}}
|
||||
{"ref": "Quality (Physical and Chaos Damage Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Physical and Chaos Damage Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_physical_chaos_quality"]}}}
|
||||
{"ref": "Quality (Rarity): #%", "better": 1, "matchers": [{"string": "Quality (Rarity): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_rarity"]}}}
|
||||
{"ref": "Quality (Resistance Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Resistance Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_resistance_quality"]}}}
|
||||
{"ref": "Quality (Scarabs): #%", "better": 1, "matchers": [{"string": "Quality (Scarabs): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_scarabs"]}}}
|
||||
{"ref": "Quality (Speed Modifiers): #%", "better": 1, "matchers": [{"string": "Quality (Speed Modifiers): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_speed_quality"]}}}
|
||||
{"ref": "Reflection of Abyss (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Abyss (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_38892"]}}}
|
||||
{"ref": "Reflection of Ambush (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Ambush (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_48307"]}}}
|
||||
{"ref": "Reflection of Angling (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Angling (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_40794"]}}}
|
||||
{"ref": "Reflection of Azurite (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Azurite (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_40031"]}}}
|
||||
{"ref": "Reflection of Bestiary (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Bestiary (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_55569"]}}}
|
||||
{"ref": "Reflection of Breach (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Breach (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_62572"]}}}
|
||||
{"ref": "Reflection of Brutality (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Brutality (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_29096"]}}}
|
||||
{"ref": "Reflection of Camaraderie (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Camaraderie (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_35395"]}}}
|
||||
{"ref": "Reflection of Catalysis (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Catalysis (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_57850"]}}}
|
||||
{"ref": "Reflection of Chaos (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Chaos (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_50834"]}}}
|
||||
{"ref": "Reflection of Conflict (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Conflict (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_1931"]}}}
|
||||
{"ref": "Reflection of Darkness (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Darkness (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_34457"]}}}
|
||||
{"ref": "Reflection of Delirium (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Delirium (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_22138"]}}}
|
||||
{"ref": "Reflection of Delve (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Delve (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_18737"]}}}
|
||||
{"ref": "Reflection of Demonfire (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Demonfire (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_28500"]}}}
|
||||
{"ref": "Reflection of Domination (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Domination (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_63412"]}}}
|
||||
{"ref": "Reflection of Entrapment (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Entrapment (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_44399"]}}}
|
||||
{"ref": "Reflection of Essence (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Essence (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_49862"]}}}
|
||||
{"ref": "Reflection of Experimentation (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Experimentation (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_55676"]}}}
|
||||
{"ref": "Reflection of Flame (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Flame (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_42468"]}}}
|
||||
{"ref": "Reflection of Fractured Dimensions (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Fractured Dimensions (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_49488"]}}}
|
||||
{"ref": "Reflection of Frost (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Frost (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_38110"]}}}
|
||||
{"ref": "Reflection of Guilt (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Guilt (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_25480"]}}}
|
||||
{"ref": "Reflection of Imprisonment (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Imprisonment (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_10363"]}}}
|
||||
{"ref": "Reflection of Kalandra (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Kalandra (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_36591"]}}}
|
||||
{"ref": "Reflection of Legion (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Legion (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_403"]}}}
|
||||
{"ref": "Reflection of Metamorph (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Metamorph (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_3699"]}}}
|
||||
{"ref": "Reflection of Occultism (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Occultism (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_24451"]}}}
|
||||
{"ref": "Reflection of Paradise (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Paradise (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_50846"]}}}
|
||||
{"ref": "Reflection of Perverted Faith (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Perverted Faith (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_27678"]}}}
|
||||
{"ref": "Reflection of Phaaryl (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Phaaryl (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_7674"]}}}
|
||||
{"ref": "Reflection of Possession (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Possession (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_25049"]}}}
|
||||
{"ref": "Reflection of Power (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Power (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_35950"]}}}
|
||||
{"ref": "Reflection of Scourge (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Scourge (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_62360"]}}}
|
||||
{"ref": "Reflection of Stasis (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Stasis (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_32968"]}}}
|
||||
{"ref": "Reflection of Sulphite (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Sulphite (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_45086"]}}}
|
||||
{"ref": "Reflection of the Black Scythe (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Black Scythe (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_9662"]}}}
|
||||
{"ref": "Reflection of the Breachlord (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Breachlord (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_62935"]}}}
|
||||
{"ref": "Reflection of the Broken Circle (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Broken Circle (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_43128"]}}}
|
||||
{"ref": "Reflection of the Chalice (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Chalice (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_64561"]}}}
|
||||
{"ref": "Reflection of the Chasm (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Chasm (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_57101"]}}}
|
||||
{"ref": "Reflection of the Dream (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Dream (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_27117"]}}}
|
||||
{"ref": "Reflection of the Harbingers (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Harbingers (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_37203"]}}}
|
||||
{"ref": "Reflection of the Hunter (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Hunter (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_18816"]}}}
|
||||
{"ref": "Reflection of the Monolith (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Monolith (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_34796"]}}}
|
||||
{"ref": "Reflection of the Nightmare (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Nightmare (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_24232"]}}}
|
||||
{"ref": "Reflection of the Storm (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Storm (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_2745"]}}}
|
||||
{"ref": "Reflection of the Sun (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Sun (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_60034"]}}}
|
||||
{"ref": "Reflection of the Trove (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Trove (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_46772"]}}}
|
||||
{"ref": "Reflection of the Wilderness (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of the Wilderness (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_29224"]}}}
|
||||
{"ref": "Reflection of Thralldom (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Thralldom (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_26813"]}}}
|
||||
{"ref": "Reflection of Torment (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Torment (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_53950"]}}}
|
||||
{"ref": "Reflection of Tyranny (Difficulty #)", "better": 1, "matchers": [{"string": "Reflection of Tyranny (Difficulty #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_60981"]}}}
|
||||
@@ -1,32 +0,0 @@
|
||||
{"ref": "# Life Regenerated per Second", "better": 1, "matchers": [{"string": "# Life Regenerated per Second "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life_regen"]}}}
|
||||
{"ref": "#% increased Burning Damage", "better": 1, "matchers": [{"string": "#% increased Burning Damage"}, {"string": "#% reduced Burning Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_burning_damage"], "explicit": ["explicit.stat_1175385867"], "implicit": ["implicit.stat_1175385867"], "fractured": ["fractured.stat_1175385867"]}}}
|
||||
{"ref": "#% increased Cold Damage", "better": 1, "matchers": [{"string": "#% increased Cold Damage"}, {"string": "#% reduced Cold Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_damage"], "explicit": ["explicit.stat_3291658075"], "implicit": ["implicit.stat_3291658075"], "fractured": ["fractured.stat_3291658075"], "scourge": ["scourge.stat_3291658075"], "crafted": ["crafted.stat_3291658075"]}}}
|
||||
{"ref": "#% increased Cold Spell Damage", "better": 1, "matchers": [{"string": "#% increased Cold Spell Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_spell_damage"]}}}
|
||||
{"ref": "#% increased Elemental Damage", "better": 1, "matchers": [{"string": "#% increased Elemental Damage"}, {"string": "Has #% increased Elemental Damage"}, {"string": "#% reduced Elemental Damage", "negate": true}, {"string": "Has #% reduced Elemental Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage"], "explicit": ["explicit.stat_3141070085"], "implicit": ["implicit.stat_3141070085"], "fractured": ["fractured.stat_3141070085"], "enchant": ["enchant.stat_692420067"], "scourge": ["scourge.stat_3141070085"]}}}
|
||||
{"ref": "#% increased Elemental Damage with Attack Skills", "better": 1, "matchers": [{"string": "#% increased Elemental Damage with Attack Skills"}, {"string": "#% reduced Elemental Damage with Attack Skills", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage_with_attack_skills"], "explicit": ["explicit.stat_387439868"], "implicit": ["implicit.stat_387439868"], "fractured": ["fractured.stat_387439868"], "scourge": ["scourge.stat_387439868"], "crafted": ["crafted.stat_387439868"]}}}
|
||||
{"ref": "#% increased Fire Damage", "better": 1, "matchers": [{"string": "#% increased Fire Damage"}, {"string": "#% reduced Fire Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_damage"], "explicit": ["explicit.stat_3962278098"], "implicit": ["implicit.stat_3962278098"], "fractured": ["fractured.stat_3962278098"], "scourge": ["scourge.stat_3962278098"], "crafted": ["crafted.stat_3962278098"]}}}
|
||||
{"ref": "#% increased Fire Spell Damage", "better": 1, "matchers": [{"string": "#% increased Fire Spell Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_spell_damage"]}}}
|
||||
{"ref": "#% increased Lightning Damage", "better": 1, "matchers": [{"string": "#% increased Lightning Damage"}, {"string": "#% reduced Lightning Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_damage"], "explicit": ["explicit.stat_2231156303"], "implicit": ["implicit.stat_2231156303"], "fractured": ["fractured.stat_2231156303"], "scourge": ["scourge.stat_2231156303"], "crafted": ["crafted.stat_2231156303"]}}}
|
||||
{"ref": "#% increased Lightning Spell Damage", "better": 1, "matchers": [{"string": "#% increased Lightning Spell Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_spell_damage"]}}}
|
||||
{"ref": "#% increased Mana Regeneration Rate", "better": 1, "matchers": [{"string": "#% increased Mana Regeneration Rate"}, {"string": "#% reduced Mana Regeneration Rate", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_mana_regen"], "explicit": ["explicit.stat_789117908"], "implicit": ["implicit.stat_789117908"], "fractured": ["fractured.stat_789117908"], "scourge": ["scourge.stat_789117908"], "crafted": ["crafted.stat_789117908"]}}}
|
||||
{"ref": "#% increased Movement Speed", "better": 1, "matchers": [{"string": "#% increased Movement Speed"}, {"string": "#% reduced Movement Speed", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_movement_speed"], "explicit": ["explicit.stat_2250533757"], "implicit": ["implicit.stat_2250533757"], "fractured": ["fractured.stat_2250533757"], "enchant": ["enchant.stat_2250533757"], "scourge": ["scourge.stat_2250533757"], "crafted": ["crafted.stat_2250533757"]}}}
|
||||
{"ref": "#% increased Spell Damage", "better": 1, "matchers": [{"string": "#% increased Spell Damage"}, {"string": "#% reduced Spell Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_spell_damage"], "explicit": ["explicit.stat_2974417149"], "implicit": ["implicit.stat_2974417149"], "fractured": ["fractured.stat_2974417149"], "enchant": ["enchant.stat_2974417149"], "scourge": ["scourge.stat_2974417149"], "crafted": ["crafted.stat_2974417149"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Life", "dp": true, "better": 1, "matchers": [{"string": "#% of Physical Attack Damage Leeched as Life"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_life"], "explicit": ["explicit.stat_3593843976", "explicit.stat_55876295"], "implicit": ["implicit.stat_3593843976", "implicit.stat_55876295"], "fractured": ["fractured.stat_3593843976", "fractured.stat_55876295"], "scourge": ["scourge.stat_3593843976"], "crafted": ["crafted.stat_3593843976", "crafted.stat_55876295"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Mana", "dp": true, "better": 1, "matchers": [{"string": "#% of Physical Attack Damage Leeched as Mana"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_mana"], "explicit": ["explicit.stat_3237948413", "explicit.stat_669069897"], "implicit": ["implicit.stat_3237948413", "implicit.stat_669069897"], "fractured": ["fractured.stat_3237948413", "fractured.stat_669069897"], "enchant": ["enchant.stat_669069897"], "scourge": ["scourge.stat_3237948413"], "crafted": ["crafted.stat_3237948413", "crafted.stat_669069897"]}}}
|
||||
{"ref": "#% total increased Physical Damage", "better": 1, "matchers": [{"string": "#% total increased Physical Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_physical_damage"]}}}
|
||||
{"ref": "+# total maximum Energy Shield", "better": 1, "matchers": [{"string": "+# total maximum Energy Shield "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_energy_shield"]}}}
|
||||
{"ref": "+# total maximum Life", "better": 1, "matchers": [{"string": "+# total maximum Life "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life"]}}}
|
||||
{"ref": "+# total maximum Mana", "better": 1, "matchers": [{"string": "+# total maximum Mana "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_mana"]}}}
|
||||
{"ref": "+# total to all Attributes", "better": 1, "matchers": [{"string": "+# total to all Attributes "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_all_attributes"]}}}
|
||||
{"ref": "+# total to Dexterity", "better": 1, "matchers": [{"string": "+# total to Dexterity "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_dexterity"]}}}
|
||||
{"ref": "+# total to Intelligence", "better": 1, "matchers": [{"string": "+# total to Intelligence "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_intelligence"]}}}
|
||||
{"ref": "+# total to Strength", "better": 1, "matchers": [{"string": "+# total to Strength "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_strength"]}}}
|
||||
{"ref": "+#% Global Critical Strike Chance", "better": 1, "matchers": [{"string": "+#% Global Critical Strike Chance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_chance"]}}}
|
||||
{"ref": "+#% Global Critical Strike Multiplier", "better": 1, "matchers": [{"string": "+#% Global Critical Strike Multiplier "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_multiplier"]}}}
|
||||
{"ref": "+#% total Attack Speed", "better": 1, "matchers": [{"string": "+#% total Attack Speed "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_attack_speed"]}}}
|
||||
{"ref": "+#% total Cast Speed", "better": 1, "matchers": [{"string": "+#% total Cast Speed "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cast_speed"]}}}
|
||||
{"ref": "+#% total Elemental Resistance", "better": 1, "matchers": [{"string": "+#% total Elemental Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_elemental_resistance"]}}}
|
||||
{"ref": "+#% total to Chaos Resistance", "better": 1, "matchers": [{"string": "+#% total to Chaos Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_chaos_resistance"]}}}
|
||||
{"ref": "+#% total to Cold Resistance", "better": 1, "matchers": [{"string": "+#% total to Cold Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cold_resistance"]}}}
|
||||
{"ref": "+#% total to Fire Resistance", "better": 1, "matchers": [{"string": "+#% total to Fire Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_fire_resistance"]}}}
|
||||
{"ref": "+#% total to Lightning Resistance", "better": 1, "matchers": [{"string": "+#% total to Lightning Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_lightning_resistance"]}}}
|
||||
@@ -1,292 +0,0 @@
|
||||
{"ref": "# Crafted Modifiers", "better": 1, "matchers": [{"string": "# 제작을 통한 속성 부여 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_crafted_mods"]}}}
|
||||
{"ref": "# Crafted Prefix Modifiers", "better": 1, "matchers": [{"string": "# 제작을 통한 접두어 속성 부여 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_crafted_prefix_mods"]}}}
|
||||
{"ref": "# Crafted Suffix Modifiers", "better": 1, "matchers": [{"string": "# 제작을 통한 접미어 속성 부여 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_crafted_suffix_mods"]}}}
|
||||
{"ref": "# Empty Modifiers", "better": 1, "matchers": [{"string": "# 빈 속성 부여 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_empty_affix_mods"]}}}
|
||||
{"ref": "# Empty Prefix Modifiers", "better": 1, "matchers": [{"string": "# 빈 접두어 속성 부여 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_empty_prefix_mods"]}}}
|
||||
{"ref": "# Empty Suffix Modifiers", "better": 1, "matchers": [{"string": "# 빈 접미어 속성 부여 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_empty_suffix_mods"]}}}
|
||||
{"ref": "# Enchant Modifiers", "better": 1, "matchers": [{"string": "# 인챈트 속성 부여 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_enchant_mods"]}}}
|
||||
{"ref": "# Fractured Modifiers", "better": 1, "matchers": [{"string": "# 분열된 속성 부여 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_fractured_mods"]}}}
|
||||
{"ref": "# Implicit Modifiers", "better": 1, "matchers": [{"string": "# 고정 속성 부여 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_implicit_mods"]}}}
|
||||
{"ref": "# Life Regenerated per Second", "better": 1, "matchers": [{"string": "초당 생명력 재생 #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life_regen"]}}}
|
||||
{"ref": "# Modifiers", "better": 1, "matchers": [{"string": "# 속성 부여 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_affix_mods"]}}}
|
||||
{"ref": "# Notable Passive Skills", "better": 1, "matchers": [{"string": "# 주요 패시브 스킬 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_notable_passive_skills"]}}}
|
||||
{"ref": "# Prefix Modifiers", "better": 1, "matchers": [{"string": "# 접두어 속성 부여 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_prefix_mods"]}}}
|
||||
{"ref": "# Suffix Modifiers", "better": 1, "matchers": [{"string": "# 접미어 속성 부여 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_suffix_mods"]}}}
|
||||
{"ref": "# total Elemental Resistances", "better": 1, "matchers": [{"string": "총 원소 저항력 # "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_count_elemental_resistances"]}}}
|
||||
{"ref": "# total Resistances", "better": 1, "matchers": [{"string": "총 저항 # "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_count_resistances"]}}}
|
||||
{"ref": "#% Base Defence Percentile", "better": 1, "matchers": [{"string": "#% 기본 방어 백분위수 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_base_defence_percentile"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Atlas Memories", "better": 1, "matchers": [{"string": "떨어진 지도가 #%의 확률로 아틀라스 기억으로 변환 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_memory_line"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Conqueror Maps", "better": 1, "matchers": [{"string": "떨어진 지도가 #%의 확률로 정복자 지도로 변환 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_conqueror_map"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Elder Maps", "better": 1, "matchers": [{"string": "떨어진 지도가 #%의 확률로 엘더 지도로 변환 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_elder_map"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Maven Invitations", "better": 1, "matchers": [{"string": "떨어진 지도가 #%의 확률로 메이븐의 초대로 변환 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_maven_invitation"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Scarabs", "better": 1, "matchers": [{"string": "떨어진 지도가 #%의 확률로 갑충석으로 변환 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_scarab"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Shaper Maps", "better": 1, "matchers": [{"string": "떨어진 지도가 #%의 확률로 쉐이퍼 지도로 변환 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_shaper_map"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Unique Maps", "better": 1, "matchers": [{"string": "떨어진 지도가 #%의 확률로 고유 지도로 변환 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_unique_map"]}}}
|
||||
{"ref": "#% increased Burning Damage", "better": 1, "matchers": [{"string": "화상 피해 #% 증가"}, {"string": "화상 피해 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_burning_damage"], "explicit": ["explicit.stat_1175385867"], "implicit": ["implicit.stat_1175385867"], "fractured": ["fractured.stat_1175385867"]}}}
|
||||
{"ref": "#% increased Cold Damage", "better": 1, "matchers": [{"string": "냉기 피해 #% 증가"}, {"string": "냉기 피해 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_damage"], "explicit": ["explicit.stat_3291658075"], "implicit": ["implicit.stat_3291658075"], "fractured": ["fractured.stat_3291658075"], "scourge": ["scourge.stat_3291658075"], "crafted": ["crafted.stat_3291658075"]}}}
|
||||
{"ref": "#% increased Cold Damage with Attack Skills", "better": 1, "matchers": [{"string": "공격 스킬의 냉기 피해 #% 증가"}, {"string": "공격 스킬의 냉기 피해 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_damage_with_attack_skills"], "explicit": ["explicit.stat_860668586"], "implicit": ["implicit.stat_860668586"]}}}
|
||||
{"ref": "#% increased Cold Spell Damage", "better": 1, "matchers": [{"string": "냉기 주문 피해 #% 증가 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_spell_damage"]}}}
|
||||
{"ref": "#% increased Elemental Damage", "better": 1, "matchers": [{"string": "원소 피해 #% 증가"}, {"string": "원소 피해 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage"], "explicit": ["explicit.stat_3141070085"], "implicit": ["implicit.stat_3141070085"], "fractured": ["fractured.stat_3141070085"], "enchant": ["enchant.stat_692420067"], "scourge": ["scourge.stat_3141070085"]}}}
|
||||
{"ref": "#% increased Elemental Damage with Attack Skills", "better": 1, "matchers": [{"string": "공격 스킬의 원소 피해 #% 증가"}, {"string": "공격 스킬의 원소 피해 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage_with_attack_skills"], "explicit": ["explicit.stat_387439868"], "implicit": ["implicit.stat_387439868"], "fractured": ["fractured.stat_387439868"], "scourge": ["scourge.stat_387439868"], "crafted": ["crafted.stat_387439868"]}}}
|
||||
{"ref": "#% increased Fire Damage", "better": 1, "matchers": [{"string": "화염 피해 #% 증가"}, {"string": "화염 피해 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_damage"], "explicit": ["explicit.stat_3962278098"], "implicit": ["implicit.stat_3962278098"], "fractured": ["fractured.stat_3962278098"], "scourge": ["scourge.stat_3962278098"], "crafted": ["crafted.stat_3962278098"]}}}
|
||||
{"ref": "#% increased Fire Damage with Attack Skills", "better": 1, "matchers": [{"string": "공격 스킬의 화염 피해 #% 증가"}, {"string": "공격 스킬의 화염 피해 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_damage_with_attack_skills"], "implicit": ["implicit.stat_2468413380"]}}}
|
||||
{"ref": "#% increased Fire Spell Damage", "better": 1, "matchers": [{"string": "화염 주문 피해 #% 증가 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_spell_damage"]}}}
|
||||
{"ref": "#% increased Lightning Damage", "better": 1, "matchers": [{"string": "번개 피해 #% 증가"}, {"string": "번개 피해 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_damage"], "explicit": ["explicit.stat_2231156303"], "implicit": ["implicit.stat_2231156303"], "fractured": ["fractured.stat_2231156303"], "scourge": ["scourge.stat_2231156303"], "crafted": ["crafted.stat_2231156303"]}}}
|
||||
{"ref": "#% increased Lightning Damage with Attack Skills", "better": 1, "matchers": [{"string": "공격 스킬의 번개 피해 #% 증가"}, {"string": "공격 스킬의 번개 피해 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_damage_with_attack_skills"], "explicit": ["explicit.stat_4208907162"], "implicit": ["implicit.stat_4208907162"]}}}
|
||||
{"ref": "#% increased Lightning Spell Damage", "better": 1, "matchers": [{"string": "번개 주문 피해 #% 증가 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_spell_damage"]}}}
|
||||
{"ref": "#% increased Mana Regeneration Rate", "better": 1, "matchers": [{"string": "마나 재생 속도 #% 증가"}, {"string": "마나 재생 속도 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_mana_regen"], "explicit": ["explicit.stat_789117908"], "implicit": ["implicit.stat_789117908"], "fractured": ["fractured.stat_789117908"], "scourge": ["scourge.stat_789117908"], "crafted": ["crafted.stat_789117908"]}}}
|
||||
{"ref": "#% increased Movement Speed", "better": 1, "matchers": [{"string": "이동 속도 #% 증가"}, {"string": "이동 속도 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_movement_speed"], "explicit": ["explicit.stat_2250533757"], "implicit": ["implicit.stat_2250533757"], "fractured": ["fractured.stat_2250533757"], "enchant": ["enchant.stat_2250533757"], "scourge": ["scourge.stat_2250533757"], "crafted": ["crafted.stat_2250533757"]}}}
|
||||
{"ref": "#% increased Rarity of Items found", "better": 1, "matchers": [{"string": "발견하는 아이템 희귀도 #% 증가"}, {"string": "발견하는 아이템 희귀도 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_rarity"], "explicit": ["explicit.stat_3917489142"], "implicit": ["implicit.stat_3917489142"], "fractured": ["fractured.stat_3917489142"], "scourge": ["scourge.stat_3917489142"], "crafted": ["crafted.stat_3917489142"]}}}
|
||||
{"ref": "#% increased Spell Damage", "better": 1, "matchers": [{"string": "주문 피해 #% 증가"}, {"string": "주문 피해 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_spell_damage"], "explicit": ["explicit.stat_2974417149"], "implicit": ["implicit.stat_2974417149"], "fractured": ["fractured.stat_2974417149"], "enchant": ["enchant.stat_2974417149"], "scourge": ["scourge.stat_2974417149"], "crafted": ["crafted.stat_2974417149"]}}}
|
||||
{"ref": "#% of Life Regenerated per Second", "better": 1, "matchers": [{"string": "초당 생명력 재생의 #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_percent_life_regen"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Life", "dp": true, "better": 1, "matchers": [{"string": "물리 공격 피해의 #%를 생명력으로 흡수"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_life"], "explicit": ["explicit.stat_3593843976", "explicit.stat_55876295"], "implicit": ["implicit.stat_3593843976", "implicit.stat_55876295"], "fractured": ["fractured.stat_3593843976", "fractured.stat_55876295"], "scourge": ["scourge.stat_3593843976"], "crafted": ["crafted.stat_3593843976", "crafted.stat_55876295"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Mana", "dp": true, "better": 1, "matchers": [{"string": "물리 공격 피해의 #%를 마나로 흡수"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_mana"], "explicit": ["explicit.stat_3237948413", "explicit.stat_669069897"], "implicit": ["implicit.stat_3237948413", "implicit.stat_669069897"], "fractured": ["fractured.stat_3237948413", "fractured.stat_669069897"], "enchant": ["enchant.stat_669069897"], "scourge": ["scourge.stat_3237948413"], "crafted": ["crafted.stat_3237948413", "crafted.stat_669069897"]}}}
|
||||
{"ref": "#% total increased maximum Energy Shield", "better": 1, "matchers": [{"string": "에너지 보호막 최대치 총 #% 증가 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_energy_shield"]}}}
|
||||
{"ref": "#% total increased Physical Damage", "better": 1, "matchers": [{"string": "물리 피해 총 #% 증가 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_physical_damage"]}}}
|
||||
{"ref": "+# total maximum Energy Shield", "better": 1, "matchers": [{"string": "에너지 보호막 최대치 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_energy_shield"]}}}
|
||||
{"ref": "+# total maximum Life", "better": 1, "matchers": [{"string": "총 최대 생명력 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life"]}}}
|
||||
{"ref": "+# total maximum Mana", "better": 1, "matchers": [{"string": "총 최대 마나 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_mana"]}}}
|
||||
{"ref": "+# total to all Attributes", "better": 1, "matchers": [{"string": "모든 능력치 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_all_attributes"]}}}
|
||||
{"ref": "+# total to Dexterity", "better": 1, "matchers": [{"string": "민첩 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_dexterity"]}}}
|
||||
{"ref": "+# total to Intelligence", "better": 1, "matchers": [{"string": "지능 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_intelligence"]}}}
|
||||
{"ref": "+# total to Level of Socketed Aura Gems", "better": 1, "matchers": [{"string": "장착한 오라 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_aura_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Bow Gems", "better": 1, "matchers": [{"string": "장착한 활 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_bow_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Chaos Gems", "better": 1, "matchers": [{"string": "장착한 카오스 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_chaos_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Cold Gems", "better": 1, "matchers": [{"string": "장착한 냉기 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_cold_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Curse Gems", "better": 1, "matchers": [{"string": "장착한 저주 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_curse_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Dexterity Gems", "better": 1, "matchers": [{"string": "장착한 민첩 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_dexterity_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Elemental Gems", "better": 1, "matchers": [{"string": "장착한 원소 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_elemental_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Fire Gems", "better": 1, "matchers": [{"string": "장착한 화염 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_fire_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Gems", "better": 1, "matchers": [{"string": "장착된 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Golem Gems", "better": 1, "matchers": [{"string": "장착한 골렘 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_golem_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Intelligence Gems", "better": 1, "matchers": [{"string": "장착한 지능 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_intelligence_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Lightning Gems", "better": 1, "matchers": [{"string": "장착한 번개 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_lightning_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Melee Gems", "better": 1, "matchers": [{"string": "장착한 근접 공격 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_melee_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Minion Gems", "better": 1, "matchers": [{"string": "장착한 소환수 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_minion_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Movement Gems", "better": 1, "matchers": [{"string": "장착한 이동 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_movement_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Projectile Gems", "better": 1, "matchers": [{"string": "장착한 투사체 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_projectile_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Skill Gems", "better": 1, "matchers": [{"string": "장착한 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_skill_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Spell Gems", "better": 1, "matchers": [{"string": "장착한 주문 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_spell_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Strength Gems", "better": 1, "matchers": [{"string": "장착한 힘 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_strength_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Support Gems", "better": 1, "matchers": [{"string": "장착한 보조 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_support_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Vaal Gems", "better": 1, "matchers": [{"string": "장착한 바알 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_vaal_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Warcry Gems", "better": 1, "matchers": [{"string": "장착한 함성 스킬 젬 레벨 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_warcry_gem_levels"]}}}
|
||||
{"ref": "+# total to Strength", "better": 1, "matchers": [{"string": "힘 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_strength"]}}}
|
||||
{"ref": "+#% Global Critical Strike Chance", "better": 1, "matchers": [{"string": "일반 치명타 확률 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_chance"]}}}
|
||||
{"ref": "+#% Global Critical Strike Multiplier", "better": 1, "matchers": [{"string": "일반 치명타 피해 배율 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_multiplier"]}}}
|
||||
{"ref": "+#% total Attack Speed", "better": 1, "matchers": [{"string": "총 공격 속도 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_attack_speed"]}}}
|
||||
{"ref": "+#% total Cast Speed", "better": 1, "matchers": [{"string": "총 시전 속도 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cast_speed"]}}}
|
||||
{"ref": "+#% total Critical Strike Chance for Spells", "better": 1, "matchers": [{"string": "총 주문 치명타 확률 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_critical_strike_chance_for_spells"]}}}
|
||||
{"ref": "+#% total Elemental Resistance", "better": 1, "matchers": [{"string": "원소 저항력 총 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_elemental_resistance"]}}}
|
||||
{"ref": "+#% total Resistance", "better": 1, "matchers": [{"string": "총 저항 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_resistance"]}}}
|
||||
{"ref": "+#% total to all Elemental Resistances", "better": 1, "matchers": [{"string": "모든 원소 저항력 총 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_all_elemental_resistances"]}}}
|
||||
{"ref": "+#% total to Chaos Resistance", "better": 1, "matchers": [{"string": "카오스 저항 총 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_chaos_resistance"]}}}
|
||||
{"ref": "+#% total to Cold Resistance", "better": 1, "matchers": [{"string": "냉기 저항 총 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cold_resistance"]}}}
|
||||
{"ref": "+#% total to Fire Resistance", "better": 1, "matchers": [{"string": "화염 저항 총 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_fire_resistance"]}}}
|
||||
{"ref": "+#% total to Lightning Resistance", "better": 1, "matchers": [{"string": "번개 저항 총 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_lightning_resistance"]}}}
|
||||
{"ref": "Adds # to # Chaos Damage", "better": 1, "matchers": [{"string": "카오스 피해 #~# 추가"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_chaos_damage"], "explicit": ["explicit.stat_2223678961", "explicit.stat_3531280422"], "implicit": ["implicit.stat_2223678961", "implicit.stat_3531280422"], "fractured": ["fractured.stat_2223678961"], "enchant": ["enchant.stat_2223678961"], "scourge": ["scourge.stat_2223678961"]}}}
|
||||
{"ref": "Adds # to # Chaos Damage to Attacks", "better": 1, "matchers": [{"string": "공격 시 카오스 피해 #~# 추가"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_chaos_damage_to_attacks"], "explicit": ["explicit.stat_674553446"], "implicit": ["implicit.stat_674553446"], "fractured": ["fractured.stat_674553446"], "crafted": ["crafted.stat_674553446"]}}}
|
||||
{"ref": "Adds # to # Chaos Damage to Spells", "better": 1, "matchers": [{"string": "주문 시전 시 카오스 피해 #~# 추가"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_chaos_damage_to_spells"], "explicit": ["explicit.stat_2300399854"], "implicit": ["implicit.stat_2300399854"], "fractured": ["fractured.stat_2300399854"]}}}
|
||||
{"ref": "Adds # to # Cold Damage", "better": 1, "matchers": [{"string": "냉기 피해 #~# 추가"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_cold_damage"], "explicit": ["explicit.stat_1037193709", "explicit.stat_2387423236"], "implicit": ["implicit.stat_1037193709", "implicit.stat_2387423236"], "fractured": ["fractured.stat_1037193709", "fractured.stat_2387423236"], "enchant": ["enchant.stat_1037193709"], "scourge": ["scourge.stat_1037193709"], "crafted": ["crafted.stat_1037193709", "crafted.stat_2387423236"]}}}
|
||||
{"ref": "Adds # to # Cold Damage to Attacks", "better": 1, "matchers": [{"string": "공격 시 냉기 피해 #~# 추가"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_cold_damage_to_attacks"], "explicit": ["explicit.stat_4067062424"], "implicit": ["implicit.stat_4067062424"], "fractured": ["fractured.stat_4067062424"], "crafted": ["crafted.stat_4067062424"]}}}
|
||||
{"ref": "Adds # to # Cold Damage to Spells", "better": 1, "matchers": [{"string": "주문 시전 시 냉기 피해 #~# 추가"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_cold_damage_to_spells"], "explicit": ["explicit.stat_2469416729"], "implicit": ["implicit.stat_2469416729"], "fractured": ["fractured.stat_2469416729"], "scourge": ["scourge.stat_2469416729"], "crafted": ["crafted.stat_2469416729"]}}}
|
||||
{"ref": "Adds # to # Damage", "better": 1, "matchers": [{"string": "# 피해에 # 추가 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_damage"]}}}
|
||||
{"ref": "Adds # to # Damage to Attacks", "better": 1, "matchers": [{"string": "공격 시 # 피해에 # 추가 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_damage_to_attacks"]}}}
|
||||
{"ref": "Adds # to # Damage to Spells", "better": 1, "matchers": [{"string": "주문 시전 시 # 피해에 # 추가 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_damage_to_spells"]}}}
|
||||
{"ref": "Adds # to # Elemental Damage", "better": 1, "matchers": [{"string": "# 원소 피해에 # 추가 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_elemental_damage"]}}}
|
||||
{"ref": "Adds # to # Elemental Damage to Attacks", "better": 1, "matchers": [{"string": "공격 시 # 원소 피해에 # 추가 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_elemental_damage_to_attacks"]}}}
|
||||
{"ref": "Adds # to # Elemental Damage to Spells", "better": 1, "matchers": [{"string": "주문 시전 시 # 원소 피해에 # 추가 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_elemental_damage_to_spells"]}}}
|
||||
{"ref": "Adds # to # Fire Damage", "better": 1, "matchers": [{"string": "화염 피해 #~# 추가"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_fire_damage"], "explicit": ["explicit.stat_321077055", "explicit.stat_709508406"], "implicit": ["implicit.stat_321077055", "implicit.stat_709508406"], "fractured": ["fractured.stat_321077055", "fractured.stat_709508406"], "enchant": ["enchant.stat_709508406"], "scourge": ["scourge.stat_709508406"], "crafted": ["crafted.stat_321077055", "crafted.stat_709508406"]}}}
|
||||
{"ref": "Adds # to # Fire Damage to Attacks", "better": 1, "matchers": [{"string": "공격 시 화염 피해 #~# 추가"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_fire_damage_to_attacks"], "explicit": ["explicit.stat_1573130764"], "implicit": ["implicit.stat_1573130764"], "fractured": ["fractured.stat_1573130764"], "crafted": ["crafted.stat_1573130764"]}}}
|
||||
{"ref": "Adds # to # Fire Damage to Spells", "better": 1, "matchers": [{"string": "주문 시전 시 화염 피해 #~# 추가"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_fire_damage_to_spells"], "explicit": ["explicit.stat_1133016593"], "implicit": ["implicit.stat_1133016593"], "fractured": ["fractured.stat_1133016593"], "scourge": ["scourge.stat_1133016593"], "crafted": ["crafted.stat_1133016593"]}}}
|
||||
{"ref": "Adds # to # Lightning Damage", "better": 1, "matchers": [{"string": "번개 피해 #~# 추가"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_lightning_damage"], "explicit": ["explicit.stat_1334060246", "explicit.stat_3336890334"], "implicit": ["implicit.stat_1334060246", "implicit.stat_3336890334"], "fractured": ["fractured.stat_1334060246", "fractured.stat_3336890334"], "enchant": ["enchant.stat_3336890334"], "scourge": ["scourge.stat_3336890334"], "crafted": ["crafted.stat_1334060246", "crafted.stat_3336890334"]}}}
|
||||
{"ref": "Adds # to # Lightning Damage to Attacks", "better": 1, "matchers": [{"string": "공격 시 번개 피해 #~# 추가"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_lightning_damage_to_attacks"], "explicit": ["explicit.stat_1754445556"], "implicit": ["implicit.stat_1754445556"], "fractured": ["fractured.stat_1754445556"], "crafted": ["crafted.stat_1754445556"]}}}
|
||||
{"ref": "Adds # to # Lightning Damage to Spells", "better": 1, "matchers": [{"string": "주문 시전 시 번개 피해 #~# 추가"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_lightning_damage_to_spells"], "explicit": ["explicit.stat_2831165374"], "implicit": ["implicit.stat_2831165374"], "fractured": ["fractured.stat_2831165374"], "scourge": ["scourge.stat_2831165374"], "crafted": ["crafted.stat_2831165374"]}}}
|
||||
{"ref": "Adds # to # Physical Damage", "better": 1, "matchers": [{"string": "물리 피해 #~# 추가"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_physical_damage"], "explicit": ["explicit.stat_1940865751", "explicit.stat_960081730"], "implicit": ["implicit.stat_1940865751"], "fractured": ["fractured.stat_1940865751", "fractured.stat_960081730"], "scourge": ["scourge.stat_1940865751"], "crafted": ["crafted.stat_1940865751"]}}}
|
||||
{"ref": "Adds # to # Physical Damage to Attacks", "better": 1, "matchers": [{"string": "공격 시 물리 피해 #~# 추가"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_physical_damage_to_attacks"], "explicit": ["explicit.stat_3032590688"], "implicit": ["implicit.stat_3032590688"], "fractured": ["fractured.stat_3032590688"], "crafted": ["crafted.stat_3032590688"]}}}
|
||||
{"ref": "Adds # to # Physical Damage to Spells", "better": 1, "matchers": [{"string": "주문 시전 시 물리 피해 #~# 추가"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_physical_damage_to_spells"], "explicit": ["explicit.stat_2435536961"], "implicit": ["implicit.stat_2435536961"], "fractured": ["fractured.stat_2435536961"], "scourge": ["scourge.stat_2435536961"]}}}
|
||||
{"ref": "Has # Influences", "better": 1, "matchers": [{"string": "# 영향력이 부여되어 있습니다 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_influence_count"]}}}
|
||||
{"ref": "Has Crusader Influence", "better": 1, "matchers": [{"string": "십자군 영향력이 부여되어 있습니다 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_crusader_influence"]}}}
|
||||
{"ref": "Has Elder Influence", "better": 1, "matchers": [{"string": "엘더 영향력이 부여되어 있습니다 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_elder_influence"]}}}
|
||||
{"ref": "Has Hunter Influence", "better": 1, "matchers": [{"string": "사냥꾼 영향력이 부여되어 있습니다 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_hunter_influence"]}}}
|
||||
{"ref": "Has Logbook Area: Battleground Graves", "better": 1, "matchers": [{"string": "다음 일지 지역 보유: 전장 무덤 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_battleground_graves"]}}}
|
||||
{"ref": "Has Logbook Area: Bluffs", "better": 1, "matchers": [{"string": "다음 일지 지역 보유: 절벽 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_bluffs"]}}}
|
||||
{"ref": "Has Logbook Area: Cemetery", "better": 1, "matchers": [{"string": "다음 일지 지역 보유: 공동묘지 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_cemetery"]}}}
|
||||
{"ref": "Has Logbook Area: Desert Ruins", "better": 1, "matchers": [{"string": "다음 일지 지역 보유: 사막 폐허 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_desert_ruins"]}}}
|
||||
{"ref": "Has Logbook Area: Dried Riverbed", "better": 1, "matchers": [{"string": "다음 일지 지역 보유: 말라붙은 강바닥 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_dried_riverbed"]}}}
|
||||
{"ref": "Has Logbook Area: Forest Ruins", "better": 1, "matchers": [{"string": "다음 일지 지역 보유: 숲 폐허 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_forest_ruins"]}}}
|
||||
{"ref": "Has Logbook Area: Karui Wargraves", "better": 1, "matchers": [{"string": "다음 일지 지역 보유: 카루이 전쟁 무덤 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_karui_wargraves"]}}}
|
||||
{"ref": "Has Logbook Area: Mountainside", "better": 1, "matchers": [{"string": "다음 일지 지역 보유: 산비탈 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_mountainside"]}}}
|
||||
{"ref": "Has Logbook Area: Rotting Temple", "better": 1, "matchers": [{"string": "다음 일지 지역 보유: 썩어가는 사원 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_rotting_temple"]}}}
|
||||
{"ref": "Has Logbook Area: Sarn Slums", "better": 1, "matchers": [{"string": "다음 일지 지역 보유: 사안 빈민가 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_sarn_slums"]}}}
|
||||
{"ref": "Has Logbook Area: Scrublands", "better": 1, "matchers": [{"string": "다음 일지 지역 보유: 관목지 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_scrublands"]}}}
|
||||
{"ref": "Has Logbook Area: Shipwreck Reef", "better": 1, "matchers": [{"string": "다음 일지 지역 보유: 난파선 암초 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_shipwreck_reef"]}}}
|
||||
{"ref": "Has Logbook Area: Utzaal Outskirts", "better": 1, "matchers": [{"string": "다음 일지 지역 보유: 웃자알 외곽 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_utzaal_outskirts"]}}}
|
||||
{"ref": "Has Logbook Area: Vaal Temple", "better": 1, "matchers": [{"string": "다음 일지 지역 보유: 바알 사원 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_vaal_temple"]}}}
|
||||
{"ref": "Has Logbook Area: Volcanic Island", "better": 1, "matchers": [{"string": "다음 일지 지역 보유: 화산섬 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_volcano"]}}}
|
||||
{"ref": "Has Logbook Faction: Black Scythe Mercenaries", "better": 0, "matchers": [{"string": "검은 낫 용병단"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_mercenaries"]}}}
|
||||
{"ref": "Has Logbook Faction: Druids of the Broken Circle", "better": 0, "matchers": [{"string": "끊어진 원의 드루이드"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_druids"]}}}
|
||||
{"ref": "Has Logbook Faction: Knights of the Sun", "better": 0, "matchers": [{"string": "태양의 기사단"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_knights"]}}}
|
||||
{"ref": "Has Logbook Faction: Order of the Chalice", "better": 0, "matchers": [{"string": "성배단"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_order"]}}}
|
||||
{"ref": "Has Redeemer Influence", "better": 1, "matchers": [{"string": "대속자 영향력이 부여되어 있습니다 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_redeemer_influence"]}}}
|
||||
{"ref": "Has Room: Antechamber", "better": 0, "matchers": [{"string": "대기실"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_antechamber"]}, "option": true}}
|
||||
{"ref": "Has Room: Apex of Ascension (Tier 3)", "better": 0, "matchers": [{"string": "승천의 정점 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_sacrifice_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Apex of Atzoatl", "better": 0, "matchers": [{"string": "앗조아틀의 정점"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_apex"]}, "option": true}}
|
||||
{"ref": "Has Room: Arena of Valour (Tier 2)", "better": 0, "matchers": [{"string": "용맹의 투기장 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_weapon_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Armourer's Workshop (Tier 1)", "better": 0, "matchers": [{"string": "방어구 장인의 작업장 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_armour_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Armoury (Tier 2)", "better": 0, "matchers": [{"string": "갑주 창고 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_armour_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Atlas of Worlds (Tier 3)", "better": 0, "matchers": [{"string": "아틀라스의 세계 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cartography_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Automaton Lab (Tier 2)", "better": 0, "matchers": [{"string": "오토마톤 제조실 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_minions_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Banquet Hall", "better": 0, "matchers": [{"string": "연회장"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_banquet_hall"]}, "option": true}}
|
||||
{"ref": "Has Room: Barracks (Tier 2)", "better": 0, "matchers": [{"string": "주둔지 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breeding_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Breach Containment Chamber (Tier 2)", "better": 0, "matchers": [{"string": "균열 봉쇄 시설 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breach_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Catalyst of Corruption (Tier 2)", "better": 0, "matchers": [{"string": "타락의 기폭제 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_corruption_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Cellar", "better": 0, "matchers": [{"string": "저장실"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cellar"]}, "option": true}}
|
||||
{"ref": "Has Room: Chamber of Iron (Tier 3)", "better": 0, "matchers": [{"string": "방어구의 방 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_armour_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Chasm", "better": 0, "matchers": [{"string": "절벽길"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chasm_room"]}, "option": true}}
|
||||
{"ref": "Has Room: Cloister", "better": 0, "matchers": [{"string": "회랑"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cloister"]}, "option": true}}
|
||||
{"ref": "Has Room: Conduit of Lightning (Tier 3)", "better": 0, "matchers": [{"string": "번개의 도관 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_lightning_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Corruption Chamber (Tier 1)", "better": 0, "matchers": [{"string": "타락의 방 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_corruption_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Court of Sealed Death (Tier 3)", "better": 0, "matchers": [{"string": "봉인된 죽음의 법정 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_strongbox_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Crucible of Flame (Tier 3)", "better": 0, "matchers": [{"string": "화염의 용광로 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_fire_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Cultivar Chamber (Tier 2)", "better": 0, "matchers": [{"string": "컬티바의 방 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_poison_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Defense Research Lab (Tier 3)", "better": 0, "matchers": [{"string": "방어물 연구소 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trap_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Demolition Lab (Tier 2)", "better": 0, "matchers": [{"string": "폭탄 제조실 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_explosives_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Department of Thaumaturgy (Tier 2)", "better": 0, "matchers": [{"string": "마법부 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_gem_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Doryani's Institute (Tier 3)", "better": 0, "matchers": [{"string": "도리아니의 학회 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_gem_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Engineering Department (Tier 2)", "better": 0, "matchers": [{"string": "공학부 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_workshop_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Explosives Room (Tier 1)", "better": 0, "matchers": [{"string": "폭발물 저장실 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_explosives_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Factory (Tier 3)", "better": 0, "matchers": [{"string": "공장 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_workshop_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Flame Workshop (Tier 1)", "better": 0, "matchers": [{"string": "화염 작업장 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_fire_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Gemcutter's Workshop (Tier 1)", "better": 0, "matchers": [{"string": "세공사의 작업장 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_gem_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Glittering Halls (Tier 3)", "better": 0, "matchers": [{"string": "번쩍이는 복도 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trinket_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Guardhouse (Tier 1)", "better": 0, "matchers": [{"string": "위병소 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breeding_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Champions (Tier 3)", "better": 0, "matchers": [{"string": "용사의 전당 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_weapon_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Heroes (Tier 2)", "better": 0, "matchers": [{"string": "영웅의 전당 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_legion_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Legends (Tier 3)", "better": 0, "matchers": [{"string": "전설의 전당 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_legion_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Locks (Tier 2)", "better": 0, "matchers": [{"string": "자물쇠의 전당 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_strongbox_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Lords (Tier 2)", "better": 0, "matchers": [{"string": "군주의 전당 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_queens_chambers_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Mettle (Tier 1)", "better": 0, "matchers": [{"string": "패기의 전당 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_legion_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Offerings (Tier 2)", "better": 0, "matchers": [{"string": "공물의 전당 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_sacrifice_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of War (Tier 3)", "better": 0, "matchers": [{"string": "전쟁의 전당 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breeding_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Halls", "better": 0, "matchers": [{"string": "복도"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_halls"]}, "option": true}}
|
||||
{"ref": "Has Room: Hatchery (Tier 1)", "better": 0, "matchers": [{"string": "부화장 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_minions_1"]}, "option": true}}
|
||||
{"ref": "Has Room: House of the Others (Tier 3)", "better": 0, "matchers": [{"string": "다른 존재의 보금자리 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breach_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Hurricane Engine (Tier 2)", "better": 0, "matchers": [{"string": "폭풍 장치 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_storm_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hybridisation Chamber (Tier 3)", "better": 0, "matchers": [{"string": "잡종화의 방 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_minions_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Jeweller's Workshop (Tier 1)", "better": 0, "matchers": [{"string": "보석 상인의 작업장 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trinket_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Jewellery Forge (Tier 2)", "better": 0, "matchers": [{"string": "장신구 제련소 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trinket_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Lightning Workshop (Tier 1)", "better": 0, "matchers": [{"string": "번개 작업장 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_lightning_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Locus of Corruption (Tier 3)", "better": 0, "matchers": [{"string": "타락의 현장 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_corruption_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Museum of Artefacts (Tier 3)", "better": 0, "matchers": [{"string": "유물 박물관 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chests_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Office of Cartography (Tier 2)", "better": 0, "matchers": [{"string": "지도 제작소 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cartography_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Omnitect Forge (Tier 2)", "better": 0, "matchers": [{"string": "종합체 제련소 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_fire_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Omnitect Reactor Plant (Tier 2)", "better": 0, "matchers": [{"string": "종합체 원전 시설 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_lightning_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Passageways", "better": 0, "matchers": [{"string": "통로"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_passageways"]}, "option": true}}
|
||||
{"ref": "Has Room: Pits", "better": 0, "matchers": [{"string": "구덩이"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_the_pits"]}, "option": true}}
|
||||
{"ref": "Has Room: Poison Garden (Tier 1)", "better": 0, "matchers": [{"string": "독초 정원 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_poison_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Pools of Restoration (Tier 1)", "better": 0, "matchers": [{"string": "회복의 웅덩이 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_healing_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Royal Meeting Room (Tier 1)", "better": 0, "matchers": [{"string": "왕실 회의실 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_queens_chambers_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Sacrificial Chamber (Tier 1)", "better": 0, "matchers": [{"string": "희생의 방 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_sacrifice_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Sadist's Den (Tier 3)", "better": 0, "matchers": [{"string": "가학자의 굴 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_torment_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Sanctum of Immortality (Tier 3)", "better": 0, "matchers": [{"string": "불멸의 지성소 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_healing_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Sanctum of Unity (Tier 2)", "better": 0, "matchers": [{"string": "단결의 지성소 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_empowering_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Sanctum of Vitality (Tier 2)", "better": 0, "matchers": [{"string": "활력의 지성소 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_healing_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Shrine of Empowerment (Tier 1)", "better": 0, "matchers": [{"string": "강화의 성소 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_empowering_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Shrine of Unmaking (Tier 3)", "better": 0, "matchers": [{"string": "파괴의 성소 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_explosives_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Sparring Room (Tier 1)", "better": 0, "matchers": [{"string": "격투장 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_weapon_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Splinter Research Lab (Tier 1)", "better": 0, "matchers": [{"string": "파편 연구소 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breach_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Storage Room (Tier 1)", "better": 0, "matchers": [{"string": "저장고 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chests_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Storm of Corruption (Tier 3)", "better": 0, "matchers": [{"string": "타락의 태풍 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_storm_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Strongbox Chamber (Tier 1)", "better": 0, "matchers": [{"string": "금고의 방 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_strongbox_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Surveyor's Study (Tier 1)", "better": 0, "matchers": [{"string": "측량사의 조사 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cartography_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Tempest Generator (Tier 1)", "better": 0, "matchers": [{"string": "폭풍 제조기 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_storm_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Temple Defense Workshop (Tier 2)", "better": 0, "matchers": [{"string": "사원 방어물 작업장 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trap_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Temple Nexus (Tier 3)", "better": 0, "matchers": [{"string": "사원의 연결부 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_empowering_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Throne of Atziri (Tier 3)", "better": 0, "matchers": [{"string": "앗지리의 왕좌 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_queens_chambers_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Tombs", "better": 0, "matchers": [{"string": "무덤"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_tombs"]}, "option": true}}
|
||||
{"ref": "Has Room: Torment Cells (Tier 1)", "better": 0, "matchers": [{"string": "고문용 감방 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_torment_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Torture Cages (Tier 2)", "better": 0, "matchers": [{"string": "고문용 창살 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_torment_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Toxic Grove (Tier 3)", "better": 0, "matchers": [{"string": "독성 수목원 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_poison_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Trap Workshop (Tier 1)", "better": 0, "matchers": [{"string": "덫 작업장 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trap_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Treasury (Tier 2)", "better": 0, "matchers": [{"string": "보물 창고 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_currency_vault_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Tunnels", "better": 0, "matchers": [{"string": "터널"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_tunnels"]}, "option": true}}
|
||||
{"ref": "Has Room: Vault (Tier 1)", "better": 0, "matchers": [{"string": "금고실 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_currency_vault_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Warehouses (Tier 2)", "better": 0, "matchers": [{"string": "창고 (2등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chests_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Wealth of the Vaal (Tier 3)", "better": 0, "matchers": [{"string": "바알의 재물 (3등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_currency_vault_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Workshop (Tier 1)", "better": 0, "matchers": [{"string": "작업장 (1등급)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_workshop_1"]}, "option": true}}
|
||||
{"ref": "Has Shaper Influence", "better": 1, "matchers": [{"string": "쉐이퍼 영향력이 부여되어 있습니다 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_shaper_influence"]}}}
|
||||
{"ref": "Has Warlord Influence", "better": 1, "matchers": [{"string": "전쟁군주 영향력이 부여되어 있습니다 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_warlord_influence"]}}}
|
||||
{"ref": "Mirrored Tablet has # Islands", "better": 1, "matchers": [{"string": "복제 서판이 섬 #개 보유 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_lake_number_of_islands"]}}}
|
||||
{"ref": "More Currency: #%", "better": 1, "matchers": [{"string": "화폐 더 많음: #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_currency_drops"]}}}
|
||||
{"ref": "More Divination Cards: #%", "better": 1, "matchers": [{"string": "점술 카드 더 많음: #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_card_drops"]}}}
|
||||
{"ref": "More Maps: #%", "better": 1, "matchers": [{"string": "지도 더 많음: #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_map_drops"]}}}
|
||||
{"ref": "More Scarabs: #%", "better": 1, "matchers": [{"string": "갑충석 더 많음: #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_scarab_drops"]}}}
|
||||
{"ref": "Quality (Attack Modifiers): #%", "better": 1, "matchers": [{"string": "퀄리티 (공격 속성 부여): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_attack_quality"]}}}
|
||||
{"ref": "Quality (Attribute Modifiers): #%", "better": 1, "matchers": [{"string": "퀄리티 (능력치 속성 부여): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_attribute_quality"]}}}
|
||||
{"ref": "Quality (Caster Modifiers): #%", "better": 1, "matchers": [{"string": "퀄리티 (시전 속성 부여): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_caster_quality"]}}}
|
||||
{"ref": "Quality (Critical Modifiers): #%", "better": 1, "matchers": [{"string": "퀄리티 (치명타 속성 부여): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_critical_quality"]}}}
|
||||
{"ref": "Quality (Currency): #%", "better": 1, "matchers": [{"string": "퀄리티 (화폐): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_currency"]}}}
|
||||
{"ref": "Quality (Defence Modifiers): #%", "better": 1, "matchers": [{"string": "퀄리티 (방어 속성 부여): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_defense_quality"]}}}
|
||||
{"ref": "Quality (Divination Cards): #%", "better": 1, "matchers": [{"string": "퀄리티 (점술 카드): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_cards"]}}}
|
||||
{"ref": "Quality (Elemental Damage Modifiers): #%", "better": 1, "matchers": [{"string": "퀄리티 (원소 피해 속성 부여): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_elemental_quality"]}}}
|
||||
{"ref": "Quality (Life and Mana Modifiers): #%", "better": 1, "matchers": [{"string": "퀄리티 (생명력과 마나 속성 부여): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_resource_quality"]}}}
|
||||
{"ref": "Quality (Pack Size): #%", "better": 1, "matchers": [{"string": "퀄리티 (무리 규모): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_pack_size"]}}}
|
||||
{"ref": "Quality (Physical and Chaos Damage Modifiers): #%", "better": 1, "matchers": [{"string": "퀄리티 (물리 및 카오스 피해 속성 부여): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_physical_chaos_quality"]}}}
|
||||
{"ref": "Quality (Rarity): #%", "better": 1, "matchers": [{"string": "퀄리티 (희귀도): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_rarity"]}}}
|
||||
{"ref": "Quality (Resistance Modifiers): #%", "better": 1, "matchers": [{"string": "퀄리티 (저항 속성 부여): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_resistance_quality"]}}}
|
||||
{"ref": "Quality (Scarabs): #%", "better": 1, "matchers": [{"string": "퀄리티 (갑충석): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_scarabs"]}}}
|
||||
{"ref": "Quality (Speed Modifiers): #%", "better": 1, "matchers": [{"string": "퀄리티 (속도 속성 부여): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_speed_quality"]}}}
|
||||
{"ref": "Reflection of Abyss (Difficulty #)", "better": 1, "matchers": [{"string": "심연의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_38892"]}}}
|
||||
{"ref": "Reflection of Ambush (Difficulty #)", "better": 1, "matchers": [{"string": "매복의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_48307"]}}}
|
||||
{"ref": "Reflection of Angling (Difficulty #)", "better": 1, "matchers": [{"string": "강태공의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_40794"]}}}
|
||||
{"ref": "Reflection of Azurite (Difficulty #)", "better": 1, "matchers": [{"string": "남동석의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_40031"]}}}
|
||||
{"ref": "Reflection of Bestiary (Difficulty #)", "better": 1, "matchers": [{"string": "야수 도감의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_55569"]}}}
|
||||
{"ref": "Reflection of Breach (Difficulty #)", "better": 1, "matchers": [{"string": "균열의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_62572"]}}}
|
||||
{"ref": "Reflection of Brutality (Difficulty #)", "better": 1, "matchers": [{"string": "잔인성의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_29096"]}}}
|
||||
{"ref": "Reflection of Camaraderie (Difficulty #)", "better": 1, "matchers": [{"string": "전우애의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_35395"]}}}
|
||||
{"ref": "Reflection of Catalysis (Difficulty #)", "better": 1, "matchers": [{"string": "촉매의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_57850"]}}}
|
||||
{"ref": "Reflection of Chaos (Difficulty #)", "better": 1, "matchers": [{"string": "혼돈의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_50834"]}}}
|
||||
{"ref": "Reflection of Conflict (Difficulty #)", "better": 1, "matchers": [{"string": "갈등의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_1931"]}}}
|
||||
{"ref": "Reflection of Darkness (Difficulty #)", "better": 1, "matchers": [{"string": "어둠의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_34457"]}}}
|
||||
{"ref": "Reflection of Delirium (Difficulty #)", "better": 1, "matchers": [{"string": "환영의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_22138"]}}}
|
||||
{"ref": "Reflection of Delve (Difficulty #)", "better": 1, "matchers": [{"string": "탐광의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_18737"]}}}
|
||||
{"ref": "Reflection of Demonfire (Difficulty #)", "better": 1, "matchers": [{"string": "악마불의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_28500"]}}}
|
||||
{"ref": "Reflection of Domination (Difficulty #)", "better": 1, "matchers": [{"string": "지배의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_63412"]}}}
|
||||
{"ref": "Reflection of Entrapment (Difficulty #)", "better": 1, "matchers": [{"string": "속박의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_44399"]}}}
|
||||
{"ref": "Reflection of Essence (Difficulty #)", "better": 1, "matchers": [{"string": "에센스의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_49862"]}}}
|
||||
{"ref": "Reflection of Experimentation (Difficulty #)", "better": 1, "matchers": [{"string": "실험의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_55676"]}}}
|
||||
{"ref": "Reflection of Flame (Difficulty #)", "better": 1, "matchers": [{"string": "화염의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_42468"]}}}
|
||||
{"ref": "Reflection of Fractured Dimensions (Difficulty #)", "better": 1, "matchers": [{"string": "분열된 차원의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_49488"]}}}
|
||||
{"ref": "Reflection of Frost (Difficulty #)", "better": 1, "matchers": [{"string": "서리의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_38110"]}}}
|
||||
{"ref": "Reflection of Guilt (Difficulty #)", "better": 1, "matchers": [{"string": "죄책감의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_25480"]}}}
|
||||
{"ref": "Reflection of Imprisonment (Difficulty #)", "better": 1, "matchers": [{"string": "갇힘의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_10363"]}}}
|
||||
{"ref": "Reflection of Kalandra (Difficulty #)", "better": 1, "matchers": [{"string": "칼란드라의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_36591"]}}}
|
||||
{"ref": "Reflection of Legion (Difficulty #)", "better": 1, "matchers": [{"string": "군단의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_403"]}}}
|
||||
{"ref": "Reflection of Metamorph (Difficulty #)", "better": 1, "matchers": [{"string": "변형의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_3699"]}}}
|
||||
{"ref": "Reflection of Occultism (Difficulty #)", "better": 1, "matchers": [{"string": "비술의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_24451"]}}}
|
||||
{"ref": "Reflection of Paradise (Difficulty #)", "better": 1, "matchers": [{"string": "낙원의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_50846"]}}}
|
||||
{"ref": "Reflection of Perverted Faith (Difficulty #)", "better": 1, "matchers": [{"string": "엇나간 믿음의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_27678"]}}}
|
||||
{"ref": "Reflection of Phaaryl (Difficulty #)", "better": 1, "matchers": [{"string": "파아릴의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_7674"]}}}
|
||||
{"ref": "Reflection of Possession (Difficulty #)", "better": 1, "matchers": [{"string": "빙의의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_25049"]}}}
|
||||
{"ref": "Reflection of Power (Difficulty #)", "better": 1, "matchers": [{"string": "힘의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_35950"]}}}
|
||||
{"ref": "Reflection of Scourge (Difficulty #)", "better": 1, "matchers": [{"string": "스컬지의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_62360"]}}}
|
||||
{"ref": "Reflection of Stasis (Difficulty #)", "better": 1, "matchers": [{"string": "정체의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_32968"]}}}
|
||||
{"ref": "Reflection of Sulphite (Difficulty #)", "better": 1, "matchers": [{"string": "아황산염의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_45086"]}}}
|
||||
{"ref": "Reflection of the Black Scythe (Difficulty #)", "better": 1, "matchers": [{"string": "검은 낫의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_9662"]}}}
|
||||
{"ref": "Reflection of the Breachlord (Difficulty #)", "better": 1, "matchers": [{"string": "균열 군주의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_62935"]}}}
|
||||
{"ref": "Reflection of the Broken Circle (Difficulty #)", "better": 1, "matchers": [{"string": "끊어진 원의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_43128"]}}}
|
||||
{"ref": "Reflection of the Chalice (Difficulty #)", "better": 1, "matchers": [{"string": "성배의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_64561"]}}}
|
||||
{"ref": "Reflection of the Chasm (Difficulty #)", "better": 1, "matchers": [{"string": "절벽길의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_57101"]}}}
|
||||
{"ref": "Reflection of the Dream (Difficulty #)", "better": 1, "matchers": [{"string": "꿈의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_27117"]}}}
|
||||
{"ref": "Reflection of the Harbingers (Difficulty #)", "better": 1, "matchers": [{"string": "선구자의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_37203"]}}}
|
||||
{"ref": "Reflection of the Hunter (Difficulty #)", "better": 1, "matchers": [{"string": "사냥꾼의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_18816"]}}}
|
||||
{"ref": "Reflection of the Monolith (Difficulty #)", "better": 1, "matchers": [{"string": "기둥의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_34796"]}}}
|
||||
{"ref": "Reflection of the Nightmare (Difficulty #)", "better": 1, "matchers": [{"string": "악몽의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_24232"]}}}
|
||||
{"ref": "Reflection of the Storm (Difficulty #)", "better": 1, "matchers": [{"string": "태풍의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_2745"]}}}
|
||||
{"ref": "Reflection of the Sun (Difficulty #)", "better": 1, "matchers": [{"string": "태양의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_60034"]}}}
|
||||
{"ref": "Reflection of the Trove (Difficulty #)", "better": 1, "matchers": [{"string": "발견물의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_46772"]}}}
|
||||
{"ref": "Reflection of the Wilderness (Difficulty #)", "better": 1, "matchers": [{"string": "황야의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_29224"]}}}
|
||||
{"ref": "Reflection of Thralldom (Difficulty #)", "better": 1, "matchers": [{"string": "예속의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_26813"]}}}
|
||||
{"ref": "Reflection of Torment (Difficulty #)", "better": 1, "matchers": [{"string": "고통의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_53950"]}}}
|
||||
{"ref": "Reflection of Tyranny (Difficulty #)", "better": 1, "matchers": [{"string": "폭정의 투영 (난이도 #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_60981"]}}}
|
||||
@@ -1,32 +0,0 @@
|
||||
{"ref": "# Life Regenerated per Second", "better": 1, "matchers": [{"string": "초당 생명력 재생 #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life_regen"]}}}
|
||||
{"ref": "#% increased Burning Damage", "better": 1, "matchers": [{"string": "화상 피해 #% 증가"}, {"string": "화상 피해 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_burning_damage"], "explicit": ["explicit.stat_1175385867"], "implicit": ["implicit.stat_1175385867"], "fractured": ["fractured.stat_1175385867"]}}}
|
||||
{"ref": "#% increased Cold Damage", "better": 1, "matchers": [{"string": "냉기 피해 #% 증가"}, {"string": "냉기 피해 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_damage"], "explicit": ["explicit.stat_3291658075"], "implicit": ["implicit.stat_3291658075"], "fractured": ["fractured.stat_3291658075"], "scourge": ["scourge.stat_3291658075"], "crafted": ["crafted.stat_3291658075"]}}}
|
||||
{"ref": "#% increased Cold Spell Damage", "better": 1, "matchers": [{"string": "냉기 주문 피해 #% 증가 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_spell_damage"]}}}
|
||||
{"ref": "#% increased Elemental Damage", "better": 1, "matchers": [{"string": "원소 피해 #% 증가"}, {"string": "원소 피해 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage"], "explicit": ["explicit.stat_3141070085"], "implicit": ["implicit.stat_3141070085"], "fractured": ["fractured.stat_3141070085"], "enchant": ["enchant.stat_692420067"], "scourge": ["scourge.stat_3141070085"]}}}
|
||||
{"ref": "#% increased Elemental Damage with Attack Skills", "better": 1, "matchers": [{"string": "공격 스킬의 원소 피해 #% 증가"}, {"string": "공격 스킬의 원소 피해 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage_with_attack_skills"], "explicit": ["explicit.stat_387439868"], "implicit": ["implicit.stat_387439868"], "fractured": ["fractured.stat_387439868"], "scourge": ["scourge.stat_387439868"], "crafted": ["crafted.stat_387439868"]}}}
|
||||
{"ref": "#% increased Fire Damage", "better": 1, "matchers": [{"string": "화염 피해 #% 증가"}, {"string": "화염 피해 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_damage"], "explicit": ["explicit.stat_3962278098"], "implicit": ["implicit.stat_3962278098"], "fractured": ["fractured.stat_3962278098"], "scourge": ["scourge.stat_3962278098"], "crafted": ["crafted.stat_3962278098"]}}}
|
||||
{"ref": "#% increased Fire Spell Damage", "better": 1, "matchers": [{"string": "화염 주문 피해 #% 증가 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_spell_damage"]}}}
|
||||
{"ref": "#% increased Lightning Damage", "better": 1, "matchers": [{"string": "번개 피해 #% 증가"}, {"string": "번개 피해 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_damage"], "explicit": ["explicit.stat_2231156303"], "implicit": ["implicit.stat_2231156303"], "fractured": ["fractured.stat_2231156303"], "scourge": ["scourge.stat_2231156303"], "crafted": ["crafted.stat_2231156303"]}}}
|
||||
{"ref": "#% increased Lightning Spell Damage", "better": 1, "matchers": [{"string": "번개 주문 피해 #% 증가 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_spell_damage"]}}}
|
||||
{"ref": "#% increased Mana Regeneration Rate", "better": 1, "matchers": [{"string": "마나 재생 속도 #% 증가"}, {"string": "마나 재생 속도 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_mana_regen"], "explicit": ["explicit.stat_789117908"], "implicit": ["implicit.stat_789117908"], "fractured": ["fractured.stat_789117908"], "scourge": ["scourge.stat_789117908"], "crafted": ["crafted.stat_789117908"]}}}
|
||||
{"ref": "#% increased Movement Speed", "better": 1, "matchers": [{"string": "이동 속도 #% 증가"}, {"string": "이동 속도 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_movement_speed"], "explicit": ["explicit.stat_2250533757"], "implicit": ["implicit.stat_2250533757"], "fractured": ["fractured.stat_2250533757"], "enchant": ["enchant.stat_2250533757"], "scourge": ["scourge.stat_2250533757"], "crafted": ["crafted.stat_2250533757"]}}}
|
||||
{"ref": "#% increased Spell Damage", "better": 1, "matchers": [{"string": "주문 피해 #% 증가"}, {"string": "주문 피해 #% 감소", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_spell_damage"], "explicit": ["explicit.stat_2974417149"], "implicit": ["implicit.stat_2974417149"], "fractured": ["fractured.stat_2974417149"], "enchant": ["enchant.stat_2974417149"], "scourge": ["scourge.stat_2974417149"], "crafted": ["crafted.stat_2974417149"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Life", "dp": true, "better": 1, "matchers": [{"string": "물리 공격 피해의 #%를 생명력으로 흡수"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_life"], "explicit": ["explicit.stat_3593843976", "explicit.stat_55876295"], "implicit": ["implicit.stat_3593843976", "implicit.stat_55876295"], "fractured": ["fractured.stat_3593843976", "fractured.stat_55876295"], "scourge": ["scourge.stat_3593843976"], "crafted": ["crafted.stat_3593843976", "crafted.stat_55876295"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Mana", "dp": true, "better": 1, "matchers": [{"string": "물리 공격 피해의 #%를 마나로 흡수"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_mana"], "explicit": ["explicit.stat_3237948413", "explicit.stat_669069897"], "implicit": ["implicit.stat_3237948413", "implicit.stat_669069897"], "fractured": ["fractured.stat_3237948413", "fractured.stat_669069897"], "enchant": ["enchant.stat_669069897"], "scourge": ["scourge.stat_3237948413"], "crafted": ["crafted.stat_3237948413", "crafted.stat_669069897"]}}}
|
||||
{"ref": "#% total increased Physical Damage", "better": 1, "matchers": [{"string": "물리 피해 총 #% 증가 "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_physical_damage"]}}}
|
||||
{"ref": "+# total maximum Energy Shield", "better": 1, "matchers": [{"string": "에너지 보호막 최대치 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_energy_shield"]}}}
|
||||
{"ref": "+# total maximum Life", "better": 1, "matchers": [{"string": "총 최대 생명력 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life"]}}}
|
||||
{"ref": "+# total maximum Mana", "better": 1, "matchers": [{"string": "총 최대 마나 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_mana"]}}}
|
||||
{"ref": "+# total to all Attributes", "better": 1, "matchers": [{"string": "모든 능력치 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_all_attributes"]}}}
|
||||
{"ref": "+# total to Dexterity", "better": 1, "matchers": [{"string": "민첩 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_dexterity"]}}}
|
||||
{"ref": "+# total to Intelligence", "better": 1, "matchers": [{"string": "지능 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_intelligence"]}}}
|
||||
{"ref": "+# total to Strength", "better": 1, "matchers": [{"string": "힘 총 +# "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_strength"]}}}
|
||||
{"ref": "+#% Global Critical Strike Chance", "better": 1, "matchers": [{"string": "일반 치명타 확률 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_chance"]}}}
|
||||
{"ref": "+#% Global Critical Strike Multiplier", "better": 1, "matchers": [{"string": "일반 치명타 피해 배율 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_multiplier"]}}}
|
||||
{"ref": "+#% total Attack Speed", "better": 1, "matchers": [{"string": "총 공격 속도 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_attack_speed"]}}}
|
||||
{"ref": "+#% total Cast Speed", "better": 1, "matchers": [{"string": "총 시전 속도 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cast_speed"]}}}
|
||||
{"ref": "+#% total Elemental Resistance", "better": 1, "matchers": [{"string": "원소 저항력 총 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_elemental_resistance"]}}}
|
||||
{"ref": "+#% total to Chaos Resistance", "better": 1, "matchers": [{"string": "카오스 저항 총 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_chaos_resistance"]}}}
|
||||
{"ref": "+#% total to Cold Resistance", "better": 1, "matchers": [{"string": "냉기 저항 총 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cold_resistance"]}}}
|
||||
{"ref": "+#% total to Fire Resistance", "better": 1, "matchers": [{"string": "화염 저항 총 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_fire_resistance"]}}}
|
||||
{"ref": "+#% total to Lightning Resistance", "better": 1, "matchers": [{"string": "번개 저항 총 +#% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_lightning_resistance"]}}}
|
||||
@@ -1,54 +0,0 @@
|
||||
import json
|
||||
import os
|
||||
|
||||
|
||||
def get_script_dir():
|
||||
"""Returns the directory where the script is located."""
|
||||
return os.path.dirname(os.path.realpath(__file__))
|
||||
|
||||
|
||||
# List of localization codes
|
||||
localizations = ["en", "ru", "ko", "cmn-Hant"]
|
||||
|
||||
key_to_find = "trade.ids.pseudo" # The specific key path to check for
|
||||
|
||||
|
||||
def has_nested_key(obj, key_path):
|
||||
keys = key_path.split(".")
|
||||
for key in keys:
|
||||
if isinstance(obj, dict) and key in obj:
|
||||
obj = obj[key]
|
||||
else:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def process_file(input_file_path, output_file_path):
|
||||
result_list = []
|
||||
|
||||
# Use 'utf-8' encoding when opening the input file
|
||||
with open(input_file_path, "r", encoding="utf-8") as input_file:
|
||||
for line in input_file:
|
||||
try:
|
||||
json_object = json.loads(line)
|
||||
if has_nested_key(json_object, key_to_find):
|
||||
result_list.append(json_object)
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"Error parsing JSON: {e}")
|
||||
|
||||
with open(output_file_path, "w", encoding="utf-8") as output_file:
|
||||
for item in result_list:
|
||||
output_file.write(json.dumps(item, ensure_ascii=False) + "\n")
|
||||
|
||||
print(
|
||||
f"Processing complete for {input_file_path}. Check {output_file_path} for results."
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
for loc in localizations:
|
||||
input_file_path = f"{get_script_dir()}/../../data/{loc}/stats.ndjson.old" # Path to the input file
|
||||
output_file_path = (
|
||||
f"{get_script_dir()}/{loc}/all-pseudo.ndjson" # Path to the output file
|
||||
)
|
||||
process_file(input_file_path, output_file_path)
|
||||
@@ -1,32 +0,0 @@
|
||||
{"ref": "+#% total Elemental Resistance", "better": 1, "matchers": [{"string": "+#% total Elemental Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_elemental_resistance"]}}}
|
||||
{"ref": "+#% total to Fire Resistance", "better": 1, "matchers": [{"string": "+#% total to Fire Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_fire_resistance"]}}}
|
||||
{"ref": "+#% total to Cold Resistance", "better": 1, "matchers": [{"string": "+#% total to Cold Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cold_resistance"]}}}
|
||||
{"ref": "+#% total to Lightning Resistance", "better": 1, "matchers": [{"string": "+#% total to Lightning Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_lightning_resistance"]}}}
|
||||
{"ref": "+#% total to Chaos Resistance", "better": 1, "matchers": [{"string": "+#% total to Chaos Resistance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_chaos_resistance"]}}}
|
||||
{"ref": "+# total to all Attributes", "better": 1, "matchers": [{"string": "+# total to all Attributes "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_all_attributes"]}}}
|
||||
{"ref": "+# total to Strength", "better": 1, "matchers": [{"string": "+# total to Strength "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_strength"]}}}
|
||||
{"ref": "+# total to Dexterity", "better": 1, "matchers": [{"string": "+# total to Dexterity "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_dexterity"]}}}
|
||||
{"ref": "+# total to Intelligence", "better": 1, "matchers": [{"string": "+# total to Intelligence "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_intelligence"]}}}
|
||||
{"ref": "+# total maximum Life", "better": 1, "matchers": [{"string": "+# total maximum Life "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life"]}}}
|
||||
{"ref": "+# total maximum Mana", "better": 1, "matchers": [{"string": "+# total maximum Mana "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_mana"]}}}
|
||||
{"ref": "+# total maximum Energy Shield", "better": 1, "matchers": [{"string": "+# total maximum Energy Shield "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_energy_shield"]}}}
|
||||
{"ref": "+#% total Attack Speed", "better": 1, "matchers": [{"string": "+#% total Attack Speed "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_attack_speed"]}}}
|
||||
{"ref": "+#% total Cast Speed", "better": 1, "matchers": [{"string": "+#% total Cast Speed "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cast_speed"]}}}
|
||||
{"ref": "#% increased Movement Speed", "better": 1, "matchers": [{"string": "#% increased Movement Speed"}, {"string": "#% reduced Movement Speed", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_movement_speed"], "explicit": ["explicit.stat_2250533757"], "implicit": ["implicit.stat_2250533757"], "fractured": ["fractured.stat_2250533757"], "enchant": ["enchant.stat_2250533757"], "scourge": ["scourge.stat_2250533757"], "crafted": ["crafted.stat_2250533757"]}}}
|
||||
{"ref": "#% total increased Physical Damage", "better": 1, "matchers": [{"string": "#% total increased Physical Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_physical_damage"]}}}
|
||||
{"ref": "+#% Global Critical Strike Chance", "better": 1, "matchers": [{"string": "+#% Global Critical Strike Chance "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_chance"]}}}
|
||||
{"ref": "+#% Global Critical Strike Multiplier", "better": 1, "matchers": [{"string": "+#% Global Critical Strike Multiplier "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_multiplier"]}}}
|
||||
{"ref": "#% increased Elemental Damage", "better": 1, "matchers": [{"string": "#% increased Elemental Damage"}, {"string": "Has #% increased Elemental Damage"}, {"string": "#% reduced Elemental Damage", "negate": true}, {"string": "Has #% reduced Elemental Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage"], "explicit": ["explicit.stat_3141070085"], "implicit": ["implicit.stat_3141070085"], "fractured": ["fractured.stat_3141070085"], "enchant": ["enchant.stat_692420067"], "scourge": ["scourge.stat_3141070085"]}}}
|
||||
{"ref": "#% increased Lightning Damage", "better": 1, "matchers": [{"string": "#% increased Lightning Damage"}, {"string": "#% reduced Lightning Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_damage"], "explicit": ["explicit.stat_2231156303"], "implicit": ["implicit.stat_2231156303"], "fractured": ["fractured.stat_2231156303"], "scourge": ["scourge.stat_2231156303"], "crafted": ["crafted.stat_2231156303"]}}}
|
||||
{"ref": "#% increased Cold Damage", "better": 1, "matchers": [{"string": "#% increased Cold Damage"}, {"string": "#% reduced Cold Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_damage"], "explicit": ["explicit.stat_3291658075"], "implicit": ["implicit.stat_3291658075"], "fractured": ["fractured.stat_3291658075"], "scourge": ["scourge.stat_3291658075"], "crafted": ["crafted.stat_3291658075"]}}}
|
||||
{"ref": "#% increased Fire Damage", "better": 1, "matchers": [{"string": "#% increased Fire Damage"}, {"string": "#% reduced Fire Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_damage"], "explicit": ["explicit.stat_3962278098"], "implicit": ["implicit.stat_3962278098"], "fractured": ["fractured.stat_3962278098"], "scourge": ["scourge.stat_3962278098"], "crafted": ["crafted.stat_3962278098"]}}}
|
||||
{"ref": "#% increased Spell Damage", "better": 1, "matchers": [{"string": "#% increased Spell Damage"}, {"string": "#% reduced Spell Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_spell_damage"], "explicit": ["explicit.stat_2974417149"], "implicit": ["implicit.stat_2974417149"], "fractured": ["fractured.stat_2974417149"], "enchant": ["enchant.stat_2974417149"], "scourge": ["scourge.stat_2974417149"], "crafted": ["crafted.stat_2974417149"]}}}
|
||||
{"ref": "#% increased Lightning Spell Damage", "better": 1, "matchers": [{"string": "#% increased Lightning Spell Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_spell_damage"]}}}
|
||||
{"ref": "#% increased Cold Spell Damage", "better": 1, "matchers": [{"string": "#% increased Cold Spell Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_spell_damage"]}}}
|
||||
{"ref": "#% increased Fire Spell Damage", "better": 1, "matchers": [{"string": "#% increased Fire Spell Damage "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_spell_damage"]}}}
|
||||
{"ref": "#% increased Elemental Damage with Attack Skills", "better": 1, "matchers": [{"string": "#% increased Elemental Damage with Attack Skills"}, {"string": "#% reduced Elemental Damage with Attack Skills", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage_with_attack_skills"], "explicit": ["explicit.stat_387439868"], "implicit": ["implicit.stat_387439868"], "fractured": ["fractured.stat_387439868"], "scourge": ["scourge.stat_387439868"], "crafted": ["crafted.stat_387439868"]}}}
|
||||
{"ref": "#% increased Burning Damage", "better": 1, "matchers": [{"string": "#% increased Burning Damage"}, {"string": "#% reduced Burning Damage", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_burning_damage"], "explicit": ["explicit.stat_1175385867"], "implicit": ["implicit.stat_1175385867"], "fractured": ["fractured.stat_1175385867"]}}}
|
||||
{"ref": "# Life Regenerated per Second", "better": 1, "matchers": [{"string": "# Life Regenerated per Second "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life_regen"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Life", "dp": true, "better": 1, "matchers": [{"string": "#% of Physical Attack Damage Leeched as Life"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_life"], "explicit": ["explicit.stat_3593843976", "explicit.stat_55876295"], "implicit": ["implicit.stat_3593843976", "implicit.stat_55876295"], "fractured": ["fractured.stat_3593843976", "fractured.stat_55876295"], "scourge": ["scourge.stat_3593843976"], "crafted": ["crafted.stat_3593843976", "crafted.stat_55876295"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Mana", "dp": true, "better": 1, "matchers": [{"string": "#% of Physical Attack Damage Leeched as Mana"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_mana"], "explicit": ["explicit.stat_3237948413", "explicit.stat_669069897"], "implicit": ["implicit.stat_3237948413", "implicit.stat_669069897"], "fractured": ["fractured.stat_3237948413", "fractured.stat_669069897"], "enchant": ["enchant.stat_669069897"], "scourge": ["scourge.stat_3237948413"], "crafted": ["crafted.stat_3237948413", "crafted.stat_669069897"]}}}
|
||||
{"ref": "#% increased Mana Regeneration Rate", "better": 1, "matchers": [{"string": "#% increased Mana Regeneration Rate"}, {"string": "#% reduced Mana Regeneration Rate", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_mana_regen"], "explicit": ["explicit.stat_789117908"], "implicit": ["implicit.stat_789117908"], "fractured": ["fractured.stat_789117908"], "scourge": ["scourge.stat_789117908"], "crafted": ["crafted.stat_789117908"]}}}
|
||||
@@ -1,292 +0,0 @@
|
||||
{"ref": "# Crafted Modifiers", "better": 1, "matchers": [{"string": "# ремесленных свойств "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_crafted_mods"]}}}
|
||||
{"ref": "# Crafted Prefix Modifiers", "better": 1, "matchers": [{"string": "# ремесленных свойств-префиксов "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_crafted_prefix_mods"]}}}
|
||||
{"ref": "# Crafted Suffix Modifiers", "better": 1, "matchers": [{"string": "# ремесленных свойств-суффиксов "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_crafted_suffix_mods"]}}}
|
||||
{"ref": "# Empty Modifiers", "better": 1, "matchers": [{"string": "# Пустые свойства "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_empty_affix_mods"]}}}
|
||||
{"ref": "# Empty Prefix Modifiers", "better": 1, "matchers": [{"string": "# Пустые свойства-префиксы "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_empty_prefix_mods"]}}}
|
||||
{"ref": "# Empty Suffix Modifiers", "better": 1, "matchers": [{"string": "# Пустые свойства-суффиксы "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_empty_suffix_mods"]}}}
|
||||
{"ref": "# Enchant Modifiers", "better": 1, "matchers": [{"string": "# зачарованных свойств "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_enchant_mods"]}}}
|
||||
{"ref": "# Fractured Modifiers", "better": 1, "matchers": [{"string": "# Расколотые свойства "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_fractured_mods"]}}}
|
||||
{"ref": "# Implicit Modifiers", "better": 1, "matchers": [{"string": "# собственных свойств "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_implicit_mods"]}}}
|
||||
{"ref": "# Life Regenerated per Second", "better": 1, "matchers": [{"string": "Регенерация # здоровья в секунду "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life_regen"]}}}
|
||||
{"ref": "# Modifiers", "better": 1, "matchers": [{"string": "# Свойств "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_affix_mods"]}}}
|
||||
{"ref": "# Notable Passive Skills", "better": 1, "matchers": [{"string": "# Значимое пассивное умение "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_notable_passive_skills"]}}}
|
||||
{"ref": "# Prefix Modifiers", "better": 1, "matchers": [{"string": "# Свойств-префиксов "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_prefix_mods"]}}}
|
||||
{"ref": "# Suffix Modifiers", "better": 1, "matchers": [{"string": "# Свойств-суффиксов "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_number_of_suffix_mods"]}}}
|
||||
{"ref": "# total Elemental Resistances", "better": 1, "matchers": [{"string": "всего # сопротивления стихиям "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_count_elemental_resistances"]}}}
|
||||
{"ref": "# total Resistances", "better": 1, "matchers": [{"string": "всего # сопротивления "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_count_resistances"]}}}
|
||||
{"ref": "#% Base Defence Percentile", "better": 1, "matchers": [{"string": "#% процента базовой защиты "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_base_defence_percentile"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Atlas Memories", "better": 1, "matchers": [{"string": "#% шанс преобразования выпавших карт в воспоминания Атласа "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_memory_line"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Conqueror Maps", "better": 1, "matchers": [{"string": "#% шанс преобразования выпавших карт в карты Завоевателей "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_conqueror_map"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Elder Maps", "better": 1, "matchers": [{"string": "#% шанс преобразования выпавших карт в карты Древнего "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_elder_map"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Maven Invitations", "better": 1, "matchers": [{"string": "#% шанс преобразования выпавших карт в приглашения Мейвен "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_maven_invitation"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Scarabs", "better": 1, "matchers": [{"string": "#% шанс выпадения карт в виде скарабеев "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_scarab"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Shaper Maps", "better": 1, "matchers": [{"string": "#% шанс преобразования выпавших карт в карты Создателя "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_shaper_map"]}}}
|
||||
{"ref": "#% chance for dropped Maps to convert to Unique Maps", "better": 1, "matchers": [{"string": "#% шанс преобразования выпавших карт в уникальные карты "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_conversion_unique_map"]}}}
|
||||
{"ref": "#% increased Burning Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от горения"}, {"string": "#% уменьшение урона от горения", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_burning_damage"], "explicit": ["explicit.stat_1175385867"], "implicit": ["implicit.stat_1175385867"], "fractured": ["fractured.stat_1175385867"]}}}
|
||||
{"ref": "#% increased Cold Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от холода"}, {"string": "#% уменьшение урона от холода", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_damage"], "explicit": ["explicit.stat_3291658075"], "implicit": ["implicit.stat_3291658075"], "fractured": ["fractured.stat_3291658075"], "scourge": ["scourge.stat_3291658075"], "crafted": ["crafted.stat_3291658075"]}}}
|
||||
{"ref": "#% increased Cold Damage with Attack Skills", "better": 1, "matchers": [{"string": "#% увеличение урона от холода от умений атак"}, {"string": "#% уменьшение урона от холода от умений атак", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_damage_with_attack_skills"], "explicit": ["explicit.stat_860668586"], "implicit": ["implicit.stat_860668586"]}}}
|
||||
{"ref": "#% increased Cold Spell Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от холода чарами "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_spell_damage"]}}}
|
||||
{"ref": "#% increased Elemental Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от стихий"}, {"string": "#% уменьшение урона от стихий", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage"], "explicit": ["explicit.stat_3141070085"], "implicit": ["implicit.stat_3141070085"], "fractured": ["fractured.stat_3141070085"], "enchant": ["enchant.stat_692420067"], "scourge": ["scourge.stat_3141070085"]}}}
|
||||
{"ref": "#% increased Elemental Damage with Attack Skills", "better": 1, "matchers": [{"string": "#% увеличение урона от стихий от умений атак"}, {"string": "#% уменьшение урона от стихий от умений атак", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage_with_attack_skills"], "explicit": ["explicit.stat_387439868"], "implicit": ["implicit.stat_387439868"], "fractured": ["fractured.stat_387439868"], "scourge": ["scourge.stat_387439868"], "crafted": ["crafted.stat_387439868"]}}}
|
||||
{"ref": "#% increased Fire Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от огня"}, {"string": "#% уменьшение урона от огня", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_damage"], "explicit": ["explicit.stat_3962278098"], "implicit": ["implicit.stat_3962278098"], "fractured": ["fractured.stat_3962278098"], "scourge": ["scourge.stat_3962278098"], "crafted": ["crafted.stat_3962278098"]}}}
|
||||
{"ref": "#% increased Fire Damage with Attack Skills", "better": 1, "matchers": [{"string": "#% увеличение урона от огня от умений атак"}, {"string": "#% уменьшение урона от огня от умений атак", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_damage_with_attack_skills"], "implicit": ["implicit.stat_2468413380"]}}}
|
||||
{"ref": "#% increased Fire Spell Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от огня чарами "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_spell_damage"]}}}
|
||||
{"ref": "#% increased Lightning Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от молнии"}, {"string": "#% уменьшение урона от молнии", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_damage"], "explicit": ["explicit.stat_2231156303"], "implicit": ["implicit.stat_2231156303"], "fractured": ["fractured.stat_2231156303"], "scourge": ["scourge.stat_2231156303"], "crafted": ["crafted.stat_2231156303"]}}}
|
||||
{"ref": "#% increased Lightning Damage with Attack Skills", "better": 1, "matchers": [{"string": "#% увеличение урона от молнии от умений атак"}, {"string": "#% уменьшение урона от молнии от умений атак", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_damage_with_attack_skills"], "explicit": ["explicit.stat_4208907162"], "implicit": ["implicit.stat_4208907162"]}}}
|
||||
{"ref": "#% increased Lightning Spell Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от молнии чарами "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_spell_damage"]}}}
|
||||
{"ref": "#% increased Mana Regeneration Rate", "better": 1, "matchers": [{"string": "#% повышение скорости регенерации маны"}, {"string": "#% снижение скорости регенерации маны", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_mana_regen"], "explicit": ["explicit.stat_789117908"], "implicit": ["implicit.stat_789117908"], "fractured": ["fractured.stat_789117908"], "scourge": ["scourge.stat_789117908"], "crafted": ["crafted.stat_789117908"]}}}
|
||||
{"ref": "#% increased Movement Speed", "better": 1, "matchers": [{"string": "#% повышение скорости передвижения"}, {"string": "#% снижение скорости передвижения", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_movement_speed"], "explicit": ["explicit.stat_2250533757"], "implicit": ["implicit.stat_2250533757"], "fractured": ["fractured.stat_2250533757"], "enchant": ["enchant.stat_2250533757"], "scourge": ["scourge.stat_2250533757"], "crafted": ["crafted.stat_2250533757"]}}}
|
||||
{"ref": "#% increased Rarity of Items found", "better": 1, "matchers": [{"string": "#% повышение редкости найденных предметов"}, {"string": "#% снижение редкости найденных предметов", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_rarity"], "explicit": ["explicit.stat_3917489142"], "implicit": ["implicit.stat_3917489142"], "fractured": ["fractured.stat_3917489142"], "scourge": ["scourge.stat_3917489142"], "crafted": ["crafted.stat_3917489142"]}}}
|
||||
{"ref": "#% increased Spell Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от чар"}, {"string": "#% уменьшение урона от чар", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_spell_damage"], "explicit": ["explicit.stat_2974417149"], "implicit": ["implicit.stat_2974417149"], "fractured": ["fractured.stat_2974417149"], "enchant": ["enchant.stat_2974417149"], "scourge": ["scourge.stat_2974417149"], "crafted": ["crafted.stat_2974417149"]}}}
|
||||
{"ref": "#% of Life Regenerated per Second", "better": 1, "matchers": [{"string": "Регенерация #% здоровья в секунду "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_percent_life_regen"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Life", "dp": true, "better": 1, "matchers": [{"string": "#% физического урона от атак похищается в виде здоровья"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_life"], "explicit": ["explicit.stat_3593843976", "explicit.stat_55876295"], "implicit": ["implicit.stat_3593843976", "implicit.stat_55876295"], "fractured": ["fractured.stat_3593843976", "fractured.stat_55876295"], "scourge": ["scourge.stat_3593843976"], "crafted": ["crafted.stat_3593843976", "crafted.stat_55876295"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Mana", "dp": true, "better": 1, "matchers": [{"string": "#% физического урона от атак похищается в виде маны"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_mana"], "explicit": ["explicit.stat_3237948413", "explicit.stat_669069897"], "implicit": ["implicit.stat_3237948413", "implicit.stat_669069897"], "fractured": ["fractured.stat_3237948413", "fractured.stat_669069897"], "enchant": ["enchant.stat_669069897"], "scourge": ["scourge.stat_3237948413"], "crafted": ["crafted.stat_3237948413", "crafted.stat_669069897"]}}}
|
||||
{"ref": "#% total increased maximum Energy Shield", "better": 1, "matchers": [{"string": "Всего #% повышения энергетического щита "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_energy_shield"]}}}
|
||||
{"ref": "#% total increased Physical Damage", "better": 1, "matchers": [{"string": "Всего +#% к увеличению физического урона "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_physical_damage"]}}}
|
||||
{"ref": "+# total maximum Energy Shield", "better": 1, "matchers": [{"string": "Всего +# к максимуму энергетического щита "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_energy_shield"]}}}
|
||||
{"ref": "+# total maximum Life", "better": 1, "matchers": [{"string": "Всего +# к максимуму здоровья "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life"]}}}
|
||||
{"ref": "+# total maximum Mana", "better": 1, "matchers": [{"string": "Всего +# к максимуму маны "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_mana"]}}}
|
||||
{"ref": "+# total to all Attributes", "better": 1, "matchers": [{"string": "Всего +# ко всем характеристикам "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_all_attributes"]}}}
|
||||
{"ref": "+# total to Dexterity", "better": 1, "matchers": [{"string": "Всего +# к ловкости "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_dexterity"]}}}
|
||||
{"ref": "+# total to Intelligence", "better": 1, "matchers": [{"string": "Всего +# к интеллекту "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_intelligence"]}}}
|
||||
{"ref": "+# total to Level of Socketed Aura Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней аур "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_aura_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Bow Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней луков "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_bow_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Chaos Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней хаоса "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_chaos_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Cold Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней холода "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_cold_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Curse Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней проклятий "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_curse_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Dexterity Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней ловкости "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_dexterity_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Elemental Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней стихий "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_elemental_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Fire Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней огня "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_fire_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Golem Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней големов "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_golem_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Intelligence Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней интеллекта "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_intelligence_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Lightning Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней молнии "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_lightning_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Melee Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней ближнего боя "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_melee_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Minion Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней приспешников "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_minion_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Movement Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней передвижения "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_movement_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Projectile Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней снарядов "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_projectile_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Skill Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней умений "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_skill_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Spell Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней чар "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_spell_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Strength Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней силы "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_strength_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Support Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней поддержки "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_support_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Vaal Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней ваал "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_vaal_gem_levels"]}}}
|
||||
{"ref": "+# total to Level of Socketed Warcry Gems", "better": 1, "matchers": [{"string": "Всего +# к уровню размещённых камней боевых кличей "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_additional_warcry_gem_levels"]}}}
|
||||
{"ref": "+# total to Strength", "better": 1, "matchers": [{"string": "Всего +# к силе "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_strength"]}}}
|
||||
{"ref": "+#% Global Critical Strike Chance", "better": 1, "matchers": [{"string": "Всего +#% к глобальному шансу критического удара "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_chance"]}}}
|
||||
{"ref": "+#% Global Critical Strike Multiplier", "better": 1, "matchers": [{"string": "Всего +#% к множителю критического удара "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_multiplier"]}}}
|
||||
{"ref": "+#% total Attack Speed", "better": 1, "matchers": [{"string": "Всего +#% к скорости атаки "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_attack_speed"]}}}
|
||||
{"ref": "+#% total Cast Speed", "better": 1, "matchers": [{"string": "Всего +#% к скорости сотворения чар "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cast_speed"]}}}
|
||||
{"ref": "+#% total Critical Strike Chance for Spells", "better": 1, "matchers": [{"string": "Всего +#% к шансу критического удара чарами "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_critical_strike_chance_for_spells"]}}}
|
||||
{"ref": "+#% total Elemental Resistance", "better": 1, "matchers": [{"string": "Всего +#% сопротивления стихиям "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_elemental_resistance"]}}}
|
||||
{"ref": "+#% total Resistance", "better": 1, "matchers": [{"string": "Всего +#% сопротивления "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_resistance"]}}}
|
||||
{"ref": "+#% total to all Elemental Resistances", "better": 1, "matchers": [{"string": "Всего +#% к сопротивлению всем стихиям "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_all_elemental_resistances"]}}}
|
||||
{"ref": "+#% total to Chaos Resistance", "better": 1, "matchers": [{"string": "Всего +#% к сопротивлению хаосу "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_chaos_resistance"]}}}
|
||||
{"ref": "+#% total to Cold Resistance", "better": 1, "matchers": [{"string": "Всего +#% к сопротивлению холоду "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cold_resistance"]}}}
|
||||
{"ref": "+#% total to Fire Resistance", "better": 1, "matchers": [{"string": "Всего +#% к сопротивлению огню "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_fire_resistance"]}}}
|
||||
{"ref": "+#% total to Lightning Resistance", "better": 1, "matchers": [{"string": "Всего +#% к сопротивлению молнии "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_lightning_resistance"]}}}
|
||||
{"ref": "Adds # to # Chaos Damage", "better": 1, "matchers": [{"string": "Добавляет от # до # урона хаосом"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_chaos_damage"], "explicit": ["explicit.stat_2223678961", "explicit.stat_3531280422"], "implicit": ["implicit.stat_2223678961", "implicit.stat_3531280422"], "fractured": ["fractured.stat_2223678961"], "enchant": ["enchant.stat_2223678961"], "scourge": ["scourge.stat_2223678961"]}}}
|
||||
{"ref": "Adds # to # Chaos Damage to Attacks", "better": 1, "matchers": [{"string": "Добавляет от # до # урона хаосом к атакам"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_chaos_damage_to_attacks"], "explicit": ["explicit.stat_674553446"], "implicit": ["implicit.stat_674553446"], "fractured": ["fractured.stat_674553446"], "crafted": ["crafted.stat_674553446"]}}}
|
||||
{"ref": "Adds # to # Chaos Damage to Spells", "better": 1, "matchers": [{"string": "Добавляет от # до # урона хаосом к чарам"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_chaos_damage_to_spells"], "explicit": ["explicit.stat_2300399854"], "implicit": ["implicit.stat_2300399854"], "fractured": ["fractured.stat_2300399854"]}}}
|
||||
{"ref": "Adds # to # Cold Damage", "better": 1, "matchers": [{"string": "Добавляет от # до # урона от холода"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_cold_damage"], "explicit": ["explicit.stat_1037193709", "explicit.stat_2387423236"], "implicit": ["implicit.stat_1037193709", "implicit.stat_2387423236"], "fractured": ["fractured.stat_1037193709", "fractured.stat_2387423236"], "enchant": ["enchant.stat_1037193709"], "scourge": ["scourge.stat_1037193709"], "crafted": ["crafted.stat_1037193709", "crafted.stat_2387423236"]}}}
|
||||
{"ref": "Adds # to # Cold Damage to Attacks", "better": 1, "matchers": [{"string": "Добавляет от # до # урона от холода к атакам"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_cold_damage_to_attacks"], "explicit": ["explicit.stat_4067062424"], "implicit": ["implicit.stat_4067062424"], "fractured": ["fractured.stat_4067062424"], "crafted": ["crafted.stat_4067062424"]}}}
|
||||
{"ref": "Adds # to # Cold Damage to Spells", "better": 1, "matchers": [{"string": "Добавляет от # до # урона от холода к чарам"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_cold_damage_to_spells"], "explicit": ["explicit.stat_2469416729"], "implicit": ["implicit.stat_2469416729"], "fractured": ["fractured.stat_2469416729"], "scourge": ["scourge.stat_2469416729"], "crafted": ["crafted.stat_2469416729"]}}}
|
||||
{"ref": "Adds # to # Damage", "better": 1, "matchers": [{"string": "Добавляет от # до # урона "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_damage"]}}}
|
||||
{"ref": "Adds # to # Damage to Attacks", "better": 1, "matchers": [{"string": "Добавляет от # до # урона к атакам "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_damage_to_attacks"]}}}
|
||||
{"ref": "Adds # to # Damage to Spells", "better": 1, "matchers": [{"string": "Добавляет от # до # урона к чарам "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_damage_to_spells"]}}}
|
||||
{"ref": "Adds # to # Elemental Damage", "better": 1, "matchers": [{"string": "Добавляет от # до # урона от стихий "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_elemental_damage"]}}}
|
||||
{"ref": "Adds # to # Elemental Damage to Attacks", "better": 1, "matchers": [{"string": "Добавляет от # до # урона от стихий к атакам "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_elemental_damage_to_attacks"]}}}
|
||||
{"ref": "Adds # to # Elemental Damage to Spells", "better": 1, "matchers": [{"string": "Добавляет от # до # урона от стихий к чарам "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_elemental_damage_to_spells"]}}}
|
||||
{"ref": "Adds # to # Fire Damage", "better": 1, "matchers": [{"string": "Добавляет от # до # урона от огня"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_fire_damage"], "explicit": ["explicit.stat_321077055", "explicit.stat_709508406"], "implicit": ["implicit.stat_321077055", "implicit.stat_709508406"], "fractured": ["fractured.stat_321077055", "fractured.stat_709508406"], "enchant": ["enchant.stat_709508406"], "scourge": ["scourge.stat_709508406"], "crafted": ["crafted.stat_321077055", "crafted.stat_709508406"]}}}
|
||||
{"ref": "Adds # to # Fire Damage to Attacks", "better": 1, "matchers": [{"string": "Добавляет от # до # урона от огня к атакам"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_fire_damage_to_attacks"], "explicit": ["explicit.stat_1573130764"], "implicit": ["implicit.stat_1573130764"], "fractured": ["fractured.stat_1573130764"], "crafted": ["crafted.stat_1573130764"]}}}
|
||||
{"ref": "Adds # to # Fire Damage to Spells", "better": 1, "matchers": [{"string": "Добавляет от # до # урона от огня к чарам"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_fire_damage_to_spells"], "explicit": ["explicit.stat_1133016593"], "implicit": ["implicit.stat_1133016593"], "fractured": ["fractured.stat_1133016593"], "scourge": ["scourge.stat_1133016593"], "crafted": ["crafted.stat_1133016593"]}}}
|
||||
{"ref": "Adds # to # Lightning Damage", "better": 1, "matchers": [{"string": "Добавляет от # до # урона от молнии"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_lightning_damage"], "explicit": ["explicit.stat_1334060246", "explicit.stat_3336890334"], "implicit": ["implicit.stat_1334060246", "implicit.stat_3336890334"], "fractured": ["fractured.stat_1334060246", "fractured.stat_3336890334"], "enchant": ["enchant.stat_3336890334"], "scourge": ["scourge.stat_3336890334"], "crafted": ["crafted.stat_1334060246", "crafted.stat_3336890334"]}}}
|
||||
{"ref": "Adds # to # Lightning Damage to Attacks", "better": 1, "matchers": [{"string": "Добавляет от # до # урона от молнии к атакам"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_lightning_damage_to_attacks"], "explicit": ["explicit.stat_1754445556"], "implicit": ["implicit.stat_1754445556"], "fractured": ["fractured.stat_1754445556"], "crafted": ["crafted.stat_1754445556"]}}}
|
||||
{"ref": "Adds # to # Lightning Damage to Spells", "better": 1, "matchers": [{"string": "Добавляет от # до # урона от молнии к чарам"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_lightning_damage_to_spells"], "explicit": ["explicit.stat_2831165374"], "implicit": ["implicit.stat_2831165374"], "fractured": ["fractured.stat_2831165374"], "scourge": ["scourge.stat_2831165374"], "crafted": ["crafted.stat_2831165374"]}}}
|
||||
{"ref": "Adds # to # Physical Damage", "better": 1, "matchers": [{"string": "Добавляет от # до # физического урона"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_physical_damage"], "explicit": ["explicit.stat_1940865751", "explicit.stat_960081730"], "implicit": ["implicit.stat_1940865751"], "fractured": ["fractured.stat_1940865751", "fractured.stat_960081730"], "scourge": ["scourge.stat_1940865751"], "crafted": ["crafted.stat_1940865751"]}}}
|
||||
{"ref": "Adds # to # Physical Damage to Attacks", "better": 1, "matchers": [{"string": "Добавляет от # до # физического урона к атакам"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_physical_damage_to_attacks"], "explicit": ["explicit.stat_3032590688"], "implicit": ["implicit.stat_3032590688"], "fractured": ["fractured.stat_3032590688"], "crafted": ["crafted.stat_3032590688"]}}}
|
||||
{"ref": "Adds # to # Physical Damage to Spells", "better": 1, "matchers": [{"string": "Добавляет от # до # физического урона к чарам"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_adds_physical_damage_to_spells"], "explicit": ["explicit.stat_2435536961"], "implicit": ["implicit.stat_2435536961"], "fractured": ["fractured.stat_2435536961"], "scourge": ["scourge.stat_2435536961"]}}}
|
||||
{"ref": "Has # Influences", "better": 1, "matchers": [{"string": "Имеет # влияний "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_influence_count"]}}}
|
||||
{"ref": "Has Crusader Influence", "better": 1, "matchers": [{"string": "Имеет влияние Крестоносца "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_crusader_influence"]}}}
|
||||
{"ref": "Has Elder Influence", "better": 1, "matchers": [{"string": "Имеет влияние Древнего "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_elder_influence"]}}}
|
||||
{"ref": "Has Hunter Influence", "better": 1, "matchers": [{"string": "Имеет влияние Охотника "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_hunter_influence"]}}}
|
||||
{"ref": "Has Logbook Area: Battleground Graves", "better": 1, "matchers": [{"string": "Содержит область журнала: Захоронение на поле боя "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_battleground_graves"]}}}
|
||||
{"ref": "Has Logbook Area: Bluffs", "better": 1, "matchers": [{"string": "Содержит область журнала: Откосы "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_bluffs"]}}}
|
||||
{"ref": "Has Logbook Area: Cemetery", "better": 1, "matchers": [{"string": "Содержит область журнала: Погост "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_cemetery"]}}}
|
||||
{"ref": "Has Logbook Area: Desert Ruins", "better": 1, "matchers": [{"string": "Содержит область журнала: Пустынные руины "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_desert_ruins"]}}}
|
||||
{"ref": "Has Logbook Area: Dried Riverbed", "better": 1, "matchers": [{"string": "Содержит область журнала: Высохшее русло "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_dried_riverbed"]}}}
|
||||
{"ref": "Has Logbook Area: Forest Ruins", "better": 1, "matchers": [{"string": "Содержит область журнала: Развалины в лесу "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_forest_ruins"]}}}
|
||||
{"ref": "Has Logbook Area: Karui Wargraves", "better": 1, "matchers": [{"string": "Содержит область журнала: Могилы воинов каруи "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_karui_wargraves"]}}}
|
||||
{"ref": "Has Logbook Area: Mountainside", "better": 1, "matchers": [{"string": "Содержит область журнала: Горный склон "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_mountainside"]}}}
|
||||
{"ref": "Has Logbook Area: Rotting Temple", "better": 1, "matchers": [{"string": "Содержит область журнала: Гниющий храм "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_rotting_temple"]}}}
|
||||
{"ref": "Has Logbook Area: Sarn Slums", "better": 1, "matchers": [{"string": "Содержит область журнала: Трущобы Сарна "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_sarn_slums"]}}}
|
||||
{"ref": "Has Logbook Area: Scrublands", "better": 1, "matchers": [{"string": "Содержит область журнала: Заросли кустарника "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_scrublands"]}}}
|
||||
{"ref": "Has Logbook Area: Shipwreck Reef", "better": 1, "matchers": [{"string": "Содержит область журнала: Риф разбитых кораблей "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_shipwreck_reef"]}}}
|
||||
{"ref": "Has Logbook Area: Utzaal Outskirts", "better": 1, "matchers": [{"string": "Содержит область журнала: Окраины Утцааля "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_utzaal_outskirts"]}}}
|
||||
{"ref": "Has Logbook Area: Vaal Temple", "better": 1, "matchers": [{"string": "Содержит область журнала: Храм ваал "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_vaal_temple"]}}}
|
||||
{"ref": "Has Logbook Area: Volcanic Island", "better": 1, "matchers": [{"string": "Содержит область журнала: Вулканический остров "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_area_volcano"]}}}
|
||||
{"ref": "Has Logbook Faction: Black Scythe Mercenaries", "better": 0, "matchers": [{"string": "Наёмники Чёрной косы"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_mercenaries"]}}}
|
||||
{"ref": "Has Logbook Faction: Druids of the Broken Circle", "better": 0, "matchers": [{"string": "Друиды Разомкнутого круга"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_druids"]}}}
|
||||
{"ref": "Has Logbook Faction: Knights of the Sun", "better": 0, "matchers": [{"string": "Рыцари Солнца"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_knights"]}}}
|
||||
{"ref": "Has Logbook Faction: Order of the Chalice", "better": 0, "matchers": [{"string": "Орден Чаши"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_logbook_faction_order"]}}}
|
||||
{"ref": "Has Redeemer Influence", "better": 1, "matchers": [{"string": "Имеет влияние Избавительницы "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_redeemer_influence"]}}}
|
||||
{"ref": "Has Room: Antechamber", "better": 0, "matchers": [{"string": "Прихожая"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_antechamber"]}, "option": true}}
|
||||
{"ref": "Has Room: Apex of Ascension (Tier 3)", "better": 0, "matchers": [{"string": "Пик вознесения (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_sacrifice_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Apex of Atzoatl", "better": 0, "matchers": [{"string": "Вершина Ацоатля"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_apex"]}, "option": true}}
|
||||
{"ref": "Has Room: Arena of Valour (Tier 2)", "better": 0, "matchers": [{"string": "Арена доблести (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_weapon_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Armourer's Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Мастерская оружейника (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_armour_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Armoury (Tier 2)", "better": 0, "matchers": [{"string": "Оружейная (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_armour_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Atlas of Worlds (Tier 3)", "better": 0, "matchers": [{"string": "Атлас миров (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cartography_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Automaton Lab (Tier 2)", "better": 0, "matchers": [{"string": "Лаборатория автоматов (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_minions_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Banquet Hall", "better": 0, "matchers": [{"string": "Зал пиршеств"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_banquet_hall"]}, "option": true}}
|
||||
{"ref": "Has Room: Barracks (Tier 2)", "better": 0, "matchers": [{"string": "Казармы (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breeding_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Breach Containment Chamber (Tier 2)", "better": 0, "matchers": [{"string": "Изолятор разломов (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breach_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Catalyst of Corruption (Tier 2)", "better": 0, "matchers": [{"string": "Ускоритель осквернения (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_corruption_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Cellar", "better": 0, "matchers": [{"string": "Подвал"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cellar"]}, "option": true}}
|
||||
{"ref": "Has Room: Chamber of Iron (Tier 3)", "better": 0, "matchers": [{"string": "Железный зал (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_armour_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Chasm", "better": 0, "matchers": [{"string": "Расселина"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chasm_room"]}, "option": true}}
|
||||
{"ref": "Has Room: Cloister", "better": 0, "matchers": [{"string": "Галерея"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cloister"]}, "option": true}}
|
||||
{"ref": "Has Room: Conduit of Lightning (Tier 3)", "better": 0, "matchers": [{"string": "Проводник молний (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_lightning_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Corruption Chamber (Tier 1)", "better": 0, "matchers": [{"string": "Зал осквернения (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_corruption_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Court of Sealed Death (Tier 3)", "better": 0, "matchers": [{"string": "Двор запечатанной смерти (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_strongbox_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Crucible of Flame (Tier 3)", "better": 0, "matchers": [{"string": "Тигель пламени (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_fire_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Cultivar Chamber (Tier 2)", "better": 0, "matchers": [{"string": "Зал культивации (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_poison_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Defense Research Lab (Tier 3)", "better": 0, "matchers": [{"string": "Оборонная лаборатория (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trap_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Demolition Lab (Tier 2)", "better": 0, "matchers": [{"string": "Лаборатория сноса (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_explosives_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Department of Thaumaturgy (Tier 2)", "better": 0, "matchers": [{"string": "Отдел волшебства (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_gem_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Doryani's Institute (Tier 3)", "better": 0, "matchers": [{"string": "Аудитория Дориани (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_gem_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Engineering Department (Tier 2)", "better": 0, "matchers": [{"string": "Отдел механики (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_workshop_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Explosives Room (Tier 1)", "better": 0, "matchers": [{"string": "Комната взрывчатки (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_explosives_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Factory (Tier 3)", "better": 0, "matchers": [{"string": "Фабрика (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_workshop_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Flame Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Мастерская огней (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_fire_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Gemcutter's Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Мастерская камнереза (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_gem_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Glittering Halls (Tier 3)", "better": 0, "matchers": [{"string": "Сверкающие залы (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trinket_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Guardhouse (Tier 1)", "better": 0, "matchers": [{"string": "Караульная (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breeding_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Champions (Tier 3)", "better": 0, "matchers": [{"string": "Зал заступников (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_weapon_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Heroes (Tier 2)", "better": 0, "matchers": [{"string": "Зал героев (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_legion_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Legends (Tier 3)", "better": 0, "matchers": [{"string": "Зал легенд (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_legion_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Locks (Tier 2)", "better": 0, "matchers": [{"string": "Зал замков (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_strongbox_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Lords (Tier 2)", "better": 0, "matchers": [{"string": "Покои владык (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_queens_chambers_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Mettle (Tier 1)", "better": 0, "matchers": [{"string": "Зал храбрецов (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_legion_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of Offerings (Tier 2)", "better": 0, "matchers": [{"string": "Зал подношений (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_sacrifice_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hall of War (Tier 3)", "better": 0, "matchers": [{"string": "Зал войны (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breeding_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Halls", "better": 0, "matchers": [{"string": "Коридоры"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_halls"]}, "option": true}}
|
||||
{"ref": "Has Room: Hatchery (Tier 1)", "better": 0, "matchers": [{"string": "Питомник (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_minions_1"]}, "option": true}}
|
||||
{"ref": "Has Room: House of the Others (Tier 3)", "better": 0, "matchers": [{"string": "Дом Иных (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breach_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Hurricane Engine (Tier 2)", "better": 0, "matchers": [{"string": "Механизм ураганов (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_storm_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Hybridisation Chamber (Tier 3)", "better": 0, "matchers": [{"string": "Зал гибридизации (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_minions_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Jeweller's Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Мастерская ювелира (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trinket_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Jewellery Forge (Tier 2)", "better": 0, "matchers": [{"string": "Горн ювелира (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trinket_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Lightning Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Мастерская гроз (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_lightning_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Locus of Corruption (Tier 3)", "better": 0, "matchers": [{"string": "Очаг осквернения (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_corruption_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Museum of Artefacts (Tier 3)", "better": 0, "matchers": [{"string": "Музей артефактов (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chests_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Office of Cartography (Tier 2)", "better": 0, "matchers": [{"string": "Кабинет картографии (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cartography_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Omnitect Forge (Tier 2)", "better": 0, "matchers": [{"string": "Горн Всезодчего (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_fire_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Omnitect Reactor Plant (Tier 2)", "better": 0, "matchers": [{"string": "Реактор Всезодчего (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_boss_lightning_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Passageways", "better": 0, "matchers": [{"string": "Переходы"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_passageways"]}, "option": true}}
|
||||
{"ref": "Has Room: Pits", "better": 0, "matchers": [{"string": "Ямы"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_the_pits"]}, "option": true}}
|
||||
{"ref": "Has Room: Poison Garden (Tier 1)", "better": 0, "matchers": [{"string": "Ядовитый сад (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_poison_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Pools of Restoration (Tier 1)", "better": 0, "matchers": [{"string": "Купели восстановления (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_healing_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Royal Meeting Room (Tier 1)", "better": 0, "matchers": [{"string": "Царский зал аудиенций (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_queens_chambers_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Sacrificial Chamber (Tier 1)", "better": 0, "matchers": [{"string": "Жертвенный зал (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_sacrifice_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Sadist's Den (Tier 3)", "better": 0, "matchers": [{"string": "Логово садиста (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_torment_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Sanctum of Immortality (Tier 3)", "better": 0, "matchers": [{"string": "Святыня бессмертия (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_healing_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Sanctum of Unity (Tier 2)", "better": 0, "matchers": [{"string": "Святилище единения (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_empowering_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Sanctum of Vitality (Tier 2)", "better": 0, "matchers": [{"string": "Святилище жизни (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_healing_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Shrine of Empowerment (Tier 1)", "better": 0, "matchers": [{"string": "Алтарь усиления (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_empowering_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Shrine of Unmaking (Tier 3)", "better": 0, "matchers": [{"string": "Обитель развоплощения (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_explosives_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Sparring Room (Tier 1)", "better": 0, "matchers": [{"string": "Тренировочная комната (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_weapon_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Splinter Research Lab (Tier 1)", "better": 0, "matchers": [{"string": "Лаборатория изучения осколков (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_breach_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Storage Room (Tier 1)", "better": 0, "matchers": [{"string": "Кладовая (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chests_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Storm of Corruption (Tier 3)", "better": 0, "matchers": [{"string": "Буря осквернения (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_storm_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Strongbox Chamber (Tier 1)", "better": 0, "matchers": [{"string": "Запасник (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_strongbox_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Surveyor's Study (Tier 1)", "better": 0, "matchers": [{"string": "Кабинет топографа (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_cartography_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Tempest Generator (Tier 1)", "better": 0, "matchers": [{"string": "Генератор бурь (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_storm_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Temple Defense Workshop (Tier 2)", "better": 0, "matchers": [{"string": "Цех храмовой защиты (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trap_room_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Temple Nexus (Tier 3)", "better": 0, "matchers": [{"string": "Средоточие храма (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_empowering_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Throne of Atziri (Tier 3)", "better": 0, "matchers": [{"string": "Трон Атзири (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_queens_chambers_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Tombs", "better": 0, "matchers": [{"string": "Усыпальницы"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_tombs"]}, "option": true}}
|
||||
{"ref": "Has Room: Torment Cells (Tier 1)", "better": 0, "matchers": [{"string": "Клети мучений (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_torment_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Torture Cages (Tier 2)", "better": 0, "matchers": [{"string": "Камеры пыток (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_torment_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Toxic Grove (Tier 3)", "better": 0, "matchers": [{"string": "Ядовитая роща (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_poison_room_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Trap Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Мастерская ловушек (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_trap_room_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Treasury (Tier 2)", "better": 0, "matchers": [{"string": "Сокровищница (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_currency_vault_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Tunnels", "better": 0, "matchers": [{"string": "Тоннели"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_tunnels"]}, "option": true}}
|
||||
{"ref": "Has Room: Vault (Tier 1)", "better": 0, "matchers": [{"string": "Хранилище (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_currency_vault_1"]}, "option": true}}
|
||||
{"ref": "Has Room: Warehouses (Tier 2)", "better": 0, "matchers": [{"string": "Склады (Уровень 2)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_chests_2"]}, "option": true}}
|
||||
{"ref": "Has Room: Wealth of the Vaal (Tier 3)", "better": 0, "matchers": [{"string": "Казна ваал (Уровень 3)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_currency_vault_3"]}, "option": true}}
|
||||
{"ref": "Has Room: Workshop (Tier 1)", "better": 0, "matchers": [{"string": "Мастерская (Уровень 1)"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_temple_workshop_1"]}, "option": true}}
|
||||
{"ref": "Has Shaper Influence", "better": 1, "matchers": [{"string": "Имеет влияние Создателя "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_shaper_influence"]}}}
|
||||
{"ref": "Has Warlord Influence", "better": 1, "matchers": [{"string": "Имеет влияние Вождя "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_has_warlord_influence"]}}}
|
||||
{"ref": "Mirrored Tablet has # Islands", "better": 1, "matchers": [{"string": "Зеркальная табличка имеет # островков "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_lake_number_of_islands"]}}}
|
||||
{"ref": "More Currency: #%", "better": 1, "matchers": [{"string": "Больше валюты: #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_currency_drops"]}}}
|
||||
{"ref": "More Divination Cards: #%", "better": 1, "matchers": [{"string": "Больше гадальных карт: #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_card_drops"]}}}
|
||||
{"ref": "More Maps: #%", "better": 1, "matchers": [{"string": "Больше карт: #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_map_drops"]}}}
|
||||
{"ref": "More Scarabs: #%", "better": 1, "matchers": [{"string": "Больше скарабеев: #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_more_scarab_drops"]}}}
|
||||
{"ref": "Quality (Attack Modifiers): #%", "better": 1, "matchers": [{"string": "Качество (свойства атак): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_attack_quality"]}}}
|
||||
{"ref": "Quality (Attribute Modifiers): #%", "better": 1, "matchers": [{"string": "Качество (свойства характеристик): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_attribute_quality"]}}}
|
||||
{"ref": "Quality (Caster Modifiers): #%", "better": 1, "matchers": [{"string": "Качество (свойства чар): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_caster_quality"]}}}
|
||||
{"ref": "Quality (Critical Modifiers): #%", "better": 1, "matchers": [{"string": "Качество (свойства критического удара): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_critical_quality"]}}}
|
||||
{"ref": "Quality (Currency): #%", "better": 1, "matchers": [{"string": "Качество (валюта): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_currency"]}}}
|
||||
{"ref": "Quality (Defence Modifiers): #%", "better": 1, "matchers": [{"string": "Качество (свойства защиты): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_defense_quality"]}}}
|
||||
{"ref": "Quality (Divination Cards): #%", "better": 1, "matchers": [{"string": "Качество (гадальные карты): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_cards"]}}}
|
||||
{"ref": "Quality (Elemental Damage Modifiers): #%", "better": 1, "matchers": [{"string": "Качество (свойства стихийного урона): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_elemental_quality"]}}}
|
||||
{"ref": "Quality (Life and Mana Modifiers): #%", "better": 1, "matchers": [{"string": "Качество (свойства здоровья и маны): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_resource_quality"]}}}
|
||||
{"ref": "Quality (Pack Size): #%", "better": 1, "matchers": [{"string": "Качество (размер групп монстров): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_pack_size"]}}}
|
||||
{"ref": "Quality (Physical and Chaos Damage Modifiers): #%", "better": 1, "matchers": [{"string": "Качество (свойства физического урона и урона хаосом): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_physical_chaos_quality"]}}}
|
||||
{"ref": "Quality (Rarity): #%", "better": 1, "matchers": [{"string": "Качество (редкость): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_rarity"]}}}
|
||||
{"ref": "Quality (Resistance Modifiers): #%", "better": 1, "matchers": [{"string": "Качество (свойства сопротивлений): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_resistance_quality"]}}}
|
||||
{"ref": "Quality (Scarabs): #%", "better": 1, "matchers": [{"string": "Качество (скарабеи): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_map_quality_scarabs"]}}}
|
||||
{"ref": "Quality (Speed Modifiers): #%", "better": 1, "matchers": [{"string": "Качество (свойства скорости): #% "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_jewellery_speed_quality"]}}}
|
||||
{"ref": "Reflection of Abyss (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Бездны (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_38892"]}}}
|
||||
{"ref": "Reflection of Ambush (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Засады (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_48307"]}}}
|
||||
{"ref": "Reflection of Angling (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Рыбалки (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_40794"]}}}
|
||||
{"ref": "Reflection of Azurite (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Лазурита (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_40031"]}}}
|
||||
{"ref": "Reflection of Bestiary (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Бестиария (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_55569"]}}}
|
||||
{"ref": "Reflection of Breach (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Разлома (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_62572"]}}}
|
||||
{"ref": "Reflection of Brutality (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Жестокости (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_29096"]}}}
|
||||
{"ref": "Reflection of Camaraderie (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Братства (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_35395"]}}}
|
||||
{"ref": "Reflection of Catalysis (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Катализа (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_57850"]}}}
|
||||
{"ref": "Reflection of Chaos (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Хаоса (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_50834"]}}}
|
||||
{"ref": "Reflection of Conflict (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Конфликта (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_1931"]}}}
|
||||
{"ref": "Reflection of Darkness (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Тьмы (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_34457"]}}}
|
||||
{"ref": "Reflection of Delirium (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Делириума (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_22138"]}}}
|
||||
{"ref": "Reflection of Delve (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Спуска (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_18737"]}}}
|
||||
{"ref": "Reflection of Demonfire (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Демонического пламени (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_28500"]}}}
|
||||
{"ref": "Reflection of Domination (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Господства (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_63412"]}}}
|
||||
{"ref": "Reflection of Entrapment (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Ловушек (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_44399"]}}}
|
||||
{"ref": "Reflection of Essence (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Сущности (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_49862"]}}}
|
||||
{"ref": "Reflection of Experimentation (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Экспериментов (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_55676"]}}}
|
||||
{"ref": "Reflection of Flame (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Пламени (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_42468"]}}}
|
||||
{"ref": "Reflection of Fractured Dimensions (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Расколотых измерений (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_49488"]}}}
|
||||
{"ref": "Reflection of Frost (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Мороза (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_38110"]}}}
|
||||
{"ref": "Reflection of Guilt (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Вины (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_25480"]}}}
|
||||
{"ref": "Reflection of Imprisonment (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Заточения (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_10363"]}}}
|
||||
{"ref": "Reflection of Kalandra (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Каландры (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_36591"]}}}
|
||||
{"ref": "Reflection of Legion (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Легиона (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_403"]}}}
|
||||
{"ref": "Reflection of Metamorph (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Метаморфа (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_3699"]}}}
|
||||
{"ref": "Reflection of Occultism (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Оккультизма (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_24451"]}}}
|
||||
{"ref": "Reflection of Paradise (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Рая (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_50846"]}}}
|
||||
{"ref": "Reflection of Perverted Faith (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Извращённой судьбы (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_27678"]}}}
|
||||
{"ref": "Reflection of Phaaryl (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Фаарила (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_7674"]}}}
|
||||
{"ref": "Reflection of Possession (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Одержимости (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_25049"]}}}
|
||||
{"ref": "Reflection of Power (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Силы (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_35950"]}}}
|
||||
{"ref": "Reflection of Scourge (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Нашествия (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_62360"]}}}
|
||||
{"ref": "Reflection of Stasis (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Стазиса (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_32968"]}}}
|
||||
{"ref": "Reflection of Sulphite (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Сульфита (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_45086"]}}}
|
||||
{"ref": "Reflection of the Black Scythe (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Чёрной косы (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_9662"]}}}
|
||||
{"ref": "Reflection of the Breachlord (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Повелителя Разлома (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_62935"]}}}
|
||||
{"ref": "Reflection of the Broken Circle (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Разомкнутого круга (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_43128"]}}}
|
||||
{"ref": "Reflection of the Chalice (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Чаши (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_64561"]}}}
|
||||
{"ref": "Reflection of the Chasm (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Пропасти (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_57101"]}}}
|
||||
{"ref": "Reflection of the Dream (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Грёз (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_27117"]}}}
|
||||
{"ref": "Reflection of the Harbingers (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Предвестников (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_37203"]}}}
|
||||
{"ref": "Reflection of the Hunter (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Охотника (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_18816"]}}}
|
||||
{"ref": "Reflection of the Monolith (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Монолита (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_34796"]}}}
|
||||
{"ref": "Reflection of the Nightmare (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Кошмара (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_24232"]}}}
|
||||
{"ref": "Reflection of the Storm (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Шторма (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_2745"]}}}
|
||||
{"ref": "Reflection of the Sun (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Солнца (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_60034"]}}}
|
||||
{"ref": "Reflection of the Trove (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Сокровищ (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_46772"]}}}
|
||||
{"ref": "Reflection of the Wilderness (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Дикого края (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_29224"]}}}
|
||||
{"ref": "Reflection of Thralldom (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Рабства (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_26813"]}}}
|
||||
{"ref": "Reflection of Torment (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Мучений (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_53950"]}}}
|
||||
{"ref": "Reflection of Tyranny (Difficulty #)", "better": 1, "matchers": [{"string": "Отражение Тирании (Сложность #) "}], "trade": {"ids": {"pseudo": ["pseudo.lake_60981"]}}}
|
||||
@@ -1,32 +0,0 @@
|
||||
{"ref": "# Life Regenerated per Second", "better": 1, "matchers": [{"string": "Регенерация # здоровья в секунду "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life_regen"]}}}
|
||||
{"ref": "#% increased Burning Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от горения"}, {"string": "#% уменьшение урона от горения", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_burning_damage"], "explicit": ["explicit.stat_1175385867"], "implicit": ["implicit.stat_1175385867"], "fractured": ["fractured.stat_1175385867"]}}}
|
||||
{"ref": "#% increased Cold Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от холода"}, {"string": "#% уменьшение урона от холода", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_damage"], "explicit": ["explicit.stat_3291658075"], "implicit": ["implicit.stat_3291658075"], "fractured": ["fractured.stat_3291658075"], "scourge": ["scourge.stat_3291658075"], "crafted": ["crafted.stat_3291658075"]}}}
|
||||
{"ref": "#% increased Cold Spell Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от холода чарами "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_cold_spell_damage"]}}}
|
||||
{"ref": "#% increased Elemental Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от стихий"}, {"string": "#% уменьшение урона от стихий", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage"], "explicit": ["explicit.stat_3141070085"], "implicit": ["implicit.stat_3141070085"], "fractured": ["fractured.stat_3141070085"], "enchant": ["enchant.stat_692420067"], "scourge": ["scourge.stat_3141070085"]}}}
|
||||
{"ref": "#% increased Elemental Damage with Attack Skills", "better": 1, "matchers": [{"string": "#% увеличение урона от стихий от умений атак"}, {"string": "#% уменьшение урона от стихий от умений атак", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_elemental_damage_with_attack_skills"], "explicit": ["explicit.stat_387439868"], "implicit": ["implicit.stat_387439868"], "fractured": ["fractured.stat_387439868"], "scourge": ["scourge.stat_387439868"], "crafted": ["crafted.stat_387439868"]}}}
|
||||
{"ref": "#% increased Fire Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от огня"}, {"string": "#% уменьшение урона от огня", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_damage"], "explicit": ["explicit.stat_3962278098"], "implicit": ["implicit.stat_3962278098"], "fractured": ["fractured.stat_3962278098"], "scourge": ["scourge.stat_3962278098"], "crafted": ["crafted.stat_3962278098"]}}}
|
||||
{"ref": "#% increased Fire Spell Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от огня чарами "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_fire_spell_damage"]}}}
|
||||
{"ref": "#% increased Lightning Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от молнии"}, {"string": "#% уменьшение урона от молнии", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_damage"], "explicit": ["explicit.stat_2231156303"], "implicit": ["implicit.stat_2231156303"], "fractured": ["fractured.stat_2231156303"], "scourge": ["scourge.stat_2231156303"], "crafted": ["crafted.stat_2231156303"]}}}
|
||||
{"ref": "#% increased Lightning Spell Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от молнии чарами "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_lightning_spell_damage"]}}}
|
||||
{"ref": "#% increased Mana Regeneration Rate", "better": 1, "matchers": [{"string": "#% повышение скорости регенерации маны"}, {"string": "#% снижение скорости регенерации маны", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_mana_regen"], "explicit": ["explicit.stat_789117908"], "implicit": ["implicit.stat_789117908"], "fractured": ["fractured.stat_789117908"], "scourge": ["scourge.stat_789117908"], "crafted": ["crafted.stat_789117908"]}}}
|
||||
{"ref": "#% increased Movement Speed", "better": 1, "matchers": [{"string": "#% повышение скорости передвижения"}, {"string": "#% снижение скорости передвижения", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_movement_speed"], "explicit": ["explicit.stat_2250533757"], "implicit": ["implicit.stat_2250533757"], "fractured": ["fractured.stat_2250533757"], "enchant": ["enchant.stat_2250533757"], "scourge": ["scourge.stat_2250533757"], "crafted": ["crafted.stat_2250533757"]}}}
|
||||
{"ref": "#% increased Spell Damage", "better": 1, "matchers": [{"string": "#% увеличение урона от чар"}, {"string": "#% уменьшение урона от чар", "negate": true}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_spell_damage"], "explicit": ["explicit.stat_2974417149"], "implicit": ["implicit.stat_2974417149"], "fractured": ["fractured.stat_2974417149"], "enchant": ["enchant.stat_2974417149"], "scourge": ["scourge.stat_2974417149"], "crafted": ["crafted.stat_2974417149"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Life", "dp": true, "better": 1, "matchers": [{"string": "#% физического урона от атак похищается в виде здоровья"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_life"], "explicit": ["explicit.stat_3593843976", "explicit.stat_55876295"], "implicit": ["implicit.stat_3593843976", "implicit.stat_55876295"], "fractured": ["fractured.stat_3593843976", "fractured.stat_55876295"], "scourge": ["scourge.stat_3593843976"], "crafted": ["crafted.stat_3593843976", "crafted.stat_55876295"]}}}
|
||||
{"ref": "#% of Physical Attack Damage Leeched as Mana", "dp": true, "better": 1, "matchers": [{"string": "#% физического урона от атак похищается в виде маны"}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_physical_attack_damage_leeched_as_mana"], "explicit": ["explicit.stat_3237948413", "explicit.stat_669069897"], "implicit": ["implicit.stat_3237948413", "implicit.stat_669069897"], "fractured": ["fractured.stat_3237948413", "fractured.stat_669069897"], "enchant": ["enchant.stat_669069897"], "scourge": ["scourge.stat_3237948413"], "crafted": ["crafted.stat_3237948413", "crafted.stat_669069897"]}}}
|
||||
{"ref": "#% total increased Physical Damage", "better": 1, "matchers": [{"string": "Всего +#% к увеличению физического урона "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_increased_physical_damage"]}}}
|
||||
{"ref": "+# total maximum Energy Shield", "better": 1, "matchers": [{"string": "Всего +# к максимуму энергетического щита "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_energy_shield"]}}}
|
||||
{"ref": "+# total maximum Life", "better": 1, "matchers": [{"string": "Всего +# к максимуму здоровья "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_life"]}}}
|
||||
{"ref": "+# total maximum Mana", "better": 1, "matchers": [{"string": "Всего +# к максимуму маны "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_mana"]}}}
|
||||
{"ref": "+# total to all Attributes", "better": 1, "matchers": [{"string": "Всего +# ко всем характеристикам "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_all_attributes"]}}}
|
||||
{"ref": "+# total to Dexterity", "better": 1, "matchers": [{"string": "Всего +# к ловкости "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_dexterity"]}}}
|
||||
{"ref": "+# total to Intelligence", "better": 1, "matchers": [{"string": "Всего +# к интеллекту "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_intelligence"]}}}
|
||||
{"ref": "+# total to Strength", "better": 1, "matchers": [{"string": "Всего +# к силе "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_strength"]}}}
|
||||
{"ref": "+#% Global Critical Strike Chance", "better": 1, "matchers": [{"string": "Всего +#% к глобальному шансу критического удара "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_chance"]}}}
|
||||
{"ref": "+#% Global Critical Strike Multiplier", "better": 1, "matchers": [{"string": "Всего +#% к множителю критического удара "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_global_critical_strike_multiplier"]}}}
|
||||
{"ref": "+#% total Attack Speed", "better": 1, "matchers": [{"string": "Всего +#% к скорости атаки "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_attack_speed"]}}}
|
||||
{"ref": "+#% total Cast Speed", "better": 1, "matchers": [{"string": "Всего +#% к скорости сотворения чар "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cast_speed"]}}}
|
||||
{"ref": "+#% total Elemental Resistance", "better": 1, "matchers": [{"string": "Всего +#% сопротивления стихиям "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_elemental_resistance"]}}}
|
||||
{"ref": "+#% total to Chaos Resistance", "better": 1, "matchers": [{"string": "Всего +#% к сопротивлению хаосу "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_chaos_resistance"]}}}
|
||||
{"ref": "+#% total to Cold Resistance", "better": 1, "matchers": [{"string": "Всего +#% к сопротивлению холоду "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_cold_resistance"]}}}
|
||||
{"ref": "+#% total to Fire Resistance", "better": 1, "matchers": [{"string": "Всего +#% к сопротивлению огню "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_fire_resistance"]}}}
|
||||
{"ref": "+#% total to Lightning Resistance", "better": 1, "matchers": [{"string": "Всего +#% к сопротивлению молнии "}], "trade": {"ids": {"pseudo": ["pseudo.pseudo_total_lightning_resistance"]}}}
|
||||
@@ -1,73 +0,0 @@
|
||||
|
||||
export interface StaticEntry {
|
||||
id: string;
|
||||
text: string;
|
||||
image?: string;
|
||||
}
|
||||
|
||||
export interface StaticItems {
|
||||
id: string;
|
||||
label: string | null;
|
||||
entries: StaticEntry[];
|
||||
}
|
||||
|
||||
export interface StatEntry {
|
||||
id: string;
|
||||
text: string;
|
||||
type: string;
|
||||
}
|
||||
|
||||
export interface StatCategory {
|
||||
id: string;
|
||||
label: string;
|
||||
entries: StatEntry[];
|
||||
}
|
||||
|
||||
export interface ItemEntry {
|
||||
type: string;
|
||||
text?: string;
|
||||
name?: string;
|
||||
flags?: {
|
||||
unique?: boolean;
|
||||
};
|
||||
disc?: string;
|
||||
}
|
||||
|
||||
export interface ItemCategory {
|
||||
id: string;
|
||||
label: string;
|
||||
entries: ItemEntry[]
|
||||
}
|
||||
|
||||
export interface FilterOption {
|
||||
id: string | null;
|
||||
text: string;
|
||||
}
|
||||
|
||||
export interface Filter {
|
||||
id: string;
|
||||
text: string;
|
||||
minMax?: boolean;
|
||||
fullSpan?: boolean;
|
||||
option?: {
|
||||
options: FilterOption[];
|
||||
};
|
||||
}
|
||||
|
||||
export interface FilterSection {
|
||||
id: string;
|
||||
title: string;
|
||||
hidden?: boolean;
|
||||
filters: Filter[];
|
||||
}
|
||||
|
||||
export interface ItemIcon {
|
||||
baseType: string;
|
||||
icon: string;
|
||||
unique?: string;
|
||||
}
|
||||
|
||||
export interface BulkItem{
|
||||
id: string;
|
||||
entries: StaticEntry[];
|
||||
}
|
||||