diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..801bfe9 --- /dev/null +++ b/build.xml @@ -0,0 +1,73 @@ + + Builds, tests, and runs the project POE-level-fx. + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/appdirs-1.0.1.jar b/lib/appdirs-1.0.1.jar new file mode 100644 index 0000000..317c990 Binary files /dev/null and b/lib/appdirs-1.0.1.jar differ diff --git a/lib/controlsfx-8.40.14.jar b/lib/controlsfx-8.40.14.jar new file mode 100644 index 0000000..7e593d4 Binary files /dev/null and b/lib/controlsfx-8.40.14.jar differ diff --git a/lib/controlsfx-8.40.14.zip b/lib/controlsfx-8.40.14.zip new file mode 100644 index 0000000..a0b74b4 Binary files /dev/null and b/lib/controlsfx-8.40.14.zip differ diff --git a/lib/controlsfx-9.0.0.jar b/lib/controlsfx-9.0.0.jar new file mode 100644 index 0000000..11c8304 Binary files /dev/null and b/lib/controlsfx-9.0.0.jar differ diff --git a/lib/gson-2.8.5.jar b/lib/gson-2.8.5.jar new file mode 100644 index 0000000..0d5baf3 Binary files /dev/null and b/lib/gson-2.8.5.jar differ diff --git a/lib/jna-4.5.0.jar b/lib/jna-4.5.0.jar new file mode 100644 index 0000000..2e4eaeb Binary files /dev/null and b/lib/jna-4.5.0.jar differ diff --git a/lib/jna-platform-4.1.0.jar b/lib/jna-platform-4.1.0.jar new file mode 100644 index 0000000..8d5fe3d Binary files /dev/null and b/lib/jna-platform-4.1.0.jar differ diff --git a/lib/json-20180813.jar b/lib/json-20180813.jar new file mode 100644 index 0000000..592f08c Binary files /dev/null and b/lib/json-20180813.jar differ diff --git a/lib/slf4j-api-1.7.25.jar b/lib/slf4j-api-1.7.25.jar new file mode 100644 index 0000000..0143c09 Binary files /dev/null and b/lib/slf4j-api-1.7.25.jar differ diff --git a/manifest.mf b/manifest.mf new file mode 100644 index 0000000..328e8e5 --- /dev/null +++ b/manifest.mf @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +X-COMMENT: Main-Class will be added automatically by build + diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml new file mode 100644 index 0000000..4db8dc8 --- /dev/null +++ b/nbproject/build-impl.xml @@ -0,0 +1,1430 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set src.resources.dir + Must set test.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set JVM to use for profiling in profiler.info.jvm + Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nbproject/configs/Run_as_WebStart.properties b/nbproject/configs/Run_as_WebStart.properties new file mode 100644 index 0000000..670fff0 --- /dev/null +++ b/nbproject/configs/Run_as_WebStart.properties @@ -0,0 +1,2 @@ +# Do not modify this property in this configuration. It can be re-generated. +$label=Run as WebStart diff --git a/nbproject/configs/Run_in_Browser.properties b/nbproject/configs/Run_in_Browser.properties new file mode 100644 index 0000000..f2a5a65 --- /dev/null +++ b/nbproject/configs/Run_in_Browser.properties @@ -0,0 +1,2 @@ +# Do not modify this property in this configuration. It can be re-generated. +$label=Run in Browser diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties new file mode 100644 index 0000000..5d6f259 --- /dev/null +++ b/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=f441426d +build.xml.script.CRC32=7df1656e +build.xml.stylesheet.CRC32=8064a381@1.80.1.48 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=2e7e0872 +nbproject/build-impl.xml.script.CRC32=2d92a4bf +nbproject/build-impl.xml.stylesheet.CRC32=830a3534@1.80.1.48 diff --git a/nbproject/jfx-impl.xml b/nbproject/jfx-impl.xml new file mode 100644 index 0000000..575cf06 --- /dev/null +++ b/nbproject/jfx-impl.xml @@ -0,0 +1,4049 @@ + + + + + JavaFX-specific Ant calls + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${cssfileslist} + + + + + + + + + + + + + + + + + + + + + + + + self.addMappedName( + (source.indexOf("jfxrt.jar") >= 0) || + (source.indexOf("deploy.jar") >= 0) || + (source.indexOf("javaws.jar") >= 0) || + (source.indexOf("plugin.jar") >= 0) + ? "" : source + ); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nbproject/private/configs/Run_as_WebStart.properties b/nbproject/private/configs/Run_as_WebStart.properties new file mode 100644 index 0000000..86ae865 --- /dev/null +++ b/nbproject/private/configs/Run_as_WebStart.properties @@ -0,0 +1,2 @@ +# Do not modify this property in this configuration. It can be re-generated. +javafx.run.as=webstart diff --git a/nbproject/private/configs/Run_in_Browser.properties b/nbproject/private/configs/Run_in_Browser.properties new file mode 100644 index 0000000..f4e8549 --- /dev/null +++ b/nbproject/private/configs/Run_in_Browser.properties @@ -0,0 +1,2 @@ +# Do not modify this property in this configuration. It can be re-generated. +javafx.run.as=embedded diff --git a/nbproject/private/private.properties b/nbproject/private/private.properties new file mode 100644 index 0000000..238c5da --- /dev/null +++ b/nbproject/private/private.properties @@ -0,0 +1,12 @@ +auxiliary.org-netbeans-modules-projectapi.issue214819_5f_fx_5f_enabled=true +compile.on.save=true +do.depend=false +do.jar=true +# No need to modify this property unless customizing JavaFX Ant task infrastructure +endorsed.javafx.ant.classpath=. +javac.debug=true +javadoc.preview=true +javafx.run.as=standalone +javafx.run.inbrowser= +javafx.run.inbrowser.path=C:\\Program Files\\Internet Explorer\\iexplore.exe +user.properties.file=C:\\Users\\Christos\\AppData\\Roaming\\NetBeans\\8.2\\build.properties diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml new file mode 100644 index 0000000..c668cbc --- /dev/null +++ b/nbproject/private/private.xml @@ -0,0 +1,38 @@ + + + + + + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/data/GemHolder.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/overlay/LevelOverlay_Stage.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/GemsPanel_Controller.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/BuildEntry_Controller.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/data/Zone.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/preferences.fxml + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/BuildsPanel_Controller.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/data/Tail.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/data/Logger.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/data/SocketGroupToString.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/overlay/ZoneOverlay_Controller.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/data/Build.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/MainApp_Controller.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/overlay/LevelOverlay_Controller.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/overlay/ZoneOverlay_Stage.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/BuildProgressPreview_Controller.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/POELevelFx.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/GemEntry_Controller.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/Loading_Controller.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/build.xml + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/Preferences_Controller.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/QuestSplitPanel_Controller.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/data/GemListCell.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/Main_Controller.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/data/Controller.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/SocketGroupsPanel_Controller.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/SelectBuild_PopupController.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/AddGem_Controller.java + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/BuildProgressPreview.fxml + file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/Main_Stage.java + + + diff --git a/nbproject/private/retriever/catalog.xml b/nbproject/private/retriever/catalog.xml new file mode 100644 index 0000000..e69de29 diff --git a/nbproject/project.properties b/nbproject/project.properties new file mode 100644 index 0000000..33dafc1 --- /dev/null +++ b/nbproject/project.properties @@ -0,0 +1,140 @@ +annotation.processing.enabled=true +annotation.processing.enabled.in.editor=false +annotation.processing.processors.list= +annotation.processing.run.all.processors=true +annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +application.title=PathOfLeveling +application.vendor=Christos +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +build.generated.sources.dir=${build.dir}/generated-sources +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +compile.on.save=true +compile.on.save.unsupported.javafx=true +# Uncomment to specify the preferred debugger connection transport: +#debug.transport=dt_socket +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/PathOfLeveling.jar +dist.javadoc.dir=${dist.dir}/javadoc +endorsed.classpath= +excludes= +file.reference.appdirs-1.0.1.jar=lib\\appdirs-1.0.1.jar +file.reference.controlsfx-8.40.14.jar=lib\\controlsfx-8.40.14.jar +file.reference.gson-2.8.5.jar=lib\\gson-2.8.5.jar +file.reference.jfoenix-8.0.7.jar=C:\\Users\\Christos\\Documents\\NetBeansProjects\\jfoenix-8.0.7.jar +file.reference.jna-4.5.0.jar=lib\\jna-4.5.0.jar +file.reference.jna-platform-4.1.0.jar=lib\\jna-platform-4.1.0.jar +file.reference.json-20180813.jar=lib\\json-20180813.jar +file.reference.slf4j-api-1.7.25.jar=lib\\slf4j-api-1.7.25.jar +includes=** +# Non-JavaFX jar file creation is deactivated in JavaFX 2.0+ projects +jar.archive.disabled=true +jar.compress=false +javac.classpath=\ + ${javafx.classpath.extension}:\ + ${file.reference.jfoenix-8.0.7.jar}:\ + ${file.reference.json-20180813.jar}:\ + ${file.reference.appdirs-1.0.1.jar}:\ + ${file.reference.slf4j-api-1.7.25.jar}:\ + ${file.reference.jna-4.5.0.jar}:\ + ${file.reference.jna-platform-4.1.0.jar}:\ + ${file.reference.gson-2.8.5.jar}:\ + ${file.reference.controlsfx-8.40.14.jar} +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.external.vm=false +javac.processorpath=\ + ${javac.classpath} +javac.source=1.8 +javac.target=1.8 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +javac.test.processorpath=\ + ${javac.test.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +javafx.application.implementation.version=1.0 +javafx.binarycss=false +javafx.classpath.extension=\ + ${java.home}/lib/javaws.jar:\ + ${java.home}/lib/deploy.jar:\ + ${java.home}/lib/plugin.jar +javafx.deploy.adddesktopshortcut=false +javafx.deploy.addstartmenushortcut=false +javafx.deploy.allowoffline=true +# If true, application update mode is set to 'background', if false, update mode is set to 'eager' +javafx.deploy.backgroundupdate=false +javafx.deploy.disable.proxy=false +javafx.deploy.embedJNLP=true +javafx.deploy.includeDT=true +javafx.deploy.installpermanently=false +javafx.deploy.permissionselevated=false +# Set true to prevent creation of temporary copy of deployment artifacts before each run (disables concurrent runs) +javafx.disable.concurrent.runs=false +# Set true to enable multiple concurrent runs of the same WebStart or Run-in-Browser project +javafx.enable.concurrent.external.runs=false +# This is a JavaFX project +javafx.enabled=true +javafx.fallback.class=com.javafx.main.NoJavaFXFallback +# Main class for JavaFX +javafx.main.class=poe.level.fx.POELevelFx +javafx.preloader.class= +# This project does not use Preloader +javafx.preloader.enabled=false +javafx.preloader.jar.filename= +javafx.preloader.jar.path= +javafx.preloader.project.path= +javafx.preloader.type=none +# Set true for GlassFish only. Rebases manifest classpaths of JARs in lib dir. Not usable with signed JARs. +javafx.rebase.libs=false +javafx.run.height=600 +javafx.run.width=800 +javafx.signing.blob=false +javafx.signing.enabled=false +javafx.signing.type=notsigned +# Pre-JavaFX 2.0 WebStart is deactivated in JavaFX 2.0+ projects +jnlp.enabled=false +# Main class for Java launcher +main.class=com.javafx.main.Main +# For improved security specify narrower Codebase manifest attribute to prevent RIAs from being repurposed +manifest.custom.codebase=* +# Specify Permissions manifest attribute to override default (choices: sandbox, all-permissions) +manifest.custom.permissions= +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +mkdist.disabled=false +native.bundling.enabled=false +platform.active=default_platform +run.classpath=\ + ${dist.jar}:\ + ${javac.classpath}:\ + ${build.classes.dir} +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.dir=src +src.resources.dir=resources +test.src.dir=test diff --git a/nbproject/project.xml b/nbproject/project.xml new file mode 100644 index 0000000..deac55e --- /dev/null +++ b/nbproject/project.xml @@ -0,0 +1,26 @@ + + + org.netbeans.modules.java.j2seproject + + + + + + + + + + + + + PathOfLeveling + + + + + + + + + + diff --git a/resources/fonts/AlegreyaSansSC-Black.ttf b/resources/fonts/AlegreyaSansSC-Black.ttf new file mode 100644 index 0000000..e6bc5c8 Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-Black.ttf differ diff --git a/resources/fonts/AlegreyaSansSC-BlackItalic.ttf b/resources/fonts/AlegreyaSansSC-BlackItalic.ttf new file mode 100644 index 0000000..d79663c Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-BlackItalic.ttf differ diff --git a/resources/fonts/AlegreyaSansSC-Bold.ttf b/resources/fonts/AlegreyaSansSC-Bold.ttf new file mode 100644 index 0000000..f113fe0 Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-Bold.ttf differ diff --git a/resources/fonts/AlegreyaSansSC-BoldItalic.ttf b/resources/fonts/AlegreyaSansSC-BoldItalic.ttf new file mode 100644 index 0000000..f243b38 Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-BoldItalic.ttf differ diff --git a/resources/fonts/AlegreyaSansSC-ExtraBold.ttf b/resources/fonts/AlegreyaSansSC-ExtraBold.ttf new file mode 100644 index 0000000..57d5c02 Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-ExtraBold.ttf differ diff --git a/resources/fonts/AlegreyaSansSC-ExtraBoldItalic.ttf b/resources/fonts/AlegreyaSansSC-ExtraBoldItalic.ttf new file mode 100644 index 0000000..1305901 Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-ExtraBoldItalic.ttf differ diff --git a/resources/fonts/AlegreyaSansSC-Italic.ttf b/resources/fonts/AlegreyaSansSC-Italic.ttf new file mode 100644 index 0000000..b3fdaa1 Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-Italic.ttf differ diff --git a/resources/fonts/AlegreyaSansSC-Light.ttf b/resources/fonts/AlegreyaSansSC-Light.ttf new file mode 100644 index 0000000..bb70a02 Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-Light.ttf differ diff --git a/resources/fonts/AlegreyaSansSC-LightItalic.ttf b/resources/fonts/AlegreyaSansSC-LightItalic.ttf new file mode 100644 index 0000000..78ea480 Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-LightItalic.ttf differ diff --git a/resources/fonts/AlegreyaSansSC-Medium.ttf b/resources/fonts/AlegreyaSansSC-Medium.ttf new file mode 100644 index 0000000..77ad2c3 Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-Medium.ttf differ diff --git a/resources/fonts/AlegreyaSansSC-MediumItalic.ttf b/resources/fonts/AlegreyaSansSC-MediumItalic.ttf new file mode 100644 index 0000000..c0a2769 Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-MediumItalic.ttf differ diff --git a/resources/fonts/AlegreyaSansSC-Regular.ttf b/resources/fonts/AlegreyaSansSC-Regular.ttf new file mode 100644 index 0000000..d49fc5b Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-Regular.ttf differ diff --git a/resources/fonts/AlegreyaSansSC-Thin.ttf b/resources/fonts/AlegreyaSansSC-Thin.ttf new file mode 100644 index 0000000..48238fb Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-Thin.ttf differ diff --git a/resources/fonts/AlegreyaSansSC-ThinItalic.ttf b/resources/fonts/AlegreyaSansSC-ThinItalic.ttf new file mode 100644 index 0000000..fa61dd2 Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-ThinItalic.ttf differ diff --git a/resources/fonts/Fontin-Bold.ttf b/resources/fonts/Fontin-Bold.ttf new file mode 100644 index 0000000..f6a33b0 Binary files /dev/null and b/resources/fonts/Fontin-Bold.ttf differ diff --git a/resources/fonts/Fontin-Italic.ttf b/resources/fonts/Fontin-Italic.ttf new file mode 100644 index 0000000..e309e4a Binary files /dev/null and b/resources/fonts/Fontin-Italic.ttf differ diff --git a/resources/fonts/Fontin-Regular.ttf b/resources/fonts/Fontin-Regular.ttf new file mode 100644 index 0000000..3284fe2 Binary files /dev/null and b/resources/fonts/Fontin-Regular.ttf differ diff --git a/resources/fonts/Fontin-SmallCaps.ttf b/resources/fonts/Fontin-SmallCaps.ttf new file mode 100644 index 0000000..25efca5 Binary files /dev/null and b/resources/fonts/Fontin-SmallCaps.ttf differ diff --git a/resources/fonts/ReadMe.txt b/resources/fonts/ReadMe.txt new file mode 100644 index 0000000..99ac807 --- /dev/null +++ b/resources/fonts/ReadMe.txt @@ -0,0 +1,34 @@ + + Fontin TrueType + + +This is a new conversion of Jos Buivenga's "Fontin" typeface into TrueType +format for Windows. In this version, the descenders are intact and the +line spacing is much closer to that of the Macintosh original. + +If you have the earlier conversion into OpenType format, you should +uninstall it (drag the four Fontin-* files out of your Fonts folder) +before installing this version. + + +Technical trivia: I did the conversion with George Williams's FontForge +v2006-10-25 20:02. I have appended the string "(TrueType)" to the version +numbers to differentiate this conversion from the earlier OpenType +version. In addition, I've changed the base font name of the smallcaps +version from "Fontin" to "Fontin SmallCaps" to prevent Windows from +confusing it with Fontin Regular. + + -- Charles Dye, 2006-12-14 + + +Font License Information: + + * This font is free for personal and commercial use. + * This font may not be modified. + * This font may not be distributed, online or on any media, without + permission from Jos Buivenga. + * This font may not be sold. + * This font is the intellectual property of Jos Buivenga. + + +Fontin homepage: http://www.josbuivenga.demon.nl/fontin.html diff --git a/resources/styles/style.css b/resources/styles/style.css new file mode 100644 index 0000000..a774718 --- /dev/null +++ b/resources/styles/style.css @@ -0,0 +1,60 @@ +{ + color: transparent; + background-color: rgba(58, 44, 189, 0.4); + color2: transparent; + background-color2: rgba(215, 44, 44, 0.4); + + background-pane-color-1: black; + background-pane-color-2: yellow; + color3: transparent; +} + +.buildPanel{ + -fx-border-style: solid; + -fx-background-color: color; +} + +.buildPanel:hover{ + -fx-background-color: background-color; +} + +.gemPanel{ + -fx-background-color: color2; +} + +.gemPanel:hover{ + -fx-border-style: solid; +} + +.jfx-tab-pane +{ + +} + +.jfx-tab-pane .headers-region +{ + -fx-background-color: #3F826D; +} + +.jfx-tab-pane .tab-header-background +{ + -fx-background-color: #3F826D; +} + +.jfx-tab-pane .tab-header-area .jfx-rippler +{ + -jfx-rippler-fill: orange; +} + +.jfx-tab-pane .tab-header-area .tab-selected-line +{ + -fx-stroke: red; +} + +.jfx-tab-pane:top .depth-container .tab-header-area .headers-region .tab-selected-line { + -fx-background-color: #F2D0A4; +} + +.backgroundPane{ + -fx-background-color: color3; +} \ No newline at end of file diff --git a/src/a.txt b/src/a.txt new file mode 100644 index 0000000..375a423 --- /dev/null +++ b/src/a.txt @@ -0,0 +1,35 @@ +You have entered The Crypt. +You have entered The Crypt. +You have entered The Crypt. +You have entered The Crypt. +is now level 34. +You have entered The Crypt. +You have entered The Crypt. +You have entered The Crypt. +You have entered The Crypt. +You have entered The Crypt.1:50 PM 12/7/20181:50 PM 12/7/2018 +You have entered The Crypt. +You have entered The Crypt. + +2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 1 + +You have entered The Crypt. + +2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 1 +2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 73 +You have entered The Crypt. +2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 1 +You have entered The Crypt. +2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 1 +2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 73 +You have entered The Crypt. +You have entered The Crypt. + +2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 1 +2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 4 +2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 8 +2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 8 + +2018/12/18 04:58:07 449736281 a24 [INFO Client 1908] : _rainy (Scion) is now level 7 + +2018/12/18 04:58:07 449736281 a24 [INFO Client 1908] : _rainy (Scion) is now level 8 diff --git a/src/classes/Duelist/Champion.png b/src/classes/Duelist/Champion.png new file mode 100644 index 0000000..f325a02 Binary files /dev/null and b/src/classes/Duelist/Champion.png differ diff --git a/src/classes/Duelist/Gladiator.png b/src/classes/Duelist/Gladiator.png new file mode 100644 index 0000000..ac805ab Binary files /dev/null and b/src/classes/Duelist/Gladiator.png differ diff --git a/src/classes/Duelist/Slayer.png b/src/classes/Duelist/Slayer.png new file mode 100644 index 0000000..09ec779 Binary files /dev/null and b/src/classes/Duelist/Slayer.png differ diff --git a/src/classes/Marauder/Berserker.png b/src/classes/Marauder/Berserker.png new file mode 100644 index 0000000..47b69f2 Binary files /dev/null and b/src/classes/Marauder/Berserker.png differ diff --git a/src/classes/Marauder/Chieftain.png b/src/classes/Marauder/Chieftain.png new file mode 100644 index 0000000..8274dca Binary files /dev/null and b/src/classes/Marauder/Chieftain.png differ diff --git a/src/classes/Marauder/Juggernaut.png b/src/classes/Marauder/Juggernaut.png new file mode 100644 index 0000000..b115544 Binary files /dev/null and b/src/classes/Marauder/Juggernaut.png differ diff --git a/src/classes/Ranger/Deadeye.png b/src/classes/Ranger/Deadeye.png new file mode 100644 index 0000000..0e1f9ec Binary files /dev/null and b/src/classes/Ranger/Deadeye.png differ diff --git a/src/classes/Ranger/Pathfinder.png b/src/classes/Ranger/Pathfinder.png new file mode 100644 index 0000000..da72730 Binary files /dev/null and b/src/classes/Ranger/Pathfinder.png differ diff --git a/src/classes/Ranger/Raider.png b/src/classes/Ranger/Raider.png new file mode 100644 index 0000000..7539a6b Binary files /dev/null and b/src/classes/Ranger/Raider.png differ diff --git a/src/classes/Scion/Ascendant.png b/src/classes/Scion/Ascendant.png new file mode 100644 index 0000000..f2d62f7 Binary files /dev/null and b/src/classes/Scion/Ascendant.png differ diff --git a/src/classes/Shadow/Assasin.png b/src/classes/Shadow/Assasin.png new file mode 100644 index 0000000..3094096 Binary files /dev/null and b/src/classes/Shadow/Assasin.png differ diff --git a/src/classes/Shadow/Saboteur.png b/src/classes/Shadow/Saboteur.png new file mode 100644 index 0000000..ad394f4 Binary files /dev/null and b/src/classes/Shadow/Saboteur.png differ diff --git a/src/classes/Shadow/Trickster.png b/src/classes/Shadow/Trickster.png new file mode 100644 index 0000000..9fbe0d2 Binary files /dev/null and b/src/classes/Shadow/Trickster.png differ diff --git a/src/classes/Templar/Guardian.png b/src/classes/Templar/Guardian.png new file mode 100644 index 0000000..cc8e184 Binary files /dev/null and b/src/classes/Templar/Guardian.png differ diff --git a/src/classes/Templar/Hierophant.png b/src/classes/Templar/Hierophant.png new file mode 100644 index 0000000..f108319 Binary files /dev/null and b/src/classes/Templar/Hierophant.png differ diff --git a/src/classes/Templar/Inquisitor.png b/src/classes/Templar/Inquisitor.png new file mode 100644 index 0000000..1e420ba Binary files /dev/null and b/src/classes/Templar/Inquisitor.png differ diff --git a/src/classes/Witch/Elementalist.png b/src/classes/Witch/Elementalist.png new file mode 100644 index 0000000..8e0edd4 Binary files /dev/null and b/src/classes/Witch/Elementalist.png differ diff --git a/src/classes/Witch/Necromancer.png b/src/classes/Witch/Necromancer.png new file mode 100644 index 0000000..1a18b22 Binary files /dev/null and b/src/classes/Witch/Necromancer.png differ diff --git a/src/classes/Witch/Occultist.png b/src/classes/Witch/Occultist.png new file mode 100644 index 0000000..6f43a1d Binary files /dev/null and b/src/classes/Witch/Occultist.png differ diff --git a/src/gems/Abyssal Cry.png b/src/gems/Abyssal Cry.png new file mode 100644 index 0000000..98c43fc Binary files /dev/null and b/src/gems/Abyssal Cry.png differ diff --git a/src/gems/Added Chaos Damage.png b/src/gems/Added Chaos Damage.png new file mode 100644 index 0000000..32cdeb3 Binary files /dev/null and b/src/gems/Added Chaos Damage.png differ diff --git a/src/gems/Added Cold Damage.png b/src/gems/Added Cold Damage.png new file mode 100644 index 0000000..2281e4e Binary files /dev/null and b/src/gems/Added Cold Damage.png differ diff --git a/src/gems/Added Fire Damage.png b/src/gems/Added Fire Damage.png new file mode 100644 index 0000000..a578675 Binary files /dev/null and b/src/gems/Added Fire Damage.png differ diff --git a/src/gems/Added Lightning Damage.png b/src/gems/Added Lightning Damage.png new file mode 100644 index 0000000..ca3df65 Binary files /dev/null and b/src/gems/Added Lightning Damage.png differ diff --git a/src/gems/Additional Accuracy.png b/src/gems/Additional Accuracy.png new file mode 100644 index 0000000..db6fc7c Binary files /dev/null and b/src/gems/Additional Accuracy.png differ diff --git a/src/gems/Advanced Trap Support.png b/src/gems/Advanced Trap Support.png new file mode 100644 index 0000000..fbb1b2e Binary files /dev/null and b/src/gems/Advanced Trap Support.png differ diff --git a/src/gems/Ancestral Call.png b/src/gems/Ancestral Call.png new file mode 100644 index 0000000..56a44ab Binary files /dev/null and b/src/gems/Ancestral Call.png differ diff --git a/src/gems/Ancestral Protector.png b/src/gems/Ancestral Protector.png new file mode 100644 index 0000000..218c8b7 Binary files /dev/null and b/src/gems/Ancestral Protector.png differ diff --git a/src/gems/Ancestral Warchief.png b/src/gems/Ancestral Warchief.png new file mode 100644 index 0000000..6353b7e Binary files /dev/null and b/src/gems/Ancestral Warchief.png differ diff --git a/src/gems/Anger.png b/src/gems/Anger.png new file mode 100644 index 0000000..f632bf6 Binary files /dev/null and b/src/gems/Anger.png differ diff --git a/src/gems/Animate Guardian.png b/src/gems/Animate Guardian.png new file mode 100644 index 0000000..a8e775f Binary files /dev/null and b/src/gems/Animate Guardian.png differ diff --git a/src/gems/Animate Weapon.png b/src/gems/Animate Weapon.png new file mode 100644 index 0000000..c9a7402 Binary files /dev/null and b/src/gems/Animate Weapon.png differ diff --git a/src/gems/Arc.png b/src/gems/Arc.png new file mode 100644 index 0000000..0cbc092 Binary files /dev/null and b/src/gems/Arc.png differ diff --git a/src/gems/Arcane Surge.png b/src/gems/Arcane Surge.png new file mode 100644 index 0000000..cb90197 Binary files /dev/null and b/src/gems/Arcane Surge.png differ diff --git a/src/gems/Arctic Armour.png b/src/gems/Arctic Armour.png new file mode 100644 index 0000000..2bf9fbd Binary files /dev/null and b/src/gems/Arctic Armour.png differ diff --git a/src/gems/Arctic Breath.png b/src/gems/Arctic Breath.png new file mode 100644 index 0000000..caceeb1 Binary files /dev/null and b/src/gems/Arctic Breath.png differ diff --git a/src/gems/Armageddon Brand.png b/src/gems/Armageddon Brand.png new file mode 100644 index 0000000..c95304f Binary files /dev/null and b/src/gems/Armageddon Brand.png differ diff --git a/src/gems/Assassin's Mark.png b/src/gems/Assassin's Mark.png new file mode 100644 index 0000000..2279d0f Binary files /dev/null and b/src/gems/Assassin's Mark.png differ diff --git a/src/gems/Ball Lightning.png b/src/gems/Ball Lightning.png new file mode 100644 index 0000000..c30f9cb Binary files /dev/null and b/src/gems/Ball Lightning.png differ diff --git a/src/gems/Barrage.png b/src/gems/Barrage.png new file mode 100644 index 0000000..34f8213 Binary files /dev/null and b/src/gems/Barrage.png differ diff --git a/src/gems/Bear Trap.png b/src/gems/Bear Trap.png new file mode 100644 index 0000000..896fd32 Binary files /dev/null and b/src/gems/Bear Trap.png differ diff --git a/src/gems/Blade Flurry.png b/src/gems/Blade Flurry.png new file mode 100644 index 0000000..c83bf0b Binary files /dev/null and b/src/gems/Blade Flurry.png differ diff --git a/src/gems/Blade Vortex.png b/src/gems/Blade Vortex.png new file mode 100644 index 0000000..e52c8d8 Binary files /dev/null and b/src/gems/Blade Vortex.png differ diff --git a/src/gems/Bladefall.png b/src/gems/Bladefall.png new file mode 100644 index 0000000..a80f444 Binary files /dev/null and b/src/gems/Bladefall.png differ diff --git a/src/gems/Blasphemy.png b/src/gems/Blasphemy.png new file mode 100644 index 0000000..3da6d48 Binary files /dev/null and b/src/gems/Blasphemy.png differ diff --git a/src/gems/Blast Rain.png b/src/gems/Blast Rain.png new file mode 100644 index 0000000..5713669 Binary files /dev/null and b/src/gems/Blast Rain.png differ diff --git a/src/gems/Blight.png b/src/gems/Blight.png new file mode 100644 index 0000000..09d7d1a Binary files /dev/null and b/src/gems/Blight.png differ diff --git a/src/gems/Blind.png b/src/gems/Blind.png new file mode 100644 index 0000000..83654d7 Binary files /dev/null and b/src/gems/Blind.png differ diff --git a/src/gems/Blink Arrow.png b/src/gems/Blink Arrow.png new file mode 100644 index 0000000..e6c3b5b Binary files /dev/null and b/src/gems/Blink Arrow.png differ diff --git a/src/gems/Block Chance Reduction.png b/src/gems/Block Chance Reduction.png new file mode 100644 index 0000000..dad1a4c Binary files /dev/null and b/src/gems/Block Chance Reduction.png differ diff --git a/src/gems/Blood Magic.png b/src/gems/Blood Magic.png new file mode 100644 index 0000000..36d0152 Binary files /dev/null and b/src/gems/Blood Magic.png differ diff --git a/src/gems/Blood Rage.png b/src/gems/Blood Rage.png new file mode 100644 index 0000000..afb2322 Binary files /dev/null and b/src/gems/Blood Rage.png differ diff --git a/src/gems/Bloodlust.png b/src/gems/Bloodlust.png new file mode 100644 index 0000000..e639d2f Binary files /dev/null and b/src/gems/Bloodlust.png differ diff --git a/src/gems/Bodyswap.png b/src/gems/Bodyswap.png new file mode 100644 index 0000000..b846dfb Binary files /dev/null and b/src/gems/Bodyswap.png differ diff --git a/src/gems/Bone Offering.png b/src/gems/Bone Offering.png new file mode 100644 index 0000000..e941b39 Binary files /dev/null and b/src/gems/Bone Offering.png differ diff --git a/src/gems/Bonechill.png b/src/gems/Bonechill.png new file mode 100644 index 0000000..fc96115 Binary files /dev/null and b/src/gems/Bonechill.png differ diff --git a/src/gems/Brand Recall.png b/src/gems/Brand Recall.png new file mode 100644 index 0000000..3c9aa3b Binary files /dev/null and b/src/gems/Brand Recall.png differ diff --git a/src/gems/Brutality.png b/src/gems/Brutality.png new file mode 100644 index 0000000..c51fc9a Binary files /dev/null and b/src/gems/Brutality.png differ diff --git a/src/gems/Burning Arrow.png b/src/gems/Burning Arrow.png new file mode 100644 index 0000000..0e22329 Binary files /dev/null and b/src/gems/Burning Arrow.png differ diff --git a/src/gems/Burning Damage.png b/src/gems/Burning Damage.png new file mode 100644 index 0000000..b712372 Binary files /dev/null and b/src/gems/Burning Damage.png differ diff --git a/src/gems/Cast On Critical Strike.png b/src/gems/Cast On Critical Strike.png new file mode 100644 index 0000000..ed902d4 Binary files /dev/null and b/src/gems/Cast On Critical Strike.png differ diff --git a/src/gems/Cast on Death.png b/src/gems/Cast on Death.png new file mode 100644 index 0000000..b7336ce Binary files /dev/null and b/src/gems/Cast on Death.png differ diff --git a/src/gems/Cast on Melee Kill.png b/src/gems/Cast on Melee Kill.png new file mode 100644 index 0000000..de3f158 Binary files /dev/null and b/src/gems/Cast on Melee Kill.png differ diff --git a/src/gems/Cast when Damage Taken.png b/src/gems/Cast when Damage Taken.png new file mode 100644 index 0000000..0f7bcb5 Binary files /dev/null and b/src/gems/Cast when Damage Taken.png differ diff --git a/src/gems/Cast when Stunned.png b/src/gems/Cast when Stunned.png new file mode 100644 index 0000000..356a69d Binary files /dev/null and b/src/gems/Cast when Stunned.png differ diff --git a/src/gems/Cast while Channelling.png b/src/gems/Cast while Channelling.png new file mode 100644 index 0000000..128e5ce Binary files /dev/null and b/src/gems/Cast while Channelling.png differ diff --git a/src/gems/Caustic Arrow.png b/src/gems/Caustic Arrow.png new file mode 100644 index 0000000..14dc8d6 Binary files /dev/null and b/src/gems/Caustic Arrow.png differ diff --git a/src/gems/Chain.png b/src/gems/Chain.png new file mode 100644 index 0000000..52cffd5 Binary files /dev/null and b/src/gems/Chain.png differ diff --git a/src/gems/Chance to Bleed.png b/src/gems/Chance to Bleed.png new file mode 100644 index 0000000..81f0525 Binary files /dev/null and b/src/gems/Chance to Bleed.png differ diff --git a/src/gems/Chance to Flee.png b/src/gems/Chance to Flee.png new file mode 100644 index 0000000..efb3446 Binary files /dev/null and b/src/gems/Chance to Flee.png differ diff --git a/src/gems/Chance to Ignite.png b/src/gems/Chance to Ignite.png new file mode 100644 index 0000000..7a7e5f9 Binary files /dev/null and b/src/gems/Chance to Ignite.png differ diff --git a/src/gems/Charged Dash.png b/src/gems/Charged Dash.png new file mode 100644 index 0000000..8235d92 Binary files /dev/null and b/src/gems/Charged Dash.png differ diff --git a/src/gems/Clarity.png b/src/gems/Clarity.png new file mode 100644 index 0000000..b80dae5 Binary files /dev/null and b/src/gems/Clarity.png differ diff --git a/src/gems/Cleave.png b/src/gems/Cleave.png new file mode 100644 index 0000000..03f2432 Binary files /dev/null and b/src/gems/Cleave.png differ diff --git a/src/gems/Cluster Traps.png b/src/gems/Cluster Traps.png new file mode 100644 index 0000000..2f9d9cb Binary files /dev/null and b/src/gems/Cluster Traps.png differ diff --git a/src/gems/Cold Penetration.png b/src/gems/Cold Penetration.png new file mode 100644 index 0000000..dfcca55 Binary files /dev/null and b/src/gems/Cold Penetration.png differ diff --git a/src/gems/Cold Snap.png b/src/gems/Cold Snap.png new file mode 100644 index 0000000..e189776 Binary files /dev/null and b/src/gems/Cold Snap.png differ diff --git a/src/gems/Cold to Fire.png b/src/gems/Cold to Fire.png new file mode 100644 index 0000000..f99ca11 Binary files /dev/null and b/src/gems/Cold to Fire.png differ diff --git a/src/gems/Combustion.png b/src/gems/Combustion.png new file mode 100644 index 0000000..7a7e5f9 Binary files /dev/null and b/src/gems/Combustion.png differ diff --git a/src/gems/Concentrated Effect.png b/src/gems/Concentrated Effect.png new file mode 100644 index 0000000..8c53848 Binary files /dev/null and b/src/gems/Concentrated Effect.png differ diff --git a/src/gems/Conductivity.png b/src/gems/Conductivity.png new file mode 100644 index 0000000..eb61eb7 Binary files /dev/null and b/src/gems/Conductivity.png differ diff --git a/src/gems/Consecrated Path.png b/src/gems/Consecrated Path.png new file mode 100644 index 0000000..465d118 Binary files /dev/null and b/src/gems/Consecrated Path.png differ diff --git a/src/gems/Contagion.png b/src/gems/Contagion.png new file mode 100644 index 0000000..b60d205 Binary files /dev/null and b/src/gems/Contagion.png differ diff --git a/src/gems/Controlled Destruction.png b/src/gems/Controlled Destruction.png new file mode 100644 index 0000000..e7c790f Binary files /dev/null and b/src/gems/Controlled Destruction.png differ diff --git a/src/gems/Conversion Trap.png b/src/gems/Conversion Trap.png new file mode 100644 index 0000000..2524420 Binary files /dev/null and b/src/gems/Conversion Trap.png differ diff --git a/src/gems/Convocation.png b/src/gems/Convocation.png new file mode 100644 index 0000000..e04f68c Binary files /dev/null and b/src/gems/Convocation.png differ diff --git a/src/gems/Cremation.png b/src/gems/Cremation.png new file mode 100644 index 0000000..6d2b7f3 Binary files /dev/null and b/src/gems/Cremation.png differ diff --git a/src/gems/Culling Strike.png b/src/gems/Culling Strike.png new file mode 100644 index 0000000..526fa34 Binary files /dev/null and b/src/gems/Culling Strike.png differ diff --git a/src/gems/Curse On Hit.png b/src/gems/Curse On Hit.png new file mode 100644 index 0000000..4949280 Binary files /dev/null and b/src/gems/Curse On Hit.png differ diff --git a/src/gems/Cyclone.png b/src/gems/Cyclone.png new file mode 100644 index 0000000..b584b58 Binary files /dev/null and b/src/gems/Cyclone.png differ diff --git a/src/gems/Damage on Full Life Support.png b/src/gems/Damage on Full Life Support.png new file mode 100644 index 0000000..3271fb6 Binary files /dev/null and b/src/gems/Damage on Full Life Support.png differ diff --git a/src/gems/Dark Pact.png b/src/gems/Dark Pact.png new file mode 100644 index 0000000..d7d7400 Binary files /dev/null and b/src/gems/Dark Pact.png differ diff --git a/src/gems/Deadly Ailments.png b/src/gems/Deadly Ailments.png new file mode 100644 index 0000000..c8d5b51 Binary files /dev/null and b/src/gems/Deadly Ailments.png differ diff --git a/src/gems/Decay.png b/src/gems/Decay.png new file mode 100644 index 0000000..0a116dc Binary files /dev/null and b/src/gems/Decay.png differ diff --git a/src/gems/Decoy Totem.png b/src/gems/Decoy Totem.png new file mode 100644 index 0000000..35edf5e Binary files /dev/null and b/src/gems/Decoy Totem.png differ diff --git a/src/gems/Desecrate.png b/src/gems/Desecrate.png new file mode 100644 index 0000000..d81b36f Binary files /dev/null and b/src/gems/Desecrate.png differ diff --git a/src/gems/Despair.png b/src/gems/Despair.png new file mode 100644 index 0000000..62c5b91 Binary files /dev/null and b/src/gems/Despair.png differ diff --git a/src/gems/Determination.png b/src/gems/Determination.png new file mode 100644 index 0000000..5c0b27e Binary files /dev/null and b/src/gems/Determination.png differ diff --git a/src/gems/Detonate Dead.png b/src/gems/Detonate Dead.png new file mode 100644 index 0000000..293a657 Binary files /dev/null and b/src/gems/Detonate Dead.png differ diff --git a/src/gems/Detonate Mines.png b/src/gems/Detonate Mines.png new file mode 100644 index 0000000..398da4d Binary files /dev/null and b/src/gems/Detonate Mines.png differ diff --git a/src/gems/Devouring Totem.png b/src/gems/Devouring Totem.png new file mode 100644 index 0000000..25f3f57 Binary files /dev/null and b/src/gems/Devouring Totem.png differ diff --git a/src/gems/Discharge.png b/src/gems/Discharge.png new file mode 100644 index 0000000..514d3fa Binary files /dev/null and b/src/gems/Discharge.png differ diff --git a/src/gems/Discipline.png b/src/gems/Discipline.png new file mode 100644 index 0000000..88dec23 Binary files /dev/null and b/src/gems/Discipline.png differ diff --git a/src/gems/Dominating Blow.png b/src/gems/Dominating Blow.png new file mode 100644 index 0000000..c87d813 Binary files /dev/null and b/src/gems/Dominating Blow.png differ diff --git a/src/gems/Double Strike.png b/src/gems/Double Strike.png new file mode 100644 index 0000000..25213c9 Binary files /dev/null and b/src/gems/Double Strike.png differ diff --git a/src/gems/Dread Banner.png b/src/gems/Dread Banner.png new file mode 100644 index 0000000..717f375 Binary files /dev/null and b/src/gems/Dread Banner.png differ diff --git a/src/gems/Dual Strike.png b/src/gems/Dual Strike.png new file mode 100644 index 0000000..49f1d0d Binary files /dev/null and b/src/gems/Dual Strike.png differ diff --git a/src/gems/Earthquake.png b/src/gems/Earthquake.png new file mode 100644 index 0000000..5c58da9 Binary files /dev/null and b/src/gems/Earthquake.png differ diff --git a/src/gems/Efficacy.png b/src/gems/Efficacy.png new file mode 100644 index 0000000..f333df6 Binary files /dev/null and b/src/gems/Efficacy.png differ diff --git a/src/gems/Elemental Damage with Attacks.png b/src/gems/Elemental Damage with Attacks.png new file mode 100644 index 0000000..0267e6e Binary files /dev/null and b/src/gems/Elemental Damage with Attacks.png differ diff --git a/src/gems/Elemental Focus.png b/src/gems/Elemental Focus.png new file mode 100644 index 0000000..8d3a7bf Binary files /dev/null and b/src/gems/Elemental Focus.png differ diff --git a/src/gems/Elemental Hit.png b/src/gems/Elemental Hit.png new file mode 100644 index 0000000..7869713 Binary files /dev/null and b/src/gems/Elemental Hit.png differ diff --git a/src/gems/Elemental Proliferation.png b/src/gems/Elemental Proliferation.png new file mode 100644 index 0000000..0dfceb8 Binary files /dev/null and b/src/gems/Elemental Proliferation.png differ diff --git a/src/gems/Elemental Weakness.png b/src/gems/Elemental Weakness.png new file mode 100644 index 0000000..a099702 Binary files /dev/null and b/src/gems/Elemental Weakness.png differ diff --git a/src/gems/Empower.png b/src/gems/Empower.png new file mode 100644 index 0000000..3c4decb Binary files /dev/null and b/src/gems/Empower.png differ diff --git a/src/gems/Endurance Charge on Melee Stun.png b/src/gems/Endurance Charge on Melee Stun.png new file mode 100644 index 0000000..42f7701 Binary files /dev/null and b/src/gems/Endurance Charge on Melee Stun.png differ diff --git a/src/gems/Enduring Cry.png b/src/gems/Enduring Cry.png new file mode 100644 index 0000000..0f731dd Binary files /dev/null and b/src/gems/Enduring Cry.png differ diff --git a/src/gems/Enfeeble.png b/src/gems/Enfeeble.png new file mode 100644 index 0000000..ecaa533 Binary files /dev/null and b/src/gems/Enfeeble.png differ diff --git a/src/gems/Enhance.png b/src/gems/Enhance.png new file mode 100644 index 0000000..89ae843 Binary files /dev/null and b/src/gems/Enhance.png differ diff --git a/src/gems/Enlighten.png b/src/gems/Enlighten.png new file mode 100644 index 0000000..797975f Binary files /dev/null and b/src/gems/Enlighten.png differ diff --git a/src/gems/Essence Drain.png b/src/gems/Essence Drain.png new file mode 100644 index 0000000..0748081 Binary files /dev/null and b/src/gems/Essence Drain.png differ diff --git a/src/gems/Ethereal Knives.png b/src/gems/Ethereal Knives.png new file mode 100644 index 0000000..d5c8116 Binary files /dev/null and b/src/gems/Ethereal Knives.png differ diff --git a/src/gems/Explosive Arrow.png b/src/gems/Explosive Arrow.png new file mode 100644 index 0000000..576a89c Binary files /dev/null and b/src/gems/Explosive Arrow.png differ diff --git a/src/gems/Explosive Trap.png b/src/gems/Explosive Trap.png new file mode 100644 index 0000000..743d703 Binary files /dev/null and b/src/gems/Explosive Trap.png differ diff --git a/src/gems/Faster Attacks.png b/src/gems/Faster Attacks.png new file mode 100644 index 0000000..b912a33 Binary files /dev/null and b/src/gems/Faster Attacks.png differ diff --git a/src/gems/Faster Casting.png b/src/gems/Faster Casting.png new file mode 100644 index 0000000..aa2340f Binary files /dev/null and b/src/gems/Faster Casting.png differ diff --git a/src/gems/Faster Projectiles.png b/src/gems/Faster Projectiles.png new file mode 100644 index 0000000..82b7086 Binary files /dev/null and b/src/gems/Faster Projectiles.png differ diff --git a/src/gems/Fire Nova Mine.png b/src/gems/Fire Nova Mine.png new file mode 100644 index 0000000..7823c9e Binary files /dev/null and b/src/gems/Fire Nova Mine.png differ diff --git a/src/gems/Fire Penetration.png b/src/gems/Fire Penetration.png new file mode 100644 index 0000000..a192729 Binary files /dev/null and b/src/gems/Fire Penetration.png differ diff --git a/src/gems/Fire Trap.png b/src/gems/Fire Trap.png new file mode 100644 index 0000000..e2ae78a Binary files /dev/null and b/src/gems/Fire Trap.png differ diff --git a/src/gems/Fireball.png b/src/gems/Fireball.png new file mode 100644 index 0000000..bba3318 Binary files /dev/null and b/src/gems/Fireball.png differ diff --git a/src/gems/Firestorm.png b/src/gems/Firestorm.png new file mode 100644 index 0000000..769bba1 Binary files /dev/null and b/src/gems/Firestorm.png differ diff --git a/src/gems/Flame Dash.png b/src/gems/Flame Dash.png new file mode 100644 index 0000000..00aaa78 Binary files /dev/null and b/src/gems/Flame Dash.png differ diff --git a/src/gems/Flame Golem.png b/src/gems/Flame Golem.png new file mode 100644 index 0000000..649fef7 Binary files /dev/null and b/src/gems/Flame Golem.png differ diff --git a/src/gems/Flame Surge.png b/src/gems/Flame Surge.png new file mode 100644 index 0000000..efaefd6 Binary files /dev/null and b/src/gems/Flame Surge.png differ diff --git a/src/gems/Flame Totem.png b/src/gems/Flame Totem.png new file mode 100644 index 0000000..8d19901 Binary files /dev/null and b/src/gems/Flame Totem.png differ diff --git a/src/gems/Flameblast.png b/src/gems/Flameblast.png new file mode 100644 index 0000000..b061ce1 Binary files /dev/null and b/src/gems/Flameblast.png differ diff --git a/src/gems/Flamethrower Trap.png b/src/gems/Flamethrower Trap.png new file mode 100644 index 0000000..77c2b21 Binary files /dev/null and b/src/gems/Flamethrower Trap.png differ diff --git a/src/gems/Flammability.png b/src/gems/Flammability.png new file mode 100644 index 0000000..ebc3caf Binary files /dev/null and b/src/gems/Flammability.png differ diff --git a/src/gems/Flesh Offering.png b/src/gems/Flesh Offering.png new file mode 100644 index 0000000..e5da959 Binary files /dev/null and b/src/gems/Flesh Offering.png differ diff --git a/src/gems/Flicker Strike.png b/src/gems/Flicker Strike.png new file mode 100644 index 0000000..1083ff0 Binary files /dev/null and b/src/gems/Flicker Strike.png differ diff --git a/src/gems/Fork.png b/src/gems/Fork.png new file mode 100644 index 0000000..cd97b4d Binary files /dev/null and b/src/gems/Fork.png differ diff --git a/src/gems/Fortify.png b/src/gems/Fortify.png new file mode 100644 index 0000000..558ef35 Binary files /dev/null and b/src/gems/Fortify.png differ diff --git a/src/gems/Freeze Mine.png b/src/gems/Freeze Mine.png new file mode 100644 index 0000000..88bdf1f Binary files /dev/null and b/src/gems/Freeze Mine.png differ diff --git a/src/gems/Freezing Pulse.png b/src/gems/Freezing Pulse.png new file mode 100644 index 0000000..cc6d085 Binary files /dev/null and b/src/gems/Freezing Pulse.png differ diff --git a/src/gems/Frenzy.png b/src/gems/Frenzy.png new file mode 100644 index 0000000..f5f45e4 Binary files /dev/null and b/src/gems/Frenzy.png differ diff --git a/src/gems/Frost Blades.png b/src/gems/Frost Blades.png new file mode 100644 index 0000000..8a9faad Binary files /dev/null and b/src/gems/Frost Blades.png differ diff --git a/src/gems/Frost Bomb.png b/src/gems/Frost Bomb.png new file mode 100644 index 0000000..14b4ac0 Binary files /dev/null and b/src/gems/Frost Bomb.png differ diff --git a/src/gems/Frost Wall.png b/src/gems/Frost Wall.png new file mode 100644 index 0000000..84d38c4 Binary files /dev/null and b/src/gems/Frost Wall.png differ diff --git a/src/gems/Frostbite.png b/src/gems/Frostbite.png new file mode 100644 index 0000000..5c57f4d Binary files /dev/null and b/src/gems/Frostbite.png differ diff --git a/src/gems/Frostbolt.png b/src/gems/Frostbolt.png new file mode 100644 index 0000000..1d2847b Binary files /dev/null and b/src/gems/Frostbolt.png differ diff --git a/src/gems/Generosity.png b/src/gems/Generosity.png new file mode 100644 index 0000000..6090a45 Binary files /dev/null and b/src/gems/Generosity.png differ diff --git a/src/gems/Glacial Cascade.png b/src/gems/Glacial Cascade.png new file mode 100644 index 0000000..ea407e2 Binary files /dev/null and b/src/gems/Glacial Cascade.png differ diff --git a/src/gems/Glacial Hammer.png b/src/gems/Glacial Hammer.png new file mode 100644 index 0000000..8b5e853 Binary files /dev/null and b/src/gems/Glacial Hammer.png differ diff --git a/src/gems/Grace.png b/src/gems/Grace.png new file mode 100644 index 0000000..f5f8800 Binary files /dev/null and b/src/gems/Grace.png differ diff --git a/src/gems/Greater Multiple Projectiles.png b/src/gems/Greater Multiple Projectiles.png new file mode 100644 index 0000000..f80279b Binary files /dev/null and b/src/gems/Greater Multiple Projectiles.png differ diff --git a/src/gems/Ground Slam.png b/src/gems/Ground Slam.png new file mode 100644 index 0000000..9f615b3 Binary files /dev/null and b/src/gems/Ground Slam.png differ diff --git a/src/gems/Haste.png b/src/gems/Haste.png new file mode 100644 index 0000000..675aca7 Binary files /dev/null and b/src/gems/Haste.png differ diff --git a/src/gems/Hatred.png b/src/gems/Hatred.png new file mode 100644 index 0000000..6ef404d Binary files /dev/null and b/src/gems/Hatred.png differ diff --git a/src/gems/Heavy Strike.png b/src/gems/Heavy Strike.png new file mode 100644 index 0000000..9fac616 Binary files /dev/null and b/src/gems/Heavy Strike.png differ diff --git a/src/gems/Herald of Agony.png b/src/gems/Herald of Agony.png new file mode 100644 index 0000000..acf6a6e Binary files /dev/null and b/src/gems/Herald of Agony.png differ diff --git a/src/gems/Herald of Ash.png b/src/gems/Herald of Ash.png new file mode 100644 index 0000000..54f6fe8 Binary files /dev/null and b/src/gems/Herald of Ash.png differ diff --git a/src/gems/Herald of Ice.png b/src/gems/Herald of Ice.png new file mode 100644 index 0000000..f476787 Binary files /dev/null and b/src/gems/Herald of Ice.png differ diff --git a/src/gems/Herald of Purity.png b/src/gems/Herald of Purity.png new file mode 100644 index 0000000..dc31932 Binary files /dev/null and b/src/gems/Herald of Purity.png differ diff --git a/src/gems/Herald of Thunder.png b/src/gems/Herald of Thunder.png new file mode 100644 index 0000000..a19d339 Binary files /dev/null and b/src/gems/Herald of Thunder.png differ diff --git a/src/gems/Hypothermia.png b/src/gems/Hypothermia.png new file mode 100644 index 0000000..d742d1a Binary files /dev/null and b/src/gems/Hypothermia.png differ diff --git a/src/gems/Ice Bite.png b/src/gems/Ice Bite.png new file mode 100644 index 0000000..3629d76 Binary files /dev/null and b/src/gems/Ice Bite.png differ diff --git a/src/gems/Ice Crash.png b/src/gems/Ice Crash.png new file mode 100644 index 0000000..85470a3 Binary files /dev/null and b/src/gems/Ice Crash.png differ diff --git a/src/gems/Ice Nova.png b/src/gems/Ice Nova.png new file mode 100644 index 0000000..55aeccb Binary files /dev/null and b/src/gems/Ice Nova.png differ diff --git a/src/gems/Ice Shot.png b/src/gems/Ice Shot.png new file mode 100644 index 0000000..bb609d1 Binary files /dev/null and b/src/gems/Ice Shot.png differ diff --git a/src/gems/Ice Spear.png b/src/gems/Ice Spear.png new file mode 100644 index 0000000..7cc5649 Binary files /dev/null and b/src/gems/Ice Spear.png differ diff --git a/src/gems/Ice Trap.png b/src/gems/Ice Trap.png new file mode 100644 index 0000000..9cab746 Binary files /dev/null and b/src/gems/Ice Trap.png differ diff --git a/src/gems/Ignite Proliferation.png b/src/gems/Ignite Proliferation.png new file mode 100644 index 0000000..5910a10 Binary files /dev/null and b/src/gems/Ignite Proliferation.png differ diff --git a/src/gems/Immolate.png b/src/gems/Immolate.png new file mode 100644 index 0000000..facf8f5 Binary files /dev/null and b/src/gems/Immolate.png differ diff --git a/src/gems/Immortal Call.png b/src/gems/Immortal Call.png new file mode 100644 index 0000000..845786e Binary files /dev/null and b/src/gems/Immortal Call.png differ diff --git a/src/gems/Incinerate.png b/src/gems/Incinerate.png new file mode 100644 index 0000000..127f85a Binary files /dev/null and b/src/gems/Incinerate.png differ diff --git a/src/gems/Increased Area of Effect.png b/src/gems/Increased Area of Effect.png new file mode 100644 index 0000000..d2e5d82 Binary files /dev/null and b/src/gems/Increased Area of Effect.png differ diff --git a/src/gems/Increased Burning Damage.png b/src/gems/Increased Burning Damage.png new file mode 100644 index 0000000..b712372 Binary files /dev/null and b/src/gems/Increased Burning Damage.png differ diff --git a/src/gems/Increased Critical Damage.png b/src/gems/Increased Critical Damage.png new file mode 100644 index 0000000..ad00e00 Binary files /dev/null and b/src/gems/Increased Critical Damage.png differ diff --git a/src/gems/Increased Critical Strikes.png b/src/gems/Increased Critical Strikes.png new file mode 100644 index 0000000..c4dbd4d Binary files /dev/null and b/src/gems/Increased Critical Strikes.png differ diff --git a/src/gems/Increased Duration.png b/src/gems/Increased Duration.png new file mode 100644 index 0000000..17458ea Binary files /dev/null and b/src/gems/Increased Duration.png differ diff --git a/src/gems/Infernal Blow.png b/src/gems/Infernal Blow.png new file mode 100644 index 0000000..2afcbac Binary files /dev/null and b/src/gems/Infernal Blow.png differ diff --git a/src/gems/Innervate.png b/src/gems/Innervate.png new file mode 100644 index 0000000..d4398e5 Binary files /dev/null and b/src/gems/Innervate.png differ diff --git a/src/gems/Iron Grip.png b/src/gems/Iron Grip.png new file mode 100644 index 0000000..08a5b30 Binary files /dev/null and b/src/gems/Iron Grip.png differ diff --git a/src/gems/Iron Will.png b/src/gems/Iron Will.png new file mode 100644 index 0000000..15b7894 Binary files /dev/null and b/src/gems/Iron Will.png differ diff --git a/src/gems/Item Rarity.png b/src/gems/Item Rarity.png new file mode 100644 index 0000000..dc2ade6 Binary files /dev/null and b/src/gems/Item Rarity.png differ diff --git a/src/gems/Kinetic Blast.png b/src/gems/Kinetic Blast.png new file mode 100644 index 0000000..0a68779 Binary files /dev/null and b/src/gems/Kinetic Blast.png differ diff --git a/src/gems/Knockback.png b/src/gems/Knockback.png new file mode 100644 index 0000000..1a8636f Binary files /dev/null and b/src/gems/Knockback.png differ diff --git a/src/gems/Lacerate.png b/src/gems/Lacerate.png new file mode 100644 index 0000000..10a8bc6 Binary files /dev/null and b/src/gems/Lacerate.png differ diff --git a/src/gems/Lancing Steel.png b/src/gems/Lancing Steel.png new file mode 100644 index 0000000..e877656 Binary files /dev/null and b/src/gems/Lancing Steel.png differ diff --git a/src/gems/Leap Slam.png b/src/gems/Leap Slam.png new file mode 100644 index 0000000..7e52b7a Binary files /dev/null and b/src/gems/Leap Slam.png differ diff --git a/src/gems/Less Duration.png b/src/gems/Less Duration.png new file mode 100644 index 0000000..265088a Binary files /dev/null and b/src/gems/Less Duration.png differ diff --git a/src/gems/Lesser Multiple Projectiles.png b/src/gems/Lesser Multiple Projectiles.png new file mode 100644 index 0000000..060dfec Binary files /dev/null and b/src/gems/Lesser Multiple Projectiles.png differ diff --git a/src/gems/Lesser Poison.png b/src/gems/Lesser Poison.png new file mode 100644 index 0000000..0bfef71 Binary files /dev/null and b/src/gems/Lesser Poison.png differ diff --git a/src/gems/Life Gain on Hit.png b/src/gems/Life Gain on Hit.png new file mode 100644 index 0000000..9653ca6 Binary files /dev/null and b/src/gems/Life Gain on Hit.png differ diff --git a/src/gems/Life Leech.png b/src/gems/Life Leech.png new file mode 100644 index 0000000..768be76 Binary files /dev/null and b/src/gems/Life Leech.png differ diff --git a/src/gems/Lightning Arrow.png b/src/gems/Lightning Arrow.png new file mode 100644 index 0000000..ed654a8 Binary files /dev/null and b/src/gems/Lightning Arrow.png differ diff --git a/src/gems/Lightning Penetration.png b/src/gems/Lightning Penetration.png new file mode 100644 index 0000000..ef8ec8a Binary files /dev/null and b/src/gems/Lightning Penetration.png differ diff --git a/src/gems/Lightning Spire Trap.png b/src/gems/Lightning Spire Trap.png new file mode 100644 index 0000000..e5f3eec Binary files /dev/null and b/src/gems/Lightning Spire Trap.png differ diff --git a/src/gems/Lightning Strike.png b/src/gems/Lightning Strike.png new file mode 100644 index 0000000..3a003ed Binary files /dev/null and b/src/gems/Lightning Strike.png differ diff --git a/src/gems/Lightning Tendrils.png b/src/gems/Lightning Tendrils.png new file mode 100644 index 0000000..0e6983e Binary files /dev/null and b/src/gems/Lightning Tendrils.png differ diff --git a/src/gems/Lightning Trap.png b/src/gems/Lightning Trap.png new file mode 100644 index 0000000..c1f24ed Binary files /dev/null and b/src/gems/Lightning Trap.png differ diff --git a/src/gems/Lightning Warp.png b/src/gems/Lightning Warp.png new file mode 100644 index 0000000..c6f98dc Binary files /dev/null and b/src/gems/Lightning Warp.png differ diff --git a/src/gems/Magma Orb.png b/src/gems/Magma Orb.png new file mode 100644 index 0000000..4faddf8 Binary files /dev/null and b/src/gems/Magma Orb.png differ diff --git a/src/gems/Maim.png b/src/gems/Maim.png new file mode 100644 index 0000000..ef50d5e Binary files /dev/null and b/src/gems/Maim.png differ diff --git a/src/gems/Mana Leech.png b/src/gems/Mana Leech.png new file mode 100644 index 0000000..74e35a4 Binary files /dev/null and b/src/gems/Mana Leech.png differ diff --git a/src/gems/Melee Damage on Full Life.png b/src/gems/Melee Damage on Full Life.png new file mode 100644 index 0000000..3271fb6 Binary files /dev/null and b/src/gems/Melee Damage on Full Life.png differ diff --git a/src/gems/Melee Physical Damage.png b/src/gems/Melee Physical Damage.png new file mode 100644 index 0000000..f6a5631 Binary files /dev/null and b/src/gems/Melee Physical Damage.png differ diff --git a/src/gems/Melee Splash.png b/src/gems/Melee Splash.png new file mode 100644 index 0000000..db7a5ee Binary files /dev/null and b/src/gems/Melee Splash.png differ diff --git a/src/gems/Minefield.png b/src/gems/Minefield.png new file mode 100644 index 0000000..2ad91ed Binary files /dev/null and b/src/gems/Minefield.png differ diff --git a/src/gems/Minion Damage.png b/src/gems/Minion Damage.png new file mode 100644 index 0000000..b0f3911 Binary files /dev/null and b/src/gems/Minion Damage.png differ diff --git a/src/gems/Minion Life.png b/src/gems/Minion Life.png new file mode 100644 index 0000000..004a1d5 Binary files /dev/null and b/src/gems/Minion Life.png differ diff --git a/src/gems/Minion Speed.png b/src/gems/Minion Speed.png new file mode 100644 index 0000000..9465668 Binary files /dev/null and b/src/gems/Minion Speed.png differ diff --git a/src/gems/Minion and Totem Elemental Resistance.png b/src/gems/Minion and Totem Elemental Resistance.png new file mode 100644 index 0000000..d0ec369 Binary files /dev/null and b/src/gems/Minion and Totem Elemental Resistance.png differ diff --git a/src/gems/Mirage Archer.png b/src/gems/Mirage Archer.png new file mode 100644 index 0000000..45256f3 Binary files /dev/null and b/src/gems/Mirage Archer.png differ diff --git a/src/gems/Mirror Arrow.png b/src/gems/Mirror Arrow.png new file mode 100644 index 0000000..e38860b Binary files /dev/null and b/src/gems/Mirror Arrow.png differ diff --git a/src/gems/Molten Shell.png b/src/gems/Molten Shell.png new file mode 100644 index 0000000..3a55851 Binary files /dev/null and b/src/gems/Molten Shell.png differ diff --git a/src/gems/Molten Strike.png b/src/gems/Molten Strike.png new file mode 100644 index 0000000..827a92d Binary files /dev/null and b/src/gems/Molten Strike.png differ diff --git a/src/gems/Multiple Totems.png b/src/gems/Multiple Totems.png new file mode 100644 index 0000000..b6332fb Binary files /dev/null and b/src/gems/Multiple Totems.png differ diff --git a/src/gems/Multiple Traps.png b/src/gems/Multiple Traps.png new file mode 100644 index 0000000..3109cc3 Binary files /dev/null and b/src/gems/Multiple Traps.png differ diff --git a/src/gems/Multistrike.png b/src/gems/Multistrike.png new file mode 100644 index 0000000..dd5faa6 Binary files /dev/null and b/src/gems/Multistrike.png differ diff --git a/src/gems/Onslaught.png b/src/gems/Onslaught.png new file mode 100644 index 0000000..fbdbd6b Binary files /dev/null and b/src/gems/Onslaught.png differ diff --git a/src/gems/Orb of Storms.png b/src/gems/Orb of Storms.png new file mode 100644 index 0000000..71250e2 Binary files /dev/null and b/src/gems/Orb of Storms.png differ diff --git a/src/gems/Phase Run.png b/src/gems/Phase Run.png new file mode 100644 index 0000000..b06e433 Binary files /dev/null and b/src/gems/Phase Run.png differ diff --git a/src/gems/Physical Projectile Attack Damage.png b/src/gems/Physical Projectile Attack Damage.png new file mode 100644 index 0000000..da7b7c3 Binary files /dev/null and b/src/gems/Physical Projectile Attack Damage.png differ diff --git a/src/gems/Physical to Lightning.png b/src/gems/Physical to Lightning.png new file mode 100644 index 0000000..5ca6455 Binary files /dev/null and b/src/gems/Physical to Lightning.png differ diff --git a/src/gems/Pierce.png b/src/gems/Pierce.png new file mode 100644 index 0000000..e72fcec Binary files /dev/null and b/src/gems/Pierce.png differ diff --git a/src/gems/Poacher's Mark.png b/src/gems/Poacher's Mark.png new file mode 100644 index 0000000..e6221e1 Binary files /dev/null and b/src/gems/Poacher's Mark.png differ diff --git a/src/gems/Point Blank.png b/src/gems/Point Blank.png new file mode 100644 index 0000000..89b36a7 Binary files /dev/null and b/src/gems/Point Blank.png differ diff --git a/src/gems/Poison.png b/src/gems/Poison.png new file mode 100644 index 0000000..b840602 Binary files /dev/null and b/src/gems/Poison.png differ diff --git a/src/gems/Portal.png b/src/gems/Portal.png new file mode 100644 index 0000000..79f239d Binary files /dev/null and b/src/gems/Portal.png differ diff --git a/src/gems/Power Charge On Critical.png b/src/gems/Power Charge On Critical.png new file mode 100644 index 0000000..3f027ea Binary files /dev/null and b/src/gems/Power Charge On Critical.png differ diff --git a/src/gems/Power Siphon.png b/src/gems/Power Siphon.png new file mode 100644 index 0000000..fb6a2f7 Binary files /dev/null and b/src/gems/Power Siphon.png differ diff --git a/src/gems/Projectile Weakness.png b/src/gems/Projectile Weakness.png new file mode 100644 index 0000000..6d10cac Binary files /dev/null and b/src/gems/Projectile Weakness.png differ diff --git a/src/gems/Puncture.png b/src/gems/Puncture.png new file mode 100644 index 0000000..13ba1fb Binary files /dev/null and b/src/gems/Puncture.png differ diff --git a/src/gems/Punishment.png b/src/gems/Punishment.png new file mode 100644 index 0000000..ac738d2 Binary files /dev/null and b/src/gems/Punishment.png differ diff --git a/src/gems/Purity of Elements.png b/src/gems/Purity of Elements.png new file mode 100644 index 0000000..06d05ff Binary files /dev/null and b/src/gems/Purity of Elements.png differ diff --git a/src/gems/Purity of Fire.png b/src/gems/Purity of Fire.png new file mode 100644 index 0000000..ee6bdb4 Binary files /dev/null and b/src/gems/Purity of Fire.png differ diff --git a/src/gems/Purity of Ice.png b/src/gems/Purity of Ice.png new file mode 100644 index 0000000..4c12483 Binary files /dev/null and b/src/gems/Purity of Ice.png differ diff --git a/src/gems/Purity of Lightning.png b/src/gems/Purity of Lightning.png new file mode 100644 index 0000000..de9762a Binary files /dev/null and b/src/gems/Purity of Lightning.png differ diff --git a/src/gems/Rain of Arrows.png b/src/gems/Rain of Arrows.png new file mode 100644 index 0000000..6b20662 Binary files /dev/null and b/src/gems/Rain of Arrows.png differ diff --git a/src/gems/Raise Spectre.png b/src/gems/Raise Spectre.png new file mode 100644 index 0000000..7bb93f0 Binary files /dev/null and b/src/gems/Raise Spectre.png differ diff --git a/src/gems/Raise Zombie.png b/src/gems/Raise Zombie.png new file mode 100644 index 0000000..df92901 Binary files /dev/null and b/src/gems/Raise Zombie.png differ diff --git a/src/gems/Rallying Cry.png b/src/gems/Rallying Cry.png new file mode 100644 index 0000000..ff0744d Binary files /dev/null and b/src/gems/Rallying Cry.png differ diff --git a/src/gems/Ranged Attack Totem.png b/src/gems/Ranged Attack Totem.png new file mode 100644 index 0000000..57dbd8f Binary files /dev/null and b/src/gems/Ranged Attack Totem.png differ diff --git a/src/gems/Rapid Decay.png b/src/gems/Rapid Decay.png new file mode 100644 index 0000000..7fa2b56 Binary files /dev/null and b/src/gems/Rapid Decay.png differ diff --git a/src/gems/Reave.png b/src/gems/Reave.png new file mode 100644 index 0000000..1b318bd Binary files /dev/null and b/src/gems/Reave.png differ diff --git a/src/gems/Reckoning.png b/src/gems/Reckoning.png new file mode 100644 index 0000000..91687c3 Binary files /dev/null and b/src/gems/Reckoning.png differ diff --git a/src/gems/Reduced Mana.png b/src/gems/Reduced Mana.png new file mode 100644 index 0000000..a17654b Binary files /dev/null and b/src/gems/Reduced Mana.png differ diff --git a/src/gems/Rejuvenation Totem.png b/src/gems/Rejuvenation Totem.png new file mode 100644 index 0000000..bb6745b Binary files /dev/null and b/src/gems/Rejuvenation Totem.png differ diff --git a/src/gems/Remote Mine.png b/src/gems/Remote Mine.png new file mode 100644 index 0000000..7349a63 Binary files /dev/null and b/src/gems/Remote Mine.png differ diff --git a/src/gems/Righteous Fire.png b/src/gems/Righteous Fire.png new file mode 100644 index 0000000..c21b274 Binary files /dev/null and b/src/gems/Righteous Fire.png differ diff --git a/src/gems/Riposte.png b/src/gems/Riposte.png new file mode 100644 index 0000000..d7d4d39 Binary files /dev/null and b/src/gems/Riposte.png differ diff --git a/src/gems/Ruthless.png b/src/gems/Ruthless.png new file mode 100644 index 0000000..114aa6d Binary files /dev/null and b/src/gems/Ruthless.png differ diff --git a/src/gems/Scorching Ray.png b/src/gems/Scorching Ray.png new file mode 100644 index 0000000..b7c97bc Binary files /dev/null and b/src/gems/Scorching Ray.png differ diff --git a/src/gems/Scourge Arrow.png b/src/gems/Scourge Arrow.png new file mode 100644 index 0000000..b401570 Binary files /dev/null and b/src/gems/Scourge Arrow.png differ diff --git a/src/gems/Searing Bond.png b/src/gems/Searing Bond.png new file mode 100644 index 0000000..1f23bf5 Binary files /dev/null and b/src/gems/Searing Bond.png differ diff --git a/src/gems/Seismic Trap.png b/src/gems/Seismic Trap.png new file mode 100644 index 0000000..7e5b551 Binary files /dev/null and b/src/gems/Seismic Trap.png differ diff --git a/src/gems/Shattering Steel.png b/src/gems/Shattering Steel.png new file mode 100644 index 0000000..9109a06 Binary files /dev/null and b/src/gems/Shattering Steel.png differ diff --git a/src/gems/Shield Charge.png b/src/gems/Shield Charge.png new file mode 100644 index 0000000..f9b6649 Binary files /dev/null and b/src/gems/Shield Charge.png differ diff --git a/src/gems/Shock Nova.png b/src/gems/Shock Nova.png new file mode 100644 index 0000000..3f01490 Binary files /dev/null and b/src/gems/Shock Nova.png differ diff --git a/src/gems/Shockwave Totem.png b/src/gems/Shockwave Totem.png new file mode 100644 index 0000000..9e10b29 Binary files /dev/null and b/src/gems/Shockwave Totem.png differ diff --git a/src/gems/Shrapnel Shot.png b/src/gems/Shrapnel Shot.png new file mode 100644 index 0000000..e9087ab Binary files /dev/null and b/src/gems/Shrapnel Shot.png differ diff --git a/src/gems/Siege Ballista.png b/src/gems/Siege Ballista.png new file mode 100644 index 0000000..8bc88b5 Binary files /dev/null and b/src/gems/Siege Ballista.png differ diff --git a/src/gems/Siphoning Trap.png b/src/gems/Siphoning Trap.png new file mode 100644 index 0000000..c5909ed Binary files /dev/null and b/src/gems/Siphoning Trap.png differ diff --git a/src/gems/Slower Projectiles.png b/src/gems/Slower Projectiles.png new file mode 100644 index 0000000..50a688b Binary files /dev/null and b/src/gems/Slower Projectiles.png differ diff --git a/src/gems/Smite.png b/src/gems/Smite.png new file mode 100644 index 0000000..44cc064 Binary files /dev/null and b/src/gems/Smite.png differ diff --git a/src/gems/Smoke Mine.png b/src/gems/Smoke Mine.png new file mode 100644 index 0000000..d7f5887 Binary files /dev/null and b/src/gems/Smoke Mine.png differ diff --git a/src/gems/Spark.png b/src/gems/Spark.png new file mode 100644 index 0000000..e574e78 Binary files /dev/null and b/src/gems/Spark.png differ diff --git a/src/gems/Spectral Shield Throw.png b/src/gems/Spectral Shield Throw.png new file mode 100644 index 0000000..f369f55 Binary files /dev/null and b/src/gems/Spectral Shield Throw.png differ diff --git a/src/gems/Spectral Throw.png b/src/gems/Spectral Throw.png new file mode 100644 index 0000000..62dc44e Binary files /dev/null and b/src/gems/Spectral Throw.png differ diff --git a/src/gems/Spell Cascade.png b/src/gems/Spell Cascade.png new file mode 100644 index 0000000..ce20abb Binary files /dev/null and b/src/gems/Spell Cascade.png differ diff --git a/src/gems/Spell Echo.png b/src/gems/Spell Echo.png new file mode 100644 index 0000000..8159890 Binary files /dev/null and b/src/gems/Spell Echo.png differ diff --git a/src/gems/Spell Totem.png b/src/gems/Spell Totem.png new file mode 100644 index 0000000..ea825b4 Binary files /dev/null and b/src/gems/Spell Totem.png differ diff --git a/src/gems/Spirit Offering.png b/src/gems/Spirit Offering.png new file mode 100644 index 0000000..275bd04 Binary files /dev/null and b/src/gems/Spirit Offering.png differ diff --git a/src/gems/Split Arrow.png b/src/gems/Split Arrow.png new file mode 100644 index 0000000..1eca036 Binary files /dev/null and b/src/gems/Split Arrow.png differ diff --git a/src/gems/Static Strike.png b/src/gems/Static Strike.png new file mode 100644 index 0000000..b3b2316 Binary files /dev/null and b/src/gems/Static Strike.png differ diff --git a/src/gems/Storm Barrier.png b/src/gems/Storm Barrier.png new file mode 100644 index 0000000..26d84dc Binary files /dev/null and b/src/gems/Storm Barrier.png differ diff --git a/src/gems/Storm Brand.png b/src/gems/Storm Brand.png new file mode 100644 index 0000000..aa65591 Binary files /dev/null and b/src/gems/Storm Brand.png differ diff --git a/src/gems/Storm Burst.png b/src/gems/Storm Burst.png new file mode 100644 index 0000000..f62d912 Binary files /dev/null and b/src/gems/Storm Burst.png differ diff --git a/src/gems/Storm Call.png b/src/gems/Storm Call.png new file mode 100644 index 0000000..e4c50da Binary files /dev/null and b/src/gems/Storm Call.png differ diff --git a/src/gems/Stun.png b/src/gems/Stun.png new file mode 100644 index 0000000..faca759 Binary files /dev/null and b/src/gems/Stun.png differ diff --git a/src/gems/Summon Chaos Golem.png b/src/gems/Summon Chaos Golem.png new file mode 100644 index 0000000..9b8798c Binary files /dev/null and b/src/gems/Summon Chaos Golem.png differ diff --git a/src/gems/Summon Holy Relic.png b/src/gems/Summon Holy Relic.png new file mode 100644 index 0000000..7aecb54 Binary files /dev/null and b/src/gems/Summon Holy Relic.png differ diff --git a/src/gems/Summon Ice Golem.png b/src/gems/Summon Ice Golem.png new file mode 100644 index 0000000..b47067d Binary files /dev/null and b/src/gems/Summon Ice Golem.png differ diff --git a/src/gems/Summon Lightning Golem.png b/src/gems/Summon Lightning Golem.png new file mode 100644 index 0000000..8d9eb4a Binary files /dev/null and b/src/gems/Summon Lightning Golem.png differ diff --git a/src/gems/Summon Phantasm on Kill.png b/src/gems/Summon Phantasm on Kill.png new file mode 100644 index 0000000..89d2efe Binary files /dev/null and b/src/gems/Summon Phantasm on Kill.png differ diff --git a/src/gems/Summon Raging Spirit.png b/src/gems/Summon Raging Spirit.png new file mode 100644 index 0000000..eef3f11 Binary files /dev/null and b/src/gems/Summon Raging Spirit.png differ diff --git a/src/gems/Summon Skeleton.png b/src/gems/Summon Skeleton.png new file mode 100644 index 0000000..541cc32 Binary files /dev/null and b/src/gems/Summon Skeleton.png differ diff --git a/src/gems/Summon Skeletons.png b/src/gems/Summon Skeletons.png new file mode 100644 index 0000000..541cc32 Binary files /dev/null and b/src/gems/Summon Skeletons.png differ diff --git a/src/gems/Summon Stone Golem.png b/src/gems/Summon Stone Golem.png new file mode 100644 index 0000000..a48a019 Binary files /dev/null and b/src/gems/Summon Stone Golem.png differ diff --git a/src/gems/Sunder.png b/src/gems/Sunder.png new file mode 100644 index 0000000..6ca0312 Binary files /dev/null and b/src/gems/Sunder.png differ diff --git a/src/gems/Sweep.png b/src/gems/Sweep.png new file mode 100644 index 0000000..48e9097 Binary files /dev/null and b/src/gems/Sweep.png differ diff --git a/src/gems/Swift Affliction.png b/src/gems/Swift Affliction.png new file mode 100644 index 0000000..7fa2b56 Binary files /dev/null and b/src/gems/Swift Affliction.png differ diff --git a/src/gems/Tectonic Slam.png b/src/gems/Tectonic Slam.png new file mode 100644 index 0000000..2ab5751 Binary files /dev/null and b/src/gems/Tectonic Slam.png differ diff --git a/src/gems/Tempest Shield.png b/src/gems/Tempest Shield.png new file mode 100644 index 0000000..9dc94d4 Binary files /dev/null and b/src/gems/Tempest Shield.png differ diff --git a/src/gems/Temporal Chains.png b/src/gems/Temporal Chains.png new file mode 100644 index 0000000..7fe32f8 Binary files /dev/null and b/src/gems/Temporal Chains.png differ diff --git a/src/gems/Tornado Shot.png b/src/gems/Tornado Shot.png new file mode 100644 index 0000000..d1a5e97 Binary files /dev/null and b/src/gems/Tornado Shot.png differ diff --git a/src/gems/Toxic Rain.png b/src/gems/Toxic Rain.png new file mode 100644 index 0000000..61f368c Binary files /dev/null and b/src/gems/Toxic Rain.png differ diff --git a/src/gems/Trap Cooldown.png b/src/gems/Trap Cooldown.png new file mode 100644 index 0000000..fbb1b2e Binary files /dev/null and b/src/gems/Trap Cooldown.png differ diff --git a/src/gems/Trap and Mine Damage.png b/src/gems/Trap and Mine Damage.png new file mode 100644 index 0000000..e4e0372 Binary files /dev/null and b/src/gems/Trap and Mine Damage.png differ diff --git a/src/gems/Trap.png b/src/gems/Trap.png new file mode 100644 index 0000000..b294fbb Binary files /dev/null and b/src/gems/Trap.png differ diff --git a/src/gems/Unbound Ailments.png b/src/gems/Unbound Ailments.png new file mode 100644 index 0000000..d7ae223 Binary files /dev/null and b/src/gems/Unbound Ailments.png differ diff --git a/src/gems/Unearth.png b/src/gems/Unearth.png new file mode 100644 index 0000000..c7fc6c0 Binary files /dev/null and b/src/gems/Unearth.png differ diff --git a/src/gems/Vaal Ancestral Warchief.png b/src/gems/Vaal Ancestral Warchief.png new file mode 100644 index 0000000..87cc038 Binary files /dev/null and b/src/gems/Vaal Ancestral Warchief.png differ diff --git a/src/gems/Vaal Arc.png b/src/gems/Vaal Arc.png new file mode 100644 index 0000000..a338beb Binary files /dev/null and b/src/gems/Vaal Arc.png differ diff --git a/src/gems/Vaal Blade Vortex.png b/src/gems/Vaal Blade Vortex.png new file mode 100644 index 0000000..e85e307 Binary files /dev/null and b/src/gems/Vaal Blade Vortex.png differ diff --git a/src/gems/Vaal Blight.png b/src/gems/Vaal Blight.png new file mode 100644 index 0000000..dc9cf95 Binary files /dev/null and b/src/gems/Vaal Blight.png differ diff --git a/src/gems/Vaal Breach.png b/src/gems/Vaal Breach.png new file mode 100644 index 0000000..dc9cf95 Binary files /dev/null and b/src/gems/Vaal Breach.png differ diff --git a/src/gems/Vaal Burning Arrow.png b/src/gems/Vaal Burning Arrow.png new file mode 100644 index 0000000..abc2c3d Binary files /dev/null and b/src/gems/Vaal Burning Arrow.png differ diff --git a/src/gems/Vaal Clarity.png b/src/gems/Vaal Clarity.png new file mode 100644 index 0000000..d3ac358 Binary files /dev/null and b/src/gems/Vaal Clarity.png differ diff --git a/src/gems/Vaal Cold Snap.png b/src/gems/Vaal Cold Snap.png new file mode 100644 index 0000000..a9f1dcc Binary files /dev/null and b/src/gems/Vaal Cold Snap.png differ diff --git a/src/gems/Vaal Cyclone.png b/src/gems/Vaal Cyclone.png new file mode 100644 index 0000000..4f0e70b Binary files /dev/null and b/src/gems/Vaal Cyclone.png differ diff --git a/src/gems/Vaal Detonate Dead.png b/src/gems/Vaal Detonate Dead.png new file mode 100644 index 0000000..c9a6427 Binary files /dev/null and b/src/gems/Vaal Detonate Dead.png differ diff --git a/src/gems/Vaal Discipline.png b/src/gems/Vaal Discipline.png new file mode 100644 index 0000000..f390518 Binary files /dev/null and b/src/gems/Vaal Discipline.png differ diff --git a/src/gems/Vaal Double Strike.png b/src/gems/Vaal Double Strike.png new file mode 100644 index 0000000..0dbfb87 Binary files /dev/null and b/src/gems/Vaal Double Strike.png differ diff --git a/src/gems/Vaal Earthquake.png b/src/gems/Vaal Earthquake.png new file mode 100644 index 0000000..cc3a959 Binary files /dev/null and b/src/gems/Vaal Earthquake.png differ diff --git a/src/gems/Vaal Fireball.png b/src/gems/Vaal Fireball.png new file mode 100644 index 0000000..773a36d Binary files /dev/null and b/src/gems/Vaal Fireball.png differ diff --git a/src/gems/Vaal Flameblast.png b/src/gems/Vaal Flameblast.png new file mode 100644 index 0000000..5d6af33 Binary files /dev/null and b/src/gems/Vaal Flameblast.png differ diff --git a/src/gems/Vaal Glacial Hammer.png b/src/gems/Vaal Glacial Hammer.png new file mode 100644 index 0000000..379a124 Binary files /dev/null and b/src/gems/Vaal Glacial Hammer.png differ diff --git a/src/gems/Vaal Grace.png b/src/gems/Vaal Grace.png new file mode 100644 index 0000000..c14f382 Binary files /dev/null and b/src/gems/Vaal Grace.png differ diff --git a/src/gems/Vaal Ground Slam.png b/src/gems/Vaal Ground Slam.png new file mode 100644 index 0000000..3c93da8 Binary files /dev/null and b/src/gems/Vaal Ground Slam.png differ diff --git a/src/gems/Vaal Haste.png b/src/gems/Vaal Haste.png new file mode 100644 index 0000000..8771432 Binary files /dev/null and b/src/gems/Vaal Haste.png differ diff --git a/src/gems/Vaal Ice Nova.png b/src/gems/Vaal Ice Nova.png new file mode 100644 index 0000000..2932113 Binary files /dev/null and b/src/gems/Vaal Ice Nova.png differ diff --git a/src/gems/Vaal Immortal Call.png b/src/gems/Vaal Immortal Call.png new file mode 100644 index 0000000..9445f9a Binary files /dev/null and b/src/gems/Vaal Immortal Call.png differ diff --git a/src/gems/Vaal Impurity of Fire.png b/src/gems/Vaal Impurity of Fire.png new file mode 100644 index 0000000..4d1448b Binary files /dev/null and b/src/gems/Vaal Impurity of Fire.png differ diff --git a/src/gems/Vaal Impurity of Ice.png b/src/gems/Vaal Impurity of Ice.png new file mode 100644 index 0000000..3a180d0 Binary files /dev/null and b/src/gems/Vaal Impurity of Ice.png differ diff --git a/src/gems/Vaal Impurity of Lightning.png b/src/gems/Vaal Impurity of Lightning.png new file mode 100644 index 0000000..c1f9297 Binary files /dev/null and b/src/gems/Vaal Impurity of Lightning.png differ diff --git a/src/gems/Vaal Lightning Strike.png b/src/gems/Vaal Lightning Strike.png new file mode 100644 index 0000000..a875a0d Binary files /dev/null and b/src/gems/Vaal Lightning Strike.png differ diff --git a/src/gems/Vaal Lightning Trap.png b/src/gems/Vaal Lightning Trap.png new file mode 100644 index 0000000..3807261 Binary files /dev/null and b/src/gems/Vaal Lightning Trap.png differ diff --git a/src/gems/Vaal Lightning Warp.png b/src/gems/Vaal Lightning Warp.png new file mode 100644 index 0000000..797c49d Binary files /dev/null and b/src/gems/Vaal Lightning Warp.png differ diff --git a/src/gems/Vaal Molten Shell.png b/src/gems/Vaal Molten Shell.png new file mode 100644 index 0000000..818b95e Binary files /dev/null and b/src/gems/Vaal Molten Shell.png differ diff --git a/src/gems/Vaal Power Siphon.png b/src/gems/Vaal Power Siphon.png new file mode 100644 index 0000000..65fd66a Binary files /dev/null and b/src/gems/Vaal Power Siphon.png differ diff --git a/src/gems/Vaal Rain of Arrows.png b/src/gems/Vaal Rain of Arrows.png new file mode 100644 index 0000000..8b40394 Binary files /dev/null and b/src/gems/Vaal Rain of Arrows.png differ diff --git a/src/gems/Vaal Reave.png b/src/gems/Vaal Reave.png new file mode 100644 index 0000000..bd0e8c1 Binary files /dev/null and b/src/gems/Vaal Reave.png differ diff --git a/src/gems/Vaal Righteous Fire.png b/src/gems/Vaal Righteous Fire.png new file mode 100644 index 0000000..a925399 Binary files /dev/null and b/src/gems/Vaal Righteous Fire.png differ diff --git a/src/gems/Vaal Spark.png b/src/gems/Vaal Spark.png new file mode 100644 index 0000000..f95f8d3 Binary files /dev/null and b/src/gems/Vaal Spark.png differ diff --git a/src/gems/Vaal Spectral Throw.png b/src/gems/Vaal Spectral Throw.png new file mode 100644 index 0000000..040d1ec Binary files /dev/null and b/src/gems/Vaal Spectral Throw.png differ diff --git a/src/gems/Vaal Storm Call.png b/src/gems/Vaal Storm Call.png new file mode 100644 index 0000000..08a2b46 Binary files /dev/null and b/src/gems/Vaal Storm Call.png differ diff --git a/src/gems/Vaal Summon Skeletons.png b/src/gems/Vaal Summon Skeletons.png new file mode 100644 index 0000000..efdeabf Binary files /dev/null and b/src/gems/Vaal Summon Skeletons.png differ diff --git a/src/gems/Vengeance.png b/src/gems/Vengeance.png new file mode 100644 index 0000000..cbd701c Binary files /dev/null and b/src/gems/Vengeance.png differ diff --git a/src/gems/Vicious Projectiles.png b/src/gems/Vicious Projectiles.png new file mode 100644 index 0000000..da7b7c3 Binary files /dev/null and b/src/gems/Vicious Projectiles.png differ diff --git a/src/gems/Vigilant Strike.png b/src/gems/Vigilant Strike.png new file mode 100644 index 0000000..06543d4 Binary files /dev/null and b/src/gems/Vigilant Strike.png differ diff --git a/src/gems/Vile Toxins.png b/src/gems/Vile Toxins.png new file mode 100644 index 0000000..52fdb88 Binary files /dev/null and b/src/gems/Vile Toxins.png differ diff --git a/src/gems/Viper Strike.png b/src/gems/Viper Strike.png new file mode 100644 index 0000000..31ae9df Binary files /dev/null and b/src/gems/Viper Strike.png differ diff --git a/src/gems/Vitality.png b/src/gems/Vitality.png new file mode 100644 index 0000000..f0d2c0d Binary files /dev/null and b/src/gems/Vitality.png differ diff --git a/src/gems/Void Manipulation.png b/src/gems/Void Manipulation.png new file mode 100644 index 0000000..595867a Binary files /dev/null and b/src/gems/Void Manipulation.png differ diff --git a/src/gems/Volatile Dead.png b/src/gems/Volatile Dead.png new file mode 100644 index 0000000..530ee0d Binary files /dev/null and b/src/gems/Volatile Dead.png differ diff --git a/src/gems/Volley.png b/src/gems/Volley.png new file mode 100644 index 0000000..587f09c Binary files /dev/null and b/src/gems/Volley.png differ diff --git a/src/gems/Vortex.png b/src/gems/Vortex.png new file mode 100644 index 0000000..31204f7 Binary files /dev/null and b/src/gems/Vortex.png differ diff --git a/src/gems/Vulnerability.png b/src/gems/Vulnerability.png new file mode 100644 index 0000000..0eb83d4 Binary files /dev/null and b/src/gems/Vulnerability.png differ diff --git a/src/gems/War Banner.png b/src/gems/War Banner.png new file mode 100644 index 0000000..fbf7bac Binary files /dev/null and b/src/gems/War Banner.png differ diff --git a/src/gems/Warlord's Mark.png b/src/gems/Warlord's Mark.png new file mode 100644 index 0000000..0c9e9e4 Binary files /dev/null and b/src/gems/Warlord's Mark.png differ diff --git a/src/gems/Weapon Elemental Damage.png b/src/gems/Weapon Elemental Damage.png new file mode 100644 index 0000000..0267e6e Binary files /dev/null and b/src/gems/Weapon Elemental Damage.png differ diff --git a/src/gems/Whirling Blades.png b/src/gems/Whirling Blades.png new file mode 100644 index 0000000..179b539 Binary files /dev/null and b/src/gems/Whirling Blades.png differ diff --git a/src/gems/Wild Strike.png b/src/gems/Wild Strike.png new file mode 100644 index 0000000..717c3a3 Binary files /dev/null and b/src/gems/Wild Strike.png differ diff --git a/src/gems/Winter Orb.png b/src/gems/Winter Orb.png new file mode 100644 index 0000000..6afdc8c Binary files /dev/null and b/src/gems/Winter Orb.png differ diff --git a/src/gems/Wither.png b/src/gems/Wither.png new file mode 100644 index 0000000..1cd4b6f Binary files /dev/null and b/src/gems/Wither.png differ diff --git a/src/gems/Withering Touch.png b/src/gems/Withering Touch.png new file mode 100644 index 0000000..5cf7c61 Binary files /dev/null and b/src/gems/Withering Touch.png differ diff --git a/src/gems/Wrath.png b/src/gems/Wrath.png new file mode 100644 index 0000000..d260787 Binary files /dev/null and b/src/gems/Wrath.png differ diff --git a/src/icons/Divination_card_frame.png b/src/icons/Divination_card_frame.png new file mode 100644 index 0000000..a3724d8 Binary files /dev/null and b/src/icons/Divination_card_frame.png differ diff --git a/src/icons/add.png b/src/icons/add.png new file mode 100644 index 0000000..facda3f Binary files /dev/null and b/src/icons/add.png differ diff --git a/src/icons/humility.png b/src/icons/humility.png new file mode 100644 index 0000000..8f49553 Binary files /dev/null and b/src/icons/humility.png differ diff --git a/src/icons/icons8-add-new-96.png b/src/icons/icons8-add-new-96.png new file mode 100644 index 0000000..d0d0c59 Binary files /dev/null and b/src/icons/icons8-add-new-96.png differ diff --git a/src/icons/icons8-cancel-50.png b/src/icons/icons8-cancel-50.png new file mode 100644 index 0000000..b9aaa86 Binary files /dev/null and b/src/icons/icons8-cancel-50.png differ diff --git a/src/icons/icons8-cancel-64.png b/src/icons/icons8-cancel-64.png new file mode 100644 index 0000000..ac2eafd Binary files /dev/null and b/src/icons/icons8-cancel-64.png differ diff --git a/src/icons/icons8-delete-64 (1).png b/src/icons/icons8-delete-64 (1).png new file mode 100644 index 0000000..37b288c Binary files /dev/null and b/src/icons/icons8-delete-64 (1).png differ diff --git a/src/icons/icons8-delete-64 (2).png b/src/icons/icons8-delete-64 (2).png new file mode 100644 index 0000000..46d6b69 Binary files /dev/null and b/src/icons/icons8-delete-64 (2).png differ diff --git a/src/icons/icons8-delete-64.png b/src/icons/icons8-delete-64.png new file mode 100644 index 0000000..757bad5 Binary files /dev/null and b/src/icons/icons8-delete-64.png differ diff --git a/src/icons/icons8-line-80.png b/src/icons/icons8-line-80.png new file mode 100644 index 0000000..627cf70 Binary files /dev/null and b/src/icons/icons8-line-80.png differ diff --git a/src/icons/icons8-line-80color.png b/src/icons/icons8-line-80color.png new file mode 100644 index 0000000..49eb39b Binary files /dev/null and b/src/icons/icons8-line-80color.png differ diff --git a/src/icons/icons8-minus-50.png b/src/icons/icons8-minus-50.png new file mode 100644 index 0000000..a960328 Binary files /dev/null and b/src/icons/icons8-minus-50.png differ diff --git a/src/icons/icons8-minus-64 (1).png b/src/icons/icons8-minus-64 (1).png new file mode 100644 index 0000000..c85d6db Binary files /dev/null and b/src/icons/icons8-minus-64 (1).png differ diff --git a/src/icons/icons8-minus-64 (2).png b/src/icons/icons8-minus-64 (2).png new file mode 100644 index 0000000..81267c3 Binary files /dev/null and b/src/icons/icons8-minus-64 (2).png differ diff --git a/src/icons/icons8-minus-64 (3).png b/src/icons/icons8-minus-64 (3).png new file mode 100644 index 0000000..642435d Binary files /dev/null and b/src/icons/icons8-minus-64 (3).png differ diff --git a/src/icons/icons8-minus-64.png b/src/icons/icons8-minus-64.png new file mode 100644 index 0000000..91b3379 Binary files /dev/null and b/src/icons/icons8-minus-64.png differ diff --git a/src/icons/icons8-plus-math-50 (1).png b/src/icons/icons8-plus-math-50 (1).png new file mode 100644 index 0000000..7ccd5fe Binary files /dev/null and b/src/icons/icons8-plus-math-50 (1).png differ diff --git a/src/icons/icons8-plus-math-50.png b/src/icons/icons8-plus-math-50.png new file mode 100644 index 0000000..8da111a Binary files /dev/null and b/src/icons/icons8-plus-math-50.png differ diff --git a/src/icons/icons8-settings-52.png b/src/icons/icons8-settings-52.png new file mode 100644 index 0000000..f496427 Binary files /dev/null and b/src/icons/icons8-settings-52.png differ diff --git a/src/icons/icons8-sort-left-64.png b/src/icons/icons8-sort-left-64.png new file mode 100644 index 0000000..c385cd3 Binary files /dev/null and b/src/icons/icons8-sort-left-64.png differ diff --git a/src/icons/icons8-subtract-50.png b/src/icons/icons8-subtract-50.png new file mode 100644 index 0000000..b60254e Binary files /dev/null and b/src/icons/icons8-subtract-50.png differ diff --git a/src/icons/paypal-5-226456.png b/src/icons/paypal-5-226456.png new file mode 100644 index 0000000..2a2d124 Binary files /dev/null and b/src/icons/paypal-5-226456.png differ diff --git a/src/icons/poets pen.png b/src/icons/poets pen.png new file mode 100644 index 0000000..0b15975 Binary files /dev/null and b/src/icons/poets pen.png differ diff --git a/src/icons/replace_group.png b/src/icons/replace_group.png new file mode 100644 index 0000000..6fd395d Binary files /dev/null and b/src/icons/replace_group.png differ diff --git a/src/icons/replace_normal.png b/src/icons/replace_normal.png new file mode 100644 index 0000000..cb43bf7 Binary files /dev/null and b/src/icons/replace_normal.png differ diff --git a/src/icons/replace_normal_overlay.png b/src/icons/replace_normal_overlay.png new file mode 100644 index 0000000..442ef64 Binary files /dev/null and b/src/icons/replace_normal_overlay.png differ diff --git a/src/icons/settings_hover.png b/src/icons/settings_hover.png new file mode 100644 index 0000000..3b24579 Binary files /dev/null and b/src/icons/settings_hover.png differ diff --git a/src/json/data.json b/src/json/data.json new file mode 100644 index 0000000..9f7b171 --- /dev/null +++ b/src/json/data.json @@ -0,0 +1,2030 @@ +{ + "acts":[ + { + "act":"Act I", + "actid":1, + "zones":[ + { + "name":"The Twilight Strand", + "level":1, + "image":[ + "none" + ], + "altimage":"Your nightmare lies ahead.", + "note":"Just follow the coastline.", + "haspassive":false, + "hastrial":false, + "quest":"Enemy at the Gate", + "questRewardsSkills":true + }, + { + "name":"The Coast", + "level":2, + "image":[ + "Coast_Seed_1", + "Coast_Seed_2", + "Coast_Seed_3" + ], + "altimage":"none", + "note":"Stick to the right side, following the wall.", + "haspassive":false, + "hastrial":false, + "quest":"none", + "questRewardsSkills":false + }, + { + "name":"The Tidal Island", + "level":3, + "image":[ + "none" + ], + "altimage":"This layout is always a circle.", + "note":"The side without a cliff is the shortest way.", + "haspassive":false, + "hastrial":false, + "quest":"Mercy Mission", + "questRewardsSkills":true + }, + { + "name":"The Mud Flats", + "level":4, + "image":[ + "Mud_Seed_1", + "Mud_Seed_2" + ], + "altimage":"Green circles indicate the area in which the quest items are grouped. Little rivers connect the three items.", + "note":"Collect all the glyphs, to unlock the next area.", + "haspassive":false, + "hastrial":false, + "quest":"Breaking Some Eggs", + "questRewardsSkills":true + }, + { + "name":"The Fetid Pool", + "level":5, + "image":[ + "none" + ], + "altimage":"This layout is always a circle.", + "note":"Kill everything.", + "haspassive":false, + "hastrial":false, + "quest":"A Dirty Job", + "questRewardsSkills":false + }, + { + "name":"The Submerged Passage", + "level":5, + "image":[ + "Sub_Seed_1", + "Sub_Seed_2", + "Sub_Seed_3" + ], + "altimage":"none", + "note":"Find the bridge and place a portal. You will use this later to get the passive point from Deep Dweller", + "haspassive":true, + "hastrial":false, + "quest":"Dweller of the Deep", + "questRewardsSkills":false + }, + { + "name":"The Flooded Depths", + "level":6, + "image":[ + "Flood_Seed_1", + "Flood_Seed_2", + "Flood_Seed_3" + ], + "altimage":"none", + "note":"Kill the crab to get a passive point.", + "haspassive":true, + "hastrial":false, + "quest":"Dweller of the Deep", + "questRewardsSkills":false + }, + { + "name":"The Ledge", + "level":6, + "image":[ + "none" + ], + "altimage":"This layout is always linear, there are little totems on one side of the waypoint, this side will always be the side at which the exit is located.", + "note":"Go to the town at the waypoint, take the portal and find the Flooded Depths.", + "haspassive":false, + "hastrial":false, + "quest":"none", + "questRewardsSkills":false + }, + { + "name":"The Climb", + "level":7, + "image":[ + "Climb_Seed_1", + "Climb_Seed_2" + ], + "altimage":"none", + "note":" Run top right and free Navali.", + "haspassive":false, + "hastrial":false, + "quest":"none", + "questRewardsSkills":false + }, + { + "name":"The Lower Prison", + "level":8, + "image":[ + "LP_Seed_1", + "LP_Seed_2", + "LP_Seed_3", + "LP_Seed_4" + ], + "altimage":"none", + "note":"Usually go right to find the exit, there is a trial in this zone that you can do later thanks to the waypoint.", + "haspassive":false, + "hastrial":true, + "quest":"The Caged Brute", + "questRewardsSkills":true + }, + { + "name":"The Upper Prison", + "level":9, + "image":[ + "UP_Seed_1", + "UP_Seed_2", + "UP_Seed_3", + "UP_Seed_4", + "UP_Seed_5" + ], + "altimage":"none", + "note":"More linear, almost 50/50 with advantage for left side, log out after Brutus. ", + "haspassive":false, + "hastrial":false, + "quest":"The Caged Brute", + "questRewardsSkills":true + }, + { + "name":"Prisoner's Gate", + "level":10, + "image":[ + "PG_Seed_1", + "PG_Seed_2", + "PG_Seed_3", + "PG_Seed_4" + ], + "altimage":"none", + "note":"Look for the side of the road that has the ledge down, usually on the right side.", + "haspassive":false, + "hastrial":false, + "quest":"none", + "questRewardsSkills":false + }, + { + "name":"The Ship Graveyard", + "level":11, + "image":[ + "Ship_Seed_1", + "Ship_Seed_2", + "Ship_Seed_3", + "Ship_Seed_4" + ], + "altimage":"none", + "note":"Look for waypoint first, then find Fairgraves, and move away from the plateau, generally up or down. Find the Cave entrance, leave a portal for later and find the next waypoint in Cavern of Wrath. 2nd visit: After killing Fairgraves go back to the Cavern of Wrath.", + "haspassive":true, + "hastrial":false, + "quest":"The Marooned Mariner", + "questRewardsSkills":false + }, + { + "name":"The Ship Graveyard Cave", + "level":12, + "image":[ + "none" + ], + "altimage":"This layout is always linear, with some deadends.", + "note":"Find the end of the cave, take the quest item and you can ignore the mini boss.", + "haspassive":true, + "hastrial":false, + "quest":"The Marooned Mariner", + "questRewardsSkills":false + }, + { + "name":"The Cavern of Wrath", + "level":12, + "image":[ + "Wrath_Seed_1", + "Wrath_Seed_2", + "Wrath_Seed_3" + ], + "altimage":"none", + "note":"Take the waypoint to town, and then the portal to the entrance of the cave. 2nd visit: move mostly up", + "haspassive":false, + "hastrial":false, + "quest":"The Siren's Cadence", + "questRewardsSkills":true + }, + { + "name":"The Cavern of Anger", + "level":13, + "image":[ + "Anger_Seed_1", + "Anger_Seed_2" + ], + "altimage":"none", + "note":"Often bottom right, you can follow the spirits, if you see piles of gold you’re close to Merveil.", + "haspassive":false, + "hastrial":false, + "quest":"The Siren's Cadence", + "questRewardsSkills":true + } + ] + }, + { + "act":"Act II", + "actid":2, + "zones":[ + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Follow the right wall.", + "level":13, + "name":"The Southern Forest", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Follow the road.", + "level":14, + "name":"The Old Fields", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"If you kill the White Beast, take as a quest reward a 2n Quicksilver Flask.", + "level":15, + "name":"The Den", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"A branching maze of tunnels ends at a large chamber.", + "quest":"The Great White Beast" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Travel straight from the way you enter, stay on the road. You will find the Waypoint. From this way upwards is always the Wetlands.Keep traveling of the stone road. When you reach a broken bridge, make sure to jump over it with your moving ability.", + "level":15, + "name":"The Riverways", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout if you manage to stay on the stone road.", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"When you reach the waypoint, you have 3 options. Up is the Chamber of sins, down is the Fellshrine Ruins, and straight ahead is Broken bridge(Kraityn)", + "level":15, + "name":"The Crossroads", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout if you manage to stay on the stone road.", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Chamber1_Seed_1", + "Chamber1_Seed_2", + "Chamber1_Seed_3" + ], + "note":"Go to the center of the zone, always left or right. Activate waypoint and follow the hallway next to the waypoint. The gray circles indicate the center area.", + "level":15, + "name":"The Chamber of Sins Level 1", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Intruders in Black" + }, + { + "hastrial":true, + "image":[ + "Chamber2_Seed_1" + ], + "note":"Always go up and right, do the trial in top left or do it later when you need it and are faster", + "level":16, + "name":"The Chamber of Sins Level 2", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Intruders in Black" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Travel on the road upwards, until you reach the waypoint. From there travel on the road but to the right and reach Kraityn.", + "level":16, + "name":"The Broken Bridge", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"Linear if you stay on the road", + "quest":"Deal with the Bandits" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Follow the road until you find a big Crypt.", + "level":16, + "name":"The Fellshrine Ruins", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout", + "quest":"none" + }, + { + "hastrial":true, + "image":[ + "none" + ], + "note":"If you want to do the trial, usually try to go up and right.", + "level":17, + "name":"The Crypt Level 1", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Maze", + "quest":"Through Sacred Ground" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"", + "level":18, + "name":"The Crypt Level 2", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Maze", + "quest":"Through Sacred Ground" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Follow the road, Alira is on the side of the waypoint where the road has a broken section. Go back to the road for The Way Forward quest. The entrance to The Weaver's Chambers can be found on the opposite side of the road from Alira, trees covered in spiderwebs indicate that you're close to the entrance.", + "level":17, + "name":"The Western Forest", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"Linear layout if you stay on the road and find waypoint, then everything is in a cross shape.", + "quest":"Deal with the Bandits" + }, + { + "hastrial":false, + "image":[ + "Weaver_Seed_1", + "Weaver_Seed_2", + "Weaver_Seed_3" + ], + "note":"Go left when the left path spawns, otherwise loop around right side. Kill Weaver for the reward, then claim The Way Forward skillpoint.", + "level":18, + "name":"The Weaver's Chambers", + "haspassive":false, + "questRewardsSkills":true, + "altimage":"none", + "quest":"Sharp and Cruel" + }, + { + "hastrial":false, + "image":[ + "Wetlands_Seed_1", + "Wetlands_Seed_2", + "Wetlands_Seed_3" + ], + "note":"Kill Oak in center, then go to the left side until the Waypoint is visible with the passage next to it, sometimes it’s on the right side. Oftentimes the side at which you enter Oak’s fort will tell you that the waypoint is on the opposite side of the fort.", + "level":19, + "name":"The Wetlands", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Deal with the Bandits" + }, + { + "hastrial":false, + "image":[ + "Vaal_Seed_1", + "Vaal_Seed_2", + "Vaal_Seed_3" + ], + "note":"Try to determine the direction, then zig and zag accordingly through the ruins.", + "level":20, + "name":"The Vaal Ruins", + "haspassive":false, + "questRewardsSkills":true, + "altimage":"none", + "quest":"The Root of the Problem" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Go to the top right by following the shoreline.", + "level":21, + "name":"The Northern Forest", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout, waypoint is adjacent to the shoreline.", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Go away there is nothing here.", + "level":21, + "name":"The Dread Thicket", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"I dont even know what this looks like.", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Caverns_Seed_1", + "Caverns_Seed_2", + "Caverns_Seed_3", + "Caverns_Seed_4" + ], + "note":"Pretty much guessing where the exit spawned.", + "level":22, + "name":"The Caverns", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Exits are usually diagonal from entrance.", + "level":23, + "name":"The Ancient Pyramid", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Somewhat linear layout.", + "quest":"Shadow of the Vaal" + } + ] + }, + { + "act":"Act III", + "actid":3, + "zones":[ + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Don’t forget to talk to Clarissa.", + "level":23, + "name":"The City of Sarn", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout.", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Slums_Seed_1", + "Slums_Seed_2", + "Slums_Seed_3", + "Slums_Seed_4" + ], + "note":"Find the grates to the sewers, then take the stairs down, follow it until you have stairs up, then it’s fairly linear.", + "level":24, + "name":"The Slums", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":true, + "image":[ + "Crematorium_Seed_1", + "Crematorium_Seed_2", + "Crematorium_Seed_3", + "Crematorium_Seed_4", + "Crematorium_Seed_5" + ], + "note":"Going left generally has a higher chance of success. There is a trial here.", + "level":25, + "name":"The Crematorium", + "haspassive":false, + "questRewardsSkills":true, + "altimage":"none", + "quest":"Lost in Love" + }, + { + "hastrial":false, + "image":[ + "Sewers_Seed_1" + ], + "note":"Pick up the bust before the waypoint, after it is another, up and left is the last bust, up and right is the exit.", + "level":26, + "name":"The Sewers", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Victario's Secrets" + }, + { + "hastrial":false, + "image":[ + "Marketplace_Seed_1", + "Marketplace_Seed_2", + "Marketplace_Seed_3", + "Marketplace_Seed_4", + "Marketplace_Seed_5" + ], + "note":"Usually up and right, go through the statue hall, check the waypoint (trial nearby it) and move on to find the exit.Stick to the wall and check for wreckages. If there are none in the wall to your right move to left. If you find them follow the wall to find the entrance to Battlefields.", + "level":26, + "name":"The Marketplace", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"A Swing of Hope" + }, + { + "hastrial":true, + "image":[ + "none" + ], + "note":"There is a trial in this area.", + "level":27, + "name":"The Catacombs", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Maze of rooms that ends at a large bridge", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Battlefront_Seed_1", + "Battlefront_Seed_2" + ], + "note":"First image is to spool and docks, second to Solaris.", + "level":27, + "name":"The Battlefront", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"The Ribbon Spool" + }, + { + "hastrial":false, + "image":[ + "Solaris1_Seed_1", + "Solaris1_Seed_2", + "Solaris1_Seed_3" + ], + "note":"Linear layout, follow the carpet until the exit.", + "level":27, + "name":"The Solaris Temple Level 1", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"The Gemling Queen" + }, + { + "hastrial":false, + "image":[ + "Solaris2_Seed_1", + "Solaris2_Seed_2", + "Solaris2_Seed_3" + ], + "note":"Somewhat linear, follow carpet, can have dead ends.", + "level":28, + "name":"The Solaris Temple Level 2", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"The Gemling Queen" + }, + { + "hastrial":false, + "image":[ + "Docks_Seed_1", + "Docks_Seed_2", + "Docks_Seed_3", + "Docks_Seed_4" + ], + "note":"Usually left side, sulphite is down some stairs.", + "level":29, + "name":"The Docks", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Fiery Dust/Swing of Hope" + }, + { + "hastrial":false, + "image":[ + "Ebony_Seed_1", + "Ebony_Seed_2" + ], + "note":"First image is to Lunaris, second to The Sceptre of God.", + "level":29, + "name":"The Ebony Barracks", + "haspassive":false, + "questRewardsSkills":true, + "altimage":"none", + "quest":"Sever the Right Hand" + }, + { + "hastrial":false, + "image":[ + "Lunaris1_Seed_1", + "Lunaris1_Seed_2" + ], + "note":"Pretty linear, follow the carpet, don’t forget waypoint.", + "level":29, + "name":"The Lunaris Temple Level 1", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Piety's Pets" + }, + { + "hastrial":false, + "image":[ + "Lunaris2_Seed_1", + "Lunaris2_Seed_2" + ], + "note":"Layout differs a lot, very generic map drawing. If you see stairs, go up these as this is the right path, then find more stairs, until you reach a larger area, there will be carts on both sides, pick the side where there is only one.", + "level":30, + "name":"The Lunaris Temple Level 2", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":true, + "image":[ + "Imperial_Seed_1" + ], + "note":"Follow the road until the end", + "level":30, + "name":"The Imperial Garden", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"A Swing of Hope" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Try to go up and right, until you reach some parallel walls, there you should find Siosa. Go through the only opening at Siosa and search the next area for a Candle switch in a wall.", + "level":30, + "name":"The Library", + "haspassive":false, + "questRewardsSkills":true, + "altimage":"Seems like a maze.", + "quest":"A Fixture of Fate" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Try to find the first corner of the room, where you should usually find a small room with a page. Do the same for the next 3.", + "level":31, + "name":"The Archives", + "haspassive":false, + "questRewardsSkills":true, + "altimage":"This area is a square, with 4 corners that usually hold 1 page each.", + "quest":"A Fixture of Fate" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"The exits can often be found by travelling diagonally.", + "level":32, + "name":"The Sceptre of God", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Layout is generally always the same looking, but exits spawn in a random corner.", + "quest":"Sceptre of God" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Go up diagonally until you spot barricades at exit.", + "level":33, + "name":"The Upper Sceptre of God", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Layout is generally always the same looking, but exits spawn in a random corner.", + "quest":"Sceptre of God" + } + ] + }, + { + "act":"Act IV", + "actid":4, + "zones":[ + { + "hastrial":false, + "image":[ + + ], + "note":"Go upstream and cross over when the path ends.", + "level":33, + "name":"The Aqueduct", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Pretty much linear.", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "DriedLake_Seed_1", + "DriedLake_Seed_2", + "DriedLake_Seed_3", + "DriedLake_Seed_4" + ], + "note":"Kill Voll on one of the three spawns", + "level":34, + "name":"The Dried Lake", + "haspassive":false, + "questRewardsSkills":true, + "altimage":"none", + "quest":"Breaking the Seal" + }, + { + "hastrial":false, + "image":[ + "Mines1_Seed_1", + "Mines1_Seed_2" + ], + "note":"Fairly linear, exit is usually in top left corner.", + "level":34, + "name":"The Mines Level 1", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Mines2_Seed_1", + "Mines2_Seed_2", + "Mines2_Seed_3", + "Mines2_Seed_4" + ], + "note":"Varied layout, and many dead ends and you should look for the spirit too, if you found the exit before the spirit, leave a portal and continue.", + "level":35, + "name":"The Mines Level 2", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"none", + "quest":"An Indomitable Spirit" + }, + { + "hastrial":false, + "image":[ + "Crystal_Seed_1", + "Crystal_Seed_2", + "Crystal_Seed_3" + ], + "note":"Loop around bottom right to go to the top left end. Use waypoint to go to Highgate if you made a portal to search for the spirit.", + "level":36, + "name":"The Crystal Veins", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Move towards the top right, some dead ends.", + "level":37, + "name":"Daresso's Dream", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Fairly linear.", + "quest":"The King of Desire" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Move down left from waypoint, then follow path.", + "level":38, + "name":"The Grand Arena", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout.", + "quest":"The King of Desire" + }, + { + "hastrial":false, + "image":[ + "Kaoms1_Seed_1" + ], + "note":"Look for passages and bridges, follow those.", + "level":37, + "name":"Kaom's Dream", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"The King of Fury" + }, + { + "hastrial":false, + "image":[ + "Kaoms2_Seed_1" + ], + "note":"Look for stairs and bridges, follow those.", + "level":38, + "name":"Kaom's Stronghold", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"The King of Fury" + }, + { + "hastrial":false, + "image":[ + "Belly1_Seed_1", + "Belly1_Seed_2", + "Belly1_Seed_3", + "Belly1_Seed_4" + ], + "note":"Aim for top left, many dead ends.", + "level":38, + "name":"The Belly of the Beast Level 1", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Belly2_Seed_1", + "Belly2_Seed_2", + "Belly2_Seed_3" + ], + "note":"Aim for top left, many dead ends.", + "level":39, + "name":"The Belly of the Beast Level 2", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Harvest_Seed_1" + ], + "note":"Always one boss on right side, two on the left(one low and one higher in the map), waypoint is number 1, bosses are 2, 3 and 4.", + "level":40, + "name":"The Harvest", + "haspassive":false, + "questRewardsSkills":true, + "altimage":"none", + "quest":"The Eternal Nightmare" + }, + { + "hastrial":false, + "image":[ + "Ascent_Seed_1" + ], + "note":"Go up and right, cross the bridge and follow the road to a small passage to the exit.", + "level":40, + "name":"The Ascent", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + } + ] + }, + { + "act":"Act V", + "actid":5, + "zones":[ + { + "hastrial":false, + "image":[ + "Slave_Pens_Seed_1", + "Slave_Pens_Seed_2" + ], + "note":"Go all the way down, then left.", + "level":41, + "name":"The Slave Pens", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Return to Oriath" + }, + { + "hastrial":false, + "image":[ + "Control_Blocks" + ], + "note":"Go top left for the miasmeter, then up and right.", + "level":41, + "name":"The Control Blocks", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"none", + "quest":"In Serive to Science/They Key to Freedom" + }, + { + "hastrial":false, + "image":[ + "Oriath_Square" + ], + "note":"Go top right until you cross the bridge, then down.", + "level":42, + "name":"Oriath Square", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Templar_Courts" + ], + "note":"Loop around clockwise.", + "level":42, + "name":"The Templar Courts", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Chamber_of_Innocence" + ], + "note":"Go up and left, and spiral counterclockwise.", + "level":43, + "name":"The Chamber of Innocence", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Death to Purity" + }, + { + "hastrial":false, + "image":[ + "Torched_Courts" + ], + "note":"Loop around counterclockwise.", + "level":44, + "name":"The Torched Courts", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Ruined_Square" + ], + "note":"One layout, multiple stops, in following steps.", + "level":44, + "name":"The Ruined Square", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"The King's Feast" + }, + { + "hastrial":false, + "image":[ + "Ossuary" + ], + "note":"Loop around clockwise.", + "level":44, + "name":"The Ossuary", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"The Ravenous God" + }, + { + "hastrial":false, + "image":[ + "The_Reliquary" + ], + "note":"Find multiple quest items in corners of the zone.", + "level":44, + "name":"The Reliquary", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Kitava's Torments" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Before accessing this, and killing Kitava, consider running your first labyrinth before the resistance penalty, making sure your fire resistances will be (close to) capped for act six is recommended as well.", + "level":45, + "name":"The Cathedral Rooftop", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear zone, run top left and kill Kitava.", + "quest":"The Ravenous God" + } + ] + }, + { + "act":"Act VI", + "actid":6, + "zones":[ + { + "hastrial":false, + "image":[ + "none" + ], + "note":"This area and doing the quest is optional, this opens a level 1 gem vendor, I suggest to skip this unless you are solo self-found or do not want to trade for some gems.", + "level":45, + "name":"The Twilight Strand", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout with some small rooms in the cliffs possible.", + "quest":"Fallen from Grace" + }, + { + "hastrial":false, + "image":[ + "Coast_Seed_1", + "Coast_Seed_2", + "Coast_Seed_3" + ], + "note":"Go to the right side of the zone, and go to the top right corner of the zone. You might need to go up or down a bit.", + "level":45, + "name":"The Coast", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Pick one side and find boss.", + "level":45, + "name":"The Tidal Island", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"This area is a circle", + "quest":"Bestel's Epic" + }, + { + "hastrial":false, + "image":[ + "Mud_Flats_Seed_1", + "Mud_Flats_Seed_2" + ], + "note":"Kill the Dishonoured Queen (1) on the right side to get the key to open the gate to the next zone (2) on the left side.", + "level":46, + "name":"The Mud Flats", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"none", + "quest":"The Father of War" + }, + { + "hastrial":false, + "image":[ + "Karui_Fortress_Seed_1" + ], + "note":"Follow the path until you can go right, then follow that path until you have a long path up left.", + "level":46, + "name":"The Karui Fortress", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"none", + "quest":"The Father of War" + }, + { + "hastrial":false, + "image":[ + "Ridge_Seed_1", + "Ridge_Seed_2" + ], + "note":"", + "level":46, + "name":"The Ridge", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":true, + "image":[ + "Lower_Prison_Seed_1", + "Lower_Prison_Seed_2", + "Lower_Prison_Seed_3", + "Lower_Prison_Seed_4" + ], + "note":"You usually want to go down or left towards the exit, there is a trial here, but it is fairly close to the waypoint if you want to do it later.", + "level":47, + "name":"The Lower Prison", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Essence of Umbra" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Capped lightning resistance and a good life pool is strongly suggested to fight Brutus and Shavronne, having physical mitigation helps as well.", + "level":47, + "name":"Shavronne's Tower", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"This zone has multiple variations, but they’re all fairly linear, made up out of four mini zones. 1. Follow the halls 2. Travel around or over the center thin bridge 3. Travel around and over the thin bridge 4. Travel around and reach the middle bridge area to find the ladder to the rooftop.", + "quest":"Essence of Umbra" + }, + { + "hastrial":false, + "image":[ + "Prisoners_Gate_Seed_1", + "Prisoners_Gate_Seed_2", + "Prisoners_Gate_Seed_3" + ], + "note":"If you want to fight the Aberrath, go down the side of the road that has the cliff, otherwise follow the road into the next area.", + "level":47, + "name":"Prisoner's Gate", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"none", + "quest":"The Cloven One" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"There is a waypoint in this zone, this is optional but might be useful.", + "level":48, + "name":"The Western Forest", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Follow the road to the Riverways.", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Riverways_Seed_1" + ], + "note":"Follow the road and when you reach the encampment, go down and right. If you want to kill Ryslatha, follow the path up at the waypoint.", + "level":48, + "name":"The Riverways", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Stick to the left hand side and find the entrance to the Spawning Ground. Having some physical mitigation and good life flasks is useful.", + "level":48, + "name":"The Wetlands", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"Linear zone.", + "quest":"The Puppet Mistress" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Follow the right hand wall until you find The Cavern of Anger.", + "level":49, + "name":"The Southern Forest", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear but huge zone.", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Cavern_Anger_Seed_1", + "Cavern_Anger_Seed_2" + ], + "note":"Don’t forget the black flag upon entering this zone. Head down then up first, then go right, the exit can be up or down.", + "level":49, + "name":"The Cavern of Anger", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Follow the shoreline until you reach the beacons.", + "level":49, + "name":"The Beacon", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear zone but pretty big", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Brine_King_Seed_1", + "Brine_King_Seed_2" + ], + "note":"Follow the left hand shoreline to the boss arena. Capped cold and lightning resistance is strongly recommended. Physical mitigation is very useful too.", + "level":50, + "name":"The Brine King's Reef", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"The Brine King" + } + ] + }, + { + "act":"Act VII", + "actid":7, + "zones":[ + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Follow the road to the left to the exit.", + "level":50, + "name":"The Broken Bridge", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout", + "quest":"The Silver Locket" + }, + { + "hastrial":false, + "image":[ + "The_Crossroads_Seed_1" + ], + "note":"", + "level":51, + "name":"The Crossroads", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Follow the road until you find a big Crypt.", + "level":51, + "name":"The Fellshrine Ruins", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout", + "quest":"none" + }, + { + "hastrial":true, + "image":[ + "Crypt_Level_1_Seed_1", + "Crypt_Level_1_Seed_2", + "Crypt_Level_1_Seed_3" + ], + "note":"Open the sarcophagus for the exit. Then search this area for Maligaro's Map. Once you find it teleport to town and use the waypoint for the Crossroads.", + "level":51, + "name":"The Crypt", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Essence of the Artist" + }, + { + "hastrial":false, + "image":[ + "Chamber1_Seed_1", + "Chamber1_Seed_2", + "Chamber1_Seed_3" + ], + "note":"This is works just like in act two, loop around to the center, then activate the waypoint and use your map in the map device and continue through the portals. After killing Maligaro, you return here and go through the hall behind the waypoint to find the exit.", + "level":52, + "name":"The Chamber of Sins Level 1", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Essence of the Artist/Web of Secrets" + }, + { + "hastrial":false, + "image":[ + "Chamber2_Seed_1" + ], + "note":"There is a trial in this zone on the left side. Go to the top right side, until you find the narrow long hallway, move to the end where you fought Fidelitas in act two, then go right up and right down afterwards", + "level":52, + "name":"The Chamber of Sins Level 2", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Follow the edges of the zone, and cross the bridges you encounter until you find the arena (Maligaro’s Workshop). Capped lightning resistance is recommended. Use a portal scroll to port out to Silk.", + "level":52, + "name":"Maligaro's Sanctum", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Somewhat linear.", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "The_Den_Seed_1", + "The_Den_Seed_2", + "The_Den_Seed_3", + "The_Den_Seed_4" + ], + "note":"Fairly simple, you will usually want to go to the top left or right to find the exit to The Ashen Fields.", + "level":53, + "name":"The Den", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Follow the road to the left. Physical mitigation and bleed removal are recommended.", + "level":53, + "name":"The Ashen Fields", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"Linear layout.", + "quest":"The Master of a Million Faces" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Wall-follow the left side for The Dread Thicket, wall-follow the right side for The Causeway.", + "level":53, + "name":"The Northern Forest", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout.", + "quest":"In Memory of Greust" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Explore the zone and find the fireflies, Gruthkul is in this zone, physical mitigation recommended.", + "level":53, + "name":"The Dread Thicket", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"Varied zone with dead ends.", + "quest":"Queen of Despair/Lighting the Way" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Go top right to the exit, loot Kishara’s star near the exit.", + "level":54, + "name":"The Causeway", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"Linear layout.", + "quest":"Kishara's Star" + }, + { + "hastrial":false, + "image":[ + "The_Vaal_City_Seed_1" + ], + "note":"Find and follow the thick walls to guide you to the exit.", + "level":54, + "name":"The Vaal City", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Just like the pyramid in act two, go diagonally to exits. Boss fight at the end, capped lightning resistance is recommended.", + "level":54, + "name":"The Temple of Decay Level 1", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Long zone, with multiple levels.", + "quest":"The Mother of Spiders" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"You can skip large portions of this area if you have an airial gap close ability. You will find those big square areas, if you go to the other end there will be a gap in the map and you actually see the other side on the minimap. If you spam your ability you can jump over it. Do this for all 3-4 square areas you find.", + "level":55, + "name":"The Temple of Decay Level 2", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Long zone, with multiple levels.", + "quest":"The Mother of Spiders" + } + ] + }, + { + "act":"Act VIII", + "actid":8, + "zones":[ + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Left hand wall-follow to the stairs, go up the stairs and follow the wall to the end.", + "level":55, + "name":"The Sarn Ramparts", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout.", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Toxic_Conduits_Seed_1", + "Toxic_Conduits_Seed_2" + ], + "note":"Watch the black paint on the floor as you enter the zone to see in which direction it points you.", + "level":56, + "name":"The Toxic Conduits", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Essence of the Hag" + }, + { + "hastrial":false, + "image":[ + "Doedre_Cesspool_Seed_1", + "Doedre_Cesspool_Seed_2", + "Doedre_Cesspool_Seed_3" + ], + "note":"Try to find the path that doesn’t have a dead end, this should lead you all the way to the exit.After you kill Doedre, find the waypoint. The Grand Promenade is on the left, The Quay on the right.", + "level":56, + "name":"Doedre's Cesspool", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Essence of the Hag" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Wall-follow the right hand side.", + "level":56, + "name":"The Grand Promenade", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Fairly static and linear zone.", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Quay_Seed_1", + "Quay_Seed_2" + ], + "note":"Pick up the quest item at (1), to use in the arena (2), then leave the arena and find the exit at (3).", + "level":57, + "name":"The Quay", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Love is Dead" + }, + { + "hastrial":false, + "image":[ + "Grain_Gate_Seed_1", + "Grain_Gate_Seed_2" + ], + "note":"This zone has many buildings, only enter and leave buildings through openings that have a guard’s corpse next to it, they lead the way, kill the gemlings.", + "level":57, + "name":"The Grain Gate", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"none", + "quest":"The Gemling Legion" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Follow the road until the end, then keep on going that direction.", + "level":58, + "name":"The Imperial Fields", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout if you stay in the road until it ends.", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Solaris_1_Seed_1", + "Solaris_1_Seed_2" + ], + "note":"Go down and left, then up and left, there is a waypoint on the path.", + "level":59, + "name":"The Solaris Temple Level 1", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Solar Eclipse" + }, + { + "hastrial":false, + "image":[ + "Solaris_2_Seed_1", + "Solaris_2_Seed_2" + ], + "note":"Follow the carpets, quest boss Dawn at the end, capped fire resistance is recommended.", + "level":59, + "name":"The Solaris Temple Level 2", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Solar Eclipse" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Usually take the waypoint, and either proceed to boss, or go back to town and clear the Lunaris area.", + "level":58, + "name":"The Solaris Concourse", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout", + "quest":"none" + }, + { + "hastrial":true, + "image":[ + "Bath_House_Seed_1", + "Bath_House_Seed_2" + ], + "note":"There is a trial here, and the Wings of Vastiri quest, there is also a way to the Yugul god fight (2), but I would suggest doing this later. The exit is always on the right side", + "level":57, + "name":"The Bath House", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"The Wings of Vastiri" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Run to the end of the area and fight the boss for a passive minor and pantheon node.", + "level":58, + "name":"The High Gardens", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"Linear layout", + "quest":"Reflection of Terror" + }, + { + "hastrial":false, + "image":[ + "Lunaris_Concourse_Seed_1", + "Lunaris_Concourse_Seed_2" + ], + "note":"Go up and right for the waypoint, then up and left for the entrance. If this is your second visit go down and right to the exit.", + "level":58, + "name":"The Lunaris Concourse", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Lunaris_1_Seed_1", + "Lunaris_1_Seed_2", + "Lunaris_1_Seed_3" + ], + "note":"", + "level":59, + "name":"The Lunaris Temple Level 1", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Lunar Eclipse" + }, + { + "hastrial":false, + "image":[ + "Lunaris_2_Seed_1", + "Lunaris_2_Seed_2" + ], + "note":"", + "level":59, + "name":"The Lunaris Temple Level 2", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Lunar Eclipse" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Go top right(or left depends from where you enter) to find the arena with Solaris and Lunaris, capped fire and cold resistance is recommended.", + "level":60, + "name":"The Harbour Bridge", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout.", + "quest":"none" + } + ] + }, + { + "act":"Act IX", + "actid":9, + "zones":[ + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Go to the top left, cross the bridges on dead ends. As a league start you probably want to farm this zone for Humility cards -> Tabula Rasa. If you are past level 73-74, and havent completed your Humility, you are better off buying the cards you are missing.(ssf-btw)", + "level":61, + "name":"The Blood Aqueduct", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Descent_Seed_1" + ], + "note":"Go up right to the supply hoist, then down left to another hoist, then up right to The Vastiri Desert.", + "level":61, + "name":"The Descent", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Vastiri_Seed_1" + ], + "note":" Go right to the waypoint, then top left (1) for the Foothills. If you want to kill Shakari, go right to (2) for the Oasis, then get the quest item in town and enter the zone.", + "level":61, + "name":"The Vastiri Desert", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"The Storm Blade" + }, + { + "hastrial":false, + "image":[ + "Oasis_Seed_1", + "Oasis_Seed_2" + ], + "note":"Left or right hand wall follow, depending on bottom or top being the dead end at the entrance. Physical mitigation recommended.", + "level":61, + "name":"The Oasis", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Queen of the Sands" + }, + { + "hastrial":false, + "image":[ + "Foothills_Seed_1" + ], + "note":" Head up to find the waypoint, go to (1) to get the quest item in The Boiling Lake, then to (2) for The Tunnel to continue the story.", + "level":62, + "name":"The Foothills", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Fastis Fortuna" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Go to the top right zone for the quest boss, if you spot petrified men, you are close. After killing the Basilisk, go to town and teleport to the waypoint in The Foothills and go to the top left corner of the zone.", + "level":62, + "name":"The Boiling Lake", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear layout", + "quest":"Recurring Nightmare" + }, + { + "hastrial":true, + "image":[ + "Tunnel_Seed_1", + "Tunnel_Seed_2", + "Tunnel_Seed_3" + ], + "note":"There is a trial in this zone. Go up left, if you come across the waypoint you’re on the right path", + "level":62, + "name":"The Tunnel", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"none" + }, + { + "hastrial":false, + "image":[ + "Quarry_Seed_1" + ], + "note":"Activate the waypoint at the center, go to Shrine of the Winds first (2), then the refinery (1).", + "level":63, + "name":"The Quarry", + "haspassive":true, + "questRewardsSkills":false, + "altimage":"none", + "quest":"The Ruler of Highgate" + }, + { + "hastrial":false, + "image":[ + "Refinery_Seed_1" + ], + "note":"Follow the cart tracks to the building top right for the quest boss, capped lightning resistance is recommended. Portal to town and waypoint back to The Quarry.", + "level":63, + "name":"The Refinery", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Recurring Nightmare" + }, + { + "hastrial":false, + "image":[ + "Belly_Seed_1", + "Belly_Seed_2", + "Belly_Seed_3" + ], + "note":" Try to reach the top left part of the zone in The Belly of The Beast, this leads to The Rotting core which is fairly static, and where you will want to go top left again, then you have The Black Heart where there are three boss zones with a linear path to them. Kill ‘em all, then fight the Depraved Trinity act boss after entering at the center.", + "level":63, + "name":"The Belly of the Beast", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"none", + "quest":"Recurring Nightmare" + }, + { + "hastrial":false, + "image":[ + "none" + ], + "note":"Find the boss arena.", + "level":64, + "name":"The Rotting Core", + "haspassive":false, + "questRewardsSkills":false, + "altimage":"Linear with deadends.", + "quest":"Recurring Nightmare" + } + ] + }, + { + "act":"Act X", + "actid":10, + "zones":[ + { + "name":"The Cathedral Rooftop", + "level":64, + "image":[ + "none" + ], + "altimage":"Linear layout.", + "note":"Go up to save Bannon, back to town, then go to down right.", + "haspassive":false, + "hastrial":false, + "quest":"Safe Passage", + "questRewardsSkills":false + }, + { + "name":"The Ravaged Square", + "level":64, + "image":[ + "Ravaged_Square" + ], + "altimage":"none", + "note":"Left hand wall-follow, skip the first opening, take the second and cross the bridge (red part), left hand wall-follow to the waypoint. Then go to the Ossuary (1), after that the Torched Courts (2). Optional are the Reliquary (3, quest for rare belt) and the Control Blocks (4), quest with boss for a passive point. Finish by going through The Canals (5). Do your cruel labyrinth before going to the Canals as killing Kitava will lower your resistances.", + "haspassive":false, + "hastrial":false, + "quest":"", + "questRewardsSkills":false + }, + { + "name":"The Torched Courts", + "level":65, + "image":[ + "Torched_Courts" + ], + "altimage":"none", + "note":"Left hand wall-follow.", + "haspassive":false, + "hastrial":false, + "quest":"", + "questRewardsSkills":false + }, + { + "name":"The Desecrated Chambers", + "level":65, + "image":[ + "Desecrated_Chambers" + ], + "altimage":"none", + "note":"Right hand wall-follow until you come to a crossroads with four pillars, then go straight and up.", + "haspassive":false, + "hastrial":false, + "quest":"Death and Rebirth", + "questRewardsSkills":false + }, + { + "name":"The Control Blocks", + "level":66, + "image":[ + "none" + ], + "altimage":"Optional, static layout, quest boss for a skill point.", + "note":"Right hand wall-follow all the way to the end. Use movement skills to jump through fences.", + "haspassive":true, + "hastrial":false, + "quest":"Vilenta's Vengeance", + "questRewardsSkills":false + }, + { + "name":"The Ossuary", + "level":67, + "image":[ + "none" + ], + "altimage":"Linear Layout", + "note":"There is a trial here. Left hand wall follow to find the quest item and trial. The trial entrance is in the opening in the wall, the quest item is close to that opening, but you move away from the wall to find it.", + "haspassive":false, + "hastrial":true, + "quest":"No Love for Old Ghosts", + "questRewardsSkills":false + }, + { + "name":"The Reliquary", + "level":67, + "image":[ + "none" + ], + "altimage":"Large fairly static layout, random quest item spawn location, movement skills that can cross gaps recommended.", + "note":"The item is always on the edge or a corner, to my experience it’s mostly the right side.", + "haspassive":false, + "hastrial":false, + "quest":"Map to Tsoatha", + "questRewardsSkills":false + }, + { + "name":"The Canals", + "level":66, + "image":[ + "none" + ], + "altimage":"Fairly linear layout", + "note":"Move top left, follow the road, cross bridges when you see them.", + "haspassive":false, + "hastrial":false, + "quest":"", + "questRewardsSkills":false + }, + { + "name":"The Feeding Trough", + "level":67, + "image":[ + "none" + ], + "altimage":"Linear layout.", + "note":"Move top left, there shouldn’t be any diversions, kill Kitava at the end to unlock maps.", + "haspassive":true, + "hastrial":false, + "quest":"An End to Hunger", + "questRewardsSkills":false + } + ] + } + ] +} \ No newline at end of file diff --git a/src/json/gems.json b/src/json/gems.json new file mode 100644 index 0000000..99ca9a2 --- /dev/null +++ b/src/json/gems.json @@ -0,0 +1,4115 @@ +[{ + "name": "Abyssal Cry", + "quest_name": "Breaking the Seal", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 34, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 0, + "town": "Highgate", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/AbyssalCry.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/omaumeridusare" +}, { + "name": "Added Cold Damage", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "shadow"], + "id": 1, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/AddedColdDamage.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/anamohitotamot" +}, { + "name": "Added Fire Damage", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 2, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/AddedFireDamage.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/kohuwakosimone" +}, { + "name": "Added Lightning Damage", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 3, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/AddedLightningDamage.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ahihikoruatazu" +}, { + "name": "Additional Accuracy", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 4, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IncreasedAccuracy.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/rugasitusekumo" +}, { + "name": "Ancestral Protector", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar"], + "id": 5, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/AncestorTotem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/otetarukuomima" +}, { + "name": "Anger", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "templar"], + "id": 6, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Anger.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/sasetahakokobo" +}, { + "name": "Animate Guardian", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 7, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/AnimateArmour.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/uahiminohatohu" +}, { + "name": "Animate Weapon", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["witch", "scion", "shadow"], + "id": 8, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/AnimateWeapon.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/udiyamkogeyaso" +}, { + "name": "Arc", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["witch", "shadow", "templar"], + "id": 9, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Arc.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/senouhinonanam" +}, { + "name": "Arctic Armour", + "quest_name": "The Root of the Problem", + "npc": "Yeena", + "act": 2, + "required_lvl": 16, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 10, + "town": "The Forest Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/IceShield.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/uimkihoyokisan" +}, { + "name": "Arctic Breath", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 11, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ArcticBreath.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ikokounohimono" +}, { + "name": "Assassin's Mark", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["witch", "ranger", "shadow"], + "id": 12, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/AssassinsMark.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/okautebarisazu" +}, { + "name": "Ball Lightning", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["witch", "shadow", "templar"], + "id": 13, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/BallLightning.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/otoeubonaranah" +}, { + "name": "Barrage", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist", "shadow"], + "id": 14, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Barrage.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/oranuariretoom" +}, { + "name": "Bear Trap", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "shadow"], + "id": 15, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/BearTrap.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/osisitonoyetah" +}, { + "name": "Blade Vortex", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["witch", "scion", "shadow"], + "id": 16, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SpinningEtherealBladesGem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/agiyohomoaheki" +}, { + "name": "Bladefall", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["witch", "scion", "shadow"], + "id": 17, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/RainOfBlades.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/otenunatoomame" +}, { + "name": "Blasphemy", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 38, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 18, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Aurify.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/amahoritahituk" +}, { + "name": "Blast Rain", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist"], + "id": 19, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/BlastRainGem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/monaniwanyohuk" +}, { + "name": "Blind", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow"], + "id": 20, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Blind.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/oozahanitinayo" +}, { + "name": "Blink Arrow", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 10, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist", "shadow"], + "id": 21, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/BlinkArrow.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/usomomauatarub" +}, { + "name": "Blood Magic", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["marauder", "ranger", "duelist", "templar"], + "id": 22, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/BloodMagic.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/hurikobudazute" +}, { + "name": "Blood Rage", + "quest_name": "The Root of the Problem", + "npc": "Yeena", + "act": 2, + "required_lvl": 16, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow"], + "id": 23, + "town": "The Forest Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/BloodRage.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/asinohotadonad" +}, { + "name": "Bloodlust", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 24, + "town": "The Forest Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Bloodlust.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ikimamonumikuk" +}, { + "name": "Bone Offering", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["witch", "scion", "templar"], + "id": 25, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/BoneOffering.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ekisikarutatit" +}, { + "name": "Burning Arrow", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist", "shadow"], + "id": 26, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/BurningArrow.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/wasitoasetasiu" +}, { + "name": "Cast On Critical Strike", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 38, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 27, + "town": "Highgate", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/CastOnCrit.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/azukatomarikim" +}, { + "name": "Cast on Death", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 38, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 28, + "town": "Highgate", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/CastOnDeath.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ohazikonokokut" +}, { + "name": "Cast on Melee Kill", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 38, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 29, + "town": "Highgate", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/CastOnMeleeKill.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/rusasitakitona" +}, { + "name": "Cast when Damage Taken", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 38, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 30, + "town": "Highgate", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/CastOnDmgTaken.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/onioonaukahena" +}, { + "name": "Cast when Stunned", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 38, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 31, + "town": "Highgate", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/CastOnStun.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/gomukemakonika" +}, { + "name": "Caustic Arrow", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["ranger", "duelist", "shadow"], + "id": 32, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/PoisonArrow.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/utobasegoyeyaz" +}, { + "name": "Chain", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 38, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 33, + "town": "Highgate", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/chain.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/osituwoasinuga" +}, { + "name": "Chance to Flee", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow"], + "id": 34, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ChancetoFlee.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/amotonitarukak" +}, { + "name": "Combustion", + "quest_name": "The Caged Brute", + "npc": "Neesa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["marauder", "witch", "shadow", "templar"], + "id": 35, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ChancetoIgnite.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ebasinaruhamok" +}, { + "name": "Clarity", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 10, + "isVaal": false, + "available_to": ["witch", "shadow", "templar"], + "id": 36, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Clarity.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/oitamorookauba" +}, { + "name": "Cleave", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist"], + "id": 37, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Cleave.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ohatamosonimak" +}, { + "name": "Cold Penetration", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "shadow", "templar"], + "id": 39, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ColdPenetration.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/obetonaranokik" +}, { + "name": "Cold Snap", + "quest_name": "The Root of the Problem", + "npc": "Yeena", + "act": 2, + "required_lvl": 16, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar","ranger"], + "id": 40, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ColdSnap.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/uzukatikikikis" +}, { + "name": "Cold to Fire", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 41, + "town": "The Forest Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ColdtoFire.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/etonanoborakah" +}, { + "name": "Concentrated Effect", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 42, + "town": "The Forest Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ConcentratedAOE.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/inabetoyohuhoa" +}, { + "name": "Conductivity", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 43, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Conductivity.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/okaresanamgano" +}, { + "name": "Contagion", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 44, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ContagionGem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/aahunatoahaaba" +}, { + "name": "Controlled Destruction", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 45, + "town": "The Forest Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ControlledDestructionGem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/anatatooseduma" +}, { + "name": "Conversion Trap", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "shadow"], + "id": 46, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ConversionTrap.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/hakokunotahako" +}, { + "name": "Convocation", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["witch", "scion", "templar"], + "id": 47, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Convocation.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/natahuomosogor" +}, { + "name": "Culling Strike", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 48, + "town": "The Forest Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/CullingStrike.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/sikouhokiahogo" +}, { + "name": "Curse On Hit", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 38, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 49, + "isVaal": false, + "town": "Highgate", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/CurseOnHit.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/omanohihigeton" +}, { + "name": "Cyclone", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "templar"], + "id": 50, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Cyclone.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/etaronorukaruw" +}, { + "name": "Decoy Totem", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "templar"], + "id": 51, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/DecoyTotem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/sitadomkimoase" +}, { + "name": "Desecrate", + "quest_name": "The Root of the Problem", + "npc": "Yeena", + "act": 2, + "required_lvl": 16, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "shadow", "templar"], + "id": 52, + "town": "The Forest Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Desecrate.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/orionitohaseya" +}, { + "name": "Determination", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["marauder", "duelist", "templar"], + "id": 53, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Determination.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/noagomamiikebi" +}, { + "name": "Detonate Dead", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["witch", "ranger", "shadow"], + "id": 54, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/DetonateDead.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ninikikiinoota" +}, { + "name": "Devouring Totem", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "templar"], + "id": 55, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/DevouringTotem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/atazukoukokomk" +}, { + "name": "Discharge", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 56, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Discharge.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/mogesitedohare" +}, { + "name": "Discipline", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 57, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Discipline.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/atoehikiriyaig" +}, { + "name": "Dominating Blow", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar"], + "id": 58, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/DominatingBlow.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/beyahedatenone" +}, { + "name": "Double Strike", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow"], + "id": 59, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/DoubleStrike.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/hitusotaziomoh" +}, { + "name": "Dual Strike", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow"], + "id": 60, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/DualStrike.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/uhukoaminheike" +}, { + "name": "Earthquake", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar"], + "id": 61, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/QuakeSlam.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/anonaramomobut" +}, { + "name": "Elemental Focus", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 62, + "town": "The Forest Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ElementalFocus.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/tokomanoketame" +}, { + "name": "Elemental Hit", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["scion", "ranger", "shadow", "duelist"], + "id": 63, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Elementalhit.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/kowoekomkukosi" +}, { + "name": "Elemental Proliferation", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 38, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 64, + "town": "Highgate", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ElementalProliferation.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/anitanomamirit" +}, { + "name": "Elemental Weakness", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 65, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ElementalWeakness.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/rohametiyakuka" +}, { + "name": "Endurance Charge on Melee Stun", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar"], + "id": 66, + "town": "The Forest Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/EnduranceChargeStun.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/isisinazususit" +}, { + "name": "Enduring Cry", + "quest_name": "The Root of the Problem", + "npc": "Yeena", + "act": 2, + "required_lvl": 16, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "templar"], + "id": 67, + "town": "The Forest Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/EnduringCry.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/amihuahenihoni" +}, { + "name": "Enfeeble", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 68, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Enfeeble.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ukekahomamenak" +}, { + "name": "Essence Drain", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 69, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SiphonGem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/mahararukianoe" +}, { + "name": "Ethereal Knives", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["marauder", "witch", "shadow"], + "id": 70, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/EtherealKnives.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/idohahiroonihu" +}, { + "name": "Explosive Arrow", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["marauder", "ranger", "duelist"], + "id": 71, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ExplosiveArrow.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/aseraromoyamom" +}, { + "name": "Faster Attacks", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 72, + "town": "The Forest Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/FasterAttacks.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi" +}, { + "name": "Faster Casting", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 73, + "town": "The Forest Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/FasterCast.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/aroyotomoraron" +}, { + "name": "Faster Projectiles", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "shadow"], + "id": 74, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/FasterProjectiles.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ikikubomomanit" +}, { + "name": "Fire Nova Mine", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 75, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FireNovaMineGem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/owonimiahadosi" +}, { + "name": "Fire Penetration", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "shadow", "templar"], + "id": 76, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/FirePenetration.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/atimitinonomar" +}, { + "name": "Fire Trap", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["scion", "witch", "ranger", "shadow"], + "id": 77, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FireTrap.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/oyesetotoyutoh" +}, { + "name": "Fireball", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "shadow", "templar"], + "id": 78, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Fireball.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/nogatotokanago" +}, { + "name": "Firestorm", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["marauder", "witch", "templar"], + "id": 79, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Firestorm.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/itatatasamamos" +}, { + "name": "Flame Dash", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 10, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 80, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FlameDash.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/adorisimenunih" +}, { + "name": "Flame Golem", + "quest_name": "Breaking the Seal", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 34, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 81, + "isVaal": false, + "town": "Highgate", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FireElementalSummon.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/orusamotahitak" +}, { + "name": "Flame Surge", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 82, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Flamewhip.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ayayorisaduino" +}, { + "name": "Flame Totem", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["marauder", "witch", "templar"], + "id": 83, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FlameTotem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/imahekasayogiz" +}, { + "name": "Flameblast", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "shadow", "templar"], + "id": 84, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ChargedBlast.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ritakakumomete" +}, { + "name": "Flammability", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "shadow", "templar"], + "id": 85, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Flammability.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/uhitahaikoagag" +}, { + "name": "Flesh Offering", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["witch", "templar"], + "id": 86, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FleshOffering.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/raumkuhikahenn" +}, { + "name": "Flicker Strike", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 10, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow"], + "id": 87, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FlickerStrike.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/eginoruseyober" +}, { + "name": "Fork", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "duelist", "shadow"], + "id": 88, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Fork.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/onidoikobohiyo" +}, { + "name": "Fortify", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 89, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/FortifyGem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/nahozuzuadukar" +}, { + "name": "Freeze Mine", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 10, + "isVaal": false, + "available_to": ["ranger", "duelist", "shadow"], + "id": 90, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FreezeMine.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ubiausenatonor" +}, { + "name": "Freezing Pulse", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["witch", "shadow", "templar"], + "id": 91, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FreezingPulse.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/notinebetunyot" +}, { + "name": "Frenzy", + "quest_name": "The Root of the Problem", + "npc": "Yeena", + "act": 2, + "required_lvl": 16, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow"], + "id": 92, + "town": "The Forest Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Frenzy.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ahatotobitanar" +}, { + "name": "Frost Blades", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist", "shadow"], + "id": 93, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/IceStrike.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/atetamomahatua" +}, { + "name": "Frost Bomb", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 94, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FrostBomb.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ananonahitotar" +}, { + "name": "Frost Wall", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["witch", "duelist", "templar"], + "id": 95, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FrostWall.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/oronazitararin" +}, { + "name": "Frostbite", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 96, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FrostBite.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/uitunamanazuwo" +}, { + "name": "Generosity", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "templar"], + "id": 97, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/GenerositySupport.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/wotinaharisihi" +}, { + "name": "Glacial Cascade", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["witch", "shadow", "templar"], + "id": 98, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Upheaval.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/uninikitasekok" +}, { + "name": "Glacial Hammer", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["marauder", "duelist", "templar"], + "id": 99, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/GlacialHammer.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/tamesigonunina" +}, { + "name": "Grace", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["ranger", "duelist", "shadow"], + "id": 100, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Grace.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/azuwameworuony" +}, { + "name": "Greater Multiple Projectiles", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 38, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 101, + "town": "Highgate", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/GreaterMultipleProjectiles.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ousimonamoyana" +}, { + "name": "Ground Slam", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["marauder", "duelist", "templar"], + "id": 102, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Groundslam.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ekotonotarenik" +}, { + "name": "Haste", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist", "shadow"], + "id": 103, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Haste.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/gomotekikomago" +}, { + "name": "Hatred", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow"], + "id": 104, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Hatred.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/aurimonitemona" +}, { + "name": "Heavy Strike", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar"], + "id": 105, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/HeavyStrike.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ikinahinoisiwo" +}, { + "name": "Herald of Ash", + "quest_name": "The Root of the Problem", + "npc": "Yeena", + "act": 2, + "required_lvl": 16, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 106, + "town": "The Forest Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/HeraldofAsh.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/etarioutinasag" +}, { + "name": "Herald of Ice", + "quest_name": "The Root of the Problem", + "npc": "Yeena", + "act": 2, + "required_lvl": 16, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 107, + "town": "The Forest Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/HeraldofIce.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/utatorohitihim" +}, { + "name": "Herald of Thunder", + "quest_name": "The Root of the Problem", + "npc": "Yeena", + "act": 2, + "required_lvl": 16, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 108, + "town": "The Forest Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/HeraldofThunder.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/kokihuhakurako" +}, { + "name": "Hypothermia", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 109, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/DamageAgainstChilled.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/tesorenoharata" +}, { + "name": "Ice Bite", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 110, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/FrenzyChargeOnShatter.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/sazatokikimata" +}, { + "name": "Ice Crash", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 111, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/IceCrashGem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/arikahatatetus" +}, { + "name": "Ice Nova", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 112, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/IceNova.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/agisikiketenao" +}, { + "name": "Ice Shot", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist"], + "id": 113, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/IceShot.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/urotomaritomim" +}, { + "name": "Ice Spear", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 114, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/IceSpear.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/obatoriugaruta" +}, { + "name": "Ice Trap", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["witch", "scion", "shadow"], + "id": 115, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/IceTrapRune.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/uokaaharutanat" +}, { + "name": "Immortal Call", + "quest_name": "Breaking the Seal", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 34, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar"], + "id": 116, + "town": "Highgate", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ImmortalCall.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/uazukonitasaro" +}, { + "name": "Incinerate", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 117, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Flamethrower.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ayarukinotabek" +}, { + "name": "Increased Area of Effect", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 38, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 118, + "town": "Highgate", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IncreasedAOE.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ahomokinahumeb" +}, { + "name": "Burning Damage", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "templar"], + "id": 119, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IncreasedBurnDuration.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/titasimodonari" +}, { + "name": "Increased Critical Damage", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "shadow"], + "id": 120, + "town": "The Forest Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IncreasedCriticalDamage.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/oonakitanahitu" +}, { + "name": "Increased Critical Strikes", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "shadow"], + "id": 121, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IncreasedCriticalStrikes.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/yetitesenabato" +}, { + "name": "Increased Duration", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["marauder", "duelist", "templar"], + "id": 122, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IncreasedDuration.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/omogetahiwoano" +}, { + "name": "Infernal Blow", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["ranger","marauder", "scion", "duelist", "templar"], + "id": 123, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/InfernalBlow.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/isitogariahani" +}, { + "name": "Innervate", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "shadow", "templar"], + "id": 124, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/OnslaughtOnSlayingShocked.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/arobonamizuhak" +}, { + "name": "Iron Grip", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "templar"], + "id": 125, + "town": "The Forest Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IronGrip.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/nobosawararomo" +}, { + "name": "Iron Will", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar"], + "id": 126, + "town": "The Forest Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IronWill.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/erimikomiariso" +}, { + "name": "Item Rarity", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 127, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IncreasedQuality.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/itukowomeiraru" +}, { + "name": "Kinetic Blast", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 128, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ClusterBurst.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/oyasitanomonoz" +}, { + "name": "Knockback", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar"], + "id": 129, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Knockback.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ekagaunohewimo" +}, { + "name": "Leap Slam", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 10, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "templar"], + "id": 130, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/LeapSlam.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/omomomonositad" +}, { + "name": "Less Duration", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar"], + "id": 131, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ReduceDuration.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/nazitohiwaruni" +}, { + "name": "Lesser Multiple Projectiles", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "duelist", "shadow"], + "id": 132, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/LesserMultipleProjectiles.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/bahiniiohikihi" +}, { + "name": "Life Gain on Hit", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar"], + "id": 133, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/LifeonHit.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/tikitahekoiyoh" +}, { + "name": "Life Leech", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 134, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/LifeLeech.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/kenikikamarura" +}, { + "name": "Lightning Arrow", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["ranger", "duelist", "shadow"], + "id": 135, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/LightningArrow.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/konaunikateroe" +}, { + "name": "Lightning Penetration", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 136, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/LightningPenetration.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/onitomonagodar" +}, { + "name": "Lightning Strike", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist", "shadow", "templar"], + "id": 137, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/LightningStrike.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/tomabohasetese" +}, { + "name": "Lightning Tendrils", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 138, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/LighteningTouch.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/iketetetibauke" +}, { + "name": "Lightning Trap", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["witch", "ranger", "shadow"], + "id": 139, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/LightningTrap.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ikedomkitiguta" +}, { + "name": "Lightning Warp", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 10, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 140, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/LightningWarp.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/usiyugatooohab" +}, { + "name": "Magma Orb", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 141, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FireMortar.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/itoriukabomita" +}, { + "name": "Mana Leech", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 142, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ManaLeech.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/innanikukaseha" +}, { + "name": "Damage on Full Life Support", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar"], + "id": 143, + "town": "The Forest Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/MeleeDamageonFullLife.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ohutorakaronob" +}, { + "name": "Melee Physical Damage", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 144, + "town": "The Forest Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IncreasedPhysicalDamage.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ekenoyoohauram" +}, { + "name": "Melee Splash", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 145, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Splash.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/akasikoyukumak" +}, { + "name": "Minefield", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["witch", "scion", "shadow"], + "id": 146, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Minefield.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ubumosokioyosi" +}, { + "name": "Minion Damage", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["witch", "scion", "templar"], + "id": 147, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/MinionDamage.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/nimasitumamono" +}, { + "name": "Minion Life", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["witch", "scion", "templar"], + "id": 148, + "town": "The Forest Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/MinionLife.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/tekumenagisino" +}, { + "name": "Minion Speed", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["witch", "scion", "templar"], + "id": 149, + "town": "The Forest Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/MinionSpeed.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/onuyewohausika" +}, { + "name": "Minion and Totem Elemental Resistance", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["witch", "scion", "templar"], + "id": 150, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/SummonsElementalResists.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/tebetekitonoko" +}, { + "name": "Molten Shell", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar"], + "id": 151, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/MoltenShell.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/zuminamakosidu" +}, { + "name": "Molten Strike", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar"], + "id": 152, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/MoltenStrike.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/yesimmyeyoomit" +}, { + "name": "Multiple Traps", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "shadow"], + "id": 153, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/MultiTrap.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/amotetakamahak" +}, { + "name": "Multistrike", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 38, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 154, + "town": "Highgate", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/multipleattacks.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/huososauteyeyo" +}, { + "name": "Orb of Storms", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 155, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/StormCloudGem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ahugenanokomad" +}, { + "name": "Phase Run", + "quest_name": "Breaking the Seal", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 34, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist", "shadow"], + "id": 156, + "town": "Highgate", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/PhaseRun.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/aimehomahasiao" +}, { + "name": "Vicious Projectiles", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist"], + "id": 157, + "town": "The Forest Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/RangedPhysicalAttackDamage.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/rihaniwoyobomo" +}, { + "name": "Physical to Lightning", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 158, + "town": "The Forest Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/PhysicalToLightning.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/amitetihikabam" +}, { + "name": "Pierce", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "duelist", "shadow"], + "id": 159, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Pierce.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/kozubohatanoro" +}, { + "name": "Poacher's Mark", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["ranger", "duelist", "shadow"], + "id": 160, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/PoachersMark.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/bowomimakirira" +}, { + "name": "Point Blank", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist", "shadow"], + "id": 161, + "town": "The Forest Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/PointBlank.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/omenyeteyokito" +}, { + "name": "Poison", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["scion", "ranger", "shadow"], + "id": 162, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Poison.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/aritaninazunna" +}, { + "name": "Power Charge On Critical", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "shadow", "templar"], + "id": 163, + "town": "The Forest Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/PowerCharges.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/uitikamikikayu" +}, { + "name": "Power Siphon", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["witch", "scion", "shadow"], + "id": 164, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/PowerSiphon.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ahazumarahahon" +}, { + "name": "Projectile Weakness", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["ranger", "duelist", "shadow"], + "id": 165, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ProjectileWeakness.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ugahubaniyusas" +}, { + "name": "Puncture", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["ranger", "duelist", "shadow"], + "id": 166, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Puncture.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/kotomohokanora" +}, { + "name": "Punishment", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "duelist", "templar"], + "id": 167, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Punishment.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/hoobiketawatur" +}, { + "name": "Purity of Elements", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 168, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Purity.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/yokinoyonotime" +}, { + "name": "Purity of Fire", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar"], + "id": 169, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FireResistAura.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/arunoninikeniw" +}, { + "name": "Purity of Ice", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist", "shadow"], + "id": 170, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ColdResistAura.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/enyoikitimanan" +}, { + "name": "Purity of Lightning", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 171, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/LightningResistAura.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/risaretonamoma" +}, { + "name": "Rain of Arrows", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist", "shadow"], + "id": 172, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/RainofArrows.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/uwahiritukoget" +}, { + "name": "Raise Spectre", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["witch", "scion", "templar"], + "id": 173, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/RaiseSpectre.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/donahaunagurik" +}, { + "name": "Raise Zombie", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["witch", "scion", "templar"], + "id": 174, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/RaiseZombie.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ayooitasimaiki" +}, { + "name": "Rallying Cry", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 10, + "isVaal": false, + "available_to": ["marauder", "witch", "ranger", "duelist", "templar"], + "id": 175, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/InspiringCry.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/usikagugiimooy" +}, { + "name": "Ranged Attack Totem", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist", "shadow"], + "id": 176, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/RangedAttackTotem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/yokunahubekite" +}, { + "name": "Swift Affliction", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "shadow", "templar"], + "id": 177, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/SupportRapidDecayGem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/rarobitibetomn" +}, { + "name": "Reave", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["ranger", "duelist", "shadow"], + "id": 178, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Reave.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/orikokonagayom" +}, { + "name": "Reckoning", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["marauder", "duelist", "templar"], + "id": 179, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Repulse.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/bokirininamaur" +}, { + "name": "Reduced Mana", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar", "witch", "ranger", "shadow"], + "id": 180, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ReducedManaCost.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/itaayumenimoat" +}, { + "name": "Rejuvenation Totem", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar"], + "id": 181, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/RejuvinationTotem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/atazubumanonon" +}, { + "name": "Remote Mine", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "shadow", "templar"], + "id": 182, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/RemoteMine.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/duhiotazubinoh" +}, { + "name": "Righteous Fire", + "quest_name": "The Root of the Problem", + "npc": "Yeena", + "act": 2, + "required_lvl": 16, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "templar"], + "id": 183, + "town": "The Forest Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/RighteousFire.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/kuninayetezita" +}, { + "name": "Riposte", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["marauder", "ranger", "duelist", "shadow"], + "id": 184, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Riposte.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/etosiuyamakako" +}, { + "name": "Searing Bond", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["marauder", "witch", "templar"], + "id": 185, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SearingBond.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/hanonamatayabo" +}, { + "name": "Shield Charge", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 10, + "isVaal": false, + "available_to": ["marauder", "duelist", "templar"], + "id": 186, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ShieldCharge.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ohimomahahebon" +}, { + "name": "Shock Nova", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 187, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ShockNova.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ikamoakatoyono" +}, { + "name": "Shockwave Totem", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["marauder", "witch", "templar"], + "id": 188, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ShockwaveTotem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/nisamamabatosa" +}, { + "name": "Shrapnel Shot", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist"], + "id": 189, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ShrapnelShot.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/otasidurohiyor" +}, { + "name": "Siege Ballista", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist"], + "id": 190, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/CrossBowTotemGem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/onikikehutadan" +}, { + "name": "Slower Projectiles", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist", "shadow"], + "id": 191, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/SlowerProjectiles.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/tenoazagotatit" +}, { + "name": "Smoke Mine", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 10, + "isVaal": false, + "available_to": ["marauder", "witch", "ranger", "duelist", "shadow"], + "id": 192, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SmokeBomb.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/oonowetoketami" +}, { + "name": "Spark", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 193, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Spark.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/omarusinototar" +}, { + "name": "Spectral Throw", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 194, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/GhostlyThrow.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ametomedetitic" +}, { + "name": "Spell Echo", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 38, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 195, + "town": "Highgate", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Echo.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/akiriuwosiaoko" +}, { + "name": "Spell Totem", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "templar"], + "id": 196, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Totem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/hetokasotonamo" +}, { + "name": "Split Arrow", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist", "shadow"], + "id": 197, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SplitArrow.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ohakumazoserir" +}, { + "name": "Static Strike", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "templar"], + "id": 198, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/StaticGem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/akobamarenowio" +}, { + "name": "Storm Call", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 199, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Stormcall.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/osukenonakiteb" +}, { + "name": "Stun", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar"], + "id": 200, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Stun.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/utokoyeooreduk" +}, { + "name": "Summon Chaos Golem", + "quest_name": "Breaking the Seal", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 34, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 201, + "town": "Highgate", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ChaosElementalSummon.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ahehemkiurimoo" +}, { + "name": "Summon Ice Golem", + "quest_name": "Breaking the Seal", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 34, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 202, + "town": "Highgate", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/IceElementalSummon.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/aurewohorikuma" +}, { + "name": "Summon Raging Spirit", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["witch", "scion", "templar"], + "id": 203, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SummonElemental.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ahahatemasehuk" +}, { + "name": "Summon Skeleton", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 10, + "isVaal": false, + "available_to": ["witch", "scion", "templar"], + "id": 204, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SummonSkeletons.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/asasituguhetea" +}, { + "name": "Summon Stone Golem", + "quest_name": "Breaking the Seal", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 34, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 205, + "town": "Highgate", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/RockGolem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ehikoabayetoho" +}, { + "name": "Sunder", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["marauder", "scion", "duelist", "templar"], + "id": 206, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ShockwaveSlam.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/anihoyenooyami" +}, { + "name": "Sweep", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "required_lvl": 12, + "isVaal": false, + "available_to": ["marauder", "duelist", "templar"], + "id": 207, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Sweep.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/nagoriokanoheh" +}, { + "name": "Tempest Shield", + "quest_name": "The Root of the Problem", + "npc": "Yeena", + "act": 2, + "required_lvl": 16, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "duelist", "shadow", "templar"], + "id": 208, + "town": "The Forest Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/TempestShield.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/itakarariasare" +}, { + "name": "Temporal Chains", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist", "shadow"], + "id": 209, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/TemporalChains.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/asausiminodoki" +}, { + "name": "Tornado Shot", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist", "shadow"], + "id": 210, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/TornadoShot.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/otayazasitoguk" +}, { + "name": "Advanced Trap Support", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "required_lvl": 31, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "shadow"], + "id": 212, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/TrapCooldownRecovery.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/omimimarukonar" +}, { + "name": "Trap and Mine Damage", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "shadow", "templar"], + "id": 213, + "town": "The Forest Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/TrapAndMineDamage.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/onizotowoonita" +}, { + "name": "Cluster Traps", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 38, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "shadow"], + "id": 38, + "town": "Highgate", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ClusterTrap.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/asahanodukuhog" +}, { + "name": "Trap", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["witch", "scion", "ranger", "duelist", "shadow"], + "id": 211, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Trap.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/tunitakasakoku" +}, { + "name": "Vengeance", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["marauder", "duelist", "templar"], + "id": 214, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Vengeance.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ohaziuwitariya" +}, { + "name": "Vigilant Strike", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "required_lvl": 4, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "templar"], + "id": 215, + "town": "Lioneye's Watch", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VigilantStrikeGem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/iubunokomehoui" +}, { + "name": "Viper Strike", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "required_lvl": 1, + "isVaal": false, + "available_to": ["scion", "ranger", "duelist", "shadow"], + "id": 216, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ViperStrike.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ouhanodonimood" +}, { + "name": "Vitality", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["marauder", "duelist", "templar"], + "id": 217, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Vitality.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/akakoresorarin" +}, { + "name": "Void Manipulation", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 8, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 218, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/VoidManipulation.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/amidanuarutoma" +}, { + "name": "Vulnerability", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["marauder", "witch", "scion", "duelist", "shadow", "templar"], + "id": 219, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Vulnerability.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/siniwahayabata" +}, { + "name": "Warlord's Mark", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "isVaal": false, + "available_to": ["marauder", "duelist", "templar"], + "id": 220, + "town": "The Sarn Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/WarlordsMark.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/asinakunikonab" +}, { + "name": "Elemental Damage with Attacks", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "required_lvl": 18, + "isVaal": false, + "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"], + "id": 221, + "town": "The Forest Encampment", + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/WeaponElementalDamage.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/atoariyenareno" +}, { + "name": "Whirling Blades", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 10, + "isVaal": false, + "available_to": ["ranger", "duelist", "shadow"], + "id": 222, + "town": "Lioneye's Watch", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/WhirlingBlades.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/inariugookasag" +}, { + "name": "Wild Strike", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "required_lvl": 28, + "isVaal": false, + "available_to": ["scion", "ranger", "shadow"], + "id": 223, + "town": "The Sarn Encampment", + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ElementalStrike.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ohorimikoakato" +}, { + "name": "Wither", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "required_lvl": 10, + "isVaal": false, + "available_to": ["witch", "scion", "shadow", "templar"], + "id": 224, + "town": "Lioneye's Watch", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/WitherGem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/onukonihihorim" +}, { + "name": "Wrath", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "required_lvl": 24, + "available_to": ["witch", "scion", "ranger", "shadow"], + "id": 225, + "isVaal": false, + "town": "The Sarn Encampment", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Wrath.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/nasabahamaahen" +}, { + "name": "Summon Lightning Golem", + "quest_name": "Breaking the Seal", + "npc": "Petarus and Vanja", + "act": 4, + "required_lvl": 34, + "available_to": ["marauder", "templar", "duelist", "witch", "scion", "ranger", "shadow"], + "id": 262, + "isVaal": false, + "town": "Highgate", + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/LightningGolem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/hetamorinasate" +}, { + "id": 226, + "name": "Vaal Glacial Hammer", + "required_lvl": 1, + "isVaal": true, + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalGlacialHammer.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/itahariniyeram" +}, { + "id": 227, + "name": "Vaal Ground Slam", + "required_lvl": 1, + "isVaal": true, + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalGroundslam.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/imootoninobate" +}, { + "id": 228, + "name": "Vaal Immortal Call", + "required_lvl": 34, + "isVaal": true, + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalImmortalCall.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/itakirisakeniy" +}, { + "id": 229, + "name": "Vaal Molten Shell", + "required_lvl": 4, + "isVaal": true, + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalMoltenShell.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/sesikaserinimo" +}, { + "id": 230, + "name": "Vaal Burning Arrow", + "required_lvl": 1, + "isVaal": true, + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalBurningArrow.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/nukitonakohasi" +}, { + "id": 231, + "name": "Vaal Cyclone", + "required_lvl": 28, + "isVaal": true, + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalCyclone.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/arihiroasinosi" +}, { + "id": 232, + "name": "Vaal Detonate Dead", + "required_lvl": 4, + "isVaal": true, + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalDetonateDead.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/asarahusiwakon" +}, { + "id": 233, + "name": "Vaal Double Strike", + "required_lvl": 1, + "isVaal": true, + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalDoubleStrike.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/komiwomamamohi" +}, { + "id": 234, + "name": "Vaal Grace", + "required_lvl": 24, + "isVaal": true, + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalGrace.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/bamakohobonomo" +}, { + "id": 235, + "name": "Vaal Haste", + "required_lvl": 24, + "isVaal": true, + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalHaste.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/amokakihakahat" +}, { + "id": 236, + "name": "Vaal Lightning Strike", + "required_lvl": 12, + "isVaal": true, + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalLightningStrike.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/zyeyakitosenat" +}, { + "id": 237, + "name": "Vaal Rain of Arrows", + "required_lvl": 12, + "isVaal": true, + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalRainofArrows.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/isinohikokitan" +}, { + "id": 238, + "name": "Vaal Reave", + "required_lvl": 12, + "isVaal": true, + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalReave.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/setasikinitosi" +}, { + "id": 239, + "name": "Vaal Spectral Throw", + "required_lvl": 1, + "isVaal": true, + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalGhostlyThrow.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ouainohorimoki" +}, { + "id": 240, + "name": "Vaal Arc", + "required_lvl": 12, + "isVaal": true, + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalArc.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/agamoooobositu" +}, { + "id": 241, + "name": "Vaal Clarity", + "required_lvl": 10, + "isVaal": true, + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalClarity.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/azusitoterasoi" +}, { + "id": 242, + "name": "Vaal Cold Snap", + "required_lvl": 16, + "isVaal": true, + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalColdSnap.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/timonisukurahi" +}, { + "id": 243, + "name": "Vaal Discipline", + "required_lvl": 24, + "isVaal": true, + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalDiscipline.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/midoruriwarono" +}, { + "id": 244, + "name": "Vaal Fireball", + "required_lvl": 1, + "isVaal": true, + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalFireball.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/amaisokokonasi" +}, { + "id": 245, + "name": "Vaal Flameblast", + "required_lvl": 28, + "isVaal": true, + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalChargedBlast.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/uhanahahikohay" +}, { + "id": 246, + "name": "Vaal Ice Nova", + "required_lvl": 12, + "isVaal": true, + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalIceNova.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/omitonotitomot" +}, { + "id": 247, + "name": "Vaal Lightning Trap", + "required_lvl": 12, + "isVaal": true, + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalLightningTrap.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/akusimikutohis" +}, { + "id": 248, + "name": "Vaal Lightning Warp", + "required_lvl": 10, + "isVaal": true, + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalLightningWarp.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/otizyenanimasa" +}, { + "id": 249, + "name": "Vaal Power Siphon", + "required_lvl": 12, + "isVaal": true, + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalPowerSiphon.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ariarikaronita" +}, { + "id": 250, + "name": "Vaal Righteous Fire", + "required_lvl": 16, + "isVaal": true, + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalRighteousFire.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/oyomenazuramoh" +}, { + "id": 251, + "name": "Vaal Spark", + "required_lvl": 1, + "isVaal": true, + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalSpark.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ohosekotewahar" +}, { + "id": 252, + "name": "Vaal Storm Call", + "required_lvl": 12, + "isVaal": true, + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalStormcall.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/itateyumimitok" +}, { + "id": 253, + "name": "Vaal Summon Skeletons", + "required_lvl": 10, + "isVaal": true, + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalSummonSkeletons.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/asikositarusim" +}, { + "id": 254, + "name": "Empower", + "required_lvl": 1, + "isVaal": false, + "available_to": [], + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Empower.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/oritonahauruna" +}, { + "id": 255, + "name": "Enlighten", + "required_lvl": 38, + "isVaal": false, + "available_to": [], + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Enlighten.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/onasakisamnihu" +}, { + "id": 256, + "name": "Portal", + "required_lvl": 10, + "isVaal": false, + "available_to": [], + "color": "white", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Portal.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/iniukoakokikek" +}, { + "id": 257, + "name": "Mirror Arrow", + "required_lvl": 24, + "isVaal": false, + "available_to": [], + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/MirrorArrow.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/isitohazomemes" +}, { + "id": 258, + "name": "Enhance", + "required_lvl": 1, + "isVaal": false, + "available_to": [], + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/enhance.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/azikamiosioyom" +}, { + "id": 259, + "name": "Detonate Mines", + "required_lvl": 8, + "isVaal": false, + "available_to": [], + "color": "white", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/DetonateMines.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/azakokebahimim" +}, { + "id": 260, + "name": "Added Chaos Damage", + "required_lvl": 31, + "isVaal": false, + "available_to": [], + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/AddedChaosDamage.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/tasamnohaubiha" +}, { + "id": 261, + "name": "Block Chance Reduction", + "required_lvl": 19, + "isVaal": false, + "available_to": [], + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/BreakBlock.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/iheninoraokori" +}, { + "id": 263, + "name": "Frostbolt", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 1, + "isVaal": false, + "available_to": ["templar", "witch", "shadow", "scion"], + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FrostBolt.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/onarutoyahikah" +}, { + "id": 264, + "name": "Vortex", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 28, + "isVaal": false, + "available_to": ["templar", "witch", "shadow", "scion"], + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FrostVortex.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/itoositenamaha" +}, { + "id": 265, + "name": "Spirit Offering", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 12, + "isVaal": false, + "available_to": ["templar", "witch", "scion"], + "color": "blue", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SpiritOffering.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/orimasinuoniwo" +}, { + "id": 266, + "name": "Ancestral Warchief", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 28, + "isVaal": false, + "available_to": ["marauder", "templar", "duelist", "scion"], + "color": "red", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SlamTotemGem.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/itokatubamihug" +}, { + "id": 267, + "name": "Lacerate", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 12, + "isVaal": false, + "available_to": ["marauder", "templar", "shadow", "ranger", "duelist", "scion"], + "color": "green", + "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/DoubleSlash.png?scale=1&w=1&h=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 268, + "name": "Blade Flurry", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 28, + "isVaal": false, + "available_to": ["shadow", "ranger", "duelist", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/ChargedAttack.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 269, + "name": "Blight", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 1, + "isVaal": false, + "available_to": ["witch", "shadow", "templar", "scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/BlightGem.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 270, + "name": "Scorching Ray", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 12, + "isVaal": false, + "available_to": ["witch", "templar", "scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/FireBeam.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +},{ + "id": 271, + "name": "Vaal Breach", + "required_lvl": 10, + "isVaal": true, + "color": "white", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VaalGems/VaalBreachPortal.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 272, + "name": "Cast while Channelling", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "town": "Highgate", + "required_lvl": 38, + "isVaal": false, + "available_to": ["witch","shadow","ranger","duelist","marauder", "templar", "scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/CastWhileChanneling.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 273, + "name": "Vile Toxins", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "town": "Highgate", + "required_lvl": 38, + "isVaal": false, + "available_to": ["shadow","ranger", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/VileToxins.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 274, + "name": "Unbound Ailments", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 8, + "isVaal": false, + "available_to": ["witch","shadow", "templar", "scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/UnboundAilments.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 275, + "name": "Storm Burst", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 28, + "isVaal": false, + "available_to": ["witch","shadow", "templar", "scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/StormBurst.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 276, + "name": "Ruthless", + "quest_name": "Mercy Mission", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 1, + "isVaal": false, + "available_to": ["duelist","marauder", "templar", "scion"], + "color": "red", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/Ruthless.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 277, + "name": "Onslaught", + "quest_name": "Mercy Mission", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 1, + "isVaal": false, + "available_to": ["shadow","ranger","duelist","marauder", "templar", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/Onslaught.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 278, + "name": "Maim", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 8, + "isVaal": false, + "available_to": ["ranger","duelist","marauder", "scion"], + "color": "red", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/Maim.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 279, + "name": "Lesser Poison", + "quest_name": "Mercy Mission", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 1, + "isVaal": false, + "available_to": ["shadow","ranger", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/LesserPoison.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 280, + "name": "Immolate", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "town": "Highgate", + "required_lvl": 38, + "isVaal": false, + "available_to": ["witch","marauder", "templar", "scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/Immolate.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 281, + "name": "Ignite Proliferation", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "town": "Highgate", + "required_lvl": 38, + "isVaal": false, + "available_to": ["witch", "templar", "scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/IgniteProliferation.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +},{ + "id": 282, + "name": "Efficacy", + "quest_name": "A Fixture of Fate", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 31, + "isVaal": false, + "available_to": ["witch","shadow", "templar", "scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/Efficacy.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 283, + "name": "Decay", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "town": "Highgate", + "required_lvl": 38, + "isVaal": false, + "available_to": ["witch","shadow","scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/Decay.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +},{ + "id": 284, + "name": "Deadly Ailments", + "quest_name": "Sharp and Cruel", + "npc": "Yeena", + "act": 2, + "town": "The Forest Encampment", + "required_lvl": 18, + "isVaal": false, + "available_to": ["witch","shadow","ranger","duelist", "templar", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/DeadlyAilments.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi" +}, { + "id": 285, + "name": "Dark Pact", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 28, + "isVaal": false, + "available_to": ["witch","shadow","scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/SkeletalChains.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 286, + "name": "Charged Dash", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 28, + "isVaal": false, + "available_to": ["shadow","ranger","duelist","marauder", "templar", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/ChargedDashGem.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +},{ + "id": 287, + "name": "Chance to Bleed", + "quest_name": "Mercy Mission", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 1, + "isVaal": false, + "available_to": ["ranger","duelist","marauder", "templar", "scion"], + "color": "red", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/ChanceToBleed.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 288, + "name": "Brutality", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "town": "Highgate", + "required_lvl": 38, + "isVaal": false, + "available_to": ["duelist","marauder", "scion"], + "color": "red", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/Brutality.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 289, + "name": "Arcane Surge", + "quest_name": "Mercy Mission", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 1, + "isVaal": false, + "available_to": ["witch","shadow", "templar", "scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/ArcaneSurge.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 290, + "name": "Volley", + "quest_name": "Mercy Mission", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 4, + "isVaal": false, + "available_to": ["witch","shadow","ranger","duelist","marauder", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/ParallelProjectile.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 291, + "name": "Volatile Dead", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 12, + "isVaal": false, + "available_to": ["witch","shadow","ranger", "templar", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VolatileDead.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 292, + "name": "Unearth", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 10, + "isVaal": false, + "available_to": ["witch","shadow","ranger", "templar", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/BoneLance.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 293, + "name": "Storm Barrier", + "quest_name": "Mercy Mission", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 4, + "isVaal": false, + "available_to": ["witch","shadow", "templar", "scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/StormBarrier.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 294, + "name": "Spell Cascade", + "quest_name": "Mercy Mission", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 4, + "isVaal": false, + "available_to": ["witch","shadow", "templar", "scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/SpellCascade.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 295, + "name": "Mirage Archer", + "quest_name": "Mercy Mission", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 4, + "isVaal": false, + "available_to": ["shadow","ranger","duelist", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/MirageArcher.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 296, + "name": "Despair", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 24, + "isVaal": false, + "available_to": ["witch","shadow","ranger","duelist", "templar", "scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Despair.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 297, + "name": "Cremation", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 28, + "isVaal": false, + "available_to": ["witch","shadow","ranger", "templar", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/CorpseEruption.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 298, + "name": "Bodyswap", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 10, + "isVaal": false, + "available_to": ["witch","shadow","ranger", "templar", "scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/CorpseWarp.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 299, + "name": "Ancestral Call", + "quest_name": "Mercy Mission", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 4, + "isVaal": false, + "available_to": ["ranger","duelist","marauder", "templar", "scion"], + "color": "red", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/MirageStrike.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 300, + "name": "Tectonic Slam", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 28, + "isVaal": false, + "available_to": ["duelist","marauder", "templar", "scion"], + "color": "red", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/TectonicSlam.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +},{ + "id": 301, + "name": "Summon Phantasm on Kill", + "quest_name": "Mercy Mission", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 4, + "isVaal": false, + "available_to": ["witch","shadow", "templar", "scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/SummonPhantasm.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +},{ + "id": 302, + "name": "Spectral Shield Throw", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 12, + "isVaal": false, + "available_to": ["shadow","ranger","duelist","marauder", "templar", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Thrown%20Shield.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 303, + "name": "Vaal Impurity of Lightning", + "required_lvl": 24, + "isVaal": true, + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VaalGems/VaalLightningResistAura.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/itahariniyeram" +}, { + "id": 304, + "name": "Vaal Impurity of Ice", + "required_lvl": 24, + "isVaal": true, + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VaalGems/VaalColdResistAura.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/itahariniyeram" +}, { + "id": 305, + "name": "Vaal Impurity of Fire", + "required_lvl": 24, + "isVaal": true, + "color": "red", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VaalGems/VaalFireResistAura.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/itahariniyeram" +}, { + "id": 306, + "name": "Vaal Earthquake", + "required_lvl": 28, + "isVaal": true, + "color": "red", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VaalGems/VaalQuakeSlam.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/itahariniyeram" +}, { + "id": 307, + "name": "Vaal Blight", + "required_lvl": 1, + "isVaal": true, + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VaalGems/VaalBlightGem.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/itahariniyeram" +}, { + "id": 308, + "name": "Vaal Blade Vortex", + "required_lvl": 12, + "isVaal": true, + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VaalGems/VaalSpinningEtherealBladesGem.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/itahariniyeram" +}, { + "id": 309, + "name": "Siphoning Trap", + "quest_name": "The Caged Brute", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 10, + "isVaal": false, + "available_to": ["witch","shadow", "scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/IceSiphon.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 310, + "name": "Seismic Trap", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 28, + "isVaal": false, + "available_to": ["witch","shadow", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/SubterraneanTrap.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 311, + "name": "Lightning Spire Trap", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 28, + "isVaal": false, + "available_to": ["witch","shadow", "scion"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/LightningSpire.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 312, + "name": "Flamethrower Trap", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 28, + "isVaal": false, + "available_to": ["witch","shadow", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/FlamethrowerTrap.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 313, + "name": "Explosive Trap", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 1, + "isVaal": false, + "available_to": ["witch","shadow","ranger", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/ShrapnelTrap.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 314, + "name": "Withering Touch", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "town": "Highgate", + "required_lvl": 38, + "isVaal": false, + "available_to": ["shadow","ranger","duelist", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/WitherGemSupport.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 315, + "name": "Vaal Ancestral Warchief", + "required_lvl": 28, + "isVaal": true, + "color": "red", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/SlamTotemGemVaal.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 316, + "name": "Toxic Rain", + "quest_name": "The Siren's Cadence", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 12, + "isVaal": false, + "available_to": ["shadow","ranger","duelist", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/RainofSporesGem.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 317, + "name": "Summon Holy Relic", + "quest_name": "Breaking Some Eggs", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 4, + "isVaal": false, + "available_to": ["witch", "templar"], + "color": "blue", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/HolyRelic.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 318, + "name": "Smite", + "quest_name": "Enemy at the Gate", + "npc": "Nessa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 1, + "isVaal": false, + "available_to": ["marauder", "templar", "scion"], + "color": "red", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/SmiteGem.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 319, + "name": "Scourge Arrow", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 28, + "isVaal": false, + "available_to": ["shadow","ranger","duelist", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VirulentArrow.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +}, { + "id": 320, + "name": "Consecrated Path", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 28, + "isVaal": false, + "available_to": ["marauder", "templar", "scion"], + "color": "red", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/HolyPathGem.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi" +},{ + "id": 321, + "name": "Herald of Agony", + "quest_name": "The Root of the Problem", + "npc": "Yeena", + "act": 2, + "town": "The Forest Encampment", + "required_lvl": 16, + "isVaal": false, + "available_to": ["shadow","ranger","duelist", "scion"], + "color": "green", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/HeraldOfAgonyGem.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi" +},{ + "id": 322, + "name": "Herald of Purity", + "quest_name": "The Root of the Problem", + "npc": "Yeena", + "act": 2, + "town": "The Forest Encampment", + "required_lvl": 16, + "isVaal": false, + "available_to": ["witch","duelist","marauder", "templar", "scion"], + "color": "red", + "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/HeraldOfLight%20Gem.png?scale=1", + "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi" +},{ + "id": 323, + "name": "Winter Orb", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 28, + "isVaal": false, + "available_to": [], + "color": "blue", + "iconPath": "https://web.poecdn.com/public/news/2018-12-06/WinterOrb.png" +},{ + "id": 324, + "name": "Storm Brand", + "quest_name": "The Siren's Cadence", + "npc": "Neesa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 12, + "isVaal": false, + "available_to": [], + "color": "blue", + "iconPath": "https://web.poecdn.com/public/news/2018-12-06/StormBrand.png" +},{ + "id": 325, + "name": "Armageddon Brand", + "quest_name": "Sever the Right Hand", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 28, + "isVaal": false, + "available_to": [], + "color": "blue", + "iconPath": "https://web.poecdn.com/public/news/2018-12-06/ArmageddonBrand.png" +},{ + "id": 326, + "name": "Brand Recall", + "quest_name": "The Root of the Problem", + "npc": "Yeena", + "act": 2, + "town": "The Forest Encampment", + "required_lvl": 16, + "isVaal": false, + "available_to": [], + "color": "blue", + "iconPath": "https://web.poecdn.com/public/news/2018-12-06/BrandRecall.png" +},{ + "id": 327, + "name": "Shattering Steel", + "quest_name": "The Siren's Cadence", + "npc": "Neesa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 12, + "isVaal": false, + "available_to": [], + "color": "green", + "iconPath": "https://web.poecdn.com/public/news/2018-12-06/ShatteringSteel.png" +},{ + "id": 328, + "name": "Lancing Steel", + "quest_name": "The Siren's Cadence", + "npc": "Neesa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 12, + "isVaal": false, + "available_to": [], + "color": "green", + "iconPath": "https://web.poecdn.com/public/news/2018-12-06/LancingSteel.png", + "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi" +},{ + "id": 329, + "name": "War Banner", + "quest_name": "Breaking Some Eggs", + "npc": "Neesa", + "act": 1, + "town": "Lioneye's Watch", + "required_lvl": 4, + "isVaal": false, + "available_to": [], + "color": "red", + "iconPath": "https://web.poecdn.com/public/news/2018-12-06/WarBanner.png", + "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi" +},{ + "id": 330, + "name": "Dread Banner", + "quest_name": "Lost in Love", + "npc": "Clarissa", + "act": 3, + "town": "The Sarn Encampment", + "required_lvl": 24, + "isVaal": false, + "available_to": [], + "color": "red", + "iconPath": "https://web.poecdn.com/public/news/2018-12-06/DreadBanner.png", + "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi" +},{ + "id": 331, + "name": "Multiple Totems", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "town": "The Highate", + "required_lvl": 38, + "isVaal": false, + "available_to": [], + "color": "red", + "iconPath": "https://web.poecdn.com/public/news/2018-12-06/MultipleTotemsSupport.png", + "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi" +},{ + "id": 332, + "name": "Bonechill", + "quest_name": "The Eternal Nightmare", + "npc": "Petarus and Vanja", + "act": 4, + "town": "The Highate", + "required_lvl": 38, + "isVaal": false, + "available_to": [], + "color": "blue", + "iconPath": "https://web.poecdn.com/public/news/2018-12-06/BonechillSupport.png", + "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi" +} + +] \ No newline at end of file diff --git a/src/poe/level/data/Act.java b/src/poe/level/data/Act.java new file mode 100644 index 0000000..0b86c0a --- /dev/null +++ b/src/poe/level/data/Act.java @@ -0,0 +1,22 @@ +package poe.level.data; +import java.util.ArrayList; + +public class Act { + int actid; + String act; + public ArrayList zones; + + public Act(int actId, String act){ + this.actid = actId; + this.zones = new ArrayList(); + this.act= act; + } + + public ArrayList getZones(){ + return zones; + } + + public void putZone(Zone z){ + zones.add(z); + } +} diff --git a/src/poe/level/data/ActHandler.java b/src/poe/level/data/ActHandler.java new file mode 100644 index 0000000..f38805e --- /dev/null +++ b/src/poe/level/data/ActHandler.java @@ -0,0 +1,28 @@ +package poe.level.data; +import java.util.ArrayList; + +public class ActHandler { + + private static ActHandler mInstance; + + public static synchronized ActHandler getInstance() { + if (mInstance == null ) { + mInstance = new ActHandler(); + } + return mInstance; + } + + public ArrayList acts; + + public ActHandler(){ + acts = new ArrayList<>(); + } + + public void putAct(Act a){ + acts.add(a); + } + + public ArrayList getActs(){ + return acts; + } +} diff --git a/src/poe/level/data/Build.java b/src/poe/level/data/Build.java new file mode 100644 index 0000000..581cc67 --- /dev/null +++ b/src/poe/level/data/Build.java @@ -0,0 +1,100 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.data; + +import java.util.ArrayList; +import java.util.Comparator; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; + +/** + * + * @author Christos + */ +public class Build { + String buildName; + String className; + String ascendancyName; + public int level; + ArrayList gems; + + public Build(String buildName,String className + , String ascendancyName){ + this.buildName = buildName; + this.className = className; + this.ascendancyName = ascendancyName; + gems = new ArrayList<>(); + level = 1; + } + + public String getName(){ + return buildName; + } + + public String getClassName(){ + return className; + } + + public String getAsc(){ + return ascendancyName; + } + + public ArrayList getSocketGroup(){ + return gems; + } + + public boolean validate(){ + System.out.println(">>>>Validating build :"+this.buildName+"... <<<<"); + for(SocketGroup sg : getSocketGroup()){ + if(sg.getActiveGem()==null){ + System.out.println(">>>>A socket group doesn't have a valid main gem.<<<<"); + return false; + }else{ + System.out.println("SocketGroup # "+sg.getActiveGem().getGemName()); + System.out.println("- Use at level: "+sg.fromGroupLevel); + if(sg.replaceGroup()){ + if(sg.getGroupReplaced().getActiveGem()==null){ + System.out.println(">>>>Socket group -"+sg.getActiveGem().getGemName()+" replaces with a socket group that doesn't have a valid main gem."); + return false; + } + if(sg.getGroupReplaced().getFromGroupLevel()!=sg.getUntilGroupLevel()){ + System.out.println(">>>>Socket group -"+sg.getActiveGem().getGemName()+"- replaces with -" + +sg.getGroupReplaced().getActiveGem().getGemName()+"- and group levels don't match."); + return false; + } + System.out.println("- Replace at level: "+sg.untilGroupLevel); + System.out.println("- Replace with : -"+sg.getGroupReplaced().getActiveGem().getGemName()+"- ."); + } + + //inner loop + ArrayList sorted = new ArrayList<>(sg.getGems()); + sorted.sort(Comparator.comparing(Gem::getLevelAdded)); + for(Gem g : sorted){ + if(g.getGemName().equals("")){ + System.out.println(">>>>A gem in this socket group is not set.<<<<"); + return false; + } + System.out.println("--Gem # "+g.getGemName()); + System.out.println("--- Use at level: "+g.getLevelAdded()); + if(g.replaced){ + if(g.replacedWith==null){ + System.out.println(">>>>Gem -"+g.getGemName()+" replacement has not been set."); + return false; + } + if(g.replacedWith.getLevelAdded()<=g.getLevelAdded()){ + System.out.println(">>>>Gem -"+g.getGemName()+"- replaces with -" + +g.replacedWith.getGemName()+"- and change level don't match."); + return false; + } + System.out.println("--- Replace at level: "+g.replacedWith.getLevelAdded()); + System.out.println("--- Replace with : -"+g.replacedWith.getGemName()+"- ."); + } + } + } + } + return true; + } +} diff --git a/src/poe/level/data/Controller.java b/src/poe/level/data/Controller.java new file mode 100644 index 0000000..8c2ac6d --- /dev/null +++ b/src/poe/level/data/Controller.java @@ -0,0 +1,228 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.data; + +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import javafx.application.Platform; +import javafx.stage.Stage; +import poe.level.fx.Main_Stage; +import poe.level.fx.Preferences_Controller; +import poe.level.fx.overlay.GemOverlay_Stage; +import poe.level.fx.overlay.LevelOverlay_Stage; +import poe.level.fx.overlay.ZoneOverlay_Stage; + + +/** + * + * @author Xrhstos + */ +public class Controller { + + public int playerLevel; + public int monsterLevel; + public String currentZone; + private Tail _tObj; + String path; + + private ZoneOverlay_Stage zone_stage; + private LevelOverlay_Stage xp_stage; + private GemOverlay_Stage level_stage; + private boolean zone_stage_lock; + private boolean xp_stage_lock; + private boolean level_stage_lock; + private Build build; + + private Zone zone_checkpoint; + private HashSet duplicates; + private boolean skipActs; + private boolean act6detected; + private boolean releaseLock; + + public static int[] findSafe(int currentLevel){ + int[] safe = new int[3]; + if(currentLevel - 3 <= 0){ + safe[0] = 1; + }else{ + safe[0]=currentLevel - (currentLevel/16 + 3); + } + safe[1]=currentLevel/16 + 3 + currentLevel; + safe[2]=currentLevel/16 + 3; + return safe; + } + + public static int effectiveDifference(int playerlvl, int arealevel, int safezone){ + return (Math.max(Math.abs(playerlvl-arealevel) - safezone,0)); + } + + public static double xpmultiplier(int effectiveDiff,int playerlvl){ + double effpow = Math.pow(effectiveDiff,2.5); + double leftInner = (playerlvl + 5) / (playerlvl + 5 + effpow); + double leftPow = Math.pow(leftInner,1.5); + if(playerlvl<95) + //return Math.max(Math.pow( playerlvl+5/ (playerlvl+5+ Math.pow( effectiveDiff,2.5)) , 1.5),0.01); + return Math.max(leftPow,0.01)*100; + else + return Math.max(leftPow * (1 / (1 + 0.1*(playerlvl-94))),0.01)*100; + } + + public static double findxpmulti(int playerlvl,int arealvl){ + int safe = findSafe(playerlvl)[2]; + int effDif = effectiveDifference(playerlvl,arealvl,safe); + double a = xpmultiplier(effDif,playerlvl); + System.out.println(" for level "+playerlvl+" safe zone is " + safe + " and eff dif is "+ effDif); + System.out.println("xp multi is "+(int)a+"%"); + return a; + } + + + //public Controller(Stage zone, Stage xp, Stage level, Build build) { + public Controller(boolean zone_b, boolean xp, boolean level, Build build) { + if(zone_b){ + zone_stage = new ZoneOverlay_Stage(); + } + if(xp){ + xp_stage = new LevelOverlay_Stage(); + } + if(level){ + level_stage = new GemOverlay_Stage(build); + } + act6detected = false; + skipActs = false; + releaseLock = true; + playerLevel = Main_Stage.playerLevel; + monsterLevel = 1; + //zone_stage = (ZoneOverlay_Stage) zone; + //xp_stage = (LevelOverlay_Stage) xp; + //level_stage = (GemOverlay_Stage) level; + this.build = build; + + //zone_stage_lock = zone_stage == null; + //xp_stage_lock = xp_stage == null; + //level_stage_lock = level_stage == null; + zone_stage_lock = !zone_b; + xp_stage_lock= !xp; + level_stage_lock= !level; + + path = Preferences_Controller.poe_log_dir; + + duplicates = new HashSet<>(); + duplicates.add("The Reliquary"); + duplicates.add("The Ossuary"); + duplicates.add("The Torched Courts"); + duplicates.add("The Lunaris Temple Level 2"); + duplicates.add("The Solaris Temple Level 1"); + duplicates.add("The Solaris Temple Level 2"); + duplicates.add("The Cathedral Rooftop"); + duplicates.add("The Control Blocks"); + duplicates.add("The Fellshrine Ruins"); + duplicates.add("The Den"); + duplicates.add("The Northern Forest"); + duplicates.add("The Dread Thicket"); + duplicates.add("The Lunaris Temple Level 1"); + duplicates.add("The Cavern of Anger"); + duplicates.add("The Broken Bridge"); + duplicates.add("The Crossroads"); + duplicates.add("The Lower Prison"); + duplicates.add("Prisoner's Gate"); + duplicates.add("The Western Forest"); + duplicates.add("The Riverways"); + duplicates.add("The Wetlands"); + duplicates.add("The Southern Forest"); + duplicates.add("The Mud Flats"); + duplicates.add("The Twilight Strand"); + duplicates.add("The Coast"); + duplicates.add("The Chamber of Sins Level 1"); + duplicates.add("The Chamber of Sins Level 2"); + + start(); + + } + + public void start(){ + _tObj = new Tail(); + //_tObj.setUpTailer(new File("C:\\Users\\Christos\\Documents\\NetBeansProjects\\POE-level-fx\\src\\a.txt"), this); + _tObj.setUpTailer(new File(path), this); + } + + + public void lvlupdate(){ + if(!xp_stage_lock){ + System.out.println("New level is "+ playerLevel+"."); + if(zone_checkpoint!=null){ + xp_stage.update(playerLevel,zone_checkpoint.getZoneLevel()); + } + } + if(!level_stage_lock){ + level_stage.update(playerLevel); + } + } + + public void zoneupdate(){ + boolean zoneDetect = false; + if(playerLevel>=38 && releaseLock){ + if(currentZone.equals("Lioneye's Watch")){ + act6detected = true; + } + if((currentZone.equals("The Twilight Strand") || currentZone.equals("The Coast")) && act6detected){ + skipActs = true; + releaseLock = false; + } + } + if(playerLevel>=50){ + skipActs = true; + releaseLock = false; + } + //add a reset thing for when zone in uknown + //System.out.println("New zone is "+ currentZone+"."); + boolean skippedFirstPart = false; + outerloop: + for(Act a : ActHandler.getInstance().getActs()){ + for(Zone zone : a.getZones()){ + if (zone.name.equals(currentZone)){ + if(duplicates.contains(currentZone) && skipActs && !skippedFirstPart){ + skippedFirstPart = true; + continue; + } + zone_checkpoint = zone; + monsterLevel = zone.level; + zoneDetect = true; + + if(zone.hasPassive){ + //System.out.println("This zone contains a passive skill quest."); + } + if(zone.hasTrial){ + //System.out.println("This zone contains a lab trial."); + } + + break outerloop; + } + } + } + if(zoneDetect ){ + if(!zone_stage_lock){ + zone_stage.queue(zone_checkpoint); + } + if(!xp_stage_lock){ + xp_stage.update(playerLevel,zone_checkpoint.getZoneLevel()); + } + }else{ + if(!xp_stage_lock){ + xp_stage.reset(playerLevel); + } + if(!zone_stage_lock){ + zone_stage.reset(); + } + } + } + +} diff --git a/src/poe/level/data/Gem.java b/src/poe/level/data/Gem.java new file mode 100644 index 0000000..c7c7170 --- /dev/null +++ b/src/poe/level/data/Gem.java @@ -0,0 +1,148 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.data; + +import java.awt.geom.AffineTransform; +import java.awt.image.AffineTransformOp; +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import javafx.embed.swing.SwingFXUtils; +import javafx.scene.control.Label; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javax.imageio.ImageIO; + +/** + * + * @author Christos + */ +public class Gem { + public transient Image gemIcon; + public transient Image smallGemIcon; + public int id; + + public String name; + public String quest_name; + public String npc; + public int act; + public int required_lvl; + public int level_added; + public boolean isVaal; + public ArrayList available_to; + public String town; + public String color; + public String iconPath; + public transient Label cachedLabel; + + public String iconDirPath; + + public boolean replaced; + public Gem replacedWith; + public boolean replaces; + public Gem replacesGem; + + //IDS FOR JSON CONVERTION + public int id_replaced; + public int id_replaces; + + public Gem(){ + available_to = new ArrayList<>(); + level_added = -1; + replaced = false; + replacedWith = null; + replaces = false; + replacesGem = null; + id = -1; + id_replaced = -1; + id_replaces = -1; + } + + public Gem(Gem dupe){ + this.gemIcon = dupe.getIcon(); + this.smallGemIcon = dupe.getSmallIcon(); + this.name = dupe.getGemName(); + //more + this.id = dupe.id; + this.quest_name = dupe.quest_name; + this.npc = dupe.npc; + this.act = dupe.act; + this.required_lvl = dupe.required_lvl; + this.isVaal = dupe.isVaal; + this.available_to = new ArrayList<>(dupe.available_to); + this.town = dupe.town; + this.color = dupe.color; + this.iconPath = dupe.iconPath; + this.cachedLabel= dupe.cachedLabel; + this.iconDirPath = dupe.iconDirPath; + level_added = -1; + replaced = false; + replacedWith = null; + replaces = false; + replacesGem = null; + } + + public int getLevelAdded(){ + if(level_added!=-1){ + return level_added; + }else + return required_lvl; + } + + public Image getIcon(){ + //hopefully resized + return gemIcon; + } + + public Image getSmallIcon(){ + //hopefully resized + return smallGemIcon; + } + + public String getGemName(){ + return name; + } + + public Gem dupeGem(){ + return new Gem(this); + } + + public ArrayList getChar(){ + return available_to; + } + + public void putChar(String z){ + available_to.add(z); + } + + public String getGemColor(){ + return color; + } + + public Label getLabel(){ + cachedLabel = new Label(); + cachedLabel.setText(name); + cachedLabel.setGraphic(new ImageView(gemIcon)); + return cachedLabel; + } + + public void resizeImage(){ + BufferedImage before = SwingFXUtils.fromFXImage(gemIcon, null); + int w = before.getWidth(); + int h = before.getHeight(); + // Create a new image of the proper size + int w2 = (int) (w * 0.7); + int h2 = (int) (h * 0.7); + BufferedImage after = new BufferedImage(w2, h2, BufferedImage.TYPE_INT_ARGB); + AffineTransform scaleInstance = AffineTransform.getScaleInstance(0.7, 0.7); + AffineTransformOp scaleOp + = new AffineTransformOp(scaleInstance, AffineTransformOp.TYPE_BILINEAR); + + after = scaleOp.filter(before, after); + smallGemIcon = SwingFXUtils.toFXImage(after, null); + //ImageIcon imageIcon = new ImageIcon(dimg); + } + +} diff --git a/src/poe/level/data/GemHolder.java b/src/poe/level/data/GemHolder.java new file mode 100644 index 0000000..f5e2db4 --- /dev/null +++ b/src/poe/level/data/GemHolder.java @@ -0,0 +1,309 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.data; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; + +/** + * + * @author Christos + */ +public class GemHolder { + public ArrayList gems; + + private ArrayList witch; + private ArrayList shadow; + private ArrayList templar; + private ArrayList ranger; + private ArrayList duelist; + private ArrayList marauder; + private ArrayList scion; + + private ArrayList witchO; + private ArrayList shadowO; + private ArrayList templarO; + private ArrayList rangerO; + private ArrayList duelistO; + private ArrayList marauderO; + private ArrayList scionO; + + + private static GemHolder mInstance; + private Gem dummie; + public String className; + private HashMap>>> the_ultimate_map; + private ArrayList>> zone_gems; + + public static synchronized GemHolder getInstance() { + if (mInstance == null ) { + mInstance = new GemHolder(); + } + return mInstance; + } + + public GemHolder(){ + gems = new ArrayList<>(); + witch = new ArrayList<>(); + shadow = new ArrayList<>(); + templar = new ArrayList<>(); + ranger = new ArrayList<>(); + duelist = new ArrayList<>(); + marauder = new ArrayList<>(); + scion = new ArrayList<>(); + + witchO = new ArrayList<>(); + shadowO = new ArrayList<>(); + templarO = new ArrayList<>(); + rangerO = new ArrayList<>(); + duelistO = new ArrayList<>(); + marauderO = new ArrayList<>(); + scionO = new ArrayList<>(); + + dummie = new Gem(); + dummie.name = ""; + + the_ultimate_map = new HashMap<>(); + the_ultimate_map.put("witch", null); + the_ultimate_map.put("shadow", null); + the_ultimate_map.put("templar", null); + the_ultimate_map.put("ranger", null); + the_ultimate_map.put("duelist", null); + the_ultimate_map.put("marauder", null); + the_ultimate_map.put("scion", null); + } + + public void putGem(Gem a){ + gems.add(a); + + if(a.available_to.size()>0){ + for(String ch : a.available_to){ + if(ch.equals("witch")){ + if(a.getGemName().equals("Arcane Surge")){ + Gem duped = a.dupeGem(); + duped.quest_name = "Enemy at the Gate"; + witch.add(duped); + }else{ + witch.add(a); + } + }else if(ch.equals("shadow")){ + if(a.getGemName().equals("Lesser Poison")){ + Gem duped = a.dupeGem(); + duped.quest_name = "Enemy at the Gate"; + shadow.add(duped); + }else{ + shadow.add(a); + } + }else if(ch.equals("templar")){ + if(a.getGemName().equals("Elemental Proliferation")){ + Gem duped = a.dupeGem(); + duped.quest_name = "Enemy at the Gate"; + templar.add(duped); + }else{ + templar.add(a); + } + }else if(ch.equals("ranger")){ + if(a.getGemName().equals("Pierce")){ + Gem duped = a.dupeGem(); + duped.quest_name = "Enemy at the Gate"; + ranger.add(duped); + }else{ + ranger.add(a); + } + }else if(ch.equals("duelist")){ + if(a.getGemName().equals("Chance to Bleed")){ + Gem duped = a.dupeGem(); + duped.quest_name = "Enemy at the Gate"; + duelist.add(duped); + }else{ + duelist.add(a); + } + }else if(ch.equals("marauder")){ + if(a.getGemName().equals("Ruthless")){ + Gem duped = a.dupeGem(); + duped.quest_name = "Enemy at the Gate"; + marauder.add(duped); + }else{ + marauder.add(a); + } + }else if(ch.equals("scion")){ + if(a.getGemName().equals("Onslaught")){ + Gem duped = a.dupeGem(); + duped.quest_name = "Enemy at the Gate"; + scion.add(duped); + }else{ + scion.add(a); + } + } + } + } + } + + public ArrayList getGems(){ + return gems; + } + + public ArrayList getGemsClass(){ + + if(className.toUpperCase().equals("WITCH")){ + return witch; + }else if(className.toUpperCase().equals("SHADOW")){ + return shadow; + }else if(className.toUpperCase().equals("TEMPLAR")){ + return templar; + }else if(className.toUpperCase().equals("RANGER")){ + return ranger; + }else if(className.toUpperCase().equals("DUELIST")){ + return duelist; + }else if(className.toUpperCase().equals("MARAUDER")){ + return marauder; + }else if(className.toUpperCase().equals("SCION")){ + return scion; + } + return null; + } + + public ArrayList getGemOther(){ + if(className.toUpperCase().equals("WITCH")){ + if(witchO.isEmpty()){ + for(Gem g : gems){ + if(!witch.contains(g)){ + witchO.add(g); + } + } + + } + return witchO; + }else if(className.toUpperCase().equals("SHADOW")){ + if(shadowO.isEmpty()){ + for(Gem g : gems){ + if(!shadow.contains(g)){ + shadowO.add(g); + } + } + + } + return shadowO; + }else if(className.toUpperCase().equals("TEMPLAR")){ + if(templarO.isEmpty()){ + for(Gem g : gems){ + if(!templar.contains(g)){ + templarO.add(g); + } + } + + } + return templarO; + }else if(className.toUpperCase().equals("RANGER")){ + if(witchO.isEmpty()){ + for(Gem g : gems){ + if(!ranger.contains(g)){ + rangerO.add(g); + } + } + + } + return rangerO; + }else if(className.toUpperCase().equals("DUELIST")){ + if(duelistO.isEmpty()){ + for(Gem g : gems){ + if(!duelist.contains(g)){ + duelistO.add(g); + } + } + + } + return duelistO; + }else if(className.toUpperCase().equals("MARAUDER")){ + if(marauderO.isEmpty()){ + for(Gem g : gems){ + if(!marauder.contains(g)){ + marauderO.add(g); + } + } + + } + return marauderO; + }else if(className.toUpperCase().equals("SCION")){ + if(scionO.isEmpty()){ + for(Gem g : gems){ + if(!scion.contains(g)){ + scionO.add(g); + } + } + + } + return scionO; + } + return null; + } + + public ArrayList>> getAll(){ + if(the_ultimate_map.get(className.toLowerCase()) == null){ + the_ultimate_map.put(className.toLowerCase(),getGemClassAndQuest()); + } + return the_ultimate_map.get(className.toLowerCase()); + } + + public ArrayList>> getGemClassAndQuest(){ + if(zone_gems == null){ + HashSet avoidDuplicate = new HashSet<>(); + zone_gems = new ArrayList<>(); + ArrayList initial = GemHolder.getInstance().getGemsClass(); + //ArrayList newList = new ArrayList<>(); + for(int i=0; i<4; i++){ + HashMap> map = new HashMap<>(); + for(Zone z : ActHandler.getInstance().getActs().get(i).zones){ + if(z.questRewardsSkills && !avoidDuplicate.contains(z.quest)){ + avoidDuplicate.add(z.quest); + ArrayList zoneList = new ArrayList<>(); + for(Gem g : initial){ + if(g.quest_name == null){ + System.out.println(g.getGemName()); + }else{ + if(g.quest_name.equals(z.quest)){ + zoneList.add(g); + } + } + } + map.put(z, zoneList); + } + } + zone_gems.add(map); + } + } + + + return zone_gems; + } + + + public Gem tossDummie(){ + return dummie; + } + + public Gem createGemFromCache(String gemName){ + for(Gem g : gems){ + if(g.getGemName().equals(gemName)){ + return g.dupeGem(); + } + } + return null; + } + + public ArrayList custom(String query){ + String query_lower = query.toLowerCase(); + ArrayList list = new ArrayList<>(); + for(Gem g : getGemsClass()){ + String gem_lower = g.getGemName().toLowerCase(); + if(gem_lower.contains(query_lower)){ + list.add(g); + } + } + return list; + } +} diff --git a/src/poe/level/data/GemListCell.java b/src/poe/level/data/GemListCell.java new file mode 100644 index 0000000..2e1b2e4 --- /dev/null +++ b/src/poe/level/data/GemListCell.java @@ -0,0 +1,36 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.data; + +import javafx.scene.control.Label; +import javafx.scene.control.ListCell; +import javafx.scene.image.ImageView; + +/** + * + * @author Christos + */ +public class GemListCell extends ListCell{ + + @Override + protected void updateItem(Gem gem, boolean empty) { + super.updateItem(gem, empty) ; + if (empty) { + setText(null); + } else { + Label l = new Label(); + if(!gem.getGemName().equals("")){ + l.setGraphic(new ImageView(gem.getSmallIcon())); + l.setText(gem.getGemName()); + }else{ + setText(null); + } + setGraphic(l); + + } + } + +} diff --git a/src/poe/level/data/GemToString.java b/src/poe/level/data/GemToString.java new file mode 100644 index 0000000..78a270a --- /dev/null +++ b/src/poe/level/data/GemToString.java @@ -0,0 +1,38 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.data; + +import java.util.HashMap; +import javafx.util.StringConverter; + +/** + * + * @author Christos + */ +public class GemToString extends StringConverter { + + private HashMap map = new HashMap<>(); + + @Override + public T fromString(String string) { + if (!map.containsKey(string)) { + return null; + } + return map.get(string); + } + + @Override + public String toString(T t) { + if (t != null) { + Gem g = (Gem) t; + String str = g.getGemName(); + map.put(str, t); + return str; + } else { + return ""; + } + } +} diff --git a/src/poe/level/data/Logger.java b/src/poe/level/data/Logger.java new file mode 100644 index 0000000..426fc84 --- /dev/null +++ b/src/poe/level/data/Logger.java @@ -0,0 +1,162 @@ +package poe.level.data; +import java.io.*; +import java.util.*; + +/** + * A log file tailer is designed to monitor a log file and send notifications + * when new lines are added to the log file. This class has a notification + * strategy similar to a SAX parser: implement the LogFileTailerListener interface, + * create a LogFileTailer to tail your log file, add yourself as a listener, and + * start the LogFileTailer. It is your job to interpret the results, build meaningful + * sets of data, etc. This tailer simply fires notifications containing new log file lines, + * one at a time. + */ +public class Logger extends Thread +{ + /** + * How frequently to check for file changes; defaults to 2 seconds + */ + private long sampleInterval = 2000; + + /** + * The log file to tail + */ + private File logfile; + + /** + * Defines whether the log file tailer should include the entire contents + * of the exising log file or tail from the end of the file when the tailer starts + */ + private boolean startAtBeginning = false; + + /** + * Is the tailer currently tailing? + */ + private boolean tailing = false; + + /** + * Set of listeners + */ + private Set listeners = new HashSet(); + + /** + * Creates a new log file tailer that tails an existing file and checks the file for + * updates every 5000ms + */ + public Logger( File file ) + { + this.logfile = file; + } + + /** + * Creates a new log file tailer + * + * @param file The file to tail + * @param sampleInterval How often to check for updates to the log file (default = 5000ms) + * @param startAtBeginning Should the tailer simply tail or should it process the entire + * file and continue tailing (true) or simply start tailing from the + * end of the file + */ + public Logger( File file, long sampleInterval, boolean startAtBeginning ) + { + this.logfile = file; + this.sampleInterval = sampleInterval; + } + + public void addLogFileTailerListener( LoggerListener l ) + { + this.listeners.add( l ); + } + + public void removeLogFileTailerListener( LoggerListener l ) + { + this.listeners.remove( l ); + } + + protected void fireNewLogFileLine( String line ) + { + for( Iterator i=this.listeners.iterator(); i.hasNext(); ) + { + LoggerListener l = ( LoggerListener )i.next(); + l.newLogFileLine( line ); + } + } + + public void stopTailing() + { + this.tailing = false; + } + + public void run() + { + // The file pointer keeps track of where we are in the file + long filePointer = 0; + + // Determine start point + if( this.startAtBeginning ) + { + filePointer = 0; + } + else + { + filePointer = this.logfile.length(); + } + + try + { + // Start tailing + this.tailing = true; + int c = 0; + RandomAccessFile file = new RandomAccessFile( logfile, "r" ); + while( this.tailing ) + { + try + { + + // Compare the length of the file to the file pointer + long fileLength = this.logfile.length(); + //System.out.print(c++ +" "); System.out.println(fileLength); + if( fileLength < filePointer ) + { + // Log file must have been rotated or deleted; + // reopen the file and reset the file pointer + file = new RandomAccessFile( logfile, "r" ); + filePointer = 0;System.out.println("Rotated. New log: " + fileLength); + } + + if( fileLength > filePointer ) + { + System.out.println("New data"); + // There is data to read + file.seek( filePointer ); + String line = file.readLine(); + while( line != null ) + { + this.fireNewLogFileLine( line ); + line = file.readLine(); + } + filePointer = file.getFilePointer(); + } + + // Sleep for the specified interval + sleep( this.sampleInterval ); + } + catch( IOException e ) + { + + } + catch( InterruptedException e ) + { + + } + } + + // Close the file that we are tailing + file.close(); + } + catch( Exception e ) + { + e.printStackTrace(); + } + } +} diff --git a/src/poe/level/data/LoggerListener.java b/src/poe/level/data/LoggerListener.java new file mode 100644 index 0000000..33aeed2 --- /dev/null +++ b/src/poe/level/data/LoggerListener.java @@ -0,0 +1,13 @@ +package poe.level.data; +/** + * Provides listener notification methods when a tailed log file is updated + */ +public interface LoggerListener +{ + /** + * A new line has been added to the tailed log file + * + * @param line The new line that has been added to the tailed log file + */ + public void newLogFileLine(String line); +} diff --git a/src/poe/level/data/SocketGroup.java b/src/poe/level/data/SocketGroup.java new file mode 100644 index 0000000..1664d8e --- /dev/null +++ b/src/poe/level/data/SocketGroup.java @@ -0,0 +1,150 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.data; + +import java.util.ArrayList; +import java.util.HashMap; + +/** + * + * @author Christos + */ +public class SocketGroup { + ArrayList gems; + Gem active; + //settings + int fromGroupLevel; + int untilGroupLevel; + boolean replaceGroup; + boolean replacesGroup; + SocketGroup socketGroupReplace; + SocketGroup socketGroupThatReplaces; + //int indexOfReplaceGroup; + transient HashMap linkerToListIndex; + public int id; + // IDS FOR JSON CONVERTION + public int id_replace; + public int id_replaces; + public int active_id; + + public SocketGroup(){ + gems = new ArrayList<>(); + active = null; + //gems.add(GemHolder.getInstance().tossDummie()); + //active.add(GemHolder.getInstance().tossDummie()); + fromGroupLevel = 2; + untilGroupLevel = 36; + replaceGroup = false; + socketGroupReplace = null; + replacesGroup = false; + socketGroupThatReplaces = null; + //indexOfReplaceGroup= -1; + linkerToListIndex= new HashMap<>(); + id = -1; + id_replace = -1; + id_replaces= -1; + active_id = -1; + } + int switche; + public Gem putGem(Gem gem, int id){ + boolean switcher = false; + switche = -1; + Gem g = null; + if(linkerToListIndex.containsKey(id)){ + if(gems.get(linkerToListIndex.get(id)).equals(active)){ + g = gems.get(linkerToListIndex.get(id)); + } + gems.set(linkerToListIndex.get(id), gem); + switche = linkerToListIndex.get(id); + }else{ + gems.add(gem); + linkerToListIndex.put(id, gems.size()-1); + } + return g; + } + //gets called on load from json + public void linkGem(Gem gem , int id){ + linkerToListIndex.put(id, gems.indexOf(gem)); + } + + public int doubleCheck(){ + + return switche; + } + + public void removeGem(Gem gem, int id){ + + } + + public Gem getActiveGem(){ + return active; + } + + public void setActiveGem(Gem g){ + active = g; + } + + public ArrayList getGems(){ + return gems; + } + + public int getFromGroupLevel(){ + return fromGroupLevel; + } + + public void setFromGroupLevel(int a){ + fromGroupLevel = a; + } + + public int getUntilGroupLevel(){ + return untilGroupLevel; + } + + public void setUntilGroupLevel(int a){ + untilGroupLevel = a; + } + + public boolean replaceGroup(){ + return replaceGroup; + } + + public void setReplaceGroup(boolean a){ + replaceGroup = a; + if(a==false){ + socketGroupReplace = null; + } + } + + public SocketGroup getGroupReplaced(){ + return socketGroupReplace; + } + + public void setGroupReplaced(SocketGroup a){ + socketGroupReplace = a; + } + + public boolean replacesGroup(){ + return replacesGroup; + } + + public void setReplacesGroup(boolean a){ + replacesGroup = a; + if(a==false){ + socketGroupThatReplaces = null; + } + } + + public SocketGroup getGroupThatReplaces(){ + return socketGroupThatReplaces; + } + + public void setGroupThatReplaces(SocketGroup a){ + socketGroupThatReplaces = a; + } + + + +} diff --git a/src/poe/level/data/SocketGroupListCell.java b/src/poe/level/data/SocketGroupListCell.java new file mode 100644 index 0000000..9c69e49 --- /dev/null +++ b/src/poe/level/data/SocketGroupListCell.java @@ -0,0 +1,39 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.data; + +import javafx.scene.control.Label; +import javafx.scene.control.ListCell; +import javafx.scene.image.ImageView; + +/** + * + * @author Christos + */ +public class SocketGroupListCell extends ListCell{ + + @Override + protected void updateItem(SocketGroup sg, boolean empty) { + super.updateItem(sg, empty) ; + if (empty) { + setText(null); + } else { + Label l = new Label(); + if(sg.getActiveGem()!=null){ + if(!sg.getActiveGem().getGemName().equals("")){ + l.setGraphic(new ImageView(sg.getActiveGem().getSmallIcon())); + l.setText(sg.getActiveGem().getGemName()); + } + } + else{ + setText(null); + } + setGraphic(l); + + } + } + +} diff --git a/src/poe/level/data/SocketGroupToString.java b/src/poe/level/data/SocketGroupToString.java new file mode 100644 index 0000000..76b13c7 --- /dev/null +++ b/src/poe/level/data/SocketGroupToString.java @@ -0,0 +1,38 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.data; + +import java.util.HashMap; +import javafx.util.StringConverter; + +/** + * + * @author Christos + */ +public class SocketGroupToString extends StringConverter { + + private HashMap map = new HashMap<>(); + + @Override + public T fromString(String string) { + if (!map.containsKey(string)) { + return null; + } + return map.get(string); + } + + @Override + public String toString(T t) { + if (t != null) { + SocketGroup g = (SocketGroup) t; + String str = g.getActiveGem().getGemName(); + map.put(str, t); + return str; + } else { + return ""; + } + } +} diff --git a/src/poe/level/data/Tail.java b/src/poe/level/data/Tail.java new file mode 100644 index 0000000..abbcc9d --- /dev/null +++ b/src/poe/level/data/Tail.java @@ -0,0 +1,169 @@ +package poe.level.data; +// Import the Java classes +import java.util.*; +import java.io.*; +import java.util.logging.Level; +import javafx.application.Platform; +import javax.swing.JFrame; + +/** + * Implements console-based log file tailing, or more specifically, tail + * following: it is somewhat equivalent to the unix command "tail -f" + */ +public class Tail implements LoggerListener { + + /** + * The log file tailer + */ + private Logger tailer; + private ArrayList map; + private ArrayList log; + private boolean mapFound; + private boolean mappedInput; + private File file; + private BufferedWriter out; + private Controller parent; + + /** + * Creates a new Tail instance to follow the specified file + */ + public Tail() { + + } + + public void setUpTailer(File file, Controller parent) { + this.file = file; + this.parent = parent; + tailer = new Logger(this.file, 1000, false); + tailer.addLogFileTailerListener(this); + tailer.start(); + mapFound = false; + mappedInput = false; + log = new ArrayList(); + } + + public void actionIsComing() { + try { + + out = new BufferedWriter(new FileWriter(file, false)); + //code goes here + //out.write("PID | Arr. Time | Burst Time"); // ΤΙΤΛΟΣ ΕΓΓΡΑΦΩΝ ΣΤΟ ΑΡΧΕΙΟ + //out.newLine(); + out.append("2018-01-30 16:49:40.267 [LWJGL Application] INFO com.megacrit.cardcrawl.dungeons.AbstractDungeon - Generated the following dungeon map:\n" + + "2018-01-30 16:49:40.267 [LWJGL Application] INFO com.megacrit.cardcrawl.dungeons.AbstractDungeon - \n" + + " / / \\ \\ \\ \n" + + "14 R R R R R \n" + + " | \\ / / / \n" + + "13 E M M E M \n" + + " \\ / / |/ / \n" + + "12 R ? $ M \n" + + " |/ / | \\ \n" + + "11 M R ? M \n" + + " / | \\|/ | \n" + + "10 R $ M R \n" + + " |/ / | \\ \\ \n" + + "9 M ? ? $ M \n" + + " |/ / / | \n" + + "8 T T T T \n" + + " | \\| \\ / \n" + + "7 E E M E \n" + + " | | \\ / \\ \n" + + "6 R ? M ? \n" + + " \\|/ | / \n" + + "5 E R E \n" + + " | \\| / \n" + + "4 M M M \n" + + " / / | | \n" + + "3 M ? M ? \n" + + " |/ | \\ / \n" + + "2 ? M ? \n" + + " \\ / \\| \n" + + "1 ? M \n" + + " / / \n" + + "0 M M \n" + + "2018-01-30 16:49:40.267 [LWJGL Application] INFO com.megacrit.cardcrawl.dungeons.AbstractDungeon - Game Seed: -8963552135154800752"); + out.append("\n"); + } catch (IOException ex) { + java.util.logging.Logger.getLogger(Tail.class.getName()).log(Level.SEVERE, null, ex); + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException ex) { + java.util.logging.Logger.getLogger(Tail.class.getName()).log(Level.SEVERE, null, ex); + } + } + } + } + + /** + * A new line has been added to the tailed log file + * + * @param line The new line that has been added to the tailed log file + */ + public void newLogFileLine(String line) { + log.add(line); + System.out.println(line); + if (line.contains("You have entered ")) { + int padding = line.indexOf("You have entered"); + String zone = ""; + //line.length()-1 because log format of poe is entered The Twilight Strand. so we skip last dot + for(int i=padding + 17; i(log)); + log.clear(); + }*/ + + } + + public void _startTailing() { + + tailer = new Logger(file, 1000, false); + tailer.addLogFileTailerListener(this); + + tailer.start(); + + + } + + public void _stopTailing() { + tailer.stopTailing(); + } + +} diff --git a/src/poe/level/data/Zone.java b/src/poe/level/data/Zone.java new file mode 100644 index 0000000..f89ec27 --- /dev/null +++ b/src/poe/level/data/Zone.java @@ -0,0 +1,56 @@ +package poe.level.data; +import java.util.ArrayList; + +public class Zone { + int level; + String name; + boolean hasPassive; + boolean hasTrial; + ArrayList image; + String altimage; + String note; + String quest; + boolean questRewardsSkills; + String actName; + int actID; + + public Zone(String zoneName, int zoneLevel, ArrayList images, String altimage + , String note, boolean hasPassive, boolean hasTrial , String quest ,boolean questRewardsSkills + , String actName, int actID){ + this.level = zoneLevel; + this.name = zoneName; + this.hasPassive = hasPassive; + this.hasTrial = hasTrial; + this.note = note; + this.altimage = altimage; + this.image = images; //maybe new list + this.quest= quest; + this.questRewardsSkills = questRewardsSkills; + this.actName = actName; + this.actID = actID; + } + + public int getZoneLevel(){ + return level; + } + + public String getZoneQuest(){ + return quest; + } + + public ArrayList getImages(){ + return image; + } + + public String getActName(){ + return actName; + } + + public String getZoneNote(){ + return note; + } + + public String altImage(){ + return altimage; + } +} diff --git a/src/poe/level/fx/AboutPage.fxml b/src/poe/level/fx/AboutPage.fxml new file mode 100644 index 0000000..2680bc9 --- /dev/null +++ b/src/poe/level/fx/AboutPage.fxml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/poe/level/fx/AboutPageController.java b/src/poe/level/fx/AboutPageController.java new file mode 100644 index 0000000..0f7740f --- /dev/null +++ b/src/poe/level/fx/AboutPageController.java @@ -0,0 +1,73 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.fx; + +import com.jfoenix.controls.JFXButton; +import java.awt.Desktop; +import java.net.URL; +import java.util.ResourceBundle; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.Hyperlink; + +/** + * FXML Controller class + * + * @author Christos + */ +public class AboutPageController implements Initializable { + + @FXML + JFXButton paypal; + @FXML + Hyperlink ee; + @FXML + Hyperlink arias; + @FXML + Hyperlink rainy; + /** + * Initializes the controller class. + */ + @Override + public void initialize(URL url, ResourceBundle rb) { + // TODO + ee.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent e) { + openWebpage("https://www.youtube.com/channel/UCaFHfrY-6uGSAvmczp_7a6Q/featured"); + } + }); + arias.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent e) { + openWebpage("https://github.com/max-arias/poeGems"); + } + }); + rainy.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent e) { + openWebpage("https://github.com/karakasis"); + } + }); + + } + + public void openWebpage(String urlString) { + try { + Desktop.getDesktop().browse(new URL(urlString).toURI()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @FXML + private void paypal(){ + openWebpage("https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=XKQ7R4AWWVFR4"); + } + +} diff --git a/src/poe/level/fx/AddBuild_Controller.java b/src/poe/level/fx/AddBuild_Controller.java new file mode 100644 index 0000000..f2870c6 --- /dev/null +++ b/src/poe/level/fx/AddBuild_Controller.java @@ -0,0 +1,164 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.fx; + +import com.jfoenix.controls.JFXButton; +import com.jfoenix.controls.JFXComboBox; +import com.jfoenix.controls.JFXDialog; +import com.jfoenix.controls.JFXTextField; +import java.net.URL; +import java.util.ResourceBundle; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; + +/** + * FXML Controller class + * + * @author Christos + */ +public class AddBuild_Controller implements Initializable { + + @FXML + JFXTextField buildName; + @FXML + JFXComboBox select; + @FXML + JFXComboBox selectAsc; + @FXML + JFXButton addButton; + + + JFXDialog parentDialog; + int selectedClassIndex; + String build; + String className; + String ascendancy; + + private BuildsPanel_Controller root; + private MainApp_Controller closer; + /** + * Initializes the controller class. + */ + + public void hook(BuildsPanel_Controller root, MainApp_Controller closer){ + this.closer = closer; + this.root = root; + } + + @Override + public void initialize(URL url, ResourceBundle rb) { + // TODO + /* + Marauder + Ranger + Witch + Duelist + Templar + Shadow + Scion + */ + addButton.setDisable(true); + select.getItems().add("Marauder"); + select.getItems().add("Ranger"); + select.getItems().add("Witch"); + select.getItems().add("Duelist"); + select.getItems().add("Templar"); + select.getItems().add("Shadow"); + select.getItems().add("Scion"); + + buildName.textProperty().addListener((observable, oldValue, newValue) -> { + addButton.setDisable(true); + if(!buildName.getText().equals("")){ + if(select.getSelectionModel().getSelectedIndex()!= -1){ + if(selectAsc.getSelectionModel().getSelectedIndex()!= -1){ + addButton.setDisable(false); + } + } + } + }); + } + + @FXML + private void handleButtonAction(ActionEvent event) { + //when user presses add. Callback to MainApp_Controller. + root.addNewBuild(buildName.getText(),className,ascendancy); + closer.closePopup(); + } + + @FXML + private void classChanged(ActionEvent event) { + selectedClassIndex = select.getSelectionModel().getSelectedIndex(); + if(selectedClassIndex == 0){ + className = "Marauder"; + selectAsc.getItems().clear(); + selectAsc.getItems().add("Juggernaut"); + selectAsc.getItems().add("Berseker"); + selectAsc.getItems().add("Chieftain"); + }else if(selectedClassIndex == 1){ + className = "Ranger"; + selectAsc.getItems().clear(); + selectAsc.getItems().add("Deadeye"); + selectAsc.getItems().add("Raider"); + selectAsc.getItems().add("Pathfinder"); + }else if(selectedClassIndex == 2){ + className = "Witch"; + selectAsc.getItems().clear(); + selectAsc.getItems().add("Necromancer"); + selectAsc.getItems().add("Occultist"); + selectAsc.getItems().add("Elementalist"); + }else if(selectedClassIndex == 3){ + className = "Duelist"; + selectAsc.getItems().clear(); + selectAsc.getItems().add("Slayer"); + selectAsc.getItems().add("Gladiator"); + selectAsc.getItems().add("Champion"); + }else if(selectedClassIndex == 4){ + className = "Templar"; + selectAsc.getItems().clear(); + selectAsc.getItems().add("Inquisitor"); + selectAsc.getItems().add("Hierophant"); + selectAsc.getItems().add("Guardian"); + }else if(selectedClassIndex == 5){ + className = "Shadow"; + selectAsc.getItems().clear(); + selectAsc.getItems().add("Assasin"); + selectAsc.getItems().add("Saboteur"); + selectAsc.getItems().add("Trickster"); + }else if(selectedClassIndex == 6){ + className = "Scion"; + selectAsc.getItems().clear(); + selectAsc.getItems().add("Ascendant"); + } + addButton.setDisable(true); + if(!buildName.getText().equals("")){ + if(select.getSelectionModel().getSelectedIndex()!= -1){ + if(selectAsc.getSelectionModel().getSelectedIndex()!= -1){ + addButton.setDisable(false); + } + } + } + + } + + @FXML + private void ascChanged(ActionEvent event) { + ascendancy = (String) selectAsc.getSelectionModel().getSelectedItem(); + System.out.println(ascendancy); + if(!buildName.getText().equals("")){ + addButton.setDisable(false); + }else{ + addButton.setDisable(true); + } + } + + + public void passDialog(JFXDialog parent){ + this.parentDialog = parent; + } + +} diff --git a/src/poe/level/fx/AddGem_Controller.java b/src/poe/level/fx/AddGem_Controller.java new file mode 100644 index 0000000..8c9663b --- /dev/null +++ b/src/poe/level/fx/AddGem_Controller.java @@ -0,0 +1,283 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.fx; + +import com.jfoenix.controls.JFXTabPane; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.ResourceBundle; +import java.util.logging.Level; +import java.util.logging.Logger; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.scene.Parent; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.SplitPane; +import javafx.scene.control.Tab; +import javafx.scene.control.TextField; +import javafx.scene.input.KeyEvent; +import javafx.scene.layout.VBox; +import poe.level.data.Gem; +import poe.level.data.GemHolder; +import poe.level.data.Zone; + +/** + * FXML Controller class + * + * @author Christos + */ +public class AddGem_Controller implements Initializable { + + + class TabLinker{ + QuestSplitPanel_Controller controller; + Zone zone; + int act; + ArrayList gemsOther; + + public TabLinker(QuestSplitPanel_Controller c , Zone z, int act ){ + controller = c; + zone = z; + this.act = act; + } + + public TabLinker(QuestSplitPanel_Controller c , int act , ArrayList gems){ + controller = c; + this.act = act; + gemsOther = gems; // careful + } + + } + + @FXML + private VBox actIbox; + @FXML + private VBox actIIbox; + @FXML + private VBox actIIIbox; + @FXML + private VBox actIVbox; + @FXML + private VBox otherVBox; + @FXML + private JFXTabPane tabpane; + @FXML + private TextField searchArea; + /** + * Initializes the controller class. + */ + private GemsPanel_Controller parent; + private ArrayList tablinkers; + private ArrayList tablinkersOther; + private TabLinker last = null; + + @FXML + public void onEnter(ActionEvent ae){ + System.out.println("test") ; + String text = searchArea.getText(); + searchArea.clear(); + + ArrayList>> all = GemHolder.getInstance().getAll(); + int actFound = 0; + Zone zoneFound = null; + + outerloop: + for(int act = 0; act < all.size(); act++){ + HashMap> actMap = all.get(act); + //loop in acts + //loop in zones + for(Zone zone : actMap.keySet()){ + ArrayList gems = actMap.get(zone); + for(Gem gem : gems){ + if(gem.getGemName().toLowerCase().contains(text.toLowerCase()) + || text.toLowerCase().contains(gem.getGemName().toLowerCase())){ + actFound = act; + zoneFound = zone; + break outerloop; + } + } + } + + } + + if(zoneFound == null){ + for(TabLinker tl : tablinkersOther){ + for(Gem g: tl.gemsOther){ + if(g.getGemName().toLowerCase().contains(text.toLowerCase()) + || text.toLowerCase().contains(g.getGemName().toLowerCase())){ + actFound = -1; + zoneFound = null; + tabpane.getSelectionModel().select(4); // selectes last tab + tl.controller.requestBorder(); + if(last != null){ + last.controller.resetBorder(); + } + last = tl; + } + } + } + } + + if(zoneFound!=null){ //so if gem is found + tabpane.getSelectionModel().select(actFound); + for(TabLinker tl : tablinkers){ + if(tl.act == actFound && tl.zone.equals(zoneFound)){ + tl.controller.requestBorder(); + if(last != null){ + last.controller.resetBorder(); + } + last = tl; + } + } + } + } + + public void start(GemsPanel_Controller parent){ + this.parent = parent; + } + + public void callback(Gem g){ + parent.closePopup(g); + } + + @Override + public void initialize(URL url, ResourceBundle rb) { + ArrayList>> all = GemHolder.getInstance().getAll(); + ArrayList reorder = new ArrayList<>(); + + ArrayList reorder2 = new ArrayList<>(); + + ArrayList reorder3 = new ArrayList<>(); + + ArrayList reorder4 = new ArrayList<>(); + + ArrayList reorderOther = new ArrayList<>(); + HashSet distinctLevels = new HashSet<>(); + + for(Zone z : all.get(0).keySet()){ + reorder.add(z); + } + for(Zone z : all.get(1).keySet()){ + reorder2.add(z); + } + for(Zone z : all.get(2).keySet()){ + reorder3.add(z); + } + for(Zone z : all.get(3).keySet()){ + reorder4.add(z); + } + + + HashMap> map = new HashMap<>(); + ArrayList gemOther = GemHolder.getInstance().getGemOther(); + + for(Gem g : gemOther){ + reorderOther.add(g); + if(map.containsKey(g.getLevelAdded())){ + map.get(g.getLevelAdded()).add(g); + }else{ + ArrayList dd = new ArrayList<>(); + dd.add(g); + map.put(g.getLevelAdded(), dd); + } + + distinctLevels.add(g.getLevelAdded()); + + } + + ArrayList distinctLevels_order = new ArrayList<>(); + + distinctLevels_order.addAll(distinctLevels); + Collections.sort(distinctLevels_order); + + reorder.sort(Comparator.comparing(Zone::getZoneLevel)); + reorder2.sort(Comparator.comparing(Zone::getZoneLevel)); + reorder3.sort(Comparator.comparing(Zone::getZoneLevel)); + reorder4.sort(Comparator.comparing(Zone::getZoneLevel)); + reorderOther.sort(Comparator.comparing(Gem::getLevelAdded)); + + tablinkers = new ArrayList<>(); + + for(Zone z : reorder){ + FXMLLoader loader = new FXMLLoader(getClass().getResource("questSplitPanel.fxml")); + SplitPane con = null; + try { + con = (SplitPane) loader.load(); + } catch (IOException ex) { + Logger.getLogger(QuestSplitPanel_Controller.class.getName()).log(Level.SEVERE, null, ex); + } + QuestSplitPanel_Controller controller = loader.getController(); + actIbox.getChildren().add(con); + controller.load(z,all.get(0).get(z), this); + tablinkers.add(new TabLinker(controller,z,0)); + + } + for(Zone z : reorder2){ + FXMLLoader loader = new FXMLLoader(getClass().getResource("questSplitPanel.fxml")); + SplitPane con = null; + try { + con = (SplitPane) loader.load(); + } catch (IOException ex) { + Logger.getLogger(QuestSplitPanel_Controller.class.getName()).log(Level.SEVERE, null, ex); + } + QuestSplitPanel_Controller controller = loader.getController(); + actIIbox.getChildren().add(con); + controller.load(z,all.get(1).get(z), this); + tablinkers.add(new TabLinker(controller,z,1)); + } + for(Zone z : reorder3){ + FXMLLoader loader = new FXMLLoader(getClass().getResource("questSplitPanel.fxml")); + SplitPane con = null; + try { + con = (SplitPane) loader.load(); + } catch (IOException ex) { + Logger.getLogger(QuestSplitPanel_Controller.class.getName()).log(Level.SEVERE, null, ex); + } + QuestSplitPanel_Controller controller = loader.getController(); + actIIIbox.getChildren().add(con); + controller.load(z,all.get(2).get(z), this); + tablinkers.add(new TabLinker(controller,z,2)); + } + for(Zone z : reorder4){ + FXMLLoader loader = new FXMLLoader(getClass().getResource("questSplitPanel.fxml")); + SplitPane con = null; + try { + con = (SplitPane) loader.load(); + } catch (IOException ex) { + Logger.getLogger(QuestSplitPanel_Controller.class.getName()).log(Level.SEVERE, null, ex); + } + QuestSplitPanel_Controller controller = loader.getController(); + actIVbox.getChildren().add(con); + controller.load(z,all.get(3).get(z), this); + tablinkers.add(new TabLinker(controller,z,3)); + } + tablinkersOther = new ArrayList<>(); + for(Integer a : distinctLevels_order){ + FXMLLoader loader = new FXMLLoader(getClass().getResource("questSplitPanel.fxml")); + SplitPane con = null; + try { + con = (SplitPane) loader.load(); + } catch (IOException ex) { + Logger.getLogger(QuestSplitPanel_Controller.class.getName()).log(Level.SEVERE, null, ex); + } + QuestSplitPanel_Controller controller = loader.getController(); + otherVBox.getChildren().add(con); + controller.loadOther(map.get(a), a , this); + tablinkersOther.add(new TabLinker(controller,4, map.get(a))); + } + + + // TODO + } + +} diff --git a/src/poe/level/fx/AutoCompleteComboBoxListener.java b/src/poe/level/fx/AutoCompleteComboBoxListener.java new file mode 100644 index 0000000..15eecea --- /dev/null +++ b/src/poe/level/fx/AutoCompleteComboBoxListener.java @@ -0,0 +1,110 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.fx; + +import com.jfoenix.controls.JFXComboBox; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.event.EventHandler; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; +import javafx.util.StringConverter; +import poe.level.data.Gem; +import poe.level.data.GemHolder; + +/** + * + * @author Christos + */ +public class AutoCompleteComboBoxListener implements EventHandler { + private JFXComboBox comboBox; + private ObservableList data; + private boolean moveCaretToPos = false; + private int caretPos; + private StringConverter sc; + + AutoCompleteComboBoxListener(final JFXComboBox comboBox) { + this.comboBox = comboBox; + data = comboBox.getItems(); + + //this.comboBox.setEditable(true); + this.comboBox.setOnKeyPressed(t -> comboBox.hide()); + this.comboBox.setOnKeyReleased(AutoCompleteComboBoxListener.this); + this.sc = this.comboBox.getConverter(); + } + + @Override + public void handle(KeyEvent event) { + + if(event.getCode() == KeyCode.UP) { + caretPos = -1; + moveCaret(comboBox.getEditor().getText().length()); + return; + } else if(event.getCode() == KeyCode.DOWN) { + if(!comboBox.isShowing()) { + comboBox.show(); + } + caretPos = -1; + moveCaret(comboBox.getEditor().getText().length()); + return; + } else if(event.getCode() == KeyCode.BACK_SPACE) { + moveCaretToPos = true; + caretPos = comboBox.getEditor().getCaretPosition(); + } else if(event.getCode() == KeyCode.DELETE) { + moveCaretToPos = true; + caretPos = comboBox.getEditor().getCaretPosition(); + } + + if(event.getCharacter().matches("[a-z]")) + comboBox.setValue( + (T) String.valueOf(comboBox.getValue()).toUpperCase() + ); + + if (event.getCode() == KeyCode.RIGHT || event.getCode() == KeyCode.LEFT + || event.isControlDown() || event.getCode() == KeyCode.HOME + || event.getCode() == KeyCode.END || event.getCode() == KeyCode.TAB) { + return; + } + + //if(comboBox.getItems().isEmpty()) comboBox.getItems().addAll(data); + + ObservableList list = FXCollections.observableArrayList(); + for (T aData : data) { + if(sc.toString(aData).toLowerCase().contains + (AutoCompleteComboBoxListener.this.comboBox + .getEditor().getText().toLowerCase()) + ){ + list.add(aData); + } + /* + if (String.valueOf(aData).toLowerCase().startsWith( + AutoCompleteComboBoxListener.this.comboBox + .getEditor().getText().toLowerCase())) { + list.add(aData); + }*/ + } + String t = comboBox.getEditor().getText(); + comboBox.getItems().clear(); + comboBox.getItems().addAll(list); + comboBox.getEditor().setText(t); + if(!moveCaretToPos) { + caretPos = -1; + } + moveCaret(t.length()); + if(!list.isEmpty()) { + comboBox.show(); + } + } + + private void moveCaret(int textLength) { + if(caretPos == -1) { + comboBox.getEditor().positionCaret(textLength); + } else { + comboBox.getEditor().positionCaret(caretPos); + } + moveCaretToPos = false; + } +} diff --git a/src/poe/level/fx/BuildEntry_Controller.java b/src/poe/level/fx/BuildEntry_Controller.java new file mode 100644 index 0000000..8b457f5 --- /dev/null +++ b/src/poe/level/fx/BuildEntry_Controller.java @@ -0,0 +1,92 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.fx; + +import java.net.URL; +import java.util.ResourceBundle; +import javafx.application.Platform; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.Label; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.Background; +import poe.level.fx.BuildsPanel_Controller.BuildLinker; + +/** + * FXML Controller class + * + * @author Christos + */ + + +public class BuildEntry_Controller implements Initializable { + + @FXML + ImageView banner; + @FXML + Label buildName; + @FXML + Label ascendAndLevel; + @FXML + AnchorPane root; + + BuildLinker parent; + SelectBuild_PopupController parent2; + int id_for_popup; + + /** + * Initializes the controller class. + */ + @Override + public void initialize(URL url, ResourceBundle rb) { + // TODO + } + + public void init(Image iv, String buildName,String ascendAndLevel, BuildLinker parent){ + banner.setImage(iv); + + this.buildName.setText(buildName); + this.ascendAndLevel.setText(ascendAndLevel+" lvl.95"); + this.parent = parent; + } + + public void init_for_popup(Image iv, String buildName,String ascendAndLevel,int id, SelectBuild_PopupController parent){ + banner.setImage(iv); + + this.buildName.setText(buildName); + this.ascendAndLevel.setText(ascendAndLevel+" lvl.95"); + this.parent2 = parent; + this.id_for_popup = id; + } + + public AnchorPane getRoot(){ + return root; + } + + public void reset(){ + //root.setStyle("-fx-background-color: transparent;" + //+"-fx-border-style: solid;"); + + root.setStyle("color: transparent;"); + } + + + @FXML + private void onPress(ActionEvent event) { + //root.setStyle("-fx-background-color: PeachPuff;" + //+"-fx-border-style: solid;"); + if(parent!=null){ + root.setStyle("color: rgba(58, 44, 189, 0.4);"); + parent.update(); + } + if(parent2!=null) + parent2.update(id_for_popup); + } + +} diff --git a/src/poe/level/fx/BuildProgressPreview.fxml b/src/poe/level/fx/BuildProgressPreview.fxml new file mode 100644 index 0000000..32cd72f --- /dev/null +++ b/src/poe/level/fx/BuildProgressPreview.fxml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/poe/level/fx/BuildProgressPreview_Controller.java b/src/poe/level/fx/BuildProgressPreview_Controller.java new file mode 100644 index 0000000..d2206b3 --- /dev/null +++ b/src/poe/level/fx/BuildProgressPreview_Controller.java @@ -0,0 +1,379 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.fx; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.ResourceBundle; +import javafx.embed.swing.SwingFXUtils; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.Label; +import javafx.scene.control.Tooltip; +import javafx.scene.image.ImageView; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.Pane; +import javafx.scene.shape.Line; +import javax.imageio.ImageIO; +import poe.level.data.Build; +import poe.level.data.Gem; +import poe.level.data.SocketGroup; +import poe.level.data.Zone; + +/** + * FXML Controller class + * + * @author Christos + */ +public class BuildProgressPreview_Controller implements Initializable { + + @FXML + private Line baseline; + @FXML + private Line tail_line; + @FXML + private AnchorPane level_axis_pane; + @FXML + private AnchorPane timeline_pane; + + public void start(Build build){ + + //reverse the replacements:: + for(SocketGroup sg : build.getSocketGroup()){ + if(sg.replaceGroup()){ + for(SocketGroup sg2 : build.getSocketGroup()){ + if(sg.getGroupReplaced().equals(sg2)){ + sg2.setReplacesGroup(true); + sg2.setGroupThatReplaces(sg); + break; + } + } + } + for(Gem g : sg.getGems()){ + if(g.replaced){ + for(Gem g2 : sg.getGems()){ + if(g.replacedWith.equals(g2)){ + g2.replaces = true; + g2.replacesGem = g; + break; + } + } + } + } + } + + HashSet totalLevels = new HashSet<>(); + HashMap> gemsOnLevelsMap = new HashMap<>(); + HashMap highestYValuePerSocketGroup = new HashMap<>(); + HashMap gemToSocket_map = new HashMap<>(); + HashMap draw_previous_y = new HashMap<>(); + //calcute the baseline + ArrayList sorted_sg = new ArrayList<>(); + for(SocketGroup sg : build.getSocketGroup()){ + sorted_sg.add(sg); + } + sorted_sg.sort(new Comparator() { + @Override + public int compare(SocketGroup o1, SocketGroup o2) { + return o1.getActiveGem().getLevelAdded() - o2.getActiveGem().getLevelAdded(); + } + + }); + + //here we add each gem to according level it gets added. + for(SocketGroup sg : sorted_sg){ + highestYValuePerSocketGroup.put(sg, 0); //here we iniate all sg's values to 0 + for(Gem g : sg.getGems()){ + totalLevels.add(g.level_added); + if(gemsOnLevelsMap.containsKey(g.level_added)){ + gemsOnLevelsMap.get(g.level_added).add(g); + }else{ + ArrayList gemsOnThisLevel_local = new ArrayList<>(); + gemsOnThisLevel_local.add(g); + gemsOnLevelsMap.put(g.level_added, gemsOnThisLevel_local); + } + gemToSocket_map.put(g, sg); + } + } + + + //int totalLevelPoints = totalLevels.size(); + //int baselineSize = totalLevelPoints*100; + + //now we need to implement the visual offset for each level. + ArrayList level_list = new ArrayList<>(); + level_list.addAll(totalLevels); + Collections.sort(level_list); + + //calculate highestYValuePerSocketGroup values + + for(Integer level : level_list){ + ArrayList get = gemsOnLevelsMap.get(level); + HashMap helper_map = new HashMap<>(); + for(Gem g : get){ + if(helper_map.containsKey(gemToSocket_map.get(g))){ + int get1 = (int) helper_map.get(gemToSocket_map.get(g)); + get1++; + helper_map.put(gemToSocket_map.get(g),get1); + }else{ + helper_map.put(gemToSocket_map.get(g), 1);//iniate it + } + } + //update highestYValuePerSocketGroup if a new bigger value has been added in this level iteration + for(SocketGroup sg : sorted_sg){ + if(helper_map.containsKey(sg)){ + if(highestYValuePerSocketGroup.get(sg) levelToX_Location = new HashMap<>(); + int first_level_offset; + first_level_offset = level_list.get(0) - 1; //*remember to check null lists and shits + first_level_offset--; + int offsetAdder; + if(first_level_offset>0){ + first_level_offset = first_level_offset * 20; + levelToX_Location.put(level_list.get(0), first_level_offset); + offsetAdder = first_level_offset + 134; + }else{ + levelToX_Location.put(level_list.get(0), 0); + offsetAdder = 134; + } + for(int i=0; i0) + offset = offset * 20; + else + offset = 0; + //example offest = 1 * 20 = 20; + offsetAdder = offsetAdder + offset + 134; + levelToX_Location.put(level_list.get(i+1),offsetAdder); + + } + + //so now we should have all X locations of every line. + int baselineSize = levelToX_Location.get(level_list.get(level_list.size()-1)); + baseline.setEndX(baselineSize); + tail_line.setStartX(baselineSize+1); + tail_line.setEndX(baselineSize+31); + + //generate the levels on the header pane;; + for(Integer level : level_list){ + Label l = new Label(); + level_axis_pane.getChildren().add(l); + l.setText(level.toString()); + l.setLayoutX(55+levelToX_Location.get(level)); + l.setLayoutY(5); + + //i will assume this list is ordered actually. and this is very important! + ArrayList gemsOnThisLevel_local = gemsOnLevelsMap.get(level); + int y_value_for_line = 0; + int y_value_total = 0; + int counter_for_firstSocketGroup = 0; + int total_y = 0; + HashMap miniCounters = new HashMap<>(); + for(Gem g : gemsOnThisLevel_local){ + + + //now i have to find where to put this image view on Y . + // + if(!miniCounters.containsKey(gemToSocket_map.get(g))){ + miniCounters.put(gemToSocket_map.get(g), 0); + } + //int y_value_t = draw_previous_y.get(gemToSocket_map.get(g)); // this is the max of a line + //int y_value = (int) highestYValuePerSocketGroup.get(gemToSocket_map.get(g)); //this is the max of a socket groups line + //int final_y = y_value_t-y_value; + int final_y = draw_previous_y.get(gemToSocket_map.get(g)); + final_y = 10 * final_y + 47*final_y; + int current_mini_counter = miniCounters.get(gemToSocket_map.get(g)); + current_mini_counter++; + miniCounters.put(gemToSocket_map.get(g), + current_mini_counter); + + //draw the horizontal link line + Line line_hor = new Line(); + timeline_pane.getChildren().add(line_hor); + line_hor.setLayoutX(60); + line_hor.setLayoutY(0); + line_hor.setStartY(final_y + 10*current_mini_counter + 47*(current_mini_counter-1) + 47/2); + //line.setEndY(10 * y_value_total + 47 * y_value_total); + line_hor.setEndY(final_y + 10*current_mini_counter + 47*(current_mini_counter-1) + 47/2); + line_hor.setStartX(levelToX_Location.get(level)); + line_hor.setEndX(levelToX_Location.get(level)+15); + + ImageView iv = new ImageView(); + timeline_pane.getChildren().add(iv); + iv.setFitHeight(47); + iv.setFitWidth(47); + iv.setPreserveRatio(false); + iv.setImage(g.gemIcon); + iv.setLayoutY(final_y + 10*current_mini_counter + 47*(current_mini_counter-1)); + iv.setLayoutX(60+levelToX_Location.get(level)); + Tooltip.install(iv, new Tooltip(g.getGemName())); + + //THE REPLACE IS HERE for socket group + if(gemToSocket_map.get(g).getActiveGem().equals(g) && gemToSocket_map.get(g).replacesGroup()){ + //IF THIS GEM IS AN ACTIVE GEM AND ITS SOCKET GROUP REPLACES ANOTHER ONE + Gem replace = gemToSocket_map.get(g).getGroupThatReplaces().getActiveGem(); + ImageView iv_replace = new ImageView(); + timeline_pane.getChildren().add(iv_replace); + iv_replace.setFitHeight(40); + iv_replace.setFitWidth(40); + iv_replace.setPreserveRatio(false); + BufferedImage img = null; + try { + img = ImageIO.read(getClass().getResource("/icons/replace_group.png")); + } catch (IOException e) { + e.printStackTrace(); + } + iv_replace.setImage(SwingFXUtils.toFXImage(img, null)); + iv_replace.setLayoutY(final_y + 10*current_mini_counter + 47*(current_mini_counter-1)); + iv_replace.setLayoutX(60+levelToX_Location.get(level)+47); + Tooltip.install(iv_replace, new Tooltip(g.getGemName()+" replaces "+replace.getGemName()+"'s socket group.")); + + ImageView iv_re_gem = new ImageView(); + timeline_pane.getChildren().add(iv_re_gem); + iv_re_gem.setFitHeight(47); + iv_re_gem.setFitWidth(47); + iv_re_gem.setPreserveRatio(false); + iv_re_gem.setImage(replace.gemIcon); + iv_re_gem.setLayoutY(final_y + 10*current_mini_counter + 47*(current_mini_counter-1)); + iv_re_gem.setLayoutX(60+levelToX_Location.get(level)+47+40); + Tooltip.install(iv_re_gem, new Tooltip(replace.getGemName())); + } + if(g.replaces){ + //IF THIS GEM replaces another gem + Gem replace = g.replacesGem; + ImageView iv_replace = new ImageView(); + timeline_pane.getChildren().add(iv_replace); + iv_replace.setFitHeight(40); + iv_replace.setFitWidth(40); + iv_replace.setPreserveRatio(false); + BufferedImage img = null; + try { + img = ImageIO.read(getClass().getResource("/icons/replace_normal.png")); + } catch (IOException e) { + e.printStackTrace(); + } + iv_replace.setImage(SwingFXUtils.toFXImage(img, null)); + iv_replace.setLayoutY(final_y + 10*current_mini_counter + 47*(current_mini_counter-1)); + iv_replace.setLayoutX(60+levelToX_Location.get(level)+47); + Tooltip.install(iv_replace, new Tooltip(g.getGemName()+" replaces "+replace.getGemName()+".")); + + ImageView iv_re_gem = new ImageView(); + timeline_pane.getChildren().add(iv_re_gem); + iv_re_gem.setFitHeight(47); + iv_re_gem.setFitWidth(47); + iv_re_gem.setPreserveRatio(false); + iv_re_gem.setImage(replace.gemIcon); + iv_re_gem.setLayoutY(final_y + 10*current_mini_counter + 47*(current_mini_counter-1)); + iv_re_gem.setLayoutX(60+levelToX_Location.get(level)+47+40); + Tooltip.install(iv_re_gem, new Tooltip(replace.getGemName())); + } + + + //if the gem belongs to the 1st socket group + /* + if(sorted_sg.indexOf(gemToSocket_map.get(g)) == 0){ + counter_for_firstSocketGroup++; + //we can actually use this variable to determine where gems will be placed in the 1st socket group + iv.setLayoutY(10*counter_for_firstSocketGroup + 47*(counter_for_firstSocketGroup-1)); + }*/ + total_y = final_y + 10*current_mini_counter + 47*current_mini_counter;// + 10; //+10 is end offset on the y axis. + /* + int y_value = (int) highestYValuePerSocketGroup.get(gemToSocket_map.get(g)); + if(y_value>y_value_for_line){ + y_value_for_line = y_value; + } + int y_value_t = draw_previous_y.get(gemToSocket_map.get(g)); // this will return the total y value of a socket group + if(y_value_t >y_value_total ){ + y_value_total = y_value_t; //the so far biggest y. + } + if(sorted_sg.indexOf(gemToSocket_map.get(g)) != 0){ + + }*/ + } + /* + if(y_value_total <= draw_previous_y.get(sorted_sg.get(0))){ + y_value_total = counter_for_firstSocketGroup; + }*/ + //y_value_total has the biggest y for this line so we can draw it + //f,e if y = 8 we need to set some offset values + //formula is 10 * y_value_total + 47 * y_value_total + //** this offset should only apply on sg other than the 1st one.. << im here stuck <<<<<< + + + + //and the lines? + Line line = new Line(); + timeline_pane.getChildren().add(line); + line.setLayoutX(60); + line.setLayoutY(0); + line.setStartY(0); + //line.setEndY(10 * y_value_total + 47 * y_value_total); + line.setEndY(total_y); + line.setStartX(levelToX_Location.get(level)); + line.setEndX(levelToX_Location.get(level)); + } + boolean alternateCounter = true; + for(SocketGroup sg : sorted_sg){ + Pane p = new Pane(); + timeline_pane.getChildren().add(p); + AnchorPane.setLeftAnchor(p, Double.valueOf(0)); + AnchorPane.setRightAnchor(p, Double.valueOf(0)); + //int layouty = draw_previous_y.get(sg) - highestYValuePerSocketGroup.get(sg); + int layouty = draw_previous_y.get(sg); + p.setLayoutX(0); + p.setLayoutY(10*layouty + 47*layouty); + if(sorted_sg.indexOf(sg) == sorted_sg.size()-1){ + p.setPrefHeight(10*highestYValuePerSocketGroup.get(sg) + 47*highestYValuePerSocketGroup.get(sg) + 10); + }else{ + p.setPrefHeight(10*highestYValuePerSocketGroup.get(sg) + 47*highestYValuePerSocketGroup.get(sg)); + } + p.setOpacity(0.1); + //p.getStyleClass().add("backgroundPane"); + if(alternateCounter){ + p.setStyle("-fx-background-color: black;"); + alternateCounter = false; + }else{ + p.setStyle("-fx-background-color: yellow;"); + alternateCounter = true; + } + } + } + + /** + * Initializes the controller class. + */ + @Override + public void initialize(URL url, ResourceBundle rb) { + // TODO + + + } + +} diff --git a/src/poe/level/fx/BuildsPanel.fxml b/src/poe/level/fx/BuildsPanel.fxml new file mode 100644 index 0000000..86b8e14 --- /dev/null +++ b/src/poe/level/fx/BuildsPanel.fxml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/poe/level/fx/BuildsPanel_Controller.java b/src/poe/level/fx/BuildsPanel_Controller.java new file mode 100644 index 0000000..7f318e3 --- /dev/null +++ b/src/poe/level/fx/BuildsPanel_Controller.java @@ -0,0 +1,402 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.fx; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; +import com.jfoenix.controls.JFXButton; +import com.jfoenix.controls.JFXDialog; +import com.sun.deploy.util.StringUtils; +import java.awt.image.BufferedImage; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Base64; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.ResourceBundle; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Level; +import java.util.logging.Logger; +import javafx.embed.swing.SwingFXUtils; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.scene.image.Image; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.VBox; +import javax.imageio.ImageIO; +import jdk.nashorn.internal.parser.JSONParser; +import org.json.JSONArray; +import org.json.JSONObject; +import poe.level.data.Build; +import poe.level.data.Gem; +import poe.level.data.GemHolder; +import poe.level.data.SocketGroup; +import poe.level.fx.AddBuild_Controller; +import poe.level.fx.BuildEntry_Controller; +import poe.level.fx.MainApp_Controller; +import poe.level.fx.SocketGroupsPanel_Controller.SocketGroupLinker; + + +/** + * FXML Controller class + * + * @author Christos + */ +public class BuildsPanel_Controller implements Initializable { + + public class BuildLinker{ + public BuildEntry_Controller pec; + public Build build; + public int id; + public BuildsPanel_Controller root; + public ArrayList sgl_list = new ArrayList<>(); + + public int hook(BuildsPanel_Controller root){ + this.root = root; + id = BuildsPanel_Controller.sign(); + return id; + } + + public void delete(){ + root.deleteBuild(); + } + + public void update(){ + root.update(id); + } + } + + private static HashSet randomIDs; + public static int sign(){ + if(randomIDs == null) randomIDs = new HashSet<>(); + int ran; + do{ + ran = ThreadLocalRandom.current().nextInt(1,999999); + }while(randomIDs.contains(ran)); + randomIDs.add(ran); + return ran; + } + + private static Image charToImage(String className, String asc){ + BufferedImage img = null; + try { + img = ImageIO.read(BuildsPanel_Controller.class.getResource("/classes/"+className+"/"+asc+".png")); + } catch (IOException ex) { + Logger.getLogger(BuildsPanel_Controller.class.getName()).log(Level.SEVERE, null, ex); + } + + return SwingFXUtils.toFXImage(img, null); + } + + @FXML + private JFXButton addBuild_button; + @FXML + private JFXButton removeBuild_button; + @FXML + private VBox buildsBox; + + private MainApp_Controller root; + private SocketGroupsPanel_Controller sgc; + private HashMap linker; + private int activeBuildID; + + public void hook(MainApp_Controller root){ + this.root = root; + } + + public void hookSG_Controller(SocketGroupsPanel_Controller sgc){ + this.sgc = sgc; + } + + public void loadBuilds(ArrayList buildsLoaded){ + for(Build b : buildsLoaded){ + loadNewBuild(b); + } + } + + public void addNewSocketGroup(SocketGroup sg){ + linker.get(activeBuildID).build.getSocketGroup().add(sg); + } + + public void removeSocketGroup(SocketGroup sg){ + linker.get(activeBuildID).build.getSocketGroup().remove(sg); + } + + @FXML + private void addNewBuild(){ + root.buildPopup(); + } + + public boolean validate(){ + Build active_build = linker.get(activeBuildID).build; + if(active_build.validate()){ + System.out.println("Success."); + return true; + }else{ + System.out.println("Build invalidate."); + return false; + } + } + + public boolean validateAll(){ + for(BuildLinker bl : linker.values()){ + Build active_build = bl.build; + if(!active_build.validate()){ + System.out.println("Build invalidate."); + return false; + } + } + return true; + } + + public Build getCurrentBuild(){ + return linker.get(activeBuildID).build; + } + + + public int sign_jsons(HashSet unique_ids){ + if(unique_ids == null) unique_ids = new HashSet<>(); + int ran; + do{ + ran = ThreadLocalRandom.current().nextInt(1,999999); + }while(unique_ids.contains(ran)); + unique_ids.add(ran); + return ran; + } + + public void saveBuild() throws IOException{ + + + + JSONArray builds_array = new JSONArray(); + HashSet unique_ids = new HashSet<>(); + for( BuildLinker bl : linker.values()){ + Build build = bl.build; + JSONObject bObj = new JSONObject(); + bObj.put("buildName",build.getName()); + bObj.put("className",build.getClassName()); + bObj.put("ascendancyName",build.getAsc()); + bObj.put("level", 0); //getController(); //add controller to the linker class + bl.pec.init(charToImage(className,ascendancyName), buildName, ascendancyName, bl); + bl.build = new Build(buildName,className,ascendancyName); + for(SocketGroup sg : bl.build.getSocketGroup()){ + SocketGroupLinker sgl = sgc.new SocketGroupLinker(sg); + //sgl.sg = sg; + //sgl.generateLabel(); + bl.sgl_list.add(sgl); + } + POELevelFx.buildsLoaded.add(bl.build); + } + + public void loadNewBuild(Build build){ + BuildLinker bl = new BuildLinker(); + int linker_id = bl.hook(this); + linker.put(linker_id,bl); + + removeBuild_button.setDisable(false); + + FXMLLoader loader = new FXMLLoader(getClass().getResource("buildEntry.fxml")); + try { + //this will add the AnchorPane to the VBox + buildsBox.getChildren().add(loader.load()); + } catch (IOException ex) { + Logger.getLogger(MainApp_Controller.class.getName()).log(Level.SEVERE, null, ex); + } + + bl.pec = loader.getController(); //add controller to the linker class + bl.pec.init(charToImage(build.getClassName(),build.getAsc()) + , build.getName(), build.getAsc(), bl); + bl.build = build; + for(SocketGroup sg : bl.build.getSocketGroup()){ + SocketGroupLinker sgl = sgc.new SocketGroupLinker(sg); + //sgl.sg = sg; + //sgl.generateLabel(); + bl.sgl_list.add(sgl); + } + + } + + @FXML + private void deleteBuild(){ + BuildLinker bl = linker.get(activeBuildID); + POELevelFx.buildsLoaded.remove(bl.build); + sgc.reset(); + buildsBox.getChildren().remove(bl.pec.getRoot()); // remove from the UI + linker.remove(bl.id); //remove from data + // and also remove from file system? + + } + + public void update(int id){ + if(id!=activeBuildID){ + activeBuildID = id; + for (BuildLinker bl : linker.values()) { + if(bl.id!=id){ + bl.pec.reset(); + }else{ + //update the sgroup controller with new build info + GemHolder.getInstance().className = getCurrentClass(id); + sgc.hookBuild_Controller(this); + sgc.update(bl.sgl_list); + } + } + //root.buildChanged(id); + + } + } + + public ArrayList getSocketGroups(int id){ + BuildLinker bl = linker.get(id); + return bl.build.getSocketGroup(); + } + + public String getCurrentClass(int id){ + BuildLinker bl = linker.get(id); + return bl.build.getClassName(); + } + /** + * Initializes the controller class. + */ + @Override + public void initialize(URL url, ResourceBundle rb) { + // TODO + + linker = new HashMap<>(); + //loadBuildsFromMemory(); + } + + +} diff --git a/src/poe/level/fx/Editor_Stage.java b/src/poe/level/fx/Editor_Stage.java new file mode 100644 index 0000000..ef02fe9 --- /dev/null +++ b/src/poe/level/fx/Editor_Stage.java @@ -0,0 +1,51 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.fx; + +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.layout.StackPane; +import javafx.stage.Stage; +import javafx.stage.StageStyle; + +/** + * + * @author Christos + */ +public class Editor_Stage extends Stage{ + + POELevelFx parent; + MainApp_Controller editor_controller; + + public Editor_Stage(POELevelFx parent){ + this.parent = parent; + this.launcher(); + } + + public void launcher(){ + FXMLLoader loader = new FXMLLoader(getClass().getResource("MainApp.fxml")); + StackPane sp = null; + try { + sp = loader.load(); + } catch (IOException ex) { + Logger.getLogger(Main_Stage.class.getName()).log(Level.SEVERE, null, ex); + } + editor_controller = loader.getController(); + editor_controller.hook(this); + Scene scene = new Scene(sp); + scene.getStylesheets().add(getClass().getResource("/styles/style.css").toExternalForm()); + this.setScene(scene); + + this.show(); + } + + public void returnToLauncher(){ + parent.launcher(); + } +} diff --git a/src/poe/level/fx/GemButton_Controller.java b/src/poe/level/fx/GemButton_Controller.java new file mode 100644 index 0000000..32c4b31 --- /dev/null +++ b/src/poe/level/fx/GemButton_Controller.java @@ -0,0 +1,48 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.fx; + +import com.jfoenix.controls.JFXButton; +import java.net.URL; +import java.util.ResourceBundle; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.image.ImageView; +import poe.level.data.Gem; + +/** + * FXML Controller class + * + * @author Christos + */ +public class GemButton_Controller implements Initializable { + + @FXML + private JFXButton gemButton; + + private Gem gem; + private QuestSplitPanel_Controller parent; + /** + * Initializes the controller class. + */ + public void load(Gem g,QuestSplitPanel_Controller parent){ + this.parent = parent; + gem = g; + gemButton.setGraphic(new ImageView(g.gemIcon)); + gemButton.setText(g.getGemName()); + } + + @FXML + private void gemClick(){ + parent.callback(gem); + } + + @Override + public void initialize(URL url, ResourceBundle rb) { + // TODO + } + +} diff --git a/src/poe/level/fx/GemEntry_Controller.java b/src/poe/level/fx/GemEntry_Controller.java new file mode 100644 index 0000000..e343cd7 --- /dev/null +++ b/src/poe/level/fx/GemEntry_Controller.java @@ -0,0 +1,378 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package poe.level.fx; + +import com.jfoenix.controls.JFXAutoCompletePopup; +import com.jfoenix.controls.JFXButton; +import com.jfoenix.controls.JFXComboBox; +import com.jfoenix.controls.JFXSlider; +import com.jfoenix.controls.JFXTextField; +import com.jfoenix.controls.JFXToggleButton; +import java.awt.Color; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.ResourceBundle; +import java.util.function.Function; +import java.util.stream.Collectors; +import javafx.application.Platform; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.AnchorPane; +import javafx.util.StringConverter; +import org.controlsfx.control.textfield.TextFields; +import poe.level.data.Gem; +import poe.level.data.GemHolder; +import poe.level.data.GemListCell; +import poe.level.data.GemToString; +import poe.level.fx.GemsPanel_Controller.GemLinker; + +/** + * FXML Controller class + * + * @author Christos + */ +public class GemEntry_Controller implements Initializable { + + @FXML + private JFXComboBox gemSelected; + @FXML + private Button selectGemButton; + @FXML + private AnchorPane disablePanel; + @FXML + private JFXSlider levelSlider; + @FXML + private JFXTextField act; + @FXML + private JFXTextField soldBy; + @FXML + private JFXComboBox replaceGem; + @FXML + private JFXToggleButton replaceToggle; + @FXML + private AnchorPane root; + @FXML + private JFXButton backButton; + @FXML + private Label label_with; + @FXML + private Label levelLabel; + + public static boolean skip = false; + int id; + + GemLinker parent; + Gem selectedGem; + int selected; + private boolean lockClear = false; + + /** + * Initializes the controller class. + */ + @Override + public void initialize(URL url, ResourceBundle rb) { + // TODO + replaceGem.setVisible(false); + ObservableList