Compare commits

..

1 Commits

Author SHA1 Message Date
kvan7
7000dbc58c style(Update to 2): Update branding
Renamed to Exalted PoE2 Trade
2024-12-10 15:47:06 -06:00
237 changed files with 22875 additions and 397650 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

@@ -1,3 +1,4 @@
.DS_Store
node_modules
*/dist/**
@@ -25,5 +26,3 @@ yarn-error.log*
# vitepress
docs/.vitepress/dist
docs/.vitepress/cache
*.bin

View File

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

View File

@@ -1,28 +1,16 @@
# ![Exalted Orb](./renderer/public/images/exa.png) Exiled Exchange 2
# ![Exalted Orb](./renderer/public/icon.png) 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

View File

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

View File

@@ -1,15 +0,0 @@
---
title: Too Complex Query
---
This is the standard error message you will see for this error:
![complex](/reference-images/complex.png)
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.
![tradeButton](/reference-images/tradeButton.png)

View File

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

View File

@@ -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
![](https://imgur.com/HujBLLR.png)
- **I downloaded a zip with a bunch of files, but no .exe inside?**

View File

@@ -1,14 +0,0 @@
---
title: Common issues
---
This is the standard error message you will see for this error:
![invalid-json](/reference-images/jsonError.png)
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.

View File

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

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 591 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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: '物品类别: '
}]

View File

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

View File

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

File diff suppressed because it is too large Load Diff

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

View File

@@ -1,6 +0,0 @@
# Ignore artifacts:
build
coverage
dist
node_modules
public

View File

@@ -1 +1,7 @@
{}
{
"singleQuote": true,
"endOfLine": "lf",
"tabWidth": 2,
"useTabs": true,
"trailingComma": "es5"
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

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

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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");
}
})();

View File

@@ -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. */
}
}

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -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[];
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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[];
}

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