diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 1ff0c42..0000000 --- a/.gitattributes +++ /dev/null @@ -1,63 +0,0 @@ -############################################################################### -# Set default behavior to automatically normalize line endings. -############################################################################### -* text=auto - -############################################################################### -# Set default behavior for command prompt diff. -# -# This is need for earlier builds of msysgit that does not have it on by -# default for csharp files. -# Note: This is only used by command line -############################################################################### -#*.cs diff=csharp - -############################################################################### -# Set the merge driver for project and solution files -# -# Merging from the command prompt will add diff markers to the files if there -# are conflicts (Merging from VS is not affected by the settings below, in VS -# the diff markers are never inserted). Diff markers may cause the following -# file extensions to fail to load in VS. An alternative would be to treat -# these files as binary and thus will always conflict and require user -# intervention with every merge. To do so, just uncomment the entries below -############################################################################### -#*.sln merge=binary -#*.csproj merge=binary -#*.vbproj merge=binary -#*.vcxproj merge=binary -#*.vcproj merge=binary -#*.dbproj merge=binary -#*.fsproj merge=binary -#*.lsproj merge=binary -#*.wixproj merge=binary -#*.modelproj merge=binary -#*.sqlproj merge=binary -#*.wwaproj merge=binary - -############################################################################### -# behavior for image files -# -# image files are treated as binary by default. -############################################################################### -#*.jpg binary -#*.png binary -#*.gif binary - -############################################################################### -# diff behavior for common document formats -# -# Convert binary document formats to text before diffing them. This feature -# is only available from the command line. Turn it on by uncommenting the -# entries below. -############################################################################### -#*.doc diff=astextplain -#*.DOC diff=astextplain -#*.docx diff=astextplain -#*.DOCX diff=astextplain -#*.dot diff=astextplain -#*.DOT diff=astextplain -#*.pdf diff=astextplain -#*.PDF diff=astextplain -#*.rtf diff=astextplain -#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore index f8520fb..4378419 100644 --- a/.gitignore +++ b/.gitignore @@ -1,365 +1,9 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Ww][Ii][Nn]32/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Oo]ut/ -[Ll]og/ -[Ll]ogs/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# ASP.NET Scaffolding -ScaffoldingReadMe.txt - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Coverlet is a free, cross platform Code Coverage Tool -coverage*.json -coverage*.xml -coverage*.info - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ - -# Fody - auto-generated XML schema -FodyWeavers.xsd -/docs -/RandomizerMod/LocalOverrides.targets +############### +# folder # +############### +/**/DROP/ +/**/TEMP/ +/**/packages/ +/**/bin/ +/**/obj/ +_site diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 8000a6f..0000000 --- a/LICENSE +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 - USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random - Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/LOGIC_README.md b/LOGIC_README.md deleted file mode 100644 index b5a8c2c..0000000 --- a/LOGIC_README.md +++ /dev/null @@ -1,172 +0,0 @@ -This file serves to document the randomizer logic. - -## Skip Settings - -### Precise Movement -- Precise Movement is a skip category used for ordinary movement with a very low margin of error. Precise Movement cases often, but not always, have a large penalty for failure. -- In logic, Precise Movement is indicated with the **PRECISEMOVEMENT** token. -- More advanced skips such as Fireball Skips or Acid Skips generally do not include the Precise Movement modifier, but rather one of Obscure Skips, Complex Skips, or Difficult Skips as appropriate. -- Examples include: - - Jumping to *Hallownest_Seal-Fungal_Wastes_Sporgs* with no items. - - Jumping to *Ancient_Basin_Map* with no items. - - Navigating through the Lifeblood Core room with no items (logic for *Lifeblood_Core*, *Arcane_Egg-Lifeblood_Core*, *Warp-Lifeblood_Core_to_Abyss*). - - Coyote jump to reach the warp to Palace Grounds in White_Palace_03 (logic for *Warp-White_Palace_Atrium_to_Palace_Grounds*). - - Coyote jump and right dash to reach the platform in lower King's Station, from the bottom left entrance without Swim (logic for transitions in *Ruins2_06* from *Ruins2_06[left2]*). - - Using Mantis Claw and Crystal Heart to pass under conveyors (logic for *Mines_37*, including *Geo_Chest-Crystal_Peak*). Also considered an Obscure Skip. - -### Proficient Combat -- Proficient Combat is a skip category used for ordinary combat with limited items or movement. Precise Combat is combat that should be doable after casual play, with at most a small amount of practice necessary. -- In logic, Proficient Combat is indicated with the **PROFICIENTCOMBAT** token. More commonly, the equivalent **MILDCOMBATSKIPS** macro is used, or the **SPICYCOMBATSKIPS** macro which also requires Difficult Skips. -- A nearly complete list of combat logic usage is located at the bottom of the macros.json file. -- Examples of **MILDCOMBATSKIPS** include: - - Fighting bosses with the **AERIALMINIBOSS** modifier (dream warriors, Uumuu, various others) without a dash item. - - Fighting bosses with the **BOSS** modifier (most bosses that would usually be encountered after wings) without a dash item. - - Fighting Flukemarm without Shade Soul or Abyss Shriek, but instead normal **BOSS** requirements. - - Using Cyclone Slash or Great Slash for nail combat (rather than right or left or up slashes, when nail is randomized). -- Examples of **SPICYCOMBATSKIPS** include: - - Fighting bosses with the **MINIBOSS** modifier without a spell. - - Fighting bosses with the **AERIALMINIBOSS** modifier without Vengeful Spirit or Howling Wraiths. - - Fighting bosses with the **AERIALMINIBOSS** modifier with Cyclone Slash or Great Slash (rather than right or left or up slashes, when nail is randomized). - - Using downslash only for nail combat. - -### Background Object Pogos -- Background Object Pogos are as the name suggests. -- Interactive objects such as spikes, enemies, or bounce shrooms are not included in this category. -- In logic, Background Object Pogos are indicated with the **BACKGROUNDPOGOS** token. -- Examples include: - - Pogoing to reach the Watcher's Spire without wings. - -### Enemy Pogos -- Enemy Pogos are skips which require pogoing killable enemies or their projectiles. -- Pogoing spikes, saws, or enemies which do not take damage (Goams, Garpedes, Durandoos, Crystal Crawlers, Wingsmoulds, etc) is not considered a skip. Pogoing the shade or its projectiles is classified under Shade Skips, and not Enemy Pogos. -- In logic, Enemy Pogos are indicated with the **ENEMYPOGOS** token. -- Examples include: - - Pogoing a Vengefly in Blue Lake to reach the rancid egg with wings. - -### Obscure Skips -- Obscure Skips are progression paths which are subjectively determined to be too obscure for a new randomizer player to be expected to know. -- Advanced skips with other modifiers generally do not include the Obscure Skips modifier. Inversely, where Obscure Skips appears, any other required skips will be noted. -- In logic, Obscure Skips are indicated with the **OBSCURESKIPS** token. -- Examples include: - - Destroying horizontal planks in Ancestral Mound or Kingdom's Edge using Crystal Heart. - - Itemless explosion pogo to Mantis Village. - - Corpse explosion pogo with wings below Fungal Wastes Cornifer. - - Using Mantis Claw and Crystal Heart to pass under conveyors (logic for *Mines_37*, including *Geo_Chest-Crystal_Peak*). Also considered Precise Movement. - -### Shade Skips -- Shade Skips are skips which utilize the shade, often by pogoing it or using it for damage boosts. -- Generally, shade skips which require shade fireballs are not in logic, due to their RNG-dependence and relative obscurity. -- With Void Heart, shade skips (and Sibling pogos) require unequipping Void Heart, which causes the enemies to become hostile again. Void Tendrils are not currently affected by unequipping Void Heart. -- In logic, Shade Skips are indicated with the **SHADESKIPS** token. More commonly, the **$SHADESKIP** state modifier is used, sometimes with arguments such as "2HITS", indicating that the player must be able to die with at least 4 masks so that the shade can take 2 nail hits. -- Examples include: - - Pogoing the shade in a number of places to gain extra height. Most notably, shade skips can be used to reach Salubra with no items, or Blue Lake with vertical movement. - -### Infection Skips -- Infection Skips are skips which are only possible after Forgotten Crossroads has been infected. These skips most commonly involve pogoing infection bubbles or Furious Vengeflies. -- In logic, Infection Skips are indicated with the **INFECTIONSKIPS** token. More commonly, the **INFECTED** macro is used. -- Examples include: - - Pogoing infection bubbles to reach the Crossroads entrance to Fungal Wastes with no other items. - - Pogoing the Furious Vengefly to reach Salubra or the Crossroads entrance to Blue Lake with no other items. - - Pogoing the Furious Vengefly to reach *Hallownest_Seal-Crossroads_Well* with wings or dash and airstall. - -### Fireball Skips -- Fireball Skips are skips which use Vengeful Spirit or Howling Wraiths (or their upgrades) to reset fall speed midair. -- Generally, Fireball Skips in logic require at most 3 consecutive casts of a spell, meaning that Spell Twister skips are not in logic. -- In logic, Fireball Skips are indicated with the **FIREBALLSKIPS** token. More commonly, the **SPELLAIRSTALL** macro is used. -- Examples include: - - Using airstall to reach Salubra after Gruz Mother with no other movement. - - Using airstall to cross Queen's Station from left to right with no other movement. - -### Acid Skips -- Acid Skips are skips which involve crossing over a pool of acid (or water, when the Swim ability is removed). -- In logic, Acid Skips are indicated with the **ACIDSKIPS** token. More commonly, the **LEFTSKIPACID** or **RIGHTSKIPACID** macros are used. -- Examples include: - - Using a low height wallcling Crystal Heart to cross several acid pools, such as at the Crossroads entrance to Fog Canyon or the Fog Canyon entrance to Queen's Gardens. - -### Spike Tunnels -- Spike Tunnels are skips which involve crossing through a narrow passage lined with spikes. -- In logic, Spike Tunnels are indicated with the **SPIKETUNNELS** token. -- Examples include: - - Crossing the spike tunnel on the way to Glowing Womb with dash and airstall or Dashmaster. - - Entering the spike tunnels in the Waterways broken elevator shaft, using several possible item combinations. - - Passing through the spike tunnel before the grub in Crystal Peak, which allows reaching the upper area with wings but no claw. - -### Dark Rooms -- Dark Rooms are skips which involve passing through a dark room without Lumafly Lantern. -- In logic, Dark Rooms are indicated with the **DARKROOMS** token. -- Examples include: - - Passing through the dark Deepnest rooms. - - Passing through the dark Howling Cliffs room before Joni's Blessing. - - Passing through the dark Stone Sanctuary room before the No Eyes mask shard. - - Passing through the dark Crystal Peak room before Crystallized Mound. - -### Damage Boosts -- Damage Boosts are skips which involve intentionally taking damage from a hazard or enemy. -- In logic, Damage Boosts are indicated with the **DAMAGEBOOSTS** token. -- Examples include: - - Jumping into the Charged Lumaflies at the top of the room to boost to *Hallownest_Seal-Fog_Canyon_East* with no other movement. - - Jumping into the acid or thorn hazards to reach *Vessel_Fragment-Greenpath* with wings but no claw. - -### Dangerous Skips: -- Dangerous Skips are skips which carry a high risk of taking damage, due to aggressive enemies or other sources. -- Generally, this modifier is not applied to Acid Skips or Spike Tunnels, which are implicitly understood to be dangerous. -- In logic, Dangerous Skips are indicated with the **DANGEROUSSKIPS** token. -- Examples include: - - Skips requiring pogoing Dirtcarvers in the trap Deepnest entrance (logic for *Deepnest_01b[top1]*). - - Pogoing up the Quick Slash room (Deepnest_East_14b) without items (logic for *Quick_Slash*, *Deepnest_East_14b[top1]*). - - Various Hwurmp and/or Flukefey pogos in *Waterways_04b* (Waterways Mask Shard room). - - Pogoing the Flukefey to cross the water with right dash and no swim in *Waterways_02*. - -### Slopeballs -- Slopeballs are skips which involving casting Vengeful Spirit into a curved surface. If the surface has the right curve, and the cast is from the right position, the fireball will be curved by the collision, and slowed enough for the player to pogo it. -- In logic, Slopeballs are indicated with the **SLOPEBALLSKIPS** token. More commonly, the **$SLOPEBALL** state modifier is used, sometimes with various arguments related to tracking soul usage. -- Examples include: - - A slopeball to reach Fungal Wastes from Forgotten Crossroads with no other items - - A slopeball to reach Palace Grounds from Ancient Basin with only claw or wings - - A slopeball to cross the long spike tunnel in Ancient Basin with only claw and dash - - A slopeball to cross from left City of Tears into right City of Tears with only claw -- Note: some slopeballs are only possible with nail range extensions, or with Shaman Stone to change the spell hitbox. The slopeballs currently in logic do not require any charms. - -### Shriek Pogos -- Shriek Pogos are skips where the player casts Abyss Shriek, then immediately does a double jump as the cast finishes. With the right timing, the shriek can be pogoed, cutting off the double jump into a smaller pogo, but with the benefit of refreshing the player's ability to dash or double jump. To be precise, there is a 4 frame window to press double jump, and a 6 frame window to press downslash, starting when the player regains control at the end of the cast, in order to perform a shriek pogo. The height gained from the pogo is maximized when double jump is pressed as early as possible, and nail is pressed as late as possible. -- In logic, Shriek Pogos are indicated with the **SHRIEKPOGOSKIPS** token. More commonly, the **$SHRIEKPOGO** state modifier is used, sometimes with various arguments related to the number of shriek pogos required and other soul usage tracking. -- With **$SHRIEKPOGO**, a **DIFFICULTSKIP** requirement is automatically added to chains of 4 or more shriek pogos. In general, when more than 1 shriek pogo is chained, **$SHRIEKPOGO** may require using dash between casts to stall out the soul meter long enough for it to refill. -- Examples are typically along the lines of either: using shriek pogos to gain extra horizontal movement by refreshing dash midair, or using shriek pogos to gain minor extra vertical movement in situations where wings alone are not sufficient. For example, 3 shriek pogos can be used to enter Fungal Core without claw. - -### Complex Skips -- Complex Skips are skips which have extended setup time or are obscure even by the standards of advanced skips. -- In logic, Complex Skips are indicated with the **COMPLEXSKIPS** token. -- Examples include: - - Leftward Lake of Unn acid skip, which requires spell airstall or Sharp Shadow (logic for *Fungus1_26[left1]*). - - Swim skip in *Ruins2_07* in either direction, if done without Crystal Heart, using a combination of wings, claw, dash, and airstall or Sharp Shadow. - - *Love_Key* acid skip using Sharp Shadow. - - Shade skip to Blue Lake using dash and airstall (logic for *Crossroads_04[right1]*). - - Shade skip to *Geo_Chest-Crystal_Peak* using Grubberfly's Elegy to provoke the shade. - - Vengefly pogo in King's Pass to Howling Cliffs (logic for *Tutorial_01[top2]*). - - Vengefly pogo in Tower of Love to above Collector (logic for *Collector's_Map*, *Grub-Collector_1*, *Grub-Collector_2*, *Grub-Collector_3*). - - Shade skips in Beast Den without Mantis Claw (logic for locations in *Deepnest_Spider_Town*). - - Luring a Mantis Youth to pogo to *Geo_Rock-Mantis_Village_Above_Claw* without items. - - Fireball skip with left dash, right claw, and wings to get to *Rancid_Egg-Waterways_West_Bluggsac* from the right without swim. - -### Difficult Skips -- Difficult Skips are skips which are subjectively considered to be more difficult than usual. -- In logic, Difficult Skips are indicated with the **DIFFICULTSKIPS** token. -- Examples include: - - Item rando shade skip from chest above Baldur Shell to Howling Cliffs (logic for *Fungus1_28[left1]*). - - Pogoing a falling Gluttinous Husk to reach the bottom left transition in lower King's Station without Swim (logic for *Ruins2_06[left2]*). - -## Geo Logic -Since geo is a consumable resource that can be used or lost in many ways (and is not available from randomized items, with some cursed settings), the randomizer does not track exact numbers of geo or relics in logic. However, any location which requires geo has logic to ensure that the player can farm geo off of respawning enemies. Additionally, -- The mid-expensive locations *Dash_Slash*, *Unbreakable_Heart*, *Unbreakable_Greed*, and *Unbreakable_Strength* also have logic to require the ability to visit Lemm, to reduce the odds of required farming. -- The most expensive location *Vessel_Fragment-Basin* has logic to require the ability to visit Lemm **and** the ability to complete the second colosseum trial. Thus, the logic guarantees the ability to farm large amounts of geo through the colosseum, as well as possibly geo through relics. - -## Terminal Logic and Nonterminal Logic -- Briefly, logic is terminal if it represents a goal which has a permanently saved effect. In other words, after achieving that, the player could return to start and fully reset before continuing. Terminal logic includes: - - Logic for locations - - Logic for world events such as defeating bosses, triggering levers, destroying breakable walls, and so on. -- Nonterminal logic includes: - - All other waypoints, such as room waypoints, warp waypoints, *Can_Stag*, and so on. - - Logic for transitions. -- As of version 4.1.0, the randomizer now tracks conditional logic access through state logic. State encompasses the ability to shade skip, the number of charm slots available, the amount of soul left, and similar resources. As a result, it is now possible that nonterminal logic can require the player to expend such resources (e.g. cast spells, etc). There are a few limitations of this system: - - The ability to refill soul by killing enemies in general is not taken into account. However, where logic requires cast spells, and there are nearby enemies to refill soul, that soul may be taken into account. - - The ability to reset state by using dream gate is generally not taken into account. This is both for consistency and to avoid requiring the player to expend too much essence using this method. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 1e11196..0000000 --- a/README.md +++ /dev/null @@ -1,275 +0,0 @@ -## Randomizer 4 - -Welcome to Randomizer 4, the newest version of the Hollow Knight item and transition randomizer released for the Hollow Knight 1.5 update. - -If you are new to the randomizer community, please consider joining the Hollow Knight discord server and the Hollow Knight Speedrunning discord server! - -## Dependencies - -Randomizer 4 requires the following to run: -- The Hollow Knight Modding API for the latest patch (1.5+). Randomizer 4 is not compatible with patches 1.4.3.2 or earlier. -- The MenuChanger and ItemChanger mods. -- The RandomizerCore and RandomizerCore.Json libraries. - -Additionally, the following mods are strongly recommended: -- Benchwarp, which can be required by randomizer logic for warping to the start location. -- QoL, which can be required to restore skips expected in certain modes. - -## Tips - -- Several items can be used to kill baldurs, including: Vengeful Spirit (or upgrades), Desolate Dive (or upgrades), Grubberfly's Elegy, Glowing Womb, Dash Slash with Dash, Weaversong, Spore Shroom, Cyclone Slash, Mark of Pride, and even just Dash on its own! - - With default skip settings, only Vengeful Spirit, Desolate Dive, Grubberfly's Elegy, and Glowing Womb can be required in logic. -Baldur HP is reduced to 5 to make slower baldur kills less tedious, and to reduce RNG. -- Pogos may be required (for example, with standard settings Garpedes must be pogoed to collect the vessel fragment in Deepnest). Pogos which damage enemies are only required with the Enemy Pogos skip setting, and pogos which break background objects are only required with the Background Object Pogos skip setting. See the LOGIC README for more details. -- Several items are randomized progressively, meaning that collecting any item in a given family always gives the first upgrade, collecting another gives the second upgrade, etc. For such items, any of the pickups in the family may be forced by randomizer logic. The families this pertains to are: - - Dream Nail, Dream Gate, Awoken Dream Nail - - Mothwing Cloak, Shade Cloak - - Vengeful Spirit, Shade Soul - - Desolate Dive, Descending Dark - - Howling Wraiths, Abyss Shriek - - Fragile Heart, Unbreakable Heart, and likewise for the other fragile charms -- Grimmchild has special behavior: collecting it automatically activates the Nightmare Lantern. Additionally, if Charms are randomized and Grimmkin Flames are not randomized, collecting Grimmchild gives the first 6 Grimmkin Flames. -- The lifeblood door in Abyss opens if you enter the room with a single lifeblood mask. In logic, it requires a lifeblood charm. -- The randomizer adds extra platforms to various places that prevent softlocks. For example, there are several platforms added to Ancient Basin to prevent having to quit-out after checking certain locations without vertical movement. These platforms may disappear once the player has sufficient abilities to no longer need them. -- If the player waits at the start location without waking up, the soul meter will be filled. This can be required at start locations which may not have soul. The player can return to start using the "Set Start" and "Warp" functions of Benchwarp. - - Warping to start after equipping charms at a bench may be required by the randomizer. - - Warping to start while carrying the Delicate Flower is not required by the randomizer to complete the Grey Mourner's quest. -- With skips allowed, the player is advised to take care to not get locked out of certain required pogos. Obtain: - - No more than 1 nail upgrade before claw or wings - - No more than 3 nail upgrades before claw - - In Split Claw mode, instead obtain no more than 2 nail upgrades with only a single claw piece, and any number of nail upgrades with a single claw piece as well as wings -- There are several logs created per file in the Randomizer 4 folder in the save directory to help you with your playthrough. - - Tracker Log: this log continuously records item locations and transition connections as you discover them. - - Helper Log: this log computes which locations/transitions are accessible with your current equipment. - - Tip: if you sequence break out of logic, locations and transitions which are put into logic by the sequence break will be labeled with an asterisk until they are reachable without sequence breaks. - - Spoiler Log: this log lists the exact locations of every randomized item and/or transition. -- For players of Randomizer 3, some new items and locations have been added to the old pools: - - Charms now includes Fragile and Unbreakable charms. Fragile charms can be repaired at Leg Eater. Divine sells 3 items, one for each Unbreakable charm. To purchase an item from Divine, you must equip the corresponding Heart, Greed, or Strength charm as in vanilla, and pay 5% of the vanilla geo cost (600 for Heart, 450 for Greed, 750 for Strength). - - Rancid Eggs now includes the Tuk Defender's Crest egg. To obtain Tuk's item, you must talk to Tuk with Defender's Crest equipped. -- Multiple items at one location: Randomizer/ItemChanger support placing any number of items at a given location. This is usually not used by the randomizer except for a few special cases. - - Focus and Lore_Tablet-Focus are both randomized. Then the Focus location does not exist, and two items are placed at Lore_Tablet-Focus. - - World_Sense and Lore_Tablet-World_Sense are both randomized. Then the World_Sense location does not exist, and two items are placed at Lore_Tablet-World_Sense. - -## Settings - -There are many settings available to customize the randomizer, and even more settings can be added by installing connection mods, which integrate with the randomizer. Information about the types of settings included with the base randomizer can be found in the subsections below. - -Settings presets can be selected from the first menu page of the randomizer. To edit individual settings, click "More Randomizer Settings" in the bottom left for base randomizer settings, or "Connections" in the bottom left for connection mod settings. - -To manage settings and settings profiles, from the first menu page, click "More Randomizer Settings" in the bottom left, then "Manage Settings Profiles" in the bottom right of the next page. On this page, you can create a shareable code for the current settings, and save/load settings profiles. -- Both the code and the settings profiles only modify base randomizer settings. Connection mod settings must be entered by hand. The code is linked to the randomizer version and will not be accepted if a different version of the mod is installed. -- The RandoSettingsManager mod can be used to synchronize randomizer settings and most connection mod settings. Controls can again be found under "Manage Settings Profiles". Note that RandoSettingsManager codes require an internet connection to use, and may expire. - -### Pool Settings - -These settings control which items are randomized. -- Dreamers: Lurien, Monomon, Herrah, and World Sense. World Sense is the Black Egg Temple pickup to view completion percentage -- Skills: all spells, nail arts, and movement abilities -- Charms -- Keys: all key objects, as well as King's Brand, Godtuner, and Collector's Map -- Mask Shards -- Vessel Fragments -- Pale Ore -- Charm Notches -- Geo Chests: all geo chests, except the one above Baldur Shell and those in the Junk Pit -- Relics: all Wanderer's Journals, Hallownest Seals, King's Idols, and Arcane Eggs. -- Rancid Eggs -- Stags -- Maps -- Whispering Roots -- Grubs -- Lifeblood Cocoons -- Soul Totems -- Grimmkin Flames -- Geo Rocks -- Boss Essence: essence drops from Dream Warriors and Dream Bosses -- Boss Geo: geo drops from Gruz Mother, Massive Moss Charger, Vengefly King, Gorgeous Husk, Crystal/Enraged Guardian and both Soul Warriors -- Lore Tablets -- Journal Entries: The Hunter's Journal, along with the Goam, Garpede, Charged Lumafly, Void Tendrils and Seal of Binding locations. -- Junk Pit Chests - - -### Skip Settings - -These settings control which difficult skips the randomizer may potentially require. Beginners are strongly recommended to leave these settings to their defaults, as many skip categories include skips that are quite difficult or obscure. - -More detail about each setting is available in the LOGIC_README.md. - -### Novelty Settings - -These settings add new and unusual features to the randomizer: -- Randomize Swim: All pools of water become dangerous, and a new Swim item is randomized which allows swimming in water normally. -- Randomize Elevator Pass: The large City of Tears elevators to Forgotten Crossroads and Resting Grounds will be closed until the new Elevator Pass item is obtained. Additionally, a new randomized location is added in place of the toll machine next to the left elevator. -- Randomize Nail: Adds three extra items to the pool that allow swinging the nail left, right and up; by default in this mode, the nail can only be swung down. -- Randomize Focus: Removes the ability to heal and adds it as a randomized item. Additionally, a new randomized location is added in front of the Focus tutorial tablet in King's Pass. -- Split Claw: Replaces Mantis Claw with two items, a "Left Mantis Claw" that works only on left walls, and a "Right Mantis Claw" that works only on the right. Replaces the Mantis Claw location with two locations in Mantis Village. -- Split Cloak: Replaces Mothwing Cloak with two items, a "Left Mothwing Cloak" that lets you dash to the left, and a "Right Mothwing Cloak" that dashes to the right. Also adds a new location dropped after defeating Hornet in Greenpath. Shade Cloak is not split, meaning that there are effectively 3 dash upgrades in this mode: the ability to dash left, to dash right, and to shadowdash. - - Dash items remain progressive. In this mode, Shade Cloak has a random directional bias, and will give the dash of that direction if it has not yet been obtained. -- Split Superdash: Replaces Crystal Heart with two items, a "Left Crystal Heart" that lets you superdash to the left, and a "Right Crystal Heart" that superdashes to the right. Also adds a new location left of the bridge next to the Crystal Heart location. -- Egg Shop: instead of summoning your shade, Jiji will now let you buy items for rancid eggs. If you've given her enough rancid eggs, any items you've reached the cost for will be summoned. - -### Cost Settings - -These settings control how certain randomized costs are generated for the following: -- Grubs (e.g. number required for a Grubfather location) -- Essence (e.g. number required for a Seer location) -- Rancid Eggs (e.g. number required for an Egg Shop location) -- Charms (e.g. number required for certain Salubra locations when Salubra Charm Notches are randomized) - -For each category, there is a minimum, maximum, and tolerance. The costs will be taken uniformly at random between the minimum and maximum (inclusive), and the locations will be randomized under the constraint that for the cost to be affordable, the number of reachable items must exceed the cost by tolerance. Concretely, if the grub cost settings give a minimum of 1, a maximum of 23, and a tolerance of 2, then a possible cost is 19, and that cost will be in logic when 19 + 2 = 21 grubs are reachable. - -### Long Location Settings - -Settings which allow selectively not randomizing certain long locations, or modifying certain item previews. -- White Palace Rando: Allows removing all randomized items and locations in Path of Pain, or White Palace as a whole, and leaving them vanilla. For historical reasons, the King Fragment item and location are not affected by this setting, and are always randomized with the Charms pool. - - In transition randomizer, this setting also unrandomizes transitions. The Exclude Path of Pain setting unrandomizes all transitions in Path of Pain and the transition leading to Path of Pain. The Exclude White Palace setting unrandomizes all transitions in White Palace and Path of Pain. -- Boss Essence Rando: Allows selecting which bosses are included in the Boss Essence pool; for example, giving the option to remove White Defender and Grey Prince Zote, or to remove all Dream Bosses leaving only Dream Warriors. - -For each preview setting, toggling the setting off will result in the corresponding location(s) no longer allowing preview of their items. For locations which carry randomized costs, the preview setting has four options: -- Cost And Name: default preview behavior -- Cost Only: item names will be redacted from the preview -- Name Only: cost details will be redacted from the preview -- None: all details except number of items will be redacted from the preview - - -### Start Location Settings - -These settings control how the start location of the randomizer is determined. The key field is Start Location Type, with the following choices: -- Fixed: The start location will be that chosen by the user in the menu. -- Random: The start location will be chosen uniformly at random from the highlighted options. -- Random Excluding KP: The same as above, except that King's Pass will not be one of the options. - -The possible random starts depend on the randomization settings as a whole, as some start locations do not lead to viable starts with certain settings. More starts can be unlocked by including more skips, more transition randomization, and more start item randomization. - -### Start Item Settings - -These settings control what items will be given to the player when the game begins: -- Start Geo: Gives a random amount of geo between the minimum and maximum inclusive. -- Vertical: Controls whether the player starts with Mantis Claw, Monarch Wings, or both. -- Horizontal: Controls whether the player starts with Mothwing Cloak, Crystal Heart, or both. -- Charms: Controls what random equipped charms the player may start with. -- Stags: Controls what unlocked stags the player may start with. -- Misc Items: Controls what various other items the player may start with, including: Dream Nail, Isma's Tear, Vengeful Spirit, Desolate Dive, Howling Wraiths, Cyclone Slash, Great Slash, Dash Slash, Simple Key, Elegant Key, Tram Pass, King's Brand, Love Key, Lumafly Lantern, Shopkeeper's Key, and City Crest. - -### Misc Settings - -Settings which do not fit into the other classifications. -- Randomize Notch Costs: This setting randomizes the costs of all 40 charms uniformly so that the costs add to a total between the Min Random Notch Total and the Max Random Notch Total (inclusive). These numbers default to 70 and 110 respectively, relative to the vanilla total of 90. Note that the notch cost of each charm is constrained between 0 and 6. The notch cost will subsequently be displayed as part of the charm name. This does not affect future cost modifications, such as when Carefree Melody or Void Heart are obtained. -- Extra Platforms: Adds small platforms near locations where the player would otherwise softlock, mainly in areas like Royal Waterways or Ancient Basin where vertical movement is often needed. -- Salubra Notches: Allows the player to choose whether Salubra Charm Notches are randomized as part of the Charm Notches pool, are always vanilla or random, or should behave as in Randomizer 2 and 3, where each notch is automatically given when the player collects 5, 10, 18, and 25 charms. - - Salubra's Blessing will now be randomized as well when the Salubra Notches are randomized (or randomized with the Charm Notches pool). On other settings, Salubra's Blessing will be sold as usual once the player has 40 charms. -- Mask Shards: Allows replacing randomized mask shards with double or quadruple shards, adding up to the same number of masks. -- Vessel Fragments: Allows replacing randomized vessel fragments with double or triple fragments, adding up to the same number of vessels. - - These last two settings may be desired to reduce the number of items, particularly in opposition to Duplicate Items. -- Steel Soul: if enabled, starts the game in Steel Soul (perma-death) mode. The Shade Skips setting will be automatically disabled. -- Fireball Upgrade: this setting controls whether the upgrade from Vengeful Spirit can be deferred or reversed. If the setting is "Deferred", then after obtaining Shade Soul, the game will still act as though the player has Vengeful Spirit until the player presses attack while selecting the Vengeful Spirit icon in the inventory, which will irreversibly upgrade Vengeful Spirit to Shade Soul. If the setting is "Toggleable", then after obtaining Shade Soul, the player may freely swap between the two spells using the same method in the inventory. Certain skips, mainly involving slopeballs, require base Vengeful Spirit and are not possible with Shade Soul. If the Slopeballs skip setting is active, this setting is locked to "Toggleable". - -### Cursed Settings - -- Longer Progression Chains: Applies a random priority penalty to each of Mothwing Cloak, Mantis Claw, Crystal Heart, Monarch Wings, Shade Cloak, Dream Nail, Vengeful Spirit, Desolate Dive, Howling Wraiths, Void Heart, Split Cloak items, and Split Claw items, making them less likely to be early progression. -- Replace Junk With One Geo: Replaces randomized Mask Shards, Vessel Fragments, Pale Ore, Charm Notches, Geo, Rancid Eggs (when Egg Shop is not randomized), Relics, and Soul with One Geo pickups. The removed items are then unobtainable, making the resulting seed much more difficult. -- Remove Spell Upgrades: Removes Shade Soul, Descending Dark, and Abyss Shriek. Additionally, modifies spells so that they cannot be upgraded beyond the first level, even with duplicate items. -- Deranged: locations will not receive their vanilla items unless there are no alternatives. Transitions will not receive their vanilla targets unless there are no alternatives. -- Cursed Masks: This is a numerical setting which can take values between 0 and 4. When it is greater than 0, the Knight starts with that many fewer masks, and the equivalent number of mask shards are added to randomization. In other words, with a setting of 4, the Knight starts with 1 mask, and an additional 16 mask shards are randomized. Be warned that this setting interacts with Replace Junk With One Geo to remove the added mask shards, if both are active. -- Cursed Notches: This is a numerical setting which can take values between 0 and 2. When it is greater than 0, the Knight starts with that many fewer charm notches, and the equivalent number of charm notches are added to randomization. In other words, with a setting of 2, the Knight starts with 1 notch, and an additional 2 charm notches are randomized. Be warned that this setting interacts with Replace Junk With One Geo to remove the charm notches, if both are active. -- Randomize Mimics: Add the four non-colo mimic locations to the randomization pool (some grubs may turn into mimics). With grubs unrandomized, instead randomize the mimics and grubs among themselves. -- Maximum Grubs Replaced By Mimics: When Randomize Mimics is enabled, this setting allows the randomizer to replace grubs with mimics. The maximum here is inclusive. Grub replacement can happen whether grubs are randomized or not. The number of replaced grubs will be clamped to 46 - CostSettings.MaximumGrubCost - CostSettings.GrubTolerance, to ensure all grub costs remain payable. - -### Transition Settings - -Settings which control which transitions between rooms are randomized. There are three main transition randomizer modes: -- None: no transitions are randomized -- Map Area Randomizer: transitions between map areas are randomized. - - Maps refer to the maps purchased from Cornifer or Iselda, and the initial map of King's Pass and Dirtmouth. -- Full Area Randomizer: transitions between titled areas are randomized. - - A titled area is defined to be an area with title text, i.e. a name which pops up as onscreen text. - - Transitions between titled areas agree with the transitions between map areas where possible. The remaining transitions are chosen subjectively, though in most cases the obvious choice is taken. -- Room Randomizer: almost all room transitions are randomized, excluding: - - Warps of any kind, including those entering dream areas - - Trams and elevators - - Transitions within Godhome, the Shrine of Believers and the Black Egg Temple - - The transitions leading to Sly's storeroom, Bretta's basement, or to any trial of the colosseum - -There are additional settings which control the randomization of transitions: -- Area Constraint: Forces the randomizer to connect transitions to the same area if possible. This does not guarantee that areas are connected, but it gives a high likelihood that a transition will stay within the same area. -- Transition Matching: Controls how transition directions affect randomization. Note that independent of this setting, one-way transitions always map to one-way transitions. - - Matching Directions: left transitions must map to right transitions, top transitions must map to bottom transitions, and so on. - - Door transitions are assigned directions so that the transition count is balanced. Since there are two more doors and right transitions total than left transitions (due to the door in Dirtmouth leading to a right transition in Bretta's room), one door will act as a left transition and all others will act as a right transition. - - Matching Transitions and no Door to Door: This settings is the same as the above, except that additionally there can be no door to door transitions. - - Nonmatching Directions: Directions are not considered in randomization, and one transition can map to any other. -- Coupled: Determines whether transitions must be reversible, in the sense that entering a transition and then going back returns to the original place. With decoupled transitions, going back can lead to a new transition. - -Some important Room Randomizer tips: -- The nightmare lantern must be lit to check Grimmchild -- Sly must be rescued to use his shop - -### Progression Depth Settings - -These settings control how item-location placements are determined at the end of the randomizer: -- Multi Location Penalty: for a location among the following: *Sly*, *Sly_(Key)*, *Iselda*, *Salubra*, or *Leg_Eater*, moves all but one of its placements to the end of the location list, to strongly reduce its chances of having multiple progression items. -- Duplicate Item Penalty: for each item invisible to logic (e.g. those added by Duplicate Items), moves it to the front of the item list. This means that these items are placed immediately after progression, generally in deep non-shop locations. - -The remaining settings relate to the depth priority transform. Briefly, this determines whether locations which became reachable later in randomization should be weighted more strongly than other locations. For example, a Transform Type of Linear and a Coefficient of 3 imply that a location placed one step later in randomization should be advanced past 3% of the locations relative to the original order. - -To elaborate, randomization proceeds in steps, where a step forces certain items to be placed which unlock new locations. The depth of an item is the number of steps before it is placed, and the depth of a location is the number of steps before it becomes reachable. - -For each randomization group, its items and locations begin with randomized priorities evenly spaced from 0 to 1. Without any restrictions, item placements would be done by selecting the lowest priority required item and placing it at the lowest priority reachable location. However, the depth priority transform uses the depth and priority of the item, and the depth of the candidate location to modify the location's priority before determining the minimum priority location. - -The first component of the depth priority transform is the Item Location Priority Interaction. For an item, the item priority depth is a number calculated as the number of steps in which the average priorities of the forced items is less than the priority of the current item. In other words, item priority depth is at most the depth of the item, and is smaller by the number of spheres in which on average, higher priority items were forced. The Item Location Priority Interaction determines how item priority depth should be factored into the transform. It has the following values: -- Cliff: if the item priority depth is **less** than the location depth, then the priority transform has no effect. Otherwise, item priority depth does not modify the transform. -- Fade: Location depth is adjusted downward by the item priority depth for the second part of the transform. Specifically, location depth is unmodified when it is less than the item priority depth, and linearly fades to 0 from the item priority depth to 2 times the item priority depth. -- Cap: Location depth is capped above by the item priority depth for the second part of the transform. -- Ignore: Item priority depth does not modify the transform. -In general, the idea for this setting is to weight low priority items to be placed in earlier locations, even when the item was forced very late in randomization. For example, before this setting was added, the depth priority transform produced a seed where Spore Shroom was placed very late, and then in a subsequent step, Lurien, Monomon, and Herrah were all put in Spore Shroom-required lore tablets. With this setting, the effect of the depth priority transform would not have to be the same for all 3 dreamers, and so it would be less likely to produce such a predictable placement. - -The Priority Transform Type controls how the location priority is modified according to the location depth (subject to the interactions above). In general, with a Priority Transform Coefficient *a* and a Transform Type corresponding to a function *f* (identity, square, square root, natural log), the formula is *newPriority = oldPriority - (a/100)\*f(depth)*. - -The above comments all extend to transitions accordingly, where "items" are target transitions and "locations" are source transitions. - -### Duplicate Item Settings - -These settings control which important items are duplicated. Duplicate items generated by the randomizer are modified to be invisible to logic, and may be penalized in randomization depending on the Progression Depth Settings. **When there are not enough locations for the number of items, extra locations are created from the randomized shops**, meaning normal shops, Grubfather, Seer, or Egg Shop. If somehow none of these shops are present in the randomization group, extra copies of Sly are added. - -However, there is one important exception: the default Simple Key Handling is to create two Simple Keys which are identical to normal Simple Keys. This increases the odds of Simple Key progression, to make up for the fact that all Simple Key locks require 4 Simple Keys in logic in Randomizer 4. - -### Split Group Randomizer Settings - -These settings allow controlling the randomization groups. Normally, items and locations are randomized in one group, so that any item can end up at any location. With split groups, the items in a group can only end up at the locations of that group. **These settings do not control which items and locations are randomized**--for that, see Pool Settings. Rather, these settings control what group an item or location would be placed in if it were randomized. - -The settings consist of numeric fields for each pool. -- Entering -1 for a pool will cause that pool to be ignored by split group rando. -- Entering 0 for a pool will put that pool in the main randomization group. -- Entering a positive number for a pool will put that pool in a new randomization group for that number. -Items or locations in more than one pool, such as shops, will be randomly divided among the groups, weighted by their initial distribution. -- The difference between entering -1 and entering 0 is that the items and locations in a pool with -1 will not factor into the weighting. This can be important for compatibility with other mods which edit randomization groups. - -In summary, use these settings to arrange pools so that the pools with the same number are randomized with each other. - -The Randomize On Start option sets each pool setting to one of 0, 1, or 2, randomly and uniformly. Randomization is only applied to pools which were already set to one of 0, 1, or 2, to allow selecting pools to be unaffected by randomization. -- It is recommended to disable Duplicate Items with this setting. If skills end up in a group with few locations, there is a high likelihood of several skills being forced into a shop. - -The definitions used for these settings are slightly broader than those in pool settings, to accomodate other settings that add items: -- Dreamers -- Skills, including split skills, Swim, Focus -- Charms -- Keys: City Crest, Lumafly Lantern, Tram Pass, Simple Keys, Shopkeeper's Key, Elegant Key, Love Key, King's Brand, Godtuner, and Collector's Map -- Mask Shards -- Vessel Fragments -- Charm Notches, including Salubra Notches -- Pale Ore -- Geo Chests, including Junk Pit Chests -- Rancid Eggs -- Relics -- Whispering Roots -- Boss Essence -- Grubs -- Mimics -- Maps -- Stags -- Lifeblood Cocoons -- Grimmkin Flames -- Journal Entries -- Geo Rocks -- Boss Geo -- Soul Totems -- Lore Tablets diff --git a/RandomizerMod.sln b/RandomizerMod.sln deleted file mode 100644 index b597c24..0000000 --- a/RandomizerMod.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.5.33530.505 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RandomizerMod", "RandomizerMod\RandomizerMod.csproj", "{8B1AB441-2E8A-49EB-87BD-8E1C9729AD00}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RandomizerModTests", "RandomizerModTests\RandomizerModTests.csproj", "{5167F8F2-9E73-473B-B039-F03CC1499702}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {8B1AB441-2E8A-49EB-87BD-8E1C9729AD00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8B1AB441-2E8A-49EB-87BD-8E1C9729AD00}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8B1AB441-2E8A-49EB-87BD-8E1C9729AD00}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8B1AB441-2E8A-49EB-87BD-8E1C9729AD00}.Release|Any CPU.Build.0 = Release|Any CPU - {5167F8F2-9E73-473B-B039-F03CC1499702}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5167F8F2-9E73-473B-B039-F03CC1499702}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5167F8F2-9E73-473B-B039-F03CC1499702}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5167F8F2-9E73-473B-B039-F03CC1499702}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {37A3DAA4-C744-471C-BD9D-9DF4229E8EFC} - EndGlobalSection -EndGlobal diff --git a/RandomizerMod/Extensions/ICExtensions.cs b/RandomizerMod/Extensions/ICExtensions.cs deleted file mode 100644 index 07dd948..0000000 --- a/RandomizerMod/Extensions/ICExtensions.cs +++ /dev/null @@ -1,66 +0,0 @@ -using ItemChanger; -using RandomizerMod.IC; -using RandomizerMod.RC; - -namespace RandomizerMod.Extensions -{ - /// - /// Extensions for accessing randomizer data from IC classes. - /// - public static class ICExtensions - { - /// - /// Enumerates the ItemPlacements indicated by the placement's RandoPlacementTag. - ///
Returns an empty enumerable if the placement does not have a tag. - ///
- public static IEnumerable RandoPlacements(this AbstractPlacement placement) - { - if (placement.GetTag(out RandoPlacementTag tag)) - { - return tag.ids.Select(id => RandomizerMod.RS.Context.itemPlacements[id]); - } - return Enumerable.Empty(); - } - - /// - /// Gets a RandoModLocation corresponding to the placement's RandoPlacementTag. Returns null if the placement does not have a tag. - ///
Warning: different RandoModLocations corresponding to the same placement may have different behavior due to costs. - ///
- public static RandoModLocation? RandoLocation(this AbstractPlacement placement) - { - if (placement.GetTag(out RandoPlacementTag tag)) - { - return RandomizerMod.RS.Context.itemPlacements[tag.ids.First()].Location; - } - return null; - } - - /// - /// Gets the ItemPlacement indicated by the item's RandoItemTag. Returns default if the item does not have a tag. - /// - public static ItemPlacement RandoPlacement(this AbstractItem item) - { - if (item.GetTag(out RandoItemTag tag)) - { - return RandomizerMod.RS.Context.itemPlacements[tag.id]; - } - return default; - } - - /// - /// Gets the RandoModItem corresponding to the item's RandoItemTag. Returns null if the item does not have a tag. - /// - public static RandoModItem? RandoItem(this AbstractItem item) - { - return item.RandoPlacement().Item; - } - - /// - /// Gets the RandoModLocation corresponding to the item's RandoItemTag. Returns null if the item does not have a tag. - /// - public static RandoModLocation? RandoLocation(this AbstractItem item) - { - return item.RandoPlacement().Location; - } - } -} diff --git a/RandomizerMod/Extensions/StringExtensions.cs b/RandomizerMod/Extensions/StringExtensions.cs deleted file mode 100644 index 6ea0d75..0000000 --- a/RandomizerMod/Extensions/StringExtensions.cs +++ /dev/null @@ -1,38 +0,0 @@ -namespace RandomizerMod.Extensions -{ - public static class StringExtensions - { - public static int GetStableHashCode(this string str) - { - unchecked - { - int hash1 = 5381; - int hash2 = hash1; - - for (int i = 0; i < str.Length && str[i] != '\0'; i += 2) - { - hash1 = ((hash1 << 5) + hash1) ^ str[i]; - if (i == str.Length - 1 || str[i + 1] == '\0') - break; - hash2 = ((hash2 << 5) + hash2) ^ str[i + 1]; - } - - return hash1 + (hash2 * 1566083941); - } - } - - public static bool TryToEnum(this string self, out T val) where T : Enum - { - try - { - val = (T)Enum.Parse(typeof(T), self); - return true; - } - catch - { - val = default; - return false; - } - } - } -} diff --git a/RandomizerMod/IC/CostConversion.cs b/RandomizerMod/IC/CostConversion.cs deleted file mode 100644 index c6fbf0c..0000000 --- a/RandomizerMod/IC/CostConversion.cs +++ /dev/null @@ -1,171 +0,0 @@ -using ItemChanger; -using ItemChanger.Placements; -using ItemChanger.Tags; -using RandomizerCore.Logic; -using RandomizerMod.RC; - -namespace RandomizerMod.IC -{ - public static class CostConversion - { - public static void HandleCosts(ICFactory factory, List lcs, AbstractItem i, AbstractPlacement p) - { - List existingCosts = new(); - bool includeNoninherentCosts = (p as ISingleCostPlacement)?.Cost == null; - - existingCosts.AddRange(p.GetTags().Where(t => t.Inherent || includeNoninherentCosts).Select(t => t.Cost)); - if (p is IPrimaryLocationPlacement ip) existingCosts.AddRange(ip.Location.GetTags().Where(t => t.Inherent || includeNoninherentCosts).Select(t => t.Cost)); - - if (p is IMultiCostPlacement) - { - if (i.GetOrAddTag().Cost is Cost c) existingCosts.Add(c); - - foreach (LogicCost lc in lcs) - { - Cost cost = Convert(factory, lc); - if (IsRequiredCost(existingCosts, cost)) - { - i.GetTag().Cost += cost; - } - } - } - else if (p is ISingleCostPlacement iscp) - { - if (iscp.Cost != null) existingCosts.Add(iscp.Cost); - - foreach (LogicCost lc in lcs) - { - Cost cost = Convert(factory, lc); - if (IsRequiredCost(existingCosts, cost)) - { - iscp.Cost += cost; - } - } - } - else - { - if (lcs.Select(lc => (lc, Convert(factory, lc))).FirstOrDefault(p => IsRequiredCost(existingCosts, p.Item2)) is (LogicCost lc, Cost cost)) - { - throw new InvalidOperationException($"Attached required cost {lc} to placement {p.Name} which does not support costs!"); - } - } - } - - public static bool IsRequiredCost(List existingCosts, Cost newCost) => existingCosts.All(c => !c.Includes(newCost)); - - public static Cost Convert(ICFactory factory, LogicCost lc) => factory.rb.TryConvertCost(lc, out Cost cost) ? cost : Convert(lc); - public static Cost Convert(ICFactory factory, IEnumerable lcs) => lcs?.Aggregate(null, (Cost c, LogicCost lc) => c + Convert(factory, lc)); - - /// - /// The base randomizer cost conversion. The overload with ICFactory is preferred for most usage since it allows connections to convert custom costs. - /// - public static Cost Convert(LogicCost cost) - { - if (cost is SimpleCost sc) - { - switch (sc.term.Name) - { - case "ESSENCE": - return Cost.NewEssenceCost(sc.threshold); - case "GRUBS": - return Cost.NewGrubCost(sc.threshold); - case "RANCIDEGGS": - return new ItemChanger.Modules.CumulativeRancidEggCost(sc.threshold); - case "GEO": - return Cost.NewGeoCost(sc.threshold); - - case "SIMPLE": // not actually used, since godtuner no longer requires a separate cost - return new ConsumablePDIntCost(1, nameof(PlayerData.simpleKeys), "Use 1 Simple Key"); - - case "Spore_Shroom": // not actually used, since lore tablet locations no longer become shiny - return new PDBoolCost(nameof(PlayerData.equippedCharm_17), "Requires Spore Shroom Equipped"); - - case "CHARMS": - return new PDIntCost(sc.threshold, nameof(PlayerData.charmsOwned), $"Once you own {sc.threshold} charm{(sc.threshold != 1 ? "s" : "")}, I'll gladly sell it to you."); - - case "DREAMNAIL": - return new PDBoolCost(nameof(PlayerData.hasDreamNail), "Requires Dream Nail"); - - case "SCREAM": - return new PDIntCost(sc.threshold, nameof(PlayerData.screamLevel), "Requires Howling Wraiths"); - } - } - - if (cost is RC.LogicGeoCost gc) - { - return Cost.NewGeoCost(gc.GeoAmount); - } - - throw new NotSupportedException($"Cost {cost} conversion is not supported."); - } - - /// - /// The base randomizer cost conversion. The overload with ICFactory is preferred for most usage since it allows connections to convert custom costs. - /// - public static Cost Convert(IEnumerable costs) - { - if (costs == null) return null; - return costs.Aggregate(null, (Cost c, LogicCost d) => c + Convert(d)); - } - - - - [Obsolete("Use overload of HandleCosts with ICFactory parameter")] - public static void HandleCosts(List lcs, AbstractItem i, AbstractPlacement p) - { - List existingCosts = new(); - bool includeNoninherentCosts = (p as ISingleCostPlacement)?.Cost == null; - - existingCosts.AddRange(p.GetTags().Where(t => t.Inherent || includeNoninherentCosts).Select(t => t.Cost)); - if (p is IPrimaryLocationPlacement ip) existingCosts.AddRange(ip.Location.GetTags().Where(t => t.Inherent || includeNoninherentCosts).Select(t => t.Cost)); - - if (p is IMultiCostPlacement) - { - if (i.GetOrAddTag().Cost is Cost c) existingCosts.Add(c); - - foreach (LogicCost lc in lcs) - { - if (TryToRequiredCost(lc, existingCosts, out Cost cost)) - { - i.GetTag().Cost += cost; - } - } - } - else if (p is ISingleCostPlacement iscp) - { - if (iscp.Cost != null) existingCosts.Add(iscp.Cost); - - foreach (LogicCost lc in lcs) - { - if (TryToRequiredCost(lc, existingCosts, out Cost cost)) - { - iscp.Cost += cost; - } - } - } - else - { - if (lcs.Any(lc => TryToRequiredCost(lc, existingCosts, out _))) - { - throw new InvalidOperationException($"Attached cost {lcs[0]} to placement {p.Name} which does not support costs!"); - } - } - } - [Obsolete("Use IsRequiredCost")] - public static bool TryToRequiredCost(LogicCost lc, List existingCosts, out Cost newCost) - { - Cost cost = Convert(lc); - - if (existingCosts.Any(c => c.Includes(cost))) - { - newCost = null; - return false; - } - else - { - newCost = cost; - return true; - } - } - } -} diff --git a/RandomizerMod/IC/DupeUIDef.cs b/RandomizerMod/IC/DupeUIDef.cs deleted file mode 100644 index 4562782..0000000 --- a/RandomizerMod/IC/DupeUIDef.cs +++ /dev/null @@ -1,66 +0,0 @@ -using ItemChanger; -using ItemChanger.UIDefs; -using UnityEngine; - -namespace RandomizerMod.IC -{ - /// - /// Class for converting an arbitrary UIDef on a redundant item to a MsgUIDef which displays the amount of geo replacing the item. - /// - public class DupeUIDef : MsgUIDef - { - public static MsgUIDef Convert(int geoAmount, UIDef orig) - { - if (orig is MsgUIDef msgDef) - { - return new SplitUIDef - { - preview = new BoxedString(msgDef.GetPreviewName()), - name = new BoxedString($"{geoAmount} ({msgDef.GetPostviewName()})"), - shopDesc = msgDef.shopDesc?.Clone(), - sprite = msgDef.sprite?.Clone(), - }; - } - else return new DupeUIDef(geoAmount, orig); - } - - private DupeUIDef(int geoAmount, UIDef inner) - { - GeoAmount = geoAmount; - Inner = inner; - - if (inner is null) - { - base.name = new BoxedString($"{GeoAmount} (Dupe)"); - base.shopDesc = new BoxedString(""); - base.sprite = new ItemChangerSprite("ShopIcons.Geo"); - } - else - { - // these fields will not be accessed normally, but should still have values for compatibility - base.name = new BoxedString($"{GeoAmount} Geo ({inner?.GetPostviewName()})"); - base.shopDesc = new BoxedString(inner?.GetShopDesc()); - base.sprite = new EmptySprite(); - } - } - - public int GeoAmount; - public UIDef Inner; - public override Sprite GetSprite() => Inner is not null - ? Inner.GetSprite() - : base.GetSprite(); - public override string GetPreviewName() => Inner is not null - ? Inner.GetPreviewName() - : base.GetPreviewName(); - public override string GetPostviewName() => Inner is not null - ? $"{GeoAmount} Geo ({Inner?.GetPostviewName()})" - : base.GetPostviewName(); - public override string GetShopDesc() => Inner is not null - ? Inner.GetShopDesc() - : base.GetShopDesc(); - public override UIDef Clone() - { - return new DupeUIDef(GeoAmount, Inner); - } - } -} diff --git a/RandomizerMod/IC/Export.cs b/RandomizerMod/IC/Export.cs deleted file mode 100644 index 5cc6d75..0000000 --- a/RandomizerMod/IC/Export.cs +++ /dev/null @@ -1,160 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using ItemChanger; -using SD = ItemChanger.Util.SceneDataUtil; -using RandomizerMod.RandomizerData; -using RandomizerMod.Settings; -using static RandomizerMod.LogHelper; -using RandomizerCore; -using RandomizerMod.RC; - -namespace RandomizerMod.IC -{ - public static class Export - { - public static void BeginExport(GenerationSettings gs, RandoModContext ctx) - { - ItemChangerMod.CreateSettingsProfile(overwrite: true); - ItemChangerMod.Modules.Add(); - ItemChangerMod.Modules.Add(); - ItemChangerMod.Modules.Add(); - ItemChangerMod.Modules.Add(); - ItemChangerMod.Modules.Add(); - var cpo = ItemChangerMod.Modules.Add(); - cpo.CoupledTransitions = gs.TransitionSettings.Coupled; - ItemChangerMod.Modules.Add(); - if (gs.MiscSettings.RandomizeNotchCosts) - { - ItemChangerMod.Modules.Add(); - } - if (!gs.PoolSettings.GrimmkinFlames) - { - ItemChangerMod.Modules.Get().TrackGrimmkinFlames = false; - } - if (gs.MiscSettings.SalubraNotches == MiscSettings.SalubraNotchesSetting.AutoGivenAtCharmThreshold) - { - ItemChangerMod.Modules.Add(); - } - if (gs.SkipSettings.EnemyPogos) - { - ItemChangerMod.Modules.Add(); - } - - HashSet sourceNames = new(ctx.transitionPlacements.Select(x => x.Source.Name)); - HashSet targetNames = new(ctx.transitionPlacements.Select(x => x.Target.Name)); - if (targetNames.Contains($"{SceneNames.White_Palace_18}[top1]") - || targetNames.Contains($"{SceneNames.White_Palace_17}[right1]") - || targetNames.Contains($"{SceneNames.White_Palace_19}[top1]")) - { - ItemChangerMod.Modules.Add(); - } - - var pde = ItemChangerMod.Modules.GetOrAdd(); - - for (int i = 0; i < ctx.notchCosts.Count; i++) pde.AddPDEdit($"charmCost_{i + 1}", ctx.notchCosts[i]); - if (gs.CursedSettings.CursedNotches > 0) - { - pde.AddPDEdit(nameof(PlayerData.charmSlots), 3 - gs.CursedSettings.CursedNotches); - } - if (gs.CursedSettings.CursedMasks > 0) - { - pde.AddPDEdit(nameof(PlayerData.maxHealth), 5 - gs.CursedSettings.CursedMasks); - pde.AddPDEdit(nameof(PlayerData.maxHealthBase), 5 - gs.CursedSettings.CursedMasks); - } - if (gs.MiscSettings.SteelSoul) - { - pde.AddPDEdit(nameof(PlayerData.permadeathMode), 1); - } - if (gs.MiscSettings.FireballUpgrade == MiscSettings.ToggleableFireballSetting.Deferred) - { - var tf = ItemChangerMod.Modules.GetOrAdd(); - tf.isDeferred = true; - tf.onewayToggle = true; - } - if (gs.MiscSettings.FireballUpgrade == MiscSettings.ToggleableFireballSetting.Toggleable) - { - var tf = ItemChangerMod.Modules.GetOrAdd(); - tf.isDeferred = false; - tf.onewayToggle = false; - } - } - - - public static void ExportStart(GenerationSettings gs, RandoModContext ctx) - { - if (ctx.StartDef?.ToItemChangerStartDef() is ItemChanger.StartDef def) - { - ItemChangerMod.ChangeStartGame(def); - } - - foreach (SmallPlatform p in PlatformList.GetPlatformList(gs, ctx)) ItemChangerMod.AddDeployer(p); - - switch (gs.StartLocationSettings.StartLocation) - { - // Platforms to allow escaping the Hive start regardless of difficulty or initial items - case "Hive": - ItemChangerMod.AddDeployer(new SmallPlatform { SceneName = SceneNames.Hive_03, X = 58.5f, Y = 134f, Test = PlatformList.lacksRightClaw }); - ItemChangerMod.AddDeployer(new SmallPlatform { SceneName = SceneNames.Hive_03, X = 58.5f, Y = 138.5f, Test = PlatformList.lacksAnyVertical }); - break; - - // Drop the vine platforms and add small platforms for jumping up. - case "Far Greenpath": - ItemChangerMod.AddDeployer(new SmallPlatform { SceneName = SceneNames.Fungus1_13, X = 45f, Y = 16.5f, Test = PlatformList.lacksLeftClaw }); - ItemChangerMod.AddDeployer(new SmallPlatform { SceneName = SceneNames.Fungus1_13, X = 64f, Y = 16.5f, Test = PlatformList.lacksRightClaw }); - SD.Save(SceneNames.Fungus1_13, "Vine Platform (1)"); - SD.Save(SceneNames.Fungus1_13, "Vine Platform (2)"); - break; - - // With the Lower Greenpath start, getting to the rest of Greenpath requires - // cutting the vine to the right of the vessel fragment. - case "Lower Greenpath": - if (gs.NoveltySettings.RandomizeNail) SD.Save(SceneNames.Fungus1_13, "Vine Platform"); - break; - } - } - - public static void ExportItemPlacements(RequestBuilder rb, IReadOnlyList itemPlacements) - { - Dictionary export = new(); - ICFactory factory = new(rb, export); - - foreach (ItemPlacement p in itemPlacements) - { - factory.HandlePlacement(p.Index, p.Item, p.Location); - } - - ItemChangerMod.AddPlacements(export.Select(kvp => kvp.Value)); - } - - public static void ExportTransitionPlacements(RequestBuilder rb, IEnumerable ps) - { - foreach ((RandoModTransition target, RandoModTransition source) in ps) - { - ITransition realTarget; - Transition realSource; - if (target.info?.realTargetCreator != null) - { - realTarget = target.info.realTargetCreator(rb, new(target, source)); - } - else - { - realTarget = new Transition(target.TransitionDef.SceneName, target.TransitionDef.DoorName); - } - - if (source.info?.realSourceCreator != null) - { - realSource = source.info.realSourceCreator(rb, new(target, source)); - } - else - { - realSource = new Transition(source.TransitionDef.SceneName, source.TransitionDef.DoorName); - } - - ItemChangerMod.AddTransitionOverride(realSource, realTarget); - } - } - } -} diff --git a/RandomizerMod/IC/GSComparison.cs b/RandomizerMod/IC/GSComparison.cs deleted file mode 100644 index 32556b6..0000000 --- a/RandomizerMod/IC/GSComparison.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using ItemChanger; -using RandomizerMod.Settings; - -namespace RandomizerMod.IC -{ - /// - /// Compare a settings field to a given value. - /// - public class GSComparison : IBool where T : IComparable - { - /// - /// Dot separators: e.g. SkipSettings.MildSkips - /// - public string FieldPath { get; init; } - - public T Target { get; init; } - - public ComparisonOperator Op { get; init; } = ComparisonOperator.Eq; - - public bool Value => ItemChanger.Extensions.Extensions.Compare((T)RandomizerMod.RS.GenerationSettings.Get(FieldPath), Op, Target); - - public IBool Clone() => (IBool)MemberwiseClone(); - - public GSComparison() { } - - public GSComparison(string fieldName) - { - FieldPath = Util.GetPath(fieldName); - } - } -} diff --git a/RandomizerMod/IC/Grubfather.cs b/RandomizerMod/IC/Grubfather.cs deleted file mode 100644 index 60ad3b2..0000000 --- a/RandomizerMod/IC/Grubfather.cs +++ /dev/null @@ -1,44 +0,0 @@ -using ItemChanger; -using RandomizerMod.Settings; -using RandomizerMod.RC; -using ItemChanger.Locations; - -namespace RandomizerMod.IC -{ - public static class Grubfather - { - public static AbstractPlacement GetGrubfatherPlacement(ICFactory factory) - { - AbstractPlacement p = factory.MakeLocation(LocationNames.Grubfather).Wrap(); - p.AddTag().destroyRewards = GetRandomizedGrubRewards(factory.gs); - return p; - } - - public static GrubfatherRewards GetRandomizedGrubRewards(GenerationSettings gs) - { - GrubfatherRewards gr = GrubfatherRewards.None; - if (gs.PoolSettings.Charms) - { - gr |= GrubfatherRewards.Grubsong | GrubfatherRewards.GrubberflysElegy; - } - if (gs.PoolSettings.MaskShards) - { - gr |= GrubfatherRewards.MaskShard; - } - if (gs.PoolSettings.PaleOre) - { - gr |= GrubfatherRewards.PaleOre; - } - if (gs.PoolSettings.Relics) - { - gr |= GrubfatherRewards.HallownestSeal | GrubfatherRewards.KingsIdol; - } - if (gs.PoolSettings.RancidEggs) - { - gr |= GrubfatherRewards.RancidEgg; - } - - return gr; - } - } -} diff --git a/RandomizerMod/IC/HelperLogModule.cs b/RandomizerMod/IC/HelperLogModule.cs deleted file mode 100644 index 697b7a4..0000000 --- a/RandomizerMod/IC/HelperLogModule.cs +++ /dev/null @@ -1,177 +0,0 @@ -using ItemChanger; -using ItemChanger.Modules; -using RandomizerMod.Logging; -using RandomizerMod.Settings; -using System.Text; - -namespace RandomizerMod.IC -{ - public class HelperLogModule : Module - { - public override ModuleHandlingFlags ModuleHandlingProperties { get; set; } = ModuleHandlingFlags.AllowDeserializationFailure; - - private void PrintHelper() - { - if (!ready) return; - - LogManager.Write(BuildHelper(), "HelperLog.txt"); - LogManager.Write(TD.pm.Dump(), "TrackerDataPM.txt"); - LogManager.Write(TD_WSB.pm.Dump(), "TrackerDataWithoutSequenceBreaksPM.txt"); - LogManager.Write(RandomizerData.JsonUtil.Serialize(TD), "TrackerData.json"); - LogManager.Write(RandomizerData.JsonUtil.Serialize(TD_WSB), "TrackerDataWithoutSequenceBreaks.json"); - } - - private TrackerData TD => RandomizerMod.RS.TrackerData; - private TrackerData TD_WSB => RandomizerMod.RS.TrackerDataWithoutSequenceBreaks; - private bool ready = false; - - public override void Initialize() - { - if (RandomizerMod.RS is null || TD is null || TD_WSB is null) throw new InvalidOperationException("Missing randomizer data."); - RandomizerModule.OnLoadComplete += SetUpLog; - TrackerUpdate.OnFinishedUpdate += PrintHelper; - } - - public override void Unload() - { - RandomizerModule.OnLoadComplete -= SetUpLog; - TrackerUpdate.OnFinishedUpdate -= PrintHelper; - } - - private string GetItemPreviewName(int id) - { - return RandomizerModule.Items[id] - .GetResolvedUIDef() - .GetPreviewName(); - } - - private AbstractPlacement GetPlacement(string name) - { - return ItemChanger.Internal.Ref.Settings.Placements[name]; - } - - private bool IsPersistent(int id) - { - return RandomizerModule.Items[id] - .GetTags() - .Any(t => t is not ItemChanger.Tags.PersistentItemTag { Persistence: Persistence.Single }); - } - - private void SetUpLog() - { - ready = true; - PrintHelper(); - } - - private string BuildHelper() - { - StringBuilder sb = new(); - TrackerData td = TD; - TrackerData tdwsb = TD_WSB; - - sb.AppendLine("UNCHECKED REACHABLE LOCATIONS"); - foreach (string s in td.uncheckedReachableLocations - .Where(s => tdwsb.uncheckedReachableLocations.Contains(s)).OrderBy(s => s)) // alphabetical. The locations are permuted after rando, but order could still give info regarding multi loc frequencies - { - sb.Append(' ', 2); - sb.AppendLine(s); - } - foreach (string s in td.uncheckedReachableLocations - .Where(s => !tdwsb.uncheckedReachableLocations.Contains(s)).OrderBy(s => s)) - { - sb.Append(' ', 2); - sb.Append('*'); // sequence broken - sb.AppendLine(s); - } - sb.AppendLine(); - - var previewLookup = Enumerable.Range(0, td.ctx.itemPlacements.Count) - .Where(i => !td.obtainedItems.Contains(i) && td.previewedLocations.Contains(td.ctx.itemPlacements[i].Location.Name)) - .ToLookup(i => td.ctx.itemPlacements[i].Location.Name); - sb.AppendLine("PREVIEWED LOCATIONS"); - foreach (string s in td.previewedLocations) - { - sb.Append(' ', 2); - sb.AppendLine(s); - AbstractPlacement p = GetPlacement(s); - if (p.GetTag() is ItemChanger.Tags.MultiPreviewRecordTag mprt - && mprt.previewTexts != null) - { - for (int i = 0; i < mprt.previewTexts.Length; i++) - { - string t = mprt.previewTexts[i]; - if (!string.IsNullOrEmpty(t) && i < p.Items.Count && !p.Items[i].WasEverObtained()) - { - sb.Append(' ', 4); - sb.AppendLine(t); - } - } - } - else if (p.GetTag() is ItemChanger.Tags.PreviewRecordTag prt - && !string.IsNullOrEmpty(prt.previewText) && !p.Items.All(i => i.WasEverObtained())) - { - sb.Append(' ', 4); - sb.AppendLine(prt.previewText); - } - } - sb.AppendLine(); - - if (td.ctx.transitionPlacements.Count > 0) - { - sb.AppendLine("UNCHECKED REACHABLE TRANSITIONS"); - foreach (string s in td.uncheckedReachableTransitions - .Where(s => tdwsb.uncheckedReachableTransitions.Contains(s))) - { - sb.Append(' ', 2); - sb.AppendLine(s); - } - foreach (string s in td.uncheckedReachableTransitions - .Where(s => !tdwsb.uncheckedReachableTransitions.Contains(s))) - { - sb.Append(' ', 2); - sb.Append('*'); // sequence broken transition - sb.AppendLine(s); - } - sb.AppendLine(); - - sb.AppendLine("CHECKED TRANSITIONS"); - foreach (var kvp in td.visitedTransitions) - { - sb.Append(' ', 2); - if (tdwsb.outOfLogicVisitedTransitions.Contains(kvp.Key)) sb.Append('*'); // sequence broken transition - sb.AppendLine($"{kvp.Key} --> {kvp.Value}"); - } - sb.AppendLine(); - } - - List persistentItems = td.obtainedItems.Where(i => IsPersistent(i)).ToList(); - if (persistentItems.Count != 0) - { - sb.AppendLine("RESPAWNING ITEMS"); - foreach (int i in persistentItems) - { - sb.Append(' ', 2); - sb.Append(td.ctx.itemPlacements[i].Location.Name); - sb.Append(" - "); - sb.AppendLine(GetItemPreviewName(i)); - } - sb.AppendLine(); - } - - if (td.reachableVanillaPlacements.Count != 0) - { - sb.AppendLine("REACHABLE VANILLA PLACEMENTS"); - foreach (int id in td.reachableVanillaPlacements) - { - sb.Append(' ', 2); - if (!tdwsb.reachableVanillaPlacements.Contains(id)) sb.Append('*'); - string locationName = td.ctx.Vanilla[id].Location.Name; - string itemName = td.ctx.Vanilla[id].Item.Name; - sb.Append(itemName).Append(" at ").Append(locationName).AppendLine(); - } - } - - return sb.ToString(); - } - } -} diff --git a/RandomizerMod/IC/NailUpgradeWarningModule.cs b/RandomizerMod/IC/NailUpgradeWarningModule.cs deleted file mode 100644 index dfed85d..0000000 --- a/RandomizerMod/IC/NailUpgradeWarningModule.cs +++ /dev/null @@ -1,76 +0,0 @@ -using ItemChanger; -using ItemChanger.Modules; - -namespace RandomizerMod.IC -{ - /* From LOGIC_README.md: - - With skips allowed, the player is advised to take care to not get locked out of certain required pogos. Obtain: - - No more than 1 nail upgrade before claw or wings - - No more than 3 nail upgrades before claw - - In Split Claw mode, instead obtain no more than 2 nail upgrades with only a single claw piece, and any number of nail upgrades with a single claw piece as well as wings - */ - - public class NailUpgradeWarningModule : Module - { - public override void Initialize() - { - ToggleLanguageHook(true); - } - - public override void Unload() - { - ToggleLanguageHook(false); - } - - private void ToggleLanguageHook(bool toggle) - { - if (toggle) - { - Events.AddLanguageEdit(new("Nailsmith", "NAILSMITH_OFFER_ORE"), NailUpgradeWarning); - } - else - { - Events.RemoveLanguageEdit(new("Nailsmith", "NAILSMITH_OFFER_ORE"), NailUpgradeWarning); - } - } - - private static void NailUpgradeWarning(ref string s) - { - bool claw = PlayerData.instance.GetBool(nameof(PlayerData.hasWalljump)); - bool wings = PlayerData.instance.GetBool(nameof(PlayerData.hasDoubleJump)); - SplitClaw? scm = ItemChangerMod.Modules.Get(); - int level = PlayerData.instance.GetInt(nameof(PlayerData.nailSmithUpgrades)); - const int repetitions = 10; - - switch (level + 1) - { - case >= 2 when !(claw || wings || scm is not null && scm.hasWalljumpAny): - CreateMessage( - Localize("WARNING -- obtaining more than one nail upgrade before collecting one of Mantis Claw or Monarch Wings may lock out required enemy pogos!"), - repetitions, ref s); - break; - case >= 3 when scm is not null && !(scm.hasWalljumpAny && wings || scm.hasWalljumpBoth): - CreateMessage( - Localize("WARNING -- obtaining more than two nail upgrades before collecting two out of three of Left Mantis Claw, Right Mantis Claw, and Monarch Wings may lock out required enemy pogos!"), - repetitions, ref s); - break; - case >= 4 when !(claw && wings): - CreateMessage( - Localize("WARNING -- obtaining more than three nail upgrades before collecting both Mantis Claw and Monarch Wings may lock out required enemy pogos!"), - repetitions, ref s); - break; - } - } - - private static void CreateMessage(string warning, int times, ref string result) - { - result = string.Empty; - for (int i = 0; i < times - 1; i++) - { - result += warning + $" ({i + 1}/{times})" + ""; - } - result += warning + $" ({times}/{times})"; - } - - } -} diff --git a/RandomizerMod/IC/PlatformList.cs b/RandomizerMod/IC/PlatformList.cs deleted file mode 100644 index b1a377b..0000000 --- a/RandomizerMod/IC/PlatformList.cs +++ /dev/null @@ -1,144 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using ItemChanger; -using RandomizerCore; -using RandomizerMod.RC; -using RandomizerMod.Settings; - -namespace RandomizerMod.IC -{ - public static class PlatformList - { - public static IBool hasWalljump = new PDBool(nameof(PlayerData.hasWalljump)); - public static IBool hasWalljumpLeft = new PDBool(nameof(ItemChanger.Modules.SplitClaw.hasWalljumpLeft)); - public static IBool hasWalljumpRight = new PDBool(nameof(ItemChanger.Modules.SplitClaw.hasWalljumpRight)); - public static IBool hasDoubleJump = new PDBool(nameof(PlayerData.hasDoubleJump)); - - public static IBool lacksLeftClaw = new Negation(new Disjunction(hasWalljump, hasWalljumpLeft)); - public static IBool lacksLeftVertical = new Negation(new Disjunction(hasWalljump, hasDoubleJump, hasWalljumpLeft)); - public static IBool lacksRightClaw = new Negation(new Disjunction(hasWalljump, hasWalljumpRight)); - public static IBool lacksRightVertical = new Negation(new Disjunction(hasWalljump, hasDoubleJump, hasWalljumpRight)); - public static IBool lacksAnyClaw = new Negation(new Disjunction(hasWalljump, hasWalljumpLeft, hasWalljumpRight)); - public static IBool lacksAnyVertical = new Negation(new Disjunction(hasWalljump, hasDoubleJump, hasWalljumpLeft, hasWalljumpRight)); - - public static List GetPlatformList(GenerationSettings gs, RandoModContext ctx) - { - HashSet targetNames = new(ctx.transitionPlacements.Select(x => x.Target.Name)); - - List plats = new(); - - if (!gs.MiscSettings.ExtraPlatforms) return plats; - - // Platforms to climb out from basin wanderer's journal - plats.Add(new() { SceneName = SceneNames.Abyss_02, X = 128.3f, Y = 7f, Test = lacksLeftClaw }); - plats.Add(new() { SceneName = SceneNames.Abyss_02, X = 128.3f, Y = 11f, Test = lacksLeftClaw }); - - // Platforms to climb up to tram in basin from left with no items - if (!targetNames.Contains($"{SceneNames.Abyss_03}[bot1]")) - { - plats.Add(new() { SceneName = SceneNames.Abyss_03, X = 34f, Y = 7f, Test = lacksRightVertical }); - } - - // Platform to climb out of Abyss with only wings - if (gs.TransitionSettings.Mode == TransitionSettings.TransitionMode.None || gs.TransitionSettings.Coupled) - { - plats.Add(new() { SceneName = SceneNames.Abyss_06_Core, X = 88.6f, Y = 263f, Test = lacksLeftClaw }); - } - - // Platforms to climb back up from pale ore with no items - plats.Add(new() { SceneName = SceneNames.Abyss_17, X = 164.7f, Y = 30f, Test = lacksRightVertical }); - plats.Add(new() { SceneName = SceneNames.Abyss_17, X = 99.5f, Y = 12.5f, Test = lacksRightVertical }); - plats.Add(new() { SceneName = SceneNames.Abyss_17, X = 117.7f, Y = 18.8f, Test = lacksRightClaw }); - plats.Add(new() { SceneName = SceneNames.Abyss_17, X = 114.3f, Y = 23f, Test = lacksAnyVertical }); - plats.Add(new() { SceneName = SceneNames.Abyss_17, X = 117.7f, Y = 7f, Test = lacksAnyClaw }); - plats.Add(new() { SceneName = SceneNames.Abyss_17, X = 117.7f, Y = 10.8f, Test = lacksAnyClaw }); - - // Platforms to remove softlock with wings at simple key in basin - plats.Add(new() { SceneName = SceneNames.Abyss_20, X = 26.5f, Y = 13f, Test = lacksAnyClaw }); - - // Platform for returning to Gorb landing - plats.Add(new() { SceneName = SceneNames.Cliffs_02, X = 32.3f, Y = 27.7f, Test = lacksAnyVertical }); - - // Platform to return from Deepnest mimic grub room - if (!targetNames.Contains($"{SceneNames.Deepnest_01b}[right2]") - && !targetNames.Contains($"{SceneNames.Deepnest_02}[left1]") - && !targetNames.Contains($"{SceneNames.Deepnest_02}[right1]")) - { - plats.Add(new() { SceneName = SceneNames.Deepnest_01b, X = 48.3f, Y = 40f, Test = lacksAnyVertical }); - } - - // Platforms to return from the Deepnest_02 geo rocks without vertical - plats.Add(new() { SceneName = SceneNames.Deepnest_02, X = 26f, Y = 12f, Test = lacksAnyClaw }); - plats.Add(new() { SceneName = SceneNames.Deepnest_02, X = 26f, Y = 16f, Test = lacksAnyClaw }); - - // Platform to escape the Deepnest mimic room when mimics may not be present - if (gs.CursedSettings.RandomizeMimics) - { - plats.Add(new() { SceneName = SceneNames.Deepnest_36, X = 26f, Y = 11f, Test = lacksLeftVertical }); - } - - // Platforms to climb back up from Mantis Lords with only wings - if (!targetNames.Contains($"{SceneNames.Fungus2_15}[left1]") - && !targetNames.Contains($"{SceneNames.Fungus2_25}[top1]") - && !targetNames.Contains($"{SceneNames.Fungus2_25}[top2]")) - { - for (int i = 0; i < 2; i++) - { - plats.Add(new() { SceneName = SceneNames.Fungus2_15, X = 48f + 2 * i, Y = 15f + 10 * i, Test = lacksRightClaw }); - } - } - - // Platforms to prevent softlock on lever on the way to love key. - for (int i = 0; i < 2; i++) - { - plats.Add(new() { SceneName = SceneNames.Fungus3_05, X = 65.7f, Y = 11f + 4.5f * i, Test = lacksRightClaw }); - } - - if (gs.StartLocationSettings.StartLocation != "Hive") - { - plats.Add(new() { SceneName = SceneNames.Hive_03, X = 58.5f, Y = 134f, Test = lacksAnyVertical }); - plats.Add(new() { SceneName = SceneNames.Hive_03, X = 58.5f, Y = 138.5f, Test = lacksAnyVertical }); - } - - // Move the load in colo downward to prevent bench soft lock - if (!targetNames.Contains($"{SceneNames.Room_Colosseum_02}[top2]") - && !targetNames.Contains($"{SceneNames.Room_Colosseum_Spectate}[right1]")) - { - plats.Add(new() { SceneName = SceneNames.Room_Colosseum_02, X = 43.5f, Y = 45f, Test = lacksAnyClaw }); - plats.Add(new() { SceneName = SceneNames.Room_Colosseum_02, X = 43.5f, Y = 49.5f, Test = lacksAnyClaw }); - } - - // Platform to escape from the geo rock above Lemm - plats.Add(new() { SceneName = SceneNames.Ruins1_05c, X = 26.6f, Y = 73.2f, Test = lacksAnyVertical }); - - // Platforms to climb back up to King's Pass with no items - if (!targetNames.Contains($"{SceneNames.Town}[right1]") && gs.StartLocationSettings.StartLocation == "King's Pass") - { - for (int i = 0; i < 6; i++) - { - plats.Add(new() { SceneName = SceneNames.Town, X = 20f - 2 * (i % 2), Y = 5f * i + 15f, Test = lacksLeftClaw }); - } - } - - // Platforms to prevent itemless softlock when checking left waterways - if (!targetNames.Contains($"{SceneNames.Waterways_04}[left1]") - && !targetNames.Contains($"{SceneNames.Waterways_04}[left2]") - && !targetNames.Contains($"{SceneNames.Waterways_04b}[left1]") - && !targetNames.Contains($"{SceneNames.Waterways_09}[left1]") - && gs.StartLocationSettings.StartLocation != "West Waterways") - { - plats.Add(new() { SceneName = SceneNames.Waterways_04, X = 148f, Y = 23.1f, Test = lacksAnyVertical }); - plats.Add(new() { SceneName = SceneNames.Waterways_04, X = 139f, Y = 32f, Test = lacksAnyVertical }); - plats.Add(new() { SceneName = SceneNames.Waterways_04, X = 107f, Y = 10f, - Test = gs.NoveltySettings.RandomizeSwim ? new PDBool("canSwim") : null }); - plats.Add(new() { SceneName = SceneNames.Waterways_04, X = 107f, Y = 15f, - Test = gs.NoveltySettings.RandomizeSwim ? new PDBool("canSwim") : null }); - } - - return plats; - } - } -} diff --git a/RandomizerMod/IC/RandoItemTag.cs b/RandomizerMod/IC/RandoItemTag.cs deleted file mode 100644 index 1138908..0000000 --- a/RandomizerMod/IC/RandoItemTag.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using ItemChanger; - -namespace RandomizerMod.IC -{ - public class RandoItemTag : Tag - { - public static event Action AfterRandoItemGive; - public static event Action OnLoad; - - public int id; - public bool obtained = false; - - public override void Load(object parent) - { - ((AbstractItem)parent).AfterGive += Broadcast; - try - { - OnLoad?.Invoke((AbstractItem)parent, this); - } - catch (Exception e) - { - LogError($"Error invoking RandoItemTag.OnLoad:\n{e}"); - } - } - - public override void Unload(object parent) - { - ((AbstractItem)parent).AfterGive -= Broadcast; - } - - private void Broadcast(ReadOnlyGiveEventArgs args) - { - if (!obtained) AfterRandoItemGive?.Invoke(id, args); - obtained = true; - } - } -} diff --git a/RandomizerMod/IC/RandoPlacementTag.cs b/RandomizerMod/IC/RandoPlacementTag.cs deleted file mode 100644 index f8d3a0e..0000000 --- a/RandomizerMod/IC/RandoPlacementTag.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using ItemChanger; - -namespace RandomizerMod.IC -{ - public class RandoPlacementTag : Tag - { - public static event Action OnRandoPlacementVisitStateChanged; - public static event Action OnLoad; - - /// - /// The ids of the item placements managed by this placement. - /// - public List ids = new(); - - public override void Load(object parent) - { - ((AbstractPlacement)parent).OnVisitStateChanged += OnVisitStateChanged; - try - { - OnLoad?.Invoke((AbstractPlacement)parent, this); - } - catch (Exception e) - { - LogError($"Error invoking RandoPlacementTag.OnLoad:\n{e}"); - } - } - - public override void Unload(object parent) - { - ((AbstractPlacement)parent).OnVisitStateChanged -= OnVisitStateChanged; - } - - private void OnVisitStateChanged(VisitStateChangedEventArgs args) - { - OnRandoPlacementVisitStateChanged?.Invoke(args); - } - } -} diff --git a/RandomizerMod/IC/RandomizerModule.cs b/RandomizerMod/IC/RandomizerModule.cs deleted file mode 100644 index 3e9d43b..0000000 --- a/RandomizerMod/IC/RandomizerModule.cs +++ /dev/null @@ -1,155 +0,0 @@ -using ItemChanger; -using ItemChanger.Extensions; -using UnityEngine; -using UnityEngine.SceneManagement; -using UObject = UnityEngine.Object; -using Module = ItemChanger.Modules.Module; -using System.Collections.ObjectModel; - -namespace RandomizerMod.IC -{ - public class RandomizerModule : Module - { - /// - /// Event which is invoked during ItemChanger.Events.OnEnterGame, to allow access to the item and placement lookups after all items and placements have loaded. - /// - public static event Action OnLoadComplete; - - /// - /// Item lookup indexed parallel to the RandoContext item placement list. Refreshed on entering the game. - /// - public static ReadOnlyDictionary Items { get; } = new(_items = new()); - private static readonly Dictionary _items; - - /// - /// Placement lookup indexed parallel to the RandoContext item placement list. Refreshed on entering the game. - /// - public static ReadOnlyDictionary Placements { get; } = new(_placements = new()); - private static readonly Dictionary _placements; - - public override void Initialize() - { - AbstractItem.ModifyRedundantItemGlobal += ModifyRedundantItem; - ToggleSceneHooks(true); - Events.OnEnterGame += InvokeOnLoadComplete; - RandoItemTag.OnLoad += RecordItem; - RandoPlacementTag.OnLoad += RecordPlacement; - - _items.Clear(); - _placements.Clear(); - } - - public override void Unload() - { - AbstractItem.ModifyRedundantItemGlobal -= ModifyRedundantItem; - ToggleSceneHooks(false); - Events.OnEnterGame -= InvokeOnLoadComplete; - RandoItemTag.OnLoad -= RecordItem; - RandoPlacementTag.OnLoad -= RecordPlacement; - - _items.Clear(); - _placements.Clear(); - } - - private static void InvokeOnLoadComplete() - { - try - { - OnLoadComplete?.Invoke(); - } - catch (Exception e) - { - LogError($"Error invoking RandomizerModule.OnLoadComplete:\n{e}"); - } - } - - private static void RecordItem(AbstractItem item, RandoItemTag tag) - { - _items[tag.id] = item; - } - - private static void RecordPlacement(AbstractPlacement placement, RandoPlacementTag tag) - { - if (tag.ids != null) - { - foreach (int id in tag.ids) _placements[id] = placement; - } - } - - private static void ModifyRedundantItem(GiveEventArgs args) - { - args.Item = new ItemChanger.Items.AddGeoItem - { - amount = 100, - name = $"100_Geo-{args.Orig.name}", - UIDef = DupeUIDef.Convert(100, args.Orig.UIDef), - }; - } - - private static void ToggleSceneHooks(bool toggle) - { - Settings.GenerationSettings gs = RandomizerMod.RS.GenerationSettings; - - if (gs is null) - { - LogWarn("Failed to toggle RandomizerModule scene hooks due to missing randomizer data."); - return; - } - - switch (gs.StartLocationSettings.StartLocation) - { - case "Ancestral Mound": - if (gs.NoveltySettings.RandomizeNail) - { - if (toggle) Events.AddSceneChangeEdit(SceneNames.Crossroads_ShamanTemple, DestroyPlanksForAncestralMoundStart); - else Events.RemoveSceneChangeEdit(SceneNames.Crossroads_ShamanTemple, DestroyPlanksForAncestralMoundStart); - } - break; - - case "Fungal Core": - if (toggle) Events.AddSceneChangeEdit(SceneNames.Fungus2_30, CreateBounceShroomsForFungalCoreStart); - else Events.RemoveSceneChangeEdit(SceneNames.Fungus2_30, CreateBounceShroomsForFungalCoreStart); - break; - - case "West Crossroads": - if (toggle) Events.AddSceneChangeEdit(SceneNames.Crossroads_36, MoveShadeMarkerForWestCrossroadsStart); - else Events.RemoveSceneChangeEdit(SceneNames.Crossroads_36, MoveShadeMarkerForWestCrossroadsStart); - break; - } - - - } - - // Destroy planks in cursed nail mode because we can't slash them - private static void DestroyPlanksForAncestralMoundStart(Scene to) - { - foreach ((_, GameObject go) in to.Traverse()) - { - if (go.name.StartsWith("Plank")) UObject.Destroy(go); - } - } - - private static void CreateBounceShroomsForFungalCoreStart(Scene to) - { - GameObject bounceShroom = to.FindGameObjectByName("Bounce Shroom C"); - - GameObject s0 = UObject.Instantiate(bounceShroom); - s0.transform.SetPosition3D(12.5f, 26f, 0f); - s0.SetActive(true); - - GameObject s1 = UObject.Instantiate(bounceShroom); - s1.transform.SetPosition3D(12.5f, 54f, 0f); - s1.SetActive(true); - - GameObject s2 = UObject.Instantiate(bounceShroom); - s2.transform.SetPosition3D(21.7f, 133f, 0f); - s2.SetActive(true); - } - - private static void MoveShadeMarkerForWestCrossroadsStart(Scene to) - { - GameObject marker = to.FindGameObject("_Props/Hollow_Shade Marker 1"); - marker.transform.position = new(46.2f, 28f); - } - } -} diff --git a/RandomizerMod/IC/Seer.cs b/RandomizerMod/IC/Seer.cs deleted file mode 100644 index 1f3cac8..0000000 --- a/RandomizerMod/IC/Seer.cs +++ /dev/null @@ -1,47 +0,0 @@ -using ItemChanger; -using RandomizerMod.Settings; -using RandomizerMod.RC; -using ItemChanger.Locations; - -namespace RandomizerMod.IC -{ - public static class Seer - { - public static AbstractPlacement GetSeerPlacement(ICFactory factory) - { - AbstractPlacement p = factory.MakeLocation(LocationNames.Seer).Wrap(); - p.AddTag().destroyRewards = GetRandomizedSeerRewards(factory.gs); - return p; - } - public static SeerRewards GetRandomizedSeerRewards(GenerationSettings gs) - { - SeerRewards sr = SeerRewards.None; - if (gs.PoolSettings.Relics) - { - sr |= SeerRewards.HallownestSeal | SeerRewards.ArcaneEgg; - } - if (gs.PoolSettings.PaleOre) - { - sr |= SeerRewards.PaleOre; - } - if (gs.PoolSettings.Charms) - { - sr |= SeerRewards.DreamWielder; - } - if (gs.PoolSettings.VesselFragments) - { - sr |= SeerRewards.VesselFragment; - } - if (gs.PoolSettings.Skills) - { - sr |= SeerRewards.DreamGate | SeerRewards.AwokenDreamNail; - } - if (gs.PoolSettings.MaskShards) - { - sr |= SeerRewards.MaskShard; - } - - return sr; - } - } -} diff --git a/RandomizerMod/IC/Shops.cs b/RandomizerMod/IC/Shops.cs deleted file mode 100644 index 70b7bbc..0000000 --- a/RandomizerMod/IC/Shops.cs +++ /dev/null @@ -1,69 +0,0 @@ -using ItemChanger; -using RandomizerMod.Settings; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace RandomizerMod.IC -{ - public static class Shops - { - public static DefaultShopItems GetDefaultShopItems(GenerationSettings gs) - { - DefaultShopItems items = DefaultShopItems.None; - - items |= DefaultShopItems.IseldaMapPins; - items |= DefaultShopItems.IseldaMapMarkers; - items |= DefaultShopItems.LegEaterRepair; - - if (!gs.PoolSettings.Keys) - { - items |= DefaultShopItems.SlyLantern; - items |= DefaultShopItems.SlySimpleKey; - items |= DefaultShopItems.SlyKeyElegantKey; - } - - if (!gs.PoolSettings.Charms) - { - items |= DefaultShopItems.SlyCharms; - items |= DefaultShopItems.SlyKeyCharms; - items |= DefaultShopItems.IseldaCharms; - items |= DefaultShopItems.SalubraCharms; - items |= DefaultShopItems.LegEaterCharms; - } - - if (!gs.PoolSettings.Maps) - { - items |= DefaultShopItems.IseldaQuill; - items |= DefaultShopItems.IseldaMaps; - } - - if (!gs.PoolSettings.MaskShards) - { - items |= DefaultShopItems.SlyMaskShards; - } - - if (!gs.PoolSettings.VesselFragments) - { - items |= DefaultShopItems.SlyVesselFragments; - } - - if (!gs.PoolSettings.RancidEggs) - { - items |= DefaultShopItems.SlyRancidEgg; - } - - if (!gs.PoolSettings.CharmNotches && gs.MiscSettings.SalubraNotches == MiscSettings.SalubraNotchesSetting.GroupedWithCharmNotchesPool - || gs.MiscSettings.SalubraNotches == MiscSettings.SalubraNotchesSetting.Vanilla - || gs.MiscSettings.SalubraNotches == MiscSettings.SalubraNotchesSetting.AutoGivenAtCharmThreshold) - { - items |= DefaultShopItems.SalubraNotches; - items |= DefaultShopItems.SalubraBlessing; - } - - return items; - } - } -} diff --git a/RandomizerMod/IC/TrackerLogModule.cs b/RandomizerMod/IC/TrackerLogModule.cs deleted file mode 100644 index 25175bc..0000000 --- a/RandomizerMod/IC/TrackerLogModule.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System.Text; -using ItemChanger.Modules; -using RandomizerMod.Logging; -using RandomizerMod.Settings; - -namespace RandomizerMod.IC -{ - public class TrackerLogModule : Module - { - private string oolRevisionMessage = string.Empty; - - private void AppendToTracker(string contents) - { - LogManager.Append(contents, "TrackerLog.txt"); - } - - public override void Initialize() - { - SetUpLog(); - TrackerUpdate.OnItemObtained += TrackItemObtained; - TrackerUpdate.OnPlacementPreviewed += TrackLocationPreviewed; - TrackerUpdate.OnPlacementCleared += TrackLocationCleared; - TrackerUpdate.OnTransitionVisited += TrackTransitionFound; - TrackerUpdate.OnFinishedUpdate += TrackOOLRevisions; - } - - public override void Unload() - { - TrackerUpdate.OnItemObtained -= TrackItemObtained; - TrackerUpdate.OnPlacementPreviewed -= TrackLocationPreviewed; - TrackerUpdate.OnPlacementCleared -= TrackLocationCleared; - TrackerUpdate.OnTransitionVisited -= TrackTransitionFound; - } - - private void TrackItemObtained(int id, string item, string location) - { - bool ool = RandomizerMod.RS.TrackerDataWithoutSequenceBreaks is TrackerData tdwsb && tdwsb.outOfLogicObtainedItems.Contains(id); - string line = $"ITEM OBTAINED{(ool ? "*" : "")} --- {{{item}}} at {{{location}}} with id {{{id}}}{Environment.NewLine}"; - AppendToTracker(line); - } - - private void TrackLocationPreviewed(string location) - { - string line = $"LOCATION PREVIEWED --- {{{location}}}{Environment.NewLine}"; - AppendToTracker(line); - } - - private void TrackLocationCleared(string location) - { - string line = $"LOCATION CLEARED --- {{{location}}}{Environment.NewLine}"; - AppendToTracker(line); - } - - private void TrackTransitionFound(string t1, string t2) - { - bool ool = RandomizerMod.RS.TrackerDataWithoutSequenceBreaks is TrackerData tdwsb && tdwsb.outOfLogicVisitedTransitions.Contains(t1); - string line = $"TRANSITION{(ool ? "*" : "")} --- {{{t1}}} --> {{{t2}}}{Environment.NewLine}"; - AppendToTracker(line); - } - - internal void TrackItemOOLEnd(int id, string item, string location) - { - string line = $"REVISED --- obtained item no longer out of logic --- {{{item}}} at {{{location}}} with id {{{id}}}{Environment.NewLine}"; - oolRevisionMessage += line; - } - - internal void TrackTransitionOOLEnd(string t1, string t2) - { - string line = $"REVISED --- found transition no longer out of logic --- {{{t1}}} --> {{{t2}}}{Environment.NewLine}"; - oolRevisionMessage += line; - } - - private void TrackOOLRevisions() - { - // TrackerData manages whether placements are out of logic, and broadcasts to TrackerLogModule - // Since TrackerData hooks with RM, before IC modules, we delay logging revisions to ensure the obtained item, etc goes through first. - // If TrackerLogModule is present, but TrackerData is not, obtains will not be marked as OOL, and revisions will not be sent. - - if (!string.IsNullOrEmpty(oolRevisionMessage)) - { - AppendToTracker(oolRevisionMessage); - } - oolRevisionMessage = string.Empty; - } - - private void SetUpLog() - { - if (!File.Exists(Path.Combine(LogManager.UserDirectory, "TrackerLog.txt"))) - { - StringBuilder sb = new("Starting tracker log for new randomizer file."); - sb.AppendLine(); - sb.AppendLine(); - AppendToTracker(sb.ToString()); - } - } - } -} diff --git a/RandomizerMod/IC/TrackerUpdate.cs b/RandomizerMod/IC/TrackerUpdate.cs deleted file mode 100644 index 2613f95..0000000 --- a/RandomizerMod/IC/TrackerUpdate.cs +++ /dev/null @@ -1,101 +0,0 @@ -using ItemChanger; -using RandomizerMod.Settings; - -namespace RandomizerMod.IC -{ - public class TrackerUpdate : ItemChanger.Modules.Module - { - public override void Initialize() - { - RandoItemTag.AfterRandoItemGive += AfterRandoItemGive; - RandoPlacementTag.OnRandoPlacementVisitStateChanged += OnRandoPlacementVisitStateChanged; - Events.OnTransitionOverride += OnTransitionOverride; - transitionLookup ??= TD?.ctx?.transitionPlacements?.ToDictionary(p => p.Source.Name, p => p.Target.Name) ?? []; - } - - public override void Unload() - { - RandoItemTag.AfterRandoItemGive -= AfterRandoItemGive; - RandoPlacementTag.OnRandoPlacementVisitStateChanged -= OnRandoPlacementVisitStateChanged; - Events.OnTransitionOverride -= OnTransitionOverride; - OnUnload?.Invoke(); - } - - public static event Action OnPlacementPreviewed; - public static event Action OnPlacementCleared; - public static event Action OnItemObtained; - public static event Action OnTransitionVisited; - public static event Action OnFinishedUpdate; - public static event Action OnFoundTransitionsCleared; - public static event Action OnPreviewsCleared; - public static event Action OnUnload; - - private TrackerData TD => RandomizerMod.RS.TrackerData; - private TrackerData TD_WSB => RandomizerMod.RS.TrackerDataWithoutSequenceBreaks; - private Dictionary transitionLookup; - - private void OnRandoPlacementVisitStateChanged(VisitStateChangedEventArgs args) - { - if ((args.NewFlags & VisitState.Previewed) == VisitState.Previewed) - { - OnPlacementPreviewed?.Invoke(args.Placement.Name); - OnFinishedUpdate?.Invoke(); - } - } - - private void AfterRandoItemGive(int id, ReadOnlyGiveEventArgs args) - { - string itemName = args.Item.name; // the name of the item that was given (not necessarily the item placed) - string placementName = args.Placement.Name; - - OnItemObtained?.Invoke(id, itemName, placementName); - - if (args.Placement.GetTag() is RandoPlacementTag rpt && rpt.ids.All(i => RandomizerModule.Items[i].WasEverObtained())) - { - OnPlacementCleared?.Invoke(placementName); - } - - OnFinishedUpdate?.Invoke(); - } - - /// - /// Static method intended to allow updating visited source transitions by external callers. - /// - public static void SendTransitionFound(Transition source) - { - if (ItemChangerMod.Modules.Get() is TrackerUpdate instance) instance.OnTransitionFound(source.ToString()); - } - - public static void ClearFoundTransitions() - { - OnFoundTransitionsCleared?.Invoke(); - OnFinishedUpdate?.Invoke(); - } - - public static void ClearPreviewedPlacements() - { - OnPreviewsCleared?.Invoke(); - OnFinishedUpdate?.Invoke(); - } - - private void OnTransitionOverride(Transition source, Transition origTarget, ITransition newTarget) - { - OnTransitionFound(source.ToString()); - } - - private void OnTransitionFound(string sourceName) - { - if (transitionLookup.TryGetValue(sourceName, out string targetName) && !TD.HasVisited(sourceName)) - { - OnTransitionVisited?.Invoke(sourceName, targetName); - if (RandomizerMod.RS.GenerationSettings is GenerationSettings gs && gs.TransitionSettings.Coupled && transitionLookup.ContainsKey(targetName)) - { - OnTransitionVisited?.Invoke(targetName, sourceName); - } - - OnFinishedUpdate?.Invoke(); - } - } - - } -} diff --git a/RandomizerMod/Localization.cs b/RandomizerMod/Localization.cs deleted file mode 100644 index 8586db9..0000000 --- a/RandomizerMod/Localization.cs +++ /dev/null @@ -1,152 +0,0 @@ -using MenuChanger.MenuElements; -using MenuChanger.MenuPanels; -using Newtonsoft.Json; -using RandomizerMod.RandomizerData; -using UnityEngine.UI; - -namespace RandomizerMod -{ - public static class LocalizationData - { - public static Dictionary textLookup; - - public static void Load() - { - try - { - string path = Path.Combine(RandomizerMod.Folder, "language.json"); - if (File.Exists(path)) - { - using FileStream fs = File.OpenRead(path); - using StreamReader sr = new(fs); - JsonTextReader jtr = new(sr); - textLookup = JsonUtil._js.Deserialize>(jtr); - } - } - catch (Exception e) - { - LogError(e); - } - - textLookup ??= new(); - } - } - - public class LocalizedMenuItemFormatter : MenuItemFormatter - { - readonly MenuItemFormatter orig; - - public LocalizedMenuItemFormatter(MenuItemFormatter orig) - { - this.orig = orig; - } - - public override string GetText(string prefix, object value) - { - if (orig is DefaultMenuItemFormatter) - { - string s1 = prefix; - string s2 = value?.ToString() ?? string.Empty; - string s3 = prefix + ": " + s2; - string s4 = Localize(s3); - if (s4 != s3) return s4; - return Localize(s1) + ": " + Localize(s2); - } - else if (orig is MenuItemEnumFormatter mief) - { - string s1 = prefix; - string s2 = mief.GetEnumName(value); - string s3 = prefix + ": " + s2; - string s4 = Localize(s3); - if (s4 != s3) return s4; - return Localize(s1) + ": " + Localize(s2); - } - else - { - string s1 = orig.GetText(prefix, value); - string s2 = Localize(orig.GetText(prefix, value)); - if (s1 != s2) return s2; - return Localize(orig.GetText(Localize(prefix), value)); - } - } - } - - public static class Localization - { - public static string Localize(string value) - { - if (value != null) - { - if (LocalizationData.textLookup.TryGetValue(value, out string result)) - { - return result; - } - else - { - LocalizationData.textLookup[value] = value; - } - } - return value; - } - - public static void Localize(Text t) - { - string text = t.text; - if (string.IsNullOrWhiteSpace(text)) return; - bool newLineTerminated = text[text.Length - 1] == '\n'; - if (newLineTerminated) text = text.Substring(0, text.Length - 1); - text = Localize(text); - if (newLineTerminated) text += '\n'; - t.text = text; - } - - public static void Localize(SmallButton sb) - { - if (sb is MenuItem mi) - { - mi.Formatter = new LocalizedMenuItemFormatter(mi.Formatter); - } - else - { - Localize(sb.Text); - } - } - - public static void Localize(BigButton bb) - { - Text title = bb.Button.transform.Find("Text").GetComponent(); - Localize(title); - Text desc = bb.Button.transform.Find("DescriptionText").GetComponent(); - Localize(desc); - } - - public static void Localize(EntryField ef) - { - Localize(ef.Label.Text); - } - - public static void Localize(RadioSwitch rs) - { - foreach (MenuItem mi in rs.Elements) Localize(mi); - } - - public static void Localize(Subpage sp) - { - Localize(sp.TitleLabel); - } - - public static void Localize(MenuLabel ml) - { - Localize(ml.Text); - } - - public static void Localize(MenuElementFactory mef) - { - foreach (IMenuElement e in mef.Elements) - { - if (e is MenuItem mi) Localize(mi); - else if (e is EntryField ef) Localize(ef); - } - } - } -} diff --git a/RandomizerMod/LogHelper.cs b/RandomizerMod/LogHelper.cs deleted file mode 100644 index 972829b..0000000 --- a/RandomizerMod/LogHelper.cs +++ /dev/null @@ -1,44 +0,0 @@ -// ReSharper disable file UnusedMember.Global - - -using System; -using System.Diagnostics; - -namespace RandomizerMod -{ - public static class LogHelper - { - public static event Action OnLog; - - public static void Log(string message = "") - { - OnLog?.Invoke(message); - } - - public static void Log(object message) - { - Log(message.ToString()); - } - - [Conditional("DEBUG")] - public static void LogDebug(string message) - { - OnLog?.Invoke(message); - } - - public static void LogError(string message) - { - OnLog?.Invoke(message); - } - - public static void LogError(object message) - { - OnLog?.Invoke(message.ToString()); - } - - public static void LogWarn(string message) - { - OnLog?.Invoke(message); - } - } -} diff --git a/RandomizerMod/Logging/ItemSpoilerLog.cs b/RandomizerMod/Logging/ItemSpoilerLog.cs deleted file mode 100644 index 1476c16..0000000 --- a/RandomizerMod/Logging/ItemSpoilerLog.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Newtonsoft.Json; -using RandomizerCore; -using RandomizerMod.RC; - -namespace RandomizerMod.Logging -{ - class ItemSpoilerLog : RandoLogger - { - public readonly struct SpoilerEntry - { - public readonly string item; - public readonly string location; - public readonly string[] costs; - - public SpoilerEntry(ItemPlacement p) - { - item = p.Item.Name; - location = p.Location.Name; - costs = p.Location.costs?.Select(c => c.ToString())?.ToArray(); - } - } - - public override void Log(LogArguments args) - { - JsonSerializer js = new() - { - DefaultValueHandling = DefaultValueHandling.Ignore, - Formatting = Formatting.Indented, - }; - using StringWriter sw = new(); - js.Serialize(sw, args.ctx.itemPlacements.Select(p => new SpoilerEntry(p)).ToList()); - LogManager.Write(sw.ToString(), "ItemSpoilerLog.json"); - } - } -} diff --git a/RandomizerMod/Logging/LogArguments.cs b/RandomizerMod/Logging/LogArguments.cs deleted file mode 100644 index 3af8684..0000000 --- a/RandomizerMod/Logging/LogArguments.cs +++ /dev/null @@ -1,14 +0,0 @@ -using RandomizerCore; -using RandomizerMod.RC; -using RandomizerMod.Settings; - -namespace RandomizerMod.Logging -{ - public class LogArguments - { - public object randomizer { get; init; } - public GenerationSettings gs { get; init; } - public RandoModContext ctx { get; init; } - public Dictionary properties { get; init; } = new(); - } -} diff --git a/RandomizerMod/Logging/LogManager.cs b/RandomizerMod/Logging/LogManager.cs deleted file mode 100644 index e3afe26..0000000 --- a/RandomizerMod/Logging/LogManager.cs +++ /dev/null @@ -1,260 +0,0 @@ -using System.Collections.Concurrent; -using System.Threading; -using UnityEngine; - -namespace RandomizerMod.Logging -{ - public static class LogManager - { - public static readonly string R4Directory = Path.Combine(Application.persistentDataPath, "Randomizer 4"); - public static readonly string RecentDirectory = Path.Combine(Application.persistentDataPath, "Randomizer 4", "Recent"); - public static string UserDirectory => Path.Combine(Application.persistentDataPath, "Randomizer 4", "user" + RandomizerMod.RS.ProfileID); - - /// - /// Loggers which are activated when the save is created. - /// - private static readonly List loggers = new() - { - new SettingsLog(), - new ItemSpoilerLog(), - new TransitionSpoilerLog(), - new NotchCostSpoilerLog(), - }; - - public static void AddLogger(RandoLogger rl) - { - loggers.Add(rl); - } - - public static void RemoveLogger(RandoLogger rl) - { - loggers.Remove(rl); - } - - internal static void Initialize() - { - logRequestConsumer = new Thread(() => - { - foreach (Action a in logRequests.GetConsumingEnumerable()) - { - try - { - a?.Invoke(); - } - catch (Exception e) - { - LogError($"Error in log request:\n{e}"); - } - } - }) - { IsBackground = true, Priority = System.Threading.ThreadPriority.Lowest }; - logRequestConsumer.Start(); - - Modding.ModHooks.ApplicationQuitHook += CloseLogRequests; - } - - internal static void WaitForQueue() - { - if (logRequests.Count == 0 || logRequestConsumer is null || !logRequestConsumer.IsAlive) return; - - EventWaitHandle h = new(false, EventResetMode.AutoReset); - Do(EmptyQueue); - h.WaitOne(); - - void EmptyQueue() - { - if (logRequests.Count == 0) h.Set(); - else Do(EmptyQueue); - } - } - - private static void CloseLogRequests() - { - try - { - logRequests.CompleteAdding(); - logRequestConsumer.Join(); - logRequests.Dispose(); - } - catch (Exception e) - { - LogError($"Error disposing LogManager:\n{e}"); - } - } - - private static readonly BlockingCollection logRequests = new(); - private static Thread logRequestConsumer; - - /// - /// Enqueues an operation on the logging thread to write to the specified file in the log directories. - /// - public static void Write(string contents, string fileName) - { - void WriteLog() - { - try - { - string userPath = Path.Combine(UserDirectory, fileName); - Directory.CreateDirectory(Path.GetDirectoryName(userPath)); - File.WriteAllText(userPath, contents); - } - catch (Exception e) - { - LogError($"Error printing log request to {UserDirectory}:\n{e}"); - } - try - { - string recentPath = Path.Combine(RecentDirectory, fileName); - Directory.CreateDirectory(Path.GetDirectoryName(recentPath)); - File.WriteAllText(recentPath, contents); - } - catch (Exception e) - { - LogError($"Error printing log request to {RecentDirectory}:\n{e}"); - } - } - - logRequests.Add(WriteLog); - } - - /// - /// Enqueues the operation on the logging thread to write to the specified file in the log directories. - /// - public static void Write(Action a, string fileName) - { - void WriteLog() - { - try - { - string userPath = Path.Combine(UserDirectory, fileName); - Directory.CreateDirectory(Path.GetDirectoryName(userPath)); - using FileStream fs = File.Create(userPath); - using StreamWriter sr = new(fs); - a?.Invoke(sr); - sr.Close(); - - string recentPath = Path.Combine(RecentDirectory, fileName); - Directory.CreateDirectory(Path.GetDirectoryName(recentPath)); - File.Copy(userPath, recentPath, true); - } - catch (Exception e) - { - LogError($"Error printing log request for {fileName}:\n{e}"); - } - } - - logRequests.Add(WriteLog); - } - - /// - /// Enqueues an operation on the logging thread to append the contents to the specified file in the log directories. - /// - public static void Append(string contents, string fileName) - { - void AppendLog() - { - try - { - string userPath = Path.Combine(UserDirectory, fileName); - Directory.CreateDirectory(Path.GetDirectoryName(userPath)); - File.AppendAllText(userPath, contents); - } - catch (Exception e) - { - LogError($"Error appending log request to {UserDirectory}:\n{e}"); - } - try - { - string recentPath = Path.Combine(RecentDirectory, fileName); - Directory.CreateDirectory(Path.GetDirectoryName(recentPath)); - File.AppendAllText(recentPath, contents); - } - catch (Exception e) - { - LogError($"Error appending log request to {RecentDirectory}:\n{e}"); - } - } - - logRequests.Add(AppendLog); - } - - /// - /// Enqueues an action on the logging thread. - /// - public static void Do(Action a) - { - logRequests.Add(a); - } - - internal static void InitDirectory() - { - DirectoryInfo userDI; - try - { - userDI = Directory.CreateDirectory(UserDirectory); - foreach (FileInfo fi in userDI.EnumerateFiles()) - { - fi.Delete(); - } - } - catch (Exception e) - { - LogError($"Error initializing user logging directory:\n{e}"); - return; - } - - DirectoryInfo recentDI; - try - { - recentDI = Directory.CreateDirectory(RecentDirectory); - foreach (FileInfo fi in recentDI.EnumerateFiles()) - { - fi.Delete(); - } - } - catch (Exception e) - { - LogError($"Error initializing recent logging directory:\n{e}"); - return; - } - } - - internal static void WriteLogs(LogArguments args) - { - System.Diagnostics.Stopwatch sw = new(); - sw.Start(); - foreach (var rl in loggers) logRequests.Add(() => rl.DoLog(args)); - logRequests.Add(() => - { - sw.Stop(); - Log($"Printed new game logs in {sw.Elapsed.TotalSeconds} seconds."); - }); - } - - internal static void UpdateRecent(int profileID) - { - void MoveFiles() - { - try - { - DirectoryInfo recentDI = Directory.CreateDirectory(RecentDirectory); - DirectoryInfo userDI = Directory.CreateDirectory(Path.Combine(R4Directory, "user" + profileID)); - foreach (FileInfo fi in recentDI.EnumerateFiles()) - { - fi.Delete(); - } - foreach (FileInfo fi in userDI.EnumerateFiles()) - { - fi.CopyTo(Path.Combine(recentDI.FullName, fi.Name), true); - } - } - catch (Exception e) - { - LogError($"Error overwriting recent log directory:\n{e}"); - } - } - - logRequests.Add(MoveFiles); - } - } -} diff --git a/RandomizerMod/Logging/NotchCostSpoilerLog.cs b/RandomizerMod/Logging/NotchCostSpoilerLog.cs deleted file mode 100644 index 7ddd8ec..0000000 --- a/RandomizerMod/Logging/NotchCostSpoilerLog.cs +++ /dev/null @@ -1,70 +0,0 @@ -using Newtonsoft.Json; - -namespace RandomizerMod.Logging -{ - class NotchCostSpoilerLog : RandoLogger - { - static string[] _charmNames = new string[] - { - "Gathering_Swarm", - "Wayward_Compass", - "Grubsong", - "Stalwart_Shell", - "Baldur_Shell", - "Fury_of_the_Fallen", - "Quick_Focus", - "Lifeblood_Heart", - "Lifeblood_Core", - "Defender's_Crest", - "Flukenest", - "Thorns_of_Agony", - "Mark_of_Pride", - "Steady_Body", - "Heavy_Blow", - "Sharp_Shadow", - "Spore_Shroom", - "Longnail", - "Shaman_Stone", - "Soul_Catcher", - "Soul_Eater", - "Glowing_Womb", - "Fragile_Heart", - "Fragile_Greed", - "Fragile_Strength", - "Nailmaster's_Glory", - "Joni's_Blessing", - "Shape_of_Unn", - "Hiveblood", - "Dream_Wielder", - "Dashmaster", - "Quick_Slash", - "Spell_Twister", - "Deep_Focus", - "Grubberfly's_Elegy", - "Kingsoul", - "Sprintmaster", - "Dreamshield", - "Weaversong", - "Grimmchild", - }; - - public override void Log(LogArguments args) - { - List notchCosts = args.ctx.notchCosts; - if (notchCosts is null || notchCosts.Count < 40) return; - - Dictionary costLookup = new(40); - for (int i = 0; i < 40; i++) - { - costLookup[_charmNames[i]] = notchCosts[i]; - } - - JsonSerializer js = new() - { - DefaultValueHandling = DefaultValueHandling.Ignore, - Formatting = Formatting.Indented, - }; - LogManager.Write((tw) => js.Serialize(tw, costLookup), "NotchCostSpoilerLog.json"); - } - } -} diff --git a/RandomizerMod/Logging/RandoLogger.cs b/RandomizerMod/Logging/RandoLogger.cs deleted file mode 100644 index 4889f39..0000000 --- a/RandomizerMod/Logging/RandoLogger.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace RandomizerMod.Logging -{ - public abstract class RandoLogger - { - public abstract void Log(LogArguments args); - internal void DoLog(LogArguments args) - { - try - { - Log(args); - } - catch (Exception e) - { - LogError($"Error in RandoLogger {GetType().Name}:\n{e}"); - } - } - } -} diff --git a/RandomizerMod/Logging/SettingsLog.cs b/RandomizerMod/Logging/SettingsLog.cs deleted file mode 100644 index 3c144c1..0000000 --- a/RandomizerMod/Logging/SettingsLog.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Newtonsoft.Json; -using RandomizerMod.RandomizerData; - -namespace RandomizerMod.Logging -{ - public class SettingsLog : RandoLogger - { - public static event Action AfterLogSettings; - - public override void Log(LogArguments args) - { - LogManager.Write(tw => - { - tw.WriteLine("Logging RandomizerMod GenerationSettings:"); - using JsonTextWriter jtw = new(tw); - JsonUtil._js.Serialize(jtw, args.gs); - tw.WriteLine(); - tw.WriteLine("Logging menu GenerationSettings code:"); - tw.WriteLine(RandomizerMod.GS.DefaultMenuSettings.Serialize()); - tw.WriteLine("Logging final GenerationSettings code:"); - tw.WriteLine(args.gs.Serialize()); - try - { - AfterLogSettings?.Invoke(args, tw); - } - catch (Exception e) - { - LogError($"Error invoking AfterLogSettings:\n{e}"); - } - }, "settings.txt"); - } - } -} diff --git a/RandomizerMod/Logging/TransitionSpoilerLog.cs b/RandomizerMod/Logging/TransitionSpoilerLog.cs deleted file mode 100644 index df9cc12..0000000 --- a/RandomizerMod/Logging/TransitionSpoilerLog.cs +++ /dev/null @@ -1,26 +0,0 @@ -using RandomizerCore; -using RandomizerMod.RC; - -namespace RandomizerMod.Logging -{ - class TransitionSpoilerLog : RandoLogger - { - public readonly struct SpoilerEntry - { - public readonly string source; - public readonly string target; - - public SpoilerEntry(TransitionPlacement p) - { - source = p.Source.Name; - target = p.Target.Name; - } - } - - public override void Log(LogArguments args) - { - string contents = RandomizerData.JsonUtil.Serialize(args.ctx.transitionPlacements.Select(p => new SpoilerEntry(p)).ToList()); - LogManager.Write(contents, "TransitionSpoilerLog.json"); - } - } -} diff --git a/RandomizerMod/Menu/Hash.cs b/RandomizerMod/Menu/Hash.cs deleted file mode 100644 index b3e73a7..0000000 --- a/RandomizerMod/Menu/Hash.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace RandomizerMod.Menu -{ - public static class Hash - { - public const int Length = 4; - public static string[] Entries; - - public static string[] GetHash(int seed, int length = Length) - { - Random rng = new(seed + length); - string[] arr = new string[length]; - for (int i = 0; i < length; i++) - { - arr[i] = Entries[rng.Next(Entries.Length)]; - } - - return arr; - } - - static Hash() - { - using Stream stream = typeof(Hash).Assembly.GetManifestResourceStream("RandomizerMod.Resources.entries.txt"); - using StreamReader sr = new(stream); - List strs = new(); - while (sr.ReadLine() is string s) strs.Add(s); - Entries = strs.ToArray(); - } - } -} diff --git a/RandomizerMod/Menu/ModMenu.cs b/RandomizerMod/Menu/ModMenu.cs deleted file mode 100644 index 51ce49c..0000000 --- a/RandomizerMod/Menu/ModMenu.cs +++ /dev/null @@ -1,20 +0,0 @@ -using ItemChanger.Internal.Menu; -using DirectoryOptions = RandomizerMod.Menu.RandomizerMenu.DirectoryOptions; - -namespace RandomizerMod.Menu -{ - public static class ModMenu - { - public static MenuScreen GetRandomizerMenuScreen(MenuScreen modListMenu) - { - ModMenuScreenBuilder builder = new(Localize("Randomizer 4"), modListMenu); - builder.AddButton(Localize("Open Log Folder"), null, () => RandomizerMenu.OpenFile(null, string.Empty, DirectoryOptions.RecentLogFolder)); - builder.AddButton(Localize("Open Helper Log"), null, () => RandomizerMenu.OpenFile(null, "HelperLog.txt", DirectoryOptions.RecentLogFolder)); - builder.AddButton(Localize("Open Tracker Log"), null, () => RandomizerMenu.OpenFile(null, "TrackerLog.txt", DirectoryOptions.RecentLogFolder)); -#if DEBUG - builder.AddButton(Localize("Reset Profiling Data"), null, () => RandomizerCore.Profiling.Reset()); -#endif - return builder.CreateMenuScreen(); - } - } -} diff --git a/RandomizerMod/Menu/RandomizerMenu.cs b/RandomizerMod/Menu/RandomizerMenu.cs deleted file mode 100644 index cb81037..0000000 --- a/RandomizerMod/Menu/RandomizerMenu.cs +++ /dev/null @@ -1,1282 +0,0 @@ -using MenuChanger; -using MenuChanger.Extensions; -using MenuChanger.MenuElements; -using MenuChanger.MenuPanels; -using RandomizerCore.Extensions; -using RandomizerMod.RandomizerData; -using RandomizerMod.RC; -using RandomizerMod.Settings; -using RandomizerMod.Settings.Presets; -using System.Diagnostics; -using System.Threading; -using UnityEngine; -using Random = System.Random; - -namespace RandomizerMod.Menu -{ - public class RandomizerMenuConstructor : ModeMenuConstructor - { - internal static RandomizerMenu menu; - internal static bool finished = false; - - public override bool TryGetModeButton(MenuPage modeMenu, out BigButton button) - { - button = menu.EntryButton; - return true; - } - - public override void OnEnterMainMenu(MenuPage modeMenu) - { - menu = new RandomizerMenu(modeMenu); - foreach (var entry in RandomizerMenuAPI.randoMenuPageConstructors) - { - try - { - entry.ConstructionHandler(menu.ConnectionsPage); - } - catch (Exception e) - { - LogError($"Error constructing external menu:\n{e}"); - } - } - foreach (var entry in RandomizerMenuAPI.randoStartOverrides) - { - try - { - entry.ConstructionHandler(menu.PostGenerationRedirectPage); - } - catch (Exception e) - { - LogError($"Error constructing external menu:\n{e}"); - } - } - finished = true; - } - - public override void OnExitMainMenu() - { - menu = null; - finished = false; - } - } - - public class RandomizerMenu - { - public BigButton EntryButton; - GenerationSettings Settings => RandomizerMod.GS.DefaultMenuSettings; - List Profiles => RandomizerMod.GS.Profiles; - readonly Dictionary StartDefs; - - readonly MenuPage ModePage; - public readonly SettingsPM pm; - readonly Random rng = new(); - - #region Start - - MenuPage StartPage; - - BigButton GenerateButton; - NumericEntryField SeedEntryField; - SmallButton RandomSeedButton; - - - MenuPreset PoolPreset; - MenuPreset SkipPreset; - MenuPreset NoveltyPreset; - MenuPreset CostPreset; - MenuPreset StartItemPreset; - MenuPreset StartLocationPreset; - MenuPreset LongLocationPreset; - MenuPreset CursedPreset; - MenuPreset TransitionPreset; - MenuPreset MiscPreset; - MenuPreset DuplicateItemPreset; - MenuPreset SplitGroupPreset; - - MenuPreset ProgressionDepthPreset; // not on main page! - - SmallButton[] PresetButtons => new SmallButton[] - { - PoolPreset, - SkipPreset, - NoveltyPreset, - CostPreset, - StartItemPreset, - StartLocationPreset, - LongLocationPreset, - CursedPreset, - TransitionPreset, - MiscPreset, - DuplicateItemPreset, - SplitGroupPreset, - }; - GridItemPanel StartGIP; - - - SmallButton JumpToJumpPageButton; - SmallButton JumpToConnectionsButton; - ToggleButton ToggleCaptionsButton; - - SmallButton[] StartCornerButtons => new SmallButton[] - { - JumpToJumpPageButton, - JumpToConnectionsButton, - ToggleCaptionsButton, - }; - VerticalItemPanel StartCornerVIP; - - #endregion - - #region Jump - - MenuPage JumpPage; - SmallButton[] JumpButtons; - GridItemPanel JumpPanel; - - SmallButton DefaultSettingsButton; - SmallButton ToManageSettingsPageButton; - SmallButton OpenReadmeButton; - SmallButton OpenLogicReadmeButton; - GridItemPanel SubJumpPanel; - SmallButton[] SubJumpElements => new SmallButton[] - { - DefaultSettingsButton, - ToManageSettingsPageButton, - OpenReadmeButton, - OpenLogicReadmeButton, - }; - - #endregion - - #region Manage Settings - - MenuPage ManageSettingsPage; - - TextEntryField SettingsCodeField; - SmallButton GenerateCodeButton; - SmallButton ApplyCodeButton; - IMenuElement[] CodeElements => new IMenuElement[] - { - GenerateCodeButton, - ApplyCodeButton, - SettingsCodeField, - }; - VerticalItemPanel CodeVIP; - - TextEntryField ProfileNameField; - MenuItem ProfileSwitch; - SmallButton OverwriteProfileButton; - SmallButton DeleteProfileButton; - SmallButton SaveAsNewProfileButton; - SmallButton ApplyProfileButton; - IMenuElement[] ProfileElements => new IMenuElement[] - { - ProfileSwitch, - OverwriteProfileButton, - DeleteProfileButton, - SaveAsNewProfileButton, - ApplyProfileButton, - ProfileNameField, - }; - VerticalItemPanel ProfileVIP; - MenuLabel CodeWarningLabel; - - #endregion - - #region Advanced Settings - - MenuPage AdvancedSettingsPage; - - OrderedItemViewer AdvancedSettingsViewer; - - Subpage[] AdvancedSettingsSubpages => new Subpage[] - { - PoolSubpage, - SkipSubpage, - NoveltySubpage, - CostSubpage, - LongLocationSubpage, - StartLocationSubpage, - StartItemSubpage, - MiscSubpage, - CursedSubpage, - TransitionSubpage, - ProgressionDepthSubpage, - DuplicateItemSubpage, - SplitGroupSubpage, - }; - - Subpage PoolSubpage; - MenuElementFactory poolMEF; - GridItemPanel poolGIP; - - Subpage SkipSubpage; - MenuElementFactory skipMEF; - GridItemPanel skipPanel; - - Subpage NoveltySubpage; - MenuElementFactory novMEF; - VerticalItemPanel novVIP; - - Subpage CostSubpage; - MenuElementFactory costMEF; - GridItemPanel costGIP; - - Subpage LongLocationSubpage; - MenuElementFactory longLocationMEF; - GridItemPanel longLocationPanel; - - Subpage StartLocationSubpage; - MenuItem startLocationTypeSwitch; - SmallButton randomFixedStartButton; - RadioSwitch startLocationSwitch; - VerticalItemPanel startLocationVIP; - IMenuPanel startLocationPanel; - - Subpage StartItemSubpage; - MenuElementFactory startItemMEF; - GridItemPanel startItemGIP; - - Subpage MiscSubpage; - MenuElementFactory miscMEF; - VerticalItemPanel miscVIP; - - Subpage CursedSubpage; - MenuElementFactory cursedMEF; - VerticalItemPanel cursedVIP; - - Subpage TransitionSubpage; - MenuElementFactory transitionMEF; - VerticalItemPanel transitionPanel; - - Subpage ProgressionDepthSubpage; - MenuElementFactory progressionDepthMEF; - VerticalItemPanel progressionDepthPanel; - - Subpage DuplicateItemSubpage; - MenuElementFactory duplicateItemMEF; - GridItemPanel duplicateItemPanel; - - Subpage SplitGroupSubpage; - MenuElementFactory splitGroupMEF; - GridItemPanel splitGroupInnerPanel; - VerticalItemPanel splitGroupOuterPanel; - SmallButton splitGroupRandomizeButton; - - #endregion - - #region Game Settings - - public MenuPage ConnectionsPage; - MultiGridItemPanel connectionsPanel; - MenuLabel emptyConnectionsPanelLabel; - #endregion - - #region Final - - public MenuPage FinalPage; - - BigButton StartButton; - BigButton ProceedButton; - - MenuLabel InfoPanelTitle; - CounterLabel AttemptCounter; - TimerLabel RandomizationTimer; - MenuLabel OutputLabel; - - IMenuElement[] InfoElements => new IMenuElement[] - { - InfoPanelTitle, - RandomizationTimer, - AttemptCounter, - OutputLabel, - }; - VerticalItemPanel generationInfoVIP; - - MenuLabel[] HashLabels; - SmallButton CopyHashButton; - VerticalItemPanel HashVIP; - - #endregion - - #region Resume - MenuPage ResumePage; - BigButton resumeButton; - SmallButton openLogFolderButton; - SmallButton openTrackerButton; - SmallButton openHelperButton; - SmallButton[] resumeElements => new SmallButton[] - { - openLogFolderButton, - openTrackerButton, - openHelperButton, - }; - VerticalItemPanel resumePanel; - #endregion - - public MenuPage PostGenerationRedirectPage; - MultiGridItemPanel postGenerationRedirectPanel; - BigButton redirectStartButton; - - public RandomizerMenu(MenuPage modePage) - { - ModePage = modePage; - - pm = new(Settings); - StartDefs = RandomizerMenuAPI.GenerateStartLocationDict(); - - MakeMenuPages(); - MakeMenuElements(); - MakePanels(); - AddEvents(); - Arrange(); - LocalizeMenu(); - - ResumeMenu.AddResumePage("Randomizer", ResumePage); - SeedEntryField.SetValue(rng.Next(0, 999999999)); - ApplySettingsToMenu(Settings); - } - - private void MakeMenuPages() - { - StartPage = new MenuPage("Randomizer Setting Select Page", ModePage); - JumpPage = new MenuPage("Randomizer Jump To Advanced Settings Page", StartPage); - AdvancedSettingsPage = new MenuPage("Randomizer Advanced Settings Page", JumpPage); - ManageSettingsPage = new MenuPage("Randomizer Manage Settings Page", JumpPage); - ConnectionsPage = new MenuPage("Randomizer Game Settings Page", StartPage); - FinalPage = new MenuPage("Randomizer Final Page", StartPage); - FinalPage.backButton.Text.text = "Abort"; - FinalPage.AfterGoBack += Abort; - PostGenerationRedirectPage = new MenuPage("Randomizer Post Generation Redirect Page", FinalPage); - - ResumePage = new MenuPage("Randomizer Resume Page"); - } - - private void MakeMenuElements() - { - EntryButton = new BigButton(ModePage, RandomizerMod.SpriteManager.GetSprite("logo"), "Randomizer"); - // Start Page - - JumpToJumpPageButton = new SmallButton(StartPage, "More Randomizer Settings"); - JumpToConnectionsButton = new SmallButton(StartPage, "Connections"); - ToggleCaptionsButton = new ToggleButton(StartPage, "Toggle Menu Captions"); - - GenerateButton = new BigButton(StartPage, "Begin Randomization"); - SeedEntryField = new NumericEntryField(StartPage, "Seed"); - - RandomSeedButton = new SmallButton(StartPage, "Random"); - - // The AdvancedSettingsPage Elements must be constructed before the StartPage preset buttons. - poolMEF = new MenuElementFactory(AdvancedSettingsPage, Settings.PoolSettings); - skipMEF = new MenuElementFactory(AdvancedSettingsPage, Settings.SkipSettings); - novMEF = new MenuElementFactory(AdvancedSettingsPage, Settings.NoveltySettings); - costMEF = new MenuElementFactory(AdvancedSettingsPage, Settings.CostSettings); - longLocationMEF = new MenuElementFactory(AdvancedSettingsPage, Settings.LongLocationSettings); - - startLocationTypeSwitch = new MenuEnum(AdvancedSettingsPage, - nameof(StartLocationSettings.StartLocationType).FromCamelCase()); - startLocationTypeSwitch.Bind(Settings.StartLocationSettings, - typeof(StartLocationSettings).GetField(nameof(StartLocationSettings.StartLocationType))); - randomFixedStartButton = new SmallButton(AdvancedSettingsPage, "Random Fixed Start"); - - startLocationSwitch = new RadioSwitch(AdvancedSettingsPage, StartDefs.Values.Where(def => def.DisplayInMenu(pm)).Select(def => def.Name).ToArray()); - startItemMEF = new MenuElementFactory(AdvancedSettingsPage, Settings.StartItemSettings); - - miscMEF = new MenuElementFactory(AdvancedSettingsPage, Settings.MiscSettings); - cursedMEF = new MenuElementFactory(AdvancedSettingsPage, Settings.CursedSettings); - transitionMEF = new MenuElementFactory(AdvancedSettingsPage, Settings.TransitionSettings); - progressionDepthMEF = new MenuElementFactory(AdvancedSettingsPage, Settings.ProgressionDepthSettings); - duplicateItemMEF = new MenuElementFactory(AdvancedSettingsPage, Settings.DuplicateItemSettings); - splitGroupMEF = new MenuElementFactory(AdvancedSettingsPage, Settings.SplitGroupSettings); - - PoolPreset = new MenuPreset(StartPage, "Randomized Items", - PoolPresetData.PoolPresets, Settings.PoolSettings, - Captions.Caption, - poolMEF); - SkipPreset = new MenuPreset(StartPage, "Required Skips", - SkipPresetData.SkipPresets, Settings.SkipSettings, - Captions.Caption, - skipMEF); - NoveltyPreset = new MenuPreset(StartPage, "Novelties", NoveltyPresetData.NoveltyPresets, Settings.NoveltySettings, Captions.Caption, novMEF); - CostPreset = new MenuPreset(StartPage, "Cost Randomization", CostPresetData.CostPresets, Settings.CostSettings, Captions.Caption, costMEF); - StartItemPreset = new MenuPreset(StartPage, "Start Items", - StartItemPresetData.StartItemPresets, Settings.StartItemSettings, si => si.Caption(), startItemMEF); - StartLocationPreset = new MenuPreset(StartPage, "Start Location", - StartLocationPresetData.StartLocationPresets, Settings.StartLocationSettings, Captions.Caption); - StartLocationPreset.Pair(startLocationTypeSwitch, typeof(StartLocationSettings).GetField(nameof(StartLocationSettings.StartLocationType))); - - LongLocationPreset = new MenuPreset(StartPage, "Long Locations", - LongLocationPresetData.LongLocationPresets, Settings.LongLocationSettings, - ll => ll.Caption(Settings), - longLocationMEF); - - CursedPreset = new MenuPreset(StartPage, "Curses", - CursePresetData.CursedPresets, Settings.CursedSettings, - cs => cs.Caption(), - cursedMEF); - - TransitionPreset = new MenuPreset(StartPage, "Transition Randomizer", - TransitionPresetData.TransitionPresets, Settings.TransitionSettings, - ts => ts.Caption(), - transitionMEF); - - MiscPreset = new MenuPreset(StartPage, "Miscellaneous", - MiscPresetData.MiscPresets, Settings.MiscSettings, - ms => ms.Caption(), - miscMEF); - - DuplicateItemPreset = new MenuPreset(StartPage, "Duplicate Items", - DuplicateItemPresetData.Presets, Settings.DuplicateItemSettings, ds => ds.Caption(), duplicateItemMEF); - - SplitGroupPreset = new MenuPreset(StartPage, "Split Group Randomizer", SplitGroupPresetData.Presets, - Settings.SplitGroupSettings, Captions.Caption, splitGroupMEF); - - ProgressionDepthPreset = new MenuPreset(AdvancedSettingsPage, "Preset", ProgressionDepthPresetData.Presets, Settings.ProgressionDepthSettings, - _ => string.Empty, progressionDepthMEF); - - DefaultSettingsButton = new SmallButton(JumpPage, "Restore Default Settings"); - ToManageSettingsPageButton = new SmallButton(JumpPage, "Manage Settings Profiles"); - OpenReadmeButton = new SmallButton(JumpPage, "Open Main Readme"); - OpenLogicReadmeButton = new SmallButton(JumpPage, "Open Logic Readme"); - - GenerateCodeButton = new SmallButton(ManageSettingsPage, "Refresh Code"); - ApplyCodeButton = new SmallButton(ManageSettingsPage, "Apply Code To Menu"); - SettingsCodeField = new TextEntryField(ManageSettingsPage, "Shareable Settings Code"); - - ProfileSwitch = new MenuItem(ManageSettingsPage, "Profile", Profiles); - OverwriteProfileButton = new SmallButton(ManageSettingsPage, "Overwrite Selected Profile"); - DeleteProfileButton = new SmallButton(ManageSettingsPage, "Delete Selected Profile"); - SaveAsNewProfileButton = new SmallButton(ManageSettingsPage, "Save As New Profile"); - ApplyProfileButton = new SmallButton(ManageSettingsPage, "Apply Profile"); - ProfileNameField = new TextEntryField(ManageSettingsPage, "Profile Name"); - - CodeWarningLabel = new MenuLabel(ManageSettingsPage, - "Only base randomizer settings are synced by the settings code." + "\n" + - "Sync connection mod settings manually or use the RandoSettingsManager mod.", - MenuLabel.Style.Body); - CodeWarningLabel.Text.alignment = TextAnchor.UpperCenter; - - // Final Page - InfoPanelTitle = new MenuLabel(FinalPage, Localize("Randomizer Progress")); - AttemptCounter = new CounterLabel(FinalPage, Localize("Attempts")); - RandomizationTimer = new TimerLabel(FinalPage, Localize("Time Elapsed")); - OutputLabel = new MenuLabel(FinalPage, "", new Vector2(800, 800)); - OutputLabel.Hide(); - - StartButton = new BigButton(FinalPage, RandomizerMod.SpriteManager.GetSprite("logo"), "Start Game"); - StartButton.Hide(); - ProceedButton = new BigButton(FinalPage, "Proceed"); - ProceedButton.Hide(); - - redirectStartButton = new BigButton(PostGenerationRedirectPage, RandomizerMod.SpriteManager.GetSprite("logo"), "Start Rando Normally"); - - int hashLength = 1 + 4; - HashLabels = new MenuLabel[hashLength]; - HashLabels[0] = new MenuLabel(FinalPage, Localize("Hash")); - for (int i = 1; i < hashLength; i++) - { - HashLabels[i] = new MenuLabel(FinalPage, "", MenuLabel.Style.Body); - HashLabels[i].Text.alignment = TextAnchor.UpperCenter; - } - CopyHashButton = new SmallButton(FinalPage, "Copy Hash"); - CopyHashButton.OnClick += () => - { - GUIUtility.systemCopyBuffer = string.Join(", ", HashLabels.Skip(1).Select(l => l.Text.text.Replace("\n", ""))); - }; - CopyHashButton.Hide(); - - resumeButton = new BigButton(ResumePage, "Resume"); - openLogFolderButton = new SmallButton(ResumePage, "Open Log Folder"); - openTrackerButton = new SmallButton(ResumePage, "Open Tracker Log"); - openHelperButton = new SmallButton(ResumePage, "Open Helper Log"); - } - - private void MakePanels() - { - StartGIP = new GridItemPanel(StartPage, new Vector2(0, 450), 2, 125, 960, true, PresetButtons); - - PoolSubpage = new Subpage(AdvancedSettingsPage, "Randomized Items"); - poolGIP = new GridItemPanel(AdvancedSettingsPage, SpaceParameters.TOP_CENTER_UNDER_TITLE, 4, SpaceParameters.VSPACE_SMALL, SpaceParameters.HSPACE_SMALL, false, poolMEF.Elements); - PoolSubpage.Add(poolGIP); - - SkipSubpage = new Subpage(AdvancedSettingsPage, "Required Skips"); - skipPanel = new GridItemPanel(AdvancedSettingsPage, SpaceParameters.TOP_CENTER_UNDER_TITLE, 2, SpaceParameters.VSPACE_SMALL, SpaceParameters.HSPACE_LARGE, false, skipMEF.Elements); - SkipSubpage.Add(skipPanel); - - NoveltySubpage = new Subpage(AdvancedSettingsPage, "Novelties"); - novVIP = new VerticalItemPanel(AdvancedSettingsPage, SpaceParameters.TOP_CENTER_UNDER_TITLE, SpaceParameters.VSPACE_SMALL, false, novMEF.Elements.ToArray()); - NoveltySubpage.Add(novVIP); - - CostSubpage = new Subpage(AdvancedSettingsPage, "Cost Randomization"); - costGIP = new GridItemPanel(AdvancedSettingsPage, SpaceParameters.TOP_CENTER_UNDER_TITLE, 3, 200f, SpaceParameters.HSPACE_SMALL, false, costMEF.Elements.ToArray()); - CostSubpage.Add(costGIP); - - LongLocationSubpage = new Subpage(AdvancedSettingsPage, "Long Location Options"); - longLocationPanel = new GridItemPanel(AdvancedSettingsPage, SpaceParameters.TOP_CENTER_UNDER_TITLE, 2, SpaceParameters.VSPACE_SMALL, 900f, false, longLocationMEF.Elements); - LongLocationSubpage.Add(longLocationPanel); - - StartLocationSubpage = new Subpage(AdvancedSettingsPage, "Start Location"); - if (StartDefs.Count <= 33) - { - startLocationPanel = new GridItemPanel(AdvancedSettingsPage, new Vector2(0, 150), 3, SpaceParameters.VSPACE_SMALL, 600f, false, startLocationSwitch.Elements); - } - else - { - // will this actually work? let's hope we never find out - startLocationPanel = new MultiGridItemPanel(AdvancedSettingsPage, 3, 10, SpaceParameters.VSPACE_SMALL, 600f, new Vector2(0, 150), new(-600f, -350f), new(0f, 350f), new(600f, 350f), startLocationSwitch.Elements); - } - - startLocationVIP = new VerticalItemPanel(AdvancedSettingsPage, SpaceParameters.TOP_CENTER_UNDER_TITLE, SpaceParameters.VSPACE_MEDIUM, false, startLocationTypeSwitch, randomFixedStartButton, startLocationPanel); - StartLocationSubpage.Add(startLocationVIP); - - StartItemSubpage = new Subpage(AdvancedSettingsPage, "Start Items"); - startItemGIP = new GridItemPanel(AdvancedSettingsPage, SpaceParameters.TOP_CENTER_UNDER_TITLE, 2, SpaceParameters.VSPACE_LARGE, SpaceParameters.HSPACE_LARGE, false, startItemMEF.Elements); - StartItemSubpage.Add(startItemGIP); - - MiscSubpage = new Subpage(AdvancedSettingsPage, "Miscellaneous"); - miscVIP = new VerticalItemPanel(AdvancedSettingsPage, SpaceParameters.TOP_CENTER_UNDER_TITLE, SpaceParameters.VSPACE_MEDIUM, false, miscMEF.Elements); - MiscSubpage.Add(miscVIP); - - CursedSubpage = new Subpage(AdvancedSettingsPage, "Curse Options"); - cursedVIP = new VerticalItemPanel(AdvancedSettingsPage, SpaceParameters.TOP_CENTER_UNDER_TITLE, SpaceParameters.VSPACE_MEDIUM, false, cursedMEF.Elements); - CursedSubpage.Add(cursedVIP); - - TransitionSubpage = new Subpage(AdvancedSettingsPage, "Transition Randomizer"); - transitionPanel = new VerticalItemPanel(AdvancedSettingsPage, SpaceParameters.TOP_CENTER_UNDER_TITLE, SpaceParameters.VSPACE_SMALL, false, transitionMEF.Elements); - TransitionSubpage.Add(transitionPanel); - - ProgressionDepthSubpage = new Subpage(AdvancedSettingsPage, "Progression Depth"); - progressionDepthPanel = new VerticalItemPanel(AdvancedSettingsPage, SpaceParameters.TOP_CENTER_UNDER_TITLE, SpaceParameters.VSPACE_MEDIUM, false, progressionDepthMEF.Elements.Prepend(ProgressionDepthPreset).ToArray()); - ProgressionDepthSubpage.Add(progressionDepthPanel); - - DuplicateItemSubpage = new Subpage(AdvancedSettingsPage, "Duplicate Items"); - duplicateItemPanel = new GridItemPanel(AdvancedSettingsPage, SpaceParameters.TOP_CENTER_UNDER_TITLE, 2, SpaceParameters.VSPACE_SMALL, SpaceParameters.HSPACE_LARGE, false, duplicateItemMEF.Elements); - DuplicateItemSubpage.Add(duplicateItemPanel); - - SplitGroupSubpage = new Subpage(AdvancedSettingsPage, "Split Group Randomizer"); - splitGroupInnerPanel = new GridItemPanel(AdvancedSettingsPage, SpaceParameters.TOP_CENTER_UNDER_TITLE, 4, SpaceParameters.VSPACE_MEDIUM, SpaceParameters.HSPACE_SMALL, false, splitGroupMEF.Elements.Skip(1).ToArray()); - splitGroupRandomizeButton = new SmallButton(AdvancedSettingsPage, "Randomize Now"); - splitGroupOuterPanel = new VerticalItemPanel(AdvancedSettingsPage, SpaceParameters.TOP_CENTER_UNDER_TITLE, SpaceParameters.VSPACE_MEDIUM, false, - splitGroupRandomizeButton, splitGroupMEF.ElementLookup[nameof(SplitGroupSettings.RandomizeOnStart)], splitGroupInnerPanel); - SplitGroupSubpage.Add(splitGroupOuterPanel); - - AdvancedSettingsViewer = new OrderedItemViewer(AdvancedSettingsPage, AdvancedSettingsSubpages); - - JumpButtons = AdvancedSettingsSubpages.Select(p => - { - SmallButton b = new(JumpPage, p.TitleLabel.Text.text); - b.OnClick += () => - { - JumpPage.TransitionTo(AdvancedSettingsPage); - b.Button.ForceDeselect(); - AdvancedSettingsViewer.JumpTo(p); - AdvancedSettingsPage.nav.SelectDefault(); - }; - return b; - }).ToArray(); - JumpPanel = new GridItemPanel(JumpPage, SpaceParameters.TOP_CENTER_UNDER_TITLE, 2, 60f, SpaceParameters.HSPACE_LARGE, true, JumpButtons); - SubJumpPanel = new GridItemPanel(JumpPage, new Vector2(0f, -300f), 2, 60f, SpaceParameters.HSPACE_LARGE, true, SubJumpElements); - - StartCornerVIP = new VerticalItemPanel(StartPage, new Vector2(-650, -350), SpaceParameters.VSPACE_SMALL, false, StartCornerButtons); - - emptyConnectionsPanelLabel = new MenuLabel(ConnectionsPage, "This page is currently empty. " + - "Mods connected to the randomizer can link menus here.", MenuLabel.Style.Title); - emptyConnectionsPanelLabel.MoveTo(new(0, 400)); - connectionsPanel = new MultiGridItemPanel(ConnectionsPage, 9, 3, SpaceParameters.VSPACE_MEDIUM, SpaceParameters.HSPACE_MEDIUM, SpaceParameters.TOP_CENTER_UNDER_TITLE, Array.Empty()); - // note - connection entries are constructed after menu construction! - - CodeVIP = new VerticalItemPanel(ManageSettingsPage, new Vector2(-400, 300), 100, true, CodeElements); - ProfileVIP = new VerticalItemPanel(ManageSettingsPage, new Vector2(400, 300), 100, true, ProfileElements); - CodeWarningLabel.MoveTo(new(0f, -300f)); - - generationInfoVIP = new VerticalItemPanel(FinalPage, new Vector2(-400, 300), 50f, true, InfoElements); - HashVIP = new VerticalItemPanel(FinalPage, new Vector2(400, 300), SpaceParameters.VSPACE_SMALL, true, HashLabels); - HashVIP.Hide(); - - postGenerationRedirectPanel = new MultiGridItemPanel(PostGenerationRedirectPage, 5, 3, SpaceParameters.VSPACE_LARGE, SpaceParameters.HSPACE_MEDIUM, SpaceParameters.TOP_CENTER_UNDER_TITLE, Array.Empty()); - - ResumePage.AddToNavigationControl(resumeButton); - resumePanel = new VerticalItemPanel(ResumePage, new(-720f, 50f), SpaceParameters.VSPACE_SMALL, true, resumeElements); - } - - private void AddEvents() - { - EntryButton.AddHideAndShowEvent(ModePage, StartPage); - - SeedEntryField.ValueChanged += (i) => Settings.Seed = i; - - GenerateButton.AddHideAndShowEvent(StartPage, FinalPage); - GenerateButton.OnClick += Randomize; - - RandomSeedButton.OnClick += () => SeedEntryField.SetValue(rng.Next(0, 1000000000)); - - StartLocationPreset.SelfChanged += (self) => UpdateStartLocationPreset(); - - JumpToJumpPageButton.AddHideAndShowEvent(StartPage, JumpPage); - JumpToConnectionsButton.OnClick += RebuildConnectionsPanel; - JumpToConnectionsButton.AddHideAndShowEvent(StartPage, ConnectionsPage); - - ToggleCaptionsButton.SetValue(true); - ToggleCaptionsButton.SelfChanged += (self) => - { - foreach (SmallButton button in PresetButtons) - { - if (button is IMenuPreset preset) preset.Label?.SetVisibleByAlpha(((ToggleButton)self).Value); - } - }; - - foreach (IValueElement ve in skipMEF.Elements) ve.SelfChanged += UpdateStartLocation; - - transitionMEF.ElementLookup[nameof(TransitionSettings.Mode)].SelfChanged += UpdateStartLocation; - - novMEF.ElementLookup[nameof(NoveltySettings.RandomizeSwim)].SelfChanged += UpdateStartLocation; - novMEF.ElementLookup[nameof(NoveltySettings.RandomizeElevatorPass)].SelfChanged += UpdateStartLocation; - cursedMEF.ElementLookup[nameof(CursedSettings.CursedMasks)].SelfChanged += UpdateStartLocation; - - startItemMEF.ElementLookup[nameof(StartItemSettings.VerticalMovement)].SelfChanged += UpdateStartLocation; - - startLocationSwitch.Changed += Settings.StartLocationSettings.SetStartLocation; - startLocationSwitch.Changed += (s) => UpdateStartLocationPreset(); - startLocationTypeSwitch.ValueChanged += UpdateStartLocationSwitch; - startLocationTypeSwitch.ValueChanged += (s) => UpdateStartLocationPreset(); - randomFixedStartButton.OnClick += () => - { - startLocationTypeSwitch.SetValue(StartLocationSettings.RandomizeStartLocationType.Fixed); - startLocationSwitch.ChangeSelection(rng.NextWhere(startLocationSwitch.Elements, e => !e.Locked)); - }; - UpdateStartLocation(); - - miscMEF.ElementLookup[nameof(MiscSettings.SteelSoul)].SelfChanged += (e) => RefreshSteelSoulLock(); - SkipPreset.OnSetPreset += (s) => - { - if (s.ShadeSkips && Settings.MiscSettings.SteelSoul) - { - Settings.SkipSettings.ShadeSkips = false; - } - }; - - skipMEF.ElementLookup[nameof(SkipSettings.Slopeballs)].SelfChanged += (e) => RefreshSlopeballLock(); - MiscPreset.OnSetPreset += (s) => - { - if (s.FireballUpgrade != MiscSettings.ToggleableFireballSetting.Toggleable && Settings.SkipSettings.Slopeballs) - { - Settings.MiscSettings.FireballUpgrade = MiscSettings.ToggleableFireballSetting.Toggleable; - } - }; - - splitGroupRandomizeButton.OnClick += () => - { - Settings.SplitGroupSettings.Randomize(rng); - splitGroupMEF.SetMenuValues(Settings.SplitGroupSettings); - }; - - ToManageSettingsPageButton.AddHideAndShowEvent(JumpPage, ManageSettingsPage); - DefaultSettingsButton.OnClick += () => ApplySettingsToMenu(new GenerationSettings()); // Proper defaults please! - OpenReadmeButton.OnClick += () => OpenFile(OpenReadmeButton, "README.html", DirectoryOptions.DllFolder); - OpenLogicReadmeButton.OnClick += () => OpenFile(OpenLogicReadmeButton, "LOGIC_README.html", DirectoryOptions.DllFolder); - - GenerateCodeButton.OnClick += () => SettingsCodeField.SetValue(Settings.Serialize()); - ApplyCodeButton.OnClick += () => - { - try - { - GenerationSettings gs = GenerationSettings.Deserialize(SettingsCodeField.Value); - ApplySettingsToMenu(gs); - if (gs.Seed != int.MinValue) SeedEntryField.SetValue(gs.Seed); - } - catch (Exception e) - { - SettingsCodeField.SetValue(e.Message); - } - }; - - ProfileSwitch.SelfChanged += (element) => - { - MenuItem self = (MenuItem)element; - ProfileNameField.SetValue(self.Value?.ToString() ?? string.Empty); - if (self.Value == null) - { - OverwriteProfileButton.Lock(); - DeleteProfileButton.Lock(); - ApplyProfileButton.Lock(); - } - else - { - OverwriteProfileButton.Unlock(); - DeleteProfileButton.Unlock(); - ApplyProfileButton.Unlock(); - } - }; - OverwriteProfileButton.Lock(); - DeleteProfileButton.Lock(); - ApplyProfileButton.Lock(); - - OverwriteProfileButton.OnClick += () => - { - MenuProfile mp = new MenuProfile - { - name = ProfileNameField.Value, - settings = Settings.Clone() as GenerationSettings - }; - ProfileSwitch.OverwriteCurrent(mp); - }; - SaveAsNewProfileButton.OnClick += () => - { - MenuProfile mp = new MenuProfile - { - name = ProfileNameField.Value, - settings = Settings.Clone() as GenerationSettings - }; - ProfileSwitch.AddItem(mp); - ProfileSwitch.SetValue(mp); - }; - DeleteProfileButton.OnClick += () => - { - ProfileSwitch.RemoveCurrent(); - }; - ApplyProfileButton.OnClick += () => - { - if (ProfileSwitch.Value is MenuProfile mp) - { - ApplySettingsToMenu(mp.settings); - } - }; - - StartButton.AddSetResumeKeyEvent("Randomizer"); - StartButton.OnClick += StartRandomizerGame; - - ProceedButton.AddHideAndShowEvent(PostGenerationRedirectPage); - - redirectStartButton.AddSetResumeKeyEvent("Randomizer"); - redirectStartButton.OnClick += StartRandomizerGame; - - - resumeButton.OnClick += () => - { - MenuChangerMod.HideAllMenuPages(); - UIManager.instance.ContinueGame(); - GameManager.instance.ContinueGame(); - }; - openLogFolderButton.OnClick += () => OpenFile(openLogFolderButton, string.Empty, DirectoryOptions.RecentLogFolder); - openTrackerButton.OnClick += () => OpenFile(openTrackerButton, "TrackerLog.txt", DirectoryOptions.RecentLogFolder); - openHelperButton.OnClick += () => OpenFile(openHelperButton, "HelperLog.txt", DirectoryOptions.RecentLogFolder); - } - - private void Arrange() - { - GenerateButton.MoveTo(new Vector2(0, -350)); - SeedEntryField.MoveTo(new Vector2(650, -350)); - RandomSeedButton.MoveTo(new Vector2(650, -400)); - - StartButton.MoveTo(new Vector2(0, -200)); - CopyHashButton.MoveTo(new Vector2(400, 25)); - - // buttons not in panels need navigation - GenerateButton.SymSetNeighbor(Neighbor.Up, StartGIP); - GenerateButton.SymSetNeighbor(Neighbor.Right, RandomSeedButton); - GenerateButton.SymSetNeighbor(Neighbor.Left, StartCornerVIP); - GenerateButton.SymSetNeighbor(Neighbor.Down, StartPage.backButton); - - RandomSeedButton.SymSetNeighbor(Neighbor.Up, SeedEntryField); - RandomSeedButton.SymSetNeighbor(Neighbor.Right, StartCornerVIP); - - StartCornerVIP.SetNeighbor(Neighbor.Up, StartGIP); - - StartPage.backButton.SetNeighbor(Neighbor.Right, RandomSeedButton); - StartPage.backButton.SetNeighbor(Neighbor.Left, StartCornerVIP); - - SubJumpPanel.SymSetNeighbor(Neighbor.Up, JumpPanel); - SubJumpPanel.SymSetNeighbor(Neighbor.Down, JumpPage.backButton); - } - - private void LocalizeMenu() - { - Localize(EntryButton); - Localize(StartPage.backButton); - Localize(JumpPage.backButton); - Localize(AdvancedSettingsPage.backButton); - Localize(ConnectionsPage.backButton); - Localize(FinalPage.backButton); - Localize(PostGenerationRedirectPage.backButton); - - Localize(poolMEF); - Localize(skipMEF); - Localize(novMEF); - Localize(costMEF); - Localize(longLocationMEF); - Localize(startLocationTypeSwitch); - Localize(randomFixedStartButton); - Localize(startItemMEF); - Localize(startLocationSwitch); - Localize(startItemMEF); - Localize(miscMEF); - Localize(cursedMEF); - Localize(transitionMEF); - Localize(progressionDepthMEF); - Localize(duplicateItemMEF); - Localize(splitGroupMEF); - Localize(splitGroupRandomizeButton); - - foreach (MenuItem mi in PresetButtons) - { - Localize(mi); - } - Localize(ProgressionDepthPreset); - - Localize(SeedEntryField); - Localize(RandomSeedButton); - Localize(GenerateButton); - - foreach (SmallButton sb in StartCornerButtons) Localize(sb); - foreach (SmallButton sb in JumpButtons) Localize(sb); - foreach (SmallButton sb in SubJumpElements) Localize(sb); - foreach (Subpage sp in AdvancedSettingsSubpages) Localize(sp); - - Localize(GenerateCodeButton); - Localize(ApplyCodeButton); - Localize(SettingsCodeField); - - Localize(ProfileSwitch); - Localize(OverwriteProfileButton); - Localize(DeleteProfileButton); - Localize(SaveAsNewProfileButton); - Localize(ApplyProfileButton); - Localize(ProfileNameField); - Localize(CodeWarningLabel); - - Localize(emptyConnectionsPanelLabel); - - Localize(StartButton); - Localize(ProceedButton); - Localize(redirectStartButton); - Localize(CopyHashButton); - - Localize(resumeButton); - foreach (SmallButton sb in resumeElements) Localize(sb); - } - - /// - /// Applies the parameter settings to the start location page, and refreshes all button states. - ///
Exercise caution, as this triggers several button events and can easily lead to infinite recursion. - ///
- public void UpdateStartLocationSwitch(StartLocationSettings.RandomizeStartLocationType type, string loc) - { - switch (type) - { - default: - case StartLocationSettings.RandomizeStartLocationType.Fixed: - startLocationSwitch.DeselectAll(button => !CanSelectStart(button.Name)); - if (!startLocationSwitch.TrySelect(loc)) - { - startLocationSwitch.SelectFirst(); - } - break; - case StartLocationSettings.RandomizeStartLocationType.Random: - startLocationSwitch.MatchPredicateAndLock(button => CanRandomizeStart(button.Name)); - break; - case StartLocationSettings.RandomizeStartLocationType.RandomExcludingKP: - startLocationSwitch.MatchPredicateAndLock(button => button.Name != "King's Pass" && CanRandomizeStart(button.Name)); - break; - } - } - - private void UpdateStartLocationSwitch(StartLocationSettings.RandomizeStartLocationType type) - { - UpdateStartLocationSwitch( - type, - Settings.StartLocationSettings.StartLocation); - } - - private void UpdateStartLocationSwitch(MenuItem startLocationTypeSwitch) - { - UpdateStartLocationSwitch( - startLocationTypeSwitch.Value, - Settings.StartLocationSettings.StartLocation); - } - - /// - /// Applies the current start location settings to the start location page, and refreshes all button states. - ///
Exercise caution, as this triggers several button events and can easily lead to infinite recursion. - ///
- public void UpdateStartLocationSwitch() - { - UpdateStartLocationSwitch(Settings.StartLocationSettings.StartLocationType, Settings.StartLocationSettings.StartLocation); - } - - private void UpdateStartLocationPreset() - { - if (Settings.StartLocationSettings.StartLocationType != StartLocationSettings.RandomizeStartLocationType.Fixed - && Settings.StartLocationSettings.StartLocation != null) - { - Settings.StartLocationSettings.StartLocation = null; - } - StartLocationPreset.UpdatePreset(); - if (Settings.StartLocationSettings.StartLocationType == StartLocationSettings.RandomizeStartLocationType.Fixed - && StartLocationPresetData.StartLocationPresets.TryGetValue(StartLocationPreset.Value, out StartLocationSettings preset) - && Settings.StartLocationSettings.StartLocation != preset.StartLocation) - { - StartLocationPreset.SetValue("Custom"); - } - - StartLocationPreset.UpdateCaption(); - } - - private void UpdateStartLocation() - { - UpdateStartLocationSwitch(); - UpdateStartLocationPreset(); - } - - private void UpdateStartLocation(object o) - { - UpdateStartLocation(); - } - - public void RefreshSteelSoulLock() - { - ToggleButton shadeSkips = (ToggleButton)skipMEF.ElementLookup[nameof(SkipSettings.ShadeSkips)]; - ToggleButton steelSoul = (ToggleButton)miscMEF.ElementLookup[nameof(MiscSettings.SteelSoul)]; - if (!steelSoul.Value) - { - shadeSkips.Unlock(); - } - else - { - if (shadeSkips.Value) - { - if (shadeSkips.Locked) shadeSkips.Unlock(); - shadeSkips.SetValue(false); - } - shadeSkips.Lock(); - } - } - - public void RefreshSlopeballLock() - { - ToggleButton slopeballs = (ToggleButton)skipMEF.ElementLookup[nameof(SkipSettings.Slopeballs)]; - MenuEnum fireballUpgrade = (MenuEnum)miscMEF.ElementLookup[nameof(MiscSettings.FireballUpgrade)]; - if (!slopeballs.Value) - { - fireballUpgrade.Unlock(); - } - else - { - if (fireballUpgrade.Value != MiscSettings.ToggleableFireballSetting.Toggleable) - { - if (fireballUpgrade.Locked) fireballUpgrade.Unlock(); - fireballUpgrade.SetValue(MiscSettings.ToggleableFireballSetting.Toggleable); - } - fireballUpgrade.Lock(); - } - } - - private void ApplySettingsToMenu(GenerationSettings settings) - { - settings.CopyTo(Settings); // prevent validation events from firing early and modifying result - - poolMEF.SetMenuValues(settings.PoolSettings); - skipMEF.SetMenuValues(settings.SkipSettings); - costMEF.SetMenuValues(settings.CostSettings); - longLocationMEF.SetMenuValues(settings.LongLocationSettings); - startLocationTypeSwitch.SetValue(settings.StartLocationSettings.StartLocationType); - if (settings.StartLocationSettings.StartLocationType == StartLocationSettings.RandomizeStartLocationType.Fixed) - { - startLocationSwitch.TrySelect(settings.StartLocationSettings.StartLocation); - } - startItemMEF.SetMenuValues(settings.StartItemSettings); - miscMEF.SetMenuValues(settings.MiscSettings); - cursedMEF.SetMenuValues(settings.CursedSettings); - transitionMEF.SetMenuValues(settings.TransitionSettings); - novMEF.SetMenuValues(settings.NoveltySettings); - progressionDepthMEF.SetMenuValues(settings.ProgressionDepthSettings); - duplicateItemMEF.SetMenuValues(settings.DuplicateItemSettings); - splitGroupMEF.SetMenuValues(settings.SplitGroupSettings); - - foreach (IMenuPreset preset in PresetButtons) preset.UpdatePreset(); - } - - - Thread? RandomizerThread; - RandoController? rc; - - private void Randomize() - { - AttemptCounter.Set(0); - RandomizationTimer.SetPrefix(Localize("Setting up")); - OutputLabel.Text.text = string.Empty; - OutputLabel.Text.color = Color.white; - OutputLabel.Text.alignment = TextAnchor.UpperCenter; - OutputLabel.Show(); - - RandomizerCore.RandoMonitor rm = new(); - Stopwatch sw = new(); - rm.OnSendEvent += (t, m) => - { - switch (t) - { - case RandomizerCore.RandoEventType.NewAttempt: - ThreadSupport.BeginInvoke(() => AttemptCounter.Incr()); - goto default; - case RandomizerCore.RandoEventType.BeginStage: - if (rm.PreviousStage.HasValue && sw.IsRunning) - { - Log($"Finished stage {rc.stages[rm.PreviousStage.Value.StageIndex].label} ({rm.PreviousStage.Value.State}) in: {sw.Elapsed.TotalSeconds}"); - } - Log($"Randomizer Event: [{t}] - {m}"); - sw.Restart(); - break; - case RandomizerCore.RandoEventType.Error: - if (rm.Stage.HasValue && sw.IsRunning) - { - Log($"Stage {rc.stages[rm.Stage.Value.StageIndex].label} ({rm.Stage.Value.State}) terminated in error after: {sw.Elapsed.TotalSeconds}"); - } - goto default; - case RandomizerCore.RandoEventType.Validating: - if (rm.Stage.HasValue && sw.IsRunning) - { - Log($"Finished stage {rc.stages[rm.Stage.Value.StageIndex].label} ({rm.Stage.Value.State}) in: {sw.Elapsed.TotalSeconds}"); - } - goto default; - default: - Log($"Randomizer Event: [{t}]"); - if (m != null) Log(m); - break; - } - }; - rm.OnError += e => - { - if (e is RandomizerCore.Exceptions.UnreachableLocationException ule) - { - Log(ule.GetVerboseMessage()); - } - }; - - RandomizationTimer.Reset(); - RandomizationTimer.Start(); - - void SplitTimer(string newPrefix, string lastSplitLabel) - { - newPrefix = Localize(newPrefix); - lastSplitLabel = Localize(lastSplitLabel); - string time = RandomizationTimer.Split(newPrefix); - OutputLabel.Text.text += $"{lastSplitLabel}: {time}\n"; - } - rm.OnSendEvent += (e, m) => - { - if (e == RandomizerCore.RandoEventType.Initializing) ThreadSupport.BeginInvoke(() => SplitTimer("Time Randomizing", "Finished setup")); - }; - - RandomizerThread = new Thread(() => - { - try - { - rc = new(Settings, pm, rm); - rc.Run(); - string[] hash = Hash.GetHash(rc.Hash()); - - ThreadSupport.BeginInvoke(() => - { - RandomizationTimer.Stop(); - OutputLabel.Text.text += Localize("Randomization completed successfully!"); - - for (int i = 0; i < Hash.Length; i++) - { - HashLabels[1 + i].Text.text = Localize(hash[i]); - } - HashVIP.Show(); - CopyHashButton.Show(); - - BigButton nextButton = RebuildPostGenerationRedirectPanel() ? ProceedButton : StartButton; - nextButton.Show(); - nextButton.MoveTo(new(0f, -200f)); - FinalPage.backButton.SymSetNeighbor(Neighbor.Up, nextButton); - CopyHashButton.SymSetNeighbor(Neighbor.Down, nextButton); - CopyHashButton.SymSetNeighbor(Neighbor.Up, FinalPage.backButton); - }); - } - catch (Exception e) - { - ThreadSupport.BeginInvoke(() => - { - RandomizationTimer.Stop(); - OutputLabel.Text.color = Color.red; - OutputLabel.Text.text = Localize("Randomization terminated due to error") + ":\n" + e; - OutputLabel.Text.alignment = TextAnchor.UpperLeft; - OutputLabel.Show(); - Log("Randomization terminated due to error:\n" + e); - }); - } - }) - { - - }; - RandomizerThread.Start(); - } - - public void StartRandomizerGame() - { - try - { - rc.Save(); - MenuChangerMod.HideAllMenuPages(); - UIManager.instance.StartNewGame(); - } - catch (Exception e) - { - LogError("Start Game terminated due to error:\n" + e); - FinalPage.Show(); - OutputLabel.Text.color = Color.red; - OutputLabel.Text.text = "Start Game terminated due to error:\n" + e; - OutputLabel.Text.alignment = TextAnchor.UpperLeft; - OutputLabel.Show(); - } - } - - private void Abort() - { - RandomizerThread?.Abort(); - RandomizerThread?.Join(); - RandomizerThread = null; - rc?.Abort(); - rc = null; - ThreadSupport.BeginInvoke(ResetOutputLabel); // the thread will schedule ThreadSupport to send an error to the label - HashVIP.Hide(); - CopyHashButton.Hide(); - StartButton.Hide(); - ProceedButton.Hide(); - FinalPage.backButton.SetNeighbor(Neighbor.Up, null); - FinalPage.backButton.SetNeighbor(Neighbor.Down, null); - StartButton.SetNeighbor(Neighbor.Down, null); - StartButton.SetNeighbor(Neighbor.Up, null); - ProceedButton.SetNeighbor(Neighbor.Down, null); - ProceedButton.SetNeighbor(Neighbor.Up, null); - CopyHashButton.SetNeighbor(Neighbor.Up, null); - CopyHashButton.SetNeighbor(Neighbor.Down, null); - } - - private void ResetOutputLabel() - { - OutputLabel.Text.color = Color.white; - OutputLabel.Text.text = ""; - OutputLabel.Hide(); - } - - private bool CanSelectStart(string name) - { - if (name == null || !StartDefs.TryGetValue(name, out StartDef def)) - { - LogWarn($"Unknown start {name} passed to CanSelectStart"); - return false; - } - - return def.CanBeSelected(pm); - } - - private bool CanRandomizeStart(string name) - { - if (name == null || !StartDefs.TryGetValue(name, out StartDef def)) - { - LogWarn($"Unknown start {name} passed to CanRandomizeStart"); - return false; - } - - return def.CanBeRandomized(pm); - } - - public void RebuildConnectionsPanel() - { - if (!RandomizerMenuConstructor.finished) return; - - List buttons = new(); - foreach (var entry in RandomizerMenuAPI.randoMenuPageConstructors) - { - if (entry.ButtonHandler(ConnectionsPage, out SmallButton button)) - { - buttons.Add(button); - } - } - - connectionsPanel.Clear(); - if (buttons.Count > 0) - { - connectionsPanel.AddRange(buttons); - emptyConnectionsPanelLabel.Hide(); - } - else - { - emptyConnectionsPanelLabel.Show(); - } - } - - /// - /// Polls each subscriber to RandoStartOverride to build the PostGenerationRedirectPage. Returns true if any subscriber returns true. - ///
If this returns true, the Proceed button will be used after rando generation. Otherwise, the Start Game button will be used. - ///
- public bool RebuildPostGenerationRedirectPanel() - { - if (!RandomizerMenuConstructor.finished) return false; - - List buttons = new(); - buttons.Add(redirectStartButton); - foreach (var entry in RandomizerMenuAPI.randoStartOverrides) - { - if (entry.StartHandler(rc, PostGenerationRedirectPage, out BaseButton button)) - { - buttons.Add(button); - } - } - if (buttons.Count < 2) return false; - - postGenerationRedirectPanel.Clear(); - postGenerationRedirectPanel.AddRange(buttons); - return true; - } - - public enum DirectoryOptions - { - DllFolder, - RecentLogFolder - } - - public static void OpenFile(SmallButton self, string fileName, DirectoryOptions directory) - { - fileName = directory switch - { - DirectoryOptions.DllFolder => Path.Combine(RandomizerMod.Folder, fileName), - DirectoryOptions.RecentLogFolder => Path.Combine(Logging.LogManager.RecentDirectory, fileName), - _ => throw new ArgumentException(nameof(directory)), - }; - try - { - System.Diagnostics.Process.Start(fileName); - } - catch (System.ComponentModel.Win32Exception w) - { - switch (w.NativeErrorCode) - { - case 2: - LogError($"Error opening file: File {fileName} was not found."); - break; - default: - LogError(w.ToString()); - break; - } - - if (self != null) - { - self.Text.text = Localize("Error: See ModLog"); - self.Lock(); - } - } - catch (Exception e) - { - LogError(e.ToString()); - if (self != null) - { - self.Text.text = Localize("Error: See ModLog"); - self.Lock(); - } - } - } - } -} diff --git a/RandomizerMod/Menu/RandomizerMenuAPI.cs b/RandomizerMod/Menu/RandomizerMenuAPI.cs deleted file mode 100644 index 9f11633..0000000 --- a/RandomizerMod/Menu/RandomizerMenuAPI.cs +++ /dev/null @@ -1,117 +0,0 @@ -using MenuChanger; -using MenuChanger.MenuElements; -using RandomizerMod.RC; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace RandomizerMod.Menu -{ - public delegate void OnRandomizerMenuConstructionHandler(MenuPage landingPage); - public delegate bool TryGetMenuButtonHandler(MenuPage landingPage, out SmallButton button); - public delegate bool OverrideRandomizerStartHandler(RandoController rc, MenuPage landingPage, out BaseButton button); - public delegate void StartLocationDictModifier(Dictionary startDefs); - internal readonly record struct RandoMenuPageConstructor - (OnRandomizerMenuConstructionHandler ConstructionHandler, TryGetMenuButtonHandler ButtonHandler); - internal readonly record struct RandoStartOverride - (OnRandomizerMenuConstructionHandler ConstructionHandler, OverrideRandomizerStartHandler StartHandler); - public static class RandomizerMenuAPI - { - public static RandomizerMenu Menu => RandomizerMenuConstructor.menu; - - internal static List randoMenuPageConstructors = new(); - public static void AddMenuPage(OnRandomizerMenuConstructionHandler constructionHandler, TryGetMenuButtonHandler buttonHandler) - { - randoMenuPageConstructors.Add(new(constructionHandler, buttonHandler)); - Menu?.RebuildConnectionsPanel(); - } - - public static void RemoveMenuPage(OnRandomizerMenuConstructionHandler constructionHandler, TryGetMenuButtonHandler buttonHandler) - { - randoMenuPageConstructors.Remove(new(constructionHandler, buttonHandler)); - Menu?.RebuildConnectionsPanel(); - } - - internal static List randoStartOverrides = new(); - public static void AddStartGameOverride(OnRandomizerMenuConstructionHandler constructionHandler, OverrideRandomizerStartHandler startHandler) - { - randoStartOverrides.Add(new(constructionHandler, startHandler)); - } - - public static void RemoveStartGameOverride(OnRandomizerMenuConstructionHandler constructionHandler, OverrideRandomizerStartHandler startHandler) - { - randoStartOverrides.Remove(new(constructionHandler, startHandler)); - } - - public static event StartLocationDictModifier OnGenerateStartLocationDict; - public static Dictionary GenerateStartLocationDict() - { - Dictionary starts = RandomizerData.Data.GetStartNames().ToDictionary(s => s, s => RandomizerData.Data.GetStartDef(s)); - try - { - OnGenerateStartLocationDict?.Invoke(starts); - } - catch (Exception e) - { - LogError($"Error invoking OnGenerateStartLocationList:\n{e}"); - } - return starts; - } - } - - /* - public class TestPage1 - { - public static void Test() - { - for (int i = 0; i < 100; i++) - { - TestPage1 tp = new(); - RandomizerMenuAPI.AddMenuPage(tp.OnConstruct, tp.TryGetButton); - } - } - - public ToggleButton button; - - public void OnConstruct(MenuPage page) - { - button = new(page, "Test"); - } - - public bool TryGetButton(MenuPage page, out SmallButton button) - { - button = this.button; - if (button == null) throw new InvalidOperationException(); - return true; - } - } - public class TestPage2 - { - public static void Test() - { - for (int i = 0; i < 100; i++) - { - TestPage2 tp = new(); - RandomizerMenuAPI.AddStartGameOverride(tp.OnConstruct, tp.TryGetButton); - } - } - - public BigButton button; - - public void OnConstruct(MenuPage page) - { - button = new(page, "Test"); - button.OnClick += RandomizerMenuAPI.Menu.StartRandomizerGame; - } - - public bool TryGetButton(RandoController rc, MenuPage page, out BaseButton button) - { - button = this.button; - if (button == null) throw new InvalidOperationException(); - return true; - } - } - */ -} diff --git a/RandomizerMod/PriorityEvent.cs b/RandomizerMod/PriorityEvent.cs deleted file mode 100644 index 08e185f..0000000 --- a/RandomizerMod/PriorityEvent.cs +++ /dev/null @@ -1,77 +0,0 @@ -using RandomizerCore.Collections; - -namespace RandomizerMod -{ - public class PriorityEvent - { - public PriorityEvent(out IPriorityEventOwner p) - { - p = new PriorityEventOwner(this); - } - - private readonly SortedArrayList _entries = new(Comparer.Default, EqualityComparer.Default); - private PriorityEntry[] _cachedSubscriberArray; - private bool _cacheInvalidated = true; - - public void Subscribe(float key, T value) - { - _entries.Add(new(key, value)); - _cacheInvalidated = true; - } - - public void Unsubscribe(float key, T value) - { - if (_entries.Remove(new(key, value))) - { - _cacheInvalidated = true; - } - } - - public interface IPriorityEventOwner - { - /// - /// Returns an ordered enumerable of the event's subscribers at the moment of the request. - /// - IEnumerable GetSubscribers(); - /// - /// Returns an ordered enumerable of the event's subscribers in the specified priority range, with inclusive bounds. - /// - IEnumerable GetSubscriberRange(float min, float max); - - } - - private class PriorityEventOwner : IPriorityEventOwner - { - public PriorityEventOwner(PriorityEvent _parent) => this._parent = _parent; - private readonly PriorityEvent _parent; - public IEnumerable GetSubscribers() - { - if (_parent._cacheInvalidated) - { - _parent._cachedSubscriberArray = _parent._entries.ToArray(); - _parent._cacheInvalidated = false; - } - - return _parent._cachedSubscriberArray.Select(kvp => kvp.Value); - } - - public IEnumerable GetSubscriberRange(float min, float max) - { - int lb = _parent._entries.FindInclusiveLowerBound(new (min, default)); - int ub = _parent._entries.FindExclusiveUpperBound(new (max, default)); - - T[] result = new T[ub - lb]; - for (int i = lb; i < ub; i++) result[i - lb] = _parent._entries[i].Value; - return result; - } - } - - public readonly record struct PriorityEntry(float Key, T Value) : IComparable - { - public int CompareTo(PriorityEvent.PriorityEntry other) - { - return Key.CompareTo(other.Key); - } - } - } -} diff --git a/RandomizerMod/Properties/AssemblyInfo.cs b/RandomizerMod/Properties/AssemblyInfo.cs deleted file mode 100644 index 8664d02..0000000 --- a/RandomizerMod/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("8b1ab441-2e8a-49eb-87bd-8e1c9729ad00")] diff --git a/RandomizerMod/RC/CharmNotchCosts.cs b/RandomizerMod/RC/CharmNotchCosts.cs deleted file mode 100644 index 1d992f1..0000000 --- a/RandomizerMod/RC/CharmNotchCosts.cs +++ /dev/null @@ -1,81 +0,0 @@ -namespace RandomizerMod.RC -{ - public static class CharmNotchCosts - { - public static int[] _vanillaCosts; - - public static int GetVanillaCost(int id) => _vanillaCosts[id - 1]; - - public static int[] GetUniformlyRandomCosts(Random rng, int min, int max) - { - if (max > 240) throw new ArgumentOutOfRangeException(nameof(max)); - if (min < 0 || min > max) throw new ArgumentOutOfRangeException(nameof(min)); - - int count = rng.Next(min, max + 1); - int[] costs = new int[40]; - - for (int i = 0; i < count; i++) - { - int index; - do - { - index = rng.Next(40); - } - while (costs[index] >= 6); - - costs[index]++; - } - - return costs; - } - - - static CharmNotchCosts() - { - _vanillaCosts = new int[] - { - 1, - 1, - 1, - 2, - 2, - 2, - 3, - 2, - 3, - 1, - 3, - 1, - 3, - 1, - 2, - 2, - 1, - 2, - 3, - 2, - 4, - 2, - 2, - 2, - 3, - 1, - 4, - 2, - 4, - 1, - 2, - 3, - 2, - 4, - 3, - 5, - 1, - 3, - 2, - 2 - }; - - } - } -} diff --git a/RandomizerMod/RC/CustomGeoItem.cs b/RandomizerMod/RC/CustomGeoItem.cs deleted file mode 100644 index 20103f2..0000000 --- a/RandomizerMod/RC/CustomGeoItem.cs +++ /dev/null @@ -1,19 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.LogicItems; - -namespace RandomizerMod.RC -{ - public class CustomGeoItem : RandoModItem - { - public int geo; - - [Newtonsoft.Json.JsonConstructor] - private CustomGeoItem() { } - - public CustomGeoItem(LogicManager lm, int geo) - { - this.geo = geo; - item = new SingleItem($"{geo}_Geo", new(lm.GetTermStrict("GEO"), geo)); - } - } -} diff --git a/RandomizerMod/RC/ItemPlacement.cs b/RandomizerMod/RC/ItemPlacement.cs deleted file mode 100644 index 4e53fc3..0000000 --- a/RandomizerMod/RC/ItemPlacement.cs +++ /dev/null @@ -1,26 +0,0 @@ -using RandomizerCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace RandomizerMod.RC -{ - public readonly record struct ItemPlacement(RandoModItem Item, RandoModLocation Location) - { - /// - /// The index of the item placement in the RandoModContext item placements. Initialized to -1 if the placement is not part of the ctx. - /// - public int Index { get; init; } = -1; - - public void Deconstruct(out RandoModItem item, out RandoModLocation location) - { - item = Item; - location = Location; - } - - public static implicit operator GeneralizedPlacement(ItemPlacement p) => new(p.Item, p.Location); - public static explicit operator ItemPlacement(GeneralizedPlacement p) => new((RandoModItem)p.Item, (RandoModLocation)p.Location); - } -} diff --git a/RandomizerMod/RC/LogicConstUtil.cs b/RandomizerMod/RC/LogicConstUtil.cs deleted file mode 100644 index ae42516..0000000 --- a/RandomizerMod/RC/LogicConstUtil.cs +++ /dev/null @@ -1,34 +0,0 @@ -using RandomizerMod.RandomizerData; - -namespace RandomizerMod.RC -{ - public static class LogicConstUtil - { - private static readonly string[] _charmTerms; - private static readonly Dictionary _charmIDs; - - /// - /// Returns the term name corresponding to the (1-based) charm ID. - /// - public static string GetCharmTerm(int charmID) - { - return _charmTerms[charmID - 1]; - } - - /// - /// Returns the (1-based) charm ID corresponding to the charm term name. - /// - public static int GetCharmID(string charmTermName) - { - return _charmIDs[charmTermName]; - } - - static LogicConstUtil() - { - // TODO: const string fields? - _charmTerms = JsonUtil.Deserialize>>("RandomizerMod.Resources.Logic.terms.json")["SignedByte"].SkipWhile(t => t != "Gathering_Swarm").Take(40).ToArray(); - _charmIDs = _charmTerms.Select((s, i) => (s, i)).ToDictionary(p => p.s, p => p.i + 1); - _charmIDs["White_Fragment"] = _charmIDs["Queen_Fragment"] = _charmIDs["King_Fragment"] = _charmIDs["Kingsoul"] = _charmIDs["Void_Heart"] = 36; // aliases of WHITEFRAGMENT - } - } -} diff --git a/RandomizerMod/RC/LogicGeoCost.cs b/RandomizerMod/RC/LogicGeoCost.cs deleted file mode 100644 index 72cf8c7..0000000 --- a/RandomizerMod/RC/LogicGeoCost.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using RandomizerCore.Logic; - -namespace RandomizerMod.RC -{ - public class LogicGeoCost : LogicCost - { - public Term CanReplenishGeoWaypoint { get; init; } - public int GeoAmount { get; set; } - - public LogicGeoCost() { } - - public LogicGeoCost(LogicManager lm, int amount) - { - CanReplenishGeoWaypoint = lm.GetTermStrict("Can_Replenish_Geo"); - GeoAmount = amount; - } - - public override bool CanGet(ProgressionManager pm) - { - return pm.Has(CanReplenishGeoWaypoint.Id); - } - - public override IEnumerable GetTerms() - { - yield return CanReplenishGeoWaypoint; - } - - public override string ToString() - { - return $"LogicGeoCost {{{GeoAmount} Geo}}"; - } - - } -} diff --git a/RandomizerMod/RC/LogicInts/NotchCostInt.cs b/RandomizerMod/RC/LogicInts/NotchCostInt.cs deleted file mode 100644 index fc91133..0000000 --- a/RandomizerMod/RC/LogicInts/NotchCostInt.cs +++ /dev/null @@ -1,50 +0,0 @@ -using RandomizerCore.Logic; - -namespace RandomizerMod.RC.LogicInts -{ - /// - /// LogicInt which returns 1 less than the number of notches to equip the charm with or without overcharming. - /// - [Obsolete("Use EquipCharmVariable")] - public class NotchCostInt : LogicInt - { - // the ids should correspond to the 1-40 charm nums (i.e. 1-indexed) - public readonly int[] charmIDs; - public override string Name { get; } - public const string Prefix = "$NotchCost"; - - public NotchCostInt(params int[] charmIDs) - { - this.charmIDs = charmIDs; - Array.Sort(charmIDs); - Name = $"$NotchCost[{string.Join(",", charmIDs)}]"; - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (VariableResolver.TryMatchPrefix(term, Prefix, out string[] parameters)) - { - int[] charmIDs = parameters.Select(int.Parse).ToArray(); - variable = new NotchCostInt(charmIDs); - return true; - } - variable = null; - return false; - } - - public override int GetValue(object? sender, ProgressionManager pm) - { - List notchCosts = (pm.ctx as RandoModContext)?.notchCosts; - if (notchCosts != null && notchCosts.Count >= charmIDs[charmIDs.Length - 1]) - { - return charmIDs.Sum(i => notchCosts[i - 1]) - charmIDs.Max(i => notchCosts[i - 1]); - } - else - { - return charmIDs.Sum(i => CharmNotchCosts.GetVanillaCost(i)) - charmIDs.Max(i => CharmNotchCosts.GetVanillaCost(i)); - } - } - - public override IEnumerable GetTerms() => Enumerable.Empty(); - } -} diff --git a/RandomizerMod/RC/LogicInts/SafeNotchCostInt.cs b/RandomizerMod/RC/LogicInts/SafeNotchCostInt.cs deleted file mode 100644 index ce285c0..0000000 --- a/RandomizerMod/RC/LogicInts/SafeNotchCostInt.cs +++ /dev/null @@ -1,50 +0,0 @@ -using RandomizerCore.Logic; - -namespace RandomizerMod.RC.LogicInts -{ - /// - /// LogicInt which returns 1 less than the number of notches needed to equip the charm without overcharming. - /// - [Obsolete("Use EquipCharmVariable")] - public class SafeNotchCostInt : LogicInt - { - // the ids should correspond to the 1-40 charm nums (i.e. 1-indexed) - public readonly int[] charmIDs; - public override string Name { get; } - public const string Prefix = "$SafeNotchCost"; - - public SafeNotchCostInt(params int[] charmIDs) - { - this.charmIDs = charmIDs; - Array.Sort(charmIDs); - Name = $"$SafeNotchCost[{string.Join(",", charmIDs)}]"; - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (VariableResolver.TryMatchPrefix(term, Prefix, out string[] parameters)) - { - int[] charmIDs = parameters.Select(int.Parse).ToArray(); - variable = new SafeNotchCostInt(charmIDs); - return true; - } - variable = null; - return false; - } - - public override int GetValue(object? sender, ProgressionManager pm) - { - List notchCosts = (pm.ctx as RandoModContext)?.notchCosts; - if (notchCosts != null && notchCosts.Count >= charmIDs[charmIDs.Length - 1]) - { - return charmIDs.Sum(i => notchCosts[i - 1]) - 1; - } - else - { - return charmIDs.Sum(i => CharmNotchCosts.GetVanillaCost(i)) - 1; - } - } - - public override IEnumerable GetTerms() => Enumerable.Empty(); - } -} diff --git a/RandomizerMod/RC/LogicInts/StartLocationDelta.cs b/RandomizerMod/RC/LogicInts/StartLocationDelta.cs deleted file mode 100644 index f993074..0000000 --- a/RandomizerMod/RC/LogicInts/StartLocationDelta.cs +++ /dev/null @@ -1,52 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; -using RandomizerMod.Settings; - -namespace RandomizerMod.RC.LogicInts -{ - /// - /// LogicInt which is true exactly when the GenerationSettings StartLocation equals its argument. - /// - public class StartLocationDelta : StateProvider - { - protected readonly Term? StartStateTerm; // null in files generated before state logic - public override string Name { get; } - public string Location { get; } - public const string Prefix = "$StartLocation"; - - public StartLocationDelta(string name, LogicManager lm, string location) - { - Location = location; - Name = name; - StartStateTerm = lm.GetTerm("Start_State"); - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (VariableResolver.TryMatchPrefix(term, Prefix, out string[] parameters)) - { - string location = parameters[0]; - variable = new StartLocationDelta(term, lm, location); - return true; - } - variable = null; - return false; - } - - public override StateUnion? GetInputState(object? sender, ProgressionManager pm) - { - if (pm.ctx is not RandoModContext { GenerationSettings: GenerationSettings gs }) throw new NullReferenceException("StartLocationDelta evaluated on pm without attached ctx with generation settings."); - - return gs.StartLocationSettings.StartLocation == Location - ? StartStateTerm is not null - ? pm.GetState(StartStateTerm) - : StateUnion.Empty - : null; - } - - public override IEnumerable GetTerms() - { - if (StartStateTerm is not null) yield return StartStateTerm; - } - } -} diff --git a/RandomizerMod/RC/PlaceholderItem.cs b/RandomizerMod/RC/PlaceholderItem.cs deleted file mode 100644 index 2d1abf0..0000000 --- a/RandomizerMod/RC/PlaceholderItem.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using RandomizerCore; -using RandomizerCore.LogicItems; - -namespace RandomizerMod.RC -{ - /// - /// A wrapper for a RandoModItem to allow it to be ignored by logic. - ///
Used mainly with duplicate progression, to avoid skewing. - ///
- public class PlaceholderItem : RandoModItem - { - public const string Prefix = "Placeholder-"; - - public PlaceholderItem(RandoModItem innerItem, bool wrapped = true) - { - this.innerItem = innerItem; - this.info = innerItem.info?.Clone() ?? new(); - this.info.realItemCreator ??= ((factory, next) => factory.MakeItemWithEvents(innerItem.Name, next)); - if (wrapped) Wrap(); - else Unwrap(); - } - - /// - /// Hides the innerItem of the PlaceholderItem from logic. - /// - public void Wrap() - { - wrapped = true; - item = new EmptyItem($"Placeholder-{innerItem.Name}"); - } - - /// - /// Makes the innerItem of the PlaceholderItem visible to logic. - /// - public void Unwrap() - { - wrapped = false; - item = innerItem.item; - } - - public readonly RandoModItem innerItem; - public bool wrapped; - } -} diff --git a/RandomizerMod/RC/ProgressionInitializer.cs b/RandomizerMod/RC/ProgressionInitializer.cs deleted file mode 100644 index f945b21..0000000 --- a/RandomizerMod/RC/ProgressionInitializer.cs +++ /dev/null @@ -1,81 +0,0 @@ -using RandomizerCore; -using RandomizerCore.Logic; -using RandomizerMod.RandomizerData; -using RandomizerMod.Settings; - -namespace RandomizerMod.RC -{ - public class ProgressionInitializer : ILogicItem - { - /// - /// Event invoked after base randomizer term modifiers are added to the initializer. - /// - public static event Action OnCreateProgressionInitializer; - - public ProgressionInitializer() { } - public ProgressionInitializer(LogicManager lm, GenerationSettings gs, StartDef startDef) - { - foreach (string setting in Data.GetApplicableLogicSettings(gs)) - { - Setters.Add(new(lm.GetTermStrict(setting), 1)); - } - - Setters.Add(new(lm.GetTermStrict(gs.TransitionSettings.Mode switch - { - TransitionSettings.TransitionMode.None => "ITEMRANDO", - TransitionSettings.TransitionMode.MapAreaRandomizer => "MAPAREARANDO", - TransitionSettings.TransitionMode.FullAreaRandomizer => "FULLAREARANDO", - _ => "ROOMRANDO", - }), 1)); - - foreach (TermValue tv in startDef.GetStartLocationProgression(lm)) - { - if (tv.Term.Type == TermType.State) StartStateLinkedTerms.Add(tv.Term); - else Setters.Add(tv); - } - - Setters.Add(new(lm.GetTermStrict("GRUBS"), -gs.CostSettings.GrubTolerance)); - Setters.Add(new(lm.GetTermStrict("ESSENCE"), -gs.CostSettings.EssenceTolerance)); - Setters.Add(new(lm.GetTermStrict("RANCIDEGGS"), -gs.CostSettings.EggTolerance)); - Setters.Add(new(lm.GetTermStrict("CHARMS"), -gs.CostSettings.CharmTolerance)); - - Setters.Add(new(lm.GetTermStrict("MASKSHARDS"), 20 - 4 * gs.CursedSettings.CursedMasks)); - Setters.Add(new(lm.GetTermStrict("NOTCHES"), 3 - gs.CursedSettings.CursedNotches)); - - StartStateTerm = lm.GetTerm("Start_State"); - - try - { - OnCreateProgressionInitializer?.Invoke(lm, gs, this); - } - catch (Exception e) - { - throw new InvalidOperationException("Error invoking OnCreateProgressionInitializer", e); - } - } - - public List Setters = new(); - public List Increments = new(); - public List StartStateLinkedTerms = new(); - public Term? StartStateTerm; - - public string Name => "Progression Initializer"; - - public void AddTo(ProgressionManager pm) - { - foreach (TermValue tv in Setters) pm.Set(tv); - foreach (TermValue tv in Increments) pm.Incr(tv); - if (StartStateTerm is not null && !pm.mu.HasCustomLongTermRevertPoint) - { - foreach (Term t in StartStateLinkedTerms) pm.mu.LinkState(StartStateTerm, t); - } - } - - public IEnumerable GetAffectedTerms() - { - foreach (TermValue tv in Setters) yield return tv.Term; - foreach (TermValue tv in Increments) yield return tv.Term; - if (StartStateTerm is not null) yield return StartStateTerm; - } - } -} diff --git a/RandomizerMod/RC/RCData.cs b/RandomizerMod/RC/RCData.cs deleted file mode 100644 index d55b4ab..0000000 --- a/RandomizerMod/RC/RCData.cs +++ /dev/null @@ -1,56 +0,0 @@ -using RandomizerCore.Json; -using RandomizerCore.Logic; -using RandomizerMod.Settings; - -namespace RandomizerMod.RC -{ - public static class RCData - { - private static readonly (LogicFileType type, string fileName)[] files = new[] - { - (LogicFileType.Terms, "terms"), - (LogicFileType.Macros, "macros"), - (LogicFileType.Waypoints, "waypoints"), - (LogicFileType.Transitions, "transitions"), - (LogicFileType.Locations, "locations"), - (LogicFileType.ItemStrings, "items") - // state.json is loaded in RandoVariableResolver.cs - }; - - /// - /// Creates a new LogicManager, allowing edits from local files and runtime hooks. - /// - public static LogicManager GetNewLogicManager(GenerationSettings gs) - { - LogicManagerBuilder lmb = new() { VariableResolver = new RandoVariableResolver() }; - ILogicFormat fmt = new JsonLogicFormat(); - - foreach ((LogicFileType type, string fileName) in files) - { - lmb.DeserializeFile(type, fmt, RandomizerMod.Assembly.GetManifestResourceStream($"RandomizerMod.Resources.Logic.{fileName}.json")); - } - - foreach (var a in _runtimeLogicOverrideOwner.GetSubscribers()) - { - try - { - a?.Invoke(gs, lmb); - } - catch (Exception e) - { - throw new InvalidOperationException($"Error invoking logic override event from {a?.Method?.DeclaringType?.AssemblyQualifiedName ?? "unknown source"}", e); - } - } - - return new(lmb); - } - - /// - /// Event invoked when building the LogicManager for randomization. - ///
A subscriber with a nonpositive key is invoked before local logic edits. - ///
A subscriber with a positive key is invoked after local logic edits. - ///
- public static readonly PriorityEvent> RuntimeLogicOverride = new(out _runtimeLogicOverrideOwner); - private static readonly PriorityEvent>.IPriorityEventOwner _runtimeLogicOverrideOwner; - } -} diff --git a/RandomizerMod/RC/RandoController.cs b/RandomizerMod/RC/RandoController.cs deleted file mode 100644 index e41c899..0000000 --- a/RandomizerMod/RC/RandoController.cs +++ /dev/null @@ -1,262 +0,0 @@ -using System.Diagnostics; -using System.Text; -using Newtonsoft.Json; -using RandomizerCore; -using RandomizerCore.Extensions; -using RandomizerCore.Json; -using RandomizerCore.Randomization; -using RandomizerMod.IC; -using RandomizerMod.Logging; -using RandomizerMod.Settings; - -namespace RandomizerMod.RC -{ - public class RandoController - { - public RandoModContext? ctx; - public RequestBuilder? rb; - public readonly GenerationSettings gs; - public readonly RandoMonitor rm; - public readonly SettingsPM pm; - public readonly Random rng; - public LogArguments? args; - public RandomizationStage[]? stages; - public List[]>? stagedPlacements; - public Randomizer? randomizer; - - /// - /// Event invoked on the RandoController immediately after sending all data to ItemChanger, but before printing logs and activating tracker data. - /// - public static event Action? OnExportCompleted; - /// - /// Event which allows external subscribers to modify the hash. Each subscriber is invoked separately, and the results are combined into the hash seed. - ///
Return values of 0 are ignored, and do not modify the hash. - ///
The second argument is the base hash seed, depending only on the generation settings and the placement data. - ///
- public static event Func? OnCalculateHash; - /// - /// Event invoked at the start of . - /// - public static event Action? OnBeginRun; - /// - /// Event invoked if the RandoController is discarded after beginning a . - /// - public static event Action? OnAbort; - /// - /// Event invoked after running the RequestBuilder. - /// - public static event Action? OnRequestBuilt; - /// - /// Event for adding properties to log arguments before export and logging. - /// - public static event Action? OnCreateLogArguments; - - - public RandoController(GenerationSettings gs, SettingsPM pm, RandoMonitor rm) - { - this.gs = gs.Clone() as GenerationSettings; - this.gs.Clamp(); - this.rm = rm; - this.pm = pm; - rng = new Random(gs.Seed + 4); - } - - public void Run() - { - try - { - OnBeginRun?.Invoke(this); - } - catch (Exception e) - { - throw new InvalidOperationException("Error invoking OnBeginRun", e); - } - - rm.OnNewAttempt += () => Profiling.Revert(); - - Profiling.Revert(); - rb = new(gs, pm, rm); - rb.Run(out stages, out ctx); - Profiling.Commit(); - - try - { - OnRequestBuilt?.Invoke(this); - } - catch (Exception e) - { - throw new InvalidOperationException("Error invoking OnRequestBuilt", e); - } - - randomizer = new(new Random(gs.Seed), ctx, stages, rm); - try - { - stagedPlacements = randomizer.Run(); - } - catch - { - Profiling.Revert(); - LogDebug("Randomization failed. Profiling results for all attempts:"); - Profiling.Log(true); - throw; - } - - Profiling.Commit(); - LogDebug("Randomization completed successfully. Profiling results for succeeded attempts:"); - Profiling.Log(); - LogDebug("Profiling results for all attempts:"); - Profiling.Log(true); - for (int i = 0; i < stagedPlacements.Count; i++) - { - for (int j = 0; j < stagedPlacements[i].Length; j++) - { - foreach (RandoPlacement placement in stagedPlacements[i][j]) - { - if (placement.Item is RandoModItem item && placement.Location is RandoModLocation location) - { - item.info?.onRandomizerFinish?.Invoke(placement); - location.info?.onRandomizerFinish?.Invoke(placement); - ctx.itemPlacements.Add(new(item, location)); - } - else if (placement.Item is RandoModTransition target && placement.Location is RandoModTransition source) - { - target.info?.onRandomizerFinish?.Invoke(placement); - source.info?.onRandomizerFinish?.Invoke(placement); - ctx.transitionPlacements.Add(new(target, source)); - } - else - { - throw new InvalidOperationException($"Unknown placement type found in randomizer result with {placement.Item} at {placement.Location}"); - } - } - } - } - } - - public int Hash() - { - using System.Security.Cryptography.SHA256Managed sHA256 = new(); - using StringWriter sw = new(); - JsonSerializer js = new() - { - DefaultValueHandling = DefaultValueHandling.Include, - Formatting = Formatting.None, - TypeNameHandling = TypeNameHandling.Auto, - }; - js.Converters.Add(new RandomizerCore.Json.Converters.TermConverter() { Terms = ctx.LM.Terms }); - - js.Serialize(sw, gs); - - js.Serialize(sw, ctx.notchCosts); - js.Serialize(sw, ctx.itemPlacements); - js.Serialize(sw, ctx.transitionPlacements); - - StringBuilder sb = sw.GetStringBuilder(); - sb.Replace("\r", string.Empty); - sb.Replace("\n", string.Empty); - - byte[] sha = sHA256.ComputeHash(Encoding.UTF8.GetBytes(sb.ToString())); - - int seed = 17; - for (int i = 0; i < sha.Length; i++) seed = 31 * seed ^ sha[i]; - - if (OnCalculateHash != null) - { - int modSeed = 0; - foreach (Func f in OnCalculateHash.GetInvocationList()) - { - try - { - int result = f(this, seed); - if (result != 0) - { - modSeed = modSeed * 1566083941 + result; - } - } - catch (Exception e) - { - throw new InvalidOperationException($"Error invoking delegate {f.Method.Name} in OnCalculateHash", e); - } - } - seed += modSeed << 16; // preserve the lower 16 bits from the original hash. If all results are 0, then modSeed is 0 and seed is unmodified. - } - - return seed; - } - - public void Save() - { - args = new() - { - ctx = new RandoModContext(ctx), // we clone the context for the loggers so that we can obfuscate progression on the ctx used for Export, - gs = gs, - randomizer = randomizer, - properties = new(rb.logProperties), - }; - try - { - OnCreateLogArguments?.Invoke(args); - } - catch (Exception e) - { - throw new InvalidOperationException("Error invoking OnCreateLogArguments", e); - } - - rng.PermuteInPlace(ctx.itemPlacements); - for (int i = 0; i < ctx.itemPlacements.Count; i++) ctx.itemPlacements[i] = ctx.itemPlacements[i] with { Index = i }; - rng.PermuteInPlace(ctx.transitionPlacements); - - RandomizerMod.RS = new() - { - GenerationSettings = gs, - Context = ctx, - ProfileID = GameManager.instance.profileID, - TrackerData = new() { AllowSequenceBreaks = true, logFileName = "TrackerDataDebugHistory.txt", }, - TrackerDataWithoutSequenceBreaks = new() { AllowSequenceBreaks = false, logFileName = "TrackerDataWithoutSequenceBreaksDebugHistory.txt", } - }; - - Export.BeginExport(gs, ctx); - Export.ExportStart(gs, ctx); - Export.ExportItemPlacements(rb, ctx.itemPlacements); - Export.ExportTransitionPlacements(rb, ctx.transitionPlacements); - - try - { - OnExportCompleted?.Invoke(this); - } - catch (Exception e) - { - throw new InvalidOperationException("Error invoking OnExportCompleted", e); - } - - LogManager.InitDirectory(); - WriteRawSpoiler(gs, ctx); // write it here and not in LogManager so that it uses the permuted context - LogManager.WriteLogs(args); - - RandomizerMod.RS.TrackerData.Setup(gs, ctx); - RandomizerMod.RS.TrackerDataWithoutSequenceBreaks.Setup(gs, ctx); - } - - private static void WriteRawSpoiler(GenerationSettings gs, RandoContext ctx) - { - Stopwatch sw = Stopwatch.StartNew(); - LogManager.Write((tw) => - { - JsonUtil.GetNonLogicSerializer().Serialize(tw, ctx); - Log($"Printed raw spoiler in {sw.Elapsed.TotalSeconds} seconds."); - }, "RawSpoiler.json"); - } - - public void Abort() - { - try - { - OnAbort?.Invoke(this); - } - catch (Exception e) - { - throw new InvalidOperationException("Error invoking OnAbort", e); - } - } - } -} diff --git a/RandomizerMod/RC/RandoModContext.cs b/RandomizerMod/RC/RandoModContext.cs deleted file mode 100644 index 701fd7e..0000000 --- a/RandomizerMod/RC/RandoModContext.cs +++ /dev/null @@ -1,52 +0,0 @@ -using Newtonsoft.Json; -using RandomizerCore; -using RandomizerCore.Logic; -using RandomizerMod.RandomizerData; -using RandomizerMod.Settings; - -namespace RandomizerMod.RC -{ - public class RandoModContext : RandoContext - { - public RandoModContext(LogicManager LM) : base(LM) { } - - public RandoModContext(GenerationSettings gs, StartDef startDef) : base(RCData.GetNewLogicManager(gs)) - { - base.InitialProgression = new ProgressionInitializer(LM, gs, startDef); - this.GenerationSettings = gs; - this.StartDef = startDef; - } - - public RandoModContext(RandoModContext ctx) : base(ctx.LM) - { - notchCosts = ctx.notchCosts.ToList(); - itemPlacements = ctx.itemPlacements.ToList(); - transitionPlacements = ctx.transitionPlacements.ToList(); - StartDef = ctx.StartDef; - InitialProgression = ctx.InitialProgression; - Vanilla = ctx.Vanilla.ToList(); - GenerationSettings = ctx.GenerationSettings; - } - - public GenerationSettings GenerationSettings { get; init; } - public StartDef StartDef { get; init; } - - public List Vanilla = new(); - public List itemPlacements = new(); - [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] - public List transitionPlacements = new(); - public List notchCosts = new(); - /// - /// Additional data needed for logic; e.g. parameters for LogicVariables like notch costs, etc. - /// - public Dictionary Properties { get; } = []; - - public override IEnumerable EnumerateExistingPlacements() - { - foreach (GeneralizedPlacement p in Vanilla) yield return p; - foreach (ItemPlacement p in itemPlacements) yield return p; - foreach (TransitionPlacement p in transitionPlacements) yield return p; - } - - } -} diff --git a/RandomizerMod/RC/RandoModItem.cs b/RandomizerMod/RC/RandoModItem.cs deleted file mode 100644 index eff0ded..0000000 --- a/RandomizerMod/RC/RandoModItem.cs +++ /dev/null @@ -1,26 +0,0 @@ -using ItemChanger; -using RandomizerCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Newtonsoft.Json; -using RandomizerMod.RandomizerData; - -namespace RandomizerMod.RC -{ - public class RandoModItem : RandoItem - { - /// - /// The ItemRequestInfo associated with the item. May be null if the item does not require modification. - ///
This field is not serialized and will be null upon reloading the game. - ///
- [JsonIgnore] public ItemRequestInfo? info; - /// - /// The ItemDef associated with the location. Preferred over Data.GetItemDef, since this preserves modified item data. - ///
This field is serialized, and is safe to use after reloading the game. May rarely be null for external items which choose not to supply a value. - ///
- public ItemDef ItemDef; - } -} diff --git a/RandomizerMod/RC/RandoModLocation.cs b/RandomizerMod/RC/RandoModLocation.cs deleted file mode 100644 index d44f3dc..0000000 --- a/RandomizerMod/RC/RandoModLocation.cs +++ /dev/null @@ -1,21 +0,0 @@ -using ItemChanger; -using Newtonsoft.Json; -using RandomizerCore; -using RandomizerMod.RandomizerData; - -namespace RandomizerMod.RC -{ - public class RandoModLocation : RandoLocation - { - /// - /// The LocationRequestInfo associated with the location. May be null if the location does not require modification. - ///
This field is not serialized and will be null upon reloading the game. - ///
- [JsonIgnore] public LocationRequestInfo? info; - /// - /// The LocationDef associated with the location. Preferred over Data.GetLocationDef, since this preserves modified location data. - ///
This field is serialized, and is safe to use after reloading the game. May rarely be null for external locations which choose not to supply a value. - ///
- public LocationDef LocationDef; - } -} diff --git a/RandomizerMod/RC/RandoModTransition.cs b/RandomizerMod/RC/RandoModTransition.cs deleted file mode 100644 index 35589a5..0000000 --- a/RandomizerMod/RC/RandoModTransition.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Newtonsoft.Json; -using RandomizerCore; -using RandomizerCore.Logic; -using RandomizerMod.RandomizerData; - -namespace RandomizerMod.RC -{ - public class RandoModTransition : RandoTransition - { - /// - /// The TransitionRequestInfo associated with the transition. May be null if the transition does not require modification. - ///
This field is not serialized and will be null upon reloading the game. - ///
- [JsonIgnore] public TransitionRequestInfo? info; - /// - /// The TransitionDef associated with the location. Preferred over Data.GetTransitionDef, since this preserves modified transition data. - ///
This field is serialized, and is safe to use after reloading the game. - ///
- public TransitionDef TransitionDef; - public RandoModTransition(LogicTransition lt) : base(lt) { } - } -} diff --git a/RandomizerMod/RC/RandoVariableResolver.cs b/RandomizerMod/RC/RandoVariableResolver.cs deleted file mode 100644 index 9d198e9..0000000 --- a/RandomizerMod/RC/RandoVariableResolver.cs +++ /dev/null @@ -1,52 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; -using RandomizerMod.RC.LogicInts; -using RandomizerMod.RC.StateVariables; - -namespace RandomizerMod.RC -{ - public class RandoVariableResolver : VariableResolver - { - public override StateManagerBuilder GetStateModel() - { - StateManagerBuilder smb = base.GetStateModel(); - RawStateData rsd = new RandomizerCore.Json.JsonLogicFormat() - .LoadStateData(RandomizerMod.Assembly.GetManifestResourceStream($"RandomizerMod.Resources.Logic.state.json")); - smb.AppendRawStateData(rsd); - return smb; - } - - public override bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (base.TryMatch(lm, term, out variable)) return true; - - if (StartLocationDelta.TryMatch(lm, term, out variable)) return true; - if (BenchResetVariable.TryMatch(lm, term, out variable)) return true; - if (CastSpellVariable.TryMatch(lm, term, out variable)) return true; - if (SlopeballVariable.TryMatch(lm, term, out variable)) return true; - if (ShriekPogoVariable.TryMatch(lm, term, out variable)) return true; - if (SoulStateManager.TryMatch(lm, term, out variable)) return true; - if (SpendSoulVariable.TryMatch(lm, term, out variable)) return true; - if (RegainSoulVariable.TryMatch(lm, term, out variable)) return true; - if (EquipCharmVariable.TryMatch(lm, term, out variable)) return true; - if (HotSpringResetVariable.TryMatch(lm, term, out variable)) return true; - if (ShadeStateVariable.TryMatch(lm, term, out variable)) return true; - if (TakeDamageVariable.TryMatch(lm, term, out variable)) return true; - if (HPStateManager.TryMatch(lm, term, out variable)) return true; - if (LifebloodCountVariable.TryMatch(lm, term, out variable)) return true; - if (StagStateVariable.TryMatch(lm, term, out variable)) return true; - if (FlowerProviderVariable.TryMatch(lm, term, out variable)) return true; - if (SaveQuitResetVariable.TryMatch(lm, term, out variable)) return true; - if (StartRespawnResetVariable.TryMatch(lm, term, out variable)) return true; - if (WarpToStartResetVariable.TryMatch(lm, term, out variable)) return true; - if (WarpToBenchResetVariable.TryMatch(lm, term, out variable)) return true; - -#pragma warning disable CS0618 // Type or member is obsolete - if (NotchCostInt.TryMatch(lm, term, out variable)) return true; - if (SafeNotchCostInt.TryMatch(lm, term, out variable)) return true; -#pragma warning restore CS0618 // Type or member is obsolete - - return false; - } - } -} diff --git a/RandomizerMod/RC/Requests/Bucket.cs b/RandomizerMod/RC/Requests/Bucket.cs deleted file mode 100644 index 2ccffa9..0000000 --- a/RandomizerMod/RC/Requests/Bucket.cs +++ /dev/null @@ -1,107 +0,0 @@ -namespace RandomizerMod.RC -{ - public class Bucket - { - public Bucket() - { - _buckets = new(); - } - - public Bucket(IEqualityComparer equalityComparer) - { - _buckets = new(equalityComparer); - } - - private readonly Dictionary _buckets; - - public void Increment(T t, int value) - { - _buckets.TryGetValue(t, out int current); - _buckets[t] = current + value; - } - - public int GetCount(T t) - { - _buckets.TryGetValue(t, out int value); - return value; - } - - public void AddRange(IEnumerable ts) - { - foreach (T t in ts) Increment(t, 1); - } - - public void Add(T t) - { - Increment(t, 1); - } - - public void RemoveAll(T t) - { - _buckets.Remove(t); - } - - public void Remove(T t, int count) - { - if (_buckets.TryGetValue(t, out int value)) - { - if (value > count) _buckets[t] = value - count; - else _buckets.Remove(t); - } - } - - public void Replace(T old, T replaceWith) - { - if (_buckets.TryGetValue(old, out int value)) - { - _buckets.Remove(old); - Increment(replaceWith, value); - } - } - - public void Replace(T old, Func> replacer) - { - if (_buckets.TryGetValue(old, out int value)) - { - _buckets.Remove(old); - AddRange(replacer(value)); - } - } - - public void Set(T t, int value) - { - _buckets[t] = value; - } - - public IEnumerable EnumerateDistinct() - { - foreach (KeyValuePair kvp in _buckets) - { - if (kvp.Value > 0) yield return kvp.Key; - } - } - - public IEnumerable EnumerateWithMultiplicity() - { - foreach (KeyValuePair kvp in _buckets) - { - for (int i = 0; i < kvp.Value; i++) yield return kvp.Key; - } - } - - public CDFWeightedArray ToWeightedArray() - { - T[] values = _buckets.Where(kvp => kvp.Value > 0).Select(kvp => kvp.Key).ToArray(); - double total = GetTotal(); - double[] cumulativeDensities = new double[values.Length]; - double previous = 0.0; - for (int i = 0; i < values.Length; i++) - { - previous = cumulativeDensities[i] = previous + _buckets[values[i]] / total; - } - return new(values, cumulativeDensities); - } - - public int GetTotal() => _buckets.Values.Sum(); - } -} diff --git a/RandomizerMod/RC/Requests/BuiltinRequests.cs b/RandomizerMod/RC/Requests/BuiltinRequests.cs deleted file mode 100644 index fa048b4..0000000 --- a/RandomizerMod/RC/Requests/BuiltinRequests.cs +++ /dev/null @@ -1,1829 +0,0 @@ -using ItemChanger; -using RandomizerCore; -using RandomizerCore.Collections; -using RandomizerCore.Extensions; -using RandomizerCore.Logic; -using RandomizerCore.Randomization; -using RandomizerMod.RandomizerData; -using RandomizerMod.Settings; -using static RandomizerMod.RC.RequestBuilder; - -namespace RandomizerMod.RC -{ - public static class BuiltinRequests - { - public static void ApplyAll() - { - OnSelectStart.Subscribe(float.PositiveInfinity, SelectStart); - - OnUpdate.Subscribe(-10000f, AssignNotchCosts); - - OnUpdate.Subscribe(-2000f, ApplyPlaceholderMatch); - OnUpdate.Subscribe(-2000f, ApplyCustomGeoMatch); - - OnUpdate.Subscribe(-1000f, ApplyTransitionSettings); - OnUpdate.Subscribe(-800f, PlaceUnrandomizedTransitions); - - OnUpdate.Subscribe(-500f, ApplySplitGroupResolver); - - OnUpdate.Subscribe(-100f, ApplyShopDefs); - OnUpdate.Subscribe(-100f, ApplyGrubfatherDef); - OnUpdate.Subscribe(-100f, ApplySeerDef); - OnUpdate.Subscribe(-100f, ApplyEggShopDef); - OnUpdate.Subscribe(-100f, ApplySalubraCharmDef); - - OnUpdate.Subscribe(-80f, ApplyWorldSenseDef); - OnUpdate.Subscribe(-80f, ApplyFocusDef); - - OnUpdate.Subscribe(0f, ApplyPoolSettings); - OnUpdate.Subscribe(0f, ApplyGrimmchildSetting); - OnUpdate.Subscribe(0f, ApplySplitCloakShadeCloakRandomize); - OnUpdate.Subscribe(0f, ApplyProgressiveSplitClaw); - OnUpdate.Subscribe(0f, ApplySalubraNotchesSetting); - OnUpdate.Subscribe(2f, ApplyGrubMimicRando); - - OnUpdate.Subscribe(4f, ApplyRandomizeCursedMasks); - OnUpdate.Subscribe(4f, ApplyRandomizeCursedNotches); - - OnUpdate.Subscribe(5f, ApplyStartGeo); - OnUpdate.Subscribe(5f, ApplyDownslashStart); - OnUpdate.Subscribe(5f, ApplyStartItemSettings); - - OnUpdate.Subscribe(15f, ApplySplitClawFullClawRemove); - OnUpdate.Subscribe(15f, ApplySplitCloakFullCloakRemove); - OnUpdate.Subscribe(15f, ApplySplitSuperdashFullCrystalHeartRemove); - OnUpdate.Subscribe(15f, ApplySpellRemove); - - OnUpdate.Subscribe(16f, ApplyJunkItemRemove); - - // These must run after junk remove, because junk remove cannot detect modified items. - OnUpdate.Subscribe(18f, ApplyMaskShardCountSetting); - OnUpdate.Subscribe(18f, ApplyVesselFragmentCountSetting); - - OnUpdate.Subscribe(20f, ApplyDuplicateItemSettings); - - OnUpdate.Subscribe(30f, ApplyPalaceLongLocationSetting); - OnUpdate.Subscribe(30f, ApplyBossEssenceLongLocationSetting); - OnUpdate.Subscribe(30f, ApplyLongLocationPreviewSettings); - - OnUpdate.Subscribe(50f, ApplyMultiLocationRebalancing); - - OnUpdate.Subscribe(99f, ApplyItemPlacementStrategy); - OnUpdate.Subscribe(99f, ApplyTransitionPlacementStrategy); - - OnUpdate.Subscribe(100f, ApplyItemPostPermuteEvents); - OnUpdate.Subscribe(100f, ApplyDefaultItemPadding); - OnUpdate.Subscribe(100f, ApplyConnectAreasPostPermuteEvent); - OnUpdate.Subscribe(100f, ApplyAreaConstraint); - OnUpdate.Subscribe(100f, ApplyDerangedConstraint); - OnUpdate.Subscribe(100f, ApplyDupeShopConstraint); - OnUpdate.Subscribe(100f, ApplyMultiLocationPenalty); - } - - public static bool SelectStart(Random rng, GenerationSettings gs, SettingsPM pm, out RandomizerData.StartDef def) - { - Dictionary startDefs = Menu.RandomizerMenuAPI.GenerateStartLocationDict(); - - StartLocationSettings.RandomizeStartLocationType type = gs.StartLocationSettings.StartLocationType; - if (type != StartLocationSettings.RandomizeStartLocationType.Fixed) - { - List startNames = new(startDefs.Values.Where(s => s.CanBeRandomized(pm)).Select(s => s.Name)); - if (type == StartLocationSettings.RandomizeStartLocationType.RandomExcludingKP) startNames.Remove("King's Pass"); - gs.StartLocationSettings.StartLocation = rng.Next(startNames); - } - - if (gs.StartLocationSettings.StartLocation == null || !startDefs.TryGetValue(gs.StartLocationSettings.StartLocation, out def)) - { - LogWarn($"Unknown start location {gs.StartLocationSettings.StartLocation} selected in BuiltinRequests.SelectStart, falling back to King's Pass"); - gs.StartLocationSettings.StartLocation = Data.GetStartNames().First(); - def = Data.GetStartDef(gs.StartLocationSettings.StartLocation); - } - - return true; - } - - public static void AssignNotchCosts(RequestBuilder rb) - { - if (rb.ctx.notchCosts.Count == 0) - { - if (!rb.gs.MiscSettings.RandomizeNotchCosts) - { - rb.ctx.notchCosts.AddRange(Enumerable.Range(1, 40).Select(CharmNotchCosts.GetVanillaCost)); - } - else - { - rb.ctx.notchCosts.AddRange(CharmNotchCosts.GetUniformlyRandomCosts(rb.rng, rb.gs.MiscSettings.MinRandomNotchTotal, rb.gs.MiscSettings.MaxRandomNotchTotal)); - } - } - } - - public static void ApplyPlaceholderMatch(RequestBuilder rb) - { - bool TryMatch(string name, out ItemRequestInfo info) - { - if (name.StartsWith(PlaceholderItem.Prefix)) - { - info = new ItemRequestInfo - { - randoItemCreator = factory => factory.MakeWrappedItem(name.Substring(PlaceholderItem.Prefix.Length)), - onRandomizerFinish = (placement) => ((PlaceholderItem)placement.Item).Unwrap(), - getItemDef = () => rb.TryGetItemDef(name.Substring(PlaceholderItem.Prefix.Length), out ItemDef def) ? def : null, - }; - return true; - } - else - { - info = default; - return false; - } - } - rb.ItemMatchers.Add(TryMatch); - - bool TryResolveGroup(RequestBuilder rb, string item, ElementType type, out GroupBuilder gb) - { - if ((type == ElementType.Item || type == ElementType.Unknown) && item.StartsWith(PlaceholderItem.Prefix)) - { - gb = rb.GetItemGroupFor(item.Substring(PlaceholderItem.Prefix.Length)); - return true; - } - gb = default; - return false; - } - rb.OnGetGroupFor.Subscribe(100f, TryResolveGroup); - } - - public static void ApplyCustomGeoMatch(RequestBuilder rb) - { - bool TryMatch(string name, out ItemRequestInfo info) - { - if (name.EndsWith("_Geo") && int.TryParse(name.Substring(0, name.IndexOf('_')), out int value)) - { - info = new ItemRequestInfo - { - randoItemCreator = factory => new CustomGeoItem(factory.lm, value), - realItemCreator = (factory, placement) => - { - CustomGeoItem geoItem = (CustomGeoItem)placement.Item; - return ItemChanger.Items.SpawnGeoItem.MakeGeoItem(geoItem.geo); - }, - getItemDef = () => Data.GetItemDef(ItemNames.One_Geo) with { Name = name }, - }; - return true; - } - else - { - info = default; - return false; - } - } - rb.ItemMatchers.Add(TryMatch); - } - - public static void ApplyTransitionSettings(RequestBuilder rb) - { - TransitionSettings ts = rb.gs.TransitionSettings; - - if (ts.Mode == TransitionSettings.TransitionMode.None) return; - StageBuilder sb = rb.AddStage(RBConsts.MainTransitionStage); - - List transitions = new(); - foreach (string t in ts.Mode switch - { - TransitionSettings.TransitionMode.RoomRandomizer => Data.GetRoomTransitionNames(), - TransitionSettings.TransitionMode.FullAreaRandomizer => Data.GetAreaTransitionNames(), - TransitionSettings.TransitionMode.MapAreaRandomizer => Data.GetMapAreaTransitionNames(), - _ => Enumerable.Empty(), - }) - { - if (rb.TryGetTransitionDef(t, out TransitionDef def)) transitions.Add(def); - } - - TransitionGroupBuilder oneWays = new() - { - label = RBConsts.OneWayGroup, - stageLabel = RBConsts.MainTransitionStage, - }; - - if (ts.TransitionMatching == TransitionSettings.TransitionMatchingSetting.MatchingDirections - || ts.TransitionMatching == TransitionSettings.TransitionMatchingSetting.MatchingDirectionsAndNoDoorToDoor) - { - SymmetricTransitionGroupBuilder horizontal = new() - { - label = RBConsts.InLeftOutRightGroup, - reverseLabel = RBConsts.InRightOutLeftGroup, - coupled = ts.Coupled, - stageLabel = RBConsts.MainTransitionStage - }; - SymmetricTransitionGroupBuilder vertical = new() - { - label = RBConsts.InTopOutBotGroup, - reverseLabel = RBConsts.InBotOutTopGroup, - coupled = ts.Coupled, - stageLabel = RBConsts.MainTransitionStage - }; - - List lefts = new(); - List rights = new(); - List tops = new(); - List bots = new(); - List doors = new(); - - Dictionary> directedTransitions = new() - { - { TransitionDirection.Left, lefts }, - { TransitionDirection.Right, rights }, - { TransitionDirection.Top, tops }, - { TransitionDirection.Bot, bots }, - { TransitionDirection.Door, doors }, - }; - - foreach (TransitionDef def in transitions) - { - switch (def.Sides) - { - case TransitionSides.OneWayOut: - oneWays.Targets.Add(def.Name); - break; - case TransitionSides.OneWayIn: - oneWays.Sources.Add(def.Name); - break; - default: - directedTransitions[def.Direction].Add(def); - break; - } - } - - rb.rng.PermuteInPlace(doors); - for (int i = 0; i < doors.Count; i++) - { - switch (rights.Count - lefts.Count) - { - case > 0: - lefts.Add(doors[i]); - break; - case < 0: - rights.Add(doors[i]); - break; - case 0: - switch (tops.Count - bots.Count) - { - case > 0: - bots.Add(doors[i]); - break; - case < 0: - tops.Add(doors[i]); - break; - case 0: - if (rb.rng.NextBool()) - { - rights.Add(doors[i]); - } - else - { - lefts.Add(doors[i]); - } - break; - } - break; - } - } - - foreach (TransitionDef def in rights) horizontal.Group1.Add(def.Name); - foreach (TransitionDef def in lefts) horizontal.Group2.Add(def.Name); - foreach (TransitionDef def in bots) vertical.Group1.Add(def.Name); - foreach (TransitionDef def in tops) vertical.Group2.Add(def.Name); - - oneWays.strategy = rb.gs.ProgressionDepthSettings.GetTransitionPlacementStrategy(); - horizontal.strategy = rb.gs.ProgressionDepthSettings.GetTransitionPlacementStrategy(); - vertical.strategy = rb.gs.ProgressionDepthSettings.GetTransitionPlacementStrategy(); - - if (ts.TransitionMatching == TransitionSettings.TransitionMatchingSetting.MatchingDirectionsAndNoDoorToDoor) - { - bool NotDoorToDoor(IRandoItem item, IRandoLocation location) - { - if (!rb.TryGetTransitionDef(item.Name, out TransitionDef t1) - || !rb.TryGetTransitionDef(location.Name, out TransitionDef t2)) - { - return true; - } - - return t1.Direction != TransitionDirection.Door || t2.Direction != TransitionDirection.Door; - } - ((DefaultGroupPlacementStrategy)horizontal.strategy).ConstraintList.Add(new(NotDoorToDoor, null, "RM Not Door to Door")); - } - - sb.Add(oneWays); - sb.Add(horizontal); - sb.Add(vertical); - - bool MatchedTryResolveGroup(RequestBuilder rb, string item, ElementType type, out GroupBuilder gb) - { - if (type is ElementType.Transition or ElementType.Unknown && rb.TryGetTransitionDef(item, out TransitionDef def)) - { - bool isModeTransition = rb.gs.TransitionSettings.Mode switch - { - TransitionSettings.TransitionMode.MapAreaRandomizer => def.IsMapAreaTransition, - TransitionSettings.TransitionMode.FullAreaRandomizer => def.IsTitledAreaTransition, - TransitionSettings.TransitionMode.RoomRandomizer => true, - _ => false, - }; - if (isModeTransition) - { - gb = def.Sides != TransitionSides.Both - ? oneWays - : def.Direction switch - { - TransitionDirection.Top or - TransitionDirection.Bot => vertical, - _ => horizontal, - }; - return true; - } - } - gb = null; - return false; - } - rb.OnGetGroupFor.Subscribe(-1000f, MatchedTryResolveGroup); - } - else - { - SelfDualTransitionGroupBuilder twoWays = new() - { - label = RBConsts.TwoWayGroup, - stageLabel = RBConsts.MainTransitionStage, - coupled = ts.Coupled, - }; - foreach (TransitionDef def in transitions) - { - switch (def.Sides) - { - case TransitionSides.OneWayOut: - oneWays.Targets.Add(def.Name); - break; - case TransitionSides.OneWayIn: - oneWays.Sources.Add(def.Name); - break; - default: - twoWays.Transitions.Add(def.Name); - break; - } - } - - oneWays.strategy = rb.gs.ProgressionDepthSettings.GetTransitionPlacementStrategy(); - twoWays.strategy = rb.gs.ProgressionDepthSettings.GetTransitionPlacementStrategy(); - - sb.Add(oneWays); - sb.Add(twoWays); - - bool NonMatchedTryResolveGroup(RequestBuilder rb, string item, ElementType type, out GroupBuilder gb) - { - if (type is ElementType.Transition or ElementType.Unknown && rb.TryGetTransitionDef(item, out TransitionDef def)) - { - bool isModeTransition = rb.gs.TransitionSettings.Mode switch - { - TransitionSettings.TransitionMode.MapAreaRandomizer => def.IsMapAreaTransition, - TransitionSettings.TransitionMode.FullAreaRandomizer => def.IsTitledAreaTransition, - TransitionSettings.TransitionMode.RoomRandomizer => true, - _ => false, - }; - if (isModeTransition) - { - gb = def.Sides != TransitionSides.Both ? oneWays : twoWays; - return true; - } - } - gb = default; - return false; - } - rb.OnGetGroupFor.Subscribe(-1000f, NonMatchedTryResolveGroup); - } - } - - public static void PlaceUnrandomizedTransitions(RequestBuilder rb) - { - var mode = rb.gs.TransitionSettings.Mode; - bool IsVanillaInMode(string s) - { - if (rb.TryGetTransitionDef(s, out TransitionDef def)) - { - return mode switch - { - TransitionSettings.TransitionMode.MapAreaRandomizer => !def.IsMapAreaTransition, - TransitionSettings.TransitionMode.FullAreaRandomizer => !def.IsTitledAreaTransition, - TransitionSettings.TransitionMode.RoomRandomizer => false, - _ => true, - }; - } - return true; - } - - foreach (string t in Data.GetRoomTransitionNames()) - { - if (IsVanillaInMode(t)) rb.EnsureVanillaSourceTransition(t); - } - } - - public static void ApplySplitGroupResolver(RequestBuilder rb) - { - if (rb.gs.SplitGroupSettings.RandomizeOnStart) rb.gs.SplitGroupSettings.Randomize(rb.rng); - - Dictionary splitGroups = new(); - Dictionary> itemWeightBuilder = new(); - Dictionary> locationWeightBuilder = new(); - splitGroups.Add(0, rb.MainItemGroup); - foreach (ItemGroupBuilder igb in rb.EnumerateItemGroups()) // compatibility in case something else already made split groups - { - if (igb.label.StartsWith(RBConsts.SplitGroupPrefix) && int.TryParse(igb.label.Substring(RBConsts.SplitGroupPrefix.Length), out int splitGroupIndex) && splitGroupIndex > 0) - { - splitGroups[splitGroupIndex] = igb; - } - } - - foreach (PoolDef def in Data.Pools) - { - if (rb.gs.SplitGroupSettings.TryGetValue(def, out int value)) - { - if (!splitGroups.ContainsKey(value)) - { - splitGroups.Add(value, rb.MainItemStage.AddItemGroup(RBConsts.SplitGroupPrefix + value)); - } - foreach (string s in def.IncludeItems) - { - if (!itemWeightBuilder.TryGetValue(s, out Bucket b)) itemWeightBuilder.Add(s, b = new()); - b.Add(value); - } - foreach (string s in def.IncludeLocations) - { - if (!locationWeightBuilder.TryGetValue(s, out Bucket b)) locationWeightBuilder.Add(s, b = new()); - b.Add(value); - } - } - } - - Dictionary> itemGroups = itemWeightBuilder.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.ToWeightedArray()); - Dictionary> locationGroups = locationWeightBuilder.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.ToWeightedArray()); - - bool TryGetSplitGroup(RequestBuilder rb, string item, ElementType type, out GroupBuilder gb) - { - if (type == ElementType.Unknown) - { - if (locationGroups.ContainsKey(item)) type = ElementType.Location; - else if (itemGroups.ContainsKey(item)) type = ElementType.Item; - } - if (type == ElementType.Item) - { - if (itemGroups.TryGetValue(item, out CDFWeightedArray arr) && splitGroups.TryGetValue(arr.Next(rb.rng), out ItemGroupBuilder igb)) - { - gb = igb; - return true; - } - } - if (type == ElementType.Location) - { - if (locationGroups.TryGetValue(item, out CDFWeightedArray arr) && splitGroups.TryGetValue(arr.Next(rb.rng), out ItemGroupBuilder igb)) - { - gb = igb; - return true; - } - } - gb = null; - return false; - } - rb.OnGetGroupFor.Subscribe(0f, TryGetSplitGroup); - } - - public static void ApplyShopDefs(RequestBuilder rb) - { - string[] shops = new[] - { - LocationNames.Sly, LocationNames.Sly_Key, LocationNames.Iselda, LocationNames.Salubra, LocationNames.Leg_Eater, - }; - - foreach (string s in shops) - { - rb.EditLocationRequest(s, info => - { - info.customPlacementFetch = (factory, placement) => - { - if (factory.TryFetchPlacement(s, out AbstractPlacement ap)) return ap; - - ItemChanger.Placements.ShopPlacement sp = (ItemChanger.Placements.ShopPlacement)factory.FetchOrMakePlacement(s); - sp.defaultShopItems = IC.Shops.GetDefaultShopItems(factory.gs); - return sp; - }; - info.onRandomizerFinish += placement => - { - if (placement.Location is not RandoModLocation rl || placement.Item is not RandoModItem ri || rl.costs == null) return; - foreach (LogicGeoCost gc in rl.costs.OfType()) - { - if (gc.GeoAmount < 0) gc.GeoAmount = GetShopCost(rb.rng, ri); - } - }; - }); - } - - static int GetShopCost(Random rng, RandoModItem item) - { - double pow = 1.2; // setting? - - int cap = item.ItemDef is not null ? item.ItemDef.PriceCap : 500; - if (cap <= 100) return cap; - if (item.Required) return rng.PowerLaw(pow, 100, Math.Min(cap, 500)).ClampToMultipleOf(5); - return rng.PowerLaw(pow, 100, cap).ClampToMultipleOf(5); - } - } - - public static void ApplyGrubfatherDef(RequestBuilder rb) - { - rb.EditLocationRequest(LocationNames.Grubfather, info => - { - info.onRandoLocationCreation += (factory, rl) => - { - LogicManager lm = factory.lm; - Random rng = factory.rng; - GenerationSettings gs = factory.gs; - rl.AddCost(new SimpleCost(lm.GetTermStrict("GRUBS"), rng.Next(gs.CostSettings.MinimumGrubCost, gs.CostSettings.MaximumGrubCost + 1))); - }; - info.customPlacementFetch = (factory, placement) => - { - if (factory.TryFetchPlacement(LocationNames.Grubfather, out AbstractPlacement p)) return p; - return IC.Grubfather.GetGrubfatherPlacement(factory); - }; - }); - } - - public static void ApplySeerDef(RequestBuilder rb) - { - rb.EditLocationRequest(LocationNames.Seer, info => - { - info.onRandoLocationCreation += (factory, rl) => - { - LogicManager lm = factory.lm; - Random rng = factory.rng; - GenerationSettings gs = factory.gs; - rl.AddCost(new SimpleCost(lm.GetTermStrict("ESSENCE"), rng.Next(gs.CostSettings.MinimumEssenceCost, gs.CostSettings.MaximumEssenceCost + 1))); - }; - info.customPlacementFetch = (factory, placement) => - { - if (factory.TryFetchPlacement(LocationNames.Seer, out AbstractPlacement p)) return p; - return IC.Seer.GetSeerPlacement(factory); - }; - }); - } - - public static void ApplySalubraCharmDef(RequestBuilder rb) - { - rb.EditLocationRequest("Salubra_(Requires_Charms)", info => - { - info.randoLocationCreator += factory => factory.MakeLocation(LocationNames.Salubra); - info.onRandoLocationCreation += (factory, rl) => - { - LogicManager lm = factory.lm; - Random rng = factory.rng; - GenerationSettings gs = factory.gs; - rl.AddCost(new SimpleCost(lm.GetTermStrict("CHARMS"), rng.Next(gs.CostSettings.MinimumCharmCost, gs.CostSettings.MaximumCharmCost + 1))); - }; - info.customPlacementFetch = (factory, placement) => - { - return factory.FetchOrMakePlacementWithEvents(LocationNames.Salubra, placement); - }; - }); - } - - public static void ApplyEggShopDef(RequestBuilder rb) - { - rb.EditLocationRequest(LocationNames.Egg_Shop, info => - { - info.onRandoLocationCreation += (factory, rl) => - { - LogicManager lm = factory.lm; - Random rng = factory.rng; - GenerationSettings gs = factory.gs; - rl.AddCost(new SimpleCost(lm.GetTermStrict("RANCIDEGGS"), rng.Next(gs.CostSettings.MinimumEggCost, gs.CostSettings.MaximumEggCost + 1))); - }; - }); - } - - public static void ApplyWorldSenseDef(RequestBuilder rb) - { - if (rb.gs.PoolSettings.LoreTablets) - { - rb.EditLocationRequest(LocationNames.World_Sense, info => info.randoLocationCreator = (factory) => factory.MakeLocation(LocationNames.Lore_Tablet_World_Sense)); - /* - rb.EditLocationRequest(LocationNames.World_Sense, info => info.customPlacementFetch = - (factory, next) => factory.FetchOrMakePlacementWithEvents(LocationNames.Lore_Tablet_World_Sense, next)); - */ - } - } - - public static void ApplyFocusDef(RequestBuilder rb) - { - if (rb.gs.PoolSettings.LoreTablets) - { - rb.EditLocationRequest(LocationNames.Focus, info => info.randoLocationCreator = (factory) => factory.MakeLocation(LocationNames.Lore_Tablet_Kings_Pass_Focus)); - /* - rb.EditLocationRequest(LocationNames.Focus, info => info.customPlacementFetch = - (factory, next) => factory.FetchOrMakePlacementWithEvents(LocationNames.Lore_Tablet_Kings_Pass_Focus, next)); - */ - } - } - - public static void ApplyStartGeo(RequestBuilder rb) - { - int minGeo = rb.gs.StartItemSettings.MinimumStartGeo; - int maxGeo = rb.gs.StartItemSettings.MaximumStartGeo; - int geo = minGeo < maxGeo ? rb.rng.Next(minGeo, maxGeo) : minGeo; - if (geo > 0) rb.AddToStart($"{geo}_Geo"); - } - - public static void ApplyStartItemSettings(RequestBuilder rb) - { - List startItems = new(); - StartItemSettings ss = rb.gs.StartItemSettings; - NoveltySettings ns = rb.gs.NoveltySettings; - - void AddUniformlyFrom(IList items, double rate, int cap) - { - items = rb.rng.Permute(items); // don't modify the input - - int toAdd = 0; - for (int i = 0; i < items.Count; i++) - { - if (rb.rng.NextDouble() < rate) - { - // Cursed way to make the distribution a bit more smooth than simply - // flipping a coin for each until we reach the cap - toAdd = (toAdd + 1) % (cap + 1); - } - } - - for (int i = 0; i < toAdd; i++) - { - startItems.Add(items[i]); - } - } - - { - string[] horizontal = new[] { ItemNames.Mothwing_Cloak, ItemNames.Crystal_Heart }; - switch (ss.HorizontalMovement) - { - case StartItemSettings.StartHorizontalType.None: - break; - case StartItemSettings.StartHorizontalType.MothwingCloak: - startItems.Add(ItemNames.Mothwing_Cloak); - break; - case StartItemSettings.StartHorizontalType.CrystalHeart: - startItems.Add(ItemNames.Crystal_Heart); - break; - case StartItemSettings.StartHorizontalType.OneRandomItem: - startItems.Add(rb.rng.Next(horizontal)); - break; - case StartItemSettings.StartHorizontalType.ZeroOrMore: - AddUniformlyFrom(horizontal, 0.5, 2); - break; - case StartItemSettings.StartHorizontalType.All: - startItems.AddRange(horizontal); - break; - } - } - { - string[] vertical = new[] { ItemNames.Mantis_Claw, ItemNames.Monarch_Wings }; - switch (ss.VerticalMovement) - { - case StartItemSettings.StartVerticalType.None: - break; - case StartItemSettings.StartVerticalType.MantisClaw: - startItems.Add(ItemNames.Mantis_Claw); - break; - case StartItemSettings.StartVerticalType.MonarchWings: - startItems.Add(ItemNames.Monarch_Wings); - break; - case StartItemSettings.StartVerticalType.OneRandomItem: - startItems.Add(rb.rng.Next(vertical)); - break; - case StartItemSettings.StartVerticalType.ZeroOrMore: - AddUniformlyFrom(vertical, 0.5, 2); - break; - case StartItemSettings.StartVerticalType.All: - startItems.AddRange(vertical); - break; - } - } - { - List charms = Data.GetPoolDef(PoolNames.Charm) - .IncludeItems - .Except(new[] { ItemNames.Queen_Fragment, ItemNames.King_Fragment, ItemNames.Void_Heart, ItemNames.Grimmchild2 }) - .ToList(); - charms.Add(rb.gs.PoolSettings.GrimmkinFlames ? ItemNames.Grimmchild1 : ItemNames.Grimmchild2); - switch (ss.Charms) - { - case StartItemSettings.StartCharmType.None: - break; - case StartItemSettings.StartCharmType.ZeroOrMore: - AddUniformlyFrom(charms, 2.0 / (3.0d * charms.Count), 4); - break; - case StartItemSettings.StartCharmType.OneRandomItem: - startItems.Add(rb.rng.Next(charms)); - break; - } - } - { - string[] stags = Data.GetPoolDef(PoolNames.Stag).IncludeItems.ToArray(); - switch (ss.Stags) - { - case StartItemSettings.StartStagType.None: - break; - case StartItemSettings.StartStagType.DirtmouthStag: - startItems.Add(ItemNames.Dirtmouth_Stag); - break; - case StartItemSettings.StartStagType.OneRandomStag: - startItems.Add(rb.rng.Next(stags)); - break; - case StartItemSettings.StartStagType.ZeroOrMoreRandomStags: - AddUniformlyFrom(stags, (double)1 / (double)stags.Length, 3); - break; - case StartItemSettings.StartStagType.ManyRandomStags: - AddUniformlyFrom(stags, 0.4, stags.Length); - break; - case StartItemSettings.StartStagType.AllStags: - startItems.AddRange(stags); - break; - } - } - { - List miscSkill = new() - { - ItemNames.Dream_Nail, - ItemNames.Ismas_Tear, - ItemNames.Vengeful_Spirit, - ItemNames.Desolate_Dive, - ItemNames.Howling_Wraiths, - ItemNames.Cyclone_Slash, - ItemNames.Great_Slash, - ItemNames.Dash_Slash - }; - List miscKey = new() - { - ItemNames.Simple_Key, - ItemNames.Elegant_Key, - ItemNames.Tram_Pass, - ItemNames.Kings_Brand, - ItemNames.Love_Key, - ItemNames.Lumafly_Lantern, - ItemNames.Shopkeepers_Key, - ItemNames.City_Crest - }; - List miscAll = Enumerable.Concat(miscSkill, miscKey).ToList(); - - switch (ss.MiscItems) - { - case StartItemSettings.StartMiscItems.None: - break; - case StartItemSettings.StartMiscItems.DreamNail: - startItems.Add(ItemNames.Dream_Nail); - break; - case StartItemSettings.StartMiscItems.ZeroOrMore: - AddUniformlyFrom(miscAll, 1.0 / (double)miscAll.Count, 3); - break; - case StartItemSettings.StartMiscItems.Many: - AddUniformlyFrom(miscAll, 3.0 / (double)miscAll.Count, 8); - break; - case StartItemSettings.StartMiscItems.DreamNailAndMore: - startItems.Add(ItemNames.Dream_Nail); - miscAll.Remove(ItemNames.Dream_Nail); - miscAll.Add(ItemNames.Dream_Gate); - AddUniformlyFrom(miscAll, 1.0 / (double)miscAll.Count, 3); - break; - } - } - - // If they wanted both sides of the skill they shouldn't have split it - if (ns.SplitCloak) - { - if (startItems.Remove(ItemNames.Mothwing_Cloak)) - { - startItems.Add(rb.rng.Next(new[] { ItemNames.Left_Mothwing_Cloak, ItemNames.Right_Mothwing_Cloak })); - } - } - if (ns.SplitClaw) - { - if (startItems.Remove(ItemNames.Mantis_Claw)) - { - startItems.Add(rb.rng.Next(new[] { ItemNames.Left_Mantis_Claw, ItemNames.Right_Mantis_Claw })); - } - } - if (ns.SplitSuperdash) - { - if (startItems.Remove(ItemNames.Crystal_Heart)) - { - startItems.Add(rb.rng.Next(new[] { ItemNames.Left_Crystal_Heart, ItemNames.Right_Crystal_Heart })); - } - } - - foreach (string item in startItems) - { - rb.AddToStart(item); - rb.GetItemGroupFor(item).Items.Remove(item, 1); - if (Data.GetItemDef(item).Pool == PoolNames.Charm && rb.rng.NextBool()) - { - rb.EditItemRequest(item, info => - { - info.realItemCreator = (factory, placement) => - { - AbstractItem realItem = factory.MakeItem(item); - realItem.AddTag(); - return realItem; - }; - }); - } - } - } - - public static void ApplyDownslashStart(RequestBuilder rb) - { - if (rb.gs.NoveltySettings.RandomizeNail) - { - rb.AddToStart(ItemNames.Downslash); - } - } - - public static void ApplyPoolSettings(RequestBuilder rb) - { - foreach (PoolDef pool in Data.Pools) - { - if (pool.IsIncluded(rb.gs)) - { - foreach (string item in pool.IncludeItems) rb.AddItemByName(item); - foreach (string location in pool.IncludeLocations) rb.AddLocationByName(location); - } - if (pool.IsVanilla(rb.gs)) - { - if (pool.Name == PoolNames.Flame && rb.gs.PoolSettings.Charms) - { - foreach (VanillaDef def in pool.Vanilla.Skip(6)) rb.AddToVanilla(def); - } - else foreach (VanillaDef def in pool.Vanilla) rb.AddToVanilla(def); - } - } - } - - public static void ApplyPalaceLongLocationSetting(RequestBuilder rb) - { - switch (rb.gs.LongLocationSettings.WhitePalaceRando) - { - case LongLocationSettings.WPSetting.ExcludeWhitePalace: - rb.RemoveItemByName(ItemNames.Soul_Totem_Palace); - rb.RemoveItemByName(ItemNames.Lore_Tablet_Palace_Workshop); - rb.RemoveItemByName(ItemNames.Lore_Tablet_Palace_Throne); - rb.RemoveItemByName(ItemNames.Soul_Totem_Path_of_Pain); - rb.RemoveItemByName(ItemNames.Journal_Entry_Seal_of_Binding); - rb.RemoveItemByName(ItemNames.Lore_Tablet_Path_of_Pain_Entrance); - rb.RemoveLocationsWhere(s => s != LocationNames.King_Fragment && rb.TryGetLocationDef(s, out LocationDef def) && def?.MapArea == "White Palace"); - break; - case LongLocationSettings.WPSetting.ExcludePathOfPain: - rb.RemoveItemByName(ItemNames.Soul_Totem_Path_of_Pain); - rb.RemoveItemByName(ItemNames.Journal_Entry_Seal_of_Binding); - rb.RemoveItemByName(ItemNames.Lore_Tablet_Path_of_Pain_Entrance); - rb.RemoveLocationsWhere(s => s != LocationNames.King_Fragment && rb.TryGetLocationDef(s, out LocationDef def) && def?.TitledArea == "Path of Pain"); - break; - } - - if (rb.gs.LongLocationSettings.WhitePalaceRando == LongLocationSettings.WPSetting.ExcludeWhitePalace) - { - rb.UnrandomizeTransitionsWhere(t => rb.TryGetTransitionDef(t, out TransitionDef def) && def?.MapArea == "White Palace"); - } - else if (rb.gs.LongLocationSettings.WhitePalaceRando == LongLocationSettings.WPSetting.ExcludePathOfPain) - { - rb.UnrandomizeTransitionsWhere(t => rb.TryGetTransitionDef(t, out TransitionDef def) && def?.TitledArea == "Path of Pain"); - rb.UnrandomizeTransitionByName("White_Palace_06[left1]"); - } - } - - public static void ApplyBossEssenceLongLocationSetting(RequestBuilder rb) - { - if (!rb.gs.PoolSettings.BossEssence) - { - return; - } - - switch (rb.gs.LongLocationSettings.BossEssenceRando) - { - case LongLocationSettings.BossEssenceSetting.ExcludeAllDreamWarriors: - PoolDef warriors = Data.GetPoolDef(PoolNames.DreamWarrior); - foreach (string item in warriors.IncludeItems) rb.RemoveItemByName(item); - foreach (string loc in warriors.IncludeLocations) rb.RemoveLocationByName(loc); - foreach (VanillaDef def in warriors.Vanilla) rb.AddToVanilla(def); - break; - case LongLocationSettings.BossEssenceSetting.ExcludeAllDreamBosses: - PoolDef bosses = Data.GetPoolDef(PoolNames.DreamBoss); - foreach (string item in bosses.IncludeItems) rb.RemoveItemByName(item); - foreach (string loc in bosses.IncludeLocations) rb.RemoveLocationByName(loc); - foreach (VanillaDef def in bosses.Vanilla) rb.AddToVanilla(def); - break; - case LongLocationSettings.BossEssenceSetting.ExcludeZoteAndWhiteDefender: - rb.RemoveItemByName(ItemNames.Boss_Essence_White_Defender); - rb.RemoveItemByName(ItemNames.Boss_Essence_Grey_Prince_Zote); - rb.RemoveLocationByName(LocationNames.Boss_Essence_White_Defender); - rb.RemoveLocationByName(LocationNames.Boss_Essence_Grey_Prince_Zote); - rb.AddToVanilla(ItemNames.Boss_Essence_White_Defender, LocationNames.Boss_Essence_White_Defender); - rb.AddToVanilla(ItemNames.Boss_Essence_Grey_Prince_Zote, LocationNames.Boss_Essence_Grey_Prince_Zote); - break; - } - } - - public static void ApplyLongLocationPreviewSettings(RequestBuilder rb) - { - LongLocationSettings lls = rb.gs.LongLocationSettings; - - /* - static void RemoveLocalHint(ICFactory factory, RandoPlacement next, AbstractPlacement placement) - { - if (placement is ItemChanger.Placements.IPrimaryLocationPlacement iplp - && iplp.Location is ItemChanger.Locations.ILocalHintLocation ilhl) - { - ilhl.HintActive = false; - } - else - { - LogWarn($"Unable to disable hint on placement {placement.Name}"); - } - } - */ - - static void RemoveNamePreview(ICFactory factory, RandoPlacement next, AbstractPlacement placement) - { - placement.GetOrAddTag(); - } - - static void RemoveCostPreview(ICFactory factory, RandoPlacement next, AbstractPlacement placement) - { - placement.GetOrAddTag(); - } - - static void RemoveNameAndCostPreview(ICFactory factory, RandoPlacement next, AbstractPlacement placement) - { - placement.GetOrAddTag(); - placement.GetOrAddTag(); - } - - List hintRemoveLocations = new(); - - if (!lls.ColosseumPreview) - { - hintRemoveLocations.Add(LocationNames.Charm_Notch_Colosseum); - hintRemoveLocations.Add(LocationNames.Pale_Ore_Colosseum); - } - if (!lls.KingFragmentPreview) - { - hintRemoveLocations.Add(LocationNames.King_Fragment); - } - if (!lls.FlowerQuestPreview) - { - hintRemoveLocations.Add(LocationNames.Mask_Shard_Grey_Mourner); - } - if (!lls.GreyPrinceZotePreview) - { - hintRemoveLocations.Add(LocationNames.Boss_Essence_Grey_Prince_Zote); - } - if (!lls.WhisperingRootPreview) - { - hintRemoveLocations.AddRange(Data.GetPoolDef(PoolNames.Root).IncludeLocations); - } - if (!lls.AbyssShriekPreview) - { - hintRemoveLocations.Add(LocationNames.Abyss_Shriek); - } - if (!lls.VoidHeartPreview) - { - hintRemoveLocations.Add(LocationNames.Void_Heart); - } - if (!lls.DreamerPreview) - { - hintRemoveLocations.Add(LocationNames.Lurien); - hintRemoveLocations.Add(LocationNames.Monomon); - hintRemoveLocations.Add(LocationNames.Herrah); - } - if (!lls.GodtunerPreview) - { - hintRemoveLocations.Add(LocationNames.Godtuner); - } - if (!lls.BasinFountainPreview) - { - hintRemoveLocations.Add(LocationNames.Vessel_Fragment_Basin); - } - if (!lls.NailmasterPreview) - { - hintRemoveLocations.Add(LocationNames.Cyclone_Slash); - hintRemoveLocations.Add(LocationNames.Great_Slash); - hintRemoveLocations.Add(LocationNames.Dash_Slash); - } - if (!lls.StagPreview) - { - hintRemoveLocations.AddRange(Data.GetPoolDef(PoolNames.Stag).IncludeLocations); - hintRemoveLocations.Add(LocationNames.Elevator_Pass); - } - if (!lls.MapPreview) - { - hintRemoveLocations.AddRange(Data.GetPoolDef(PoolNames.Map).IncludeLocations); - } - if (!lls.LoreTabletPreview) - { - // only the spore shroom tablets are technically needed - // but might as well block previews on all of them - hintRemoveLocations.AddRange(Data.GetPoolDef(PoolNames.Lore).IncludeLocations); - } - if (!lls.DivinePreview) - { - hintRemoveLocations.Add(LocationNames.Unbreakable_Heart); - hintRemoveLocations.Add(LocationNames.Unbreakable_Greed); - hintRemoveLocations.Add(LocationNames.Unbreakable_Strength); - } - - - foreach (string s in hintRemoveLocations) - { - rb.EditLocationRequest(s, info => info.onPlacementFetch += RemoveNamePreview); - } - - (string, LongLocationSettings.CostItemHintSettings)[] costHints = new[] - { - (LocationNames.Sly, lls.GeoShopPreview), - (LocationNames.Sly_Key, lls.GeoShopPreview), - (LocationNames.Iselda, lls.GeoShopPreview), - (LocationNames.Salubra, lls.GeoShopPreview), - (LocationNames.Leg_Eater, lls.GeoShopPreview), - (LocationNames.Grubfather, lls.GrubfatherPreview), - (LocationNames.Seer, lls.SeerPreview), - (LocationNames.Egg_Shop, lls.EggShopPreview), - }; - - foreach ((string loc, LongLocationSettings.CostItemHintSettings cs) in costHints) - { - switch (cs) - { - case LongLocationSettings.CostItemHintSettings.CostAndName: - break; - case LongLocationSettings.CostItemHintSettings.CostOnly: - rb.EditLocationRequest(loc, info => info.onPlacementFetch += RemoveNamePreview); - break; - case LongLocationSettings.CostItemHintSettings.NameOnly: - rb.EditLocationRequest(loc, info => info.onPlacementFetch += RemoveCostPreview); - break; - case LongLocationSettings.CostItemHintSettings.None: - rb.EditLocationRequest(loc, info => info.onPlacementFetch += RemoveNameAndCostPreview); - break; - } - } - } - - public static void ApplyDuplicateItemSettings(RequestBuilder rb) - { - DuplicateItemSettings ds = rb.gs.DuplicateItemSettings; - NoveltySettings ns = rb.gs.NoveltySettings; - CursedSettings cs = rb.gs.CursedSettings; - PoolSettings ps = rb.gs.PoolSettings; - List dupes = new(); - - if (ds.MothwingCloak && !ns.SplitCloak && !rb.IsAtStart(ItemNames.Mothwing_Cloak)) - { - dupes.Add(ItemNames.Mothwing_Cloak); - } - if (ds.MantisClaw && !ns.SplitClaw && !rb.IsAtStart(ItemNames.Mantis_Claw)) - { - dupes.Add(ItemNames.Mantis_Claw); - } - if (ds.CrystalHeart && !ns.SplitSuperdash && !rb.IsAtStart(ItemNames.Crystal_Heart)) - { - dupes.Add(ItemNames.Crystal_Heart); - } - if (ds.MonarchWings && !rb.IsAtStart(ItemNames.Monarch_Wings)) - { - dupes.Add(ItemNames.Monarch_Wings); - } - if (ds.ShadeCloak && !rb.IsAtStart(ItemNames.Shade_Cloak) && !rb.IsAtStart(ItemNames.Split_Shade_Cloak)) - { - dupes.Add(ns.SplitCloak ? ItemNames.Split_Shade_Cloak : ItemNames.Shade_Cloak); - } - if (ds.DreamNail && !rb.IsAtStart(ItemNames.Dream_Nail)) - { - dupes.Add(ItemNames.Dream_Nail); - } - if (ds.VoidHeart) - { - dupes.Add(ItemNames.Void_Heart); - } - if (ds.Dreamer && !rb.IsAtStart(ItemNames.Dreamer)) - { - dupes.Add(ItemNames.Dreamer); - } - if (ds.SwimmingItems) - { - if (!rb.IsAtStart(ItemNames.Ismas_Tear)) - { - dupes.Add(ItemNames.Ismas_Tear); - } - if (ns.RandomizeSwim && !rb.IsAtStart(ItemNames.Swim)) - { - dupes.Add(ItemNames.Swim); - } - } - if (ds.LevelOneSpells) - { - dupes.Add(ItemNames.Vengeful_Spirit); - dupes.Add(ItemNames.Desolate_Dive); - dupes.Add(ItemNames.Howling_Wraiths); - } - if (ds.LevelTwoSpells && !cs.RemoveSpellUpgrades) - { - dupes.Add(ItemNames.Shade_Soul); - dupes.Add(ItemNames.Descending_Dark); - dupes.Add(ItemNames.Abyss_Shriek); - } - if (ds.Grimmchild && !rb.IsAtStart(ItemNames.Grimmchild1) && !rb.IsAtStart(ItemNames.Grimmchild2)) - { - dupes.Add(ps.GrimmkinFlames ? ItemNames.Grimmchild1 : ItemNames.Grimmchild2); - } - if (ds.NailArts) - { - if (!rb.IsAtStart(ItemNames.Cyclone_Slash)) dupes.Add(ItemNames.Cyclone_Slash); - if (!rb.IsAtStart(ItemNames.Great_Slash)) dupes.Add(ItemNames.Great_Slash); - if (!rb.IsAtStart(ItemNames.Dash_Slash)) dupes.Add(ItemNames.Dash_Slash); - } - if (ds.CursedNailItems && ns.RandomizeNail) - { - if (!rb.IsAtStart(ItemNames.Upslash)) dupes.Add(ItemNames.Upslash); - if (!rb.IsAtStart(ItemNames.Leftslash)) dupes.Add(ItemNames.Leftslash); - if (!rb.IsAtStart(ItemNames.Rightslash)) dupes.Add(ItemNames.Rightslash); - } - if (ds.DuplicateUniqueKeys) - { - if (!rb.IsAtStart(ItemNames.City_Crest)) dupes.Add(ItemNames.City_Crest); - if (!rb.IsAtStart(ItemNames.Lumafly_Lantern)) dupes.Add(ItemNames.Lumafly_Lantern); - if (!rb.IsAtStart(ItemNames.Tram_Pass)) dupes.Add(ItemNames.Tram_Pass); - if (!rb.IsAtStart(ItemNames.Shopkeepers_Key)) dupes.Add(ItemNames.Shopkeepers_Key); - if (!rb.IsAtStart(ItemNames.Elegant_Key)) dupes.Add(ItemNames.Elegant_Key); - if (!rb.IsAtStart(ItemNames.Love_Key)) dupes.Add(ItemNames.Love_Key); - if (!rb.IsAtStart(ItemNames.Kings_Brand)) dupes.Add(ItemNames.Kings_Brand); - if (ns.RandomizeElevatorPass && !rb.IsAtStart(ItemNames.Elevator_Pass)) dupes.Add(ItemNames.Elevator_Pass); - } - switch (ds.SimpleKeyHandling) - { - default: - case DuplicateItemSettings.SimpleKeySetting.NoDupe: - break; - case DuplicateItemSettings.SimpleKeySetting.TwoDupeKeys: - dupes.Add(ItemNames.Simple_Key); - dupes.Add(ItemNames.Simple_Key); - break; - case DuplicateItemSettings.SimpleKeySetting.TwoExtraKeysInLogic: - rb.AddItemByName(ItemNames.Simple_Key); - rb.AddItemByName(ItemNames.Simple_Key); - break; - } - if (ns.SplitClaw && !rb.IsAtStart(ItemNames.Mantis_Claw)) - { - switch (ds.SplitClawHandling) - { - default: - case DuplicateItemSettings.SplitItemSetting.NoDupe: - break; - case DuplicateItemSettings.SplitItemSetting.DupeLeft: - if (!rb.IsAtStart(ItemNames.Left_Mantis_Claw)) dupes.Add(ItemNames.Left_Mantis_Claw); - break; - case DuplicateItemSettings.SplitItemSetting.DupeRight: - if (!rb.IsAtStart(ItemNames.Right_Mantis_Claw)) dupes.Add(ItemNames.Right_Mantis_Claw); - break; - case DuplicateItemSettings.SplitItemSetting.DupeRandom: - if (rb.rng.NextBool()) goto case DuplicateItemSettings.SplitItemSetting.DupeLeft; - else goto case DuplicateItemSettings.SplitItemSetting.DupeRight; - case DuplicateItemSettings.SplitItemSetting.DupeBoth: - if (!rb.IsAtStart(ItemNames.Left_Mantis_Claw)) dupes.Add(ItemNames.Left_Mantis_Claw); - if (!rb.IsAtStart(ItemNames.Right_Mantis_Claw)) dupes.Add(ItemNames.Right_Mantis_Claw); - break; - } - } - if (ns.SplitCloak && !rb.IsAtStart(ItemNames.Mothwing_Cloak)) - { - switch (ds.SplitCloakHandling) - { - default: - case DuplicateItemSettings.SplitItemSetting.NoDupe: - break; - case DuplicateItemSettings.SplitItemSetting.DupeLeft: - if (!rb.IsAtStart(ItemNames.Left_Mothwing_Cloak)) dupes.Add(ItemNames.Left_Mothwing_Cloak); - break; - case DuplicateItemSettings.SplitItemSetting.DupeRight: - if (!rb.IsAtStart(ItemNames.Right_Mothwing_Cloak)) dupes.Add(ItemNames.Right_Mothwing_Cloak); - break; - case DuplicateItemSettings.SplitItemSetting.DupeRandom: - if (rb.rng.NextBool()) goto case DuplicateItemSettings.SplitItemSetting.DupeLeft; - else goto case DuplicateItemSettings.SplitItemSetting.DupeRight; - case DuplicateItemSettings.SplitItemSetting.DupeBoth: - if (!rb.IsAtStart(ItemNames.Left_Mothwing_Cloak)) dupes.Add(ItemNames.Left_Mothwing_Cloak); - if (!rb.IsAtStart(ItemNames.Right_Mothwing_Cloak)) dupes.Add(ItemNames.Right_Mothwing_Cloak); - break; - } - } - if (ns.SplitSuperdash && !rb.IsAtStart(ItemNames.Crystal_Heart)) - { - switch (ds.SplitSuperdashHandling) - { - default: - case DuplicateItemSettings.SplitItemSetting.NoDupe: - break; - case DuplicateItemSettings.SplitItemSetting.DupeLeft: - if (!rb.IsAtStart(ItemNames.Left_Crystal_Heart)) dupes.Add(ItemNames.Left_Crystal_Heart); - break; - case DuplicateItemSettings.SplitItemSetting.DupeRight: - if (!rb.IsAtStart(ItemNames.Right_Crystal_Heart)) dupes.Add(ItemNames.Right_Crystal_Heart); - break; - case DuplicateItemSettings.SplitItemSetting.DupeRandom: - if (rb.rng.NextBool()) goto case DuplicateItemSettings.SplitItemSetting.DupeLeft; - else goto case DuplicateItemSettings.SplitItemSetting.DupeRight; - case DuplicateItemSettings.SplitItemSetting.DupeBoth: - if (!rb.IsAtStart(ItemNames.Left_Crystal_Heart)) dupes.Add(ItemNames.Left_Crystal_Heart); - if (!rb.IsAtStart(ItemNames.Right_Crystal_Heart)) dupes.Add(ItemNames.Right_Crystal_Heart); - break; - } - } - - // non-logic-readable dupes - foreach (string dupe in dupes) - { - string name = $"{PlaceholderItem.Prefix}{dupe}"; - rb.AddItemByName(name); - } - } - - public static void ApplyGrimmchildSetting(RequestBuilder rb) - { - if (rb.gs.PoolSettings.GrimmkinFlames && rb.gs.PoolSettings.Charms) - { - rb.ReplaceItem(ItemNames.Grimmchild2, ItemNames.Grimmchild1); - } - } - - public static void ApplySalubraNotchesSetting(RequestBuilder rb) - { - PoolDef pool = Data.GetPoolDef("SalubraNotch"); - switch (rb.gs.MiscSettings.SalubraNotches) - { - default: - throw new NotImplementedException(); - case MiscSettings.SalubraNotchesSetting.GroupedWithCharmNotchesPool when rb.gs.PoolSettings.CharmNotches: - case MiscSettings.SalubraNotchesSetting.Randomized: - foreach (string item in pool.IncludeItems) rb.AddItemByName(item); - foreach (string location in pool.IncludeLocations) rb.AddLocationByName(location); - return; - case MiscSettings.SalubraNotchesSetting.AutoGivenAtCharmThreshold: - case MiscSettings.SalubraNotchesSetting.Vanilla: - case MiscSettings.SalubraNotchesSetting.GroupedWithCharmNotchesPool when !rb.gs.PoolSettings.CharmNotches: - foreach (VanillaDef def in pool.Vanilla) rb.AddToVanilla(def); - return; - } - } - - public static void ApplySpellRemove(RequestBuilder rb) - { - if (rb.gs.CursedSettings.RemoveSpellUpgrades) - { - rb.RemoveItemByName(ItemNames.Shade_Soul); - rb.RemoveItemByName(ItemNames.Abyss_Shriek); - rb.RemoveItemByName(ItemNames.Descending_Dark); - rb.EditItemRequest(ItemNames.Vengeful_Spirit, info => - { - info.realItemCreator = (factory, placement) => - { - AbstractItem item = factory.MakeItem(ItemNames.Vengeful_Spirit); - item.RemoveTags(); - return item; - }; - }); - rb.EditItemRequest(ItemNames.Howling_Wraiths, info => - { - info.realItemCreator = (factory, placement) => - { - AbstractItem item = factory.MakeItem(ItemNames.Howling_Wraiths); - item.RemoveTags(); - return item; - }; - }); - rb.EditItemRequest(ItemNames.Desolate_Dive, info => - { - info.realItemCreator = (factory, placement) => - { - AbstractItem item = factory.MakeItem(ItemNames.Desolate_Dive); - item.RemoveTags(); - return item; - }; - }); - } - } - - public static void ApplySplitClawFullClawRemove(RequestBuilder rb) - { - if (rb.gs.NoveltySettings.SplitClaw) - { - rb.RemoveItemByName(ItemNames.Mantis_Claw); - rb.RemoveLocationByName(LocationNames.Mantis_Claw); - } - } - - public static void ApplySplitCloakFullCloakRemove(RequestBuilder rb) - { - if (rb.gs.NoveltySettings.SplitCloak) - { - rb.RemoveItemByName(ItemNames.Mothwing_Cloak); - rb.RemoveItemByName(ItemNames.Shade_Cloak); - } - } - - public static void ApplySplitSuperdashFullCrystalHeartRemove(RequestBuilder rb) - { - if (rb.gs.NoveltySettings.SplitSuperdash) - { - rb.RemoveItemByName(ItemNames.Crystal_Heart); - } - } - - public static void ApplySplitCloakShadeCloakRandomize(RequestBuilder rb) - { - if (rb.gs.NoveltySettings.SplitCloak) - { - const string Left_Biased_Shade_Cloak = "Left_Biased_Shade_Cloak"; - const string Right_Biased_Shade_Cloak = "Right_Biased_Shade_Cloak"; - - rb.EditItemRequest(ItemNames.Split_Shade_Cloak, info => - { - info.randoItemCreator = factory => - { - bool leftBiased = factory.rng.NextBool(); - - - return new RandoModItem - { - item = leftBiased - ? factory.lm.GetItemStrict(ItemNames.Left_Mothwing_Cloak) with { Name = Left_Biased_Shade_Cloak } - : factory.lm.GetItemStrict(ItemNames.Right_Mothwing_Cloak) with { Name = Right_Biased_Shade_Cloak } - }; - }; - info.realItemCreator = (factory, next) => - { - AbstractItem item = factory.MakeItem(ItemNames.Split_Shade_Cloak); - - RandoModItem ri = (RandoModItem)next.Item; - while (ri is PlaceholderItem pi) ri = pi.innerItem; - - bool leftBiased = ri.Name switch - { - ItemNames.Right_Mothwing_Cloak or Right_Biased_Shade_Cloak => false, - _ or ItemNames.Left_Mothwing_Cloak or Left_Biased_Shade_Cloak => true, - }; - - item.GetTag().predecessors = leftBiased ? [ItemNames.Left_Mothwing_Cloak] : [ItemNames.Right_Mothwing_Cloak]; - return item; - }; - }); - } - } - - public static void ApplyProgressiveSplitClaw(RequestBuilder rb) - { - rb.EditItemRequest(ItemNames.Left_Mantis_Claw, info => info.realItemCreator = (factory, placement) => - { - AbstractItem item = factory.MakeItem(ItemNames.Left_Mantis_Claw); - item.AddTag().successors = new[] { ItemNames.Right_Mantis_Claw }; - return item; - }); - rb.EditItemRequest(ItemNames.Right_Mantis_Claw, info => info.realItemCreator = (factory, placement) => - { - AbstractItem item = factory.MakeItem(ItemNames.Right_Mantis_Claw); - item.AddTag().successors = new[] { ItemNames.Left_Mantis_Claw }; - return item; - }); - } - - public static void ApplyMaskShardCountSetting(RequestBuilder rb) - { - if (rb.gs.MiscSettings.MaskShards == MiscSettings.MaskShardType.TwoShardsPerMask) - { - rb.ReplaceItem(ItemNames.Mask_Shard, (i) => - { - int doubleShards = i / 2; - int singleShards = i - 2 * doubleShards; - - return Enumerable.Repeat(ItemNames.Double_Mask_Shard, doubleShards).Concat(Enumerable.Repeat(ItemNames.Mask_Shard, singleShards)); - }); - } - else if (rb.gs.MiscSettings.MaskShards == MiscSettings.MaskShardType.OneShardPerMask) - { - rb.ReplaceItem(ItemNames.Mask_Shard, (i) => - { - int fullMasks = i / 4; - int singleShards = i - 4 * fullMasks; - - return Enumerable.Repeat(ItemNames.Full_Mask, fullMasks).Concat(Enumerable.Repeat(ItemNames.Mask_Shard, singleShards)); - }); - } - } - - public static void ApplyVesselFragmentCountSetting(RequestBuilder rb) - { - if (rb.gs.MiscSettings.VesselFragments == MiscSettings.VesselFragmentType.TwoFragmentsPerVessel) - { - rb.ReplaceItem(ItemNames.Vessel_Fragment, i => - { - int doubleFragments = i / 2; - int singleFragments = i - 2 * doubleFragments; - return Enumerable.Repeat(ItemNames.Double_Vessel_Fragment, doubleFragments).Concat(Enumerable.Repeat(ItemNames.Vessel_Fragment, singleFragments)); - }); - } - else if (rb.gs.MiscSettings.VesselFragments == MiscSettings.VesselFragmentType.OneFragmentPerVessel) - { - rb.ReplaceItem(ItemNames.Vessel_Fragment, i => - { - int fullVessels = i / 3; - int singleFragments = i - 3 * fullVessels; - return Enumerable.Repeat(ItemNames.Full_Soul_Vessel, fullVessels).Concat(Enumerable.Repeat(ItemNames.Vessel_Fragment, singleFragments)); - }); - } - } - - public static void ApplyJunkItemRemove(RequestBuilder rb) - { - if (rb.gs.CursedSettings.ReplaceJunkWithOneGeo) - { - foreach (PoolDef pool in Data.Pools) - { - switch (pool.Name) - { - case "Mask": - case "CursedMask": - case "Vessel": - case "Ore": - case "Notch": - case "CursedNotch": - case "Geo": - case "Egg" when !rb.gs.NoveltySettings.EggShop: - case "Relic": - case "Rock": - case "Soul": - case "PalaceSoul": - case "Boss_Geo": - foreach (string i in pool.IncludeItems) rb.RemoveItemByName(i); - break; - } - } - } - } - - public static void ApplyMultiLocationRebalancing(RequestBuilder rb) - { - // replace existing multi locations with random multi locations from the same set - HashSet multiSet = new(); - foreach (ItemGroupBuilder gb in rb.EnumerateItemGroups()) - { - int count = 0; - foreach (string l in gb.Locations.EnumerateDistinct()) - { - if (rb.TryGetLocationDef(l, out LocationDef def) && def.FlexibleCount) - { - multiSet.Add(l); - count += gb.Locations.GetCount(l); - - } - } - string[] multi = multiSet.OrderBy(s => s).ToArray(); - foreach (string l in multi) - { - gb.Locations.Set(l, 1); - count -= 1; - } - - // ordinarily, we end with as many multi locations as we started with, and let the LocationPadder deal with it - // however, the result of padding with too many multi locations is undesirable - // so we restrict the number of multi locations when Items - Locations is small - count = Math.Min(count, Math.Max(0, gb.Items.GetTotal() - gb.Locations.GetTotal())); - while (count-- > 0) - { - gb.Locations.Add(rb.rng.Next(multi)); - } - multiSet.Clear(); - } - } - - public static void ApplyGrubMimicRando(RequestBuilder rb) - { - if (rb.gs.CursedSettings.RandomizeMimics && !rb.gs.PoolSettings.Grubs) - { - PoolDef mimicPool = Data.GetPoolDef(PoolNames.Mimic); - PoolDef grubPool = Data.GetPoolDef(PoolNames.Grub); - - rb.RemoveItemByName(ItemNames.Mimic_Grub); - foreach (string loc in mimicPool.IncludeLocations) rb.RemoveLocationByName(loc); - foreach (VanillaDef def in grubPool.Vanilla) rb.RemoveFromVanilla(def.Location, def.Item); - - StageBuilder sb = rb.AddStage(RBConsts.GrubMimicStage); - ItemGroupBuilder gb = sb.AddItemGroup(RBConsts.GrubMimicGroup); - int extraMimics = rb.rng.Next(rb.gs.CursedSettings.MaximumGrubsReplacedByMimics + 1); - extraMimics = Math.Min(extraMimics, 46 - rb.gs.CostSettings.MaximumGrubCost - rb.gs.CostSettings.GrubTolerance); - gb.Items.Set(ItemNames.Grub, 46 - extraMimics); - gb.Items.Set(ItemNames.Mimic_Grub, 4 + extraMimics); - gb.Locations.AddRange(grubPool.IncludeLocations); - gb.Locations.AddRange(mimicPool.IncludeLocations); - - bool TryMatchGroup(RequestBuilder builder, string item, ElementType type, out GroupBuilder group) - { - if (item == ItemNames.Grub || item == ItemNames.Mimic_Grub || gb.Locations.GetCount(item) > 0) - { - group = gb; - return true; - } - - group = null; - return false; - } - rb.OnGetGroupFor.Subscribe(-2f, TryMatchGroup); - } - else if (rb.gs.CursedSettings.RandomizeMimics) - { - ItemGroupBuilder gb = rb.GetItemGroupFor(ItemNames.Grub); - int availableGrubs = gb.Items.GetCount(ItemNames.Grub); - int extraMimics = rb.rng.Next(rb.gs.CursedSettings.MaximumGrubsReplacedByMimics + 1); - extraMimics = Math.Min(extraMimics, 46 - rb.gs.CostSettings.MaximumGrubCost - rb.gs.CostSettings.GrubTolerance); - extraMimics = Math.Min(extraMimics, availableGrubs); - gb.Items.Remove(ItemNames.Grub, extraMimics); - gb.Items.Increment(ItemNames.Mimic_Grub, extraMimics); - } - } - - public static void ApplyRandomizeCursedMasks(RequestBuilder rb) - { - for (int i = 0; i < rb.gs.CursedSettings.CursedMasks * 4; i++) rb.AddItemByName(ItemNames.Mask_Shard); - } - - private static void ApplyRandomizeCursedNotches(RequestBuilder rb) - { - for (int i = 0; i < rb.gs.CursedSettings.CursedNotches; i++) rb.AddItemByName(ItemNames.Charm_Notch); - } - - public static void ApplyMultiLocationPenalty(RequestBuilder rb) - { - if (!rb.gs.ProgressionDepthSettings.MultiLocationPenalty) return; - - foreach (ItemGroupBuilder gb in rb.EnumerateItemGroups()) - { - gb.OnCreateGroup += OnCreateGroup; - } - - static void OnCreateGroup(RandomizationGroup g) - { - if (g.Strategy is not DefaultGroupPlacementStrategy dgps) return; - - HashSet shops = new(); - HashSet shopRef = new(ReferenceEqualityComparer.Instance); - - g.OnPermute += OnPermute; - dgps.ConstraintList.Add(new(Constraint, null, "RM Multi Location Penalty")); - - void OnPermute(Random rng, RandomizationGroup g) - { - shops.Clear(); - shopRef.Clear(); - - for (int i = 0; i < g.Locations.Length; i++) - { - if (g.Locations[i] is not RandoModLocation rl) continue; - if (rl.LocationDef?.AdditionalProgressionPenalty == true && shops.Add(rl.Name)) shopRef.Add(rl); - } - } - - bool Constraint(IRandoItem ri, IRandoLocation rl) - { - return !ri.Required || !shops.Contains(rl.Name) || shopRef.Contains(rl); - } - } - } - - public static void ApplyItemPostPermuteEvents(RequestBuilder rb) - { - foreach (ItemGroupBuilder gb in rb.EnumerateItemGroups()) - { - if (gb.onPermute == null) gb.onPermute = PostPermute; - } - - void PostPermute(Random rng, RandomizationGroup group) - { - IReadOnlyList items = group.Items; - IReadOnlyList locations = group.Locations; - bool majorPenalty = rb.gs.CursedSettings.LongerProgressionChains; - bool dupePenalty = rb.gs.ProgressionDepthSettings.DuplicateItemPenalty; - - if (majorPenalty || dupePenalty) - { - for (int i = 0; i < items.Count; i++) - { - if (majorPenalty && rb.TryGetItemDef(items[i].Name, out ItemDef def) && def.MajorItem) - { - items[i].Priority += rng.Next(items.Count - i) / (float)items.Count; - } - - if (dupePenalty && items[i] is PlaceholderItem) - { - // avoid very early dupes - if (items[i].Priority < 0.4f) items[i].Priority += 0.2f; - } - } - } - } - } - - public static void ApplyDefaultItemPadding(RequestBuilder rb) - { - foreach (ItemGroupBuilder gb in rb.EnumerateItemGroups()) - { - gb.ItemPadder ??= ItemPadder; - gb.LocationPadder ??= (factory, count) => LocationPadder(gb, factory, count); - } - - IEnumerable ItemPadder(RandoFactory factory, int count) - { - for (int i = 0; i < count; i++) yield return factory.MakeItem(ItemNames.One_Geo); - } - IEnumerable LocationPadder(ItemGroupBuilder gb, RandoFactory factory, int count) - { - HashSet multiSet = new(); - foreach (string l in gb.Locations.EnumerateDistinct()) - { - LocationDef def = new(); - if (rb.TryGetLocationDef(l, out def) && def.FlexibleCount) multiSet.Add(l); - } - if (multiSet.Count == 0) multiSet.Add(LocationNames.Sly); - string[] multi = multiSet.OrderBy(s => s).ToArray(); - for (int i = 0; i < count; i++) yield return factory.MakeLocation(rb.rng.Next(multi)); - } - } - - public static void ApplyItemPlacementStrategy(RequestBuilder rb) - { - foreach (ItemGroupBuilder gb in rb.EnumerateItemGroups()) - { - gb.strategy ??= rb.gs.ProgressionDepthSettings.GetItemPlacementStrategy(); - } - } - - public static void ApplyTransitionPlacementStrategy(RequestBuilder rb) - { - foreach (GroupBuilder gb in rb.EnumerateTransitionGroups()) - { - gb.strategy ??= rb.gs.ProgressionDepthSettings.GetTransitionPlacementStrategy(); - } - } - - public static void ApplyConnectAreasPostPermuteEvent(RequestBuilder rb) - { - if (rb.gs.TransitionSettings.AreaConstraint != TransitionSettings.AreaConstraintSetting.None) - { - Dictionary areaOrder = new(); - TransitionSettings.AreaConstraintSetting areaConstraint = rb.gs.TransitionSettings.AreaConstraint; - - foreach (GroupBuilder gb in rb.EnumerateTransitionGroups()) - { - if (gb.onPermute == null) gb.onPermute += PostPermute; - } - rb.rm.OnNewAttempt += areaOrder.Clear; - - string GetAreaName(string transition) - { - rb.TryGetTransitionDef(transition, out TransitionDef def); - return areaConstraint switch - { - TransitionSettings.AreaConstraintSetting.MoreConnectedMapAreas => def?.MapArea, - TransitionSettings.AreaConstraintSetting.MoreConnectedTitledAreas => def?.TitledArea, - _ => throw new NotImplementedException(), - }; - } - - // weakly group transitions by area in the order - // so that selector eliminates one area before moving onto the next - // "weakly", since we ideally do not want to prevent bottlenecked layouts like vanilla city - // note that areaOrder is captured, to synchronize across groups - void PostPermute(Random rng, RandomizationGroup group) - { - foreach (IRandoItem t in group.Items) - { - string area = GetAreaName(t.Name); - if (string.IsNullOrEmpty(area)) continue; - if (!areaOrder.TryGetValue(area, out int modifier)) areaOrder.Add(area, modifier = areaOrder.Count); - t.Priority += modifier * 0.8f; - } - foreach (IRandoLocation t in group.Locations) - { - string area = GetAreaName(t.Name); - if (string.IsNullOrEmpty(area)) continue; - if (!areaOrder.TryGetValue(area, out int modifier)) areaOrder.Add(area, modifier = areaOrder.Count); - t.Priority += modifier * 0.8f; - } - } - } - } - - public static void ApplyAreaConstraint(RequestBuilder rb) - { - if (rb.gs.TransitionSettings.AreaConstraint != TransitionSettings.AreaConstraintSetting.None) - { - TransitionSettings.AreaConstraintSetting areaConstraint = rb.gs.TransitionSettings.AreaConstraint; - bool AreasMatch(IRandoItem item, IRandoLocation location) - { - if (!rb.TryGetTransitionDef(item.Name, out TransitionDef t1) - || !rb.TryGetTransitionDef(location.Name, out TransitionDef t2)) - { - return true; - } - - return areaConstraint switch - { - TransitionSettings.AreaConstraintSetting.MoreConnectedTitledAreas => t1.TitledArea == t2.TitledArea, - TransitionSettings.AreaConstraintSetting.MoreConnectedMapAreas => t1.MapArea == t2.MapArea, - _ => throw new NotImplementedException(), - }; - } - - foreach (GroupBuilder gb in rb.EnumerateTransitionGroups()) - { - gb.strategy ??= rb.gs.ProgressionDepthSettings.GetTransitionPlacementStrategy(); - if (gb.strategy is DefaultGroupPlacementStrategy s) - { - s.ConstraintList.Add(new(AreasMatch, null, "RM Area Constraint")); - } - else throw new InvalidOperationException("Connected areas conflict with transition group placement strategy!"); - } - } - } - - public static void ApplyDerangedConstraint(RequestBuilder rb) - { - if (!rb.gs.CursedSettings.Deranged) return; - - bool NotVanillaTransition(IRandoItem item, IRandoLocation location) - { - if (!rb.TryGetTransitionDef(location.Name, out TransitionDef source)) - { - return true; - } - - return source.VanillaTarget != item.Name; - } - - Dictionary> vanillaLookup = Data.Pools - .SelectMany(p => p.Vanilla) - .GroupBy(v => v.Location, v => v.Item) - .ToDictionary(g => g.Key, g => new HashSet(g)); - bool NotVanillaLocation(IRandoItem item, IRandoLocation location) - { - return !vanillaLookup.TryGetValue(location.Name, out HashSet items) - || !items.Contains(item.Name); - } - - foreach (GroupBuilder gb in rb.EnumerateTransitionGroups()) - { - if (gb.strategy is DefaultGroupPlacementStrategy dgps) - { - dgps.ConstraintList.Add(new(NotVanillaTransition, null, "RM Deranged Transition")); - } - } - foreach (ItemGroupBuilder gb in rb.EnumerateItemGroups()) - { - if (gb.strategy is DefaultGroupPlacementStrategy dgps) - { - dgps.ConstraintList.Add(new(NotVanillaLocation, null, "RM Deranged Item")); - } - } - } - - public static void ApplyDupeShopConstraint(RequestBuilder rb) - { - if (rb.gs.ProgressionDepthSettings.DuplicateItemPenalty && rb.gs.ProgressionDepthSettings.MultiLocationPenalty) - { - foreach (ItemGroupBuilder igb in rb.EnumerateItemGroups()) - { - if (igb.strategy is DefaultGroupPlacementStrategy dgps) - { - dgps.ConstraintList.Add(new(PreventDupesInShops, null, "RM Dupe Shop Constraint")); - } - } - } - - static bool PreventDupesInShops(IRandoItem ri, IRandoLocation rl) - { - if (ri is PlaceholderItem - && rl is RandoModLocation rml - && rml.LocationDef?.AdditionalProgressionPenalty == true && rml.Priority >= 1f) - { - return false; - } - return true; - } - } - } -} diff --git a/RandomizerMod/RC/Requests/CDFWeightedArray.cs b/RandomizerMod/RC/Requests/CDFWeightedArray.cs deleted file mode 100644 index c5be40a..0000000 --- a/RandomizerMod/RC/Requests/CDFWeightedArray.cs +++ /dev/null @@ -1,57 +0,0 @@ -namespace RandomizerMod.RC -{ - public struct CDFWeightedArray - { - public readonly T[] values; - public readonly double[] cumulativeDensities; - - /// - /// Creates a new CDFWeightedArray with the given values. Densities should have the same positive length as values, and its entries should be increasing positive numbers, with last entry 1. - /// - public CDFWeightedArray(T[] values, double[] cumulativeDensities) - { - this.values = values; - this.cumulativeDensities = cumulativeDensities; - } - - /// - /// Creates a new CDFWeightedArray with the given values. - ///
If cumulative, densities should have the same positive length as values, and its entries should be increasing positive numbers, with last entry 1. - ///
If noncumulative, densities should have the same positive length as values, and its entries should be nonnegative numbers. - ///
- public CDFWeightedArray(T[] values, double[] densities, bool cumulative) - { - this.values = values; - if (cumulative) - { - this.cumulativeDensities = densities; - } - else - { - this.cumulativeDensities = new double[densities.Length]; - double total = cumulativeDensities.Sum(); - double cdf = 0.0; - for (int i = 0; i < densities.Length; i++) - { - this.cumulativeDensities[i] = cdf += densities[i] / total; - } - } - } - - /// - /// Randomly selects a value from the array using the CDF weights. - ///
Chooses a random number between 0 and 1, and then returns the value with the least weight greater than the - ///
- public T Next(Random rng) - { - if (values.Length == 1) return values[0]; // don't burn rng samples unnecessarily - - double d = rng.NextDouble(); - for (int i = 0; i < values.Length; i++) - { - if (cumulativeDensities[i] > d) return values[i]; - } - return values[values.Length - 1]; - } - } -} diff --git a/RandomizerMod/RC/Requests/GroupBuilder.cs b/RandomizerMod/RC/Requests/GroupBuilder.cs deleted file mode 100644 index 208b7ab..0000000 --- a/RandomizerMod/RC/Requests/GroupBuilder.cs +++ /dev/null @@ -1,18 +0,0 @@ -using RandomizerCore.Randomization; - -namespace RandomizerMod.RC -{ - public abstract class GroupBuilder - { - public string label; - public string stageLabel; - public Action? onPermute; - public GroupPlacementStrategy? strategy; - /// - /// An action invoked on each group created by the GroupBuilder. Note that some GroupBuilders may create multiple groups. - /// - public Action? OnCreateGroup; - - public abstract void Apply(List groups, RandoFactory factory); - } -} diff --git a/RandomizerMod/RC/Requests/ICFactory.cs b/RandomizerMod/RC/Requests/ICFactory.cs deleted file mode 100644 index af70132..0000000 --- a/RandomizerMod/RC/Requests/ICFactory.cs +++ /dev/null @@ -1,162 +0,0 @@ -using ItemChanger; -using RandomizerCore; -using RandomizerMod.IC; -using RandomizerMod.Settings; - -namespace RandomizerMod.RC -{ - public class ICFactory - { - public readonly RequestBuilder rb; - public readonly GenerationSettings gs; - private readonly Dictionary _placements; - - public ICFactory(RequestBuilder rb, Dictionary placements) - { - this.rb = rb; - this.gs = rb.gs; - _placements = placements; - } - - public void HandlePlacement(int index, RandoModItem ri, RandoModLocation rl) - { - AbstractPlacement placement; - if (rl.info?.customPlacementFetch != null) - { - placement = rl.info.customPlacementFetch(this, new(ri, rl)); - if (placement == null) throw new NullReferenceException("Placement cannot be null after custom placement fetch!"); - if (!_placements.ContainsKey(placement.Name)) AddPlacement(placement); - } - else - { - placement = FetchOrMakePlacement(rl.Name); - } - rl.info?.onPlacementFetch?.Invoke(this, new(ri, rl), placement); - - AbstractItem item; - if (ri.info?.realItemCreator != null) - { - item = ri.info.realItemCreator(this, new(ri, rl)); - } - else - { - item = MakeItem(ri.Name); - } - if (item == null) throw new InvalidOperationException($"Failed to instantiate item {ri.Name} at {rl.Name}."); - - if (rl.info?.customAddToPlacement != null) - { - rl.info.customAddToPlacement(this, new(ri, rl), placement, item); - } - else - { - if (rl.costs != null) CostConversion.HandleCosts(this, rl.costs, item, placement); - placement.Add(item); - } - item.GetOrAddTag().id = index; - placement.GetOrAddTag().ids.Add(index); - } - - /// - /// Makes the item by name using the info in the RequestBuilder, or else the default method. - ///
This does not consider the events attached to the RandoModItem, if any. - ///
- public AbstractItem MakeItemWithEvents(string itemName, RandoPlacement placement) - { - if (rb.TryGetItemRequest(itemName, out ItemRequestInfo info) && info.realItemCreator != null) - { - return info.realItemCreator(this, placement); - } - else - { - return MakeItem(itemName); - } - } - - /// - /// Makes the item by name, using ItemChanger.Finder. - /// - public AbstractItem MakeItem(string name) - { - AbstractItem item = Finder.GetItem(name); - if (item == null) throw new ArgumentException($"Item {name} did not correspond to any ItemChanger item!"); - return item; - } - - public AbstractLocation MakeLocation(string name) - { - AbstractLocation location = Finder.GetLocation(name); - if (location == null) throw new ArgumentException($"Location {name} did not correspond to any ItemChanger location!"); - return location; - } - - /// - /// Looks up the placement by name. If the placement has not yet been added, does nothing and returns false. - /// - public bool TryFetchPlacement(string name, out AbstractPlacement placement) - { - return _placements.TryGetValue(name, out placement); - } - - /// - /// Looks up the placement by name. If the placmeent has not yet been added, makes and adds the placement using the default procedure. - /// - public AbstractPlacement FetchOrMakePlacement(string name) - { - if (_placements.TryGetValue(name, out AbstractPlacement placement)) return placement; - return MakePlacement(name); - } - - public AbstractPlacement FetchOrMakePlacementWithEvents(string placementName, RandoPlacement next) - { - bool hasInfo = rb.TryGetLocationRequest(placementName, out LocationRequestInfo info); - - AbstractPlacement placement; - if (hasInfo && info.customPlacementFetch != null) - { - placement = info.customPlacementFetch(this, next); - } - else - { - placement = FetchOrMakePlacement(placementName); - } - if (hasInfo && info.onPlacementFetch != null) - { - info.onPlacementFetch?.Invoke(this, next, placement); - } - return placement; - } - - private AbstractPlacement MakePlacement(string name) - { - if (_placements.ContainsKey(name)) throw new ArgumentException($"Placement {name} already exists!"); - - AbstractPlacement placement = MakeLocation(name).Wrap(); - AddPlacement(placement); - return placement; - } - - public void AddPlacement(AbstractPlacement placement) - { - if (_placements.TryGetValue(placement.Name, out AbstractPlacement p2)) - { - if (p2 != placement) throw new ArgumentException($"Placement {placement.Name} already exists!"); - } - else - { - _placements.Add(placement.Name, placement); - placement.AddTag(); - } - } - - public void AddToPlacement(RandoPlacement next, AbstractItem item, AbstractPlacement placement) - { - RandoLocation rl = (RandoLocation)next.Location; - if (rl.costs != null) - { - CostConversion.HandleCosts(this, rl.costs, item, placement); - } - placement.Add(item); - } - } -} diff --git a/RandomizerMod/RC/Requests/ItemGroupBuilder.cs b/RandomizerMod/RC/Requests/ItemGroupBuilder.cs deleted file mode 100644 index 1ecaa0e..0000000 --- a/RandomizerMod/RC/Requests/ItemGroupBuilder.cs +++ /dev/null @@ -1,56 +0,0 @@ -using RandomizerCore; -using RandomizerCore.Randomization; - -namespace RandomizerMod.RC -{ - public class ItemGroupBuilder : GroupBuilder - { - public ItemGroupBuilder() { } - - public delegate IEnumerable ItemPaddingHandler(RandoFactory factory, int count); - public delegate IEnumerable LocationPaddingHandler(RandoFactory factory, int count); - public ItemPaddingHandler? ItemPadder; - public LocationPaddingHandler? LocationPadder; - - public readonly Bucket Items = new(); - public readonly Bucket Locations = new(); - - - public override void Apply(List groups, RandoFactory factory) - { - List items = new(); - foreach (string i in Items.EnumerateWithMultiplicity()) - { - items.Add(factory.MakeItem(i)); - } - List locations = new(); - foreach (string i in Locations.EnumerateWithMultiplicity()) - { - locations.Add(factory.MakeLocation(i)); - } - - int diff = items.Count - locations.Count; - if (diff > 0 && LocationPadder != null) - { - locations.AddRange(LocationPadder(factory, diff)); - } - else if (diff < 0 && ItemPadder != null) - { - items.AddRange(ItemPadder(factory, -diff)); - } - - if (items.Count != locations.Count) throw new InvalidOperationException($"Failed to build group {label} due to unbalanced counts."); - - RandomizationGroup group = new() - { - Items = items.ToArray(), - Locations = locations.ToArray(), - Label = label, - Strategy = strategy ?? factory.gs.ProgressionDepthSettings.GetItemPlacementStrategy(), - }; - group.OnPermute += onPermute; - groups.Add(group); - OnCreateGroup?.Invoke(group); - } - } -} diff --git a/RandomizerMod/RC/Requests/ItemRequestInfo.cs b/RandomizerMod/RC/Requests/ItemRequestInfo.cs deleted file mode 100644 index a8efcbf..0000000 --- a/RandomizerMod/RC/Requests/ItemRequestInfo.cs +++ /dev/null @@ -1,43 +0,0 @@ -using ItemChanger; -using Newtonsoft.Json; -using RandomizerCore; -using RandomizerMod.RandomizerData; - -namespace RandomizerMod.RC -{ - public class ItemRequestInfo - { - public Func? randoItemCreator; - public Action? onRandoItemCreation; - public Action? onRandomizerFinish; - public Func? realItemCreator; - public Func? getItemDef; - - public void AddGetItemDefModifier(string name, Func modifier) - { - Func get = getItemDef ?? (() => Data.GetItemDef(name)); - getItemDef = () => modifier(get()); - } - - public ItemRequestInfo Clone() - { - return new ItemRequestInfo - { - randoItemCreator = (Func)randoItemCreator?.Clone(), - onRandoItemCreation = (Action)onRandoItemCreation?.Clone(), - onRandomizerFinish = (Action)onRandomizerFinish?.Clone(), - realItemCreator = (Func)realItemCreator?.Clone(), - getItemDef = (Func)getItemDef?.Clone() - }; - } - - public void AppendTo(ItemRequestInfo info) - { - if (randoItemCreator != null) info.randoItemCreator = randoItemCreator; - info.onRandoItemCreation += onRandoItemCreation; - info.onRandomizerFinish += onRandomizerFinish; - if (realItemCreator != null) info.realItemCreator = realItemCreator; - if (getItemDef != null) info.getItemDef = getItemDef; - } - } -} diff --git a/RandomizerMod/RC/Requests/LocationRequestInfo.cs b/RandomizerMod/RC/Requests/LocationRequestInfo.cs deleted file mode 100644 index 4a4b885..0000000 --- a/RandomizerMod/RC/Requests/LocationRequestInfo.cs +++ /dev/null @@ -1,50 +0,0 @@ -using ItemChanger; -using Newtonsoft.Json; -using RandomizerCore; -using RandomizerMod.RandomizerData; -using RandomizerMod.Settings; - -namespace RandomizerMod.RC -{ - public class LocationRequestInfo - { - public Func? randoLocationCreator; - public Action? onRandoLocationCreation; - public Action? onRandomizerFinish; - public Func? customPlacementFetch; - public Action? onPlacementFetch; - public Action? customAddToPlacement; - public Func? getLocationDef; - - public void AddGetLocationDefModifier(string name, Func modifier) - { - Func get = getLocationDef ?? (() => Data.GetLocationDef(name)); - getLocationDef = () => modifier(get()); - } - - public LocationRequestInfo Clone() - { - return new LocationRequestInfo - { - randoLocationCreator = (Func)randoLocationCreator?.Clone(), - onRandoLocationCreation = (Action)onRandoLocationCreation?.Clone(), - onRandomizerFinish = (Action)onRandomizerFinish?.Clone(), - customPlacementFetch = (Func)customPlacementFetch?.Clone(), - onPlacementFetch = (Action)onPlacementFetch?.Clone(), - customAddToPlacement = (Action)customAddToPlacement?.Clone(), - getLocationDef = (Func)getLocationDef?.Clone(), - }; - } - - public void AppendTo(LocationRequestInfo info) - { - if (randoLocationCreator != null) info.randoLocationCreator = randoLocationCreator; - info.onRandoLocationCreation += onRandoLocationCreation; - info.onRandomizerFinish += onRandomizerFinish; - if (customPlacementFetch != null) info.customPlacementFetch = customPlacementFetch; - info.onPlacementFetch += onPlacementFetch; - info.customAddToPlacement += customAddToPlacement; - if (getLocationDef != null) info.getLocationDef = getLocationDef; - } - } -} diff --git a/RandomizerMod/RC/Requests/RBConsts.cs b/RandomizerMod/RC/Requests/RBConsts.cs deleted file mode 100644 index 7379835..0000000 --- a/RandomizerMod/RC/Requests/RBConsts.cs +++ /dev/null @@ -1,61 +0,0 @@ -namespace RandomizerMod.RC -{ - /// - /// Strings used by the RequestBuilder as labels. - /// - public static class RBConsts - { - /// - /// Label for the transition stage, in transition rando only. - /// - public const string MainTransitionStage = "Main Transition Stage"; - /// - /// Label for the default stage, in any rando. - /// - public const string MainItemStage = "Main Item Stage"; - - /// - /// Label for the default group of the default stage, in any rando. - /// - public const string MainItemGroup = "Main Item Group"; - - /// - /// Label for the stage of grubs and mimics, when mimics are randomized but grubs are not randomized. - /// - public const string GrubMimicStage = "Grub Mimic Stage"; - /// - /// Label for the group of grubs and mimics, when mimics are randomized but grubs are not randomized. - /// - public const string GrubMimicGroup = "Grub Mimic Group"; - - /// - /// Prefix used for split groups. The label is formed by appending an integer between 1 and 99 according to the setting. - /// - public const string SplitGroupPrefix = "Split Group "; - - /// - /// Label for the corresponding matched transition group. - /// - public const string InLeftOutRightGroup = "Left -> Right"; - /// - /// Label for the corresponding matched transition group. - /// - public const string InRightOutLeftGroup = "Right -> Left"; - /// - /// Label for the corresponding matched transition group. - /// - public const string InBotOutTopGroup = "Bot -> Top"; - /// - /// Label for the corresponding matched transition group. - /// - public const string InTopOutBotGroup = "Top -> Bot"; - /// - /// Label for the group of one-way transitions in any transition rando. - /// - public const string OneWayGroup = "One Way Transitions"; - /// - /// Label for the group of two-way transitions, in non-matched transition rando. - /// - public const string TwoWayGroup = "Two Way Transitions"; - } -} diff --git a/RandomizerMod/RC/Requests/RandoFactory.cs b/RandomizerMod/RC/Requests/RandoFactory.cs deleted file mode 100644 index 9ddda71..0000000 --- a/RandomizerMod/RC/Requests/RandoFactory.cs +++ /dev/null @@ -1,194 +0,0 @@ -using RandomizerCore; -using RandomizerCore.Logic; -using RandomizerMod.RandomizerData; -using RandomizerMod.Settings; - -namespace RandomizerMod.RC -{ - public class RandoFactory - { - public RandoFactory(RequestBuilder rb) - { - this.rb = rb; - this.lm = rb.lm; - this.rng = rb.rng; - this.gs = rb.gs; - } - - public readonly RequestBuilder rb; - public readonly LogicManager lm; - public readonly Random rng; - public readonly GenerationSettings gs; - - /// - /// Makes a PlaceholderItem. The item will be exported identically to the result of MakeItem, but will be treated by logic as an EmptyItem. - /// - public RandoModItem MakeWrappedItem(string name) - { - RandoModItem item = MakeItem(name); - PlaceholderItem wrapper = new(item); - return wrapper; - } - - public RandoModItem MakeItem(string name) - { - RandoModItem ri; - if (!rb.TryGetItemRequest(name, out ItemRequestInfo info)) - { - ri = MakeItemInternal(name); - ri.ItemDef = Data.GetItemDef(name); - } - else - { - ri = info.randoItemCreator != null ? info.randoItemCreator(this) : MakeItemInternal(name); - info.AppendTo(ri.info ??= new()); - ri.ItemDef = info.getItemDef != null ? info.getItemDef() : Data.GetItemDef(name); - info.onRandoItemCreation?.Invoke(this, ri); - } - - return ri; - } - - public RandoModItem MakeItemInternal(string name) - { - RandoModItem item = new() - { - item = lm.GetItemStrict(name), - }; - - return item; - } - - public RandoModLocation MakeLocation(string name) - { - RandoModLocation rl; - if (!rb.TryGetLocationRequest(name, out LocationRequestInfo info)) - { - rl = MakeLocationInternal(name); - rl.LocationDef = Data.GetLocationDef(name); - } - else - { - rl = info.randoLocationCreator?.Invoke(this) ?? MakeLocationInternal(name); - info.AppendTo(rl.info ??= new()); - rl.LocationDef = info?.getLocationDef != null ? info.getLocationDef() : Data.GetLocationDef(name); - info.onRandoLocationCreation?.Invoke(this, rl); - } - - return rl; - } - - private RandoModLocation MakeLocationInternal(string name) - { - RandoModLocation rl = new() - { - logic = lm.GetLogicDefStrict(name), - }; - - if (Data.TryGetCost(name, out CostDef def)) - { - switch (def.Term) - { - case "ESSENCE": - case "GRUBS": - break; - case "SIMPLE": - rl.AddCost(new SimpleCost(lm.GetTermStrict("SIMPLE"), 1)); - break; - case "Spore_Shroom": - rl.AddCost(new SimpleCost(lm.GetTermStrict("Spore_Shroom"), 1)); - break; - case "GEO": - rl.AddCost(new LogicGeoCost(lm, def.Amount)); - break; - default: - rl.AddCost(new SimpleCost(lm.GetTermStrict(def.Term), def.Amount)); - break; - } - } - - return rl; - } - - public ItemPlacement MakeStartPlacement(string item) - { - return new(MakeItem(item), MakeLocation("Start")); - } - - public ItemPlacement MakeItemPlacement(VanillaDef def) - { - RandoModItem ri = MakeItem(def.Item); - RandoModLocation rl = MakeLocation(def.Location); - - if (def.Costs is null && Data.TryGetCost(def.Location, out CostDef baseCost)) - { - rl.AddCost(baseCost.ToLogicCost(lm)); - } - if (def.Costs is not null) - { - foreach (CostDef cost in def.Costs) - { - rl.AddCost(cost.ToLogicCost(lm)); - } - } - - return new(ri, rl); - } - - public TransitionPlacement MakeTransitionPlacement(VanillaDef def) - { - return new((RandoModTransition)MakeTransition(def.Item), (RandoModTransition)MakeTransition(def.Location)); - } - - public GeneralizedPlacement MakeVanillaPlacement(VanillaDef def) - { - if (lm.TransitionLookup.TryGetValue(def.Item, out LogicTransition target)) - { - LogicTransition source = lm.GetTransitionStrict(def.Location); - return new(target, source); - } - - LogicItem li = lm.GetItemStrict(def.Item); - RandoLocation rl = new() { logic = lm.GetLogicDefStrict(def.Location) }; - - if (def.Costs is null && Data.TryGetCost(def.Location, out CostDef baseCost)) - { - rl.AddCost(baseCost.ToLogicCost(lm)); - } - if (def.Costs is not null) - { - foreach (CostDef cost in def.Costs) - { - rl.AddCost(cost.ToLogicCost(lm)); - } - } - - return rl.costs == null ? new(li, rl.logic) : new(li, rl); - } - - public IRandoCouple MakeTransition(string name) - { - RandoModTransition rt; - if (!rb.TryGetTransitionRequest(name, out TransitionRequestInfo info)) - { - rt = MakeTransitionInternal(name); - rt.TransitionDef = Data.GetTransitionDef(name); - } - else - { - rt = info.randoTransitionCreator != null ? info.randoTransitionCreator(this) : MakeTransitionInternal(name); - info.AppendTo(rt.info ??= new()); - rt.TransitionDef = info?.getTransitionDef != null ? info.getTransitionDef() : Data.GetTransitionDef(name); - info.onRandoTransitionCreation?.Invoke(this, rt); - } - - return rt; - } - - private RandoModTransition MakeTransitionInternal(string name) - { - RandoModTransition rt = new(lm.GetTransitionStrict(name)); - return rt; - } - } -} diff --git a/RandomizerMod/RC/Requests/RequestBuilder.cs b/RandomizerMod/RC/Requests/RequestBuilder.cs deleted file mode 100644 index 59cbf95..0000000 --- a/RandomizerMod/RC/Requests/RequestBuilder.cs +++ /dev/null @@ -1,821 +0,0 @@ -using RandomizerCore; -using RandomizerCore.Extensions; -using RandomizerMod.RandomizerData; -using RandomizerMod.Settings; -using RandomizerCore.Randomization; -using RandomizerCore.Logic; -using System.Collections.ObjectModel; -using ItemChanger; -using StartDef = RandomizerMod.RandomizerData.StartDef; - -namespace RandomizerMod.RC -{ - public delegate bool ItemMatchHandler(string name, out ItemRequestInfo info); - public delegate bool LocationMatchHandler(string name, out LocationRequestInfo info); - public delegate bool TransitionMatchHandler(string name, out TransitionRequestInfo info); - - /// - /// Class used to build the request that is passed to the randomizer. The OnUpdate event allows modification of the request as it is built. - /// - public class RequestBuilder - { - public void Run(out RandomizationStage[] stages, out RandoModContext ctx) - { - HandleUpdateEvents(); - - RandoFactory factory = new(this); - stages = Stages.Select(s => s.ToRandomizationStage(factory)).ToArray(); - foreach (RandomizationStage stage in stages) rng.PermuteInPlace(stage.groups); // random tiebreakers between groups - - ctx = this.ctx; - ctx.Vanilla.AddRange(Vanilla.Values.SelectMany(v => v).Select(factory.MakeVanillaPlacement)); - ctx.itemPlacements.AddRange(StartItems.EnumerateWithMultiplicity().Select(factory.MakeStartPlacement)); - foreach (var kvp in Preplaced) - { - if (lm.TransitionLookup.ContainsKey(kvp.Key)) - { - ctx.transitionPlacements.AddRange(kvp.Value.Select(factory.MakeTransitionPlacement)); - } - else - { - ctx.itemPlacements.AddRange(kvp.Value.Select(factory.MakeItemPlacement)); - } - } - } - - - private readonly List _stages; - public readonly ReadOnlyCollection Stages; - public readonly StageBuilder MainItemStage; - public readonly ItemGroupBuilder MainItemGroup; - - /// - /// Enumerates the GroupBuilders of type ItemGroupBuilder. - /// - public IEnumerable EnumerateItemGroups() - { - foreach (StageBuilder sb in Stages) - { - foreach (GroupBuilder gb in sb.Groups) - { - if (gb is ItemGroupBuilder igb) yield return igb; - } - } - } - - /// - /// Enumerates the GroupBuilers not of type ItemGroupBuilder. - /// - public IEnumerable EnumerateTransitionGroups() - { - foreach (StageBuilder sb in Stages) - { - foreach (GroupBuilder gb in sb.Groups) - { - if (gb is not ItemGroupBuilder) yield return gb; - } - } - } - - - public readonly Dictionary ItemRequests = new(); - public readonly List ItemMatchers = new(); - - public readonly Dictionary LocationRequests = new(); - public readonly List LocationMatchers = new(); - - public readonly Dictionary TransitionRequests = new(); - public readonly List TransitionMatchers = new(); - - public readonly Bucket StartItems = new(); - - /// - /// List of vanilla requests, with indexing for fast lookup by location/source transition name. - /// - public readonly Dictionary> Vanilla = new(); - /// - /// List of preplaced requests, with indexing for fast lookup by location/source transition name. - /// - public readonly Dictionary> Preplaced = new(); - - public readonly GenerationSettings gs; - public readonly SettingsPM pm; - public readonly LogicManager lm; - public readonly Random rng; - public readonly RandoMonitor rm; - public readonly RandoModContext ctx; - /// - /// Properties that will be passed the LogArguments, and subsequently to RandoLoggers, if randomization succeeds. - ///
Properties needed for logic should be stored on the ctx. Properties that do not need to be serialized should be stored here. - ///
- public readonly Dictionary logProperties = []; - - private static readonly List _set = new(); // used as a utility for several methods - - public RequestBuilder(GenerationSettings gs, SettingsPM pm, RandoMonitor rm) - { - this.gs = gs; - this.pm = pm; - this.rng = new(gs.Seed + 11); - this.rm = rm; - - ctx = new(gs, SelectStart()); - lm = ctx.LM; - - _stages = new(); - Stages = new(_stages); - - MainItemStage = new(RBConsts.MainItemStage); - MainItemGroup = new() - { - label = RBConsts.MainItemGroup, - }; - MainItemStage.Add(MainItemGroup); - _stages.Add(MainItemStage); - - OnGetGroupFor = new(out _onGetGroupForOwner); - CostConverters = new(out _costConvertersOwner); - } - - public enum ElementType - { - Unknown, - Item, - Location, - Transition - } - - /// - /// Adds a stage with the given label after all existing stages. - /// - public StageBuilder AddStage(string name) - { - return InsertStage(_stages.Count, name); - } - - /// - /// Creates a StageBuilder at the specified index with the given label. - ///
Throws an exception if the index is out of range or the label is already in use. - ///
- public StageBuilder InsertStage(int index, string name) - { - if (name == null) throw new ArgumentNullException(nameof(name)); - if (_stages.Any(s => s.label == name)) throw new ArgumentException(nameof(name)); - if (index < 0 || index > _stages.Count) throw new ArgumentOutOfRangeException(nameof(index)); - - StageBuilder sb = new(name); - _stages.Insert(index, sb); - return sb; - } - - /// - /// Moves the stage with the given label to the given index. - ///
Throws an exception if the index is out of range or the stage with the given label is not found. - ///
- public void MoveStage(int destinationIndex, string name) - { - if (name == null) throw new ArgumentNullException(nameof(name)); - int init = _stages.FindIndex(s => s.label == name); - if (init < 0) throw new ArgumentException(nameof(name)); - if (destinationIndex < 0 || destinationIndex > _stages.Count) throw new ArgumentOutOfRangeException(nameof(destinationIndex)); - - StageBuilder sb = _stages[init]; - _stages.RemoveAt(init); - _stages.Insert(destinationIndex, sb); - } - - /// - /// Searches for a StageBuilder with the given label and returns it if found. - /// - public bool TryGetStage(string name, out StageBuilder sb) - { - int i = _stages.FindIndex(s => s.label == name); - if (i < 0) - { - sb = null; - return false; - } - else - { - sb = _stages[i]; - return true; - } - } - - /// - /// Searches for the appropriate group for the named item, location, or transition, using the OnGetGroupFor event. - /// - public GroupBuilder GetGroupFor(string name, ElementType type = ElementType.Unknown) - { - foreach (GroupResolver resolver in _onGetGroupForOwner.GetSubscribers()) - { - if (resolver(this, name, type, out GroupBuilder gb)) return gb; - } - - if (Data.IsItem(name) || Data.IsLocation(name)) - { - return MainItemGroup; - } - - return null; - } - - /// - /// Searches for the appropriate item group for the named item, using the OnGetGroupFor event. - /// - public ItemGroupBuilder GetItemGroupFor(string name) - { - if (GetGroupFor(name, ElementType.Item) is ItemGroupBuilder igb) return igb; - return MainItemGroup; - } - - /// - /// Searches for the appropriate item group for the named location, using the OnGetGroupFor event. - /// - public ItemGroupBuilder GetLocationGroupFor(string name) - { - if (GetGroupFor(name, ElementType.Location) is ItemGroupBuilder igb) return igb; - return MainItemGroup; - } - - /// - /// Adds one copy of the named item to the group returned by GetItemGroupFor. - /// - public void AddItemByName(string name) - { - GetItemGroupFor(name).Items.Add(name); - } - - /// - /// Adds the requested number of copies of the named item to the group returned by GetItemGroupFor. - /// - public void AddItemByName(string name, int count) - { - GetItemGroupFor(name).Items.Increment(name, count); - } - - /// - /// Removes all copies of the named item from all item groups. - /// - public void RemoveItemByName(string name) - { - foreach (ItemGroupBuilder gb in EnumerateItemGroups()) gb.Items.RemoveAll(name); - } - - public bool TryGetItemRequest(string name, out ItemRequestInfo info) - { - if (ItemRequests.TryGetValue(name, out info)) - { - return true; - } - else - { - foreach (ItemMatchHandler matcher in ItemMatchers) - { - if (matcher(name, out info)) - { - ItemRequests.Add(name, info); - return true; - } - } - } - info = default; - return false; - } - - public void EditItemRequest(string name, Action edit) - { - if (!TryGetItemRequest(name, out ItemRequestInfo info)) - { - ItemRequests.Add(name, info = new()); - } - - edit(info); - } - - public bool TryGetItemDef(string name, out ItemDef def) - { - def = TryGetItemRequest(name, out ItemRequestInfo info) && info.getItemDef != null - ? info.getItemDef() - : Data.GetItemDef(name); - return def is not null; - } - - /// - /// Adds one copy of the named location to the group returned by GetLocationGroupFor. - /// - public void AddLocationByName(string name) - { - GetLocationGroupFor(name).Locations.Add(name); - } - - /// - /// Adds the requested number of copies of the named location to the group returned by GetLocationGroupFor. - /// - public void AddLocationByName(string name, int count) - { - GetLocationGroupFor(name).Locations.Increment(name, count); - } - - /// - /// Removes all copies of the named location from all item groups. - /// - public void RemoveLocationByName(string name) - { - foreach (ItemGroupBuilder gb in EnumerateItemGroups()) gb.Locations.RemoveAll(name); - } - - /// - /// Removes the requested number of copies of the named location from the group returned by GetLocationGroupFor. - /// - public void RemoveLocationByName(string name, int count) - { - GetLocationGroupFor(name).Locations.Remove(name, count); - } - - public bool TryGetLocationRequest(string name, out LocationRequestInfo info) - { - if (LocationRequests.TryGetValue(name, out info)) - { - return true; - } - else - { - foreach (LocationMatchHandler matcher in LocationMatchers) - { - if (matcher(name, out info)) - { - LocationRequests.Add(name, info); - return true; - } - } - } - info = default; - return false; - } - - public void EditLocationRequest(string name, Action edit) - { - if (!LocationRequests.TryGetValue(name, out LocationRequestInfo info)) - { - LocationRequests.Add(name, info = new()); - } - edit(info); - } - - public bool TryGetLocationDef(string name, out LocationDef def) - { - def = TryGetLocationRequest(name, out LocationRequestInfo info) && info.getLocationDef != null - ? info.getLocationDef() - : Data.GetLocationDef(name); - return def is not null; - } - - /// - /// Removes all copies of all items in any item groups for which the predicate returns true. - /// - public void RemoveItemsWhere(Predicate selector) - { - foreach (ItemGroupBuilder gb in EnumerateItemGroups()) - { - if (_set.Count != 0) _set.Clear(); - foreach (string s in gb.Items.EnumerateDistinct()) - { - if (selector(s)) _set.Add(s); - } - foreach (string s in _set) gb.Items.RemoveAll(s); - } - _set.Clear(); - } - - /// - /// Replaces each copy of the named item in each item group with the replacement string. - /// - public void ReplaceItem(string name, string replaceWith) - { - foreach (ItemGroupBuilder gb in EnumerateItemGroups()) - { - gb.Items.Replace(name, replaceWith); - } - } - - public void ReplaceItem(string name, Func> replacer) - { - foreach (ItemGroupBuilder gb in EnumerateItemGroups()) - { - gb.Items.Replace(name, replacer); - } - } - - public void ReplaceItem(Predicate selector, Func> replacer) - { - foreach (ItemGroupBuilder gb in EnumerateItemGroups()) - { - if (_set.Count != 0) _set.Clear(); - - foreach (string s in gb.Items.EnumerateDistinct()) - { - if (selector(s)) _set.Add(s); - } - foreach (string s in _set) - { - int count = gb.Items.GetCount(s); - gb.Items.RemoveAll(s); - gb.Items.AddRange(replacer(s, count)); - } - } - _set.Clear(); - } - - /// - /// Removes all copies of all locations in any item groups for which the predicate returns true. - /// - public void RemoveLocationsWhere(Predicate selector) - { - foreach (ItemGroupBuilder gb in EnumerateItemGroups()) - { - if (_set.Count != 0) _set.Clear(); - foreach (string s in gb.Locations.EnumerateDistinct()) - { - if (selector(s)) _set.Add(s); - } - foreach (string s in _set) gb.Locations.RemoveAll(s); - } - _set.Clear(); - } - - public void ReplaceLocation(string name, string replaceWith) - { - foreach (ItemGroupBuilder gb in EnumerateItemGroups()) - { - gb.Locations.Replace(name, replaceWith); - } - } - - public void ReplaceLocation(string name, Func> replacer) - { - foreach (ItemGroupBuilder gb in EnumerateItemGroups()) - { - gb.Locations.Replace(name, replacer); - } - } - - public void ReplaceLocation(Predicate selector, Func> replacer) - { - foreach (ItemGroupBuilder gb in EnumerateItemGroups()) - { - if (_set.Count != 0) _set.Clear(); - - foreach (string s in gb.Locations.EnumerateDistinct()) - { - if (selector(s)) _set.Add(s); - } - foreach (string s in _set) - { - int count = gb.Locations.GetCount(s); - gb.Locations.RemoveAll(s); - gb.Locations.AddRange(replacer(s, count)); - } - } - _set.Clear(); - } - - public bool TryGetTransitionRequest(string name, out TransitionRequestInfo info) - { - if (TransitionRequests.TryGetValue(name, out info)) - { - return true; - } - else - { - foreach (TransitionMatchHandler matcher in TransitionMatchers) - { - if (matcher(name, out info)) - { - TransitionRequests.Add(name, info); - return true; - } - } - } - info = default; - return false; - } - - public void EditTransitionRequest(string name, Action edit) - { - if (!TransitionRequests.TryGetValue(name, out TransitionRequestInfo info)) - { - TransitionRequests.Add(name, info = new()); - } - edit(info); - } - - public bool TryGetTransitionDef(string name, out TransitionDef def) - { - def = TryGetTransitionRequest(name, out TransitionRequestInfo info) && info.getTransitionDef != null - ? info.getTransitionDef() - : Data.GetTransitionDef(name); - return def is not null; - } - - /// - /// Removes the transition by name from all transition groups. - /// - /// - public void RemoveTransitionByName(string name) - { - foreach (GroupBuilder gb in EnumerateTransitionGroups()) - { - if (gb is TransitionGroupBuilder tgb) - { - tgb.Sources.RemoveAll(name); - tgb.Targets.RemoveAll(name); - } - else if (gb is SymmetricTransitionGroupBuilder stgb) - { - stgb.Group1.RemoveAll(name); - stgb.Group2.RemoveAll(name); - } - else if (gb is SelfDualTransitionGroupBuilder sdtgb) - { - sdtgb.Transitions.RemoveAll(name); - } - } - } - - /// - /// Removes all copies of all transitions in any transition groups where the selector returns true. - /// - public void RemoveTransitionsWhere(Func selector) - { - foreach (GroupBuilder gb in EnumerateTransitionGroups()) - { - if (gb is TransitionGroupBuilder tgb) - { - RemoveFromBucket(tgb.Sources, selector); - RemoveFromBucket(tgb.Targets, selector); - } - else if (gb is SymmetricTransitionGroupBuilder stgb) - { - RemoveFromBucket(stgb.Group1, selector); - RemoveFromBucket(stgb.Group2, selector); - } - else if (gb is SelfDualTransitionGroupBuilder sdtgb) - { - RemoveFromBucket(sdtgb.Transitions, selector); - } - } - } - - /// - /// Identical to RemoveTransitionByName, but if the transition is a source, it is ensured to be in Vanilla with its VanillaTarget. - /// - public void UnrandomizeTransitionByName(string name) - { - RemoveTransitionByName(name); - EnsureVanillaSourceTransition(name); - } - - /// - /// Identical to RemoveTransitionsWhere, but each removed source transition is ensured to be in Vanilla with its VanillaTarget. - /// - public void UnrandomizeTransitionsWhere(Func selector) - { - foreach (GroupBuilder gb in EnumerateTransitionGroups()) - { - if (gb is TransitionGroupBuilder tgb) - { - TakeFromBucket(_set, tgb.Sources, selector); - foreach (string s in _set) EnsureVanillaSourceTransition(s); - _set.Clear(); - RemoveFromBucket(tgb.Targets, selector); - } - else if (gb is SymmetricTransitionGroupBuilder stgb) - { - TakeFromBucket(_set, stgb.Group1, selector); - foreach (string s in _set) EnsureVanillaSourceTransition(s); - _set.Clear(); - TakeFromBucket(_set, stgb.Group2, selector); - foreach (string s in _set) EnsureVanillaSourceTransition(s); - _set.Clear(); - } - else if (gb is SelfDualTransitionGroupBuilder sdtgb) - { - TakeFromBucket(_set, sdtgb.Transitions, selector); - foreach (string s in _set) EnsureVanillaSourceTransition(s); - _set.Clear(); - } - } - } - - public void AddToVanilla(string item, string location) - { - if (!Vanilla.TryGetValue(location, out List defs)) - { - Vanilla.Add(location, defs = new(1)); - } - - defs.Add(new VanillaDef(item, location)); - } - - public void AddToVanilla(VanillaDef def) - { - if (!Vanilla.TryGetValue(def.Location, out List defs)) - { - Vanilla.Add(def.Location, defs = new(1)); - } - - defs.Add(def); - } - - /// - /// Ensures that the Vanilla bucket contains the placement of the transition's VanillaTarget at the transition. - ///
Has no effect on a transition without a VanillaTarget, such as a OneWayOut transition. - ///
Only ensures one side of a coupled transition is vanilla. - ///
- public void EnsureVanillaSourceTransition(string source) - { - if (TryGetTransitionDef(source, out TransitionDef def) && def?.VanillaTarget is string target) - { - if (!Vanilla.TryGetValue(source, out List defs)) - { - Vanilla.Add(source, defs = new(1)); - } - - if (defs.Count == 0) - { - defs.Add(new VanillaDef(target, source)); - } - } - } - - /// - /// Removes all vanilla placements for the specified location or source transition. - /// - public void RemoveFromVanilla(string location) - { - Vanilla.Remove(location); - } - - /// - /// Removes all vanilla placements for the specified location or source transition, matching the specified item or target transition. - /// - public void RemoveFromVanilla(string location, string item) - { - if (Vanilla.TryGetValue(location, out List defs)) - { - defs.RemoveAll(def => def.Item == item); - } - } - - /// - /// Removes all vanilla placements matching the defined location, item, and cost list (compared sequentially). - /// - public void RemoveFromVanilla(VanillaDef def) - { - if (Vanilla.TryGetValue(def.Location, out List defs)) - { - defs.RemoveAll(def1 => def1.Equals(def)); - } - } - - public void AddToStart(string item) - { - StartItems.Add(item); - } - - public void AddToStart(string item, int count) - { - StartItems.Increment(item, count); - } - - public void RemoveFromStart(string item) - { - StartItems.RemoveAll(item); - } - - public bool IsAtStart(string item) - { - return StartItems.GetCount(item) > 0; - } - - public void AddToPreplaced(string item, string location) - { - if (!Preplaced.TryGetValue(location, out List defs)) - { - Preplaced.Add(location, defs = new(1)); - } - - defs.Add(new VanillaDef(item, location)); - } - - public void AddToPreplaced(VanillaDef def) - { - if (!Preplaced.TryGetValue(def.Location, out List defs)) - { - Preplaced.Add(def.Location, defs = new(1)); - } - - defs.Add(def); - } - - /// - /// Removes all preplaced placements for the specified location or source transition. - /// - public void RemoveFromPreplaced(string location) - { - Preplaced.Remove(location); - } - - /// - /// Removes all preplaced placements for the specified location or source transition, matching the specified item or target transition. - /// - public void RemoveFromPreplaced(string location, string item) - { - if (Preplaced.TryGetValue(location, out List defs)) - { - defs.RemoveAll(def => def.Item == item); - } - } - - /// - /// Removes all preplaced placements matching the defined location, item, and cost list (compared sequentially). - /// - public void RemoveFromPreplaced(VanillaDef def) - { - if (Preplaced.TryGetValue(def.Location, out List defs)) - { - defs.RemoveAll(def1 => def1.Equals(def)); - } - } - - private void RemoveFromBucket(Bucket bucket, Func selector) - { - _set.Clear(); - _set.AddRange(bucket.EnumerateDistinct().Where(selector)); - foreach (string s in _set) bucket.RemoveAll(s); - _set.Clear(); - } - - // adds the distinct matches to result, and removes them from the bucket. - private void TakeFromBucket(List result, Bucket bucket, Func selector) - { - result.Clear(); - result.AddRange(bucket.EnumerateDistinct().Where(selector)); - foreach (string s in result) bucket.RemoveAll(s); - } - - public delegate bool GroupResolver(RequestBuilder rb, string item, ElementType type, out GroupBuilder gb); - public readonly PriorityEvent OnGetGroupFor; - private readonly PriorityEvent.IPriorityEventOwner _onGetGroupForOwner; - - public delegate bool StartResolver(Random rng, GenerationSettings gs, SettingsPM pm, out StartDef def); - public static readonly PriorityEvent OnSelectStart = new(out _onSelectStartOwner); - private static readonly PriorityEvent.IPriorityEventOwner _onSelectStartOwner; - - protected StartDef SelectStart() - { - StartDef def = null; - foreach (StartResolver d in _onSelectStartOwner.GetSubscribers()) - { - if (d(rng, gs, pm, out def)) - { - break; - } - } - - return def; - } - - public delegate bool CostConverter(LogicCost logicCost, out Cost cost); - public readonly PriorityEvent CostConverters; - private readonly PriorityEvent.IPriorityEventOwner _costConvertersOwner; - - public bool TryConvertCost(LogicCost logicCost, out Cost cost) - { - foreach (CostConverter d in _costConvertersOwner.GetSubscribers()) - { - if (d(logicCost, out cost)) return true; - } - cost = null; - return false; - } - - public delegate void RequestBuilderUpdateHandler(RequestBuilder rb); - public static readonly PriorityEvent OnUpdate = new(out _onUpdateOwner); - private static readonly PriorityEvent.IPriorityEventOwner _onUpdateOwner; - - protected void HandleUpdateEvents() - { - foreach (var d in _onUpdateOwner?.GetSubscribers()) - { - d?.Invoke(this); - } - } - - static RequestBuilder() - { - BuiltinRequests.ApplyAll(); - } - } -} diff --git a/RandomizerMod/RC/Requests/SelfDualTransitionGroupBuilder.cs b/RandomizerMod/RC/Requests/SelfDualTransitionGroupBuilder.cs deleted file mode 100644 index 0a8bfce..0000000 --- a/RandomizerMod/RC/Requests/SelfDualTransitionGroupBuilder.cs +++ /dev/null @@ -1,47 +0,0 @@ -using RandomizerCore; -using RandomizerCore.Randomization; - -namespace RandomizerMod.RC -{ - public class SelfDualTransitionGroupBuilder : GroupBuilder - { - public bool coupled; - public readonly Bucket Transitions = new(); - - public override void Apply(List groups, RandoFactory factory) - { - List ts = new(); - foreach (string s in Transitions.EnumerateWithMultiplicity()) - { - ts.Add(factory.MakeTransition(s)); - } - - if (coupled) - { - CoupledRandomizationGroup g = new() - { - Items = ts.ToArray(), - Locations = ts.ToArray(), - Label = label, - Strategy = strategy ?? factory.gs.ProgressionDepthSettings.GetTransitionPlacementStrategy(), - Validator = new WeakTransitionValidator(), - }; - g.Dual = g; - groups.Add(g); - OnCreateGroup?.Invoke(g); - } - else - { - RandomizationGroup g = new() - { - Items = ts.ToArray(), - Locations = ts.ToArray(), - Label = label, - Strategy = strategy ?? factory.gs.ProgressionDepthSettings.GetTransitionPlacementStrategy(), - }; - groups.Add(g); - OnCreateGroup?.Invoke(g); - } - } - } -} diff --git a/RandomizerMod/RC/Requests/StageBuilder.cs b/RandomizerMod/RC/Requests/StageBuilder.cs deleted file mode 100644 index 363e40d..0000000 --- a/RandomizerMod/RC/Requests/StageBuilder.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.ObjectModel; -using RandomizerCore.Randomization; - -namespace RandomizerMod.RC -{ - public class StageBuilder - { - public readonly string label; - public StagePlacementStrategy strategy; - private readonly Dictionary groupLookup; - private readonly List groups; - public readonly ReadOnlyCollection Groups; - - public StageBuilder(string label) - { - this.label = label; - this.groupLookup = new(); - this.groups = new(); - this.Groups = new(groups); - } - - public void Add(GroupBuilder gb) - { - if (gb == null) throw new ArgumentNullException(nameof(gb)); - if (gb.label == null || groupLookup.ContainsKey(gb.label)) throw new ArgumentException(nameof(gb)); - gb.stageLabel = label; - groups.Add(gb); - groupLookup.Add(gb.label, gb); - } - - public void Insert(int index, GroupBuilder gb) - { - if (gb == null) throw new ArgumentNullException(nameof(gb)); - if (gb.label == null || groupLookup.ContainsKey(gb.label)) throw new ArgumentException(nameof(gb)); - gb.stageLabel = label; - groups.Insert(index, gb); - groupLookup.Add(gb.label, gb); - } - - public ItemGroupBuilder AddItemGroup(string group) - { - return InsertItemGroup(group, groups.Count); - } - - public ItemGroupBuilder InsertItemGroup(string group, int index) - { - if (groupLookup.ContainsKey(group)) throw new ArgumentException(nameof(group)); - - ItemGroupBuilder gb = new() - { - label = group, - stageLabel = label, - }; - - groups.Insert(index, gb); - groupLookup.Add(group, gb); - return gb; - } - - public bool TryGetGroup(string group, out GroupBuilder gb) - { - return groupLookup.TryGetValue(group, out gb); - } - - public GroupBuilder Get(string group) - { - return groupLookup[group]; - } - - public RandomizationStage ToRandomizationStage(RandoFactory factory) - { - List rgs = new(); - foreach (GroupBuilder gb in groupLookup.Values) - { - gb.Apply(rgs, factory); - } - - return new RandomizationStage - { - label = label, - groups = rgs.ToArray(), - strategy = strategy ?? new StagePlacementStrategy(), - }; - } - } -} diff --git a/RandomizerMod/RC/Requests/SymmetricTransitionGroupBuilder.cs b/RandomizerMod/RC/Requests/SymmetricTransitionGroupBuilder.cs deleted file mode 100644 index e950ff2..0000000 --- a/RandomizerMod/RC/Requests/SymmetricTransitionGroupBuilder.cs +++ /dev/null @@ -1,82 +0,0 @@ -using RandomizerCore; -using RandomizerCore.Randomization; - -namespace RandomizerMod.RC -{ - public class SymmetricTransitionGroupBuilder : GroupBuilder - { - public readonly Bucket Group1 = new(); - public readonly Bucket Group2 = new(); - public bool coupled; - public string reverseLabel; - - public override void Apply(List groups, RandoFactory factory) - { - if (Group1.GetTotal() != Group2.GetTotal()) - { - throw new InvalidOperationException($"Failed to build group {label} due to unbalanced counts."); - } - - List t1s = new(); - foreach (string s in Group1.EnumerateWithMultiplicity()) - { - t1s.Add(factory.MakeTransition(s)); - } - - List t2s = new(); - foreach (string s in Group2.EnumerateWithMultiplicity()) - { - t2s.Add(factory.MakeTransition(s)); - } - - if (coupled) - { - CoupledRandomizationGroup g1 = new() - { - Items = t1s.ToArray(), - Locations = t2s.ToArray(), - Label = label, - Strategy = strategy ?? factory.gs.ProgressionDepthSettings.GetTransitionPlacementStrategy(), - Validator = new WeakTransitionValidator(), - }; - CoupledRandomizationGroup g2 = new() - { - Items = t2s.ToArray(), - Locations = t1s.ToArray(), - Label = reverseLabel, - Strategy = strategy?.Clone() ?? factory.gs.ProgressionDepthSettings.GetTransitionPlacementStrategy(), - Validator = new WeakTransitionValidator(), - }; - g1.Dual = g2; - g2.Dual = g1; - - groups.Add(g1); - groups.Add(g2); - OnCreateGroup?.Invoke(g1); - OnCreateGroup?.Invoke(g2); - } - else - { - RandomizationGroup g1 = new() - { - Items = t1s.ToArray(), - Locations = t2s.ToArray(), - Label = label, - Strategy = strategy ?? factory.gs.ProgressionDepthSettings.GetTransitionPlacementStrategy(), - }; - RandomizationGroup g2 = new() - { - Items = t2s.ToArray(), - Locations = t1s.ToArray(), - Label = reverseLabel, - Strategy = strategy?.Clone() ?? factory.gs.ProgressionDepthSettings.GetTransitionPlacementStrategy(), - }; - - groups.Add(g1); - groups.Add(g2); - OnCreateGroup?.Invoke(g1); - OnCreateGroup?.Invoke(g2); - } - } - } -} diff --git a/RandomizerMod/RC/Requests/TransitionGroupBuilder.cs b/RandomizerMod/RC/Requests/TransitionGroupBuilder.cs deleted file mode 100644 index c07a824..0000000 --- a/RandomizerMod/RC/Requests/TransitionGroupBuilder.cs +++ /dev/null @@ -1,41 +0,0 @@ -using RandomizerCore; -using RandomizerCore.Randomization; - -namespace RandomizerMod.RC -{ - public class TransitionGroupBuilder : GroupBuilder - { - public Bucket Sources { get; } = new(); - public Bucket Targets { get; } = new(); - - public override void Apply(List groups, RandoFactory factory) - { - if (Sources.GetTotal() != Targets.GetTotal()) - { - throw new InvalidOperationException($"Failed to build group {label} due to unbalanced counts."); - } - - List locations = new(); - foreach (string s in Sources.EnumerateWithMultiplicity()) - { - locations.Add(factory.MakeTransition(s)); - } - - List items = new(); - foreach (string s in Targets.EnumerateWithMultiplicity()) - { - items.Add(factory.MakeTransition(s)); - } - - RandomizationGroup g = new() - { - Label = label, - Items = items.ToArray(), - Locations = locations.ToArray(), - Strategy = strategy ?? factory.gs.ProgressionDepthSettings.GetTransitionPlacementStrategy(), - }; - groups.Add(g); - OnCreateGroup?.Invoke(g); - } - } -} diff --git a/RandomizerMod/RC/Requests/TransitionRequestInfo.cs b/RandomizerMod/RC/Requests/TransitionRequestInfo.cs deleted file mode 100644 index 65c6aa1..0000000 --- a/RandomizerMod/RC/Requests/TransitionRequestInfo.cs +++ /dev/null @@ -1,45 +0,0 @@ -using ItemChanger; -using RandomizerCore; -using RandomizerMod.RandomizerData; - -namespace RandomizerMod.RC -{ - public class TransitionRequestInfo - { - public Func? randoTransitionCreator; - public Action? onRandoTransitionCreation; - public Action? onRandomizerFinish; - public Func? realTargetCreator; - public Func realSourceCreator; - public Func? getTransitionDef; - - public void AddGetTransitionDefModifier(string name, Func modifier) - { - Func get = getTransitionDef ?? (() => Data.GetTransitionDef(name)); - getTransitionDef = () => modifier(get()); - } - - public TransitionRequestInfo Clone() - { - return new TransitionRequestInfo - { - randoTransitionCreator = (Func)randoTransitionCreator?.Clone(), - onRandoTransitionCreation = (Action)onRandoTransitionCreation?.Clone(), - onRandomizerFinish = (Action)onRandomizerFinish?.Clone(), - realTargetCreator = (Func)realTargetCreator?.Clone(), - realSourceCreator = (Func)realSourceCreator?.Clone(), - getTransitionDef = (Func)getTransitionDef?.Clone() - }; - } - - public void AppendTo(TransitionRequestInfo info) - { - if (randoTransitionCreator != null) info.randoTransitionCreator = randoTransitionCreator; - info.onRandoTransitionCreation += onRandoTransitionCreation; - info.onRandomizerFinish += onRandomizerFinish; - if (realTargetCreator != null) info.realTargetCreator = realTargetCreator; - if (realSourceCreator != null) info.realSourceCreator = realSourceCreator; - if (getTransitionDef != null) info.getTransitionDef = getTransitionDef; - } - } -} diff --git a/RandomizerMod/RC/SplitCloakItem.cs b/RandomizerMod/RC/SplitCloakItem.cs deleted file mode 100644 index 1557b68..0000000 --- a/RandomizerMod/RC/SplitCloakItem.cs +++ /dev/null @@ -1,76 +0,0 @@ -using RandomizerCore; -using RandomizerCore.Logic; - -namespace RandomizerMod.RC -{ - [Obsolete("Use StringItem for split cloak items")] - public record SplitCloakItem(string Name, bool LeftBiased, Term LeftDashTerm, Term RightDashTerm) : LogicItem(Name) - { - public override void AddTo(ProgressionManager pm) - { - /* - // behavior when left and right must be obtained before shade cloak - bool noLeftDash = pm.Get(LeftDashTerm.Id) < 1; - bool noRightDash = pm.Get(RightDashTerm.Id) < 1; - // Left Dash behavior - if (noLeftDash && (LeftBiased || !noRightDash)) pm.Incr(LeftDashTerm.Id, 1); - // Right Dash behavior - else if (noRightDash && (!LeftBiased || !noLeftDash)) pm.Incr(RightDashTerm.Id, 1); - // Shade Cloak behavior (increments both flags) - else - { - pm.Incr(LeftDashTerm.Id, 1); - pm.Incr(RightDashTerm.Id, 1); - } - */ - - // behavior when split shade cloak of one direction can be obtained, but not the other - bool hasLeftDash = pm.Has(LeftDashTerm.Id); - bool hasRightDash = pm.Has(RightDashTerm.Id); - bool hasAnyShadowDash = pm.Has(LeftDashTerm.Id, 2) || pm.Has(RightDashTerm.Id, 2); - - if (hasLeftDash && hasRightDash && hasAnyShadowDash) - { - return; // dupe - } - else if (hasLeftDash && hasRightDash) // full shade cloak behavior - { - pm.Incr(LeftDashTerm, 1); - pm.Incr(RightDashTerm, 1); - return; - } - else if (LeftBiased) - { - if (!hasLeftDash && hasAnyShadowDash) // left shade cloak behavior - { - pm.Incr(LeftDashTerm, 2); - return; - } - else // left cloak behavior - { - pm.Incr(LeftDashTerm, 1); - return; - } - } - else - { - if (!hasRightDash && hasAnyShadowDash) // right shade cloak behavior - { - pm.Incr(RightDashTerm, 2); - return; - } - else // right cloak behavior - { - pm.Incr(RightDashTerm, 1); - return; - } - } - } - - public override IEnumerable GetAffectedTerms() - { - yield return LeftDashTerm; - yield return RightDashTerm; - } - } -} diff --git a/RandomizerMod/RC/StateVariables/BenchResetVariable.cs b/RandomizerMod/RC/StateVariables/BenchResetVariable.cs deleted file mode 100644 index f08c11b..0000000 --- a/RandomizerMod/RC/StateVariables/BenchResetVariable.cs +++ /dev/null @@ -1,88 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerMod.RC.StateVariables -{ - /* - * Prefix: $BENCHRESET - * Required Parameters: none - * Optional Parameters: none - * Provides the effect of resting at a bench. Does not consider warping, etc. - */ - public class BenchResetVariable : StateModifier - { - public override string Name { get; } - protected readonly List CharmBools; - protected readonly List AnticharmBools; - protected readonly StateBool NoPassedCharmEquip; - protected readonly StateBool UsedShade; - protected readonly StateInt RequiredMaxSoul; - // technically, MaxRequiredSoul should be reset at the start of the path leading to where a soul limit is applied. Since currently the only consumer is ShadeStateVariable, paths start at benches. - // we don't reset SoulLimiter, since the only current consumer is ShadeStateVariable, which sets and resets it already (and there is no natural reason to think benches should reset this) - protected readonly ISoulStateManager SSM; - protected readonly IHPStateManager HPSM; - protected readonly Term SalubrasBlessing; - - public const string Prefix = "$BENCHRESET"; - - public BenchResetVariable(string name, LogicManager lm) - { - Name = name; - try - { - CharmBools = lm.StateManager.Bools.Where(sb => sb.Name.StartsWith("CHARM")).ToList(); - AnticharmBools = lm.StateManager.Bools.Where(sb => sb.Name.StartsWith("noCHARM")).ToList(); - NoPassedCharmEquip = lm.StateManager.GetBoolStrict("NOPASSEDCHARMEQUIP"); - UsedShade = lm.StateManager.GetBoolStrict("USEDSHADE"); - RequiredMaxSoul = lm.StateManager.GetIntStrict("REQUIREDMAXSOUL"); - SSM = (ISoulStateManager)lm.GetVariableStrict(SoulStateManager.Prefix); - HPSM = (IHPStateManager)lm.GetVariableStrict(HPStateManager.Prefix); - SalubrasBlessing = lm.GetTermStrict("Salubra's_Blessing"); - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing BenchResetVariable", e); - } - } - - public override IEnumerable GetTerms() - { - // TODO: enum version of GetTerms - foreach (Term t in SSM.GetTerms(ISoulStateManager.SSMOperation.RestoreSoul)) yield return t; - foreach (Term t in HPSM.GetTerms(IHPStateManager.HPSMOperation.RestoreAllHealth)) yield return t; - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (VariableResolver.TryMatchPrefix(term, Prefix, out string[] parameters)) - { - variable = new BenchResetVariable(term, lm); - return true; - } - variable = default; - return false; - } - - public override IEnumerable? ProvideState(object? sender, ProgressionManager pm) - { - return []; - } - - public override IEnumerable ModifyState(object? sender, ProgressionManager pm, LazyStateBuilder state) - { - foreach (StateBool sb in CharmBools) - { - state.SetBool(sb, false); - } - foreach (StateBool sb in AnticharmBools) - { - state.SetBool(sb, false); - } - if (pm.Has(SalubrasBlessing)) SSM.TryRestoreAllSoul(pm, ref state, true); - state.SetInt(RequiredMaxSoul, 0); - state.SetBool(NoPassedCharmEquip, false); - state.SetBool(UsedShade, false); - return HPSM.RestoreAllHealth(pm, state); - } - } -} diff --git a/RandomizerMod/RC/StateVariables/CastSpellVariable.cs b/RandomizerMod/RC/StateVariables/CastSpellVariable.cs deleted file mode 100644 index 79ad567..0000000 --- a/RandomizerMod/RC/StateVariables/CastSpellVariable.cs +++ /dev/null @@ -1,191 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerMod.RC.StateVariables -{ - /* - * Prefix: $CASTSPELL - * Required Parameters: none - * Optional Parameters: - * - any integer parameters: parses to an array of ints, which represent number of spell casts, where time passes between different entries of the array (i.e. soul reserves can refill, etc). - * If missing, number of casts is new int[]{1} - * - a parameter beginning with "before:": tries to convert the tail of the parameter to the NearbySoul enum (either by string or int parsing). Represents soul available before any spells are cast. - * - a parameter beginning with "after:": tries to convert the tail of the parameter to the NearbySoul enum (either by string or int parsing). Represents soul available after all spells are cast. - */ - public class CastSpellVariable : StateModifier - { - public enum NearbySoul - { - NONE, - ITEMSOUL, - MAPAREASOUL, - AREASOUL, - ROOMSOUL, - } - - public override string Name { get; } - public readonly int[] SpellCasts; - protected readonly NearbySoul BeforeSoul; - protected readonly NearbySoul AfterSoul; - protected readonly ISoulStateManager SSM; - protected readonly Term ItemRando; - protected readonly Term MapAreaRando; - protected readonly Term AreaRando; - protected readonly Term RoomRando; - protected readonly EquipCharmVariable EquipSpellTwister; - public const string Prefix = "$CASTSPELL"; - - public CastSpellVariable(string name, LogicManager lm, int[] spellCasts, bool canDreamgate, NearbySoul beforeSoul, NearbySoul afterSoul) - { - Name = name; - this.SpellCasts = spellCasts; - this.BeforeSoul = beforeSoul; - this.AfterSoul = afterSoul; - try - { - SSM = (ISoulStateManager)lm.GetVariableStrict(SoulStateManager.Prefix); - ItemRando = lm.GetTermStrict("ITEMRANDO"); - MapAreaRando = lm.GetTermStrict("MAPAREARANDO"); - AreaRando = lm.GetTermStrict("FULLAREARANDO"); - RoomRando = lm.GetTermStrict("ROOMRANDO"); - EquipSpellTwister = (EquipCharmVariable)lm.GetVariableStrict(EquipCharmVariable.GetName("Spell_Twister")); - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing CastSpellVariable", e); - } - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (VariableResolver.TryMatchPrefix(term, Prefix, out string[] parameters)) - { - List spellCasts = new(); - bool canDreamgate = true; - NearbySoul beforeSoul = NearbySoul.NONE; - NearbySoul afterSoul = NearbySoul.NONE; - for (int i = 0; i < parameters.Length; i++) - { - if (int.TryParse(parameters[i], out int castNum)) spellCasts.Add(castNum); - else if (parameters[i] == "noDG") canDreamgate = false; - else if (parameters[i].StartsWith("before:")) - { - string arg = parameters[i].Substring(7); - if (!Enum.TryParse(arg, out beforeSoul)) - { - if (int.TryParse(arg, out int k)) beforeSoul = (NearbySoul)k; - else throw new ArgumentException($"Could not parse {parameters[i]} to CastSpellVariable argument."); - } - } - else if (parameters[i].StartsWith("after:")) - { - string arg = parameters[i].Substring(6); - if (!Enum.TryParse(arg, out afterSoul)) - { - if (int.TryParse(arg, out int k)) afterSoul = (NearbySoul)k; - else throw new ArgumentException($"Could not parse {parameters[i]} to CastSpellVariable argument."); - } - } - else throw new ArgumentException($"Could not parse {parameters[i]} to CastSpellVariable argument."); - } - if (spellCasts.Count == 0) spellCasts.Add(1); - variable = new CastSpellVariable(term, lm, spellCasts.ToArray(), canDreamgate, beforeSoul, afterSoul); - return true; - } - variable = default; - return false; - } - - public override IEnumerable GetTerms() - { - yield return ItemRando; - yield return MapAreaRando; - yield return AreaRando; - yield return RoomRando; - foreach (Term t in EquipSpellTwister.GetTerms()) yield return t; - foreach (Term t in SSM.GetTerms(ISoulStateManager.SSMOperation.SpendSoul)) yield return t; - } - - /// - /// Applies the cast spell transformation without accounting for potential dream gate resets before and after. - /// - public override IEnumerable ModifyState(object? sender, ProgressionManager pm, LazyStateBuilder state) - { - if (NearbySoulToBool(BeforeSoul, pm)) - { - SSM.TryRestoreAllSoul(pm, ref state, restoreReserves: true); - } - - if (!EquipSpellTwister.IsDetermined(state)) - { - if (EquipSpellTwister.TryEquip(sender, pm, in state, out LazyStateBuilder STstate)) - { - EquipSpellTwister.SetUnequippable(ref state); - if (TryCast(pm, ref STstate, 24)) - { - yield return STstate; - if (TryCast(pm, ref state, 33)) yield return state; - yield break; - } - else - { - yield break; // 24 failed, so 33 will also fail - } - } - else - { - EquipSpellTwister.SetUnequippable(ref state); - if (TryCast(pm, ref state, 33)) yield return state; - yield break; - } - } - else - { - if (EquipSpellTwister.IsEquipped(state)) - { - if (TryCast(pm, ref state, 24)) yield return state; - yield break; - } - else - { - if (TryCast(pm, ref state, 33)) yield return state; - yield break; - } - } - } - - - - public bool TryCast(ProgressionManager pm, ref LazyStateBuilder state, int amountPerCast) - { - if (!SSM.TrySpendSoulSequence(pm, ref state, amountPerCast, SpellCasts)) - { - return false; - } - if (NearbySoulToBool(AfterSoul, pm)) - { - SSM.TryRestoreSoul(pm, ref state, SpellCasts.Sum() * 33); // recover the same amount of soul in all paths to respect the state ordering - } - return true; - } - - private bool NearbySoulToBool(NearbySoul soul, ProgressionManager pm) - { - if (soul > NearbySoul.NONE && soul <= NearbySoul.ROOMSOUL) - { - NearbySoul mode = GetMode(pm); - return mode > NearbySoul.NONE && mode <= soul; - } - return false; - } - - private NearbySoul GetMode(ProgressionManager pm) - { - if (pm.Has(RoomRando)) return NearbySoul.ROOMSOUL; - else if (pm.Has(AreaRando)) return NearbySoul.AREASOUL; - else if (pm.Has(MapAreaRando)) return NearbySoul.MAPAREASOUL; - else if (pm.Has(ItemRando)) return NearbySoul.ITEMSOUL; - else return NearbySoul.NONE; - } - } -} diff --git a/RandomizerMod/RC/StateVariables/EquipCharmVariable.cs b/RandomizerMod/RC/StateVariables/EquipCharmVariable.cs deleted file mode 100644 index a44735b..0000000 --- a/RandomizerMod/RC/StateVariables/EquipCharmVariable.cs +++ /dev/null @@ -1,340 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerMod.RC.StateVariables -{ - /* - * Prefix: $EQUIPPEDCHARM - * Required Parameters: - * - First parameter MUST be either: the name of the charm term (e.g. Gathering_Swarm) or the 1-based charm ID (for Gathering Swarm, 1). - * Optional Parameters: none - */ - public class EquipCharmVariable : StateModifier - { - public override string Name { get; } - protected int CharmID; - protected Term CharmTerm; - protected readonly StateBool Overcharmed; - protected readonly StateBool CannotOvercharm; - - protected readonly StateBool NoPassedCharmEquip; - protected readonly Term NotchesTerm; - protected readonly StateBool CharmBool; - protected readonly StateBool AnticharmBool; - protected readonly StateInt UsedNotchesInt; - protected readonly StateInt MaxNotchCost; - - public const string Prefix = "$EQUIPPEDCHARM"; - - protected EquipCharmVariable(string name, LogicManager lm) - { - Name = name; - try - { - NotchesTerm = lm.GetTermStrict("NOTCHES"); - NoPassedCharmEquip = lm.StateManager.GetBoolStrict("NOPASSEDCHARMEQUIP"); - Overcharmed = lm.StateManager.GetBoolStrict("OVERCHARMED"); - CannotOvercharm = lm.StateManager.GetBoolStrict("CANNOTOVERCHARM"); - UsedNotchesInt = lm.StateManager.GetIntStrict("USEDNOTCHES"); - MaxNotchCost = lm.StateManager.GetIntStrict("MAXNOTCHCOST"); - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing EquipCharmVariable", e); - } - } - - public EquipCharmVariable(string name, string charmName, int charmID, LogicManager lm) : this(name, lm) - { - this.CharmID = charmID; - try - { - CharmTerm = lm.GetTermStrict(charmName); - CharmBool = lm.StateManager.GetBoolStrict("CHARM" + charmID); - AnticharmBool = lm.StateManager.GetBoolStrict("noCHARM" + charmID); - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing EquipCharmVariable", e); - } - } - - public static string GetName(string charmTermName) - { - return $"{Prefix}[{charmTermName}]"; - } - - public static string GetName(int charmID) - { - return $"{Prefix}[{charmID}]"; - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (VariableResolver.TryMatchPrefix(term, Prefix, out string[] parameters)) - { - int charmID; - string charmName; - - if (!int.TryParse(parameters[0], out charmID)) - { - charmID = LogicConstUtil.GetCharmID(charmName = parameters[0]); - } - else - { - charmName = LogicConstUtil.GetCharmTerm(charmID); - } - - EquipCharmVariable ecv; - if (23 <= charmID && charmID <= 25) - { - ecv = new FragileCharmVariable(term, charmName, charmID, lm); - } - else if (charmID == 36) - { - ecv = new WhiteFragmentEquipVariable(term, charmName, lm); - } - else - { - ecv = new EquipCharmVariable(term, charmName, charmID, lm); - } - - variable = ecv; - return true; - } - variable = default; - return false; - } - - - public override IEnumerable GetTerms() - { - yield return CharmTerm; - yield return NotchesTerm; - } - - public enum EquipResult - { - None, - Overcharm, - Nonovercharm - } - - public virtual int GetNotchCost(ProgressionManager pm, T state) where T : IState - { - return ((RandoModContext)pm.ctx).notchCosts[CharmID - 1]; - } - - public virtual bool HasCharmProgression(ProgressionManager pm) => pm.Has(CharmTerm); - - /// - /// Given that pm.HasCharmProgression returned true, this should determine whether the particular state supports equipping the charm, ignoring notch cost. - /// - public virtual bool HasStateRequirements(ProgressionManager pm, T state) where T : IState - { - if (state.GetBool(NoPassedCharmEquip) || state.GetBool(AnticharmBool)) return false; - return true; - } - - /// - /// Determines whether the charm can be equipped with or without overcharming for the given state. Does not check progression or state requirements. - /// - public EquipResult HasNotchRequirements(ProgressionManager pm, T state) where T : IState - { - if (IsEquipped(state)) - { - return state.GetBool(Overcharmed) ? EquipResult.Overcharm : EquipResult.Nonovercharm; // Already equipped - } - - int notchCost = GetNotchCost(pm, state); - - if (notchCost <= 0) - { - return state.GetBool(Overcharmed) ? EquipResult.Overcharm : EquipResult.Nonovercharm; // free to equip - } - - int netNotches = pm.Get(NotchesTerm) - state.GetInt(UsedNotchesInt) - notchCost; - - if (netNotches >= 0) - { - return EquipResult.Nonovercharm; - } - - int overcharmSave = Math.Max(state.GetInt(MaxNotchCost), notchCost); - - if (netNotches + overcharmSave > 0 && !state.GetBool(CannotOvercharm)) - { - return EquipResult.Overcharm; // charm is not 0 notches, so it requires an open notch to overcharm - } - - return EquipResult.None; - } - - public bool CanEquipNonovercharm(ProgressionManager pm, T state) where T : IState - { - return HasCharmProgression(pm) && HasStateRequirements(pm, state) && HasNotchRequirements(pm, state) == EquipResult.Nonovercharm; - } - - public bool CanEquipOvercharm(ProgressionManager pm, T state) where T : IState - { - return HasCharmProgression(pm) && HasStateRequirements(pm, state) && HasNotchRequirements(pm, state) != EquipResult.None; - } - - public EquipResult CanEquip(ProgressionManager pm, StateUnion? localState) - { - if (localState is null || !HasCharmProgression(pm)) return EquipResult.None; - bool overcharm = false; - for (int i = 0; i < localState.Count; i++) - { - if (!HasStateRequirements(pm, localState[i])) continue; - switch (HasNotchRequirements(pm, localState[i])) - { - case EquipResult.None: continue; - case EquipResult.Overcharm: overcharm = true; continue; - case EquipResult.Nonovercharm: return EquipResult.Nonovercharm; - } - } - - return overcharm ? EquipResult.Overcharm : EquipResult.None; - } - - /// - /// Checks whether the charm can be equipped. Does not modify the state--for that, use . - /// - public EquipResult CanEquip(ProgressionManager pm, T state) where T : IState - { - if (!HasCharmProgression(pm) || !HasStateRequirements(pm, state)) return EquipResult.None; - return HasNotchRequirements(pm, state); - } - - public override IEnumerable ModifyState(object? sender, ProgressionManager pm, LazyStateBuilder state) - { - if (TryEquip(sender, pm, ref state)) yield return state; - } - - public bool TryEquip(object? sender, ProgressionManager pm, ref LazyStateBuilder state) - { - if (IsEquipped(state)) - { - return true; - } - - if (CanEquip(pm, state) != EquipResult.None) - { - DoEquipCharm(pm, GetNotchCost(pm, state), ref state); - return true; - } - return false; - } - - public bool TryEquip(object? sender, ProgressionManager pm, in LazyStateBuilder state, out LazyStateBuilder newState) - { - if (IsEquipped(state)) - { - return true; - } - - if (CanEquip(pm, state) != EquipResult.None) - { - newState = new(state); - DoEquipCharm(pm, GetNotchCost(pm, state), ref newState); - return true; - } - return false; - } - - protected virtual void DoEquipCharm(ProgressionManager pm, int notchCost, ref LazyStateBuilder state) - { - state.Increment(UsedNotchesInt, notchCost); - state.SetBool(CharmBool, true); - state.SetInt(MaxNotchCost, Math.Max(state.GetInt(MaxNotchCost), notchCost)); - if (state.GetInt(UsedNotchesInt) > pm.Get(NotchesTerm)) state.SetBool(Overcharmed, true); - } - - public bool IsEquipped(LazyStateBuilder state) => state.GetBool(CharmBool); - public bool IsEquipped(T state) where T : IState => state.GetBool(CharmBool); - public void SetUnequippable(ref LazyStateBuilder state) => state.SetBool(AnticharmBool, true); - public bool IsDetermined(T state) where T : IState => state.GetBool(CharmBool) || state.GetBool(AnticharmBool); - public int GetAvailableNotches(ProgressionManager pm, LazyStateBuilder state) - { - return pm.Get(NotchesTerm) - state.GetInt(UsedNotchesInt); - } - - public IEnumerable DecideCharm(ProgressionManager pm, LazyStateBuilder state) - { - if (IsDetermined(state)) - { - yield return state; - yield break; - } - else - { - LazyStateBuilder lsb = new(state); - SetUnequippable(ref lsb); - yield return lsb; - if (TryEquip(null, pm, ref state)) - { - yield return state; - } - } - } - - /// - /// Enumerates states for all equippable subsets of the provided set of charms. - ///
Guarantees that returns true for all provided ECVs on all output states. - ///
- /// Thrown if length of charm list is greater than 30. - public static IEnumerable GenerateCharmCombinations(ProgressionManager pm, LazyStateBuilder state, IEnumerable charmList) - { - List charms = []; - foreach (EquipCharmVariable c in charmList) - { - if (!c.IsDetermined(state)) - { - if (!c.HasCharmProgression(pm) || !c.HasStateRequirements(pm, state) || c.HasNotchRequirements(pm, state) == EquipResult.None) - { - c.SetUnequippable(ref state); - } - else - { - charms.Add(c); - } - } - } - - int len = charms.Count; - if (len == 0) - { - yield return state; - yield break; - } - else if (len > 30) - { - throw new ArgumentOutOfRangeException(nameof(charmList)); - } - - int p = 1 << len; - for (int i = 0; i < p; i++) - { - LazyStateBuilder next = new(state); - for (int j = 0; j < len; j++) - { - int f = 1 << j; - if ((i & f) == f) // equip - { - if (!charms[j].TryEquip(null, pm, ref next)) // should only fail due to out of notches - { - goto end_of_outer_loop; - } - } - else // do not equip - { - charms[j].SetUnequippable(ref next); - } - } - yield return next; - end_of_outer_loop: continue; // failed to equip requested charms, so we discard next. - } - } - } -} diff --git a/RandomizerMod/RC/StateVariables/FlowerProviderVariable.cs b/RandomizerMod/RC/StateVariables/FlowerProviderVariable.cs deleted file mode 100644 index 2eccc79..0000000 --- a/RandomizerMod/RC/StateVariables/FlowerProviderVariable.cs +++ /dev/null @@ -1,62 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerMod.RC.StateVariables -{ - /* - * Prefix: $FLOWERGET - * Required Parameters: none - * Optiional Parameters: none - */ - public class FlowerProviderVariable : StateModifier - { - public override string Name { get; } - protected readonly StateBool NoFlower; - public const string Prefix = "$FLOWERGET"; - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (term == Prefix) - { - variable = new FlowerProviderVariable(term, lm); - return true; - } - variable = default; - return false; - } - - public FlowerProviderVariable(string name, LogicManager lm) - { - Name = name; - try - { - NoFlower = lm.StateManager.GetBoolStrict("NOFLOWER"); - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing FlowerProviderVariable", e); - } - } - - protected FlowerProviderVariable(string name) - { - Name = name; - } - - public override IEnumerable GetTerms() - { - return Enumerable.Empty(); - } - - public override IEnumerable? ProvideState(object? sender, ProgressionManager pm) - { - return Enumerable.Empty(); - } - - public override IEnumerable ModifyState(object? sender, ProgressionManager pm, LazyStateBuilder state) - { - state.SetBool(NoFlower, false); - yield return state; - } - } -} diff --git a/RandomizerMod/RC/StateVariables/FragileCharmVariable.cs b/RandomizerMod/RC/StateVariables/FragileCharmVariable.cs deleted file mode 100644 index b9a9eb0..0000000 --- a/RandomizerMod/RC/StateVariables/FragileCharmVariable.cs +++ /dev/null @@ -1,52 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerMod.RC.StateVariables -{ - /* - * Equip logic for Fragile Heart, Greed, and Strength. See documentation for EquipCharmVariable for variable pattern. - */ - public class FragileCharmVariable : EquipCharmVariable - { - protected readonly Term RepairTerm; - protected readonly StateBool BreakBool; - - public FragileCharmVariable(string name, string charmName, int charmID, LogicManager lm) : this(name, charmName, charmID, lm, "Can_Repair_Fragile_Charms", charmID switch - { - 23 => "BROKEHEART", - 24 => "BROKEGREED", - 25 => "BROKESTRENGTH", - _ => throw new ArgumentException($"Error constructing FCV from {name}: Unknown fragile charm id {charmID}.") - }) { } - - public FragileCharmVariable(string name, string charmName, int charmID, LogicManager lm, string repairTermName, string breakBoolName) : base(name, charmName, charmID, lm) - { - RepairTerm = lm.GetTermStrict(repairTermName) ?? throw new ArgumentException($"Error constructing ECV from {name}: {repairTermName} term does not exist?"); - BreakBool = lm.StateManager.GetBoolStrict(breakBoolName) ?? throw new ArgumentException($"Error constructing ECV from {name}: could not find {breakBoolName} state bool."); - } - - public override IEnumerable GetTerms() - { - return base.GetTerms().Append(RepairTerm); - } - - public override bool HasStateRequirements(ProgressionManager pm, T state) - { - return base.HasStateRequirements(pm, state) && (pm.Has(CharmTerm, 2) || !state.GetBool(BreakBool) && pm.Has(RepairTerm)); - } - - public void BreakCharm(ProgressionManager pm, ref LazyStateBuilder state) - { - if (pm.Has(CharmTerm, 2)) return; - if (state.GetBool(CharmBool)) - { - state.SetBool(CharmBool, false); - state.Increment(UsedNotchesInt, -((RandoModContext)pm.ctx).notchCosts[CharmID - 1]); - if (state.GetBool(Overcharmed)) state.SetBool(Overcharmed, false); - } - state.SetBool(AnticharmBool, true); - state.SetBool(BreakBool, true); - } - - } -} diff --git a/RandomizerMod/RC/StateVariables/HPStateManager.cs b/RandomizerMod/RC/StateVariables/HPStateManager.cs deleted file mode 100644 index aa55740..0000000 --- a/RandomizerMod/RC/StateVariables/HPStateManager.cs +++ /dev/null @@ -1,531 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; -using static RandomizerMod.RC.StateVariables.IHPStateManager; - -namespace RandomizerMod.RC.StateVariables -{ - /// - /// - /// - /// This interface only uses return values, rather than the ref pattern. - /// This is because many hp operations may require branching to fully account for how their effects interact with the hp state model. - public interface IHPStateManager : ILogicVariable - { - /// - /// Applies the effect of taking a single hit of the specified amount (preovercharm). - /// - IEnumerable TakeDamage(ProgressionManager pm, LazyStateBuilder state, int amount); - /// - /// Applies the effect of taking a sequence of hits of the specified amounts (preovercharm), with insufficient time between hits to focus or proc hiveblood. - /// - IEnumerable TakeDamageSequence(ProgressionManager pm, LazyStateBuilder state, params int[] amounts); - /// - /// Attempts to focus once. Returns true if successful. Deducts soul without healing if Joni is equipped. Does not modify the input on failure. - ///
Automatically fails if used when any focus charm (Joni, Deep Focus) is not determined. - ///
Automatically fails if used with indeterminate hp. See . - ///
- bool TryFocus(ProgressionManager pm, ref LazyStateBuilder state); - /// - /// Attempts to focus exactly the specified number of times, allowing use of soul vessels. Deducts soul without healing if Joni is equipped. - ///
If Joni and Deep Focus are not determined, determines both charms. - ///
- IEnumerable DoFocus(ProgressionManager pm, LazyStateBuilder state, int amount); - /// - /// Applies the effect of receiving the specified amount of lifeblood. - /// - IEnumerable GiveBlueHealth(ProgressionManager pm, LazyStateBuilder state, int amount); - /// - /// Applies the effect of restoring the specified amount of ordinary health. - /// - IEnumerable GiveHealth(ProgressionManager pm, LazyStateBuilder state, int amount); - /// - /// Applies the effect of restoring all white health. - /// - IEnumerable RestoreWhiteHealth(ProgressionManager pm, LazyStateBuilder state); - /// - /// Applies the effect of restoring all health. Resets blue health similarly to a bench. - /// - IEnumerable RestoreAllHealth(ProgressionManager pm, LazyStateBuilder state); - /// - /// Returns true if the state can be queried for specific hp info (hp remaining, etc). - /// If false, must be used before querying. - /// - bool IsHPDetermined(LazyStateBuilder state); - /// - /// Determines various questions which can affect calculated hp (overcharm, equipped charms, etc). - /// - IEnumerable DetermineHP(ProgressionManager pm, LazyStateBuilder state); - /// - /// Returns the exact amount of each hp type for the state. See for when this can be safely used. - /// - /// The state has indeterminate HP info. - StrictHPInfo GetHPInfo(ProgressionManager pm, LazyStateBuilder state); - /// - /// Data representing the exact amount of each hp type for a particular state. - ///
For the purpose of this data, Joni HP is treated as white, rather than blue. - ///
- public readonly record struct StrictHPInfo(int CurrentWhiteHP, int CurrentBlueHP, int MaxWhiteHP); - - IEnumerable GetTerms(HPSMOperation operation); - - public enum HPSMOperation - { - TakeDamage, - TakeDamageSequence, - TryFocus, - DoFocus, - GiveBlueHealth, - GiveHealth, - RestoreWhiteHealth, - RestoreAllHealth, - IsHPDetermined, - DetermineHP, - GetHPInfo, - } - } - - /* - * Goal: - * We want to optimize for the most common use case of single hit damage with no survivability concern - * while trying not to compromise on correctness and completeness. - * Model: - * We will have two types of states which respectively track damage lazily and strictly. - * A lazy state can be converted to a collection of strict states at any time. - * A lazy state tracks the number of single damage hits it has received. - * A strict state tracks the amount of blue hp damage and white hp damage it has received. - * On conversion from lazy to strict, overcharm status and various charm equip status are determined so that exact hp is known. - * Conversion is forced by: - * Taking any sequence of consecutive hits without pause (a scenario where we would not be able to reconstruct hiveblood history) - * Taking any hit of base amount greater than 1 (a scenario where we would not be able to reconstruct overcharm damage) - * Taking a single damage hit that would kill an overcharmed state at base max hp. - * External call, by any consumer that requires exact hp data. - * On a hit that would otherwise kill, in strict mode, all remaining survivability charms are equipped, and an attempt is made to focus exactly enough to survive. - * This intentionally does not explore all possible focus strategies. - * Thus, it allows false negatives, where a strategy of more aggressive focus use paired with soul refills would otherwise work. - * There are no assumptions regarding overcharm, charm equip for a lazy state. Those can be modified freely by other consumers, without needing conversion. - * DecideOvercharm was implemented in the interface with the idea that potentially it would need to "rebalance" on overcharm. - * However, that idea was discarded so that charm equip could remain a one-to-one state operation. - * TODO: - * change other state modifiers (BenchReset, HotSpringsReset, etc) to use HPSM api. - * write documentation and extensive tests. most likely there are still several errors in the below implementation. - */ - - public class HPStateManager : LogicVariable, IHPStateManager - { - public override string Name { get; } - public const string Prefix = "$HPSM"; - - public override IEnumerable GetTerms() - { - yield return MaskShards; - yield return Focus; - foreach (ILogicVariable variable in - (ILogicVariable[])[Hiveblood, LifebloodHeart, LifebloodCore, FragileHeart, JonisBlessing, DeepFocus, SSM]) - { - foreach (Term t in variable.GetTerms()) yield return t; - } - } - - public IEnumerable GetTerms(HPSMOperation op) - { - switch (op) - { - case HPSMOperation.TryFocus: - return FocusCharms.SelectMany(c => c.GetTerms()).Append(Focus).Concat(SSM.GetTerms()); - case HPSMOperation.RestoreAllHealth: - case HPSMOperation.IsHPDetermined: - return []; - case HPSMOperation.TakeDamage: - case HPSMOperation.TakeDamageSequence: - case HPSMOperation.DoFocus: - case HPSMOperation.GiveBlueHealth: - case HPSMOperation.GiveHealth: - case HPSMOperation.RestoreWhiteHealth: - case HPSMOperation.DetermineHP: - case HPSMOperation.GetHPInfo: - return GetTerms(); - default: - throw new NotImplementedException(); - } - } - - protected readonly StateBool Overcharmed; - protected readonly StateBool CannotOvercharm; - protected readonly StateBool NoFlower; - protected readonly StateInt SpentHP; - protected readonly StateInt SpentBlueHP; - protected readonly StateInt LazySpentHP; - protected readonly Term MaskShards; - protected readonly Term Focus; - protected readonly EquipCharmVariable LifebloodHeart; - protected readonly EquipCharmVariable LifebloodCore; - protected readonly EquipCharmVariable JonisBlessing; - protected readonly EquipCharmVariable FragileHeart; - protected readonly EquipCharmVariable Hiveblood; - protected readonly EquipCharmVariable DeepFocus; - // not supported: grubsong - protected EquipCharmVariable[] DetermineHPCharms; - protected EquipCharmVariable[] BeforeDeathCharms; - protected EquipCharmVariable[] FocusCharms; - protected readonly LogicManager lm; - protected ISoulStateManager SSM { get => field ?? (ISoulStateManager)lm.GetVariableStrict(name: SoulStateManager.Prefix); set; } = null!; - - public HPStateManager(string name, LogicManager lm) - { - Name = name; - this.lm = lm; - try - { - Overcharmed = lm.StateManager.GetBoolStrict("OVERCHARMED"); - CannotOvercharm = lm.StateManager.GetBoolStrict("CANNOTOVERCHARM"); - NoFlower = lm.StateManager.GetBoolStrict("NOFLOWER"); - SpentHP = lm.StateManager.GetIntStrict("SPENTHP"); - SpentBlueHP = lm.StateManager.GetIntStrict("SPENTBLUEHP"); - LazySpentHP = lm.StateManager.GetIntStrict("LAZYSPENTHP"); - MaskShards = lm.GetTermStrict("MASKSHARDS"); - Focus = lm.GetTermStrict("FOCUS"); - LifebloodHeart = (EquipCharmVariable)lm.GetVariableStrict(EquipCharmVariable.GetName("Lifeblood_Heart")); - LifebloodCore = (EquipCharmVariable)lm.GetVariableStrict(EquipCharmVariable.GetName("Lifeblood_Core")); - JonisBlessing = (EquipCharmVariable)lm.GetVariableStrict(EquipCharmVariable.GetName("Joni's_Blessing")); - FragileHeart = (EquipCharmVariable)lm.GetVariableStrict(EquipCharmVariable.GetName("Fragile_Heart")); - Hiveblood = (EquipCharmVariable)lm.GetVariableStrict(EquipCharmVariable.GetName("Hiveblood")); - DeepFocus = (EquipCharmVariable)lm.GetVariableStrict(EquipCharmVariable.GetName("Deep_Focus")); - - DetermineHPCharms = [Hiveblood, LifebloodHeart, LifebloodCore, FragileHeart, JonisBlessing]; - FocusCharms = [DeepFocus, JonisBlessing]; - BeforeDeathCharms = [Hiveblood, LifebloodHeart, LifebloodCore, FragileHeart, JonisBlessing, DeepFocus]; - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing HPStateManager", e); - } - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (term == Prefix) - { - variable = new HPStateManager(term, lm); - return true; - } - variable = default; - return false; - } - - public IEnumerable GiveBlueHealth(ProgressionManager pm, LazyStateBuilder state, int amount) - { - if (!IsHPDetermined(state)) - { - return DetermineHP(pm, state).SelectMany(l => GiveBlueHealth(pm, l, amount)); - } - else - { - state.SetInt(SpentBlueHP, state.GetInt(SpentBlueHP) - amount); - return [state]; - } - } - - public IEnumerable GiveHealth(ProgressionManager pm, LazyStateBuilder state, int amount) - { - if (!IsHPDetermined(state)) - { - if (state.GetInt(LazySpentHP) > 0) - { - return DetermineHP(pm, state).SelectMany(l => GiveHealth(pm, l, amount)); - } - else - { - return [state]; - } - } - else - { - int spentHP = state.GetInt(SpentHP); - state.SetInt(SpentHP, Math.Max(spentHP - amount, 0)); - return [state]; - } - } - - public IEnumerable RestoreWhiteHealth(ProgressionManager pm, LazyStateBuilder state) - { - if (!IsHPDetermined(state)) - { - if (state.GetInt(LazySpentHP) == 0) - { - return [state]; - } - else - { - return DetermineHP(pm, state).SelectMany(l => RestoreWhiteHealth(pm, l)); - } - } - else - { - state.SetInt(SpentHP, 0); - return [state]; - } - } - - public IEnumerable RestoreAllHealth(ProgressionManager pm, LazyStateBuilder state) - { - if (!IsHPDetermined(state)) - { - state.SetInt(LazySpentHP, 0); - return [state]; - } - else - { - state.SetInt(SpentHP, 0); - state.SetInt(SpentBlueHP, 0); - return [state]; - } - } - - public bool TryFocus(ProgressionManager pm, ref LazyStateBuilder state) - { - if (!pm.Has(Focus) || !IsHPDetermined(state)) return false; - foreach (EquipCharmVariable ecv in FocusCharms) if (!ecv.IsDetermined(state)) return false; - if (!SSM.TrySpendSoul(pm, ref state, 33)) return false; - int healAmt = GetHealAmount(pm, state); - - if (state.GetInt(SpentHP) > 0) state.SetInt(SpentHP, Math.Max(0, state.GetInt(SpentHP) - healAmt)); - return true; - } - - public IEnumerable DoFocus(ProgressionManager pm, LazyStateBuilder state, int amount) - { - if (!pm.Has(Focus)) return []; - if (!IsHPDetermined(state)) - { - return DetermineHP(pm, state).SelectMany(s => DoFocus(pm, state, amount)); - } - if (FocusCharms.Any(c => !c.IsDetermined(state))) - { - return EquipCharmVariable.GenerateCharmCombinations(pm, state, FocusCharms).SelectMany(s => DoFocus(pm, s, amount)); - } - if (!SSM.TrySpendSoul(pm, ref state, 33)) return []; - - int spentHP = state.GetInt(SpentHP); - int healAmt = GetHealAmount(pm, state); - state.SetInt(SpentHP, Math.Max(spentHP - amount * healAmt, 0)); - return [state]; - } - - protected int GetHealAmount(ProgressionManager pm, LazyStateBuilder state) - { - return JonisBlessing.IsEquipped(state) ? 0 : DeepFocus.IsEquipped(state) ? 2 : 1; - } - - public bool IsHPDetermined(LazyStateBuilder state) - { - return state.GetInt(LazySpentHP) == int.MaxValue; - } - - public IEnumerable DetermineHP(ProgressionManager pm, LazyStateBuilder state) - { - if (IsHPDetermined(state)) - { - return [state]; - } - - int lazySpentHP = state.GetInt(LazySpentHP); - state.SetInt(LazySpentHP, int.MaxValue); - - IEnumerable lsbs = DecideOvercharm(pm, state) - .SelectMany(l => EquipCharmVariable.GenerateCharmCombinations(pm, l, DetermineHPCharms)); - - for (int i = 0; i < lazySpentHP; i++) - { - lsbs = lsbs.SelectMany(l => TakeDamage(pm, l, 1)); - } - return lsbs; - } - - protected IEnumerable DecideOvercharm(ProgressionManager pm, LazyStateBuilder state) - { - if (state.GetBool(CannotOvercharm) || state.GetBool(Overcharmed)) - { - yield return state; - yield break; - } - else - { - LazyStateBuilder oc = new(state); - state.SetBool(CannotOvercharm, true); - oc.SetBool(Overcharmed, true); - yield return state; - yield return oc; - yield break; - } - } - - public StrictHPInfo GetHPInfo(ProgressionManager pm, LazyStateBuilder state) - { - if (!IsHPDetermined(state)) - { - throw new InvalidOperationException($"{nameof(GetHPInfo)} called on state {pm.lm.StateManager.PrettyPrint(state)} with indeterminate hp."); - } - - int maxHp = pm.Get(MaskShards) / 4; - if (FragileHeart.IsEquipped(state)) maxHp += 2; - if (JonisBlessing.IsEquipped(state)) maxHp = (int)(1.4f * maxHp); - int hp = maxHp - state.GetInt(SpentHP); - int blueHP = -state.GetInt(SpentBlueHP); - if (LifebloodHeart.IsEquipped(state)) blueHP += 2; - if (LifebloodCore.IsEquipped(state)) blueHP += 4; - return new(hp, blueHP, maxHp); - } - - #region Damage - - protected readonly record struct HitInfo(int Amount, int BlueHPDamage, int WhiteHPDamage, bool WaitAfterHit) - { - public bool Survives { get; } - - public HitInfo(StrictHPInfo info, int Amount, bool WaitAfterHit) : this(Amount, - info.CurrentBlueHP >= Amount ? Amount : info.CurrentBlueHP, - info.CurrentBlueHP >= Amount ? 0 : Amount, - WaitAfterHit) - { - Survives = info.CurrentBlueHP >= Amount || info.CurrentWhiteHP > Amount; - } - } - - protected virtual void DoHit(ref LazyStateBuilder state, HitInfo hit) - { - if (!hit.Survives) throw new InvalidOperationException("DoHit called on lethal hit."); - - if (hit.BlueHPDamage > 0) - { - state.Increment(SpentBlueHP, hit.BlueHPDamage); - } - if (hit.WhiteHPDamage > 0) - { - state.Increment(SpentHP, hit.WhiteHPDamage); - } - if (hit.WaitAfterHit) - { - if (Hiveblood.IsEquipped(state) && hit.WhiteHPDamage > 0) - { - state.Increment(SpentHP, -1); - } - } - state.SetBool(NoFlower, true); - } - - public IEnumerable TakeDamage(ProgressionManager pm, LazyStateBuilder state, int amount) - { - if (!IsHPDetermined(state)) - { - if (amount > 1 || !CanTakeNextLazyHit(pm, state)) - { - return DetermineHP(pm, state).SelectMany(s => TakeDamageStrict(pm, s, amount, waitAfterHit: true)); - } - else - { - state.Increment(LazySpentHP, 1); - return [state]; - } - } - else - { - return TakeDamageStrict(pm, state, amount, waitAfterHit: true); - } - } - - public IEnumerable TakeDamageSequence(ProgressionManager pm, LazyStateBuilder state, params int[] amounts) - { - if (!IsHPDetermined(state)) return DetermineHP(pm, state).SelectMany(s => TakeDamageSequence(pm, s, amounts)); - - IEnumerable states = [state]; - - for (int i = 0; i < amounts.Length; i++) - { - int amount = amounts[i]; - bool waitAfterHit = i == amounts.Length - 1; - states = states.SelectMany(s => TakeDamageStrict(pm, s, amount, waitAfterHit)); - } - return states; - } - - /// - /// Test inside lazy path for whether to stay in lazy path. - /// - protected bool CanTakeNextLazyHit(ProgressionManager pm, LazyStateBuilder state) - { - // conservatively exit lazy mode when it would kill an overcharmed state with no useful charms or healing - // we could hypothetically check for charms or cannotOvercharmed, but this risks monotonicity issues if not done carefully - - int hitsTaken = state.GetInt(LazySpentHP); - int maxHP = pm.Get(MaskShards) / 4; - int totalHits = (maxHP - 1) / 2; - return totalHits - hitsTaken > 0; - } - - /// - /// Standard TakeDamage path for states with determined hp. - /// - protected IEnumerable TakeDamageStrict(ProgressionManager pm, LazyStateBuilder state, int amount, bool waitAfterHit) - { - bool overcharmed = state.GetBool(Overcharmed); - int adjAmount = overcharmed ? 2 * amount : amount; - - StrictHPInfo info = GetHPInfo(pm, state); - HitInfo hit = new(info, adjAmount, waitAfterHit); - if (hit.Survives) - { - DoHit(ref state, hit); - return [state]; - } - else - { - return EquipCharmVariable.GenerateCharmCombinations(pm, state, BeforeDeathCharms) - .SelectMany(s => TakeDamageDesperate(pm, s, amount, waitAfterHit: true)); - } - } - - /// - /// TakeDamage path for states with determined hp which will die on the next hit barring focus or charm interactions. - /// - protected virtual IEnumerable TakeDamageDesperate(ProgressionManager pm, LazyStateBuilder state, int amount, bool waitAfterHit) - { - StrictHPInfo info = GetHPInfo(pm, state); - bool overcharmed = state.GetBool(Overcharmed); - int adjAmount = overcharmed ? 2 * amount : amount; - - int deficit = adjAmount - info.CurrentWhiteHP; - IEnumerable states; - if (deficit >= 0) - { - if (waitAfterHit) - { - int healAmt = GetHealAmount(pm, state); - int healAvail = info.MaxWhiteHP - info.CurrentWhiteHP; - int healReq = 1 + deficit; - if (healAmt > 0 && healAvail >= healReq) - { - states = DoFocus(pm, state, healReq); - } - else yield break; - } - else yield break; - } - else - { - states = [state]; - } - - foreach (LazyStateBuilder lsb in states) - { - state = lsb; - info = GetHPInfo(pm, state); - HitInfo hit = new(info, adjAmount, true); - if (!hit.Survives) continue; - DoHit(ref state, hit); - yield return state; - } - } - - #endregion - } -} diff --git a/RandomizerMod/RC/StateVariables/HotSpringResetVariable.cs b/RandomizerMod/RC/StateVariables/HotSpringResetVariable.cs deleted file mode 100644 index 6e598b1..0000000 --- a/RandomizerMod/RC/StateVariables/HotSpringResetVariable.cs +++ /dev/null @@ -1,60 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerMod.RC.StateVariables -{ - /* - * Prefix: $HOTSPRINGRESET - * Required Parameters: none - * Optiional Parameters: none - */ - public class HotSpringResetVariable : StateModifier - { - public override string Name { get; } - protected readonly ISoulStateManager SSM; - protected readonly IHPStateManager HPSM; - public const string Prefix = "$HOTSPRINGRESET"; - - public HotSpringResetVariable(string name, LogicManager lm) - { - Name = name; - try - { - SSM = (ISoulStateManager)lm.GetVariableStrict(SoulStateManager.Prefix); - HPSM = (IHPStateManager)lm.GetVariableStrict(HPStateManager.Prefix); - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing HotSpringResetVariable", e); - } - } - - public override IEnumerable GetTerms() - { - foreach (Term t in SSM.GetTerms(ISoulStateManager.SSMOperation.RestoreSoul)) yield return t; - foreach (Term t in HPSM.GetTerms(IHPStateManager.HPSMOperation.RestoreWhiteHealth)) yield return t; - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (term == Prefix) - { - variable = new HotSpringResetVariable(term, lm); - return true; - } - variable = default; - return false; - } - - public override IEnumerable? ProvideState(object? sender, ProgressionManager pm) - { - return []; - } - - public override IEnumerable ModifyState(object? sender, ProgressionManager pm, LazyStateBuilder state) - { - SSM.TryRestoreAllSoul(pm, ref state, restoreReserves: true); - return HPSM.RestoreWhiteHealth(pm, state); - } - } -} diff --git a/RandomizerMod/RC/StateVariables/LifebloodCountVariable.cs b/RandomizerMod/RC/StateVariables/LifebloodCountVariable.cs deleted file mode 100644 index 214cfc8..0000000 --- a/RandomizerMod/RC/StateVariables/LifebloodCountVariable.cs +++ /dev/null @@ -1,61 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerMod.RC.StateVariables -{ - /* - * Prefix: $LIFEBLOOD - * Required Parameters: - - If any parameters are provided, the first parameter must parse to int to give the required number of blue masks (including Joni masks). - If absent, defaults to 1. - * Optional Parameters: none - * Filters to states with determined hp which have at least a certain number of blue masks, including Joni masks. - */ - public class LifebloodCountVariable : StateModifier - { - public override string Name { get; } - public const string Prefix = "$LIFEBLOOD"; - - protected readonly int RequiredBlueMasks; - protected readonly IHPStateManager HPSM; - protected readonly EquipCharmVariable JonisBlessing; - - public LifebloodCountVariable(string name, LogicManager lm, int requiredBlueMasks) - { - this.Name = name; - RequiredBlueMasks = requiredBlueMasks; - try - { - HPSM = (IHPStateManager)lm.GetVariableStrict(HPStateManager.Prefix); - JonisBlessing = (EquipCharmVariable)lm.GetVariableStrict(EquipCharmVariable.GetName("Joni's_Blessing")); - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing LifebloodCountVariable", e); - } - } - - public override IEnumerable GetTerms() - { - return HPSM.GetTerms(IHPStateManager.HPSMOperation.GetHPInfo); - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (VariableResolver.TryMatchPrefix(term, Prefix, out string[] parameters)) - { - int amount = parameters.Length == 0 ? 1 : int.Parse(parameters[0]); - variable = new LifebloodCountVariable(term, lm, amount); - return true; - } - variable = default; - return false; - } - - public override IEnumerable ModifyState(object? sender, ProgressionManager pm, LazyStateBuilder state) - { - return HPSM.DetermineHP(pm, state).Where(s => HPSM.GetHPInfo(pm, s) is IHPStateManager.StrictHPInfo hp - && hp.CurrentBlueHP + (JonisBlessing.IsEquipped(s) ? hp.CurrentWhiteHP : 0) >= RequiredBlueMasks); - } - } -} diff --git a/RandomizerMod/RC/StateVariables/RegainSoulVariable.cs b/RandomizerMod/RC/StateVariables/RegainSoulVariable.cs deleted file mode 100644 index d765473..0000000 --- a/RandomizerMod/RC/StateVariables/RegainSoulVariable.cs +++ /dev/null @@ -1,72 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerMod.RC.StateVariables -{ - /* - * Prefix: $REGAINSOUL - * Required Parameters: - - * Optional Parameters: - - The first parameter, if given, must parse to int to give the regain amount. Otherwise, fully restores soul. - */ - public class RegainSoulVariable : StateModifier - { - public override string Name { get; } - public const string Prefix = "$REGAINSOUL"; - - protected readonly int? Amount; - protected readonly ISoulStateManager SSM; - - public RegainSoulVariable(string name, LogicManager lm, int? amount) - { - Name = name; - this.Amount = amount; - try - { - SSM = (ISoulStateManager)lm.GetVariableStrict(SoulStateManager.Prefix); - } - catch (Exception e) - { - throw new InvalidOperationException($"Error constructing RegainSoulVariable", e); - } - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (VariableResolver.TryMatchPrefix(term, Prefix, out string[] parameters)) - { - int amount; - if (parameters.Length == 0) - { - amount = -1; - } - else if (parameters.Length == 1 && int.TryParse(parameters[0], out amount)) { } - else - { - throw new ArgumentException($"{term} is missing amount argument for RegainSoulVariable."); - } - - variable = new RegainSoulVariable(term, lm, amount >= 0 ? amount : null); - return true; - } - variable = default; - return false; - } - - public override IEnumerable GetTerms() - { - return SSM.GetTerms(ISoulStateManager.SSMOperation.RestoreSoul); - } - - public override IEnumerable? ProvideState(object? sender, ProgressionManager pm) - { - return []; - } - - public override IEnumerable ModifyState(object? sender, ProgressionManager pm, LazyStateBuilder state) - { - return Amount.HasValue ? SSM.RestoreSoul(pm, state, Amount.Value) : SSM.RestoreAllSoul(pm, state, restoreReserves: true); - } - } -} diff --git a/RandomizerMod/RC/StateVariables/SaveQuitResetVariable.cs b/RandomizerMod/RC/StateVariables/SaveQuitResetVariable.cs deleted file mode 100644 index fd800bd..0000000 --- a/RandomizerMod/RC/StateVariables/SaveQuitResetVariable.cs +++ /dev/null @@ -1,72 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerMod.RC.StateVariables -{ - /* - * Prefix: $SAVEQUITRESET - * Required Parameters: none - * Optional Parameters: none - * Provides the effect of warping via Benchwarp or savequit, regardless of destination type. - */ - public class SaveQuitResetVariable : StateModifier - { - public override string Name { get; } - public const string Prefix = "$SAVEQUITRESET"; - - protected readonly StateBool NoFlower; - protected readonly StateBool UsedShade; - protected readonly StateInt RequiredMaxSoul; - protected readonly ISoulStateManager SSM; - protected readonly IHPStateManager HPSM; - - public SaveQuitResetVariable(string term, LogicManager lm) - { - Name = term; - try - { - NoFlower = lm.StateManager.GetBoolStrict("NOFLOWER"); - UsedShade = lm.StateManager.GetBoolStrict("USEDSHADE"); - RequiredMaxSoul = lm.StateManager.GetIntStrict("REQUIREDMAXSOUL"); - - SSM = (ISoulStateManager)lm.GetVariableStrict(SoulStateManager.Prefix); - HPSM = (IHPStateManager)lm.GetVariableStrict(HPStateManager.Prefix); - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing SaveQuitResetVariable", e); - } - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (VariableResolver.TryMatchPrefix(term, Prefix, out _)) - { - variable = new SaveQuitResetVariable(term, lm); - return true; - } - variable = default; - return false; - } - - public override IEnumerable GetTerms() - { - foreach (Term t in SSM.GetTerms()) yield return t; - foreach (Term t in HPSM.GetTerms(IHPStateManager.HPSMOperation.RestoreWhiteHealth)) yield return t; - } - - public override IEnumerable? ProvideState(object? sender, ProgressionManager pm) - { - return []; - } - - public override IEnumerable ModifyState(object? sender, ProgressionManager pm, LazyStateBuilder state) - { - state.SetBool(NoFlower, true); // not game accurate, but we do this to prevent warps from being required for flower quest. - SSM.TrySpendAllSoul(pm, ref state); // zero out soul. A subsequent modifier will handle bench / start respawn soul effects. - state.SetBool(UsedShade, false); // not necessary to reset shade variables for typical use, but in the case of warping to a non-start hard respawn, it would be correct to reset them here. - state.SetInt(RequiredMaxSoul, 0); - return HPSM.RestoreWhiteHealth(pm, state); // bad to chain this into a cheaper restore on the bench... - } - } -} diff --git a/RandomizerMod/RC/StateVariables/ShadeStateVariable.cs b/RandomizerMod/RC/StateVariables/ShadeStateVariable.cs deleted file mode 100644 index 4443abf..0000000 --- a/RandomizerMod/RC/StateVariables/ShadeStateVariable.cs +++ /dev/null @@ -1,140 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerMod.RC.StateVariables -{ - /* - * Prefix: $SHADESKIP - * Required Parameters: none - * Optional Parameters: - * - a parameter ending in "HITS": the head of the parameter must parse to int, and is the required shade hp. Defaults to 1. - */ - public class ShadeStateVariable : StateModifier - { - public override string Name { get; } - protected readonly Term Shadeskips; - protected readonly Term MaskShards; - protected readonly StateBool UsedShadeBool; - protected readonly StateBool CannotShadeSkip; - protected readonly StateBool NoFlower; - protected readonly FragileCharmVariable FragileHeartEquip; - protected readonly EquipCharmVariable VoidHeartEquip; - protected readonly EquipCharmVariable JoniEquip; - protected readonly ISoulStateManager SSM; - protected readonly int RequiredShadeHealth; - public const string Prefix = "$SHADESKIP"; - - public ShadeStateVariable(string name, LogicManager lm, int requiredShadeHealth) - { - Name = name; - RequiredShadeHealth = requiredShadeHealth; - try - { - Shadeskips = lm.GetTermStrict("SHADESKIPS"); - MaskShards = lm.GetTermStrict("MASKSHARDS"); - UsedShadeBool = lm.StateManager.GetBoolStrict("USEDSHADE"); - CannotShadeSkip = lm.StateManager.GetBoolStrict("CANNOTSHADESKIP"); - NoFlower = lm.StateManager.GetBoolStrict("NOFLOWER"); - - FragileHeartEquip = (FragileCharmVariable)lm.GetVariableStrict(EquipCharmVariable.GetName("Fragile_Heart")); - VoidHeartEquip = (EquipCharmVariable)lm.GetVariableStrict(EquipCharmVariable.GetName("Kingsoul")); // we have to check against either Kingsoul or Void Heart equipped to ensure monotonicity - JoniEquip = (EquipCharmVariable)lm.GetVariableStrict(EquipCharmVariable.GetName("Joni's_Blessing")); - SSM = (ISoulStateManager)lm.GetVariableStrict(SoulStateManager.Prefix); - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing ShadeStateVariable", e); - } - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (VariableResolver.TryMatchPrefix(term, Prefix, out string[] parameters)) - { - int requiredShadeHealth = 1; - for (int i = 0; i < parameters.Length; i++) if (parameters[i].EndsWith("HITS")) requiredShadeHealth = int.Parse(parameters[i].Substring(0, parameters[i].Length - 4)); - - variable = new ShadeStateVariable(term, lm, requiredShadeHealth); - return true; - } - variable = null; - return false; - } - - public override IEnumerable GetTerms() - { - yield return Shadeskips; - if (RequiredShadeHealth > 1) yield return MaskShards; - } - - public override IEnumerable ModifyState(object? sender, ProgressionManager pm, LazyStateBuilder state) - { - if (DoShadeSkip(pm, ref state)) - { - yield return state; - } - } - - // rem: this reports success, but does not attempt to avoid mutation in the case of failure - private bool DoShadeSkip(ProgressionManager pm, ref LazyStateBuilder state) - { - if (!pm.Has(Shadeskips)) - { - return false; - } - - if (VoidHeartEquip.IsEquipped(state) || state.GetBool(CannotShadeSkip) || state.GetBool(UsedShadeBool)) - { - return false; - } - VoidHeartEquip.SetUnequippable(ref state); - state.SetBool(UsedShadeBool, true); - - if (!SSM.TrySetSoulLimit(pm, ref state, limiter: 33, appliesToPriorPath: true) || !SSM.TrySetSoulLimit(pm, ref state, 0, false)) - { - /* - * Setting up a shade imposes a soul cap on the path up to the shade. After killing the shade, the soul cap is removed. - * Thus, if the pre skip state had more than 66 soul in its meter, the post skip state will have soul reduced accordingly. - * Additionally, if the state path previously spent soul, the shade skip may fail if those soul expenditures were not possible with the soul cap. - */ - return false; - } - - if (!CheckHealthRequirement(pm, ref state)) - { - // ref, in order to manage Joni and FHeart as needed - return false; - } - - if (!state.GetBool(NoFlower)) - { - state.SetBool(NoFlower, true); // don't require flower shade skips, also avoids thorny issues with reacquiring flower after setting up the shade. - } - - return true; - } - - public bool CheckHealthRequirement(ProgressionManager pm, ref LazyStateBuilder state) - { - if (RequiredShadeHealth == 1) - { - return true; - } - else - { - if (JoniEquip.IsEquipped(state)) return false; - JoniEquip.SetUnequippable(ref state); - - // this probably doesn't need to run through HPSM since analyzing max hp is less complicated. - int hp = (pm.Get(MaskShards) / 4) / 2; - if (hp >= RequiredShadeHealth || RequiredShadeHealth == hp + 1 && FragileHeartEquip.CanEquip(pm, state) != EquipCharmVariable.EquipResult.None) - { - FragileHeartEquip.BreakCharm(pm, ref state); - return true; - } - - return false; - } - } - } -} diff --git a/RandomizerMod/RC/StateVariables/ShriekPogoVariable.cs b/RandomizerMod/RC/StateVariables/ShriekPogoVariable.cs deleted file mode 100644 index c07b5fc..0000000 --- a/RandomizerMod/RC/StateVariables/ShriekPogoVariable.cs +++ /dev/null @@ -1,104 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerMod.RC.StateVariables -{ - public class ShriekPogoVariable : StateModifierWrapper - { - public override string Name { get; } - - protected readonly Term shriekPogoSkips; - protected readonly Term scream; - protected readonly Term wings; - protected readonly CastSpellVariable? stalledCasts; - protected readonly Term? difficultSkips; - protected readonly Term? leftDash; - protected readonly Term? rightDash; - protected bool noLeftStall; - protected bool noRightStall; - - public const string Prefix = "$SHRIEKPOGO"; - protected override string InnerPrefix => CastSpellVariable.Prefix; - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (VariableResolver.TryMatchPrefix(term, Prefix, out _) - || VariableResolver.TryMatchPrefix(term, Prefix + 'S', out _)) // typo $SHRIEKPOGOS used in logic in an old version - { - variable = new ShriekPogoVariable(term, lm); - return true; - } - variable = default; - return false; - } - - public ShriekPogoVariable(string name, LogicManager lm) : base(name, lm) - { - Name = name; - try - { - shriekPogoSkips = lm.GetTermStrict("SHRIEKPOGOSKIPS"); - scream = lm.GetTermStrict("SCREAM"); - wings = lm.GetTermStrict("WINGS"); - - if (InnerVariable.SpellCasts.Any(i => i > 1) && (!noLeftStall || !noRightStall)) - { - stalledCasts = (CastSpellVariable)lm.GetVariableStrict( - CastSpellVariable.Prefix + - '[' + string.Join(",", InnerParameters.SelectMany(p => int.TryParse(p, out int i) ? Enumerable.Repeat("1", i) : Enumerable.Repeat(p, 1))) + ']' - ); - if (!noLeftStall) leftDash = lm.GetTermStrict("LEFTDASH"); - if (!noRightStall) rightDash = lm.GetTermStrict("RIGHTDASH"); - } - if (InnerVariable.SpellCasts.Sum() > 3) - { - difficultSkips = lm.GetTermStrict("DIFFICULTSKIPS"); - } - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing ShriekPogoVariable", e); - } - } - - protected override bool Consume(string parameter) - { - switch (parameter) - { - case "NOSTALL": - noLeftStall = noRightStall = true; - return true; - case "NOLEFTSTALL": - noLeftStall = true; - return true; - case "NORIGHTSTALL": - noRightStall = true; - return true; - default: return false; - } - } - - public override IEnumerable GetTerms() - { - yield return shriekPogoSkips; - yield return scream; - foreach (Term t in InnerVariable.GetTerms()) yield return t; - if (difficultSkips is not null) yield return difficultSkips; - if (stalledCasts is not null) foreach (Term t in stalledCasts.GetTerms()) yield return t; - if (leftDash is not null) yield return leftDash; - if (rightDash is not null) yield return rightDash; - } - - public override IEnumerable ModifyState(object? sender, ProgressionManager pm, LazyStateBuilder state) - { - if (!pm.Has(shriekPogoSkips) || !pm.Has(scream, 2) || !pm.Has(wings) || difficultSkips is not null && !pm.Has(difficultSkips)) return Enumerable.Empty(); - - if (stalledCasts is not null && (leftDash is not null && pm.Has(leftDash) || rightDash is not null && pm.Has(rightDash))) - { - return stalledCasts.ModifyState(sender, pm, state); - } - - return InnerVariable.ModifyState(sender, pm, state); - } - } -} diff --git a/RandomizerMod/RC/StateVariables/SlopeballVariable.cs b/RandomizerMod/RC/StateVariables/SlopeballVariable.cs deleted file mode 100644 index 0204f2d..0000000 --- a/RandomizerMod/RC/StateVariables/SlopeballVariable.cs +++ /dev/null @@ -1,53 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerMod.RC.StateVariables -{ - public class SlopeballVariable : StateModifierWrapper - { - public override string Name { get; } - - protected readonly Term slopeballSkips; - protected readonly Term fireball; - public const string Prefix = "$SLOPEBALL"; - protected override string InnerPrefix => CastSpellVariable.Prefix; - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (term.StartsWith(Prefix)) - { - variable = new SlopeballVariable(term, lm); - return true; - } - variable = default; - return false; - } - - public SlopeballVariable(string name, LogicManager lm) : base(name, lm) - { - Name = name; - try - { - slopeballSkips = lm.GetTermStrict("SLOPEBALLSKIPS"); - fireball = lm.GetTermStrict("FIREBALL"); - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing SlopeballVariable", e); - } - } - - public override IEnumerable GetTerms() - { - yield return slopeballSkips; - yield return fireball; - foreach (Term t in InnerVariable.GetTerms()) yield return t; - } - - public override IEnumerable ModifyState(object? sender, ProgressionManager pm, LazyStateBuilder state) - { - if (!pm.Has(slopeballSkips) || !pm.Has(fireball)) return Enumerable.Empty(); - return InnerVariable.ModifyState(sender, pm, state); - } - } -} diff --git a/RandomizerMod/RC/StateVariables/SoulStateManager.cs b/RandomizerMod/RC/StateVariables/SoulStateManager.cs deleted file mode 100644 index ef4433e..0000000 --- a/RandomizerMod/RC/StateVariables/SoulStateManager.cs +++ /dev/null @@ -1,338 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; -using static RandomizerMod.RC.StateVariables.ISoulStateManager; - -namespace RandomizerMod.RC.StateVariables -{ - public interface ISoulStateManager : ILogicVariable - { - /// - /// Applies the effect of spending the given amount of soul. - /// - IEnumerable SpendSoul(ProgressionManager pm, LazyStateBuilder state, int amount); - /// - /// Applies the effect of the given sequence of casts. The provided array should contains counts for sequences of consecutive casts. - /// Soul vessels will be applied between sequences of consecutive casts, but not withn sequences. - /// - IEnumerable SpendSoulSequence(ProgressionManager pm, LazyStateBuilder state, int amount, int[] castGroups); - /// - /// Equivalent to , in the case where int[] casts is an array of ones. That is, allows soul vessels to refill between each cast. - /// - IEnumerable SpendSoulSlow(ProgressionManager pm, LazyStateBuilder state, int amount, int casts); - /// - /// Determines whether would succeed, and if so modifies the state and returns true. - ///
On false return, the state is not modified. - ///
Per its signature, the result is a single state. Implementations where would produce multiple states must admit a consistent truncated result. - ///
- bool TrySpendSoul(ProgressionManager pm, ref LazyStateBuilder state, int amount); - /// - /// Alternate version of which is guaranteed to produce a single output, and which modifies the input only on success. - /// - bool TrySpendSoulSequence(ProgressionManager pm, ref LazyStateBuilder state, int amount, int[] castGroups); - /// - /// Alternate version of which is guaranteed to produce a single output, and which modifies the input only on success. - /// - bool TrySpendSoulSlow(ProgressionManager pm, ref LazyStateBuilder state, int amount, int casts); - - IEnumerable SpendAllSoul(ProgressionManager pm, LazyStateBuilder state); - bool TrySpendAllSoul(ProgressionManager pm, ref LazyStateBuilder state); - - /// - /// Attempts to restore the requested amount of soul to the state. - /// Note that this may fail to restore soul (e.g. if CannotRegainSoul is set). - /// In any case, this succeeds (does not return empty). - /// - IEnumerable RestoreSoul(ProgressionManager pm, LazyStateBuilder state, int amount); - /// - /// Attempts to restore soul to the state. - /// Note that this may fail to restore soul (e.g. if CannotRegainSoul is set). - /// In any case, this succeeds (does not return empty). - /// - IEnumerable RestoreAllSoul(ProgressionManager pm, LazyStateBuilder state, bool restoreReserves); - /// - /// Attempts to restore the requested amount of soul to the state. - /// Returns false if soul cannot be restored (e.g. if CannotRegainSoul is set). - /// Returns true if the full amount is restored (including if it brings the state to full or the state is already full). - /// - bool TryRestoreSoul(ProgressionManager pm, ref LazyStateBuilder state, int amount); - /// - /// Attempts to restore soul to the state. - /// Returns false if soul cannot be restored (e.g. if CannotRegainSoul is set). - /// Returns true if the state is restored (including if the state is already full). - /// - bool TryRestoreAllSoul(ProgressionManager pm, ref LazyStateBuilder state, bool restoreReserves); - /// - /// Returns info on the current and maximum soul and reserves. - /// - SoulInfo GetSoulInfo(ProgressionManager pm, LazyStateBuilder state); - - /// - /// Changes the maximum soul cap, similar to the effect after death. - ///
For example, if is 33, the soul cap is reduced to 99 - 33 = 66. With consecutive uses, the new value is kept. - ///
If the cap is increased, the new portion of the meter is treated as empty, and reserves are rebalanced. - ///
If the soul cap , this can fail if previous soul usage required a higher soul cap. If the lowered cap only applies going forward, this should not fail. - ///
- bool TrySetSoulLimit(ProgressionManager pm, ref LazyStateBuilder state, int limiter, bool appliesToPriorPath); - /// - /// Changes the maximum soul cap, similar to the effect after death. - ///
For example, if is 33, the soul cap is reduced to 99 - 33 = 66. With consecutive uses, the new value is kept. - ///
If the cap is increased, the new portion of the meter is treated as empty, and reserves are rebalanced. - ///
If the soul cap , this can fail if previous soul usage required a higher soul cap. If the lowered cap only applies going forward, this should not fail. - ///
- IEnumerable LimitSoul(ProgressionManager pm, LazyStateBuilder state, int limiter, bool appliesToPriorPath); - - public readonly record struct SoulInfo(int Soul, int MaxSoul, int ReserveSoul, int MaxReserveSoul); - - IEnumerable GetTerms(SSMOperation operation); - - public enum SSMOperation - { - SpendSoul, - RestoreSoul, - LimitSoul, - GetSoulInfo, - } - } - - public class SoulStateManager : LogicVariable, ISoulStateManager - { - public override string Name { get; } - public const string Prefix = "$SSM"; - - protected readonly StateInt SpentSoul; - protected readonly StateInt SpentReserveSoul; - protected readonly StateInt SoulLimiter; - protected readonly StateInt MaxRequiredSoul; - protected readonly StateInt UsedNotches; - protected readonly StateBool CannotRegainSoul; - protected readonly Term VesselFragments; - - public SoulStateManager(string name, LogicManager lm) - { - Name = name; - try - { - SpentSoul = lm.StateManager.GetIntStrict("SPENTSOUL"); - SpentReserveSoul = lm.StateManager.GetIntStrict("SPENTRESERVESOUL"); - SoulLimiter = lm.StateManager.GetIntStrict("SOULLIMITER"); - MaxRequiredSoul = lm.StateManager.GetIntStrict("REQUIREDMAXSOUL"); - UsedNotches = lm.StateManager.GetIntStrict("USEDNOTCHES"); - CannotRegainSoul = lm.StateManager.GetBoolStrict("CANNOTREGAINSOUL"); - VesselFragments = lm.GetTermStrict("VESSELFRAGMENTS"); - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing CastSpellVariable", e); - } - } - - public override IEnumerable GetTerms() - { - return [VesselFragments]; - } - - public IEnumerable GetTerms(SSMOperation op) - { - switch (op) - { - case SSMOperation.SpendSoul: - case SSMOperation.LimitSoul: - case SSMOperation.GetSoulInfo: - return GetTerms(); - case SSMOperation.RestoreSoul: - return []; // after vessel fragments, the input state to a restore operation should change, since more reserves and less soul were spent. - // But the effect of restore on a properly soul-balanced state shouldn't change. - default: - throw new NotImplementedException(); - } - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (term == Prefix) - { - variable = new SoulStateManager(term, lm); - return true; - } - variable = default; - return false; - } - - - public IEnumerable SpendSoul(ProgressionManager pm, LazyStateBuilder state, int amount) - { - if (TrySpendSoul(pm, ref state, amount)) - { - return [state]; - } - return []; - } - - public IEnumerable SpendSoulSequence(ProgressionManager pm, LazyStateBuilder state, int amount, int[] castGroups) - { - if (TrySpendSoulSequence(pm, ref state, amount, castGroups)) - { - return SpendSoulSequence(pm, state, amount, castGroups); - } - return []; - } - - public IEnumerable SpendSoulSlow(ProgressionManager pm, LazyStateBuilder state, int amount, int casts) - { - if (TrySpendSoulSlow(pm, ref state, amount, casts)) - { - return SpendSoulSlow(pm, state, amount, casts); - } - return []; - } - - public bool TrySpendSoul(ProgressionManager pm, ref LazyStateBuilder state, int amount) - { - SoulInfo soul = GetSoulInfo(pm, state); - if (soul.Soul < amount) return false; - SpendAndRebalance(amount, ref soul, ref state); - return true; - } - - public bool TrySpendSoulSequence(ProgressionManager pm, ref LazyStateBuilder state, int amount, int[] castGroups) - { - SoulInfo soul = GetSoulInfo(pm, state); - LazyStateBuilder operand = new(state); - foreach (int num in castGroups) - { - int groupTotal = num * amount; - if (soul.Soul < groupTotal) return false; - SpendAndRebalance(groupTotal, ref soul, ref operand); - } - state = operand; - return true; - } - - public bool TrySpendSoulSlow(ProgressionManager pm, ref LazyStateBuilder state, int amount, int casts) - { - SoulInfo soul = GetSoulInfo(pm, state); - LazyStateBuilder operand = new(state); - for (int i = 0; i < casts; i++) - { - if (soul.Soul < amount) return false; - SpendAndRebalance(amount, ref soul, ref operand); - } - state = operand; - return true; - } - - public bool TrySpendAllSoul(ProgressionManager pm, ref LazyStateBuilder state) - { - SoulInfo info = GetSoulInfo(pm, state); - state.SetInt(SpentSoul, info.MaxSoul); - state.SetInt(MaxRequiredSoul, info.MaxSoul); - state.SetInt(SpentReserveSoul, info.MaxReserveSoul); - return true; - } - - public IEnumerable SpendAllSoul(ProgressionManager pm, LazyStateBuilder state) - { - TrySpendAllSoul(pm, ref state); - return [state]; - } - - public bool TryRestoreSoul(ProgressionManager pm, ref LazyStateBuilder state, int amount) - { - if (state.GetBool(CannotRegainSoul)) - { - return false; - } - SoulInfo soul = GetSoulInfo(pm, state); - int soulGain = Math.Min(soul.MaxSoul - soul.Soul, amount); - int reserveGain = Math.Min(soul.MaxReserveSoul - soul.ReserveSoul, amount - soulGain); - if (soulGain > 0) state.Increment(SpentSoul, -soulGain); - if (reserveGain > 0) state.Increment(SpentReserveSoul, -reserveGain); - return true; - } - - public IEnumerable RestoreSoul(ProgressionManager pm, LazyStateBuilder state, int amount) - { - TryRestoreSoul(pm, ref state, amount); - return [state]; - } - - public bool TryRestoreAllSoul(ProgressionManager pm, ref LazyStateBuilder state, bool restoreReserves) - { - if (state.GetBool(CannotRegainSoul)) - { - return false; - } - state.SetInt(SpentSoul, 0); - if (restoreReserves) state.SetInt(SpentReserveSoul, 0); - return true; - } - - public IEnumerable RestoreAllSoul(ProgressionManager pm, LazyStateBuilder state, bool restoreReserves) - { - TryRestoreAllSoul(pm, ref state, restoreReserves); - return [state]; - } - - public bool TrySetSoulLimit(ProgressionManager pm, ref LazyStateBuilder state, int limiter, bool appliesToPriorPath) - { - if (appliesToPriorPath && state.GetInt(MaxRequiredSoul) > limiter) return false; - - int current = state.GetInt(SoulLimiter); - - if (limiter > current) - { - state.SetInt(SoulLimiter, limiter); - } - else if (limiter < current) - { - state.SetInt(SoulLimiter, limiter); - TrySpendSoul(pm, ref state, current - limiter); - } - - return true; - } - - public IEnumerable LimitSoul(ProgressionManager pm, LazyStateBuilder state, int limiter, bool appliesToPriorPath) - { - if (TrySetSoulLimit(pm, ref state, limiter, appliesToPriorPath)) - { - return [state]; - } - return []; - } - - protected void SpendWithoutRebalance(int amount, ref SoulInfo soul, ref LazyStateBuilder state) - { - state.Increment(SpentSoul, amount); - state.TrySetIntToValue(MaxRequiredSoul, state.GetInt(SpentSoul)); - soul = soul with { Soul = soul.Soul - amount }; - } - - protected void RebalanceReserve(ref SoulInfo soul, ref LazyStateBuilder state) - { - int transfer = Math.Min(soul.MaxSoul - soul.Soul, soul.ReserveSoul); - if (transfer > 0) - { - state.Increment(SpentSoul, -transfer); - state.Increment(SpentReserveSoul, transfer); - soul = soul with { Soul = soul.Soul + transfer, ReserveSoul = soul.ReserveSoul - transfer }; - } - } - - protected void SpendAndRebalance(int amount, ref SoulInfo soul, ref LazyStateBuilder state) - { - SpendWithoutRebalance(amount, ref soul, ref state); - RebalanceReserve(ref soul, ref state); - } - - public SoulInfo GetSoulInfo(ProgressionManager pm, LazyStateBuilder state) - { - int maxSoul = 99 - state.GetInt(SoulLimiter); - int soul = maxSoul - state.GetInt(SpentSoul); - int vessels = pm.Get(VesselFragments) / 3; - int maxReserveSoul = vessels * 33; - int reserveSoul = maxReserveSoul - state.GetInt(SpentReserveSoul); - return new(soul, maxSoul, reserveSoul, maxReserveSoul); - } - } -} diff --git a/RandomizerMod/RC/StateVariables/SpendSoulVariable.cs b/RandomizerMod/RC/StateVariables/SpendSoulVariable.cs deleted file mode 100644 index 8357556..0000000 --- a/RandomizerMod/RC/StateVariables/SpendSoulVariable.cs +++ /dev/null @@ -1,60 +0,0 @@ -using RandomizerCore.Logic.StateLogic; -using RandomizerCore.Logic; - -namespace RandomizerMod.RC.StateVariables -{ - /* - * Prefix: $SPENDSOUL - * Required Parameters: - - The first parameter must parse to int to give the spend amount. - * Optional Parameters: none - */ - public class SpendSoulVariable : StateModifier - { - public override string Name { get; } - public const string Prefix = "$SPENDSOUL"; - - protected readonly int Amount; - protected readonly ISoulStateManager SSM; - - public SpendSoulVariable(string name, LogicManager lm, int amount) - { - Name = name; - this.Amount = amount; - try - { - SSM = (ISoulStateManager)lm.GetVariableStrict(SoulStateManager.Prefix); - } - catch (Exception e) - { - throw new InvalidOperationException($"Error constructing SpendSoulVariable", e); - } - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (VariableResolver.TryMatchPrefix(term, Prefix, out string[] parameters)) - { - if (parameters.Length < 1 || !int.TryParse(parameters[0], out int amount)) - { - throw new ArgumentException($"{term} is missing amount argument for SpendSoulVariable."); - } - - variable = new SpendSoulVariable(term, lm, amount); - return true; - } - variable = default; - return false; - } - - public override IEnumerable GetTerms() - { - return SSM.GetTerms(ISoulStateManager.SSMOperation.SpendSoul); - } - - public override IEnumerable ModifyState(object? sender, ProgressionManager pm, LazyStateBuilder state) - { - return SSM.SpendSoul(pm, state, Amount); - } - } -} diff --git a/RandomizerMod/RC/StateVariables/StagStateVariable.cs b/RandomizerMod/RC/StateVariables/StagStateVariable.cs deleted file mode 100644 index 43675fc..0000000 --- a/RandomizerMod/RC/StateVariables/StagStateVariable.cs +++ /dev/null @@ -1,62 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerMod.RC.StateVariables -{ - /* - * Prefix: $STAGSTATEMODIFIER - * Required Parameters: none - * Optiional Parameters: none - */ - public class StagStateVariable : StateModifier - { - public override string Name { get; } - protected readonly StateBool NoFlower; - public const string Prefix = "$STAGSTATEMODIFIER"; - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (term == Prefix) - { - variable = new StagStateVariable(term, lm); - return true; - } - variable = default; - return false; - } - - protected StagStateVariable(string name) - { - Name = name; - } - - public StagStateVariable(string name, LogicManager lm) - { - Name = name; - try - { - NoFlower = lm.StateManager.GetBoolStrict("NOFLOWER"); - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing StagStateVariable", e); - } - } - - public override IEnumerable GetTerms() - { - return Enumerable.Empty(); - } - - public override IEnumerable? ProvideState(object? sender, ProgressionManager pm) - { - return Enumerable.Empty(); - } - - public override IEnumerable ModifyState(object? sender, ProgressionManager pm, LazyStateBuilder state) - { - state.SetBool(NoFlower, true); - yield return state; - } - } -} diff --git a/RandomizerMod/RC/StateVariables/StartRespawnResetVariable.cs b/RandomizerMod/RC/StateVariables/StartRespawnResetVariable.cs deleted file mode 100644 index 7f43865..0000000 --- a/RandomizerMod/RC/StateVariables/StartRespawnResetVariable.cs +++ /dev/null @@ -1,58 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerMod.RC.StateVariables -{ - /* - * Prefix: $STARTRESPAWN - * Required Parameters: none - * Optional Parameters: none - * Provides the effect of the start respawn. Typically applied in sequence after $SAVEQUITRESET as part of $WARPTOSTART. - */ - public class StartRespawnResetVariable : StateModifier - { - public override string Name { get; } - public const string Prefix = "$STARTRESPAWN"; - - protected readonly ISoulStateManager SSM; - - public StartRespawnResetVariable(string term, LogicManager lm) - { - Name = term; - try - { - SSM = (ISoulStateManager)lm.GetVariableStrict(SoulStateManager.Prefix); - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing StartRespawnResetVariable", e); - } - } - - public override IEnumerable GetTerms() - { - return SSM.GetTerms(ISoulStateManager.SSMOperation.RestoreSoul); - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (VariableResolver.TryMatchPrefix(term, Prefix, out _)) - { - variable = new StartRespawnResetVariable(term, lm); - return true; - } - variable = default; - return false; - } - - public override IEnumerable? ProvideState(object? sender, ProgressionManager pm) - { - return []; - } - - public override IEnumerable ModifyState(object? sender, ProgressionManager pm, LazyStateBuilder state) - { - return SSM.RestoreAllSoul(pm, state, true); - } - } -} diff --git a/RandomizerMod/RC/StateVariables/StateModifierWrapper.cs b/RandomizerMod/RC/StateVariables/StateModifierWrapper.cs deleted file mode 100644 index 07252ac..0000000 --- a/RandomizerMod/RC/StateVariables/StateModifierWrapper.cs +++ /dev/null @@ -1,50 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; -using System.Security.Cryptography; - -namespace RandomizerMod.RC.StateVariables -{ - /// - /// Base class which handles passing the parameters in a given state modifier name to an inner state modifier. - /// - public abstract class StateModifierWrapper : StateModifier where T : StateModifier - { - public readonly T InnerVariable; - public override string Name { get; } - protected abstract string InnerPrefix { get; } - /// - /// The parameters which were not consumed, and thus were passed to the inner variable. - /// - protected readonly string[] InnerParameters; - - protected StateModifierWrapper(string name, LogicManager lm) - { - Name = name; - try - { - int i = name.IndexOf('['); - string innerName; - if (i >= 0 && VariableResolver.TryMatchPrefix(name, name.Substring(0, i), out string[] parameters)) - { - InnerParameters = parameters.Where(p => !Consume(p)).ToArray(); - innerName = InnerParameters.Length > 0 ? $"{InnerPrefix}[{string.Join(",", InnerParameters)}]" : InnerPrefix; - } - else - { - InnerParameters = Array.Empty(); - innerName = InnerPrefix; - } - InnerVariable = (T)lm.GetVariableStrict(innerName); - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing " + GetType().Name, e); - } - } - - /// - /// Indicates that the parameter should not be passed to the inner variable. - /// - protected virtual bool Consume(string parameter) => false; - } -} diff --git a/RandomizerMod/RC/StateVariables/TakeDamageVariable.cs b/RandomizerMod/RC/StateVariables/TakeDamageVariable.cs deleted file mode 100644 index af505a6..0000000 --- a/RandomizerMod/RC/StateVariables/TakeDamageVariable.cs +++ /dev/null @@ -1,56 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerMod.RC.StateVariables -{ - /* - * Prefix: $TAKEDAMAGE - * Required Parameters: - - If any parameters are provided, the first parameter must parse to int to give the damage amount. If absent, defaults to 1. - * Optional Parameters: none - * Implements taking damage from a single hit. Assumes enough time to focus/hiveblood before and after the hit. - */ - public class TakeDamageVariable : StateModifier - { - public override string Name { get; } - public const string Prefix = "$TAKEDAMAGE"; - protected readonly int Amount; - protected readonly IHPStateManager HPSM; - - public TakeDamageVariable(string name, LogicManager lm, int amount) - { - Name = name; - Amount = amount; - try - { - HPSM = (IHPStateManager)lm.GetVariableStrict(HPStateManager.Prefix); - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing TakeDamageVariable", e); - } - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (VariableResolver.TryMatchPrefix(term, Prefix, out string[] parameters)) - { - int amount = parameters.Length == 0 ? 1 : int.Parse(parameters[0]); - variable = new TakeDamageVariable(term, lm, amount); - return true; - } - variable = default; - return false; - } - - public override IEnumerable GetTerms() - { - return HPSM.GetTerms(IHPStateManager.HPSMOperation.TakeDamage); - } - - public override IEnumerable ModifyState(object? sender, ProgressionManager pm, LazyStateBuilder state) - { - return HPSM.TakeDamage(pm, state, Amount); - } - } -} diff --git a/RandomizerMod/RC/StateVariables/WarpToBenchResetVariable.cs b/RandomizerMod/RC/StateVariables/WarpToBenchResetVariable.cs deleted file mode 100644 index 99244ee..0000000 --- a/RandomizerMod/RC/StateVariables/WarpToBenchResetVariable.cs +++ /dev/null @@ -1,60 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerMod.RC.StateVariables -{ - /* - * Prefix: $WARPTOBENCH - * Required Parameters: none - * Optional Parameters: none - * Provides the effect of warping to a bench via Benchwarp or savequit. Does not verify whether the player can warp to a bench. - */ - public class WarpToBenchResetVariable : StateModifier - { - public override string Name { get; } - public const string Prefix = "$WARPTOBENCH"; - - protected readonly SaveQuitResetVariable SaveQuitReset; - protected readonly BenchResetVariable BenchReset; - - public WarpToBenchResetVariable(string name, LogicManager lm) - { - Name = name; - try - { - SaveQuitReset = (SaveQuitResetVariable)lm.GetVariableStrict(SaveQuitResetVariable.Prefix); - BenchReset = (BenchResetVariable)lm.GetVariableStrict(BenchResetVariable.Prefix); - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing WarpToBenchResetVariable", e); - } - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (VariableResolver.TryMatchPrefix(term, Prefix, out _)) - { - variable = new WarpToBenchResetVariable(term, lm); - return true; - } - variable = default; - return false; - } - - public override IEnumerable? ProvideState(object? sender, ProgressionManager pm) - { - return []; - } - - public override IEnumerable ModifyState(object? sender, ProgressionManager pm, LazyStateBuilder state) - { - return SaveQuitReset.ModifyState(sender, pm, state).SelectMany(s => BenchReset.ModifyState(sender, pm, s)); - } - - public override IEnumerable GetTerms() - { - return SaveQuitReset.GetTerms().Concat(BenchReset.GetTerms()); - } - } -} diff --git a/RandomizerMod/RC/StateVariables/WarpToStartResetVariable.cs b/RandomizerMod/RC/StateVariables/WarpToStartResetVariable.cs deleted file mode 100644 index d1dc73b..0000000 --- a/RandomizerMod/RC/StateVariables/WarpToStartResetVariable.cs +++ /dev/null @@ -1,60 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerMod.RC.StateVariables -{ - /* - * Prefix: $WARPTOSTART - * Required Parameters: none - * Optional Parameters: none - * Provides the effect of warping to start via Benchwarp or savequit. - */ - public class WarpToStartResetVariable : StateModifier - { - public override string Name { get; } - public const string Prefix = "$WARPTOSTART"; - - protected readonly SaveQuitResetVariable SaveQuitReset; - protected readonly StartRespawnResetVariable StartRespawnReset; - - public WarpToStartResetVariable(string name, LogicManager lm) - { - Name = name; - try - { - SaveQuitReset = (SaveQuitResetVariable)lm.GetVariableStrict(SaveQuitResetVariable.Prefix); - StartRespawnReset = (StartRespawnResetVariable)lm.GetVariableStrict(StartRespawnResetVariable.Prefix); - } - catch (Exception e) - { - throw new InvalidOperationException("Error constructing WarpToStartResetVariable", e); - } - } - - public static bool TryMatch(LogicManager lm, string term, out LogicVariable variable) - { - if (VariableResolver.TryMatchPrefix(term, Prefix, out _)) - { - variable = new WarpToStartResetVariable(term, lm); - return true; - } - variable = default; - return false; - } - - public override IEnumerable? ProvideState(object? sender, ProgressionManager pm) - { - return Enumerable.Empty(); - } - - public override IEnumerable ModifyState(object? sender, ProgressionManager pm, LazyStateBuilder state) - { - return SaveQuitReset.ModifyState(sender, pm, state).SelectMany(s => StartRespawnReset.ModifyState(sender, pm, s)); - } - - public override IEnumerable GetTerms() - { - return SaveQuitReset.GetTerms().Concat(StartRespawnReset.GetTerms()); - } - } -} diff --git a/RandomizerMod/RC/StateVariables/WhiteFragmentEquipVariable.cs b/RandomizerMod/RC/StateVariables/WhiteFragmentEquipVariable.cs deleted file mode 100644 index 6fb4141..0000000 --- a/RandomizerMod/RC/StateVariables/WhiteFragmentEquipVariable.cs +++ /dev/null @@ -1,35 +0,0 @@ -using RandomizerCore.Logic; - -namespace RandomizerMod.RC.StateVariables -{ - /* - * Equip logic for Kingsoul/Void Heart. See documentation for EquipCharmVariable for variable pattern. - */ - public class WhiteFragmentEquipVariable : EquipCharmVariable - { - protected readonly int Threshold; - - public WhiteFragmentEquipVariable(string name, string charmName, LogicManager lm) : base(name, "WHITEFRAGMENT", 36, lm) - { - Threshold = charmName switch - { - "Void_Heart" => 3, - "Kingsoul" or _ => 2, - }; - } - - public override bool HasCharmProgression(ProgressionManager pm) - { - return pm.Has(CharmTerm, Threshold); - } - - public override int GetNotchCost(ProgressionManager pm, T state) - { - return pm.Get(CharmTerm) switch - { - <= 2 => base.GetNotchCost(pm, state), - > 2 => 0, - }; - } - } -} diff --git a/RandomizerMod/RC/TransitionPlacement.cs b/RandomizerMod/RC/TransitionPlacement.cs deleted file mode 100644 index 74cd188..0000000 --- a/RandomizerMod/RC/TransitionPlacement.cs +++ /dev/null @@ -1,16 +0,0 @@ -using RandomizerCore; - -namespace RandomizerMod.RC -{ - public record struct TransitionPlacement(RandoModTransition Target, RandoModTransition Source) - { - public void Deconstruct(out RandoModTransition target, out RandoModTransition source) - { - target = this.Target; - source = this.Source; - } - - public static implicit operator GeneralizedPlacement(TransitionPlacement p) => new(p.Target, p.Source); - public static explicit operator TransitionPlacement(GeneralizedPlacement p) => new((RandoModTransition)p.Item, (RandoModTransition)p.Location); - } -} diff --git a/RandomizerMod/RandomizerData/CostDef.cs b/RandomizerMod/RandomizerData/CostDef.cs deleted file mode 100644 index 35d723d..0000000 --- a/RandomizerMod/RandomizerData/CostDef.cs +++ /dev/null @@ -1,17 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerMod.RC; - -namespace RandomizerMod.RandomizerData -{ - public record CostDef(string Term, int Amount) - { - public virtual LogicCost ToLogicCost(LogicManager lm) - { - return Term switch - { - "GEO" => new LogicGeoCost(lm, Amount), - _ => new SimpleCost(lm.GetTermStrict(Term), Amount), - }; - } - } -} diff --git a/RandomizerMod/RandomizerData/Data.cs b/RandomizerMod/RandomizerData/Data.cs deleted file mode 100644 index f8ecb6e..0000000 --- a/RandomizerMod/RandomizerData/Data.cs +++ /dev/null @@ -1,250 +0,0 @@ -using RandomizerMod.Settings; -using System.Collections.ObjectModel; - -namespace RandomizerMod.RandomizerData -{ - public struct WaypointDef - { - public string name; - public string itemLogic; - public string areaLogic; - } - - public static class Data - { - // Items - public static ReadOnlyDictionary Items { get; private set; } - private static Dictionary _items; - - // Locations - public static ReadOnlyDictionary Locations { get; private set; } - private static Dictionary _locations; - - // Transitions - public static ReadOnlyDictionary Transitions { get; private set; } - private static Dictionary _transitions; - - // Rooms - public static ReadOnlyDictionary Rooms { get; private set; } - private static Dictionary _rooms; - - // Starts - public static ReadOnlyDictionary Starts { get; private set; } - private static Dictionary _starts; - - // Logic Settings - public static ReadOnlyDictionary LogicSettings { get; private set; } - private static Dictionary _logicSettings; // name in logic --> settings path - - // Costs - public static ReadOnlyDictionary Costs { get; private set; } - private static Dictionary _costs; - - public static ReadOnlyDictionary PoolLookup { get; private set; } - private static Dictionary _pools; - public static ReadOnlyCollection PoolList { get; private set; } - private static PoolDef[] __pools; - public static IEnumerable Pools => PoolList; - - #region Item Methods - - public static ItemDef GetItemDef(string name) - { - if (_items.TryGetValue(name, out var def)) return def; - return null; - } - - public static ItemDef[] GetItemArray() - { - return _items.Values.ToArray(); - } - - public static bool IsItem(string item) - { - return _items.ContainsKey(item); - } - - #endregion - #region Location Methods - - public static LocationDef GetLocationDef(string name) - { - if (_locations.TryGetValue(name, out var def)) return def; - return null; - } - - - public static LocationDef[] GetLocationArray() - { - return _locations.Values.ToArray(); - } - - public static bool IsLocation(string location) - { - return _locations.ContainsKey(location); - } - - #endregion - #region Transition Methods - public static TransitionDef GetTransitionDef(string name) - { - if (_transitions.TryGetValue(name, out TransitionDef def)) return def; - return null; - } - - public static IEnumerable GetMapAreaTransitionNames() - { - return _transitions.Where(kvp => kvp.Value.IsMapAreaTransition).Select(kvp => kvp.Key); - } - - public static IEnumerable GetAreaTransitionNames() - { - return _transitions.Where(kvp => kvp.Value.IsTitledAreaTransition).Select(kvp => kvp.Key); - } - - public static IEnumerable GetRoomTransitionNames() - { - return _transitions.Keys; - } - - public static bool IsMapAreaTransition(string str) - { - return _transitions.TryGetValue(str, out TransitionDef def) && def.IsMapAreaTransition; - } - - public static bool IsAreaTransition(string str) - { - return _transitions.TryGetValue(str, out TransitionDef def) && def.IsTitledAreaTransition; - } - - public static bool IsTransition(string str) - { - return _transitions.ContainsKey(str); - } - - public static bool IsTransitionWithEntry(string str) - { - return _transitions.TryGetValue(str, out var def) && def.Sides != TransitionSides.OneWayOut; - } - - public static bool IsExitOnlyTransition(string str) - { - return _transitions.TryGetValue(str, out var def) && def.Sides == TransitionSides.OneWayOut; - } - - public static bool IsEnterOnlyTransition(string str) - { - return _transitions.TryGetValue(str, out var def) && def.Sides == TransitionSides.OneWayIn; - } - #endregion - - #region Room Methods - - public static RoomDef GetRoomDef(string name) - { - if (name is null) - { - return null; - } - if (!_rooms.TryGetValue(name, out RoomDef def)) - { - return null; - } - return def; - } - - public static bool IsRoom(string str) - { - return str is not null && _rooms.ContainsKey(str); - } - - #endregion - - #region Start Methods - - public static bool IsStart(string str) - { - return _starts.ContainsKey(str); - } - - public static StartDef GetStartDef(string str) - { - if (_starts.TryGetValue(str, out StartDef def)) return def; - return null; - } - - public static IEnumerable GetStartNames() - { - return _starts.Keys; - } - - #endregion - - #region Logic Settings Methods - - public static bool IsLogicSetting(string str) - { - return _logicSettings.ContainsKey(str); - } - - public static string[] GetLogicNames() - { - return _logicSettings.Keys.ToArray(); - } - - public static IEnumerable GetApplicableLogicSettings(GenerationSettings settings) - { - return _logicSettings.Where(kvp => (bool)Util.Get(settings, kvp.Value)).Select(kvp => kvp.Key); - } - - #endregion - - #region Cost Methods - - public static bool TryGetCost(string name, out CostDef def) => _costs.TryGetValue(name, out def); - - #endregion - - public static PoolDef GetPoolDef(string name) - { - if (_pools.TryGetValue(name, out var def)) return def; - return null; - } - - private static bool _loaded; - public static void Load() - { - if (_loaded) return; - - _items = JsonUtil.Deserialize>("RandomizerMod.Resources.Data.items.json"); - Items = new(_items); - - _locations = JsonUtil.Deserialize>("RandomizerMod.Resources.Data.locations.json"); - Locations = new(_locations); - - _logicSettings = JsonUtil.Deserialize>("RandomizerMod.Resources.Data.logic_settings.json"); - LogicSettings = new(_logicSettings); - - __pools = JsonUtil.Deserialize("RandomizerMod.Resources.Data.pools.json"); - PoolList = new(__pools); - - _pools = __pools.ToDictionary(def => def.Name); - PoolLookup = new(_pools); - - _starts = JsonUtil.Deserialize>("RandomizerMod.Resources.Data.starts.json"); - Starts = new(_starts); - - _transitions = JsonUtil.Deserialize>("RandomizerMod.Resources.Data.transitions.json"); - Transitions = new(_transitions); - - _rooms = JsonUtil.Deserialize>("RandomizerMod.Resources.Data.rooms.json"); - Rooms = new(_rooms); - - _costs = JsonUtil.Deserialize>("RandomizerMod.Resources.Data.costs.json"); - Costs = new(_costs); - - _loaded = true; - } - - } -} diff --git a/RandomizerMod/RandomizerData/ItemDef.cs b/RandomizerMod/RandomizerData/ItemDef.cs deleted file mode 100644 index 3f633db..0000000 --- a/RandomizerMod/RandomizerData/ItemDef.cs +++ /dev/null @@ -1,54 +0,0 @@ -namespace RandomizerMod.RandomizerData -{ - public record ItemDef - { - public string Name { get; init; } - public string Pool { get; init; } // for items in multiple pools, give the most common pool. - public int PriceCap { get; init; } - public bool MajorItem { get; init; } // reserved for the most useful items in the randomizer, used by CursedSettings to penalize progression - } - - /* - [Flags] - public enum ItemPoolFlags : long - { - None = 0L, - IsSkill = 1L << 0, - IsKey = 1L << 1, - IsCharm = 1L << 2, - IsMask = 1L << 3, - IsVessel = 1L << 4, - IsNotch = 1L << 5, - IsOre = 1L << 6, - IsGeoChest = 1L << 7, - IsEgg = 1L << 8, - IsRelic = 1L << 9, - IsRoot = 1L << 10, - IsDreamWarriorEssence = 1L << 11, - IsDreamBossEssence = 1L << 12, - IsGrub = 1L << 13, - IsMimic = 1L << 14, - IsMap = 1L << 15, - IsStag = 1L << 16, - IsCocoon = 1L << 17, - IsFlame = 1L << 18, - IsHunterJournalEntry = 1L << 19, - IsRock = 1L << 20, - IsSoul = 1L << 21, - IsLore = 1L << 22, - IsCustomAbility = 1L << 23, - IsDreamer = 1L << 24, // oops - } - - [Flags] - public enum ItemPropertyFlags : long - { - None = 0L, - IsUnique = 1L << 0, - IsBigItem = 1L << 1, - IsSpell = 1L << 2, - IsGeo = 1L << 3, - // ??? - } - */ -} diff --git a/RandomizerMod/RandomizerData/JsonUtil.cs b/RandomizerMod/RandomizerData/JsonUtil.cs deleted file mode 100644 index 8076a7b..0000000 --- a/RandomizerMod/RandomizerData/JsonUtil.cs +++ /dev/null @@ -1,63 +0,0 @@ -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; -using Newtonsoft.Json.Converters; -using System.IO; -using System.Reflection; - -namespace RandomizerMod.RandomizerData -{ - public static class JsonUtil - { - public static readonly JsonSerializer _js; - - public static T Deserialize(string embeddedResourcePath) - { - using (StreamReader sr = new StreamReader(typeof(JsonUtil).Assembly.GetManifestResourceStream(embeddedResourcePath))) - using (var jtr = new JsonTextReader(sr)) - { - return _js.Deserialize(jtr); - } - } - - public static T DeserializeString(string json) - { - using (StringReader sr = new StringReader(json)) - using (var jtr = new JsonTextReader(sr)) - { - return _js.Deserialize(jtr); - } - } - - public static void Serialize(object o, string fileName) - { - File.WriteAllText(Path.Combine(Path.GetDirectoryName(typeof(JsonUtil).Assembly.Location), fileName), Serialize(o)); - } - - public static string Serialize(object o) - { - using (StringWriter sw = new StringWriter()) - { - _js.Serialize(sw, o); - sw.Flush(); - return sw.ToString(); - } - } - - public static void Serialize(TextWriter tw, object o) - { - _js.Serialize(tw, o); - } - - static JsonUtil() - { - _js = new JsonSerializer - { - DefaultValueHandling = DefaultValueHandling.Include, - Formatting = Formatting.Indented, - TypeNameHandling = TypeNameHandling.Auto, - }; - - _js.Converters.Add(new StringEnumConverter()); - } - } -} diff --git a/RandomizerMod/RandomizerData/LocationDef.cs b/RandomizerMod/RandomizerData/LocationDef.cs deleted file mode 100644 index 09ba9ea..0000000 --- a/RandomizerMod/RandomizerData/LocationDef.cs +++ /dev/null @@ -1,63 +0,0 @@ -using Newtonsoft.Json; - -namespace RandomizerMod.RandomizerData -{ - public record LocationDef - { - public string Name { get; init; } - public string SceneName { get; init; } - [JsonIgnore] public virtual string TitledArea { get => Data.GetRoomDef(SceneName)?.TitledArea; } - [JsonIgnore] public virtual string MapArea { get => Data.GetRoomDef(SceneName)?.MapArea; } - /// - /// If true, copies of this location after the first may be shuffled among other flexible count locations by the RequestBuilder. - /// - public bool FlexibleCount { get; init; } - /// - /// If true, copies of this location after the first will receive severe penalties to prevent multiple progression items. - /// - public bool AdditionalProgressionPenalty { get; init; } - } - - // Incomplete ideas for potential enhancements below: - /* - [Flags] - public enum LocationPoolFlags : long - { - None = 0L, - IsSkill = 1L << 0, - IsKey = 1L << 1, - IsCharm = 1L << 2, - IsMask = 1L << 3, - IsVessel = 1L << 4, - IsNotch = 1L << 5, - IsOre = 1L << 6, - IsGeoChest = 1L << 7, - IsEgg = 1L << 8, - IsRelic = 1L << 9, - IsRoot = 1L << 10, - IsDreamWarriorEssence = 1L << 11, - IsDreamBossEssence = 1L << 12, - IsGrub = 1L << 13, - IsMimic = 1L << 14, - IsMap = 1L << 15, - IsStag = 1L << 16, - IsCocoon = 1L << 17, - IsFlame = 1L << 18, - IsHunterJournalEntry = 1L << 19, - IsRock = 1L << 20, - IsSoul = 1L << 21, - IsLore = 1L << 22, - IsCustomAbility = 1L << 23, - IsDreamer = 1L << 24, // oops - } - - [Flags] - public enum LocationPropertyFlags : long - { - None, - - IsChest, - IsShop, - } - */ -} diff --git a/RandomizerMod/RandomizerData/PoolDef.cs b/RandomizerMod/RandomizerData/PoolDef.cs deleted file mode 100644 index 7f8320e..0000000 --- a/RandomizerMod/RandomizerData/PoolDef.cs +++ /dev/null @@ -1,38 +0,0 @@ -namespace RandomizerMod.RandomizerData -{ - /// - /// Data structure representing a collection of items and locations that can be optionally randomized. - /// - public class PoolDef - { - /// - /// The name of the pool. - /// - public string Name { get; init; } - /// - /// A slightly broader classification which merges smaller pools into larger ones (e.g. Focus into Skill, etc). Used by SplitGroupSettings. - /// - public string Group { get; init; } - public string Path { get; init; } - public string[] IncludeItems { get; init; } - public string[] IncludeLocations { get; init; } - public VanillaDef[] Vanilla { get; init; } - - public bool IsIncluded(Settings.GenerationSettings gs) - { - if (!string.IsNullOrEmpty(Path) - && Settings.Util.Get(gs, Path) is bool value - && value) return true; - else return false; - } - - public bool IsVanilla(Settings.GenerationSettings gs) - { - if (!string.IsNullOrEmpty(Path) - && Settings.Util.Get(gs, Path) is bool value - && !value) return true; - else return false; - } - - } -} diff --git a/RandomizerMod/RandomizerData/PoolNames.cs b/RandomizerMod/RandomizerData/PoolNames.cs deleted file mode 100644 index 4241ef9..0000000 --- a/RandomizerMod/RandomizerData/PoolNames.cs +++ /dev/null @@ -1,43 +0,0 @@ -namespace RandomizerMod.RandomizerData -{ - public static class PoolNames - { - public const string Dreamer = "Dreamer"; - public const string Skill = "Skill"; - public const string Charm = "Charm"; - public const string Key = "Key"; - public const string Focus = "Focus"; - public const string Swim = "Swim"; - public const string Mask = "Mask"; - public const string CursedMask = "CursedMask"; - public const string Vessel = "Vessel"; - public const string Notch = "Notch"; - public const string SalubraNotch = "SalubraNotch"; - public const string CursedNotch = "CursedNotch"; - public const string Ore = "Ore"; - public const string Geo = "Geo"; - public const string JunkPitChest = "JunkPitChest"; - public const string Egg = "Egg"; - public const string Relic = "Relic"; - public const string Root = "Root"; - public const string DreamWarrior = "DreamWarrior"; - public const string DreamBoss = "DreamBoss"; - public const string Grub = "Grub"; - public const string Mimic = "Mimic"; - public const string Map = "Map"; - public const string Stag = "Stag"; - public const string Cocoon = "Cocoon"; - public const string Flame = "Flame"; - public const string Journal = "Journal"; - public const string ElevatorPass = "ElevatorPass"; - public const string SplitCloak = "SplitCloak"; - public const string SplitClaw = "SplitClaw"; - public const string CursedNail = "CursedNail"; - public const string SplitSuperdash = "SplitSuperdash"; - public const string EggShop = "EggShop"; - public const string Rock = "Rock"; - public const string Boss_Geo = "Boss_Geo"; - public const string Soul = "Soul"; - public const string Lore = "Lore"; - } -} diff --git a/RandomizerMod/RandomizerData/RoomDef.cs b/RandomizerMod/RandomizerData/RoomDef.cs deleted file mode 100644 index d7495d7..0000000 --- a/RandomizerMod/RandomizerData/RoomDef.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace RandomizerMod.RandomizerData -{ - public record RoomDef - { - public string SceneName { get; init; } - public string MapArea { get; init; } - public string TitledArea { get; init; } - } -} diff --git a/RandomizerMod/RandomizerData/StartDef.cs b/RandomizerMod/RandomizerData/StartDef.cs deleted file mode 100644 index 0bed108..0000000 --- a/RandomizerMod/RandomizerData/StartDef.cs +++ /dev/null @@ -1,100 +0,0 @@ -using GlobalEnums; -using RandomizerCore; -using RandomizerCore.Logic; -using RandomizerMod.Settings; - -namespace RandomizerMod.RandomizerData -{ - public record StartDef - { - /// - /// The name of the start. Names should be unique. - /// - public string Name { get; init; } - /// - /// The scene of the start location in-game. - /// - public string SceneName { get; init; } - /// - /// The x-coordinate of the start location in-game. - /// - public float X { get; init; } - /// - /// The y-coordinate of the start location in-game. - /// - public float Y { get; init; } - /// - /// The map zone of the start location in-game. - /// - public MapZone Zone { get; init; } - - /// - /// The transition which is used as the initial logical progression for this start location. - /// - public string Transition { get; init; } - - /// - /// Logic evaluated by the SettingsPM to determine whether the start can be selected in the menu. Must not be null. - /// - public string Logic { get; init; } - /// - /// Logic evaluated by the SettingsPM to determine whether the start can be randomly selected. If null, Logic is used instead. - /// - public string RandoLogic { get; init; } - /// - /// Flag which determines whether the start is given a button in the Start Locations menu. Hidden starts can still be randomly selected. - /// - public bool ExcludeFromMenu { get; init; } - - public virtual bool CanBeSelected(SettingsPM pm) - { - try - { - return pm.Evaluate(Logic); - } - catch (Exception e) - { - throw new InvalidOperationException($"Error determining menu selectability of StartDef {Name}", e); - } - } - - public virtual bool CanBeRandomized(SettingsPM pm) - { - try - { - return pm.Evaluate(RandoLogic ?? Logic); - } - catch (Exception e) - { - throw new InvalidOperationException($"Error determining randomizability of StartDef {Name}", e); - } - } - - public virtual bool DisplayInMenu(SettingsPM pm) - { - return !ExcludeFromMenu; - } - - /// - /// Returns a sequence of term values which will be treated as setters by the ProgressionInitializer. - ///
State-valued terms in the sequence will be linked to Start_State, regardless of the int parameter. - ///
- public virtual IEnumerable GetStartLocationProgression(LogicManager lm) - { - yield return new(lm.GetTermStrict(Transition), 1); - } - - public virtual ItemChanger.StartDef ToItemChangerStartDef() - { - return new ItemChanger.StartDef - { - SceneName = SceneName, - X = X, - Y = Y, - MapZone = (int)Zone, - RespawnFacingRight = true, - SpecialEffects = ItemChanger.SpecialStartEffects.Default | ItemChanger.SpecialStartEffects.SlowSoulRefill, - }; - } - } -} diff --git a/RandomizerMod/RandomizerData/TransitionDef.cs b/RandomizerMod/RandomizerData/TransitionDef.cs deleted file mode 100644 index d6d8e4b..0000000 --- a/RandomizerMod/RandomizerData/TransitionDef.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Newtonsoft.Json; - -namespace RandomizerMod.RandomizerData -{ - public record TransitionDef - { - [JsonIgnore] public string Name => $"{SceneName}[{DoorName}]"; - public string SceneName { get; init; } - public string DoorName { get; init; } - [JsonIgnore] public virtual string TitledArea { get => Data.GetRoomDef(SceneName)?.TitledArea; } - [JsonIgnore] public virtual string MapArea { get => Data.GetRoomDef(SceneName)?.MapArea; } - public string VanillaTarget { get; init; } - public TransitionDirection Direction { get; init; } - public bool IsTitledAreaTransition { get; init; } - public bool IsMapAreaTransition { get; init; } - public TransitionSides Sides { get; init; } - } - - public enum TransitionSides - { - Both = 0, - /// - /// A one way transition exiting a scene. - /// - OneWayIn = 1, - /// - /// A one way transition entering a scene. - /// - OneWayOut = 2, - } - - public enum TransitionDirection - { - Door, - Left, - Right, - Top, - Bot, - } - -} diff --git a/RandomizerMod/RandomizerData/VanillaDef.cs b/RandomizerMod/RandomizerData/VanillaDef.cs deleted file mode 100644 index 0664fe3..0000000 --- a/RandomizerMod/RandomizerData/VanillaDef.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace RandomizerMod.RandomizerData -{ - public record VanillaDef(string Item, string Location, CostDef[]? Costs = null) - { - public virtual bool Equals(VanillaDef other) - { - return other != null && Item == other.Item && Location == other.Location && - (Costs == other.Costs || (Costs != null && other.Costs != null && Costs.SequenceEqual(other.Costs))); - } - - public override int GetHashCode() - { - return Item.GetHashCode() ^ Location.GetHashCode() + (Costs != null ? Costs.Length : -1); - } - } -} diff --git a/RandomizerMod/RandomizerMod.cs b/RandomizerMod/RandomizerMod.cs deleted file mode 100644 index 313ddee..0000000 --- a/RandomizerMod/RandomizerMod.cs +++ /dev/null @@ -1,100 +0,0 @@ -using Modding; -using RandomizerMod.Extensions; -using RandomizerMod.Logging; -using RandomizerMod.Settings; -using System.Reflection; - -namespace RandomizerMod -{ - public class RandomizerMod : Mod, IGlobalSettings, ILocalSettings, ICustomMenuMod - { - /// - /// Returns true if the currently loaded settings contain valid RandomizerMod data. - /// - public static bool IsRandoSave { get => RS != null && RS.GenerationSettings != null && RS.ProfileID >= 0; } - public override string GetVersion() => Version; - - public static GlobalSettings GS { get; private set; } = new(); - public static RandomizerSettings RS { get; internal set; } = new(); - - public static ItemChanger.Internal.SpriteManager SpriteManager { get; private set; } - - public RandomizerMod() : base("Randomizer 4") { } - - public override void Initialize() - { - base.Initialize(); - LogHelper.OnLog += Log; - RandomizerCore.LogHelper.OnLog += new SimpleLogger(nameof(RandomizerCore)).Log; - Logging.LogManager.Initialize(); - LocalizationData.Load(); - SpriteManager = new(Assembly, "RandomizerMod.Resources."); - - try - { - RandomizerData.Data.Load(); - } - catch (Exception e) - { - LogError($"Error loading RandomizerData!\n{e}"); - throw; - } - - MenuChanger.ModeMenu.AddMode(new Menu.RandomizerMenuConstructor()); - Log("Initialization complete."); - } - - - public static string GetSHA1() - { - using var sha1 = System.Security.Cryptography.SHA1.Create(); - using var sr = File.OpenRead(Location); - return Convert.ToBase64String(sha1.ComputeHash(sr)); - } - - public void OnLoadGlobal(GlobalSettings s) - { - GS = !GlobalSettings.IsInvalid(s) ? s : new(); - } - - public GlobalSettings OnSaveGlobal() - { - return GS; - } - - public void OnLoadLocal(RandomizerSettings s) - { - LogManager.WaitForQueue(); - RS = s; - RS?.Setup(); - } - - public RandomizerSettings OnSaveLocal() - { - return RS; - } - - public static string Folder { get; } - public static string Location { get; } - public static Assembly Assembly { get; } - public static string SHA1 { get; } - public static string Version { get; } - - static RandomizerMod() - { - Assembly = typeof(RandomizerMod).Assembly; - Location = Assembly.Location; - Folder = Path.GetDirectoryName(Location); - SHA1 = GetSHA1(); - System.Version v = Assembly.GetName().Version; - int buildHash = Math.Abs(SHA1.GetStableHashCode()) % 997; - Version = $"{v.Major}.{v.Minor}.{v.Build}+{buildHash.ToString().PadLeft(3, '0')}"; - } - - public bool ToggleButtonInsideMenu => false; - public MenuScreen GetMenuScreen(MenuScreen modListMenu, ModToggleDelegates? _) - { - return Menu.ModMenu.GetRandomizerMenuScreen(modListMenu); - } - } -} \ No newline at end of file diff --git a/RandomizerMod/RandomizerMod.csproj b/RandomizerMod/RandomizerMod.csproj deleted file mode 100644 index 80db227..0000000 --- a/RandomizerMod/RandomizerMod.csproj +++ /dev/null @@ -1,98 +0,0 @@ - - - {8B1AB441-2E8A-49EB-87BD-8E1C9729AD00} - net472 - RandomizerMod - RandomizerMod - 4.1.6 - false - preview - true - true - annotations - true - 1701;1702;CS1591 - ..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Hollow Knight\hollow_knight_Data\Managed - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(HollowKnightRefs)\Assembly-CSharp.dll - - - $(HollowKnightRefs)\Mods\ItemChanger\ItemChanger.dll - - - $(HollowKnightRefs)\Mods\MenuChanger\MenuChanger.dll - - - $(HollowKnightRefs)\MMHOOK_Assembly-CSharp.dll - - - $(HollowKnightRefs)\MMHOOK_PlayMaker.dll - - - $(HollowKnightRefs)\Newtonsoft.Json.dll - - - $(HollowKnightRefs)\PlayMaker.dll - - - $(HollowKnightRefs)\Mods\RandomizerCore\RandomizerCore.dll - - - $(HollowKnightRefs)\Mods\RandomizerCore.Json\RandomizerCore.Json.dll - - - $(HollowKnightRefs)\UnityEngine.dll - - - $(HollowKnightRefs)\UnityEngine.CoreModule.dll - - - $(HollowKnightRefs)\UnityEngine.ImageConversionModule.dll - - - $(HollowKnightRefs)\UnityEngine.IMGUIModule.dll - - - $(HollowKnightRefs)\UnityEngine.TextRenderingModule.dll - - - $(HollowKnightRefs)\UnityEngine.UI.dll - - - - - - - - - - - \ No newline at end of file diff --git a/RandomizerMod/Resources/Data/costs.json b/RandomizerMod/Resources/Data/costs.json deleted file mode 100644 index 59aee89..0000000 --- a/RandomizerMod/Resources/Data/costs.json +++ /dev/null @@ -1,187 +0,0 @@ -{ - // This file documents nonrandomized costs. - // Vanilla costs for randomizable costs are found in the vanilla sections of the pools.json. - // Note: the amount on a geo cost does not affect its logic. - // A negative geo cost on one of the 5 base shop locations is randomized at the end of randomization. - "Sly": { - "term": "GEO", - "amount": -1 - }, - "Sly_(Key)": { - "term": "GEO", - "amount": -1 - }, - "Iselda": { - "term": "GEO", - "amount": -1 - }, - "Salubra": { - "term": "GEO", - "amount": -1 - }, - "Leg_Eater": { - "term": "GEO", - "amount": -1 - }, - "Lurien": { - "term": "DREAMNAIL", - "amount": 1 - }, - "Monomon": { - "term": "DREAMNAIL", - "amount": 1 - }, - "Herrah": { - "term": "DREAMNAIL", - "amount": 1 - }, - "Abyss_Shriek": { - "term": "SCREAM", - "amount": 1 - }, - "Dash_Slash": { - "term": "GEO", - "amount": 800 - }, - "Void_Heart": { - "term": "DREAMNAIL", - "amount": 1 - }, - // unbreakables at 5% of vanilla price - "Unbreakable_Heart": { - "term": "GEO", - "amount": 600 - }, - "Unbreakable_Greed": { - "term": "GEO", - "amount": 450 - }, - "Unbreakable_Strength": { - "term": "GEO", - "amount": 750 - }, - "Godtuner": { - "term": "SIMPLE", - "amount": 1 - }, - "Vessel_Fragment-Basin": { - "term": "GEO", - "amount": 3000 - }, - "Crossroads_Map": { - "term": "GEO", - "amount": 30 - }, - "Greenpath_Map": { - "term": "GEO", - "amount": 60 - }, - "Fog_Canyon_Map": { - "term": "GEO", - "amount": 150 - }, - "Fungal_Wastes_Map": { - "term": "GEO", - "amount": 75 - }, - "Deepnest_Map-Upper": { - "term": "GEO", - "amount": 38 - }, - "Deepnest_Map-Right": { - "term": "GEO", - "amount": 38 - }, - "Ancient_Basin_Map": { - "term": "GEO", - "amount": 112 - }, - "Kingdom's_Edge_Map": { - "term": "GEO", - "amount": 112 - }, - "City_of_Tears_Map": { - "term": "GEO", - "amount": 90 - }, - "Royal_Waterways_Map": { - "term": "GEO", - "amount": 75 - }, - "Howling_Cliffs_Map": { - "term": "GEO", - "amount": 75 - }, - "Crystal_Peak_Map": { - "term": "GEO", - "amount": 112 - }, - "Queen's_Gardens_Map": { - "term": "GEO", - "amount": 150 - }, - "Resting_Grounds_Map": { - "term": "GEO", - "amount": 56 - }, - "Crossroads_Stag": { - "term": "GEO", - "amount": 50 - }, - "Greenpath_Stag": { - "term": "GEO", - "amount": 140 - }, - "Queen's_Station_Stag": { - "term": "GEO", - "amount": 120 - }, - "Queen's_Gardens_Stag": { - "term": "GEO", - "amount": 200 - }, - "City_Storerooms_Stag": { - "term": "GEO", - "amount": 200 - }, - "King's_Station_Stag": { - "term": "GEO", - "amount": 300 - }, - "Distant_Village_Stag": { - "term": "GEO", - "amount": 250 - }, - "Hidden_Station_Stag": { - "term": "GEO", - "amount": 300 - }, - "Stag_Nest_Stag": { - "term": "GEO", - "amount": 300 - }, - "Elevator_Pass": { - "term": "GEO", - "amount": 150 - }, - "Lore_Tablet-Spore_Shroom": { - "term": "Spore_Shroom", - "amount": 1 - }, - "Lore_Tablet-Fungal_Wastes_Hidden": { - "term": "Spore_Shroom", - "amount": 1 - }, - "Lore_Tablet-Fungal_Wastes_Below_Shrumal_Ogres": { - "term": "Spore_Shroom", - "amount": 1 - }, - "Lore_Tablet-Fungal_Core": { - "term": "Spore_Shroom", - "amount": 1 - }, - "Lore_Tablet-Kingdom's_Edge": { - "term": "Spore_Shroom", - "amount": 1 - } -} \ No newline at end of file diff --git a/RandomizerMod/Resources/Data/items.json b/RandomizerMod/Resources/Data/items.json deleted file mode 100644 index 7adee86..0000000 --- a/RandomizerMod/Resources/Data/items.json +++ /dev/null @@ -1,1496 +0,0 @@ -{ - "Lurien": { - "Name": "Lurien", - "Pool": "Dreamer", - "PriceCap": 500, - "MajorItem": false - }, - "Monomon": { - "Name": "Monomon", - "Pool": "Dreamer", - "PriceCap": 500, - "MajorItem": false - }, - "Herrah": { - "Name": "Herrah", - "Pool": "Dreamer", - "PriceCap": 500, - "MajorItem": false - }, - "World_Sense": { - "Name": "World_Sense", - "Pool": "Dreamer", - "PriceCap": 1, - "MajorItem": false - }, - "Dreamer": { - "Name": "Dreamer", - "Pool": "Fake", - "PriceCap": 500, - "MajorItem": true - }, - "Mothwing_Cloak": { - "Name": "Mothwing_Cloak", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": true - }, - "Mantis_Claw": { - "Name": "Mantis_Claw", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": true - }, - "Crystal_Heart": { - "Name": "Crystal_Heart", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": true - }, - "Monarch_Wings": { - "Name": "Monarch_Wings", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": true - }, - "Shade_Cloak": { - "Name": "Shade_Cloak", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": true - }, - "Isma's_Tear": { - "Name": "Isma's_Tear", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": false - }, - "Dream_Nail": { - "Name": "Dream_Nail", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": true - }, - "Dream_Gate": { - "Name": "Dream_Gate", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": false - }, - "Awoken_Dream_Nail": { - "Name": "Awoken_Dream_Nail", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": false - }, - "Vengeful_Spirit": { - "Name": "Vengeful_Spirit", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": true - }, - "Shade_Soul": { - "Name": "Shade_Soul", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": false - }, - "Desolate_Dive": { - "Name": "Desolate_Dive", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": true - }, - "Descending_Dark": { - "Name": "Descending_Dark", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": false - }, - "Howling_Wraiths": { - "Name": "Howling_Wraiths", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": true - }, - "Abyss_Shriek": { - "Name": "Abyss_Shriek", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": false - }, - "Cyclone_Slash": { - "Name": "Cyclone_Slash", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": false - }, - "Dash_Slash": { - "Name": "Dash_Slash", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": false - }, - "Great_Slash": { - "Name": "Great_Slash", - "Pool": "Skill", - "PriceCap": 500, - "MajorItem": false - }, - "Focus": { - "Name": "Focus", - "Pool": "Focus", - "PriceCap": 500, - "MajorItem": false - }, - "Swim": { - "Name": "Swim", - "Pool": "Swim", - "PriceCap": 500, - "MajorItem": false - }, - "Gathering_Swarm": { - "Name": "Gathering_Swarm", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Wayward_Compass": { - "Name": "Wayward_Compass", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Grubsong": { - "Name": "Grubsong", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Stalwart_Shell": { - "Name": "Stalwart_Shell", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Baldur_Shell": { - "Name": "Baldur_Shell", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Fury_of_the_Fallen": { - "Name": "Fury_of_the_Fallen", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Quick_Focus": { - "Name": "Quick_Focus", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Lifeblood_Heart": { - "Name": "Lifeblood_Heart", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Lifeblood_Core": { - "Name": "Lifeblood_Core", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Defender's_Crest": { - "Name": "Defender's_Crest", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Flukenest": { - "Name": "Flukenest", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Thorns_of_Agony": { - "Name": "Thorns_of_Agony", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Mark_of_Pride": { - "Name": "Mark_of_Pride", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Steady_Body": { - "Name": "Steady_Body", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Heavy_Blow": { - "Name": "Heavy_Blow", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Sharp_Shadow": { - "Name": "Sharp_Shadow", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Spore_Shroom": { - "Name": "Spore_Shroom", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Longnail": { - "Name": "Longnail", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Shaman_Stone": { - "Name": "Shaman_Stone", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Soul_Catcher": { - "Name": "Soul_Catcher", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Soul_Eater": { - "Name": "Soul_Eater", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Glowing_Womb": { - "Name": "Glowing_Womb", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Fragile_Heart": { - "Name": "Fragile_Heart", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Unbreakable_Heart": { - "Name": "Unbreakable_Heart", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Fragile_Greed": { - "Name": "Fragile_Greed", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Unbreakable_Greed": { - "Name": "Unbreakable_Greed", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Fragile_Strength": { - "Name": "Fragile_Strength", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Unbreakable_Strength": { - "Name": "Unbreakable_Strength", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Nailmaster's_Glory": { - "Name": "Nailmaster's_Glory", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Joni's_Blessing": { - "Name": "Joni's_Blessing", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Shape_of_Unn": { - "Name": "Shape_of_Unn", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Hiveblood": { - "Name": "Hiveblood", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Dream_Wielder": { - "Name": "Dream_Wielder", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Dashmaster": { - "Name": "Dashmaster", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Quick_Slash": { - "Name": "Quick_Slash", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Spell_Twister": { - "Name": "Spell_Twister", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Deep_Focus": { - "Name": "Deep_Focus", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Grubberfly's_Elegy": { - "Name": "Grubberfly's_Elegy", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Queen_Fragment": { - "Name": "Queen_Fragment", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "King_Fragment": { - "Name": "King_Fragment", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Void_Heart": { - "Name": "Void_Heart", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": true - }, - "Sprintmaster": { - "Name": "Sprintmaster", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Dreamshield": { - "Name": "Dreamshield", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Weaversong": { - "Name": "Weaversong", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Grimmchild1": { - "Name": "Grimmchild1", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "Grimmchild2": { - "Name": "Grimmchild2", - "Pool": "Charm", - "PriceCap": 500, - "MajorItem": false - }, - "City_Crest": { - "Name": "City_Crest", - "Pool": "Key", - "PriceCap": 500, - "MajorItem": false - }, - "Lumafly_Lantern": { - "Name": "Lumafly_Lantern", - "Pool": "Key", - "PriceCap": 500, - "MajorItem": false - }, - "Tram_Pass": { - "Name": "Tram_Pass", - "Pool": "Key", - "PriceCap": 500, - "MajorItem": false - }, - "Simple_Key": { - "Name": "Simple_Key", - "Pool": "Key", - "PriceCap": 500, - "MajorItem": false - }, - "Shopkeeper's_Key": { - "Name": "Shopkeeper's_Key", - "Pool": "Key", - "PriceCap": 500, - "MajorItem": false - }, - "Elegant_Key": { - "Name": "Elegant_Key", - "Pool": "Key", - "PriceCap": 500, - "MajorItem": false - }, - "Love_Key": { - "Name": "Love_Key", - "Pool": "Key", - "PriceCap": 500, - "MajorItem": false - }, - "King's_Brand": { - "Name": "King's_Brand", - "Pool": "Key", - "PriceCap": 500, - "MajorItem": false - }, - "Godtuner": { - "Name": "Godtuner", - "Pool": "Key", - "PriceCap": 1, - "MajorItem": false - }, - "Collector's_Map": { - "Name": "Collector's_Map", - "Pool": "Key", - "PriceCap": 1, - "MajorItem": false - }, - "Mask_Shard": { - "Name": "Mask_Shard", - "Pool": "Mask", - "PriceCap": 1500, - "MajorItem": false - }, - "Double_Mask_Shard": { - "Name": "Double_Mask_Shard", - "Pool": "Mask", - "PriceCap": 1500, - "MajorItem": false - }, - "Full_Mask": { - "Name": "Full_Mask", - "Pool": "Mask", - "PriceCap": 1500, - "MajorItem": false - }, - "Vessel_Fragment": { - "Name": "Vessel_Fragment", - "Pool": "Vessel", - "PriceCap": 1500, - "MajorItem": false - }, - "Double_Vessel_Fragment": { - "Name": "Double_Vessel_Fragment", - "Pool": "Vessel", - "PriceCap": 1500, - "MajorItem": false - }, - "Full_Soul_Vessel": { - "Name": "Full_Soul_Vessel", - "Pool": "Vessel", - "PriceCap": 1500, - "MajorItem": false - }, - "Charm_Notch": { - "Name": "Charm_Notch", - "Pool": "Notch", - "PriceCap": 1500, - "MajorItem": false - }, - "Salubra's_Blessing": { - "Name": "Salubra's_Blessing", - "Pool": "Notch", - "PriceCap": 1500, - "MajorItem": false - }, - "Pale_Ore": { - "Name": "Pale_Ore", - "Pool": "Ore", - "PriceCap": 1500, - "MajorItem": false - }, - "Geo_Chest-False_Knight": { - "Name": "Geo_Chest-False_Knight", - "Pool": "Geo", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Chest-Soul_Master": { - "Name": "Geo_Chest-Soul_Master", - "Pool": "Geo", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Chest-Watcher_Knights": { - "Name": "Geo_Chest-Watcher_Knights", - "Pool": "Geo", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Chest-Greenpath": { - "Name": "Geo_Chest-Greenpath", - "Pool": "Geo", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Chest-Mantis_Lords": { - "Name": "Geo_Chest-Mantis_Lords", - "Pool": "Geo", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Chest-Resting_Grounds": { - "Name": "Geo_Chest-Resting_Grounds", - "Pool": "Geo", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Chest-Crystal_Peak": { - "Name": "Geo_Chest-Crystal_Peak", - "Pool": "Geo", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Chest-Weavers_Den": { - "Name": "Geo_Chest-Weavers_Den", - "Pool": "Geo", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Chest-Junk_Pit_1": { - "Name": "Geo_Chest-Junk_Pit_1", - "Pool": "JunkPitChest", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Chest-Junk_Pit_2": { - "Name": "Geo_Chest-Junk_Pit_2", - "Pool": "JunkPitChest", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Chest-Junk_Pit_3": { - "Name": "Geo_Chest-Junk_Pit_3", - "Pool": "JunkPitChest", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Chest-Junk_Pit_5": { - "Name": "Geo_Chest-Junk_Pit_5", - "Pool": "JunkPitChest", - "PriceCap": 1, - "MajorItem": false - }, - "Lumafly_Escape": { - "Name": "Lumafly_Escape", - "Pool": "JunkPitChest", - "PriceCap": 1, - "MajorItem": false - }, - "One_Geo": { - "Name": "One_Geo", - "Pool": "Fake", - "PriceCap": 1, - "MajorItem": false - }, - "Rancid_Egg": { - "Name": "Rancid_Egg", - "Pool": "Egg", - "PriceCap": 500, - "MajorItem": false - }, - "Wanderer's_Journal": { - "Name": "Wanderer's_Journal", - "Pool": "Relic", - "PriceCap": 1500, - "MajorItem": false - }, - "Hallownest_Seal": { - "Name": "Hallownest_Seal", - "Pool": "Relic", - "PriceCap": 1500, - "MajorItem": false - }, - "King's_Idol": { - "Name": "King's_Idol", - "Pool": "Relic", - "PriceCap": 1500, - "MajorItem": false - }, - "Arcane_Egg": { - "Name": "Arcane_Egg", - "Pool": "Relic", - "PriceCap": 1500, - "MajorItem": false - }, - "Whispering_Root-Crossroads": { - "Name": "Whispering_Root-Crossroads", - "Pool": "Root", - "PriceCap": 500, - "MajorItem": false - }, - "Whispering_Root-Greenpath": { - "Name": "Whispering_Root-Greenpath", - "Pool": "Root", - "PriceCap": 500, - "MajorItem": false - }, - "Whispering_Root-Leg_Eater": { - "Name": "Whispering_Root-Leg_Eater", - "Pool": "Root", - "PriceCap": 500, - "MajorItem": false - }, - "Whispering_Root-Mantis_Village": { - "Name": "Whispering_Root-Mantis_Village", - "Pool": "Root", - "PriceCap": 500, - "MajorItem": false - }, - "Whispering_Root-Deepnest": { - "Name": "Whispering_Root-Deepnest", - "Pool": "Root", - "PriceCap": 500, - "MajorItem": false - }, - "Whispering_Root-Queens_Gardens": { - "Name": "Whispering_Root-Queens_Gardens", - "Pool": "Root", - "PriceCap": 500, - "MajorItem": false - }, - "Whispering_Root-Kingdoms_Edge": { - "Name": "Whispering_Root-Kingdoms_Edge", - "Pool": "Root", - "PriceCap": 500, - "MajorItem": false - }, - "Whispering_Root-Waterways": { - "Name": "Whispering_Root-Waterways", - "Pool": "Root", - "PriceCap": 500, - "MajorItem": false - }, - "Whispering_Root-City": { - "Name": "Whispering_Root-City", - "Pool": "Root", - "PriceCap": 500, - "MajorItem": false - }, - "Whispering_Root-Resting_Grounds": { - "Name": "Whispering_Root-Resting_Grounds", - "Pool": "Root", - "PriceCap": 500, - "MajorItem": false - }, - "Whispering_Root-Spirits_Glade": { - "Name": "Whispering_Root-Spirits_Glade", - "Pool": "Root", - "PriceCap": 500, - "MajorItem": false - }, - "Whispering_Root-Crystal_Peak": { - "Name": "Whispering_Root-Crystal_Peak", - "Pool": "Root", - "PriceCap": 500, - "MajorItem": false - }, - "Whispering_Root-Howling_Cliffs": { - "Name": "Whispering_Root-Howling_Cliffs", - "Pool": "Root", - "PriceCap": 500, - "MajorItem": false - }, - "Whispering_Root-Ancestral_Mound": { - "Name": "Whispering_Root-Ancestral_Mound", - "Pool": "Root", - "PriceCap": 500, - "MajorItem": false - }, - "Whispering_Root-Hive": { - "Name": "Whispering_Root-Hive", - "Pool": "Root", - "PriceCap": 500, - "MajorItem": false - }, - "Boss_Essence-Elder_Hu": { - "Name": "Boss_Essence-Elder_Hu", - "Pool": "DreamWarrior", - "PriceCap": 500, - "MajorItem": false - }, - "Boss_Essence-Xero": { - "Name": "Boss_Essence-Xero", - "Pool": "DreamWarrior", - "PriceCap": 500, - "MajorItem": false - }, - "Boss_Essence-Gorb": { - "Name": "Boss_Essence-Gorb", - "Pool": "DreamWarrior", - "PriceCap": 500, - "MajorItem": false - }, - "Boss_Essence-Marmu": { - "Name": "Boss_Essence-Marmu", - "Pool": "DreamWarrior", - "PriceCap": 500, - "MajorItem": false - }, - "Boss_Essence-No_Eyes": { - "Name": "Boss_Essence-No_Eyes", - "Pool": "DreamWarrior", - "PriceCap": 500, - "MajorItem": false - }, - "Boss_Essence-Galien": { - "Name": "Boss_Essence-Galien", - "Pool": "DreamWarrior", - "PriceCap": 500, - "MajorItem": false - }, - "Boss_Essence-Markoth": { - "Name": "Boss_Essence-Markoth", - "Pool": "DreamWarrior", - "PriceCap": 500, - "MajorItem": false - }, - "Boss_Essence-Failed_Champion": { - "Name": "Boss_Essence-Failed_Champion", - "Pool": "DreamBoss", - "PriceCap": 500, - "MajorItem": false - }, - "Boss_Essence-Soul_Tyrant": { - "Name": "Boss_Essence-Soul_Tyrant", - "Pool": "DreamBoss", - "PriceCap": 500, - "MajorItem": false - }, - "Boss_Essence-Lost_Kin": { - "Name": "Boss_Essence-Lost_Kin", - "Pool": "DreamBoss", - "PriceCap": 500, - "MajorItem": false - }, - "Boss_Essence-White_Defender": { - "Name": "Boss_Essence-White_Defender", - "Pool": "DreamBoss", - "PriceCap": 500, - "MajorItem": false - }, - "Boss_Essence-Grey_Prince_Zote": { - "Name": "Boss_Essence-Grey_Prince_Zote", - "Pool": "DreamBoss", - "PriceCap": 500, - "MajorItem": false - }, - "Grub": { - "Name": "Grub", - "Pool": "Grub", - "PriceCap": 500, - "MajorItem": false - }, - "Mimic_Grub": { - "Name": "Mimic_Grub", - "Pool": "Mimic", - "PriceCap": 500, - "MajorItem": false - }, - "Quill": { - "Name": "Quill", - "Pool": "Map", - "PriceCap": 500, - "MajorItem": false - }, - "Crossroads_Map": { - "Name": "Crossroads_Map", - "Pool": "Map", - "PriceCap": 500, - "MajorItem": false - }, - "Greenpath_Map": { - "Name": "Greenpath_Map", - "Pool": "Map", - "PriceCap": 500, - "MajorItem": false - }, - "Fog_Canyon_Map": { - "Name": "Fog_Canyon_Map", - "Pool": "Map", - "PriceCap": 500, - "MajorItem": false - }, - "Fungal_Wastes_Map": { - "Name": "Fungal_Wastes_Map", - "Pool": "Map", - "PriceCap": 500, - "MajorItem": false - }, - "Deepnest_Map": { - "Name": "Deepnest_Map", - "Pool": "Map", - "PriceCap": 500, - "MajorItem": false - }, - "Ancient_Basin_Map": { - "Name": "Ancient_Basin_Map", - "Pool": "Map", - "PriceCap": 500, - "MajorItem": false - }, - "Kingdom's_Edge_Map": { - "Name": "Kingdom's_Edge_Map", - "Pool": "Map", - "PriceCap": 500, - "MajorItem": false - }, - "City_of_Tears_Map": { - "Name": "City_of_Tears_Map", - "Pool": "Map", - "PriceCap": 500, - "MajorItem": false - }, - "Royal_Waterways_Map": { - "Name": "Royal_Waterways_Map", - "Pool": "Map", - "PriceCap": 500, - "MajorItem": false - }, - "Howling_Cliffs_Map": { - "Name": "Howling_Cliffs_Map", - "Pool": "Map", - "PriceCap": 500, - "MajorItem": false - }, - "Crystal_Peak_Map": { - "Name": "Crystal_Peak_Map", - "Pool": "Map", - "PriceCap": 500, - "MajorItem": false - }, - "Queen's_Gardens_Map": { - "Name": "Queen's_Gardens_Map", - "Pool": "Map", - "PriceCap": 500, - "MajorItem": false - }, - "Resting_Grounds_Map": { - "Name": "Resting_Grounds_Map", - "Pool": "Map", - "PriceCap": 500, - "MajorItem": false - }, - "Dirtmouth_Stag": { - "Name": "Dirtmouth_Stag", - "Pool": "Stag", - "PriceCap": 500, - "MajorItem": false - }, - "Crossroads_Stag": { - "Name": "Crossroads_Stag", - "Pool": "Stag", - "PriceCap": 500, - "MajorItem": false - }, - "Greenpath_Stag": { - "Name": "Greenpath_Stag", - "Pool": "Stag", - "PriceCap": 500, - "MajorItem": false - }, - "Queen's_Station_Stag": { - "Name": "Queen's_Station_Stag", - "Pool": "Stag", - "PriceCap": 500, - "MajorItem": false - }, - "Queen's_Gardens_Stag": { - "Name": "Queen's_Gardens_Stag", - "Pool": "Stag", - "PriceCap": 500, - "MajorItem": false - }, - "City_Storerooms_Stag": { - "Name": "City_Storerooms_Stag", - "Pool": "Stag", - "PriceCap": 500, - "MajorItem": false - }, - "King's_Station_Stag": { - "Name": "King's_Station_Stag", - "Pool": "Stag", - "PriceCap": 500, - "MajorItem": false - }, - "Resting_Grounds_Stag": { - "Name": "Resting_Grounds_Stag", - "Pool": "Stag", - "PriceCap": 500, - "MajorItem": false - }, - "Distant_Village_Stag": { - "Name": "Distant_Village_Stag", - "Pool": "Stag", - "PriceCap": 500, - "MajorItem": false - }, - "Hidden_Station_Stag": { - "Name": "Hidden_Station_Stag", - "Pool": "Stag", - "PriceCap": 500, - "MajorItem": false - }, - "Stag_Nest_Stag": { - "Name": "Stag_Nest_Stag", - "Pool": "Stag", - "PriceCap": 500, - "MajorItem": false - }, - "Lifeblood_Cocoon_Small": { - "Name": "Lifeblood_Cocoon_Small", - "Pool": "Cocoon", - "PriceCap": 500, - "MajorItem": false - }, - "Lifeblood_Cocoon_Large": { - "Name": "Lifeblood_Cocoon_Large", - "Pool": "Cocoon", - "PriceCap": 500, - "MajorItem": false - }, - "Grimmkin_Flame": { - "Name": "Grimmkin_Flame", - "Pool": "Flame", - "PriceCap": 500, - "MajorItem": false - }, - "Hunter's_Journal": { - "Name": "Hunter's_Journal", - "Pool": "Journal", - "PriceCap": 500, - "MajorItem": false - }, - "Journal_Entry-Void_Tendrils": { - "Name": "Journal_Entry-Void_Tendrils", - "Pool": "Journal", - "PriceCap": 500, - "MajorItem": false - }, - "Journal_Entry-Charged_Lumafly": { - "Name": "Journal_Entry-Charged_Lumafly", - "Pool": "Journal", - "PriceCap": 500, - "MajorItem": false - }, - "Journal_Entry-Goam": { - "Name": "Journal_Entry-Goam", - "Pool": "Journal", - "PriceCap": 500, - "MajorItem": false - }, - "Journal_Entry-Garpede": { - "Name": "Journal_Entry-Garpede", - "Pool": "Journal", - "PriceCap": 500, - "MajorItem": false - }, - "Journal_Entry-Seal_of_Binding": { - "Name": "Journal_Entry-Seal_of_Binding", - "Pool": "Journal", - "PriceCap": 500, - "MajorItem": false - }, - "Elevator_Pass": { - "Name": "Elevator_Pass", - "Pool": "ElevatorPass", - "PriceCap": 500, - "MajorItem": false - }, - "Left_Mothwing_Cloak": { - "Name": "Left_Mothwing_Cloak", - "Pool": "SplitCloak", - "PriceCap": 500, - "MajorItem": true - }, - "Right_Mothwing_Cloak": { - "Name": "Right_Mothwing_Cloak", - "Pool": "SplitCloak", - "PriceCap": 500, - "MajorItem": true - }, - "Split_Shade_Cloak": { - "Name": "Split_Shade_Cloak", - "Pool": "SplitCloak", - "PriceCap": 500, - "MajorItem": true - }, - "Left_Mantis_Claw": { - "Name": "Left_Mantis_Claw", - "Pool": "SplitClaw", - "PriceCap": 500, - "MajorItem": true - }, - "Right_Mantis_Claw": { - "Name": "Right_Mantis_Claw", - "Pool": "SplitClaw", - "PriceCap": 500, - "MajorItem": true - }, - "Leftslash": { - "Name": "Leftslash", - "Pool": "CursedNail", - "PriceCap": 500, - "MajorItem": false - }, - "Rightslash": { - "Name": "Rightslash", - "Pool": "CursedNail", - "PriceCap": 500, - "MajorItem": false - }, - "Upslash": { - "Name": "Upslash", - "Pool": "CursedNail", - "PriceCap": 500, - "MajorItem": false - }, - "Downslash": { - "Name": "Downslash", - "Pool": "CursedNail", - "PriceCap": 500, - "MajorItem": false - }, - "Left_Crystal_Heart": { - "Name": "Left_Crystal_Heart", - "Pool": "SplitSuperdash", - "PriceCap": 500, - "MajorItem": true - }, - "Right_Crystal_Heart": { - "Name": "Right_Crystal_Heart", - "Pool": "SplitSuperdash", - "PriceCap": 500, - "MajorItem": true - }, - "Geo_Rock-Default": { - "Name": "Geo_Rock-Default", - "Pool": "Rock", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Rock-Deepnest": { - "Name": "Geo_Rock-Deepnest", - "Pool": "Rock", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Rock-Abyss": { - "Name": "Geo_Rock-Abyss", - "Pool": "Rock", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Rock-GreenPath01": { - "Name": "Geo_Rock-GreenPath01", - "Pool": "Rock", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Rock-Outskirts": { - "Name": "Geo_Rock-Outskirts", - "Pool": "Rock", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Rock-Outskirts420": { - "Name": "Geo_Rock-Outskirts420", - "Pool": "Rock", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Rock-GreenPath02": { - "Name": "Geo_Rock-GreenPath02", - "Pool": "Rock", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Rock-Fung01": { - "Name": "Geo_Rock-Fung01", - "Pool": "Rock", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Rock-Fung02": { - "Name": "Geo_Rock-Fung02", - "Pool": "Rock", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Rock-City": { - "Name": "Geo_Rock-City", - "Pool": "Rock", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Rock-Hive": { - "Name": "Geo_Rock-Hive", - "Pool": "Rock", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Rock-Mine": { - "Name": "Geo_Rock-Mine", - "Pool": "Rock", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Rock-Grave02": { - "Name": "Geo_Rock-Grave02", - "Pool": "Rock", - "PriceCap": 1, - "MajorItem": false - }, - "Geo_Rock-Grave01": { - "Name": "Geo_Rock-Grave01", - "Pool": "Rock", - "PriceCap": 1, - "MajorItem": false - }, - "Boss_Geo-Massive_Moss_Charger": { - "Name": "Boss_Geo-Massive_Moss_Charger", - "Pool": "Boss_Geo", - "PriceCap": 1, - "MajorItem": false - }, - "Boss_Geo-Gorgeous_Husk": { - "Name": "Boss_Geo-Gorgeous_Husk", - "Pool": "Boss_Geo", - "PriceCap": 1, - "MajorItem": false - }, - "Boss_Geo-Sanctum_Soul_Warrior": { - "Name": "Boss_Geo-Sanctum_Soul_Warrior", - "Pool": "Boss_Geo", - "PriceCap": 1, - "MajorItem": false - }, - "Boss_Geo-Elegant_Soul_Warrior": { - "Name": "Boss_Geo-Elegant_Soul_Warrior", - "Pool": "Boss_Geo", - "PriceCap": 1, - "MajorItem": false - }, - "Boss_Geo-Crystal_Guardian": { - "Name": "Boss_Geo-Crystal_Guardian", - "Pool": "Boss_Geo", - "PriceCap": 1, - "MajorItem": false - }, - "Boss_Geo-Enraged_Guardian": { - "Name": "Boss_Geo-Enraged_Guardian", - "Pool": "Boss_Geo", - "PriceCap": 1, - "MajorItem": false - }, - "Boss_Geo-Gruz_Mother": { - "Name": "Boss_Geo-Gruz_Mother", - "Pool": "Boss_Geo", - "PriceCap": 1, - "MajorItem": false - }, - "Boss_Geo-Vengefly_King": { - "Name": "Boss_Geo-Vengefly_King", - "Pool": "Boss_Geo", - "PriceCap": 1, - "MajorItem": false - }, - "Soul_Refill": { - "Name": "Soul_Refill", - "Pool": "Soul", - "PriceCap": 1, - "MajorItem": false - }, - "Soul_Totem-A": { - "Name": "Soul_Totem-A", - "Pool": "Soul", - "PriceCap": 1, - "MajorItem": false - }, - "Soul_Totem-B": { - "Name": "Soul_Totem-B", - "Pool": "Soul", - "PriceCap": 1, - "MajorItem": false - }, - "Soul_Totem-C": { - "Name": "Soul_Totem-C", - "Pool": "Soul", - "PriceCap": 1, - "MajorItem": false - }, - "Soul_Totem-D": { - "Name": "Soul_Totem-D", - "Pool": "Soul", - "PriceCap": 1, - "MajorItem": false - }, - "Soul_Totem-E": { - "Name": "Soul_Totem-E", - "Pool": "Soul", - "PriceCap": 1, - "MajorItem": false - }, - "Soul_Totem-F": { - "Name": "Soul_Totem-F", - "Pool": "Soul", - "PriceCap": 1, - "MajorItem": false - }, - "Soul_Totem-G": { - "Name": "Soul_Totem-G", - "Pool": "Soul", - "PriceCap": 1, - "MajorItem": false - }, - "Soul_Totem-Palace": { - "Name": "Soul_Totem-Palace", - "Pool": "Soul", - "PriceCap": 1, - "MajorItem": false - }, - "Soul_Totem-Path_of_Pain": { - "Name": "Soul_Totem-Path_of_Pain", - "Pool": "Soul", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-City_Entrance": { - "Name": "Lore_Tablet-City_Entrance", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Pleasure_House": { - "Name": "Lore_Tablet-Pleasure_House", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Sanctum_Entrance": { - "Name": "Lore_Tablet-Sanctum_Entrance", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Sanctum_Past_Soul_Master": { - "Name": "Lore_Tablet-Sanctum_Past_Soul_Master", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Watcher's_Spire": { - "Name": "Lore_Tablet-Watcher's_Spire", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Archives_Upper": { - "Name": "Lore_Tablet-Archives_Upper", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Archives_Left": { - "Name": "Lore_Tablet-Archives_Left", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Archives_Right": { - "Name": "Lore_Tablet-Archives_Right", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Pilgrim's_Way_1": { - "Name": "Lore_Tablet-Pilgrim's_Way_1", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Pilgrim's_Way_2": { - "Name": "Lore_Tablet-Pilgrim's_Way_2", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Mantis_Outskirts": { - "Name": "Lore_Tablet-Mantis_Outskirts", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Mantis_Village": { - "Name": "Lore_Tablet-Mantis_Village", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Greenpath_Upper_Hidden": { - "Name": "Lore_Tablet-Greenpath_Upper_Hidden", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Greenpath_Below_Toll": { - "Name": "Lore_Tablet-Greenpath_Below_Toll", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Greenpath_Lifeblood": { - "Name": "Lore_Tablet-Greenpath_Lifeblood", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Greenpath_Stag": { - "Name": "Lore_Tablet-Greenpath_Stag", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Greenpath_QG": { - "Name": "Lore_Tablet-Greenpath_QG", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Greenpath_Lower_Hidden": { - "Name": "Lore_Tablet-Greenpath_Lower_Hidden", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Dung_Defender": { - "Name": "Lore_Tablet-Dung_Defender", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Spore_Shroom": { - "Name": "Lore_Tablet-Spore_Shroom", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Fungal_Wastes_Hidden": { - "Name": "Lore_Tablet-Fungal_Wastes_Hidden", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Fungal_Wastes_Below_Shrumal_Ogres": { - "Name": "Lore_Tablet-Fungal_Wastes_Below_Shrumal_Ogres", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Fungal_Core": { - "Name": "Lore_Tablet-Fungal_Core", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Ancient_Basin": { - "Name": "Lore_Tablet-Ancient_Basin", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-King's_Pass_Focus": { - "Name": "Lore_Tablet-King's_Pass_Focus", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-King's_Pass_Fury": { - "Name": "Lore_Tablet-King's_Pass_Fury", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-King's_Pass_Exit": { - "Name": "Lore_Tablet-King's_Pass_Exit", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-World_Sense": { - "Name": "Lore_Tablet-World_Sense", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Howling_Cliffs": { - "Name": "Lore_Tablet-Howling_Cliffs", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Kingdom's_Edge": { - "Name": "Lore_Tablet-Kingdom's_Edge", - "Pool": "Lore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Palace_Workshop": { - "Name": "Lore_Tablet-Palace_Workshop", - "Pool": "PalaceLore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Palace_Throne": { - "Name": "Lore_Tablet-Palace_Throne", - "Pool": "PalaceLore", - "PriceCap": 1, - "MajorItem": false - }, - "Lore_Tablet-Path_of_Pain_Entrance": { - "Name": "Lore_Tablet-Path_of_Pain_Entrance", - "Pool": "PalaceLore", - "PriceCap": 1, - "MajorItem": false - } -} \ No newline at end of file diff --git a/RandomizerMod/Resources/Data/locations.json b/RandomizerMod/Resources/Data/locations.json deleted file mode 100644 index 3c9e1a2..0000000 --- a/RandomizerMod/Resources/Data/locations.json +++ /dev/null @@ -1,3638 +0,0 @@ -{ - "Start": { - "Name": "Start", - "SceneName": "Start", - "FlexibleCount": true, - "AdditionalProgressionPenalty": true - }, - "Sly": { - "Name": "Sly", - "SceneName": "Room_shop", - "FlexibleCount": true, - "AdditionalProgressionPenalty": true - }, - "Sly_(Key)": { - "Name": "Sly_(Key)", - "SceneName": "Room_shop", - "FlexibleCount": true, - "AdditionalProgressionPenalty": true - }, - "Iselda": { - "Name": "Iselda", - "SceneName": "Room_mapper", - "FlexibleCount": true, - "AdditionalProgressionPenalty": true - }, - "Salubra": { - "Name": "Salubra", - "SceneName": "Room_Charm_Shop", - "FlexibleCount": true, - "AdditionalProgressionPenalty": true - }, - "Salubra_(Requires_Charms)": { - "Name": "Salubra_(Requires_Charms)", - "SceneName": "Room_Charm_Shop", - "FlexibleCount": true, - "AdditionalProgressionPenalty": true - }, - "Leg_Eater": { - "Name": "Leg_Eater", - "SceneName": "Fungus2_26", - "FlexibleCount": true, - "AdditionalProgressionPenalty": true - }, - "Grubfather": { - "Name": "Grubfather", - "SceneName": "Crossroads_38", - "FlexibleCount": true, - "AdditionalProgressionPenalty": false - }, - "Seer": { - "Name": "Seer", - "SceneName": "RestingGrounds_07", - "FlexibleCount": true, - "AdditionalProgressionPenalty": false - }, - "Egg_Shop": { - "Name": "Egg_Shop", - "SceneName": "Room_Ouiji", - "FlexibleCount": true, - "AdditionalProgressionPenalty": false - }, - "Lurien": { - "Name": "Lurien", - "SceneName": "Ruins2_Watcher_Room", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Monomon": { - "Name": "Monomon", - "SceneName": "Fungus3_archive_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Herrah": { - "Name": "Herrah", - "SceneName": "Deepnest_Spider_Town", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "World_Sense": { - "Name": "World_Sense", - "SceneName": "Room_temple", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Mothwing_Cloak": { - "Name": "Mothwing_Cloak", - "SceneName": "Fungus1_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Mantis_Claw": { - "Name": "Mantis_Claw", - "SceneName": "Fungus2_14", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Crystal_Heart": { - "Name": "Crystal_Heart", - "SceneName": "Mines_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Monarch_Wings": { - "Name": "Monarch_Wings", - "SceneName": "Abyss_21", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Shade_Cloak": { - "Name": "Shade_Cloak", - "SceneName": "Abyss_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Isma's_Tear": { - "Name": "Isma's_Tear", - "SceneName": "Waterways_13", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Dream_Nail": { - "Name": "Dream_Nail", - "SceneName": "RestingGrounds_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Vengeful_Spirit": { - "Name": "Vengeful_Spirit", - "SceneName": "Crossroads_ShamanTemple", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Shade_Soul": { - "Name": "Shade_Soul", - "SceneName": "Ruins1_31b", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Desolate_Dive": { - "Name": "Desolate_Dive", - "SceneName": "Ruins1_24", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Descending_Dark": { - "Name": "Descending_Dark", - "SceneName": "Mines_35", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Howling_Wraiths": { - "Name": "Howling_Wraiths", - "SceneName": "Room_Fungus_Shaman", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Abyss_Shriek": { - "Name": "Abyss_Shriek", - "SceneName": "Abyss_12", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Cyclone_Slash": { - "Name": "Cyclone_Slash", - "SceneName": "Room_nailmaster", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Dash_Slash": { - "Name": "Dash_Slash", - "SceneName": "Room_nailmaster_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Great_Slash": { - "Name": "Great_Slash", - "SceneName": "Room_nailmaster_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Focus": { - "Name": "Focus", - "SceneName": "Tutorial_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Baldur_Shell": { - "Name": "Baldur_Shell", - "SceneName": "Fungus1_28", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Fury_of_the_Fallen": { - "Name": "Fury_of_the_Fallen", - "SceneName": "Tutorial_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lifeblood_Core": { - "Name": "Lifeblood_Core", - "SceneName": "Abyss_08", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Defender's_Crest": { - "Name": "Defender's_Crest", - "SceneName": "Waterways_05", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Flukenest": { - "Name": "Flukenest", - "SceneName": "Waterways_12", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Thorns_of_Agony": { - "Name": "Thorns_of_Agony", - "SceneName": "Fungus1_14", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Mark_of_Pride": { - "Name": "Mark_of_Pride", - "SceneName": "Fungus2_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Sharp_Shadow": { - "Name": "Sharp_Shadow", - "SceneName": "Deepnest_44", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Spore_Shroom": { - "Name": "Spore_Shroom", - "SceneName": "Fungus2_20", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Catcher": { - "Name": "Soul_Catcher", - "SceneName": "Crossroads_ShamanTemple", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Eater": { - "Name": "Soul_Eater", - "SceneName": "RestingGrounds_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Glowing_Womb": { - "Name": "Glowing_Womb", - "SceneName": "Crossroads_22", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Nailmaster's_Glory": { - "Name": "Nailmaster's_Glory", - "SceneName": "Room_shop", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Joni's_Blessing": { - "Name": "Joni's_Blessing", - "SceneName": "Cliffs_05", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Shape_of_Unn": { - "Name": "Shape_of_Unn", - "SceneName": "Fungus1_Slug", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hiveblood": { - "Name": "Hiveblood", - "SceneName": "Hive_05", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Dashmaster": { - "Name": "Dashmaster", - "SceneName": "Fungus2_23", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Quick_Slash": { - "Name": "Quick_Slash", - "SceneName": "Deepnest_East_14b", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Spell_Twister": { - "Name": "Spell_Twister", - "SceneName": "Ruins1_30", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Deep_Focus": { - "Name": "Deep_Focus", - "SceneName": "Mines_36", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Queen_Fragment": { - "Name": "Queen_Fragment", - "SceneName": "Room_Queen", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "King_Fragment": { - "Name": "King_Fragment", - "SceneName": "White_Palace_09", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Void_Heart": { - "Name": "Void_Heart", - "SceneName": "Abyss_15", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Dreamshield": { - "Name": "Dreamshield", - "SceneName": "RestingGrounds_17", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Weaversong": { - "Name": "Weaversong", - "SceneName": "Deepnest_45_v02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grimmchild": { - "Name": "Grimmchild", - "SceneName": "Grimm_Main_Tent", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Unbreakable_Heart": { - "Name": "Unbreakable_Heart", - "SceneName": "Grimm_Divine", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Unbreakable_Greed": { - "Name": "Unbreakable_Greed", - "SceneName": "Grimm_Divine", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Unbreakable_Strength": { - "Name": "Unbreakable_Strength", - "SceneName": "Grimm_Divine", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "City_Crest": { - "Name": "City_Crest", - "SceneName": "Crossroads_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Tram_Pass": { - "Name": "Tram_Pass", - "SceneName": "Deepnest_26b", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Simple_Key-Basin": { - "Name": "Simple_Key-Basin", - "SceneName": "Abyss_20", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Simple_Key-City": { - "Name": "Simple_Key-City", - "SceneName": "Ruins1_17", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Simple_Key-Lurker": { - "Name": "Simple_Key-Lurker", - "SceneName": "GG_Lurker", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Shopkeeper's_Key": { - "Name": "Shopkeeper's_Key", - "SceneName": "Mines_11", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Love_Key": { - "Name": "Love_Key", - "SceneName": "Fungus3_39", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "King's_Brand": { - "Name": "King's_Brand", - "SceneName": "Room_Wyrm", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Godtuner": { - "Name": "Godtuner", - "SceneName": "GG_Waterways", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Collector's_Map": { - "Name": "Collector's_Map", - "SceneName": "Ruins2_11", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Mask_Shard-Brooding_Mawlek": { - "Name": "Mask_Shard-Brooding_Mawlek", - "SceneName": "Crossroads_09", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Mask_Shard-Crossroads_Goam": { - "Name": "Mask_Shard-Crossroads_Goam", - "SceneName": "Crossroads_13", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Mask_Shard-Stone_Sanctuary": { - "Name": "Mask_Shard-Stone_Sanctuary", - "SceneName": "Fungus1_36", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Mask_Shard-Queen's_Station": { - "Name": "Mask_Shard-Queen's_Station", - "SceneName": "Fungus2_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Mask_Shard-Deepnest": { - "Name": "Mask_Shard-Deepnest", - "SceneName": "Fungus2_25", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Mask_Shard-Waterways": { - "Name": "Mask_Shard-Waterways", - "SceneName": "Waterways_04b", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Mask_Shard-Enraged_Guardian": { - "Name": "Mask_Shard-Enraged_Guardian", - "SceneName": "Mines_32", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Mask_Shard-Hive": { - "Name": "Mask_Shard-Hive", - "SceneName": "Hive_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Mask_Shard-Grey_Mourner": { - "Name": "Mask_Shard-Grey_Mourner", - "SceneName": "Room_Mansion", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Mask_Shard-Bretta": { - "Name": "Mask_Shard-Bretta", - "SceneName": "Room_Bretta", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Vessel_Fragment-Greenpath": { - "Name": "Vessel_Fragment-Greenpath", - "SceneName": "Fungus1_13", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Vessel_Fragment-City": { - "Name": "Vessel_Fragment-City", - "SceneName": "Ruins2_09", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Vessel_Fragment-Crossroads": { - "Name": "Vessel_Fragment-Crossroads", - "SceneName": "Crossroads_37", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Vessel_Fragment-Basin": { - "Name": "Vessel_Fragment-Basin", - "SceneName": "Abyss_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Vessel_Fragment-Deepnest": { - "Name": "Vessel_Fragment-Deepnest", - "SceneName": "Deepnest_38", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Vessel_Fragment-Stag_Nest": { - "Name": "Vessel_Fragment-Stag_Nest", - "SceneName": "Cliffs_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Charm_Notch-Shrumal_Ogres": { - "Name": "Charm_Notch-Shrumal_Ogres", - "SceneName": "Fungus2_05", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Charm_Notch-Fog_Canyon": { - "Name": "Charm_Notch-Fog_Canyon", - "SceneName": "Fungus3_28", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Charm_Notch-Colosseum": { - "Name": "Charm_Notch-Colosseum", - "SceneName": "Room_Colosseum_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Charm_Notch-Grimm": { - "Name": "Charm_Notch-Grimm", - "SceneName": "Grimm_Main_Tent", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Pale_Ore-Basin": { - "Name": "Pale_Ore-Basin", - "SceneName": "Abyss_17", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Pale_Ore-Crystal_Peak": { - "Name": "Pale_Ore-Crystal_Peak", - "SceneName": "Mines_34", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Pale_Ore-Nosk": { - "Name": "Pale_Ore-Nosk", - "SceneName": "Deepnest_32", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Pale_Ore-Colosseum": { - "Name": "Pale_Ore-Colosseum", - "SceneName": "Room_Colosseum_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Chest-False_Knight": { - "Name": "Geo_Chest-False_Knight", - "SceneName": "Crossroads_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Chest-Soul_Master": { - "Name": "Geo_Chest-Soul_Master", - "SceneName": "Ruins1_32", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Chest-Watcher_Knights": { - "Name": "Geo_Chest-Watcher_Knights", - "SceneName": "Ruins2_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Chest-Greenpath": { - "Name": "Geo_Chest-Greenpath", - "SceneName": "Fungus1_13", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Chest-Mantis_Lords": { - "Name": "Geo_Chest-Mantis_Lords", - "SceneName": "Fungus2_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Chest-Resting_Grounds": { - "Name": "Geo_Chest-Resting_Grounds", - "SceneName": "RestingGrounds_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Chest-Crystal_Peak": { - "Name": "Geo_Chest-Crystal_Peak", - "SceneName": "Mines_37", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Chest-Weavers_Den": { - "Name": "Geo_Chest-Weavers_Den", - "SceneName": "Deepnest_45_v02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Chest-Junk_Pit_1": { - "Name": "Geo_Chest-Junk_Pit_1", - "SceneName": "GG_Waterways", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Chest-Junk_Pit_2": { - "Name": "Geo_Chest-Junk_Pit_2", - "SceneName": "GG_Waterways", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Chest-Junk_Pit_3": { - "Name": "Geo_Chest-Junk_Pit_3", - "SceneName": "GG_Waterways", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Chest-Junk_Pit_5": { - "Name": "Geo_Chest-Junk_Pit_5", - "SceneName": "GG_Waterways", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lumafly_Escape-Junk_Pit_Chest_4": { - "Name": "Lumafly_Escape-Junk_Pit_Chest_4", - "SceneName": "GG_Waterways", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-Sheo": { - "Name": "Rancid_Egg-Sheo", - "SceneName": "Fungus1_15", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-Fungal_Core": { - "Name": "Rancid_Egg-Fungal_Core", - "SceneName": "Fungus2_29", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-Queen's_Gardens": { - "Name": "Rancid_Egg-Queen's_Gardens", - "SceneName": "Fungus3_34", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-Blue_Lake": { - "Name": "Rancid_Egg-Blue_Lake", - "SceneName": "Crossroads_50", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-Crystal_Peak_Dive_Entrance": { - "Name": "Rancid_Egg-Crystal_Peak_Dive_Entrance", - "SceneName": "Mines_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-Crystal_Peak_Dark_Room": { - "Name": "Rancid_Egg-Crystal_Peak_Dark_Room", - "SceneName": "Mines_29", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-Crystal_Peak_Tall_Room": { - "Name": "Rancid_Egg-Crystal_Peak_Tall_Room", - "SceneName": "Mines_20", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-City_of_Tears_Left": { - "Name": "Rancid_Egg-City_of_Tears_Left", - "SceneName": "Ruins1_05c", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-City_of_Tears_Pleasure_House": { - "Name": "Rancid_Egg-City_of_Tears_Pleasure_House", - "SceneName": "Ruins_Elevator", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-Beast's_Den": { - "Name": "Rancid_Egg-Beast's_Den", - "SceneName": "Deepnest_Spider_Town", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-Dark_Deepnest": { - "Name": "Rancid_Egg-Dark_Deepnest", - "SceneName": "Deepnest_39", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-Weaver's_Den": { - "Name": "Rancid_Egg-Weaver's_Den", - "SceneName": "Deepnest_45_v02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-Near_Quick_Slash": { - "Name": "Rancid_Egg-Near_Quick_Slash", - "SceneName": "Deepnest_East_14", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-Upper_Kingdom's_Edge": { - "Name": "Rancid_Egg-Upper_Kingdom's_Edge", - "SceneName": "Deepnest_East_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-Waterways_East": { - "Name": "Rancid_Egg-Waterways_East", - "SceneName": "Waterways_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-Waterways_Main": { - "Name": "Rancid_Egg-Waterways_Main", - "SceneName": "Waterways_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-Waterways_West_Bluggsac": { - "Name": "Rancid_Egg-Waterways_West_Bluggsac", - "SceneName": "Waterways_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-Waterways_West_Pickup": { - "Name": "Rancid_Egg-Waterways_West_Pickup", - "SceneName": "Waterways_04b", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rancid_Egg-Tuk_Defender's_Crest": { - "Name": "Rancid_Egg-Tuk_Defender's_Crest", - "SceneName": "Waterways_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Wanderer's_Journal-Cliffs": { - "Name": "Wanderer's_Journal-Cliffs", - "SceneName": "Cliffs_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Wanderer's_Journal-Greenpath_Stag": { - "Name": "Wanderer's_Journal-Greenpath_Stag", - "SceneName": "Fungus1_22", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Wanderer's_Journal-Greenpath_Lower": { - "Name": "Wanderer's_Journal-Greenpath_Lower", - "SceneName": "Fungus1_11", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Wanderer's_Journal-Fungal_Wastes_Thorns_Gauntlet": { - "Name": "Wanderer's_Journal-Fungal_Wastes_Thorns_Gauntlet", - "SceneName": "Fungus2_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Wanderer's_Journal-Above_Mantis_Village": { - "Name": "Wanderer's_Journal-Above_Mantis_Village", - "SceneName": "Fungus2_17", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Wanderer's_Journal-Crystal_Peak_Crawlers": { - "Name": "Wanderer's_Journal-Crystal_Peak_Crawlers", - "SceneName": "Mines_20", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Wanderer's_Journal-Resting_Grounds_Catacombs": { - "Name": "Wanderer's_Journal-Resting_Grounds_Catacombs", - "SceneName": "RestingGrounds_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Wanderer's_Journal-King's_Station": { - "Name": "Wanderer's_Journal-King's_Station", - "SceneName": "Ruins2_05", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Wanderer's_Journal-Pleasure_House": { - "Name": "Wanderer's_Journal-Pleasure_House", - "SceneName": "Ruins_Elevator", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Wanderer's_Journal-City_Storerooms": { - "Name": "Wanderer's_Journal-City_Storerooms", - "SceneName": "Ruins1_28", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Wanderer's_Journal-Ancient_Basin": { - "Name": "Wanderer's_Journal-Ancient_Basin", - "SceneName": "Abyss_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Wanderer's_Journal-Kingdom's_Edge_Entrance": { - "Name": "Wanderer's_Journal-Kingdom's_Edge_Entrance", - "SceneName": "Deepnest_East_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Wanderer's_Journal-Kingdom's_Edge_Camp": { - "Name": "Wanderer's_Journal-Kingdom's_Edge_Camp", - "SceneName": "Deepnest_East_13", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Wanderer's_Journal-Kingdom's_Edge_Requires_Dive": { - "Name": "Wanderer's_Journal-Kingdom's_Edge_Requires_Dive", - "SceneName": "Deepnest_East_18", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hallownest_Seal-Crossroads_Well": { - "Name": "Hallownest_Seal-Crossroads_Well", - "SceneName": "Crossroads_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hallownest_Seal-Greenpath": { - "Name": "Hallownest_Seal-Greenpath", - "SceneName": "Fungus1_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hallownest_Seal-Fog_Canyon_West": { - "Name": "Hallownest_Seal-Fog_Canyon_West", - "SceneName": "Fungus3_30", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hallownest_Seal-Fog_Canyon_East": { - "Name": "Hallownest_Seal-Fog_Canyon_East", - "SceneName": "Fungus3_26", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hallownest_Seal-Queen's_Station": { - "Name": "Hallownest_Seal-Queen's_Station", - "SceneName": "Fungus2_34", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hallownest_Seal-Fungal_Wastes_Sporgs": { - "Name": "Hallownest_Seal-Fungal_Wastes_Sporgs", - "SceneName": "Fungus2_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hallownest_Seal-Mantis_Lords": { - "Name": "Hallownest_Seal-Mantis_Lords", - "SceneName": "Fungus2_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hallownest_Seal-Resting_Grounds_Catacombs": { - "Name": "Hallownest_Seal-Resting_Grounds_Catacombs", - "SceneName": "RestingGrounds_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hallownest_Seal-King's_Station": { - "Name": "Hallownest_Seal-King's_Station", - "SceneName": "Ruins2_08", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hallownest_Seal-City_Rafters": { - "Name": "Hallownest_Seal-City_Rafters", - "SceneName": "Ruins1_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hallownest_Seal-Soul_Sanctum": { - "Name": "Hallownest_Seal-Soul_Sanctum", - "SceneName": "Ruins1_32", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hallownest_Seal-Watcher_Knight": { - "Name": "Hallownest_Seal-Watcher_Knight", - "SceneName": "Ruins2_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hallownest_Seal-Deepnest_By_Mantis_Lords": { - "Name": "Hallownest_Seal-Deepnest_By_Mantis_Lords", - "SceneName": "Deepnest_16", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hallownest_Seal-Beast's_Den": { - "Name": "Hallownest_Seal-Beast's_Den", - "SceneName": "Deepnest_Spider_Town", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hallownest_Seal-Queen's_Gardens": { - "Name": "Hallownest_Seal-Queen's_Gardens", - "SceneName": "Fungus3_48", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "King's_Idol-Cliffs": { - "Name": "King's_Idol-Cliffs", - "SceneName": "Cliffs_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "King's_Idol-Crystal_Peak": { - "Name": "King's_Idol-Crystal_Peak", - "SceneName": "Mines_30", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "King's_Idol-Glade_of_Hope": { - "Name": "King's_Idol-Glade_of_Hope", - "SceneName": "RestingGrounds_08", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "King's_Idol-Dung_Defender": { - "Name": "King's_Idol-Dung_Defender", - "SceneName": "Waterways_15", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "King's_Idol-Great_Hopper": { - "Name": "King's_Idol-Great_Hopper", - "SceneName": "Deepnest_East_08", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "King's_Idol-Pale_Lurker": { - "Name": "King's_Idol-Pale_Lurker", - "SceneName": "GG_Lurker", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "King's_Idol-Deepnest": { - "Name": "King's_Idol-Deepnest", - "SceneName": "Deepnest_33", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Arcane_Egg-Lifeblood_Core": { - "Name": "Arcane_Egg-Lifeblood_Core", - "SceneName": "Abyss_08", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Arcane_Egg-Shade_Cloak": { - "Name": "Arcane_Egg-Shade_Cloak", - "SceneName": "Abyss_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Arcane_Egg-Birthplace": { - "Name": "Arcane_Egg-Birthplace", - "SceneName": "Abyss_15", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Whispering_Root-Crossroads": { - "Name": "Whispering_Root-Crossroads", - "SceneName": "Crossroads_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Whispering_Root-Greenpath": { - "Name": "Whispering_Root-Greenpath", - "SceneName": "Fungus1_13", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Whispering_Root-Leg_Eater": { - "Name": "Whispering_Root-Leg_Eater", - "SceneName": "Fungus2_33", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Whispering_Root-Mantis_Village": { - "Name": "Whispering_Root-Mantis_Village", - "SceneName": "Fungus2_17", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Whispering_Root-Deepnest": { - "Name": "Whispering_Root-Deepnest", - "SceneName": "Deepnest_39", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Whispering_Root-Queens_Gardens": { - "Name": "Whispering_Root-Queens_Gardens", - "SceneName": "Fungus3_11", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Whispering_Root-Kingdoms_Edge": { - "Name": "Whispering_Root-Kingdoms_Edge", - "SceneName": "Deepnest_East_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Whispering_Root-Waterways": { - "Name": "Whispering_Root-Waterways", - "SceneName": "Abyss_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Whispering_Root-City": { - "Name": "Whispering_Root-City", - "SceneName": "Ruins1_17", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Whispering_Root-Resting_Grounds": { - "Name": "Whispering_Root-Resting_Grounds", - "SceneName": "RestingGrounds_05", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Whispering_Root-Spirits_Glade": { - "Name": "Whispering_Root-Spirits_Glade", - "SceneName": "RestingGrounds_08", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Whispering_Root-Crystal_Peak": { - "Name": "Whispering_Root-Crystal_Peak", - "SceneName": "Mines_23", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Whispering_Root-Howling_Cliffs": { - "Name": "Whispering_Root-Howling_Cliffs", - "SceneName": "Cliffs_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Whispering_Root-Ancestral_Mound": { - "Name": "Whispering_Root-Ancestral_Mound", - "SceneName": "Crossroads_ShamanTemple", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Whispering_Root-Hive": { - "Name": "Whispering_Root-Hive", - "SceneName": "Hive_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Essence-Elder_Hu": { - "Name": "Boss_Essence-Elder_Hu", - "SceneName": "Fungus2_32", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Essence-Xero": { - "Name": "Boss_Essence-Xero", - "SceneName": "RestingGrounds_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Essence-Gorb": { - "Name": "Boss_Essence-Gorb", - "SceneName": "Cliffs_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Essence-Marmu": { - "Name": "Boss_Essence-Marmu", - "SceneName": "Fungus3_40", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Essence-No_Eyes": { - "Name": "Boss_Essence-No_Eyes", - "SceneName": "Fungus1_35", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Essence-Galien": { - "Name": "Boss_Essence-Galien", - "SceneName": "Deepnest_40", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Essence-Markoth": { - "Name": "Boss_Essence-Markoth", - "SceneName": "Deepnest_East_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Essence-Failed_Champion": { - "Name": "Boss_Essence-Failed_Champion", - "SceneName": "Crossroads_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Essence-Soul_Tyrant": { - "Name": "Boss_Essence-Soul_Tyrant", - "SceneName": "Ruins1_24", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Essence-Lost_Kin": { - "Name": "Boss_Essence-Lost_Kin", - "SceneName": "Abyss_19", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Essence-White_Defender": { - "Name": "Boss_Essence-White_Defender", - "SceneName": "Waterways_15", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Essence-Grey_Prince_Zote": { - "Name": "Boss_Essence-Grey_Prince_Zote", - "SceneName": "Room_Bretta", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Crossroads_Acid": { - "Name": "Grub-Crossroads_Acid", - "SceneName": "Crossroads_35", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Crossroads_Center": { - "Name": "Grub-Crossroads_Center", - "SceneName": "Crossroads_05", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Crossroads_Stag": { - "Name": "Grub-Crossroads_Stag", - "SceneName": "Crossroads_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Crossroads_Spike": { - "Name": "Grub-Crossroads_Spike", - "SceneName": "Crossroads_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Crossroads_Guarded": { - "Name": "Grub-Crossroads_Guarded", - "SceneName": "Crossroads_48", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Greenpath_Cornifer": { - "Name": "Grub-Greenpath_Cornifer", - "SceneName": "Fungus1_06", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Greenpath_Journal": { - "Name": "Grub-Greenpath_Journal", - "SceneName": "Fungus1_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Greenpath_MMC": { - "Name": "Grub-Greenpath_MMC", - "SceneName": "Fungus1_13", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Greenpath_Stag": { - "Name": "Grub-Greenpath_Stag", - "SceneName": "Fungus1_21", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Fog_Canyon": { - "Name": "Grub-Fog_Canyon", - "SceneName": "Fungus3_47", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Fungal_Bouncy": { - "Name": "Grub-Fungal_Bouncy", - "SceneName": "Fungus2_18", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Fungal_Spore_Shroom": { - "Name": "Grub-Fungal_Spore_Shroom", - "SceneName": "Fungus2_20", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Deepnest_Mimic": { - "Name": "Grub-Deepnest_Mimic", - "SceneName": "Deepnest_36", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Deepnest_Nosk": { - "Name": "Grub-Deepnest_Nosk", - "SceneName": "Deepnest_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Deepnest_Spike": { - "Name": "Grub-Deepnest_Spike", - "SceneName": "Deepnest_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Dark_Deepnest": { - "Name": "Grub-Dark_Deepnest", - "SceneName": "Deepnest_39", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Beast's_Den": { - "Name": "Grub-Beast's_Den", - "SceneName": "Deepnest_Spider_Town", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Kingdom's_Edge_Oro": { - "Name": "Grub-Kingdom's_Edge_Oro", - "SceneName": "Deepnest_East_14", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Kingdom's_Edge_Camp": { - "Name": "Grub-Kingdom's_Edge_Camp", - "SceneName": "Deepnest_East_11", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Hive_External": { - "Name": "Grub-Hive_External", - "SceneName": "Hive_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Hive_Internal": { - "Name": "Grub-Hive_Internal", - "SceneName": "Hive_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Basin_Requires_Wings": { - "Name": "Grub-Basin_Requires_Wings", - "SceneName": "Abyss_19", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Basin_Requires_Dive": { - "Name": "Grub-Basin_Requires_Dive", - "SceneName": "Abyss_17", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Waterways_Main": { - "Name": "Grub-Waterways_Main", - "SceneName": "Waterways_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Isma's_Grove": { - "Name": "Grub-Isma's_Grove", - "SceneName": "Waterways_13", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Waterways_Requires_Tram": { - "Name": "Grub-Waterways_Requires_Tram", - "SceneName": "Waterways_14", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-City_of_Tears_Left": { - "Name": "Grub-City_of_Tears_Left", - "SceneName": "Ruins1_05", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Soul_Sanctum": { - "Name": "Grub-Soul_Sanctum", - "SceneName": "Ruins1_32", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Watcher's_Spire": { - "Name": "Grub-Watcher's_Spire", - "SceneName": "Ruins2_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-City_of_Tears_Guarded": { - "Name": "Grub-City_of_Tears_Guarded", - "SceneName": "Ruins_House_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-King's_Station": { - "Name": "Grub-King's_Station", - "SceneName": "Ruins2_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Resting_Grounds": { - "Name": "Grub-Resting_Grounds", - "SceneName": "RestingGrounds_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Crystal_Peak_Below_Chest": { - "Name": "Grub-Crystal_Peak_Below_Chest", - "SceneName": "Mines_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Crystallized_Mound": { - "Name": "Grub-Crystallized_Mound", - "SceneName": "Mines_35", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Crystal_Peak_Spike": { - "Name": "Grub-Crystal_Peak_Spike", - "SceneName": "Mines_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Crystal_Peak_Mimic": { - "Name": "Grub-Crystal_Peak_Mimic", - "SceneName": "Mines_16", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Crystal_Peak_Crushers": { - "Name": "Grub-Crystal_Peak_Crushers", - "SceneName": "Mines_19", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Crystal_Heart": { - "Name": "Grub-Crystal_Heart", - "SceneName": "Mines_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Hallownest_Crown": { - "Name": "Grub-Hallownest_Crown", - "SceneName": "Mines_24", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Howling_Cliffs": { - "Name": "Grub-Howling_Cliffs", - "SceneName": "Fungus1_28", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Queen's_Gardens_Stag": { - "Name": "Grub-Queen's_Gardens_Stag", - "SceneName": "Fungus3_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Queen's_Gardens_Marmu": { - "Name": "Grub-Queen's_Gardens_Marmu", - "SceneName": "Fungus3_48", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Queen's_Gardens_Top": { - "Name": "Grub-Queen's_Gardens_Top", - "SceneName": "Fungus3_22", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Collector_1": { - "Name": "Grub-Collector_1", - "SceneName": "Ruins2_11", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Collector_2": { - "Name": "Grub-Collector_2", - "SceneName": "Ruins2_11", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grub-Collector_3": { - "Name": "Grub-Collector_3", - "SceneName": "Ruins2_11", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Mimic_Grub-Deepnest_1": { - "Name": "Mimic_Grub-Deepnest_1", - "SceneName": "Deepnest_36", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Mimic_Grub-Deepnest_2": { - "Name": "Mimic_Grub-Deepnest_2", - "SceneName": "Deepnest_36", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Mimic_Grub-Deepnest_3": { - "Name": "Mimic_Grub-Deepnest_3", - "SceneName": "Deepnest_36", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Mimic_Grub-Crystal_Peak": { - "Name": "Mimic_Grub-Crystal_Peak", - "SceneName": "Mines_16", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Crossroads_Map": { - "Name": "Crossroads_Map", - "SceneName": "Crossroads_33", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Greenpath_Map": { - "Name": "Greenpath_Map", - "SceneName": "Fungus1_06", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Fog_Canyon_Map": { - "Name": "Fog_Canyon_Map", - "SceneName": "Fungus3_25", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Fungal_Wastes_Map": { - "Name": "Fungal_Wastes_Map", - "SceneName": "Fungus2_18", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Deepnest_Map-Upper": { - "Name": "Deepnest_Map-Upper", - "SceneName": "Deepnest_01b", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Deepnest_Map-Right": { - "Name": "Deepnest_Map-Right", - "SceneName": "Fungus2_25", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Ancient_Basin_Map": { - "Name": "Ancient_Basin_Map", - "SceneName": "Abyss_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Kingdom's_Edge_Map": { - "Name": "Kingdom's_Edge_Map", - "SceneName": "Deepnest_East_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "City_of_Tears_Map": { - "Name": "City_of_Tears_Map", - "SceneName": "Ruins1_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Royal_Waterways_Map": { - "Name": "Royal_Waterways_Map", - "SceneName": "Waterways_09", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Howling_Cliffs_Map": { - "Name": "Howling_Cliffs_Map", - "SceneName": "Cliffs_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Crystal_Peak_Map": { - "Name": "Crystal_Peak_Map", - "SceneName": "Mines_30", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Queen's_Gardens_Map": { - "Name": "Queen's_Gardens_Map", - "SceneName": "Fungus1_24", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Resting_Grounds_Map": { - "Name": "Resting_Grounds_Map", - "SceneName": "RestingGrounds_09", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Dirtmouth_Stag": { - "Name": "Dirtmouth_Stag", - "SceneName": "Room_Town_Stag_Station", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Crossroads_Stag": { - "Name": "Crossroads_Stag", - "SceneName": "Crossroads_47", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Greenpath_Stag": { - "Name": "Greenpath_Stag", - "SceneName": "Fungus1_16_alt", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Queen's_Station_Stag": { - "Name": "Queen's_Station_Stag", - "SceneName": "Fungus2_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Queen's_Gardens_Stag": { - "Name": "Queen's_Gardens_Stag", - "SceneName": "Fungus3_40", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "City_Storerooms_Stag": { - "Name": "City_Storerooms_Stag", - "SceneName": "Ruins1_29", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "King's_Station_Stag": { - "Name": "King's_Station_Stag", - "SceneName": "Ruins2_08", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Resting_Grounds_Stag": { - "Name": "Resting_Grounds_Stag", - "SceneName": "RestingGrounds_09", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Distant_Village_Stag": { - "Name": "Distant_Village_Stag", - "SceneName": "Deepnest_09", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hidden_Station_Stag": { - "Name": "Hidden_Station_Stag", - "SceneName": "Abyss_22", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Stag_Nest_Stag": { - "Name": "Stag_Nest_Stag", - "SceneName": "Cliffs_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lifeblood_Cocoon-King's_Pass": { - "Name": "Lifeblood_Cocoon-King's_Pass", - "SceneName": "Tutorial_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lifeblood_Cocoon-Ancestral_Mound": { - "Name": "Lifeblood_Cocoon-Ancestral_Mound", - "SceneName": "Crossroads_ShamanTemple", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lifeblood_Cocoon-Greenpath": { - "Name": "Lifeblood_Cocoon-Greenpath", - "SceneName": "Fungus1_32", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lifeblood_Cocoon-Fog_Canyon_West": { - "Name": "Lifeblood_Cocoon-Fog_Canyon_West", - "SceneName": "Fungus3_30", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lifeblood_Cocoon-Mantis_Village": { - "Name": "Lifeblood_Cocoon-Mantis_Village", - "SceneName": "Fungus2_15", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lifeblood_Cocoon-Failed_Tramway": { - "Name": "Lifeblood_Cocoon-Failed_Tramway", - "SceneName": "Deepnest_26", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lifeblood_Cocoon-Galien": { - "Name": "Lifeblood_Cocoon-Galien", - "SceneName": "Deepnest_40", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lifeblood_Cocoon-Kingdom's_Edge": { - "Name": "Lifeblood_Cocoon-Kingdom's_Edge", - "SceneName": "Deepnest_East_15", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grimmkin_Flame-City_Storerooms": { - "Name": "Grimmkin_Flame-City_Storerooms", - "SceneName": "Ruins1_28", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grimmkin_Flame-Greenpath": { - "Name": "Grimmkin_Flame-Greenpath", - "SceneName": "Fungus1_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grimmkin_Flame-Crystal_Peak": { - "Name": "Grimmkin_Flame-Crystal_Peak", - "SceneName": "Mines_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grimmkin_Flame-King's_Pass": { - "Name": "Grimmkin_Flame-King's_Pass", - "SceneName": "Tutorial_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grimmkin_Flame-Resting_Grounds": { - "Name": "Grimmkin_Flame-Resting_Grounds", - "SceneName": "RestingGrounds_06", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grimmkin_Flame-Kingdom's_Edge": { - "Name": "Grimmkin_Flame-Kingdom's_Edge", - "SceneName": "Deepnest_East_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grimmkin_Flame-Fungal_Core": { - "Name": "Grimmkin_Flame-Fungal_Core", - "SceneName": "Fungus2_30", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grimmkin_Flame-Ancient_Basin": { - "Name": "Grimmkin_Flame-Ancient_Basin", - "SceneName": "Abyss_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grimmkin_Flame-Hive": { - "Name": "Grimmkin_Flame-Hive", - "SceneName": "Hive_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Grimmkin_Flame-Brumm": { - "Name": "Grimmkin_Flame-Brumm", - "SceneName": "Room_spider_small", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Hunter's_Journal": { - "Name": "Hunter's_Journal", - "SceneName": "Fungus1_08", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Journal_Entry-Void_Tendrils": { - "Name": "Journal_Entry-Void_Tendrils", - "SceneName": "Abyss_09", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Journal_Entry-Charged_Lumafly": { - "Name": "Journal_Entry-Charged_Lumafly", - "SceneName": "Fungus3_archive_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Journal_Entry-Goam": { - "Name": "Journal_Entry-Goam", - "SceneName": "Crossroads_52", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Journal_Entry-Garpede": { - "Name": "Journal_Entry-Garpede", - "SceneName": "Deepnest_44", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Journal_Entry-Seal_of_Binding": { - "Name": "Journal_Entry-Seal_of_Binding", - "SceneName": "White_Palace_20", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Elevator_Pass": { - "Name": "Elevator_Pass", - "SceneName": "Crossroads_49b", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Split_Mothwing_Cloak": { - "Name": "Split_Mothwing_Cloak", - "SceneName": "Fungus1_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Left_Mantis_Claw": { - "Name": "Left_Mantis_Claw", - "SceneName": "Fungus2_14", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Right_Mantis_Claw": { - "Name": "Right_Mantis_Claw", - "SceneName": "Fungus2_14", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Leftslash": { - "Name": "Leftslash", - "SceneName": "Tutorial_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Rightslash": { - "Name": "Rightslash", - "SceneName": "Tutorial_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Upslash": { - "Name": "Upslash", - "SceneName": "Tutorial_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Split_Crystal_Heart": { - "Name": "Split_Crystal_Heart", - "SceneName": "Mines_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Broken_Elevator_1": { - "Name": "Geo_Rock-Broken_Elevator_1", - "SceneName": "Abyss_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Broken_Elevator_2": { - "Name": "Geo_Rock-Broken_Elevator_2", - "SceneName": "Abyss_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Broken_Elevator_3": { - "Name": "Geo_Rock-Broken_Elevator_3", - "SceneName": "Abyss_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Broken_Bridge_Upper": { - "Name": "Geo_Rock-Broken_Bridge_Upper", - "SceneName": "Abyss_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Broken_Bridge_Lower": { - "Name": "Geo_Rock-Broken_Bridge_Lower", - "SceneName": "Abyss_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Broken_Bridge_Lower_Dupe": { - "Name": "Geo_Rock-Broken_Bridge_Lower_Dupe", - "SceneName": "Abyss_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Abyss_1": { - "Name": "Geo_Rock-Abyss_1", - "SceneName": "Abyss_06_Core", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Abyss_2": { - "Name": "Geo_Rock-Abyss_2", - "SceneName": "Abyss_06_Core", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Abyss_3": { - "Name": "Geo_Rock-Abyss_3", - "SceneName": "Abyss_06_Core", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Basin_Tunnel": { - "Name": "Geo_Rock-Basin_Tunnel", - "SceneName": "Abyss_18", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Basin_Grub": { - "Name": "Geo_Rock-Basin_Grub", - "SceneName": "Abyss_19", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Basin_Before_Broken_Vessel": { - "Name": "Geo_Rock-Basin_Before_Broken_Vessel", - "SceneName": "Abyss_19", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Cliffs_Main_1": { - "Name": "Geo_Rock-Cliffs_Main_1", - "SceneName": "Cliffs_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Cliffs_Main_2": { - "Name": "Geo_Rock-Cliffs_Main_2", - "SceneName": "Cliffs_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Cliffs_Main_3": { - "Name": "Geo_Rock-Cliffs_Main_3", - "SceneName": "Cliffs_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Cliffs_Main_4": { - "Name": "Geo_Rock-Cliffs_Main_4", - "SceneName": "Cliffs_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Below_Gorb_Dupe": { - "Name": "Geo_Rock-Below_Gorb_Dupe", - "SceneName": "Cliffs_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Below_Gorb": { - "Name": "Geo_Rock-Below_Gorb", - "SceneName": "Cliffs_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Well": { - "Name": "Geo_Rock-Crossroads_Well", - "SceneName": "Crossroads_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Center_Grub": { - "Name": "Geo_Rock-Crossroads_Center_Grub", - "SceneName": "Crossroads_05", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Root": { - "Name": "Geo_Rock-Crossroads_Root", - "SceneName": "Crossroads_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Root_Dupe_1": { - "Name": "Geo_Rock-Crossroads_Root_Dupe_1", - "SceneName": "Crossroads_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Root_Dupe_2": { - "Name": "Geo_Rock-Crossroads_Root_Dupe_2", - "SceneName": "Crossroads_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Aspid_Arena": { - "Name": "Geo_Rock-Crossroads_Aspid_Arena", - "SceneName": "Crossroads_08", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Aspid_Arena_Dupe_1": { - "Name": "Geo_Rock-Crossroads_Aspid_Arena_Dupe_1", - "SceneName": "Crossroads_08", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Aspid_Arena_Dupe_2": { - "Name": "Geo_Rock-Crossroads_Aspid_Arena_Dupe_2", - "SceneName": "Crossroads_08", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Aspid_Arena_Hidden": { - "Name": "Geo_Rock-Crossroads_Aspid_Arena_Hidden", - "SceneName": "Crossroads_08", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Above_False_Knight": { - "Name": "Geo_Rock-Crossroads_Above_False_Knight", - "SceneName": "Crossroads_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Before_Acid_Grub": { - "Name": "Geo_Rock-Crossroads_Before_Acid_Grub", - "SceneName": "Crossroads_12", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Below_Goam_Mask_Shard": { - "Name": "Geo_Rock-Crossroads_Below_Goam_Mask_Shard", - "SceneName": "Crossroads_13", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_After_Goam_Mask_Shard": { - "Name": "Geo_Rock-Crossroads_After_Goam_Mask_Shard", - "SceneName": "Crossroads_13", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Above_Lever": { - "Name": "Geo_Rock-Crossroads_Above_Lever", - "SceneName": "Crossroads_16", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Before_Fungal": { - "Name": "Geo_Rock-Crossroads_Before_Fungal", - "SceneName": "Crossroads_18", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Before_Fungal_Dupe_1": { - "Name": "Geo_Rock-Crossroads_Before_Fungal_Dupe_1", - "SceneName": "Crossroads_18", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Before_Fungal_Dupe_2": { - "Name": "Geo_Rock-Crossroads_Before_Fungal_Dupe_2", - "SceneName": "Crossroads_18", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Before_Shops": { - "Name": "Geo_Rock-Crossroads_Before_Shops", - "SceneName": "Crossroads_19", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Before_Glowing_Womb": { - "Name": "Geo_Rock-Crossroads_Before_Glowing_Womb", - "SceneName": "Crossroads_21", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Above_Tram": { - "Name": "Geo_Rock-Crossroads_Above_Tram", - "SceneName": "Crossroads_27", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Above_Mawlek": { - "Name": "Geo_Rock-Crossroads_Above_Mawlek", - "SceneName": "Crossroads_36", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Vessel_Fragment": { - "Name": "Geo_Rock-Crossroads_Vessel_Fragment", - "SceneName": "Crossroads_37", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Goam_Alcove": { - "Name": "Geo_Rock-Crossroads_Goam_Alcove", - "SceneName": "Crossroads_42", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Goam_Damage_Boost": { - "Name": "Geo_Rock-Crossroads_Goam_Damage_Boost", - "SceneName": "Crossroads_42", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Tram": { - "Name": "Geo_Rock-Crossroads_Tram", - "SceneName": "Crossroads_46", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Goam_Journal": { - "Name": "Geo_Rock-Crossroads_Goam_Journal", - "SceneName": "Crossroads_52", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crossroads_Goam_Journal_Dupe": { - "Name": "Geo_Rock-Crossroads_Goam_Journal_Dupe", - "SceneName": "Crossroads_52", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Ancestral_Mound": { - "Name": "Geo_Rock-Ancestral_Mound", - "SceneName": "Crossroads_ShamanTemple", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Ancestral_Mound_Dupe": { - "Name": "Geo_Rock-Ancestral_Mound_Dupe", - "SceneName": "Crossroads_ShamanTemple", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Ancestral_Mound_Tree": { - "Name": "Geo_Rock-Ancestral_Mound_Tree", - "SceneName": "Crossroads_ShamanTemple", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Ancestral_Mound_Tree_Dupe": { - "Name": "Geo_Rock-Ancestral_Mound_Tree_Dupe", - "SceneName": "Crossroads_ShamanTemple", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Moss_Prophet": { - "Name": "Geo_Rock-Moss_Prophet", - "SceneName": "Deepnest_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Moss_Prophet_Dupe": { - "Name": "Geo_Rock-Moss_Prophet_Dupe", - "SceneName": "Deepnest_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_Below_Mimics": { - "Name": "Geo_Rock-Deepnest_Below_Mimics", - "SceneName": "Deepnest_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_Below_Mimics_Dupe": { - "Name": "Geo_Rock-Deepnest_Below_Mimics_Dupe", - "SceneName": "Deepnest_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_Below_Spike_Grub": { - "Name": "Geo_Rock-Deepnest_Below_Spike_Grub", - "SceneName": "Deepnest_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_Below_Spike_Grub_Dupe": { - "Name": "Geo_Rock-Deepnest_Below_Spike_Grub_Dupe", - "SceneName": "Deepnest_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_Spike_Grub_Right": { - "Name": "Geo_Rock-Deepnest_Spike_Grub_Right", - "SceneName": "Deepnest_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_By_Mantis_Lords_Garpede_Pogo": { - "Name": "Geo_Rock-Deepnest_By_Mantis_Lords_Garpede_Pogo", - "SceneName": "Deepnest_16", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_By_Mantis_Lords_Garpede_Pogo_Dupe": { - "Name": "Geo_Rock-Deepnest_By_Mantis_Lords_Garpede_Pogo_Dupe", - "SceneName": "Deepnest_16", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_1": { - "Name": "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_1", - "SceneName": "Deepnest_16", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_2": { - "Name": "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_2", - "SceneName": "Deepnest_16", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_3": { - "Name": "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_3", - "SceneName": "Deepnest_16", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_Nosk_1": { - "Name": "Geo_Rock-Deepnest_Nosk_1", - "SceneName": "Deepnest_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_Nosk_2": { - "Name": "Geo_Rock-Deepnest_Nosk_2", - "SceneName": "Deepnest_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_Nosk_3": { - "Name": "Geo_Rock-Deepnest_Nosk_3", - "SceneName": "Deepnest_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_Above_Galien": { - "Name": "Geo_Rock-Deepnest_Above_Galien", - "SceneName": "Deepnest_35", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_Galien_Spike": { - "Name": "Geo_Rock-Deepnest_Galien_Spike", - "SceneName": "Deepnest_35", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_Garpede_1": { - "Name": "Geo_Rock-Deepnest_Garpede_1", - "SceneName": "Deepnest_37", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_Garpede_2": { - "Name": "Geo_Rock-Deepnest_Garpede_2", - "SceneName": "Deepnest_37", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Dark_Deepnest_Above_Grub_1": { - "Name": "Geo_Rock-Dark_Deepnest_Above_Grub_1", - "SceneName": "Deepnest_39", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Dark_Deepnest_Above_Grub_2": { - "Name": "Geo_Rock-Dark_Deepnest_Above_Grub_2", - "SceneName": "Deepnest_39", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Dark_Deepnest_Bottom_Left": { - "Name": "Geo_Rock-Dark_Deepnest_Bottom_Left", - "SceneName": "Deepnest_39", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Above_Mask_Maker_1": { - "Name": "Geo_Rock-Above_Mask_Maker_1", - "SceneName": "Deepnest_43", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Above_Mask_Maker_2": { - "Name": "Geo_Rock-Above_Mask_Maker_2", - "SceneName": "Deepnest_43", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Lower_Kingdom's_Edge_1": { - "Name": "Geo_Rock-Lower_Kingdom's_Edge_1", - "SceneName": "Deepnest_East_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Lower_Kingdom's_Edge_2": { - "Name": "Geo_Rock-Lower_Kingdom's_Edge_2", - "SceneName": "Deepnest_East_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Lower_Kingdom's_Edge_3": { - "Name": "Geo_Rock-Lower_Kingdom's_Edge_3", - "SceneName": "Deepnest_East_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Lower_Kingdom's_Edge_Dive": { - "Name": "Geo_Rock-Lower_Kingdom's_Edge_Dive", - "SceneName": "Deepnest_East_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Kingdom's_Edge_Below_Bardoon": { - "Name": "Geo_Rock-Kingdom's_Edge_Below_Bardoon", - "SceneName": "Deepnest_East_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Kingdom's_Edge_Oro_Far_Left": { - "Name": "Geo_Rock-Kingdom's_Edge_Oro_Far_Left", - "SceneName": "Deepnest_East_06", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Kingdom's_Edge_Oro_Middle_Left": { - "Name": "Geo_Rock-Kingdom's_Edge_Oro_Middle_Left", - "SceneName": "Deepnest_East_06", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Kingdom's_Edge_Above_Root": { - "Name": "Geo_Rock-Kingdom's_Edge_Above_Root", - "SceneName": "Deepnest_East_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Kingdom's_Edge_Above_Tower": { - "Name": "Geo_Rock-Kingdom's_Edge_Above_Tower", - "SceneName": "Deepnest_East_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Kingdom's_Edge_Below_Colosseum": { - "Name": "Geo_Rock-Kingdom's_Edge_Below_Colosseum", - "SceneName": "Deepnest_East_08", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Kingdom's_Edge_Above_420_Geo_Rock": { - "Name": "Geo_Rock-Kingdom's_Edge_Above_420_Geo_Rock", - "SceneName": "Deepnest_East_17", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Kingdom's_Edge_420_Geo_Rock": { - "Name": "Geo_Rock-Kingdom's_Edge_420_Geo_Rock", - "SceneName": "Deepnest_East_17", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Beast's_Den_Above_Trilobite": { - "Name": "Geo_Rock-Beast's_Den_Above_Trilobite", - "SceneName": "Deepnest_Spider_Town", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Beast's_Den_Above_Trilobite_Dupe": { - "Name": "Geo_Rock-Beast's_Den_Above_Trilobite_Dupe", - "SceneName": "Deepnest_Spider_Town", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Beast's_Den_Below_Herrah": { - "Name": "Geo_Rock-Beast's_Den_Below_Herrah", - "SceneName": "Deepnest_Spider_Town", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Beast's_Den_Below_Egg": { - "Name": "Geo_Rock-Beast's_Den_Below_Egg", - "SceneName": "Deepnest_Spider_Town", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Beast's_Den_Below_Egg_Dupe": { - "Name": "Geo_Rock-Beast's_Den_Below_Egg_Dupe", - "SceneName": "Deepnest_Spider_Town", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Beast's_Den_Bottom": { - "Name": "Geo_Rock-Beast's_Den_Bottom", - "SceneName": "Deepnest_Spider_Town", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Beast's_Den_Bottom_Dupe": { - "Name": "Geo_Rock-Beast's_Den_Bottom_Dupe", - "SceneName": "Deepnest_Spider_Town", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Beast's_Den_After_Herrah": { - "Name": "Geo_Rock-Beast's_Den_After_Herrah", - "SceneName": "Deepnest_Spider_Town", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Entrance": { - "Name": "Geo_Rock-Greenpath_Entrance", - "SceneName": "Fungus1_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Waterfall": { - "Name": "Geo_Rock-Greenpath_Waterfall", - "SceneName": "Fungus1_01b", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Below_Skip_Squit": { - "Name": "Geo_Rock-Greenpath_Below_Skip_Squit", - "SceneName": "Fungus1_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Skip_Squit": { - "Name": "Geo_Rock-Greenpath_Skip_Squit", - "SceneName": "Fungus1_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Second_Skip_Fool_Eater": { - "Name": "Geo_Rock-Greenpath_Second_Skip_Fool_Eater", - "SceneName": "Fungus1_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Second_Skip_Fool_Eater_Dupe": { - "Name": "Geo_Rock-Greenpath_Second_Skip_Fool_Eater_Dupe", - "SceneName": "Fungus1_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Second_Skip_Lower": { - "Name": "Geo_Rock-Greenpath_Second_Skip_Lower", - "SceneName": "Fungus1_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Below_Hornet": { - "Name": "Geo_Rock-Greenpath_Below_Hornet", - "SceneName": "Fungus1_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Above_Thorns": { - "Name": "Geo_Rock-Greenpath_Above_Thorns", - "SceneName": "Fungus1_05", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Hunter's_Journal": { - "Name": "Geo_Rock-Greenpath_Hunter's_Journal", - "SceneName": "Fungus1_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Acid_Bridge": { - "Name": "Geo_Rock-Greenpath_Acid_Bridge", - "SceneName": "Fungus1_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_After_MMC_Hidden": { - "Name": "Geo_Rock-Greenpath_After_MMC_Hidden", - "SceneName": "Fungus1_12", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_After_MMC": { - "Name": "Geo_Rock-Greenpath_After_MMC", - "SceneName": "Fungus1_12", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_After_MMC_Dupe": { - "Name": "Geo_Rock-Greenpath_After_MMC_Dupe", - "SceneName": "Fungus1_12", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Obbles_Fool_Eater": { - "Name": "Geo_Rock-Greenpath_Obbles_Fool_Eater", - "SceneName": "Fungus1_19", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Moss_Knights": { - "Name": "Geo_Rock-Greenpath_Moss_Knights", - "SceneName": "Fungus1_21", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Moss_Knights_Dupe_1": { - "Name": "Geo_Rock-Greenpath_Moss_Knights_Dupe_1", - "SceneName": "Fungus1_21", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Moss_Knights_Dupe_2": { - "Name": "Geo_Rock-Greenpath_Moss_Knights_Dupe_2", - "SceneName": "Fungus1_21", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Below_Stag": { - "Name": "Geo_Rock-Greenpath_Below_Stag", - "SceneName": "Fungus1_22", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Below_Stag_Fool_Eater": { - "Name": "Geo_Rock-Greenpath_Below_Stag_Fool_Eater", - "SceneName": "Fungus1_22", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Baldur_Shell_Top_Left": { - "Name": "Geo_Rock-Baldur_Shell_Top_Left", - "SceneName": "Fungus1_28", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Baldur_Shell_Alcove": { - "Name": "Geo_Rock-Baldur_Shell_Alcove", - "SceneName": "Fungus1_28", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_MMC": { - "Name": "Geo_Rock-Greenpath_MMC", - "SceneName": "Fungus1_29", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Below_Toll": { - "Name": "Geo_Rock-Greenpath_Below_Toll", - "SceneName": "Fungus1_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Toll_Hidden": { - "Name": "Geo_Rock-Greenpath_Toll_Hidden", - "SceneName": "Fungus1_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Greenpath_Toll_Hidden_Dupe": { - "Name": "Geo_Rock-Greenpath_Toll_Hidden_Dupe", - "SceneName": "Fungus1_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Fungal_Below_Shrumal_Ogres": { - "Name": "Geo_Rock-Fungal_Below_Shrumal_Ogres", - "SceneName": "Fungus2_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Fungal_Above_Cloth": { - "Name": "Geo_Rock-Fungal_Above_Cloth", - "SceneName": "Fungus2_08", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Fungal_After_Cloth": { - "Name": "Geo_Rock-Fungal_After_Cloth", - "SceneName": "Fungus2_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Fungal_Below_Pilgrim's_Way": { - "Name": "Geo_Rock-Fungal_Below_Pilgrim's_Way", - "SceneName": "Fungus2_11", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Fungal_Below_Pilgrim's_Way_Dupe": { - "Name": "Geo_Rock-Fungal_Below_Pilgrim's_Way_Dupe", - "SceneName": "Fungus2_11", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Mantis_Outskirts_Guarded": { - "Name": "Geo_Rock-Mantis_Outskirts_Guarded", - "SceneName": "Fungus2_13", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Mantis_Outskirts_Guarded_Dupe": { - "Name": "Geo_Rock-Mantis_Outskirts_Guarded_Dupe", - "SceneName": "Fungus2_13", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Mantis_Outskirts_Alcove": { - "Name": "Geo_Rock-Mantis_Outskirts_Alcove", - "SceneName": "Fungus2_13", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Mantis_Village_After_Lever": { - "Name": "Geo_Rock-Mantis_Village_After_Lever", - "SceneName": "Fungus2_14", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Mantis_Village_Above_Claw": { - "Name": "Geo_Rock-Mantis_Village_Above_Claw", - "SceneName": "Fungus2_14", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Mantis_Village_Above_Claw_Dupe": { - "Name": "Geo_Rock-Mantis_Village_Above_Claw_Dupe", - "SceneName": "Fungus2_14", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Mantis_Village_Below_Lore": { - "Name": "Geo_Rock-Mantis_Village_Below_Lore", - "SceneName": "Fungus2_14", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Mantis_Village_Above_Lever": { - "Name": "Geo_Rock-Mantis_Village_Above_Lever", - "SceneName": "Fungus2_14", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Above_Mantis_Lords_1": { - "Name": "Geo_Rock-Above_Mantis_Lords_1", - "SceneName": "Fungus2_15", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Above_Mantis_Lords_2": { - "Name": "Geo_Rock-Above_Mantis_Lords_2", - "SceneName": "Fungus2_15", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Fungal_After_Bouncy_Grub": { - "Name": "Geo_Rock-Fungal_After_Bouncy_Grub", - "SceneName": "Fungus2_18", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Fungal_After_Bouncy_Grub_Dupe": { - "Name": "Geo_Rock-Fungal_After_Bouncy_Grub_Dupe", - "SceneName": "Fungus2_18", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Fungal_Bouncy_Grub_Lever": { - "Name": "Geo_Rock-Fungal_Bouncy_Grub_Lever", - "SceneName": "Fungus2_18", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Fungal_After_Cornifer": { - "Name": "Geo_Rock-Fungal_After_Cornifer", - "SceneName": "Fungus2_18", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Fungal_Above_City_Entrance": { - "Name": "Geo_Rock-Fungal_Above_City_Entrance", - "SceneName": "Fungus2_21", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_By_Mantis_Lords_1": { - "Name": "Geo_Rock-Deepnest_By_Mantis_Lords_1", - "SceneName": "Fungus2_25", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_By_Mantis_Lords_2": { - "Name": "Geo_Rock-Deepnest_By_Mantis_Lords_2", - "SceneName": "Fungus2_25", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Deepnest_Lower_Cornifer": { - "Name": "Geo_Rock-Deepnest_Lower_Cornifer", - "SceneName": "Fungus2_25", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Fungal_Core_Entrance": { - "Name": "Geo_Rock-Fungal_Core_Entrance", - "SceneName": "Fungus2_29", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Fungal_Core_Hidden": { - "Name": "Geo_Rock-Fungal_Core_Hidden", - "SceneName": "Fungus2_30", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Fungal_Core_Above_Elder": { - "Name": "Geo_Rock-Fungal_Core_Above_Elder", - "SceneName": "Fungus2_30", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Queen's_Gardens_Acid_Entrance": { - "Name": "Geo_Rock-Queen's_Gardens_Acid_Entrance", - "SceneName": "Fungus3_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Queen's_Gardens_Below_Stag": { - "Name": "Geo_Rock-Queen's_Gardens_Below_Stag", - "SceneName": "Fungus3_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Fog_Canyon_East": { - "Name": "Geo_Rock-Fog_Canyon_East", - "SceneName": "Fungus3_26", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Love_Key": { - "Name": "Geo_Rock-Love_Key", - "SceneName": "Fungus3_39", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Love_Key_Dupe": { - "Name": "Geo_Rock-Love_Key_Dupe", - "SceneName": "Fungus3_39", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Queen's_Gardens_Above_Marmu": { - "Name": "Geo_Rock-Queen's_Gardens_Above_Marmu", - "SceneName": "Fungus3_48", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Pale_Lurker": { - "Name": "Geo_Rock-Pale_Lurker", - "SceneName": "GG_Lurker", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Godhome_Pipeway": { - "Name": "Geo_Rock-Godhome_Pipeway", - "SceneName": "GG_Pipeway", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Hive_Entrance": { - "Name": "Geo_Rock-Hive_Entrance", - "SceneName": "Hive_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Hive_Outside_Bench": { - "Name": "Geo_Rock-Hive_Outside_Bench", - "SceneName": "Hive_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Hive_Below_Root": { - "Name": "Geo_Rock-Hive_Below_Root", - "SceneName": "Hive_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Hive_After_Root": { - "Name": "Geo_Rock-Hive_After_Root", - "SceneName": "Hive_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Hive_Below_Stash": { - "Name": "Geo_Rock-Hive_Below_Stash", - "SceneName": "Hive_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Hive_Stash": { - "Name": "Geo_Rock-Hive_Stash", - "SceneName": "Hive_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Hive_Stash_Dupe": { - "Name": "Geo_Rock-Hive_Stash_Dupe", - "SceneName": "Hive_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Hive_Below_Grub": { - "Name": "Geo_Rock-Hive_Below_Grub", - "SceneName": "Hive_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Hive_Above_Mask": { - "Name": "Geo_Rock-Hive_Above_Mask", - "SceneName": "Hive_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crystal_Peak_Lower_Middle": { - "Name": "Geo_Rock-Crystal_Peak_Lower_Middle", - "SceneName": "Mines_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crystal_Peak_Lower_Conveyer_1": { - "Name": "Geo_Rock-Crystal_Peak_Lower_Conveyer_1", - "SceneName": "Mines_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crystal_Peak_Lower_Conveyer_2": { - "Name": "Geo_Rock-Crystal_Peak_Lower_Conveyer_2", - "SceneName": "Mines_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crystal_Peak_Before_Dark_Room": { - "Name": "Geo_Rock-Crystal_Peak_Before_Dark_Room", - "SceneName": "Mines_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crystal_Peak_Before_Dark_Room_Dupe": { - "Name": "Geo_Rock-Crystal_Peak_Before_Dark_Room_Dupe", - "SceneName": "Mines_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crystal_Peak_Above_Spike_Grub": { - "Name": "Geo_Rock-Crystal_Peak_Above_Spike_Grub", - "SceneName": "Mines_05", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crystal_Peak_Mimic_Grub": { - "Name": "Geo_Rock-Crystal_Peak_Mimic_Grub", - "SceneName": "Mines_16", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crystal_Peak_Dive_Egg": { - "Name": "Geo_Rock-Crystal_Peak_Dive_Egg", - "SceneName": "Mines_20", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crystal_Peak_Dive_Egg_Dupe": { - "Name": "Geo_Rock-Crystal_Peak_Dive_Egg_Dupe", - "SceneName": "Mines_20", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crystal_Peak_Conga_Line": { - "Name": "Geo_Rock-Crystal_Peak_Conga_Line", - "SceneName": "Mines_20", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Hallownest_Crown_Dive": { - "Name": "Geo_Rock-Hallownest_Crown_Dive", - "SceneName": "Mines_25", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Hallownest_Crown_Dive_Dupe": { - "Name": "Geo_Rock-Hallownest_Crown_Dive_Dupe", - "SceneName": "Mines_25", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Hallownest_Crown_Hidden": { - "Name": "Geo_Rock-Hallownest_Crown_Hidden", - "SceneName": "Mines_25", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Hallownest_Crown_Hidden_Dupe_1": { - "Name": "Geo_Rock-Hallownest_Crown_Hidden_Dupe_1", - "SceneName": "Mines_25", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Hallownest_Crown_Hidden_Dupe_2": { - "Name": "Geo_Rock-Hallownest_Crown_Hidden_Dupe_2", - "SceneName": "Mines_25", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crystal_Peak_Before_Crystal_Heart": { - "Name": "Geo_Rock-Crystal_Peak_Before_Crystal_Heart", - "SceneName": "Mines_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crystal_Peak_Entrance": { - "Name": "Geo_Rock-Crystal_Peak_Entrance", - "SceneName": "Mines_33", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crystal_Peak_Entrance_Dupe_1": { - "Name": "Geo_Rock-Crystal_Peak_Entrance_Dupe_1", - "SceneName": "Mines_33", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crystal_Peak_Entrance_Dupe_2": { - "Name": "Geo_Rock-Crystal_Peak_Entrance_Dupe_2", - "SceneName": "Mines_33", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crystal_Peak_Above_Crushers_Lower": { - "Name": "Geo_Rock-Crystal_Peak_Above_Crushers_Lower", - "SceneName": "Mines_37", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Crystal_Peak_Above_Crushers_Higher": { - "Name": "Geo_Rock-Crystal_Peak_Above_Crushers_Higher", - "SceneName": "Mines_37", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Resting_Grounds_Catacombs_Grub": { - "Name": "Geo_Rock-Resting_Grounds_Catacombs_Grub", - "SceneName": "RestingGrounds_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Resting_Grounds_Catacombs_Left_Dupe": { - "Name": "Geo_Rock-Resting_Grounds_Catacombs_Left_Dupe", - "SceneName": "RestingGrounds_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Resting_Grounds_Catacombs_Left": { - "Name": "Geo_Rock-Resting_Grounds_Catacombs_Left", - "SceneName": "RestingGrounds_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Overgrown_Mound": { - "Name": "Geo_Rock-Overgrown_Mound", - "SceneName": "Room_Fungus_Shaman", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Fluke_Hermit_Dupe": { - "Name": "Geo_Rock-Fluke_Hermit_Dupe", - "SceneName": "Room_GG_Shortcut", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Fluke_Hermit": { - "Name": "Geo_Rock-Fluke_Hermit", - "SceneName": "Room_GG_Shortcut", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Pleasure_House": { - "Name": "Geo_Rock-Pleasure_House", - "SceneName": "Ruins_Elevator", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-City_of_Tears_Quirrel": { - "Name": "Geo_Rock-City_of_Tears_Quirrel", - "SceneName": "Ruins1_03", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-City_of_Tears_Lemm": { - "Name": "Geo_Rock-City_of_Tears_Lemm", - "SceneName": "Ruins1_05b", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-City_of_Tears_Above_Lemm": { - "Name": "Geo_Rock-City_of_Tears_Above_Lemm", - "SceneName": "Ruins1_05c", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Soul_Sanctum": { - "Name": "Geo_Rock-Soul_Sanctum", - "SceneName": "Ruins1_32", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Watcher's_Spire": { - "Name": "Geo_Rock-Watcher's_Spire", - "SceneName": "Ruins2_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Above_King's_Station": { - "Name": "Geo_Rock-Above_King's_Station", - "SceneName": "Ruins2_05", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-King's_Station": { - "Name": "Geo_Rock-King's_Station", - "SceneName": "Ruins2_06", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-King's_Pass_Left": { - "Name": "Geo_Rock-King's_Pass_Left", - "SceneName": "Tutorial_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-King's_Pass_Below_Fury": { - "Name": "Geo_Rock-King's_Pass_Below_Fury", - "SceneName": "Tutorial_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-King's_Pass_Hidden": { - "Name": "Geo_Rock-King's_Pass_Hidden", - "SceneName": "Tutorial_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-King's_Pass_Collapse": { - "Name": "Geo_Rock-King's_Pass_Collapse", - "SceneName": "Tutorial_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-King's_Pass_Above_Fury": { - "Name": "Geo_Rock-King's_Pass_Above_Fury", - "SceneName": "Tutorial_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Waterways_Tuk": { - "Name": "Geo_Rock-Waterways_Tuk", - "SceneName": "Waterways_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Waterways_Tuk_Alcove": { - "Name": "Geo_Rock-Waterways_Tuk_Alcove", - "SceneName": "Waterways_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Waterways_Left": { - "Name": "Geo_Rock-Waterways_Left", - "SceneName": "Waterways_04b", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Waterways_East": { - "Name": "Geo_Rock-Waterways_East", - "SceneName": "Waterways_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Geo_Rock-Waterways_Flukemarm": { - "Name": "Geo_Rock-Waterways_Flukemarm", - "SceneName": "Waterways_08", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Geo-Massive_Moss_Charger": { - "Name": "Boss_Geo-Massive_Moss_Charger", - "SceneName": "Fungus1_29", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Geo-Gorgeous_Husk": { - "Name": "Boss_Geo-Gorgeous_Husk", - "SceneName": "Ruins_House_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Geo-Sanctum_Soul_Warrior": { - "Name": "Boss_Geo-Sanctum_Soul_Warrior", - "SceneName": "Ruins1_23", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Geo-Elegant_Soul_Warrior": { - "Name": "Boss_Geo-Elegant_Soul_Warrior", - "SceneName": "Ruins1_31b", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Geo-Crystal_Guardian": { - "Name": "Boss_Geo-Crystal_Guardian", - "SceneName": "Mines_18", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Geo-Enraged_Guardian": { - "Name": "Boss_Geo-Enraged_Guardian", - "SceneName": "Mines_32", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Geo-Gruz_Mother": { - "Name": "Boss_Geo-Gruz_Mother", - "SceneName": "Crossroads_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Boss_Geo-Vengefly_King": { - "Name": "Boss_Geo-Vengefly_King", - "SceneName": "Fungus1_20_v02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Basin": { - "Name": "Soul_Totem-Basin", - "SceneName": "Abyss_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Cliffs_Main": { - "Name": "Soul_Totem-Cliffs_Main", - "SceneName": "Cliffs_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Cliffs_Gorb": { - "Name": "Soul_Totem-Cliffs_Gorb", - "SceneName": "Cliffs_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Cliffs_Joni's": { - "Name": "Soul_Totem-Cliffs_Joni's", - "SceneName": "Cliffs_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Crossroads_Goam_Journal": { - "Name": "Soul_Totem-Crossroads_Goam_Journal", - "SceneName": "Crossroads_18", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Crossroads_Shops": { - "Name": "Soul_Totem-Crossroads_Shops", - "SceneName": "Crossroads_19", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Crossroads_Mawlek_Upper": { - "Name": "Soul_Totem-Crossroads_Mawlek_Upper", - "SceneName": "Crossroads_25", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Crossroads_Acid": { - "Name": "Soul_Totem-Crossroads_Acid", - "SceneName": "Crossroads_35", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Crossroads_Mawlek_Lower": { - "Name": "Soul_Totem-Crossroads_Mawlek_Lower", - "SceneName": "Crossroads_36", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Crossroads_Myla": { - "Name": "Soul_Totem-Crossroads_Myla", - "SceneName": "Crossroads_45", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Ancestral_Mound": { - "Name": "Soul_Totem-Ancestral_Mound", - "SceneName": "Crossroads_ShamanTemple", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Distant_Village": { - "Name": "Soul_Totem-Distant_Village", - "SceneName": "Deepnest_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Deepnest_Vessel": { - "Name": "Soul_Totem-Deepnest_Vessel", - "SceneName": "Deepnest_38", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Mask_Maker": { - "Name": "Soul_Totem-Mask_Maker", - "SceneName": "Deepnest_42", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Lower_Kingdom's_Edge_1": { - "Name": "Soul_Totem-Lower_Kingdom's_Edge_1", - "SceneName": "Deepnest_East_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Lower_Kingdom's_Edge_2": { - "Name": "Soul_Totem-Lower_Kingdom's_Edge_2", - "SceneName": "Deepnest_East_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Upper_Kingdom's_Edge": { - "Name": "Soul_Totem-Upper_Kingdom's_Edge", - "SceneName": "Deepnest_East_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Kingdom's_Edge_Camp": { - "Name": "Soul_Totem-Kingdom's_Edge_Camp", - "SceneName": "Deepnest_East_11", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Oro_Dive_2": { - "Name": "Soul_Totem-Oro_Dive_2", - "SceneName": "Deepnest_East_14", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Oro_Dive_1": { - "Name": "Soul_Totem-Oro_Dive_1", - "SceneName": "Deepnest_East_14", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Oro": { - "Name": "Soul_Totem-Oro", - "SceneName": "Deepnest_East_16", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-420_Geo_Rock": { - "Name": "Soul_Totem-420_Geo_Rock", - "SceneName": "Deepnest_East_17", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Beast's_Den": { - "Name": "Soul_Totem-Beast's_Den", - "SceneName": "Deepnest_Spider_Town", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Greenpath_Hunter's_Journal": { - "Name": "Soul_Totem-Greenpath_Hunter's_Journal", - "SceneName": "Fungus1_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Greenpath_MMC": { - "Name": "Soul_Totem-Greenpath_MMC", - "SceneName": "Fungus1_29", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Greenpath_Below_Toll": { - "Name": "Soul_Totem-Greenpath_Below_Toll", - "SceneName": "Fungus1_30", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Before_Pilgrim's_Way": { - "Name": "Soul_Totem-Before_Pilgrim's_Way", - "SceneName": "Fungus2_10", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Pilgrim's_Way": { - "Name": "Soul_Totem-Pilgrim's_Way", - "SceneName": "Fungus2_21", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Fungal_Core": { - "Name": "Soul_Totem-Fungal_Core", - "SceneName": "Fungus2_29", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Top_Left_Queen's_Gardens": { - "Name": "Soul_Totem-Top_Left_Queen's_Gardens", - "SceneName": "Fungus3_21", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Below_Marmu": { - "Name": "Soul_Totem-Below_Marmu", - "SceneName": "Fungus3_40", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Upper_Crystal_Peak": { - "Name": "Soul_Totem-Upper_Crystal_Peak", - "SceneName": "Mines_20", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Hallownest_Crown": { - "Name": "Soul_Totem-Hallownest_Crown", - "SceneName": "Mines_25", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Outside_Crystallized_Mound": { - "Name": "Soul_Totem-Outside_Crystallized_Mound", - "SceneName": "Mines_28", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Crystal_Heart_1": { - "Name": "Soul_Totem-Crystal_Heart_1", - "SceneName": "Mines_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Crystal_Heart_2": { - "Name": "Soul_Totem-Crystal_Heart_2", - "SceneName": "Mines_31", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Crystallized_Mound": { - "Name": "Soul_Totem-Crystallized_Mound", - "SceneName": "Mines_35", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Resting_Grounds": { - "Name": "Soul_Totem-Resting_Grounds", - "SceneName": "RestingGrounds_05", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Below_Xero": { - "Name": "Soul_Totem-Below_Xero", - "SceneName": "RestingGrounds_06", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Sanctum_Below_Soul_Master": { - "Name": "Soul_Totem-Sanctum_Below_Soul_Master", - "SceneName": "Ruins1_24", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Sanctum_Below_Chest": { - "Name": "Soul_Totem-Sanctum_Below_Chest", - "SceneName": "Ruins1_32", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Sanctum_Above_Grub": { - "Name": "Soul_Totem-Sanctum_Above_Grub", - "SceneName": "Ruins1_32", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Waterways_Entrance": { - "Name": "Soul_Totem-Waterways_Entrance", - "SceneName": "Waterways_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Top_Left_Waterways": { - "Name": "Soul_Totem-Top_Left_Waterways", - "SceneName": "Waterways_04b", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Waterways_East": { - "Name": "Soul_Totem-Waterways_East", - "SceneName": "Waterways_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Waterways_Flukemarm": { - "Name": "Soul_Totem-Waterways_Flukemarm", - "SceneName": "Waterways_08", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-White_Palace_Entrance": { - "Name": "Soul_Totem-White_Palace_Entrance", - "SceneName": "White_Palace_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-White_Palace_Hub": { - "Name": "Soul_Totem-White_Palace_Hub", - "SceneName": "White_Palace_03_hub", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-White_Palace_Left": { - "Name": "Soul_Totem-White_Palace_Left", - "SceneName": "White_Palace_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-White_Palace_Final": { - "Name": "Soul_Totem-White_Palace_Final", - "SceneName": "White_Palace_09", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-White_Palace_Right": { - "Name": "Soul_Totem-White_Palace_Right", - "SceneName": "White_Palace_15", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Path_of_Pain_Below_Lever": { - "Name": "Soul_Totem-Path_of_Pain_Below_Lever", - "SceneName": "White_Palace_17", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Path_of_Pain_Left_of_Lever": { - "Name": "Soul_Totem-Path_of_Pain_Left_of_Lever", - "SceneName": "White_Palace_17", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Path_of_Pain_Entrance": { - "Name": "Soul_Totem-Path_of_Pain_Entrance", - "SceneName": "White_Palace_18", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Path_of_Pain_Second": { - "Name": "Soul_Totem-Path_of_Pain_Second", - "SceneName": "White_Palace_18", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Path_of_Pain_Hidden": { - "Name": "Soul_Totem-Path_of_Pain_Hidden", - "SceneName": "White_Palace_19", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Path_of_Pain_Below_Thornskip": { - "Name": "Soul_Totem-Path_of_Pain_Below_Thornskip", - "SceneName": "White_Palace_19", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Path_of_Pain_Final": { - "Name": "Soul_Totem-Path_of_Pain_Final", - "SceneName": "White_Palace_20", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Soul_Totem-Pale_Lurker": { - "Name": "Soul_Totem-Pale_Lurker", - "SceneName": "GG_Lurker", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-City_Entrance": { - "Name": "Lore_Tablet-City_Entrance", - "SceneName": "Ruins1_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Pleasure_House": { - "Name": "Lore_Tablet-Pleasure_House", - "SceneName": "Ruins_Elevator", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Sanctum_Entrance": { - "Name": "Lore_Tablet-Sanctum_Entrance", - "SceneName": "Ruins1_23", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Sanctum_Past_Soul_Master": { - "Name": "Lore_Tablet-Sanctum_Past_Soul_Master", - "SceneName": "Ruins1_32", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Watcher's_Spire": { - "Name": "Lore_Tablet-Watcher's_Spire", - "SceneName": "Ruins2_Watcher_Room", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Archives_Upper": { - "Name": "Lore_Tablet-Archives_Upper", - "SceneName": "Fungus3_archive_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Archives_Left": { - "Name": "Lore_Tablet-Archives_Left", - "SceneName": "Fungus3_archive_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Archives_Right": { - "Name": "Lore_Tablet-Archives_Right", - "SceneName": "Fungus3_archive_02", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Pilgrim's_Way_1": { - "Name": "Lore_Tablet-Pilgrim's_Way_1", - "SceneName": "Crossroads_11_alt", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Pilgrim's_Way_2": { - "Name": "Lore_Tablet-Pilgrim's_Way_2", - "SceneName": "Fungus2_21", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Mantis_Outskirts": { - "Name": "Lore_Tablet-Mantis_Outskirts", - "SceneName": "Fungus2_12", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Mantis_Village": { - "Name": "Lore_Tablet-Mantis_Village", - "SceneName": "Fungus2_14", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Greenpath_Upper_Hidden": { - "Name": "Lore_Tablet-Greenpath_Upper_Hidden", - "SceneName": "Fungus1_17", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Greenpath_Below_Toll": { - "Name": "Lore_Tablet-Greenpath_Below_Toll", - "SceneName": "Fungus1_30", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Greenpath_Lifeblood": { - "Name": "Lore_Tablet-Greenpath_Lifeblood", - "SceneName": "Fungus1_32", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Greenpath_Stag": { - "Name": "Lore_Tablet-Greenpath_Stag", - "SceneName": "Fungus1_21", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Greenpath_QG": { - "Name": "Lore_Tablet-Greenpath_QG", - "SceneName": "Fungus1_13", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Greenpath_Lower_Hidden": { - "Name": "Lore_Tablet-Greenpath_Lower_Hidden", - "SceneName": "Fungus1_19", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Dung_Defender": { - "Name": "Lore_Tablet-Dung_Defender", - "SceneName": "Waterways_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Spore_Shroom": { - "Name": "Lore_Tablet-Spore_Shroom", - "SceneName": "Fungus2_20", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Fungal_Wastes_Hidden": { - "Name": "Lore_Tablet-Fungal_Wastes_Hidden", - "SceneName": "Fungus2_07", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Fungal_Wastes_Below_Shrumal_Ogres": { - "Name": "Lore_Tablet-Fungal_Wastes_Below_Shrumal_Ogres", - "SceneName": "Fungus2_04", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Fungal_Core": { - "Name": "Lore_Tablet-Fungal_Core", - "SceneName": "Fungus2_30", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Ancient_Basin": { - "Name": "Lore_Tablet-Ancient_Basin", - "SceneName": "Abyss_06_Core", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-King's_Pass_Focus": { - "Name": "Lore_Tablet-King's_Pass_Focus", - "SceneName": "Tutorial_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-King's_Pass_Fury": { - "Name": "Lore_Tablet-King's_Pass_Fury", - "SceneName": "Tutorial_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-King's_Pass_Exit": { - "Name": "Lore_Tablet-King's_Pass_Exit", - "SceneName": "Tutorial_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-World_Sense": { - "Name": "Lore_Tablet-World_Sense", - "SceneName": "Room_temple", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Howling_Cliffs": { - "Name": "Lore_Tablet-Howling_Cliffs", - "SceneName": "Cliffs_01", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Kingdom's_Edge": { - "Name": "Lore_Tablet-Kingdom's_Edge", - "SceneName": "Deepnest_East_17", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Palace_Workshop": { - "Name": "Lore_Tablet-Palace_Workshop", - "SceneName": "White_Palace_08", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Palace_Throne": { - "Name": "Lore_Tablet-Palace_Throne", - "SceneName": "White_Palace_09", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - }, - "Lore_Tablet-Path_of_Pain_Entrance": { - "Name": "Lore_Tablet-Path_of_Pain_Entrance", - "SceneName": "White_Palace_18", - "FlexibleCount": false, - "AdditionalProgressionPenalty": false - } -} \ No newline at end of file diff --git a/RandomizerMod/Resources/Data/logic_settings.json b/RandomizerMod/Resources/Data/logic_settings.json deleted file mode 100644 index 383caef..0000000 --- a/RandomizerMod/Resources/Data/logic_settings.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "PRECISEMOVEMENT": "SkipSettings.PreciseMovement", - "PROFICIENTCOMBAT": "SkipSettings.ProficientCombat", - "BACKGROUNDPOGOS": "SkipSettings.BackgroundObjectPogos", - "ENEMYPOGOS": "SkipSettings.EnemyPogos", - "OBSCURESKIPS": "SkipSettings.ObscureSkips", - "SHADESKIPS": "SkipSettings.ShadeSkips", - "INFECTIONSKIPS": "SkipSettings.InfectionSkips", - "FIREBALLSKIPS": "SkipSettings.FireballSkips", - "SPIKETUNNELS": "SkipSettings.SpikeTunnels", - "ACIDSKIPS": "SkipSettings.AcidSkips", - "DAMAGEBOOSTS": "SkipSettings.DamageBoosts", - "DANGEROUSSKIPS": "SkipSettings.DangerousSkips", - "DARKROOMS": "SkipSettings.DarkRooms", - "SLOPEBALLSKIPS": "SkipSettings.Slopeballs", - "SHRIEKPOGOSKIPS": "SkipSettings.ShriekPogos", - "COMPLEXSKIPS": "SkipSettings.ComplexSkips", - "DIFFICULTSKIPS": "SkipSettings.DifficultSkips", - "RANDOMNAIL": "NoveltySettings.RandomizeNail", - "CURSED": "CursedSettings.RemoveSpellUpgrades", - "RANDOMFOCUS": "NoveltySettings.RandomizeFocus", - "RANDOMELEVATORS": "NoveltySettings.RandomizeElevatorPass" -} \ No newline at end of file diff --git a/RandomizerMod/Resources/Data/pools.json b/RandomizerMod/Resources/Data/pools.json deleted file mode 100644 index d653c8c..0000000 --- a/RandomizerMod/Resources/Data/pools.json +++ /dev/null @@ -1,4327 +0,0 @@ -[ - { - "Group": "Dreamers", - "Name": "Dreamer", - "Path": "PoolSettings.Dreamers", - "IncludeItems": [ - "Lurien", - "Monomon", - "Herrah", - "World_Sense" - ], - "IncludeLocations": [ - "Lurien", - "Monomon", - "Herrah", - "World_Sense" - ], - "Vanilla": [ - { - "item": "Lurien", - "location": "Lurien" - }, - { - "item": "Monomon", - "location": "Monomon" - }, - { - "item": "Herrah", - "location": "Herrah" - }, - { - "item": "World_Sense", - "location": "World_Sense" - } - ] - }, - { - "Group": "Dreamers", - "Name": "FakeDreamer", - "Path": "False", - "IncludeItems": [ - "Dreamer" - ], - "IncludeLocations": [], - "Vanilla": [] - }, - { - "Group": "Skills", - "Name": "Skill", - "Path": "PoolSettings.Skills", - "IncludeItems": [ - "Mothwing_Cloak", - "Mantis_Claw", - "Crystal_Heart", - "Monarch_Wings", - "Shade_Cloak", - "Isma's_Tear", - "Dream_Nail", - "Dream_Gate", - "Awoken_Dream_Nail", - "Vengeful_Spirit", - "Shade_Soul", - "Desolate_Dive", - "Descending_Dark", - "Howling_Wraiths", - "Abyss_Shriek", - "Cyclone_Slash", - "Dash_Slash", - "Great_Slash" - ], - "IncludeLocations": [ - "Mothwing_Cloak", - "Mantis_Claw", - "Crystal_Heart", - "Monarch_Wings", - "Shade_Cloak", - "Isma's_Tear", - "Dream_Nail", - "Seer", - "Seer", - "Vengeful_Spirit", - "Shade_Soul", - "Desolate_Dive", - "Descending_Dark", - "Howling_Wraiths", - "Abyss_Shriek", - "Cyclone_Slash", - "Dash_Slash", - "Great_Slash" - ], - "Vanilla": [ - { - "item": "Mothwing_Cloak", - "location": "Mothwing_Cloak" - }, - { - "item": "Mantis_Claw", - "location": "Mantis_Claw" - }, - { - "item": "Crystal_Heart", - "location": "Crystal_Heart" - }, - { - "item": "Monarch_Wings", - "location": "Monarch_Wings" - }, - { - "item": "Shade_Cloak", - "location": "Shade_Cloak" - }, - { - "item": "Isma's_Tear", - "location": "Isma's_Tear" - }, - { - "item": "Dream_Nail", - "location": "Dream_Nail" - }, - { - "item": "Dream_Gate", - "location": "Seer", - "costs": [ - { - "term": "ESSENCE", - "amount": 900 - } - ] - }, - { - "item": "Awoken_Dream_Nail", - "location": "Seer", - "costs": [ - { - "term": "ESSENCE", - "amount": 1800 - } - ] - }, - { - "item": "Vengeful_Spirit", - "location": "Vengeful_Spirit" - }, - { - "item": "Shade_Soul", - "location": "Shade_Soul" - }, - { - "item": "Desolate_Dive", - "location": "Desolate_Dive" - }, - { - "item": "Descending_Dark", - "location": "Descending_Dark" - }, - { - "item": "Howling_Wraiths", - "location": "Howling_Wraiths" - }, - { - "item": "Abyss_Shriek", - "location": "Abyss_Shriek" - }, - { - "item": "Cyclone_Slash", - "location": "Cyclone_Slash" - }, - { - "item": "Dash_Slash", - "location": "Dash_Slash" - }, - { - "item": "Great_Slash", - "location": "Great_Slash" - } - ] - }, - { - "Group": "Skills", - "Name": "Focus", - "Path": "NoveltySettings.RandomizeFocus", - "IncludeItems": [ - "Focus" - ], - "IncludeLocations": [ - "Focus" - ], - "Vanilla": [ - { - "item": "Focus", - "location": "Start" - } - ] - }, - { - "Group": "Skills", - "Name": "Swim", - "Path": "NoveltySettings.RandomizeSwim", - "IncludeItems": [ - "Swim" - ], - "IncludeLocations": [], - "Vanilla": [ - { - "item": "Swim", - "location": "Start" - } - ] - }, - { - "Group": "Charms", - "Name": "Charm", - "Path": "PoolSettings.Charms", - "IncludeItems": [ - "Gathering_Swarm", - "Wayward_Compass", - "Grubsong", - "Stalwart_Shell", - "Baldur_Shell", - "Fury_of_the_Fallen", - "Quick_Focus", - "Lifeblood_Heart", - "Lifeblood_Core", - "Defender's_Crest", - "Flukenest", - "Thorns_of_Agony", - "Mark_of_Pride", - "Steady_Body", - "Heavy_Blow", - "Sharp_Shadow", - "Spore_Shroom", - "Longnail", - "Shaman_Stone", - "Soul_Catcher", - "Soul_Eater", - "Glowing_Womb", - "Fragile_Heart", - "Fragile_Greed", - "Fragile_Strength", - "Nailmaster's_Glory", - "Joni's_Blessing", - "Shape_of_Unn", - "Hiveblood", - "Dream_Wielder", - "Dashmaster", - "Quick_Slash", - "Spell_Twister", - "Deep_Focus", - "Grubberfly's_Elegy", - "Queen_Fragment", - "King_Fragment", - "Void_Heart", - "Sprintmaster", - "Dreamshield", - "Weaversong", - "Grimmchild2", - "Unbreakable_Heart", - "Unbreakable_Greed", - "Unbreakable_Strength" - ], - "IncludeLocations": [ - "Grubfather", - "Baldur_Shell", - "Fury_of_the_Fallen", - "Lifeblood_Core", - "Defender's_Crest", - "Flukenest", - "Thorns_of_Agony", - "Mark_of_Pride", - "Sharp_Shadow", - "Spore_Shroom", - "Soul_Catcher", - "Soul_Eater", - "Glowing_Womb", - "Nailmaster's_Glory", - "Joni's_Blessing", - "Shape_of_Unn", - "Hiveblood", - "Seer", - "Dashmaster", - "Quick_Slash", - "Spell_Twister", - "Deep_Focus", - "Grubfather", - "Queen_Fragment", - "King_Fragment", - "Void_Heart", - "Dreamshield", - "Weaversong", - "Grimmchild", - "Sly", - "Sly", - "Sly_(Key)", - "Sly_(Key)", - "Iselda", - "Salubra", - "Salubra", - "Salubra", - "Salubra", - "Salubra", - "Leg_Eater", - "Leg_Eater", - "Leg_Eater", - "Unbreakable_Heart", - "Unbreakable_Greed", - "Unbreakable_Strength" - ], - "Vanilla": [ - { - "item": "Grubsong", - "location": "Grubfather", - "costs": [ - { - "term": "GRUBS", - "amount": 10 - } - ] - }, - { - "item": "Baldur_Shell", - "location": "Baldur_Shell" - }, - { - "item": "Fury_of_the_Fallen", - "location": "Fury_of_the_Fallen" - }, - { - "item": "Lifeblood_Core", - "location": "Lifeblood_Core" - }, - { - "item": "Defender's_Crest", - "location": "Defender's_Crest" - }, - { - "item": "Flukenest", - "location": "Flukenest" - }, - { - "item": "Thorns_of_Agony", - "location": "Thorns_of_Agony" - }, - { - "item": "Mark_of_Pride", - "location": "Mark_of_Pride" - }, - { - "item": "Sharp_Shadow", - "location": "Sharp_Shadow" - }, - { - "item": "Spore_Shroom", - "location": "Spore_Shroom" - }, - { - "item": "Soul_Catcher", - "location": "Soul_Catcher" - }, - { - "item": "Soul_Eater", - "location": "Soul_Eater" - }, - { - "item": "Glowing_Womb", - "location": "Glowing_Womb" - }, - { - "item": "Nailmaster's_Glory", - "location": "Nailmaster's_Glory" - }, - { - "item": "Joni's_Blessing", - "location": "Joni's_Blessing" - }, - { - "item": "Shape_of_Unn", - "location": "Shape_of_Unn" - }, - { - "item": "Hiveblood", - "location": "Hiveblood" - }, - { - "item": "Dream_Wielder", - "location": "Seer", - "costs": [ - { - "term": "ESSENCE", - "amount": 500 - } - ] - }, - { - "item": "Dashmaster", - "location": "Dashmaster" - }, - { - "item": "Quick_Slash", - "location": "Quick_Slash" - }, - { - "item": "Spell_Twister", - "location": "Spell_Twister" - }, - { - "item": "Deep_Focus", - "location": "Deep_Focus" - }, - { - "item": "Grubberfly's_Elegy", - "location": "Grubfather", - "costs": [ - { - "term": "GRUBS", - "amount": 46 - } - ] - }, - { - "item": "Queen_Fragment", - "location": "Queen_Fragment" - }, - { - "item": "King_Fragment", - "location": "King_Fragment" - }, - { - "item": "Void_Heart", - "location": "Void_Heart" - }, - { - "item": "Dreamshield", - "location": "Dreamshield" - }, - { - "item": "Weaversong", - "location": "Weaversong" - }, - { - "item": "Grimmchild1", - "location": "Grimmchild" - }, - { - "item": "Gathering_Swarm", - "location": "Sly" - }, - { - "item": "Stalwart_Shell", - "location": "Sly" - }, - { - "item": "Heavy_Blow", - "location": "Sly_(Key)" - }, - { - "item": "Sprintmaster", - "location": "Sly_(Key)" - }, - { - "item": "Wayward_Compass", - "location": "Iselda" - }, - { - "item": "Lifeblood_Heart", - "location": "Salubra" - }, - { - "item": "Longnail", - "location": "Salubra" - }, - { - "item": "Steady_Body", - "location": "Salubra" - }, - { - "item": "Shaman_Stone", - "location": "Salubra" - }, - { - "item": "Quick_Focus", - "location": "Salubra" - }, - { - "item": "Fragile_Heart", - "location": "Leg_Eater" - }, - { - "item": "Fragile_Greed", - "location": "Leg_Eater" - }, - { - "item": "Fragile_Strength", - "location": "Leg_Eater" - }, - { - "item": "Unbreakable_Heart", - "location": "Unbreakable_Heart" - }, - { - "item": "Unbreakable_Greed", - "location": "Unbreakable_Greed" - }, - { - "item": "Unbreakable_Strength", - "location": "Unbreakable_Strength" - } - ] - }, - { - "Group": "Keys", - "Name": "Key", - "Path": "PoolSettings.Keys", - "IncludeItems": [ - "City_Crest", - "Lumafly_Lantern", - "Tram_Pass", - "Simple_Key", - "Simple_Key", - "Simple_Key", - "Simple_Key", - "Shopkeeper's_Key", - "Elegant_Key", - "Love_Key", - "King's_Brand", - "Godtuner", - "Collector's_Map" - ], - "IncludeLocations": [ - "City_Crest", - "Tram_Pass", - "Simple_Key-Basin", - "Simple_Key-City", - "Simple_Key-Lurker", - "Shopkeeper's_Key", - "Love_Key", - "King's_Brand", - "Godtuner", - "Collector's_Map", - "Sly", - "Sly", - "Sly_(Key)" - ], - "Vanilla": [ - { - "item": "City_Crest", - "location": "City_Crest" - }, - { - "item": "Tram_Pass", - "location": "Tram_Pass" - }, - { - "item": "Simple_Key", - "location": "Simple_Key-Basin" - }, - { - "item": "Simple_Key", - "location": "Simple_Key-City" - }, - { - "item": "Simple_Key", - "location": "Simple_Key-Lurker" - }, - { - "item": "Shopkeeper's_Key", - "location": "Shopkeeper's_Key" - }, - { - "item": "Love_Key", - "location": "Love_Key" - }, - { - "item": "King's_Brand", - "location": "King's_Brand" - }, - { - "item": "Godtuner", - "location": "Godtuner" - }, - { - "item": "Collector's_Map", - "location": "Collector's_Map" - }, - { - "item": "Lumafly_Lantern", - "location": "Sly" - }, - { - "item": "Simple_Key", - "location": "Sly" - }, - { - "item": "Elegant_Key", - "location": "Sly_(Key)" - } - ] - }, - { - "Group": "MaskShards", - "Name": "Mask", - "Path": "PoolSettings.MaskShards", - "IncludeItems": [ - "Mask_Shard", - "Mask_Shard", - "Mask_Shard", - "Mask_Shard", - "Mask_Shard", - "Mask_Shard", - "Mask_Shard", - "Mask_Shard", - "Mask_Shard", - "Mask_Shard", - "Mask_Shard", - "Mask_Shard", - "Mask_Shard", - "Mask_Shard", - "Mask_Shard", - "Mask_Shard" - ], - "IncludeLocations": [ - "Seer", - "Grubfather", - "Mask_Shard-Brooding_Mawlek", - "Mask_Shard-Crossroads_Goam", - "Mask_Shard-Stone_Sanctuary", - "Mask_Shard-Queen's_Station", - "Mask_Shard-Deepnest", - "Mask_Shard-Waterways", - "Mask_Shard-Enraged_Guardian", - "Mask_Shard-Hive", - "Mask_Shard-Grey_Mourner", - "Mask_Shard-Bretta", - "Sly", - "Sly", - "Sly_(Key)", - "Sly_(Key)" - ], - "Vanilla": [ - { - "item": "Mask_Shard", - "location": "Seer", - "costs": [ - { - "term": "ESSENCE", - "amount": "1500" - } - ] - }, - { - "item": "Mask_Shard", - "location": "Grubfather", - "costs": [ - { - "term": "GRUBS", - "amount": 5 - } - ] - }, - { - "item": "Mask_Shard", - "location": "Mask_Shard-Brooding_Mawlek" - }, - { - "item": "Mask_Shard", - "location": "Mask_Shard-Crossroads_Goam" - }, - { - "item": "Mask_Shard", - "location": "Mask_Shard-Stone_Sanctuary" - }, - { - "item": "Mask_Shard", - "location": "Mask_Shard-Queen's_Station" - }, - { - "item": "Mask_Shard", - "location": "Mask_Shard-Deepnest" - }, - { - "item": "Mask_Shard", - "location": "Mask_Shard-Waterways" - }, - { - "item": "Mask_Shard", - "location": "Mask_Shard-Enraged_Guardian" - }, - { - "item": "Mask_Shard", - "location": "Mask_Shard-Hive" - }, - { - "item": "Mask_Shard", - "location": "Mask_Shard-Grey_Mourner" - }, - { - "item": "Mask_Shard", - "location": "Mask_Shard-Bretta" - }, - { - "item": "Mask_Shard", - "location": "Sly" - }, - { - "item": "Mask_Shard", - "location": "Sly" - }, - { - "item": "Mask_Shard", - "location": "Sly_(Key)" - }, - { - "item": "Mask_Shard", - "location": "Sly_(Key)" - } - ] - }, - { - "Group": "VesselFragments", - "Name": "Vessel", - "Path": "PoolSettings.VesselFragments", - "IncludeItems": [ - "Vessel_Fragment", - "Vessel_Fragment", - "Vessel_Fragment", - "Vessel_Fragment", - "Vessel_Fragment", - "Vessel_Fragment", - "Vessel_Fragment", - "Vessel_Fragment", - "Vessel_Fragment" - ], - "IncludeLocations": [ - "Seer", - "Vessel_Fragment-Greenpath", - "Vessel_Fragment-City", - "Vessel_Fragment-Crossroads", - "Vessel_Fragment-Basin", - "Vessel_Fragment-Deepnest", - "Vessel_Fragment-Stag_Nest", - "Sly", - "Sly_(Key)" - ], - "Vanilla": [ - { - "item": "Vessel_Fragment", - "location": "Seer", - "costs": [ - { - "term": "ESSENCE", - "amount": 700 - } - ] - }, - { - "item": "Vessel_Fragment", - "location": "Vessel_Fragment-Greenpath" - }, - { - "item": "Vessel_Fragment", - "location": "Vessel_Fragment-City" - }, - { - "item": "Vessel_Fragment", - "location": "Vessel_Fragment-Crossroads" - }, - { - "item": "Vessel_Fragment", - "location": "Vessel_Fragment-Basin" - }, - { - "item": "Vessel_Fragment", - "location": "Vessel_Fragment-Deepnest" - }, - { - "item": "Vessel_Fragment", - "location": "Vessel_Fragment-Stag_Nest" - }, - { - "item": "Vessel_Fragment", - "location": "Sly" - }, - { - "item": "Vessel_Fragment", - "location": "Sly_(Key)" - } - ] - }, - { - "Group": "CharmNotches", - "Name": "Notch", - "Path": "PoolSettings.CharmNotches", - "IncludeItems": [ - "Charm_Notch", - "Charm_Notch", - "Charm_Notch", - "Charm_Notch" - ], - "IncludeLocations": [ - "Charm_Notch-Shrumal_Ogres", - "Charm_Notch-Fog_Canyon", - "Charm_Notch-Colosseum", - "Charm_Notch-Grimm" - ], - "Vanilla": [ - { - "item": "Charm_Notch", - "location": "Charm_Notch-Shrumal_Ogres" - }, - { - "item": "Charm_Notch", - "location": "Charm_Notch-Fog_Canyon" - }, - { - "item": "Charm_Notch", - "location": "Charm_Notch-Colosseum" - }, - { - "item": "Charm_Notch", - "location": "Charm_Notch-Grimm" - } - ] - }, - { - "Group": "CharmNotches", - "Name": "SalubraNotch", - "Path": "", - "IncludeItems": [ - "Charm_Notch", - "Charm_Notch", - "Charm_Notch", - "Charm_Notch", - "Salubra's_Blessing" - ], - "IncludeLocations": [ - "Salubra_(Requires_Charms)", - "Salubra_(Requires_Charms)", - "Salubra_(Requires_Charms)", - "Salubra_(Requires_Charms)", - "Salubra_(Requires_Charms)" - ], - "Vanilla": [ - { - "item": "Charm_Notch", - "location": "Salubra", - "costs": [ - { - "term": "CHARMS", - "amount": 5 - } - ] - }, - { - "item": "Charm_Notch", - "location": "Salubra", - "costs": [ - { - "term": "CHARMS", - "amount": 10 - } - ] - }, - { - "item": "Charm_Notch", - "location": "Salubra", - "costs": [ - { - "term": "CHARMS", - "amount": 18 - } - ] - }, - { - "item": "Charm_Notch", - "location": "Salubra", - "costs": [ - { - "term": "CHARMS", - "amount": 25 - } - ] - }, - { - "item": "Salubra's_Blessing", - "location": "Salubra", - "costs": [ - { - "term": "CHARMS", - "amount": 40 - } - ] - } - ] - }, - { - "Group": "PaleOre", - "Name": "Ore", - "Path": "PoolSettings.PaleOre", - "IncludeItems": [ - "Pale_Ore", - "Pale_Ore", - "Pale_Ore", - "Pale_Ore", - "Pale_Ore", - "Pale_Ore" - ], - "IncludeLocations": [ - "Pale_Ore-Basin", - "Pale_Ore-Crystal_Peak", - "Pale_Ore-Nosk", - "Seer", - "Grubfather", - "Pale_Ore-Colosseum" - ], - "Vanilla": [ - { - "item": "Pale_Ore", - "location": "Pale_Ore-Basin" - }, - { - "item": "Pale_Ore", - "location": "Pale_Ore-Crystal_Peak" - }, - { - "item": "Pale_Ore", - "location": "Pale_Ore-Nosk" - }, - { - "item": "Pale_Ore", - "location": "Seer", - "costs": [ - { - "term": "ESSENCE", - "amount": 300 - } - ] - }, - { - "item": "Pale_Ore", - "location": "Grubfather", - "costs": [ - { - "term": "GRUBS", - "amount": 31 - } - ] - }, - { - "item": "Pale_Ore", - "location": "Pale_Ore-Colosseum" - } - ] - }, - { - "Group": "GeoChests", - "Name": "Geo", - "Path": "PoolSettings.GeoChests", - "IncludeItems": [ - "Geo_Chest-False_Knight", - "Geo_Chest-Soul_Master", - "Geo_Chest-Watcher_Knights", - "Geo_Chest-Greenpath", - "Geo_Chest-Mantis_Lords", - "Geo_Chest-Resting_Grounds", - "Geo_Chest-Crystal_Peak", - "Geo_Chest-Weavers_Den" - ], - "IncludeLocations": [ - "Geo_Chest-False_Knight", - "Geo_Chest-Soul_Master", - "Geo_Chest-Watcher_Knights", - "Geo_Chest-Greenpath", - "Geo_Chest-Mantis_Lords", - "Geo_Chest-Resting_Grounds", - "Geo_Chest-Crystal_Peak", - "Geo_Chest-Weavers_Den" - ], - "Vanilla": [ - { - "item": "Geo_Chest-False_Knight", - "location": "Geo_Chest-False_Knight" - }, - { - "item": "Geo_Chest-Soul_Master", - "location": "Geo_Chest-Soul_Master" - }, - { - "item": "Geo_Chest-Watcher_Knights", - "location": "Geo_Chest-Watcher_Knights" - }, - { - "item": "Geo_Chest-Greenpath", - "location": "Geo_Chest-Greenpath" - }, - { - "item": "Geo_Chest-Mantis_Lords", - "location": "Geo_Chest-Mantis_Lords" - }, - { - "item": "Geo_Chest-Resting_Grounds", - "location": "Geo_Chest-Resting_Grounds" - }, - { - "item": "Geo_Chest-Crystal_Peak", - "location": "Geo_Chest-Crystal_Peak" - }, - { - "item": "Geo_Chest-Weavers_Den", - "location": "Geo_Chest-Weavers_Den" - } - ] - }, - { - "Group": "GeoChests", - "Name": "JunkPitChest", - "Path": "PoolSettings.JunkPitChests", - "IncludeItems": [ - "Geo_Chest-Junk_Pit_1", - "Geo_Chest-Junk_Pit_2", - "Geo_Chest-Junk_Pit_3", - "Geo_Chest-Junk_Pit_5", - "Lumafly_Escape" - ], - "IncludeLocations": [ - "Geo_Chest-Junk_Pit_1", - "Geo_Chest-Junk_Pit_2", - "Geo_Chest-Junk_Pit_3", - "Geo_Chest-Junk_Pit_5", - "Lumafly_Escape-Junk_Pit_Chest_4" - ], - "Vanilla": [ - { - "item": "Geo_Chest-Junk_Pit_1", - "location": "Geo_Chest-Junk_Pit_1" - }, - { - "item": "Geo_Chest-Junk_Pit_2", - "location": "Geo_Chest-Junk_Pit_2" - }, - { - "item": "Geo_Chest-Junk_Pit_3", - "location": "Geo_Chest-Junk_Pit_3" - }, - { - "item": "Geo_Chest-Junk_Pit_5", - "location": "Geo_Chest-Junk_Pit_5" - }, - { - "item": "Lumafly_Escape", - "location": "Lumafly_Escape-Junk_Pit_Chest_4" - } - ] - }, - { - "Group": "RancidEggs", - "Name": "Egg", - "Path": "PoolSettings.RancidEggs", - "IncludeItems": [ - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg", - "Rancid_Egg" - ], - "IncludeLocations": [ - "Grubfather", - "Rancid_Egg-Sheo", - "Rancid_Egg-Fungal_Core", - "Rancid_Egg-Queen's_Gardens", - "Rancid_Egg-Blue_Lake", - "Rancid_Egg-Crystal_Peak_Dive_Entrance", - "Rancid_Egg-Crystal_Peak_Dark_Room", - "Rancid_Egg-Crystal_Peak_Tall_Room", - "Rancid_Egg-City_of_Tears_Left", - "Rancid_Egg-City_of_Tears_Pleasure_House", - "Rancid_Egg-Beast's_Den", - "Rancid_Egg-Dark_Deepnest", - "Rancid_Egg-Weaver's_Den", - "Rancid_Egg-Near_Quick_Slash", - "Rancid_Egg-Upper_Kingdom's_Edge", - "Rancid_Egg-Waterways_East", - "Rancid_Egg-Waterways_Main", - "Rancid_Egg-Waterways_West_Bluggsac", - "Rancid_Egg-Waterways_West_Pickup", - "Rancid_Egg-Tuk_Defender's_Crest", - "Sly" - ], - "Vanilla": [ - { - "item": "Rancid_Egg", - "location": "Grubfather", - "costs": [ - { - "term": "GRUBS", - "amount": 16 - } - ] - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-Sheo" - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-Fungal_Core" - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-Queen's_Gardens" - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-Blue_Lake" - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-Crystal_Peak_Dive_Entrance" - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-Crystal_Peak_Dark_Room" - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-Crystal_Peak_Tall_Room" - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-City_of_Tears_Left" - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-City_of_Tears_Pleasure_House" - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-Beast's_Den" - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-Dark_Deepnest" - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-Weaver's_Den" - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-Near_Quick_Slash" - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-Upper_Kingdom's_Edge" - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-Waterways_East" - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-Waterways_Main" - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-Waterways_West_Bluggsac" - }, - { - "item": "Rancid_Egg", - "location": "Rancid_Egg-Waterways_West_Pickup" - }, - { - "item": "Rancid_Egg", - "location": "Sly" - } - ] - }, - { - "Group": "Relics", - "Name": "Relic", - "Path": "PoolSettings.Relics", - "IncludeItems": [ - "Wanderer's_Journal", - "Wanderer's_Journal", - "Wanderer's_Journal", - "Wanderer's_Journal", - "Wanderer's_Journal", - "Wanderer's_Journal", - "Wanderer's_Journal", - "Wanderer's_Journal", - "Wanderer's_Journal", - "Wanderer's_Journal", - "Wanderer's_Journal", - "Wanderer's_Journal", - "Wanderer's_Journal", - "Wanderer's_Journal", - "Hallownest_Seal", - "Hallownest_Seal", - "Hallownest_Seal", - "Hallownest_Seal", - "Hallownest_Seal", - "Hallownest_Seal", - "Hallownest_Seal", - "Hallownest_Seal", - "Hallownest_Seal", - "Hallownest_Seal", - "Hallownest_Seal", - "Hallownest_Seal", - "Hallownest_Seal", - "Hallownest_Seal", - "Hallownest_Seal", - "Hallownest_Seal", - "Hallownest_Seal", - "King's_Idol", - "King's_Idol", - "King's_Idol", - "King's_Idol", - "King's_Idol", - "King's_Idol", - "King's_Idol", - "King's_Idol", - "Arcane_Egg", - "Arcane_Egg", - "Arcane_Egg", - "Arcane_Egg" - ], - "IncludeLocations": [ - "Wanderer's_Journal-Cliffs", - "Wanderer's_Journal-Greenpath_Stag", - "Wanderer's_Journal-Greenpath_Lower", - "Wanderer's_Journal-Fungal_Wastes_Thorns_Gauntlet", - "Wanderer's_Journal-Above_Mantis_Village", - "Wanderer's_Journal-Crystal_Peak_Crawlers", - "Wanderer's_Journal-Resting_Grounds_Catacombs", - "Wanderer's_Journal-King's_Station", - "Wanderer's_Journal-Pleasure_House", - "Wanderer's_Journal-City_Storerooms", - "Wanderer's_Journal-Ancient_Basin", - "Wanderer's_Journal-Kingdom's_Edge_Entrance", - "Wanderer's_Journal-Kingdom's_Edge_Camp", - "Wanderer's_Journal-Kingdom's_Edge_Requires_Dive", - "Hallownest_Seal-Crossroads_Well", - "Grubfather", - "Hallownest_Seal-Greenpath", - "Hallownest_Seal-Fog_Canyon_West", - "Hallownest_Seal-Fog_Canyon_East", - "Hallownest_Seal-Queen's_Station", - "Hallownest_Seal-Fungal_Wastes_Sporgs", - "Hallownest_Seal-Mantis_Lords", - "Seer", - "Hallownest_Seal-Resting_Grounds_Catacombs", - "Hallownest_Seal-King's_Station", - "Hallownest_Seal-City_Rafters", - "Hallownest_Seal-Soul_Sanctum", - "Hallownest_Seal-Watcher_Knight", - "Hallownest_Seal-Deepnest_By_Mantis_Lords", - "Hallownest_Seal-Beast's_Den", - "Hallownest_Seal-Queen's_Gardens", - "Grubfather", - "King's_Idol-Cliffs", - "King's_Idol-Crystal_Peak", - "King's_Idol-Glade_of_Hope", - "King's_Idol-Dung_Defender", - "King's_Idol-Great_Hopper", - "King's_Idol-Pale_Lurker", - "King's_Idol-Deepnest", - "Seer", - "Arcane_Egg-Lifeblood_Core", - "Arcane_Egg-Shade_Cloak", - "Arcane_Egg-Birthplace" - ], - "Vanilla": [ - { - "item": "Wanderer's_Journal", - "location": "Wanderer's_Journal-Cliffs" - }, - { - "item": "Wanderer's_Journal", - "location": "Wanderer's_Journal-Greenpath_Stag" - }, - { - "item": "Wanderer's_Journal", - "location": "Wanderer's_Journal-Greenpath_Lower" - }, - { - "item": "Wanderer's_Journal", - "location": "Wanderer's_Journal-Fungal_Wastes_Thorns_Gauntlet" - }, - { - "item": "Wanderer's_Journal", - "location": "Wanderer's_Journal-Above_Mantis_Village" - }, - { - "item": "Wanderer's_Journal", - "location": "Wanderer's_Journal-Crystal_Peak_Crawlers" - }, - { - "item": "Wanderer's_Journal", - "location": "Wanderer's_Journal-Resting_Grounds_Catacombs" - }, - { - "item": "Wanderer's_Journal", - "location": "Wanderer's_Journal-King's_Station" - }, - { - "item": "Wanderer's_Journal", - "location": "Wanderer's_Journal-Pleasure_House" - }, - { - "item": "Wanderer's_Journal", - "location": "Wanderer's_Journal-City_Storerooms" - }, - { - "item": "Wanderer's_Journal", - "location": "Wanderer's_Journal-Ancient_Basin" - }, - { - "item": "Wanderer's_Journal", - "location": "Wanderer's_Journal-Kingdom's_Edge_Entrance" - }, - { - "item": "Wanderer's_Journal", - "location": "Wanderer's_Journal-Kingdom's_Edge_Camp" - }, - { - "item": "Wanderer's_Journal", - "location": "Wanderer's_Journal-Kingdom's_Edge_Requires_Dive" - }, - { - "item": "Hallownest_Seal", - "location": "Hallownest_Seal-Crossroads_Well" - }, - { - "item": "Hallownest_Seal", - "location": "Grubfather" - }, - { - "item": "Hallownest_Seal", - "location": "Hallownest_Seal-Greenpath" - }, - { - "item": "Hallownest_Seal", - "location": "Hallownest_Seal-Fog_Canyon_West" - }, - { - "item": "Hallownest_Seal", - "location": "Hallownest_Seal-Fog_Canyon_East" - }, - { - "item": "Hallownest_Seal", - "location": "Hallownest_Seal-Queen's_Station" - }, - { - "item": "Hallownest_Seal", - "location": "Hallownest_Seal-Fungal_Wastes_Sporgs" - }, - { - "item": "Hallownest_Seal", - "location": "Hallownest_Seal-Mantis_Lords" - }, - { - "item": "Hallownest_Seal", - "location": "Seer", - "costs": [ - { - "term": "ESSENCE", - "amount": 100 - } - ] - }, - { - "item": "Hallownest_Seal", - "location": "Hallownest_Seal-Resting_Grounds_Catacombs" - }, - { - "item": "Hallownest_Seal", - "location": "Hallownest_Seal-King's_Station" - }, - { - "item": "Hallownest_Seal", - "location": "Hallownest_Seal-City_Rafters" - }, - { - "item": "Hallownest_Seal", - "location": "Hallownest_Seal-Soul_Sanctum" - }, - { - "item": "Hallownest_Seal", - "location": "Hallownest_Seal-Watcher_Knight" - }, - { - "item": "Hallownest_Seal", - "location": "Hallownest_Seal-Deepnest_By_Mantis_Lords" - }, - { - "item": "Hallownest_Seal", - "location": "Hallownest_Seal-Beast's_Den" - }, - { - "item": "Hallownest_Seal", - "location": "Hallownest_Seal-Queen's_Gardens" - }, - { - "item": "King's_Idol", - "location": "Grubfather", - "costs": [ - { - "term": "GRUBS", - "amount": 38 - } - ] - }, - { - "item": "King's_Idol", - "location": "King's_Idol-Cliffs" - }, - { - "item": "King's_Idol", - "location": "King's_Idol-Crystal_Peak" - }, - { - "item": "King's_Idol", - "location": "King's_Idol-Glade_of_Hope" - }, - { - "item": "King's_Idol", - "location": "King's_Idol-Dung_Defender" - }, - { - "item": "King's_Idol", - "location": "King's_Idol-Great_Hopper" - }, - { - "item": "King's_Idol", - "location": "King's_Idol-Pale_Lurker" - }, - { - "item": "King's_Idol", - "location": "King's_Idol-Deepnest" - }, - { - "item": "Arcane_Egg", - "location": "Seer", - "costs": [ - { - "term": "ESSENCE", - "amount": 1200 - } - ] - }, - { - "item": "Arcane_Egg", - "location": "Arcane_Egg-Lifeblood_Core" - }, - { - "item": "Arcane_Egg", - "location": "Arcane_Egg-Shade_Cloak" - }, - { - "item": "Arcane_Egg", - "location": "Arcane_Egg-Birthplace" - } - ] - }, - { - "Group": "WhisperingRoots", - "Name": "Root", - "Path": "PoolSettings.WhisperingRoots", - "IncludeItems": [ - "Whispering_Root-Crossroads", - "Whispering_Root-Greenpath", - "Whispering_Root-Leg_Eater", - "Whispering_Root-Mantis_Village", - "Whispering_Root-Deepnest", - "Whispering_Root-Queens_Gardens", - "Whispering_Root-Kingdoms_Edge", - "Whispering_Root-Waterways", - "Whispering_Root-City", - "Whispering_Root-Resting_Grounds", - "Whispering_Root-Spirits_Glade", - "Whispering_Root-Crystal_Peak", - "Whispering_Root-Howling_Cliffs", - "Whispering_Root-Ancestral_Mound", - "Whispering_Root-Hive" - ], - "IncludeLocations": [ - "Whispering_Root-Crossroads", - "Whispering_Root-Greenpath", - "Whispering_Root-Leg_Eater", - "Whispering_Root-Mantis_Village", - "Whispering_Root-Deepnest", - "Whispering_Root-Queens_Gardens", - "Whispering_Root-Kingdoms_Edge", - "Whispering_Root-Waterways", - "Whispering_Root-City", - "Whispering_Root-Resting_Grounds", - "Whispering_Root-Spirits_Glade", - "Whispering_Root-Crystal_Peak", - "Whispering_Root-Howling_Cliffs", - "Whispering_Root-Ancestral_Mound", - "Whispering_Root-Hive" - ], - "Vanilla": [ - { - "item": "Whispering_Root-Crossroads", - "location": "Whispering_Root-Crossroads" - }, - { - "item": "Whispering_Root-Greenpath", - "location": "Whispering_Root-Greenpath" - }, - { - "item": "Whispering_Root-Leg_Eater", - "location": "Whispering_Root-Leg_Eater" - }, - { - "item": "Whispering_Root-Mantis_Village", - "location": "Whispering_Root-Mantis_Village" - }, - { - "item": "Whispering_Root-Deepnest", - "location": "Whispering_Root-Deepnest" - }, - { - "item": "Whispering_Root-Queens_Gardens", - "location": "Whispering_Root-Queens_Gardens" - }, - { - "item": "Whispering_Root-Kingdoms_Edge", - "location": "Whispering_Root-Kingdoms_Edge" - }, - { - "item": "Whispering_Root-Waterways", - "location": "Whispering_Root-Waterways" - }, - { - "item": "Whispering_Root-City", - "location": "Whispering_Root-City" - }, - { - "item": "Whispering_Root-Resting_Grounds", - "location": "Whispering_Root-Resting_Grounds" - }, - { - "item": "Whispering_Root-Spirits_Glade", - "location": "Whispering_Root-Spirits_Glade" - }, - { - "item": "Whispering_Root-Crystal_Peak", - "location": "Whispering_Root-Crystal_Peak" - }, - { - "item": "Whispering_Root-Howling_Cliffs", - "location": "Whispering_Root-Howling_Cliffs" - }, - { - "item": "Whispering_Root-Ancestral_Mound", - "location": "Whispering_Root-Ancestral_Mound" - }, - { - "item": "Whispering_Root-Hive", - "location": "Whispering_Root-Hive" - } - ] - }, - { - "Group": "BossEssence", - "Name": "DreamWarrior", - "Path": "PoolSettings.BossEssence", - "IncludeItems": [ - "Boss_Essence-Elder_Hu", - "Boss_Essence-Xero", - "Boss_Essence-Gorb", - "Boss_Essence-Marmu", - "Boss_Essence-No_Eyes", - "Boss_Essence-Galien", - "Boss_Essence-Markoth" - ], - "IncludeLocations": [ - "Boss_Essence-Elder_Hu", - "Boss_Essence-Xero", - "Boss_Essence-Gorb", - "Boss_Essence-Marmu", - "Boss_Essence-No_Eyes", - "Boss_Essence-Galien", - "Boss_Essence-Markoth" - ], - "Vanilla": [ - { - "item": "Boss_Essence-Elder_Hu", - "location": "Boss_Essence-Elder_Hu" - }, - { - "item": "Boss_Essence-Xero", - "location": "Boss_Essence-Xero" - }, - { - "item": "Boss_Essence-Gorb", - "location": "Boss_Essence-Gorb" - }, - { - "item": "Boss_Essence-Marmu", - "location": "Boss_Essence-Marmu" - }, - { - "item": "Boss_Essence-No_Eyes", - "location": "Boss_Essence-No_Eyes" - }, - { - "item": "Boss_Essence-Galien", - "location": "Boss_Essence-Galien" - }, - { - "item": "Boss_Essence-Markoth", - "location": "Boss_Essence-Markoth" - } - ] - }, - { - "Group": "BossEssence", - "Name": "DreamBoss", - "Path": "PoolSettings.BossEssence", - "IncludeItems": [ - "Boss_Essence-Failed_Champion", - "Boss_Essence-Soul_Tyrant", - "Boss_Essence-Lost_Kin", - "Boss_Essence-White_Defender", - "Boss_Essence-Grey_Prince_Zote" - ], - "IncludeLocations": [ - "Boss_Essence-Failed_Champion", - "Boss_Essence-Soul_Tyrant", - "Boss_Essence-Lost_Kin", - "Boss_Essence-White_Defender", - "Boss_Essence-Grey_Prince_Zote" - ], - "Vanilla": [ - { - "item": "Boss_Essence-Failed_Champion", - "location": "Boss_Essence-Failed_Champion" - }, - { - "item": "Boss_Essence-Soul_Tyrant", - "location": "Boss_Essence-Soul_Tyrant" - }, - { - "item": "Boss_Essence-Lost_Kin", - "location": "Boss_Essence-Lost_Kin" - }, - { - "item": "Boss_Essence-White_Defender", - "location": "Boss_Essence-White_Defender" - }, - { - "item": "Boss_Essence-Grey_Prince_Zote", - "location": "Boss_Essence-Grey_Prince_Zote" - } - ] - }, - { - "Group": "Grubs", - "Name": "Grub", - "Path": "PoolSettings.Grubs", - "IncludeItems": [ - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub", - "Grub" - ], - "IncludeLocations": [ - "Grub-Crossroads_Acid", - "Grub-Crossroads_Center", - "Grub-Crossroads_Stag", - "Grub-Crossroads_Spike", - "Grub-Crossroads_Guarded", - "Grub-Greenpath_Cornifer", - "Grub-Greenpath_Journal", - "Grub-Greenpath_MMC", - "Grub-Greenpath_Stag", - "Grub-Fog_Canyon", - "Grub-Fungal_Bouncy", - "Grub-Fungal_Spore_Shroom", - "Grub-Deepnest_Mimic", - "Grub-Deepnest_Nosk", - "Grub-Deepnest_Spike", - "Grub-Dark_Deepnest", - "Grub-Beast's_Den", - "Grub-Kingdom's_Edge_Oro", - "Grub-Kingdom's_Edge_Camp", - "Grub-Hive_External", - "Grub-Hive_Internal", - "Grub-Basin_Requires_Wings", - "Grub-Basin_Requires_Dive", - "Grub-Waterways_Main", - "Grub-Isma's_Grove", - "Grub-Waterways_Requires_Tram", - "Grub-City_of_Tears_Left", - "Grub-Soul_Sanctum", - "Grub-Watcher's_Spire", - "Grub-City_of_Tears_Guarded", - "Grub-King's_Station", - "Grub-Resting_Grounds", - "Grub-Crystal_Peak_Below_Chest", - "Grub-Crystallized_Mound", - "Grub-Crystal_Peak_Spike", - "Grub-Crystal_Peak_Mimic", - "Grub-Crystal_Peak_Crushers", - "Grub-Crystal_Heart", - "Grub-Hallownest_Crown", - "Grub-Howling_Cliffs", - "Grub-Queen's_Gardens_Stag", - "Grub-Queen's_Gardens_Marmu", - "Grub-Queen's_Gardens_Top", - "Grub-Collector_1", - "Grub-Collector_2", - "Grub-Collector_3" - ], - "Vanilla": [ - { - "item": "Grub", - "location": "Grub-Crossroads_Acid" - }, - { - "item": "Grub", - "location": "Grub-Crossroads_Center" - }, - { - "item": "Grub", - "location": "Grub-Crossroads_Stag" - }, - { - "item": "Grub", - "location": "Grub-Crossroads_Spike" - }, - { - "item": "Grub", - "location": "Grub-Crossroads_Guarded" - }, - { - "item": "Grub", - "location": "Grub-Greenpath_Cornifer" - }, - { - "item": "Grub", - "location": "Grub-Greenpath_Journal" - }, - { - "item": "Grub", - "location": "Grub-Greenpath_MMC" - }, - { - "item": "Grub", - "location": "Grub-Greenpath_Stag" - }, - { - "item": "Grub", - "location": "Grub-Fog_Canyon" - }, - { - "item": "Grub", - "location": "Grub-Fungal_Bouncy" - }, - { - "item": "Grub", - "location": "Grub-Fungal_Spore_Shroom" - }, - { - "item": "Grub", - "location": "Grub-Deepnest_Mimic" - }, - { - "item": "Grub", - "location": "Grub-Deepnest_Nosk" - }, - { - "item": "Grub", - "location": "Grub-Deepnest_Spike" - }, - { - "item": "Grub", - "location": "Grub-Dark_Deepnest" - }, - { - "item": "Grub", - "location": "Grub-Beast's_Den" - }, - { - "item": "Grub", - "location": "Grub-Kingdom's_Edge_Oro" - }, - { - "item": "Grub", - "location": "Grub-Kingdom's_Edge_Camp" - }, - { - "item": "Grub", - "location": "Grub-Hive_External" - }, - { - "item": "Grub", - "location": "Grub-Hive_Internal" - }, - { - "item": "Grub", - "location": "Grub-Basin_Requires_Wings" - }, - { - "item": "Grub", - "location": "Grub-Basin_Requires_Dive" - }, - { - "item": "Grub", - "location": "Grub-Waterways_Main" - }, - { - "item": "Grub", - "location": "Grub-Isma's_Grove" - }, - { - "item": "Grub", - "location": "Grub-Waterways_Requires_Tram" - }, - { - "item": "Grub", - "location": "Grub-City_of_Tears_Left" - }, - { - "item": "Grub", - "location": "Grub-Soul_Sanctum" - }, - { - "item": "Grub", - "location": "Grub-Watcher's_Spire" - }, - { - "item": "Grub", - "location": "Grub-City_of_Tears_Guarded" - }, - { - "item": "Grub", - "location": "Grub-King's_Station" - }, - { - "item": "Grub", - "location": "Grub-Resting_Grounds" - }, - { - "item": "Grub", - "location": "Grub-Crystal_Peak_Below_Chest" - }, - { - "item": "Grub", - "location": "Grub-Crystallized_Mound" - }, - { - "item": "Grub", - "location": "Grub-Crystal_Peak_Spike" - }, - { - "item": "Grub", - "location": "Grub-Crystal_Peak_Mimic" - }, - { - "item": "Grub", - "location": "Grub-Crystal_Peak_Crushers" - }, - { - "item": "Grub", - "location": "Grub-Crystal_Heart" - }, - { - "item": "Grub", - "location": "Grub-Hallownest_Crown" - }, - { - "item": "Grub", - "location": "Grub-Howling_Cliffs" - }, - { - "item": "Grub", - "location": "Grub-Queen's_Gardens_Stag" - }, - { - "item": "Grub", - "location": "Grub-Queen's_Gardens_Marmu" - }, - { - "item": "Grub", - "location": "Grub-Queen's_Gardens_Top" - }, - { - "item": "Grub", - "location": "Grub-Collector_1" - }, - { - "item": "Grub", - "location": "Grub-Collector_2" - }, - { - "item": "Grub", - "location": "Grub-Collector_3" - } - ] - }, - { - "Group": "Mimics", - "Name": "Mimic", - "Path": "CursedSettings.RandomizeMimics", - "IncludeItems": [ - "Mimic_Grub", - "Mimic_Grub", - "Mimic_Grub", - "Mimic_Grub" - ], - "IncludeLocations": [ - "Mimic_Grub-Deepnest_1", - "Mimic_Grub-Deepnest_2", - "Mimic_Grub-Deepnest_3", - "Mimic_Grub-Crystal_Peak" - ], - "Vanilla": [ - { - "item": "Mimic_Grub", - "location": "Mimic_Grub-Deepnest_1" - }, - { - "item": "Mimic_Grub", - "location": "Mimic_Grub-Deepnest_2" - }, - { - "item": "Mimic_Grub", - "location": "Mimic_Grub-Deepnest_3" - }, - { - "item": "Mimic_Grub", - "location": "Mimic_Grub-Crystal_Peak" - } - ] - }, - { - "Group": "Maps", - "Name": "Map", - "Path": "PoolSettings.Maps", - "IncludeItems": [ - "Crossroads_Map", - "Greenpath_Map", - "Fog_Canyon_Map", - "Fungal_Wastes_Map", - "Quill", - "Deepnest_Map", - "Ancient_Basin_Map", - "Kingdom's_Edge_Map", - "City_of_Tears_Map", - "Royal_Waterways_Map", - "Howling_Cliffs_Map", - "Crystal_Peak_Map", - "Queen's_Gardens_Map", - "Resting_Grounds_Map" - ], - "IncludeLocations": [ - "Crossroads_Map", - "Greenpath_Map", - "Fog_Canyon_Map", - "Fungal_Wastes_Map", - "Deepnest_Map-Upper", - "Deepnest_Map-Right", - "Ancient_Basin_Map", - "Kingdom's_Edge_Map", - "City_of_Tears_Map", - "Royal_Waterways_Map", - "Howling_Cliffs_Map", - "Crystal_Peak_Map", - "Queen's_Gardens_Map", - "Resting_Grounds_Map" - ], - "Vanilla": [ - { - "item": "Crossroads_Map", - "location": "Crossroads_Map" - }, - { - "item": "Greenpath_Map", - "location": "Greenpath_Map" - }, - { - "item": "Fog_Canyon_Map", - "location": "Fog_Canyon_Map" - }, - { - "item": "Fungal_Wastes_Map", - "location": "Fungal_Wastes_Map" - }, - { - "item": "Deepnest_Map", - "location": "Deepnest_Map-Upper" - }, - { - "item": "Deepnest_Map", - "location": "Deepnest_Map-Right" - }, - { - "item": "Ancient_Basin_Map", - "location": "Ancient_Basin_Map" - }, - { - "item": "Kingdom's_Edge_Map", - "location": "Kingdom's_Edge_Map" - }, - { - "item": "City_of_Tears_Map", - "location": "City_of_Tears_Map" - }, - { - "item": "Royal_Waterways_Map", - "location": "Royal_Waterways_Map" - }, - { - "item": "Howling_Cliffs_Map", - "location": "Howling_Cliffs_Map" - }, - { - "item": "Crystal_Peak_Map", - "location": "Crystal_Peak_Map" - }, - { - "item": "Queen's_Gardens_Map", - "location": "Queen's_Gardens_Map" - }, - { - "item": "Resting_Grounds_Map", - "location": "Resting_Grounds_Map" - }, - { - "item": "Quill", - "location": "Iselda" - } - ] - }, - { - "Group": "Stags", - "Name": "Stag", - "Path": "PoolSettings.Stags", - "IncludeItems": [ - "Dirtmouth_Stag", - "Crossroads_Stag", - "Greenpath_Stag", - "Queen's_Station_Stag", - "Queen's_Gardens_Stag", - "City_Storerooms_Stag", - "King's_Station_Stag", - "Resting_Grounds_Stag", - "Distant_Village_Stag", - "Hidden_Station_Stag", - "Stag_Nest_Stag" - ], - "IncludeLocations": [ - "Dirtmouth_Stag", - "Crossroads_Stag", - "Greenpath_Stag", - "Queen's_Station_Stag", - "Queen's_Gardens_Stag", - "City_Storerooms_Stag", - "King's_Station_Stag", - "Resting_Grounds_Stag", - "Distant_Village_Stag", - "Hidden_Station_Stag", - "Stag_Nest_Stag" - ], - "Vanilla": [ - { - "item": "Dirtmouth_Stag", - "location": "Dirtmouth_Stag" - }, - { - "item": "Crossroads_Stag", - "location": "Crossroads_Stag" - }, - { - "item": "Greenpath_Stag", - "location": "Greenpath_Stag" - }, - { - "item": "Queen's_Station_Stag", - "location": "Queen's_Station_Stag" - }, - { - "item": "Queen's_Gardens_Stag", - "location": "Queen's_Gardens_Stag" - }, - { - "item": "City_Storerooms_Stag", - "location": "City_Storerooms_Stag" - }, - { - "item": "King's_Station_Stag", - "location": "King's_Station_Stag" - }, - { - "item": "Resting_Grounds_Stag", - "location": "Resting_Grounds_Stag" - }, - { - "item": "Distant_Village_Stag", - "location": "Distant_Village_Stag" - }, - { - "item": "Hidden_Station_Stag", - "location": "Hidden_Station_Stag" - }, - { - "item": "Stag_Nest_Stag", - "location": "Stag_Nest_Stag" - } - ] - }, - { - "Group": "LifebloodCocoons", - "Name": "Cocoon", - "Path": "PoolSettings.LifebloodCocoons", - "IncludeItems": [ - "Lifeblood_Cocoon_Small", - "Lifeblood_Cocoon_Small", - "Lifeblood_Cocoon_Small", - "Lifeblood_Cocoon_Large", - "Lifeblood_Cocoon_Small", - "Lifeblood_Cocoon_Small", - "Lifeblood_Cocoon_Large", - "Lifeblood_Cocoon_Large" - ], - "IncludeLocations": [ - "Lifeblood_Cocoon-King's_Pass", - "Lifeblood_Cocoon-Ancestral_Mound", - "Lifeblood_Cocoon-Greenpath", - "Lifeblood_Cocoon-Fog_Canyon_West", - "Lifeblood_Cocoon-Mantis_Village", - "Lifeblood_Cocoon-Failed_Tramway", - "Lifeblood_Cocoon-Galien", - "Lifeblood_Cocoon-Kingdom's_Edge" - ], - "Vanilla": [ - { - "item": "Lifeblood_Cocoon_Small", - "location": "Lifeblood_Cocoon-King's_Pass" - }, - { - "item": "Lifeblood_Cocoon_Small", - "location": "Lifeblood_Cocoon-Ancestral_Mound" - }, - { - "item": "Lifeblood_Cocoon_Small", - "location": "Lifeblood_Cocoon-Greenpath" - }, - { - "item": "Lifeblood_Cocoon_Large", - "location": "Lifeblood_Cocoon-Fog_Canyon_West" - }, - { - "item": "Lifeblood_Cocoon_Small", - "location": "Lifeblood_Cocoon-Mantis_Village" - }, - { - "item": "Lifeblood_Cocoon_Small", - "location": "Lifeblood_Cocoon-Failed_Tramway" - }, - { - "item": "Lifeblood_Cocoon_Large", - "location": "Lifeblood_Cocoon-Galien" - }, - { - "item": "Lifeblood_Cocoon_Large", - "location": "Lifeblood_Cocoon-Kingdom's_Edge" - } - ] - }, - { - "Group": "GrimmkinFlames", - "Name": "Flame", - "Path": "PoolSettings.GrimmkinFlames", - "IncludeItems": [ - "Grimmkin_Flame", - "Grimmkin_Flame", - "Grimmkin_Flame", - "Grimmkin_Flame", - "Grimmkin_Flame", - "Grimmkin_Flame", - "Grimmkin_Flame", - "Grimmkin_Flame", - "Grimmkin_Flame", - "Grimmkin_Flame" - ], - "IncludeLocations": [ - "Grimmkin_Flame-City_Storerooms", - "Grimmkin_Flame-Greenpath", - "Grimmkin_Flame-Crystal_Peak", - "Grimmkin_Flame-King's_Pass", - "Grimmkin_Flame-Resting_Grounds", - "Grimmkin_Flame-Kingdom's_Edge", - "Grimmkin_Flame-Fungal_Core", - "Grimmkin_Flame-Ancient_Basin", - "Grimmkin_Flame-Hive", - "Grimmkin_Flame-Brumm" - ], - "Vanilla": [ - { - "item": "Grimmkin_Flame", - "location": "Grimmkin_Flame-City_Storerooms" - }, - { - "item": "Grimmkin_Flame", - "location": "Grimmkin_Flame-Greenpath" - }, - { - "item": "Grimmkin_Flame", - "location": "Grimmkin_Flame-Crystal_Peak" - }, - { - "item": "Grimmkin_Flame", - "location": "Grimmkin_Flame-King's_Pass" - }, - { - "item": "Grimmkin_Flame", - "location": "Grimmkin_Flame-Resting_Grounds" - }, - { - "item": "Grimmkin_Flame", - "location": "Grimmkin_Flame-Kingdom's_Edge" - }, - { - "item": "Grimmkin_Flame", - "location": "Grimmkin_Flame-Fungal_Core" - }, - { - "item": "Grimmkin_Flame", - "location": "Grimmkin_Flame-Ancient_Basin" - }, - { - "item": "Grimmkin_Flame", - "location": "Grimmkin_Flame-Hive" - }, - { - "item": "Grimmkin_Flame", - "location": "Grimmkin_Flame-Brumm" - } - ] - }, - { - "Group": "JournalEntries", - "Name": "Journal", - "Path": "PoolSettings.JournalEntries", - "IncludeItems": [ - "Hunter's_Journal", - "Journal_Entry-Void_Tendrils", - "Journal_Entry-Charged_Lumafly", - "Journal_Entry-Goam", - "Journal_Entry-Garpede", - "Journal_Entry-Seal_of_Binding" - ], - "IncludeLocations": [ - "Hunter's_Journal", - "Journal_Entry-Void_Tendrils", - "Journal_Entry-Charged_Lumafly", - "Journal_Entry-Goam", - "Journal_Entry-Garpede", - "Journal_Entry-Seal_of_Binding" - ], - "Vanilla": [ - { - "item": "Hunter's_Journal", - "location": "Hunter's_Journal" - }, - { - "item": "Journal_Entry-Void_Tendrils", - "location": "Journal_Entry-Void_Tendrils" - }, - { - "item": "Journal_Entry-Charged_Lumafly", - "location": "Journal_Entry-Charged_Lumafly" - }, - { - "item": "Journal_Entry-Goam", - "location": "Journal_Entry-Goam" - }, - { - "item": "Journal_Entry-Garpede", - "location": "Journal_Entry-Garpede" - }, - { - "item": "Journal_Entry-Seal_of_Binding", - "location": "Journal_Entry-Seal_of_Binding" - } - ] - }, - { - "Group": "Keys", - "Name": "ElevatorPass", - "Path": "NoveltySettings.RandomizeElevatorPass", - "IncludeItems": [ - "Elevator_Pass" - ], - "IncludeLocations": [ - "Elevator_Pass" - ], - "Vanilla": [] - }, - { - "Group": "Skills", - "Name": "SplitCloak", - "Path": "NoveltySettings.SplitCloak", - "IncludeItems": [ - "Left_Mothwing_Cloak", - "Right_Mothwing_Cloak", - "Split_Shade_Cloak" - ], - "IncludeLocations": [ - "Split_Mothwing_Cloak" - ], - "Vanilla": [] - }, - { - "Group": "Skills", - "Name": "SplitClaw", - "Path": "NoveltySettings.SplitClaw", - "IncludeItems": [ - "Left_Mantis_Claw", - "Right_Mantis_Claw" - ], - "IncludeLocations": [ - "Left_Mantis_Claw", - "Right_Mantis_Claw" - ], - "Vanilla": [] - }, - { - "Group": "Skills", - "Name": "CursedNail", - "Path": "NoveltySettings.RandomizeNail", - "IncludeItems": [ - "Leftslash", - "Rightslash", - "Upslash" - ], - "IncludeLocations": [], - "Vanilla": [ - { - "item": "Leftslash", - "location": "Start" - }, - { - "item": "Rightslash", - "location": "Start" - }, - { - "item": "Upslash", - "location": "Start" - }, - { - "item": "Downslash", - "location": "Start" - } - ] - }, - { - "Group": "Skills", - "Name": "SplitSuperdash", - "Path": "NoveltySettings.SplitSuperdash", - "IncludeItems": [ - "Left_Crystal_Heart", - "Right_Crystal_Heart" - ], - "IncludeLocations": [ - "Split_Crystal_Heart" - ], - "Vanilla": [] - }, - { - "Group": "Keys", - "Name": "EggShop", - "Path": "NoveltySettings.EggShop", - "IncludeItems": [], - "IncludeLocations": [ - "Egg_Shop" - ], - "Vanilla": [] - }, - { - "Group": "GeoRocks", - "Name": "Rock", - "Path": "PoolSettings.GeoRocks", - "IncludeItems": [ - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Abyss", - "Geo_Rock-Abyss", - "Geo_Rock-Abyss", - "Geo_Rock-Abyss", - "Geo_Rock-Abyss", - "Geo_Rock-Abyss", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath01", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Outskirts", - "Geo_Rock-Outskirts", - "Geo_Rock-Outskirts", - "Geo_Rock-Outskirts", - "Geo_Rock-Outskirts", - "Geo_Rock-Outskirts", - "Geo_Rock-Outskirts", - "Geo_Rock-Outskirts420", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath01", - "Geo_Rock-Default", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath02", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath02", - "Geo_Rock-GreenPath02", - "Geo_Rock-GreenPath02", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath01", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath01", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Fung01", - "Geo_Rock-Fung01", - "Geo_Rock-Fung01", - "Geo_Rock-Fung01", - "Geo_Rock-Fung02", - "Geo_Rock-Fung01", - "Geo_Rock-Fung02", - "Geo_Rock-Fung01", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Fung01", - "Geo_Rock-Fung02", - "Geo_Rock-Fung02", - "Geo_Rock-Fung01", - "Geo_Rock-Default", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Deepnest", - "Geo_Rock-Fung01", - "Geo_Rock-Fung01", - "Geo_Rock-Fung01", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath01", - "Geo_Rock-GreenPath02", - "Geo_Rock-Outskirts", - "Geo_Rock-City", - "Geo_Rock-Hive", - "Geo_Rock-Hive", - "Geo_Rock-Hive", - "Geo_Rock-Hive", - "Geo_Rock-Hive", - "Geo_Rock-Hive", - "Geo_Rock-Hive", - "Geo_Rock-Hive", - "Geo_Rock-Hive", - "Geo_Rock-Mine", - "Geo_Rock-Mine", - "Geo_Rock-Default", - "Geo_Rock-Mine", - "Geo_Rock-Mine", - "Geo_Rock-Mine", - "Geo_Rock-Mine", - "Geo_Rock-Mine", - "Geo_Rock-Mine", - "Geo_Rock-Mine", - "Geo_Rock-Mine", - "Geo_Rock-Mine", - "Geo_Rock-Mine", - "Geo_Rock-Mine", - "Geo_Rock-Mine", - "Geo_Rock-Mine", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Mine", - "Geo_Rock-Mine", - "Geo_Rock-Grave02", - "Geo_Rock-Grave02", - "Geo_Rock-Grave01", - "Geo_Rock-GreenPath02", - "Geo_Rock-Fung02", - "Geo_Rock-Fung01", - "Geo_Rock-City", - "Geo_Rock-City", - "Geo_Rock-City", - "Geo_Rock-City", - "Geo_Rock-City", - "Geo_Rock-City", - "Geo_Rock-City", - "Geo_Rock-City", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-Default", - "Geo_Rock-City", - "Geo_Rock-City", - "Geo_Rock-City", - "Geo_Rock-City", - "Geo_Rock-City" - ], - "IncludeLocations": [ - "Geo_Rock-Broken_Elevator_1", - "Geo_Rock-Broken_Elevator_2", - "Geo_Rock-Broken_Elevator_3", - "Geo_Rock-Broken_Bridge_Upper", - "Geo_Rock-Broken_Bridge_Lower", - "Geo_Rock-Broken_Bridge_Lower_Dupe", - "Geo_Rock-Abyss_1", - "Geo_Rock-Abyss_2", - "Geo_Rock-Abyss_3", - "Geo_Rock-Basin_Tunnel", - "Geo_Rock-Basin_Grub", - "Geo_Rock-Basin_Before_Broken_Vessel", - "Geo_Rock-Cliffs_Main_1", - "Geo_Rock-Cliffs_Main_2", - "Geo_Rock-Cliffs_Main_3", - "Geo_Rock-Cliffs_Main_4", - "Geo_Rock-Below_Gorb_Dupe", - "Geo_Rock-Below_Gorb", - "Geo_Rock-Crossroads_Well", - "Geo_Rock-Crossroads_Center_Grub", - "Geo_Rock-Crossroads_Root", - "Geo_Rock-Crossroads_Root_Dupe_1", - "Geo_Rock-Crossroads_Root_Dupe_2", - "Geo_Rock-Crossroads_Aspid_Arena", - "Geo_Rock-Crossroads_Aspid_Arena_Dupe_1", - "Geo_Rock-Crossroads_Aspid_Arena_Dupe_2", - "Geo_Rock-Crossroads_Aspid_Arena_Hidden", - "Geo_Rock-Crossroads_Above_False_Knight", - "Geo_Rock-Crossroads_Before_Acid_Grub", - "Geo_Rock-Crossroads_Below_Goam_Mask_Shard", - "Geo_Rock-Crossroads_After_Goam_Mask_Shard", - "Geo_Rock-Crossroads_Above_Lever", - "Geo_Rock-Crossroads_Before_Fungal", - "Geo_Rock-Crossroads_Before_Fungal_Dupe_1", - "Geo_Rock-Crossroads_Before_Fungal_Dupe_2", - "Geo_Rock-Crossroads_Before_Shops", - "Geo_Rock-Crossroads_Before_Glowing_Womb", - "Geo_Rock-Crossroads_Above_Tram", - "Geo_Rock-Crossroads_Above_Mawlek", - "Geo_Rock-Crossroads_Vessel_Fragment", - "Geo_Rock-Crossroads_Goam_Alcove", - "Geo_Rock-Crossroads_Goam_Damage_Boost", - "Geo_Rock-Crossroads_Tram", - "Geo_Rock-Crossroads_Goam_Journal", - "Geo_Rock-Crossroads_Goam_Journal_Dupe", - "Geo_Rock-Ancestral_Mound", - "Geo_Rock-Ancestral_Mound_Dupe", - "Geo_Rock-Ancestral_Mound_Tree", - "Geo_Rock-Ancestral_Mound_Tree_Dupe", - "Geo_Rock-Moss_Prophet", - "Geo_Rock-Moss_Prophet_Dupe", - "Geo_Rock-Deepnest_Below_Mimics", - "Geo_Rock-Deepnest_Below_Mimics_Dupe", - "Geo_Rock-Deepnest_Below_Spike_Grub", - "Geo_Rock-Deepnest_Below_Spike_Grub_Dupe", - "Geo_Rock-Deepnest_Spike_Grub_Right", - "Geo_Rock-Deepnest_By_Mantis_Lords_Garpede_Pogo", - "Geo_Rock-Deepnest_By_Mantis_Lords_Garpede_Pogo_Dupe", - "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_1", - "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_2", - "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_3", - "Geo_Rock-Deepnest_Nosk_1", - "Geo_Rock-Deepnest_Nosk_2", - "Geo_Rock-Deepnest_Nosk_3", - "Geo_Rock-Deepnest_Above_Galien", - "Geo_Rock-Deepnest_Galien_Spike", - "Geo_Rock-Deepnest_Garpede_1", - "Geo_Rock-Deepnest_Garpede_2", - "Geo_Rock-Dark_Deepnest_Above_Grub_1", - "Geo_Rock-Dark_Deepnest_Above_Grub_2", - "Geo_Rock-Dark_Deepnest_Bottom_Left", - "Geo_Rock-Above_Mask_Maker_1", - "Geo_Rock-Above_Mask_Maker_2", - "Geo_Rock-Lower_Kingdom's_Edge_1", - "Geo_Rock-Lower_Kingdom's_Edge_2", - "Geo_Rock-Lower_Kingdom's_Edge_3", - "Geo_Rock-Lower_Kingdom's_Edge_Dive", - "Geo_Rock-Kingdom's_Edge_Below_Bardoon", - "Geo_Rock-Kingdom's_Edge_Oro_Far_Left", - "Geo_Rock-Kingdom's_Edge_Oro_Middle_Left", - "Geo_Rock-Kingdom's_Edge_Above_Root", - "Geo_Rock-Kingdom's_Edge_Above_Tower", - "Geo_Rock-Kingdom's_Edge_Below_Colosseum", - "Geo_Rock-Kingdom's_Edge_Above_420_Geo_Rock", - "Geo_Rock-Kingdom's_Edge_420_Geo_Rock", - "Geo_Rock-Beast's_Den_Above_Trilobite", - "Geo_Rock-Beast's_Den_Above_Trilobite_Dupe", - "Geo_Rock-Beast's_Den_Below_Herrah", - "Geo_Rock-Beast's_Den_Below_Egg", - "Geo_Rock-Beast's_Den_Below_Egg_Dupe", - "Geo_Rock-Beast's_Den_Bottom", - "Geo_Rock-Beast's_Den_Bottom_Dupe", - "Geo_Rock-Beast's_Den_After_Herrah", - "Geo_Rock-Greenpath_Entrance", - "Geo_Rock-Greenpath_Waterfall", - "Geo_Rock-Greenpath_Below_Skip_Squit", - "Geo_Rock-Greenpath_Skip_Squit", - "Geo_Rock-Greenpath_Second_Skip_Fool_Eater", - "Geo_Rock-Greenpath_Second_Skip_Fool_Eater_Dupe", - "Geo_Rock-Greenpath_Second_Skip_Lower", - "Geo_Rock-Greenpath_Below_Hornet", - "Geo_Rock-Greenpath_Above_Thorns", - "Geo_Rock-Greenpath_Hunter's_Journal", - "Geo_Rock-Greenpath_Acid_Bridge", - "Geo_Rock-Greenpath_After_MMC_Hidden", - "Geo_Rock-Greenpath_After_MMC", - "Geo_Rock-Greenpath_After_MMC_Dupe", - "Geo_Rock-Greenpath_Obbles_Fool_Eater", - "Geo_Rock-Greenpath_Moss_Knights", - "Geo_Rock-Greenpath_Moss_Knights_Dupe_1", - "Geo_Rock-Greenpath_Moss_Knights_Dupe_2", - "Geo_Rock-Greenpath_Below_Stag", - "Geo_Rock-Greenpath_Below_Stag_Fool_Eater", - "Geo_Rock-Baldur_Shell_Top_Left", - "Geo_Rock-Baldur_Shell_Alcove", - "Geo_Rock-Greenpath_MMC", - "Geo_Rock-Greenpath_Below_Toll", - "Geo_Rock-Greenpath_Toll_Hidden", - "Geo_Rock-Greenpath_Toll_Hidden_Dupe", - "Geo_Rock-Fungal_Below_Shrumal_Ogres", - "Geo_Rock-Fungal_Above_Cloth", - "Geo_Rock-Fungal_After_Cloth", - "Geo_Rock-Fungal_Below_Pilgrim's_Way", - "Geo_Rock-Fungal_Below_Pilgrim's_Way_Dupe", - "Geo_Rock-Mantis_Outskirts_Guarded", - "Geo_Rock-Mantis_Outskirts_Guarded_Dupe", - "Geo_Rock-Mantis_Outskirts_Alcove", - "Geo_Rock-Mantis_Village_After_Lever", - "Geo_Rock-Mantis_Village_Above_Claw", - "Geo_Rock-Mantis_Village_Above_Claw_Dupe", - "Geo_Rock-Mantis_Village_Below_Lore", - "Geo_Rock-Mantis_Village_Above_Lever", - "Geo_Rock-Above_Mantis_Lords_1", - "Geo_Rock-Above_Mantis_Lords_2", - "Geo_Rock-Fungal_After_Bouncy_Grub", - "Geo_Rock-Fungal_After_Bouncy_Grub_Dupe", - "Geo_Rock-Fungal_Bouncy_Grub_Lever", - "Geo_Rock-Fungal_After_Cornifer", - "Geo_Rock-Fungal_Above_City_Entrance", - "Geo_Rock-Deepnest_By_Mantis_Lords_1", - "Geo_Rock-Deepnest_By_Mantis_Lords_2", - "Geo_Rock-Deepnest_Lower_Cornifer", - "Geo_Rock-Fungal_Core_Entrance", - "Geo_Rock-Fungal_Core_Hidden", - "Geo_Rock-Fungal_Core_Above_Elder", - "Geo_Rock-Queen's_Gardens_Acid_Entrance", - "Geo_Rock-Queen's_Gardens_Below_Stag", - "Geo_Rock-Fog_Canyon_East", - "Geo_Rock-Love_Key", - "Geo_Rock-Love_Key_Dupe", - "Geo_Rock-Queen's_Gardens_Above_Marmu", - "Geo_Rock-Pale_Lurker", - "Geo_Rock-Godhome_Pipeway", - "Geo_Rock-Hive_Entrance", - "Geo_Rock-Hive_Outside_Bench", - "Geo_Rock-Hive_Below_Root", - "Geo_Rock-Hive_After_Root", - "Geo_Rock-Hive_Below_Stash", - "Geo_Rock-Hive_Stash", - "Geo_Rock-Hive_Stash_Dupe", - "Geo_Rock-Hive_Below_Grub", - "Geo_Rock-Hive_Above_Mask", - "Geo_Rock-Crystal_Peak_Lower_Middle", - "Geo_Rock-Crystal_Peak_Lower_Conveyer_1", - "Geo_Rock-Crystal_Peak_Lower_Conveyer_2", - "Geo_Rock-Crystal_Peak_Before_Dark_Room", - "Geo_Rock-Crystal_Peak_Before_Dark_Room_Dupe", - "Geo_Rock-Crystal_Peak_Above_Spike_Grub", - "Geo_Rock-Crystal_Peak_Mimic_Grub", - "Geo_Rock-Crystal_Peak_Dive_Egg", - "Geo_Rock-Crystal_Peak_Dive_Egg_Dupe", - "Geo_Rock-Crystal_Peak_Conga_Line", - "Geo_Rock-Hallownest_Crown_Dive", - "Geo_Rock-Hallownest_Crown_Dive_Dupe", - "Geo_Rock-Hallownest_Crown_Hidden", - "Geo_Rock-Hallownest_Crown_Hidden_Dupe_1", - "Geo_Rock-Hallownest_Crown_Hidden_Dupe_2", - "Geo_Rock-Crystal_Peak_Before_Crystal_Heart", - "Geo_Rock-Crystal_Peak_Entrance", - "Geo_Rock-Crystal_Peak_Entrance_Dupe_1", - "Geo_Rock-Crystal_Peak_Entrance_Dupe_2", - "Geo_Rock-Crystal_Peak_Above_Crushers_Lower", - "Geo_Rock-Crystal_Peak_Above_Crushers_Higher", - "Geo_Rock-Resting_Grounds_Catacombs_Grub", - "Geo_Rock-Resting_Grounds_Catacombs_Left_Dupe", - "Geo_Rock-Resting_Grounds_Catacombs_Left", - "Geo_Rock-Overgrown_Mound", - "Geo_Rock-Fluke_Hermit_Dupe", - "Geo_Rock-Fluke_Hermit", - "Geo_Rock-Pleasure_House", - "Geo_Rock-City_of_Tears_Quirrel", - "Geo_Rock-City_of_Tears_Lemm", - "Geo_Rock-City_of_Tears_Above_Lemm", - "Geo_Rock-Soul_Sanctum", - "Geo_Rock-Watcher's_Spire", - "Geo_Rock-Above_King's_Station", - "Geo_Rock-King's_Station", - "Geo_Rock-King's_Pass_Left", - "Geo_Rock-King's_Pass_Below_Fury", - "Geo_Rock-King's_Pass_Hidden", - "Geo_Rock-King's_Pass_Collapse", - "Geo_Rock-King's_Pass_Above_Fury", - "Geo_Rock-Waterways_Tuk", - "Geo_Rock-Waterways_Tuk_Alcove", - "Geo_Rock-Waterways_Left", - "Geo_Rock-Waterways_East", - "Geo_Rock-Waterways_Flukemarm" - ], - "Vanilla": [ - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Broken_Elevator_1" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Broken_Elevator_2" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Broken_Elevator_3" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Broken_Bridge_Upper" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Broken_Bridge_Lower" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Broken_Bridge_Lower_Dupe" - }, - { - "item": "Geo_Rock-Abyss", - "location": "Geo_Rock-Abyss_1" - }, - { - "item": "Geo_Rock-Abyss", - "location": "Geo_Rock-Abyss_2" - }, - { - "item": "Geo_Rock-Abyss", - "location": "Geo_Rock-Abyss_3" - }, - { - "item": "Geo_Rock-Abyss", - "location": "Geo_Rock-Basin_Tunnel" - }, - { - "item": "Geo_Rock-Abyss", - "location": "Geo_Rock-Basin_Grub" - }, - { - "item": "Geo_Rock-Abyss", - "location": "Geo_Rock-Basin_Before_Broken_Vessel" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Cliffs_Main_1" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Cliffs_Main_2" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Cliffs_Main_3" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Cliffs_Main_4" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Below_Gorb_Dupe" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Below_Gorb" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Well" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Center_Grub" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Root" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Root_Dupe_1" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Root_Dupe_2" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Aspid_Arena" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Aspid_Arena_Dupe_1" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Aspid_Arena_Dupe_2" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Aspid_Arena_Hidden" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Above_False_Knight" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Before_Acid_Grub" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Below_Goam_Mask_Shard" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_After_Goam_Mask_Shard" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Above_Lever" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Before_Fungal" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Before_Fungal_Dupe_1" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Before_Fungal_Dupe_2" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Before_Shops" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Before_Glowing_Womb" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Above_Tram" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Above_Mawlek" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Vessel_Fragment" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Goam_Alcove" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Goam_Damage_Boost" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Tram" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Goam_Journal" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crossroads_Goam_Journal_Dupe" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Ancestral_Mound" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Ancestral_Mound_Dupe" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Ancestral_Mound_Tree" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Ancestral_Mound_Tree_Dupe" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Moss_Prophet" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Moss_Prophet_Dupe" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_Below_Mimics" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_Below_Mimics_Dupe" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_Below_Spike_Grub" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_Below_Spike_Grub_Dupe" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_Spike_Grub_Right" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_By_Mantis_Lords_Garpede_Pogo" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_By_Mantis_Lords_Garpede_Pogo_Dupe" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_1" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_2" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_3" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_Nosk_1" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_Nosk_2" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_Nosk_3" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_Above_Galien" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_Galien_Spike" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_Garpede_1" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_Garpede_2" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Dark_Deepnest_Above_Grub_1" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Dark_Deepnest_Above_Grub_2" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Dark_Deepnest_Bottom_Left" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Above_Mask_Maker_1" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Above_Mask_Maker_2" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Lower_Kingdom's_Edge_1" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Lower_Kingdom's_Edge_2" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Lower_Kingdom's_Edge_3" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Lower_Kingdom's_Edge_Dive" - }, - { - "item": "Geo_Rock-Outskirts", - "location": "Geo_Rock-Kingdom's_Edge_Below_Bardoon" - }, - { - "item": "Geo_Rock-Outskirts", - "location": "Geo_Rock-Kingdom's_Edge_Oro_Far_Left" - }, - { - "item": "Geo_Rock-Outskirts", - "location": "Geo_Rock-Kingdom's_Edge_Oro_Middle_Left" - }, - { - "item": "Geo_Rock-Outskirts", - "location": "Geo_Rock-Kingdom's_Edge_Above_Root" - }, - { - "item": "Geo_Rock-Outskirts", - "location": "Geo_Rock-Kingdom's_Edge_Above_Tower" - }, - { - "item": "Geo_Rock-Outskirts", - "location": "Geo_Rock-Kingdom's_Edge_Below_Colosseum" - }, - { - "item": "Geo_Rock-Outskirts", - "location": "Geo_Rock-Kingdom's_Edge_Above_420_Geo_Rock" - }, - { - "item": "Geo_Rock-Outskirts420", - "location": "Geo_Rock-Kingdom's_Edge_420_Geo_Rock" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Beast's_Den_Above_Trilobite" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Beast's_Den_Above_Trilobite_Dupe" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Beast's_Den_Below_Herrah" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Beast's_Den_Below_Egg" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Beast's_Den_Below_Egg_Dupe" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Beast's_Den_Bottom" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Beast's_Den_Bottom_Dupe" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Beast's_Den_After_Herrah" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Greenpath_Entrance" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Greenpath_Waterfall" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Greenpath_Below_Skip_Squit" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Greenpath_Skip_Squit" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Greenpath_Second_Skip_Fool_Eater" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Greenpath_Second_Skip_Fool_Eater_Dupe" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Greenpath_Second_Skip_Lower" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Greenpath_Below_Hornet" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Greenpath_Above_Thorns" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Greenpath_Hunter's_Journal" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Greenpath_Acid_Bridge" - }, - { - "item": "Geo_Rock-GreenPath02", - "location": "Geo_Rock-Greenpath_After_MMC_Hidden" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Greenpath_After_MMC" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Greenpath_After_MMC_Dupe" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Greenpath_Obbles_Fool_Eater" - }, - { - "item": "Geo_Rock-GreenPath02", - "location": "Geo_Rock-Greenpath_Moss_Knights" - }, - { - "item": "Geo_Rock-GreenPath02", - "location": "Geo_Rock-Greenpath_Moss_Knights_Dupe_1" - }, - { - "item": "Geo_Rock-GreenPath02", - "location": "Geo_Rock-Greenpath_Moss_Knights_Dupe_2" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Greenpath_Below_Stag" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Greenpath_Below_Stag_Fool_Eater" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Baldur_Shell_Top_Left" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Baldur_Shell_Alcove" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Greenpath_MMC" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Greenpath_Below_Toll" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Greenpath_Toll_Hidden" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Greenpath_Toll_Hidden_Dupe" - }, - { - "item": "Geo_Rock-Fung01", - "location": "Geo_Rock-Fungal_Below_Shrumal_Ogres" - }, - { - "item": "Geo_Rock-Fung01", - "location": "Geo_Rock-Fungal_Above_Cloth" - }, - { - "item": "Geo_Rock-Fung01", - "location": "Geo_Rock-Fungal_After_Cloth" - }, - { - "item": "Geo_Rock-Fung01", - "location": "Geo_Rock-Fungal_Below_Pilgrim's_Way" - }, - { - "item": "Geo_Rock-Fung02", - "location": "Geo_Rock-Fungal_Below_Pilgrim's_Way_Dupe" - }, - { - "item": "Geo_Rock-Fung01", - "location": "Geo_Rock-Mantis_Outskirts_Guarded" - }, - { - "item": "Geo_Rock-Fung02", - "location": "Geo_Rock-Mantis_Outskirts_Guarded_Dupe" - }, - { - "item": "Geo_Rock-Fung01", - "location": "Geo_Rock-Mantis_Outskirts_Alcove" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Mantis_Village_After_Lever" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Mantis_Village_Above_Claw" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Mantis_Village_Above_Claw_Dupe" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Mantis_Village_Below_Lore" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Mantis_Village_Above_Lever" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Above_Mantis_Lords_1" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Above_Mantis_Lords_2" - }, - { - "item": "Geo_Rock-Fung01", - "location": "Geo_Rock-Fungal_After_Bouncy_Grub" - }, - { - "item": "Geo_Rock-Fung02", - "location": "Geo_Rock-Fungal_After_Bouncy_Grub_Dupe" - }, - { - "item": "Geo_Rock-Fung02", - "location": "Geo_Rock-Fungal_Bouncy_Grub_Lever" - }, - { - "item": "Geo_Rock-Fung01", - "location": "Geo_Rock-Fungal_After_Cornifer" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Fungal_Above_City_Entrance" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_By_Mantis_Lords_1" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_By_Mantis_Lords_2" - }, - { - "item": "Geo_Rock-Deepnest", - "location": "Geo_Rock-Deepnest_Lower_Cornifer" - }, - { - "item": "Geo_Rock-Fung01", - "location": "Geo_Rock-Fungal_Core_Entrance" - }, - { - "item": "Geo_Rock-Fung01", - "location": "Geo_Rock-Fungal_Core_Hidden" - }, - { - "item": "Geo_Rock-Fung01", - "location": "Geo_Rock-Fungal_Core_Above_Elder" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Queen's_Gardens_Acid_Entrance" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Queen's_Gardens_Below_Stag" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Fog_Canyon_East" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Love_Key" - }, - { - "item": "Geo_Rock-GreenPath01", - "location": "Geo_Rock-Love_Key_Dupe" - }, - { - "item": "Geo_Rock-GreenPath02", - "location": "Geo_Rock-Queen's_Gardens_Above_Marmu" - }, - { - "item": "Geo_Rock-Outskirts", - "location": "Geo_Rock-Pale_Lurker" - }, - { - "item": "Geo_Rock-City", - "location": "Geo_Rock-Godhome_Pipeway" - }, - { - "item": "Geo_Rock-Hive", - "location": "Geo_Rock-Hive_Entrance" - }, - { - "item": "Geo_Rock-Hive", - "location": "Geo_Rock-Hive_Outside_Bench" - }, - { - "item": "Geo_Rock-Hive", - "location": "Geo_Rock-Hive_Below_Root" - }, - { - "item": "Geo_Rock-Hive", - "location": "Geo_Rock-Hive_After_Root" - }, - { - "item": "Geo_Rock-Hive", - "location": "Geo_Rock-Hive_Below_Stash" - }, - { - "item": "Geo_Rock-Hive", - "location": "Geo_Rock-Hive_Stash" - }, - { - "item": "Geo_Rock-Hive", - "location": "Geo_Rock-Hive_Stash_Dupe" - }, - { - "item": "Geo_Rock-Hive", - "location": "Geo_Rock-Hive_Below_Grub" - }, - { - "item": "Geo_Rock-Hive", - "location": "Geo_Rock-Hive_Above_Mask" - }, - { - "item": "Geo_Rock-Mine", - "location": "Geo_Rock-Crystal_Peak_Lower_Middle" - }, - { - "item": "Geo_Rock-Mine", - "location": "Geo_Rock-Crystal_Peak_Lower_Conveyer_1" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crystal_Peak_Lower_Conveyer_2" - }, - { - "item": "Geo_Rock-Mine", - "location": "Geo_Rock-Crystal_Peak_Before_Dark_Room" - }, - { - "item": "Geo_Rock-Mine", - "location": "Geo_Rock-Crystal_Peak_Before_Dark_Room_Dupe" - }, - { - "item": "Geo_Rock-Mine", - "location": "Geo_Rock-Crystal_Peak_Above_Spike_Grub" - }, - { - "item": "Geo_Rock-Mine", - "location": "Geo_Rock-Crystal_Peak_Mimic_Grub" - }, - { - "item": "Geo_Rock-Mine", - "location": "Geo_Rock-Crystal_Peak_Dive_Egg" - }, - { - "item": "Geo_Rock-Mine", - "location": "Geo_Rock-Crystal_Peak_Dive_Egg_Dupe" - }, - { - "item": "Geo_Rock-Mine", - "location": "Geo_Rock-Crystal_Peak_Conga_Line" - }, - { - "item": "Geo_Rock-Mine", - "location": "Geo_Rock-Hallownest_Crown_Dive" - }, - { - "item": "Geo_Rock-Mine", - "location": "Geo_Rock-Hallownest_Crown_Dive_Dupe" - }, - { - "item": "Geo_Rock-Mine", - "location": "Geo_Rock-Hallownest_Crown_Hidden" - }, - { - "item": "Geo_Rock-Mine", - "location": "Geo_Rock-Hallownest_Crown_Hidden_Dupe_1" - }, - { - "item": "Geo_Rock-Mine", - "location": "Geo_Rock-Hallownest_Crown_Hidden_Dupe_2" - }, - { - "item": "Geo_Rock-Mine", - "location": "Geo_Rock-Crystal_Peak_Before_Crystal_Heart" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crystal_Peak_Entrance" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crystal_Peak_Entrance_Dupe_1" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-Crystal_Peak_Entrance_Dupe_2" - }, - { - "item": "Geo_Rock-Mine", - "location": "Geo_Rock-Crystal_Peak_Above_Crushers_Lower" - }, - { - "item": "Geo_Rock-Mine", - "location": "Geo_Rock-Crystal_Peak_Above_Crushers_Higher" - }, - { - "item": "Geo_Rock-Grave02", - "location": "Geo_Rock-Resting_Grounds_Catacombs_Grub" - }, - { - "item": "Geo_Rock-Grave02", - "location": "Geo_Rock-Resting_Grounds_Catacombs_Left_Dupe" - }, - { - "item": "Geo_Rock-Grave01", - "location": "Geo_Rock-Resting_Grounds_Catacombs_Left" - }, - { - "item": "Geo_Rock-GreenPath02", - "location": "Geo_Rock-Overgrown_Mound" - }, - { - "item": "Geo_Rock-Fung02", - "location": "Geo_Rock-Fluke_Hermit_Dupe" - }, - { - "item": "Geo_Rock-Fung01", - "location": "Geo_Rock-Fluke_Hermit" - }, - { - "item": "Geo_Rock-City", - "location": "Geo_Rock-Pleasure_House" - }, - { - "item": "Geo_Rock-City", - "location": "Geo_Rock-City_of_Tears_Quirrel" - }, - { - "item": "Geo_Rock-City", - "location": "Geo_Rock-City_of_Tears_Lemm" - }, - { - "item": "Geo_Rock-City", - "location": "Geo_Rock-City_of_Tears_Above_Lemm" - }, - { - "item": "Geo_Rock-City", - "location": "Geo_Rock-Soul_Sanctum" - }, - { - "item": "Geo_Rock-City", - "location": "Geo_Rock-Watcher's_Spire" - }, - { - "item": "Geo_Rock-City", - "location": "Geo_Rock-Above_King's_Station" - }, - { - "item": "Geo_Rock-City", - "location": "Geo_Rock-King's_Station" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-King's_Pass_Left" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-King's_Pass_Below_Fury" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-King's_Pass_Hidden" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-King's_Pass_Collapse" - }, - { - "item": "Geo_Rock-Default", - "location": "Geo_Rock-King's_Pass_Above_Fury" - }, - { - "item": "Geo_Rock-City", - "location": "Geo_Rock-Waterways_Tuk" - }, - { - "item": "Geo_Rock-City", - "location": "Geo_Rock-Waterways_Tuk_Alcove" - }, - { - "item": "Geo_Rock-City", - "location": "Geo_Rock-Waterways_Left" - }, - { - "item": "Geo_Rock-City", - "location": "Geo_Rock-Waterways_East" - }, - { - "item": "Geo_Rock-City", - "location": "Geo_Rock-Waterways_Flukemarm" - } - ] - }, - { - "Group": "BossGeo", - "Name": "Boss_Geo", - "Path": "PoolSettings.BossGeo", - "IncludeItems": [ - "Boss_Geo-Massive_Moss_Charger", - "Boss_Geo-Gorgeous_Husk", - "Boss_Geo-Sanctum_Soul_Warrior", - "Boss_Geo-Elegant_Soul_Warrior", - "Boss_Geo-Crystal_Guardian", - "Boss_Geo-Enraged_Guardian", - "Boss_Geo-Gruz_Mother", - "Boss_Geo-Vengefly_King" - ], - "IncludeLocations": [ - "Boss_Geo-Massive_Moss_Charger", - "Boss_Geo-Gorgeous_Husk", - "Boss_Geo-Sanctum_Soul_Warrior", - "Boss_Geo-Elegant_Soul_Warrior", - "Boss_Geo-Crystal_Guardian", - "Boss_Geo-Enraged_Guardian", - "Boss_Geo-Gruz_Mother", - "Boss_Geo-Vengefly_King" - ], - "Vanilla": [ - { - "item": "Boss_Geo-Massive_Moss_Charger", - "location": "Boss_Geo-Massive_Moss_Charger" - }, - { - "item": "Boss_Geo-Gorgeous_Husk", - "location": "Boss_Geo-Gorgeous_Husk" - }, - { - "item": "Boss_Geo-Sanctum_Soul_Warrior", - "location": "Boss_Geo-Sanctum_Soul_Warrior" - }, - { - "item": "Boss_Geo-Elegant_Soul_Warrior", - "location": "Boss_Geo-Elegant_Soul_Warrior" - }, - { - "item": "Boss_Geo-Crystal_Guardian", - "location": "Boss_Geo-Crystal_Guardian" - }, - { - "item": "Boss_Geo-Enraged_Guardian", - "location": "Boss_Geo-Enraged_Guardian" - }, - { - "item": "Boss_Geo-Gruz_Mother", - "location": "Boss_Geo-Gruz_Mother" - }, - { - "item": "Boss_Geo-Vengefly_King", - "location": "Boss_Geo-Vengefly_King" - } - ] - }, - { - "Group": "SoulTotems", - "Name": "Soul", - "Path": "PoolSettings.SoulTotems", - "IncludeItems": [ - "Soul_Totem-C", - "Soul_Totem-B", - "Soul_Totem-A", - "Soul_Totem-C", - "Soul_Totem-C", - "Soul_Totem-B", - "Soul_Totem-B", - "Soul_Totem-C", - "Soul_Totem-E", - "Soul_Totem-A", - "Soul_Totem-F", - "Soul_Totem-D", - "Soul_Totem-E", - "Soul_Totem-B", - "Soul_Totem-B", - "Soul_Totem-C", - "Soul_Totem-B", - "Soul_Totem-A", - "Soul_Totem-C", - "Soul_Totem-B", - "Soul_Totem-A", - "Soul_Totem-B", - "Soul_Totem-A", - "Soul_Totem-C", - "Soul_Totem-C", - "Soul_Totem-C", - "Soul_Totem-C", - "Soul_Totem-A", - "Soul_Totem-C", - "Soul_Totem-C", - "Soul_Totem-B", - "Soul_Totem-A", - "Soul_Totem-B", - "Soul_Totem-A", - "Soul_Totem-B", - "Soul_Totem-C", - "Soul_Totem-C", - "Soul_Totem-E", - "Soul_Totem-B", - "Soul_Totem-D", - "Soul_Totem-A", - "Soul_Totem-G", - "Soul_Totem-C", - "Soul_Totem-B", - "Soul_Totem-C", - "Soul_Totem-B", - "Soul_Totem-Palace", - "Soul_Totem-Palace", - "Soul_Totem-Palace", - "Soul_Totem-Palace", - "Soul_Totem-Palace", - "Soul_Totem-Path_of_Pain", - "Soul_Totem-Path_of_Pain", - "Soul_Totem-Path_of_Pain", - "Soul_Totem-Path_of_Pain", - "Soul_Totem-Path_of_Pain", - "Soul_Totem-Path_of_Pain", - "Soul_Totem-Path_of_Pain", - "Soul_Totem-G" - ], - "IncludeLocations": [ - "Soul_Totem-Basin", - "Soul_Totem-Cliffs_Main", - "Soul_Totem-Cliffs_Gorb", - "Soul_Totem-Cliffs_Joni's", - "Soul_Totem-Crossroads_Goam_Journal", - "Soul_Totem-Crossroads_Shops", - "Soul_Totem-Crossroads_Mawlek_Upper", - "Soul_Totem-Crossroads_Acid", - "Soul_Totem-Crossroads_Mawlek_Lower", - "Soul_Totem-Crossroads_Myla", - "Soul_Totem-Ancestral_Mound", - "Soul_Totem-Distant_Village", - "Soul_Totem-Deepnest_Vessel", - "Soul_Totem-Mask_Maker", - "Soul_Totem-Lower_Kingdom's_Edge_1", - "Soul_Totem-Lower_Kingdom's_Edge_2", - "Soul_Totem-Upper_Kingdom's_Edge", - "Soul_Totem-Kingdom's_Edge_Camp", - "Soul_Totem-Oro_Dive_2", - "Soul_Totem-Oro_Dive_1", - "Soul_Totem-Oro", - "Soul_Totem-420_Geo_Rock", - "Soul_Totem-Beast's_Den", - "Soul_Totem-Greenpath_Hunter's_Journal", - "Soul_Totem-Greenpath_MMC", - "Soul_Totem-Greenpath_Below_Toll", - "Soul_Totem-Before_Pilgrim's_Way", - "Soul_Totem-Pilgrim's_Way", - "Soul_Totem-Fungal_Core", - "Soul_Totem-Top_Left_Queen's_Gardens", - "Soul_Totem-Below_Marmu", - "Soul_Totem-Upper_Crystal_Peak", - "Soul_Totem-Hallownest_Crown", - "Soul_Totem-Outside_Crystallized_Mound", - "Soul_Totem-Crystal_Heart_1", - "Soul_Totem-Crystal_Heart_2", - "Soul_Totem-Crystallized_Mound", - "Soul_Totem-Resting_Grounds", - "Soul_Totem-Below_Xero", - "Soul_Totem-Sanctum_Below_Soul_Master", - "Soul_Totem-Sanctum_Below_Chest", - "Soul_Totem-Sanctum_Above_Grub", - "Soul_Totem-Waterways_Entrance", - "Soul_Totem-Top_Left_Waterways", - "Soul_Totem-Waterways_East", - "Soul_Totem-Waterways_Flukemarm", - "Soul_Totem-White_Palace_Entrance", - "Soul_Totem-White_Palace_Hub", - "Soul_Totem-White_Palace_Left", - "Soul_Totem-White_Palace_Final", - "Soul_Totem-White_Palace_Right", - "Soul_Totem-Path_of_Pain_Below_Lever", - "Soul_Totem-Path_of_Pain_Left_of_Lever", - "Soul_Totem-Path_of_Pain_Entrance", - "Soul_Totem-Path_of_Pain_Second", - "Soul_Totem-Path_of_Pain_Hidden", - "Soul_Totem-Path_of_Pain_Below_Thornskip", - "Soul_Totem-Path_of_Pain_Final", - "Soul_Totem-Pale_Lurker" - ], - "Vanilla": [ - { - "item": "Soul_Totem-C", - "location": "Soul_Totem-Basin" - }, - { - "item": "Soul_Totem-B", - "location": "Soul_Totem-Cliffs_Main" - }, - { - "item": "Soul_Totem-A", - "location": "Soul_Totem-Cliffs_Gorb" - }, - { - "item": "Soul_Totem-C", - "location": "Soul_Totem-Cliffs_Joni's" - }, - { - "item": "Soul_Totem-C", - "location": "Soul_Totem-Crossroads_Goam_Journal" - }, - { - "item": "Soul_Totem-B", - "location": "Soul_Totem-Crossroads_Shops" - }, - { - "item": "Soul_Totem-B", - "location": "Soul_Totem-Crossroads_Mawlek_Upper" - }, - { - "item": "Soul_Totem-C", - "location": "Soul_Totem-Crossroads_Acid" - }, - { - "item": "Soul_Totem-E", - "location": "Soul_Totem-Crossroads_Mawlek_Lower" - }, - { - "item": "Soul_Totem-A", - "location": "Soul_Totem-Crossroads_Myla" - }, - { - "item": "Soul_Totem-F", - "location": "Soul_Totem-Ancestral_Mound" - }, - { - "item": "Soul_Totem-D", - "location": "Soul_Totem-Distant_Village" - }, - { - "item": "Soul_Totem-E", - "location": "Soul_Totem-Deepnest_Vessel" - }, - { - "item": "Soul_Totem-B", - "location": "Soul_Totem-Mask_Maker" - }, - { - "item": "Soul_Totem-B", - "location": "Soul_Totem-Lower_Kingdom's_Edge_1" - }, - { - "item": "Soul_Totem-C", - "location": "Soul_Totem-Lower_Kingdom's_Edge_2" - }, - { - "item": "Soul_Totem-B", - "location": "Soul_Totem-Upper_Kingdom's_Edge" - }, - { - "item": "Soul_Totem-A", - "location": "Soul_Totem-Kingdom's_Edge_Camp" - }, - { - "item": "Soul_Totem-C", - "location": "Soul_Totem-Oro_Dive_2" - }, - { - "item": "Soul_Totem-B", - "location": "Soul_Totem-Oro_Dive_1" - }, - { - "item": "Soul_Totem-A", - "location": "Soul_Totem-Oro" - }, - { - "item": "Soul_Totem-B", - "location": "Soul_Totem-420_Geo_Rock" - }, - { - "item": "Soul_Totem-A", - "location": "Soul_Totem-Beast's_Den" - }, - { - "item": "Soul_Totem-C", - "location": "Soul_Totem-Greenpath_Hunter's_Journal" - }, - { - "item": "Soul_Totem-C", - "location": "Soul_Totem-Greenpath_MMC" - }, - { - "item": "Soul_Totem-C", - "location": "Soul_Totem-Greenpath_Below_Toll" - }, - { - "item": "Soul_Totem-C", - "location": "Soul_Totem-Before_Pilgrim's_Way" - }, - { - "item": "Soul_Totem-A", - "location": "Soul_Totem-Pilgrim's_Way" - }, - { - "item": "Soul_Totem-C", - "location": "Soul_Totem-Fungal_Core" - }, - { - "item": "Soul_Totem-C", - "location": "Soul_Totem-Top_Left_Queen's_Gardens" - }, - { - "item": "Soul_Totem-B", - "location": "Soul_Totem-Below_Marmu" - }, - { - "item": "Soul_Totem-A", - "location": "Soul_Totem-Upper_Crystal_Peak" - }, - { - "item": "Soul_Totem-B", - "location": "Soul_Totem-Hallownest_Crown" - }, - { - "item": "Soul_Totem-A", - "location": "Soul_Totem-Outside_Crystallized_Mound" - }, - { - "item": "Soul_Totem-B", - "location": "Soul_Totem-Crystal_Heart_1" - }, - { - "item": "Soul_Totem-C", - "location": "Soul_Totem-Crystal_Heart_2" - }, - { - "item": "Soul_Totem-C", - "location": "Soul_Totem-Crystallized_Mound" - }, - { - "item": "Soul_Totem-E", - "location": "Soul_Totem-Resting_Grounds" - }, - { - "item": "Soul_Totem-B", - "location": "Soul_Totem-Below_Xero" - }, - { - "item": "Soul_Totem-D", - "location": "Soul_Totem-Sanctum_Below_Soul_Master" - }, - { - "item": "Soul_Totem-A", - "location": "Soul_Totem-Sanctum_Below_Chest" - }, - { - "item": "Soul_Totem-G", - "location": "Soul_Totem-Sanctum_Above_Grub" - }, - { - "item": "Soul_Totem-C", - "location": "Soul_Totem-Waterways_Entrance" - }, - { - "item": "Soul_Totem-B", - "location": "Soul_Totem-Top_Left_Waterways" - }, - { - "item": "Soul_Totem-C", - "location": "Soul_Totem-Waterways_East" - }, - { - "item": "Soul_Totem-B", - "location": "Soul_Totem-Waterways_Flukemarm" - }, - { - "item": "Soul_Totem-Palace", - "location": "Soul_Totem-White_Palace_Entrance" - }, - { - "item": "Soul_Totem-Palace", - "location": "Soul_Totem-White_Palace_Hub" - }, - { - "item": "Soul_Totem-Palace", - "location": "Soul_Totem-White_Palace_Left" - }, - { - "item": "Soul_Totem-Palace", - "location": "Soul_Totem-White_Palace_Final" - }, - { - "item": "Soul_Totem-Palace", - "location": "Soul_Totem-White_Palace_Right" - }, - { - "item": "Soul_Totem-Path_of_Pain", - "location": "Soul_Totem-Path_of_Pain_Below_Lever" - }, - { - "item": "Soul_Totem-Path_of_Pain", - "location": "Soul_Totem-Path_of_Pain_Left_of_Lever" - }, - { - "item": "Soul_Totem-Path_of_Pain", - "location": "Soul_Totem-Path_of_Pain_Entrance" - }, - { - "item": "Soul_Totem-Path_of_Pain", - "location": "Soul_Totem-Path_of_Pain_Second" - }, - { - "item": "Soul_Totem-Path_of_Pain", - "location": "Soul_Totem-Path_of_Pain_Hidden" - }, - { - "item": "Soul_Totem-Path_of_Pain", - "location": "Soul_Totem-Path_of_Pain_Below_Thornskip" - }, - { - "item": "Soul_Totem-Path_of_Pain", - "location": "Soul_Totem-Path_of_Pain_Final" - }, - { - "item": "Soul_Totem-G", - "location": "Soul_Totem-Pale_Lurker" - } - ] - }, - { - "Group": "LoreTablets", - "Name": "Lore", - "Path": "PoolSettings.LoreTablets", - "IncludeItems": [ - "Lore_Tablet-City_Entrance", - "Lore_Tablet-Pleasure_House", - "Lore_Tablet-Sanctum_Entrance", - "Lore_Tablet-Sanctum_Past_Soul_Master", - "Lore_Tablet-Watcher's_Spire", - "Lore_Tablet-Archives_Upper", - "Lore_Tablet-Archives_Left", - "Lore_Tablet-Archives_Right", - "Lore_Tablet-Pilgrim's_Way_1", - "Lore_Tablet-Pilgrim's_Way_2", - "Lore_Tablet-Mantis_Outskirts", - "Lore_Tablet-Mantis_Village", - "Lore_Tablet-Greenpath_Upper_Hidden", - "Lore_Tablet-Greenpath_Below_Toll", - "Lore_Tablet-Greenpath_Lifeblood", - "Lore_Tablet-Greenpath_Stag", - "Lore_Tablet-Greenpath_QG", - "Lore_Tablet-Greenpath_Lower_Hidden", - "Lore_Tablet-Dung_Defender", - "Lore_Tablet-Spore_Shroom", - "Lore_Tablet-Fungal_Wastes_Hidden", - "Lore_Tablet-Fungal_Wastes_Below_Shrumal_Ogres", - "Lore_Tablet-Fungal_Core", - "Lore_Tablet-Ancient_Basin", - "Lore_Tablet-King's_Pass_Focus", - "Lore_Tablet-King's_Pass_Fury", - "Lore_Tablet-King's_Pass_Exit", - "Lore_Tablet-World_Sense", - "Lore_Tablet-Howling_Cliffs", - "Lore_Tablet-Kingdom's_Edge", - "Lore_Tablet-Palace_Workshop", - "Lore_Tablet-Palace_Throne", - "Lore_Tablet-Path_of_Pain_Entrance" - ], - "IncludeLocations": [ - "Lore_Tablet-City_Entrance", - "Lore_Tablet-Pleasure_House", - "Lore_Tablet-Sanctum_Entrance", - "Lore_Tablet-Sanctum_Past_Soul_Master", - "Lore_Tablet-Watcher's_Spire", - "Lore_Tablet-Archives_Upper", - "Lore_Tablet-Archives_Left", - "Lore_Tablet-Archives_Right", - "Lore_Tablet-Pilgrim's_Way_1", - "Lore_Tablet-Pilgrim's_Way_2", - "Lore_Tablet-Mantis_Outskirts", - "Lore_Tablet-Mantis_Village", - "Lore_Tablet-Greenpath_Upper_Hidden", - "Lore_Tablet-Greenpath_Below_Toll", - "Lore_Tablet-Greenpath_Lifeblood", - "Lore_Tablet-Greenpath_Stag", - "Lore_Tablet-Greenpath_QG", - "Lore_Tablet-Greenpath_Lower_Hidden", - "Lore_Tablet-Dung_Defender", - "Lore_Tablet-Spore_Shroom", - "Lore_Tablet-Fungal_Wastes_Hidden", - "Lore_Tablet-Fungal_Wastes_Below_Shrumal_Ogres", - "Lore_Tablet-Fungal_Core", - "Lore_Tablet-Ancient_Basin", - "Lore_Tablet-King's_Pass_Focus", - "Lore_Tablet-King's_Pass_Fury", - "Lore_Tablet-King's_Pass_Exit", - "Lore_Tablet-World_Sense", - "Lore_Tablet-Howling_Cliffs", - "Lore_Tablet-Kingdom's_Edge", - "Lore_Tablet-Palace_Workshop", - "Lore_Tablet-Palace_Throne", - "Lore_Tablet-Path_of_Pain_Entrance" - ], - "Vanilla": [ - { - "item": "Lore_Tablet-City_Entrance", - "location": "Lore_Tablet-City_Entrance" - }, - { - "item": "Lore_Tablet-Pleasure_House", - "location": "Lore_Tablet-Pleasure_House" - }, - { - "item": "Lore_Tablet-Sanctum_Entrance", - "location": "Lore_Tablet-Sanctum_Entrance" - }, - { - "item": "Lore_Tablet-Sanctum_Past_Soul_Master", - "location": "Lore_Tablet-Sanctum_Past_Soul_Master" - }, - { - "item": "Lore_Tablet-Watcher's_Spire", - "location": "Lore_Tablet-Watcher's_Spire" - }, - { - "item": "Lore_Tablet-Archives_Upper", - "location": "Lore_Tablet-Archives_Upper" - }, - { - "item": "Lore_Tablet-Archives_Left", - "location": "Lore_Tablet-Archives_Left" - }, - { - "item": "Lore_Tablet-Archives_Right", - "location": "Lore_Tablet-Archives_Right" - }, - { - "item": "Lore_Tablet-Pilgrim's_Way_1", - "location": "Lore_Tablet-Pilgrim's_Way_1" - }, - { - "item": "Lore_Tablet-Pilgrim's_Way_2", - "location": "Lore_Tablet-Pilgrim's_Way_2" - }, - { - "item": "Lore_Tablet-Mantis_Outskirts", - "location": "Lore_Tablet-Mantis_Outskirts" - }, - { - "item": "Lore_Tablet-Mantis_Village", - "location": "Lore_Tablet-Mantis_Village" - }, - { - "item": "Lore_Tablet-Greenpath_Upper_Hidden", - "location": "Lore_Tablet-Greenpath_Upper_Hidden" - }, - { - "item": "Lore_Tablet-Greenpath_Below_Toll", - "location": "Lore_Tablet-Greenpath_Below_Toll" - }, - { - "item": "Lore_Tablet-Greenpath_Lifeblood", - "location": "Lore_Tablet-Greenpath_Lifeblood" - }, - { - "item": "Lore_Tablet-Greenpath_Stag", - "location": "Lore_Tablet-Greenpath_Stag" - }, - { - "item": "Lore_Tablet-Greenpath_QG", - "location": "Lore_Tablet-Greenpath_QG" - }, - { - "item": "Lore_Tablet-Greenpath_Lower_Hidden", - "location": "Lore_Tablet-Greenpath_Lower_Hidden" - }, - { - "item": "Lore_Tablet-Dung_Defender", - "location": "Lore_Tablet-Dung_Defender" - }, - { - "item": "Lore_Tablet-Spore_Shroom", - "location": "Lore_Tablet-Spore_Shroom" - }, - { - "item": "Lore_Tablet-Fungal_Wastes_Hidden", - "location": "Lore_Tablet-Fungal_Wastes_Hidden" - }, - { - "item": "Lore_Tablet-Fungal_Wastes_Below_Shrumal_Ogres", - "location": "Lore_Tablet-Fungal_Wastes_Below_Shrumal_Ogres" - }, - { - "item": "Lore_Tablet-Fungal_Core", - "location": "Lore_Tablet-Fungal_Core" - }, - { - "item": "Lore_Tablet-Ancient_Basin", - "location": "Lore_Tablet-Ancient_Basin" - }, - { - "item": "Lore_Tablet-King's_Pass_Focus", - "location": "Lore_Tablet-King's_Pass_Focus" - }, - { - "item": "Lore_Tablet-King's_Pass_Fury", - "location": "Lore_Tablet-King's_Pass_Fury" - }, - { - "item": "Lore_Tablet-King's_Pass_Exit", - "location": "Lore_Tablet-King's_Pass_Exit" - }, - { - "item": "Lore_Tablet-World_Sense", - "location": "Lore_Tablet-World_Sense" - }, - { - "item": "Lore_Tablet-Howling_Cliffs", - "location": "Lore_Tablet-Howling_Cliffs" - }, - { - "item": "Lore_Tablet-Kingdom's_Edge", - "location": "Lore_Tablet-Kingdom's_Edge" - }, - { - "item": "Lore_Tablet-Palace_Workshop", - "location": "Lore_Tablet-Palace_Workshop" - }, - { - "item": "Lore_Tablet-Palace_Throne", - "location": "Lore_Tablet-Palace_Throne" - }, - { - "item": "Lore_Tablet-Path_of_Pain_Entrance", - "location": "Lore_Tablet-Path_of_Pain_Entrance" - } - ] - } -] diff --git a/RandomizerMod/Resources/Data/rooms.json b/RandomizerMod/Resources/Data/rooms.json deleted file mode 100644 index e4edaed..0000000 --- a/RandomizerMod/Resources/Data/rooms.json +++ /dev/null @@ -1,1822 +0,0 @@ -{ - "Start": { - "SceneName": "Start", - "MapArea": "Start", - "TitledArea": "Start" - }, - "Unknown": { - "SceneName": "Unknown", - "MapArea": "Unknown", - "TitledArea": "Unknown" - }, - "Abyss_03": { - "SceneName": "Abyss_03", - "MapArea": "Ancient Basin", - "TitledArea": "Ancient Basin" - }, - "Abyss_04": { - "SceneName": "Abyss_04", - "MapArea": "Ancient Basin", - "TitledArea": "Ancient Basin" - }, - "Abyss_05": { - "SceneName": "Abyss_05", - "MapArea": "Ancient Basin", - "TitledArea": "Palace Grounds" - }, - "Abyss_06_Core": { - "SceneName": "Abyss_06_Core", - "MapArea": "Ancient Basin", - "TitledArea": "Abyss" - }, - "Abyss_08": { - "SceneName": "Abyss_08", - "MapArea": "Ancient Basin", - "TitledArea": "Abyss" - }, - "Abyss_09": { - "SceneName": "Abyss_09", - "MapArea": "Ancient Basin", - "TitledArea": "Abyss" - }, - "Abyss_10": { - "SceneName": "Abyss_10", - "MapArea": "Ancient Basin", - "TitledArea": "Abyss" - }, - "Abyss_12": { - "SceneName": "Abyss_12", - "MapArea": "Ancient Basin", - "TitledArea": "Abyss" - }, - "Abyss_15": { - "SceneName": "Abyss_15", - "MapArea": "Ancient Basin", - "TitledArea": "Abyss" - }, - "Abyss_16": { - "SceneName": "Abyss_16", - "MapArea": "Ancient Basin", - "TitledArea": "Abyss" - }, - "Abyss_17": { - "SceneName": "Abyss_17", - "MapArea": "Ancient Basin", - "TitledArea": "Ancient Basin" - }, - "Abyss_18": { - "SceneName": "Abyss_18", - "MapArea": "Ancient Basin", - "TitledArea": "Ancient Basin" - }, - "Abyss_19": { - "SceneName": "Abyss_19", - "MapArea": "Ancient Basin", - "TitledArea": "Ancient Basin" - }, - "Abyss_20": { - "SceneName": "Abyss_20", - "MapArea": "Ancient Basin", - "TitledArea": "Ancient Basin" - }, - "Abyss_21": { - "SceneName": "Abyss_21", - "MapArea": "Ancient Basin", - "TitledArea": "Ancient Basin" - }, - "Abyss_22": { - "SceneName": "Abyss_22", - "MapArea": "Ancient Basin", - "TitledArea": "Palace Grounds" - }, - "Abyss_Lighthouse_room": { - "SceneName": "Abyss_Lighthouse_room", - "MapArea": "Ancient Basin", - "TitledArea": "Abyss" - }, - "Crossroads_49b": { - "SceneName": "Crossroads_49b", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Room_nailsmith": { - "SceneName": "Room_nailsmith", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins_Bathhouse": { - "SceneName": "Ruins_Bathhouse", - "MapArea": "City of Tears", - "TitledArea": "Pleasure House" - }, - "Ruins_Elevator": { - "SceneName": "Ruins_Elevator", - "MapArea": "City of Tears", - "TitledArea": "Pleasure House" - }, - "Ruins_House_01": { - "SceneName": "Ruins_House_01", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins_House_02": { - "SceneName": "Ruins_House_02", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins_House_03": { - "SceneName": "Ruins_House_03", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins1_01": { - "SceneName": "Ruins1_01", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins1_02": { - "SceneName": "Ruins1_02", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins1_03": { - "SceneName": "Ruins1_03", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins1_04": { - "SceneName": "Ruins1_04", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins1_05": { - "SceneName": "Ruins1_05", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins1_05b": { - "SceneName": "Ruins1_05b", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins1_05c": { - "SceneName": "Ruins1_05c", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins1_06": { - "SceneName": "Ruins1_06", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins1_09": { - "SceneName": "Ruins1_09", - "MapArea": "City of Tears", - "TitledArea": "Soul Sanctum" - }, - "Ruins1_17": { - "SceneName": "Ruins1_17", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins1_18": { - "SceneName": "Ruins1_18", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins1_23": { - "SceneName": "Ruins1_23", - "MapArea": "City of Tears", - "TitledArea": "Soul Sanctum" - }, - "Ruins1_24": { - "SceneName": "Ruins1_24", - "MapArea": "City of Tears", - "TitledArea": "Soul Sanctum" - }, - "Ruins1_25": { - "SceneName": "Ruins1_25", - "MapArea": "City of Tears", - "TitledArea": "Soul Sanctum" - }, - "Ruins1_27": { - "SceneName": "Ruins1_27", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins1_28": { - "SceneName": "Ruins1_28", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins1_29": { - "SceneName": "Ruins1_29", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins1_30": { - "SceneName": "Ruins1_30", - "MapArea": "City of Tears", - "TitledArea": "Soul Sanctum" - }, - "Ruins1_31": { - "SceneName": "Ruins1_31", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins1_31b": { - "SceneName": "Ruins1_31b", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins1_32": { - "SceneName": "Ruins1_32", - "MapArea": "City of Tears", - "TitledArea": "Soul Sanctum" - }, - "Ruins2_01": { - "SceneName": "Ruins2_01", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins2_01_b": { - "SceneName": "Ruins2_01_b", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins2_03": { - "SceneName": "Ruins2_03", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins2_03b": { - "SceneName": "Ruins2_03b", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins2_04": { - "SceneName": "Ruins2_04", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Ruins2_05": { - "SceneName": "Ruins2_05", - "MapArea": "City of Tears", - "TitledArea": "King's Station" - }, - "Ruins2_06": { - "SceneName": "Ruins2_06", - "MapArea": "City of Tears", - "TitledArea": "King's Station" - }, - "Ruins2_07": { - "SceneName": "Ruins2_07", - "MapArea": "City of Tears", - "TitledArea": "King's Station" - }, - "Ruins2_08": { - "SceneName": "Ruins2_08", - "MapArea": "City of Tears", - "TitledArea": "King's Station" - }, - "Ruins2_09": { - "SceneName": "Ruins2_09", - "MapArea": "City of Tears", - "TitledArea": "King's Station" - }, - "Ruins2_10b": { - "SceneName": "Ruins2_10b", - "MapArea": "City of Tears", - "TitledArea": "King's Station" - }, - "Ruins2_11": { - "SceneName": "Ruins2_11", - "MapArea": "City of Tears", - "TitledArea": "Tower of Love" - }, - "Ruins2_11_b": { - "SceneName": "Ruins2_11_b", - "MapArea": "City of Tears", - "TitledArea": "Tower of Love" - }, - "Ruins2_Watcher_Room": { - "SceneName": "Ruins2_Watcher_Room", - "MapArea": "City of Tears", - "TitledArea": "City of Tears" - }, - "Mines_01": { - "SceneName": "Mines_01", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_02": { - "SceneName": "Mines_02", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_03": { - "SceneName": "Mines_03", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_04": { - "SceneName": "Mines_04", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_05": { - "SceneName": "Mines_05", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_06": { - "SceneName": "Mines_06", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_07": { - "SceneName": "Mines_07", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_10": { - "SceneName": "Mines_10", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_11": { - "SceneName": "Mines_11", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_13": { - "SceneName": "Mines_13", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_16": { - "SceneName": "Mines_16", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_17": { - "SceneName": "Mines_17", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_18": { - "SceneName": "Mines_18", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_19": { - "SceneName": "Mines_19", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_20": { - "SceneName": "Mines_20", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_23": { - "SceneName": "Mines_23", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_24": { - "SceneName": "Mines_24", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_25": { - "SceneName": "Mines_25", - "MapArea": "Crystal Peak", - "TitledArea": "Hallownest's Crown" - }, - "Mines_28": { - "SceneName": "Mines_28", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_29": { - "SceneName": "Mines_29", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_30": { - "SceneName": "Mines_30", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_31": { - "SceneName": "Mines_31", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_32": { - "SceneName": "Mines_32", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_34": { - "SceneName": "Mines_34", - "MapArea": "Crystal Peak", - "TitledArea": "Hallownest's Crown" - }, - "Mines_35": { - "SceneName": "Mines_35", - "MapArea": "Crystal Peak", - "TitledArea": "Crystallized Mound" - }, - "Mines_36": { - "SceneName": "Mines_36", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Mines_37": { - "SceneName": "Mines_37", - "MapArea": "Crystal Peak", - "TitledArea": "Crystal Peak" - }, - "Abyss_03_b": { - "SceneName": "Abyss_03_b", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_01b": { - "SceneName": "Deepnest_01b", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_02": { - "SceneName": "Deepnest_02", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_03": { - "SceneName": "Deepnest_03", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_09": { - "SceneName": "Deepnest_09", - "MapArea": "Deepnest", - "TitledArea": "Distant Village" - }, - "Deepnest_10": { - "SceneName": "Deepnest_10", - "MapArea": "Deepnest", - "TitledArea": "Distant Village" - }, - "Deepnest_14": { - "SceneName": "Deepnest_14", - "MapArea": "Deepnest", - "TitledArea": "Failed Tramway" - }, - "Deepnest_16": { - "SceneName": "Deepnest_16", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_17": { - "SceneName": "Deepnest_17", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_26": { - "SceneName": "Deepnest_26", - "MapArea": "Deepnest", - "TitledArea": "Failed Tramway" - }, - "Deepnest_26b": { - "SceneName": "Deepnest_26b", - "MapArea": "Deepnest", - "TitledArea": "Failed Tramway" - }, - "Deepnest_30": { - "SceneName": "Deepnest_30", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_31": { - "SceneName": "Deepnest_31", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_32": { - "SceneName": "Deepnest_32", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_33": { - "SceneName": "Deepnest_33", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_34": { - "SceneName": "Deepnest_34", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_35": { - "SceneName": "Deepnest_35", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_36": { - "SceneName": "Deepnest_36", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_37": { - "SceneName": "Deepnest_37", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_38": { - "SceneName": "Deepnest_38", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_39": { - "SceneName": "Deepnest_39", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_40": { - "SceneName": "Deepnest_40", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_41": { - "SceneName": "Deepnest_41", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_42": { - "SceneName": "Deepnest_42", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_44": { - "SceneName": "Deepnest_44", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Deepnest_45_v02": { - "SceneName": "Deepnest_45_v02", - "MapArea": "Deepnest", - "TitledArea": "Weaver's Den" - }, - "Deepnest_Spider_Town": { - "SceneName": "Deepnest_Spider_Town", - "MapArea": "Deepnest", - "TitledArea": "Beast's Den" - }, - "Fungus2_25": { - "SceneName": "Fungus2_25", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Room_Mask_Maker": { - "SceneName": "Room_Mask_Maker", - "MapArea": "Deepnest", - "TitledArea": "Deepnest" - }, - "Room_spider_small": { - "SceneName": "Room_spider_small", - "MapArea": "Deepnest", - "TitledArea": "Distant Village" - }, - "Grimm_Divine": { - "SceneName": "Grimm_Divine", - "MapArea": "Dirtmouth", - "TitledArea": "Dirtmouth" - }, - "Grimm_Main_Tent": { - "SceneName": "Grimm_Main_Tent", - "MapArea": "Dirtmouth", - "TitledArea": "Dirtmouth" - }, - "Room_Bretta": { - "SceneName": "Room_Bretta", - "MapArea": "Dirtmouth", - "TitledArea": "Dirtmouth" - }, - "Room_mapper": { - "SceneName": "Room_mapper", - "MapArea": "Dirtmouth", - "TitledArea": "Dirtmouth" - }, - "Room_Ouiji": { - "SceneName": "Room_Ouiji", - "MapArea": "Dirtmouth", - "TitledArea": "Dirtmouth" - }, - "Room_shop": { - "SceneName": "Room_shop", - "MapArea": "Dirtmouth", - "TitledArea": "Dirtmouth" - }, - "Room_Town_Stag_Station": { - "SceneName": "Room_Town_Stag_Station", - "MapArea": "Dirtmouth", - "TitledArea": "Dirtmouth" - }, - "Town": { - "SceneName": "Town", - "MapArea": "Dirtmouth", - "TitledArea": "Dirtmouth" - }, - "Tutorial_01": { - "SceneName": "Tutorial_01", - "MapArea": "Dirtmouth", - "TitledArea": "King's Pass" - }, - "Fungus3_01": { - "SceneName": "Fungus3_01", - "MapArea": "Fog Canyon", - "TitledArea": "Fog Canyon" - }, - "Fungus3_02": { - "SceneName": "Fungus3_02", - "MapArea": "Fog Canyon", - "TitledArea": "Fog Canyon" - }, - "Fungus3_03": { - "SceneName": "Fungus3_03", - "MapArea": "Fog Canyon", - "TitledArea": "Fog Canyon" - }, - "Fungus3_24": { - "SceneName": "Fungus3_24", - "MapArea": "Fog Canyon", - "TitledArea": "Fog Canyon" - }, - "Fungus3_25": { - "SceneName": "Fungus3_25", - "MapArea": "Fog Canyon", - "TitledArea": "Fog Canyon" - }, - "Fungus3_25b": { - "SceneName": "Fungus3_25b", - "MapArea": "Fog Canyon", - "TitledArea": "Fog Canyon" - }, - "Fungus3_26": { - "SceneName": "Fungus3_26", - "MapArea": "Fog Canyon", - "TitledArea": "Fog Canyon" - }, - "Fungus3_27": { - "SceneName": "Fungus3_27", - "MapArea": "Fog Canyon", - "TitledArea": "Fog Canyon" - }, - "Fungus3_28": { - "SceneName": "Fungus3_28", - "MapArea": "Fog Canyon", - "TitledArea": "Fog Canyon" - }, - "Fungus3_30": { - "SceneName": "Fungus3_30", - "MapArea": "Fog Canyon", - "TitledArea": "Fog Canyon" - }, - "Fungus3_35": { - "SceneName": "Fungus3_35", - "MapArea": "Fog Canyon", - "TitledArea": "Fog Canyon" - }, - "Fungus3_44": { - "SceneName": "Fungus3_44", - "MapArea": "Fog Canyon", - "TitledArea": "Fog Canyon" - }, - "Fungus3_47": { - "SceneName": "Fungus3_47", - "MapArea": "Fog Canyon", - "TitledArea": "Fog Canyon" - }, - "Fungus3_archive": { - "SceneName": "Fungus3_archive", - "MapArea": "Fog Canyon", - "TitledArea": "Teacher's Archives" - }, - "Fungus3_archive_02": { - "SceneName": "Fungus3_archive_02", - "MapArea": "Fog Canyon", - "TitledArea": "Teacher's Archives" - }, - "Room_Fungus_Shaman": { - "SceneName": "Room_Fungus_Shaman", - "MapArea": "Fog Canyon", - "TitledArea": "Overgrown Mound" - }, - "Crossroads_01": { - "SceneName": "Crossroads_01", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_02": { - "SceneName": "Crossroads_02", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_03": { - "SceneName": "Crossroads_03", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_04": { - "SceneName": "Crossroads_04", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_05": { - "SceneName": "Crossroads_05", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_06": { - "SceneName": "Crossroads_06", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_07": { - "SceneName": "Crossroads_07", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_08": { - "SceneName": "Crossroads_08", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_09": { - "SceneName": "Crossroads_09", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_10": { - "SceneName": "Crossroads_10", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_11_alt": { - "SceneName": "Crossroads_11_alt", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_12": { - "SceneName": "Crossroads_12", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_13": { - "SceneName": "Crossroads_13", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_14": { - "SceneName": "Crossroads_14", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_15": { - "SceneName": "Crossroads_15", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_16": { - "SceneName": "Crossroads_16", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_18": { - "SceneName": "Crossroads_18", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_19": { - "SceneName": "Crossroads_19", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_21": { - "SceneName": "Crossroads_21", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_22": { - "SceneName": "Crossroads_22", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_25": { - "SceneName": "Crossroads_25", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_27": { - "SceneName": "Crossroads_27", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_30": { - "SceneName": "Crossroads_30", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_31": { - "SceneName": "Crossroads_31", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_33": { - "SceneName": "Crossroads_33", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_35": { - "SceneName": "Crossroads_35", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_36": { - "SceneName": "Crossroads_36", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_37": { - "SceneName": "Crossroads_37", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_38": { - "SceneName": "Crossroads_38", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_39": { - "SceneName": "Crossroads_39", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_40": { - "SceneName": "Crossroads_40", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_42": { - "SceneName": "Crossroads_42", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_43": { - "SceneName": "Crossroads_43", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_45": { - "SceneName": "Crossroads_45", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_46": { - "SceneName": "Crossroads_46", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_47": { - "SceneName": "Crossroads_47", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_48": { - "SceneName": "Crossroads_48", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_49": { - "SceneName": "Crossroads_49", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_52": { - "SceneName": "Crossroads_52", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Crossroads_ShamanTemple": { - "SceneName": "Crossroads_ShamanTemple", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Ancestral Mound" - }, - "Mines_33": { - "SceneName": "Mines_33", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Room_Charm_Shop": { - "SceneName": "Room_Charm_Shop", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Room_Mender_House": { - "SceneName": "Room_Mender_House", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Room_ruinhouse": { - "SceneName": "Room_ruinhouse", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Forgotten Crossroads" - }, - "Room_temple": { - "SceneName": "Room_temple", - "MapArea": "Forgotten Crossroads", - "TitledArea": "Black Egg Temple" - }, - "Deepnest_01": { - "SceneName": "Deepnest_01", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_01": { - "SceneName": "Fungus2_01", - "MapArea": "Fungal Wastes", - "TitledArea": "Queen's Station" - }, - "Fungus2_02": { - "SceneName": "Fungus2_02", - "MapArea": "Fungal Wastes", - "TitledArea": "Queen's Station" - }, - "Fungus2_03": { - "SceneName": "Fungus2_03", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_04": { - "SceneName": "Fungus2_04", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_05": { - "SceneName": "Fungus2_05", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_06": { - "SceneName": "Fungus2_06", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_07": { - "SceneName": "Fungus2_07", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_08": { - "SceneName": "Fungus2_08", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_09": { - "SceneName": "Fungus2_09", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_10": { - "SceneName": "Fungus2_10", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_11": { - "SceneName": "Fungus2_11", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_12": { - "SceneName": "Fungus2_12", - "MapArea": "Fungal Wastes", - "TitledArea": "Mantis Village" - }, - "Fungus2_13": { - "SceneName": "Fungus2_13", - "MapArea": "Fungal Wastes", - "TitledArea": "Mantis Village" - }, - "Fungus2_14": { - "SceneName": "Fungus2_14", - "MapArea": "Fungal Wastes", - "TitledArea": "Mantis Village" - }, - "Fungus2_15": { - "SceneName": "Fungus2_15", - "MapArea": "Fungal Wastes", - "TitledArea": "Mantis Village" - }, - "Fungus2_17": { - "SceneName": "Fungus2_17", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_18": { - "SceneName": "Fungus2_18", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_19": { - "SceneName": "Fungus2_19", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_20": { - "SceneName": "Fungus2_20", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_21": { - "SceneName": "Fungus2_21", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_23": { - "SceneName": "Fungus2_23", - "MapArea": "Fungal Wastes", - "TitledArea": "Mantis Village" - }, - "Fungus2_26": { - "SceneName": "Fungus2_26", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_28": { - "SceneName": "Fungus2_28", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_29": { - "SceneName": "Fungus2_29", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Core" - }, - "Fungus2_30": { - "SceneName": "Fungus2_30", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Core" - }, - "Fungus2_31": { - "SceneName": "Fungus2_31", - "MapArea": "Fungal Wastes", - "TitledArea": "Mantis Village" - }, - "Fungus2_32": { - "SceneName": "Fungus2_32", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_33": { - "SceneName": "Fungus2_33", - "MapArea": "Fungal Wastes", - "TitledArea": "Fungal Wastes" - }, - "Fungus2_34": { - "SceneName": "Fungus2_34", - "MapArea": "Fungal Wastes", - "TitledArea": "Queen's Station" - }, - "Fungus1_01": { - "SceneName": "Fungus1_01", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_01b": { - "SceneName": "Fungus1_01b", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_02": { - "SceneName": "Fungus1_02", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_03": { - "SceneName": "Fungus1_03", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_04": { - "SceneName": "Fungus1_04", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_05": { - "SceneName": "Fungus1_05", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_06": { - "SceneName": "Fungus1_06", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_07": { - "SceneName": "Fungus1_07", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_08": { - "SceneName": "Fungus1_08", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_09": { - "SceneName": "Fungus1_09", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_10": { - "SceneName": "Fungus1_10", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_11": { - "SceneName": "Fungus1_11", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_12": { - "SceneName": "Fungus1_12", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_13": { - "SceneName": "Fungus1_13", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_14": { - "SceneName": "Fungus1_14", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_15": { - "SceneName": "Fungus1_15", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_16_alt": { - "SceneName": "Fungus1_16_alt", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_17": { - "SceneName": "Fungus1_17", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_19": { - "SceneName": "Fungus1_19", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_20_v02": { - "SceneName": "Fungus1_20_v02", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_21": { - "SceneName": "Fungus1_21", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_22": { - "SceneName": "Fungus1_22", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_25": { - "SceneName": "Fungus1_25", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_26": { - "SceneName": "Fungus1_26", - "MapArea": "Greenpath", - "TitledArea": "Lake of Unn" - }, - "Fungus1_29": { - "SceneName": "Fungus1_29", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_30": { - "SceneName": "Fungus1_30", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_31": { - "SceneName": "Fungus1_31", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_32": { - "SceneName": "Fungus1_32", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_34": { - "SceneName": "Fungus1_34", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_35": { - "SceneName": "Fungus1_35", - "MapArea": "Greenpath", - "TitledArea": "Stone Sanctuary" - }, - "Fungus1_36": { - "SceneName": "Fungus1_36", - "MapArea": "Greenpath", - "TitledArea": "Stone Sanctuary" - }, - "Fungus1_37": { - "SceneName": "Fungus1_37", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Fungus1_Slug": { - "SceneName": "Fungus1_Slug", - "MapArea": "Greenpath", - "TitledArea": "Lake of Unn" - }, - "Room_nailmaster_02": { - "SceneName": "Room_nailmaster_02", - "MapArea": "Greenpath", - "TitledArea": "Greenpath" - }, - "Room_Slug_Shrine": { - "SceneName": "Room_Slug_Shrine", - "MapArea": "Greenpath", - "TitledArea": "Lake of Unn" - }, - "Cliffs_01": { - "SceneName": "Cliffs_01", - "MapArea": "Howling Cliffs", - "TitledArea": "Howling Cliffs" - }, - "Cliffs_02": { - "SceneName": "Cliffs_02", - "MapArea": "Howling Cliffs", - "TitledArea": "Howling Cliffs" - }, - "Cliffs_03": { - "SceneName": "Cliffs_03", - "MapArea": "Howling Cliffs", - "TitledArea": "Stag Nest" - }, - "Cliffs_04": { - "SceneName": "Cliffs_04", - "MapArea": "Howling Cliffs", - "TitledArea": "Howling Cliffs" - }, - "Cliffs_05": { - "SceneName": "Cliffs_05", - "MapArea": "Howling Cliffs", - "TitledArea": "Howling Cliffs" - }, - "Cliffs_06": { - "SceneName": "Cliffs_06", - "MapArea": "Howling Cliffs", - "TitledArea": "Howling Cliffs" - }, - "Fungus1_28": { - "SceneName": "Fungus1_28", - "MapArea": "Howling Cliffs", - "TitledArea": "Howling Cliffs" - }, - "Room_nailmaster": { - "SceneName": "Room_nailmaster", - "MapArea": "Howling Cliffs", - "TitledArea": "Howling Cliffs" - }, - "Abyss_03_c": { - "SceneName": "Abyss_03_c", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_01": { - "SceneName": "Deepnest_East_01", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_02": { - "SceneName": "Deepnest_East_02", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_03": { - "SceneName": "Deepnest_East_03", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_04": { - "SceneName": "Deepnest_East_04", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_06": { - "SceneName": "Deepnest_East_06", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_07": { - "SceneName": "Deepnest_East_07", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_08": { - "SceneName": "Deepnest_East_08", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_09": { - "SceneName": "Deepnest_East_09", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_10": { - "SceneName": "Deepnest_East_10", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_11": { - "SceneName": "Deepnest_East_11", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_12": { - "SceneName": "Deepnest_East_12", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_13": { - "SceneName": "Deepnest_East_13", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_14": { - "SceneName": "Deepnest_East_14", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_14b": { - "SceneName": "Deepnest_East_14b", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_15": { - "SceneName": "Deepnest_East_15", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_16": { - "SceneName": "Deepnest_East_16", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_17": { - "SceneName": "Deepnest_East_17", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_18": { - "SceneName": "Deepnest_East_18", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Deepnest_East_Hornet": { - "SceneName": "Deepnest_East_Hornet", - "MapArea": "Kingdom's Edge", - "TitledArea": "Cast Off Shell" - }, - "GG_Lurker": { - "SceneName": "GG_Lurker", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Hive_01": { - "SceneName": "Hive_01", - "MapArea": "Kingdom's Edge", - "TitledArea": "Hive" - }, - "Hive_02": { - "SceneName": "Hive_02", - "MapArea": "Kingdom's Edge", - "TitledArea": "Hive" - }, - "Hive_03": { - "SceneName": "Hive_03", - "MapArea": "Kingdom's Edge", - "TitledArea": "Hive" - }, - "Hive_03_c": { - "SceneName": "Hive_03_c", - "MapArea": "Kingdom's Edge", - "TitledArea": "Hive" - }, - "Hive_04": { - "SceneName": "Hive_04", - "MapArea": "Kingdom's Edge", - "TitledArea": "Hive" - }, - "Hive_05": { - "SceneName": "Hive_05", - "MapArea": "Kingdom's Edge", - "TitledArea": "Hive" - }, - "Room_Colosseum_01": { - "SceneName": "Room_Colosseum_01", - "MapArea": "Kingdom's Edge", - "TitledArea": "Colosseum" - }, - "Room_Colosseum_02": { - "SceneName": "Room_Colosseum_02", - "MapArea": "Kingdom's Edge", - "TitledArea": "Colosseum" - }, - "Room_Colosseum_Spectate": { - "SceneName": "Room_Colosseum_Spectate", - "MapArea": "Kingdom's Edge", - "TitledArea": "Colosseum" - }, - "Room_nailmaster_03": { - "SceneName": "Room_nailmaster_03", - "MapArea": "Kingdom's Edge", - "TitledArea": "Kingdom's Edge" - }, - "Room_Wyrm": { - "SceneName": "Room_Wyrm", - "MapArea": "Kingdom's Edge", - "TitledArea": "Cast Off Shell" - }, - "Deepnest_43": { - "SceneName": "Deepnest_43", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Fungus1_23": { - "SceneName": "Fungus1_23", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Fungus1_24": { - "SceneName": "Fungus1_24", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Fungus3_04": { - "SceneName": "Fungus3_04", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Fungus3_05": { - "SceneName": "Fungus3_05", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Fungus3_08": { - "SceneName": "Fungus3_08", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Fungus3_10": { - "SceneName": "Fungus3_10", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Fungus3_11": { - "SceneName": "Fungus3_11", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Fungus3_13": { - "SceneName": "Fungus3_13", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Fungus3_21": { - "SceneName": "Fungus3_21", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Fungus3_22": { - "SceneName": "Fungus3_22", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Fungus3_23": { - "SceneName": "Fungus3_23", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Fungus3_34": { - "SceneName": "Fungus3_34", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Fungus3_39": { - "SceneName": "Fungus3_39", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Fungus3_40": { - "SceneName": "Fungus3_40", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Fungus3_48": { - "SceneName": "Fungus3_48", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Fungus3_49": { - "SceneName": "Fungus3_49", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Fungus3_50": { - "SceneName": "Fungus3_50", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Room_Queen": { - "SceneName": "Room_Queen", - "MapArea": "Queen's Gardens", - "TitledArea": "Queen's Gardens" - }, - "Crossroads_46b": { - "SceneName": "Crossroads_46b", - "MapArea": "Resting Grounds", - "TitledArea": "Resting Grounds" - }, - "Crossroads_50": { - "SceneName": "Crossroads_50", - "MapArea": "Resting Grounds", - "TitledArea": "Blue Lake" - }, - "RestingGrounds_02": { - "SceneName": "RestingGrounds_02", - "MapArea": "Resting Grounds", - "TitledArea": "Resting Grounds" - }, - "RestingGrounds_04": { - "SceneName": "RestingGrounds_04", - "MapArea": "Resting Grounds", - "TitledArea": "Resting Grounds" - }, - "RestingGrounds_05": { - "SceneName": "RestingGrounds_05", - "MapArea": "Resting Grounds", - "TitledArea": "Resting Grounds" - }, - "RestingGrounds_06": { - "SceneName": "RestingGrounds_06", - "MapArea": "Resting Grounds", - "TitledArea": "Resting Grounds" - }, - "RestingGrounds_07": { - "SceneName": "RestingGrounds_07", - "MapArea": "Resting Grounds", - "TitledArea": "Resting Grounds" - }, - "RestingGrounds_08": { - "SceneName": "RestingGrounds_08", - "MapArea": "Resting Grounds", - "TitledArea": "Spirits' Glade" - }, - "RestingGrounds_09": { - "SceneName": "RestingGrounds_09", - "MapArea": "Resting Grounds", - "TitledArea": "Resting Grounds" - }, - "RestingGrounds_10": { - "SceneName": "RestingGrounds_10", - "MapArea": "Resting Grounds", - "TitledArea": "Resting Grounds" - }, - "RestingGrounds_12": { - "SceneName": "RestingGrounds_12", - "MapArea": "Resting Grounds", - "TitledArea": "Resting Grounds" - }, - "RestingGrounds_17": { - "SceneName": "RestingGrounds_17", - "MapArea": "Resting Grounds", - "TitledArea": "Resting Grounds" - }, - "Room_Mansion": { - "SceneName": "Room_Mansion", - "MapArea": "Resting Grounds", - "TitledArea": "Resting Grounds" - }, - "Ruins2_10": { - "SceneName": "Ruins2_10", - "MapArea": "Resting Grounds", - "TitledArea": "Resting Grounds" - }, - "Abyss_01": { - "SceneName": "Abyss_01", - "MapArea": "Royal Waterways", - "TitledArea": "Royal Waterways" - }, - "Abyss_02": { - "SceneName": "Abyss_02", - "MapArea": "Royal Waterways", - "TitledArea": "Royal Waterways" - }, - "GG_Pipeway": { - "SceneName": "GG_Pipeway", - "MapArea": "Royal Waterways", - "TitledArea": "Royal Waterways" - }, - "GG_Waterways": { - "SceneName": "GG_Waterways", - "MapArea": "Royal Waterways", - "TitledArea": "Junk Pit" - }, - "Room_GG_Shortcut": { - "SceneName": "Room_GG_Shortcut", - "MapArea": "Royal Waterways", - "TitledArea": "Junk Pit" - }, - "Waterways_01": { - "SceneName": "Waterways_01", - "MapArea": "Royal Waterways", - "TitledArea": "Royal Waterways" - }, - "Waterways_02": { - "SceneName": "Waterways_02", - "MapArea": "Royal Waterways", - "TitledArea": "Royal Waterways" - }, - "Waterways_03": { - "SceneName": "Waterways_03", - "MapArea": "Royal Waterways", - "TitledArea": "Royal Waterways" - }, - "Waterways_04": { - "SceneName": "Waterways_04", - "MapArea": "Royal Waterways", - "TitledArea": "Royal Waterways" - }, - "Waterways_04b": { - "SceneName": "Waterways_04b", - "MapArea": "Royal Waterways", - "TitledArea": "Royal Waterways" - }, - "Waterways_05": { - "SceneName": "Waterways_05", - "MapArea": "Royal Waterways", - "TitledArea": "Royal Waterways" - }, - "Waterways_06": { - "SceneName": "Waterways_06", - "MapArea": "Royal Waterways", - "TitledArea": "Royal Waterways" - }, - "Waterways_07": { - "SceneName": "Waterways_07", - "MapArea": "Royal Waterways", - "TitledArea": "Royal Waterways" - }, - "Waterways_08": { - "SceneName": "Waterways_08", - "MapArea": "Royal Waterways", - "TitledArea": "Royal Waterways" - }, - "Waterways_09": { - "SceneName": "Waterways_09", - "MapArea": "Royal Waterways", - "TitledArea": "Royal Waterways" - }, - "Waterways_12": { - "SceneName": "Waterways_12", - "MapArea": "Royal Waterways", - "TitledArea": "Royal Waterways" - }, - "Waterways_13": { - "SceneName": "Waterways_13", - "MapArea": "Royal Waterways", - "TitledArea": "Isma's Grove" - }, - "Waterways_14": { - "SceneName": "Waterways_14", - "MapArea": "Royal Waterways", - "TitledArea": "Royal Waterways" - }, - "Waterways_15": { - "SceneName": "Waterways_15", - "MapArea": "Royal Waterways", - "TitledArea": "Royal Waterways" - }, - "White_Palace_01": { - "SceneName": "White_Palace_01", - "MapArea": "White Palace", - "TitledArea": "White Palace" - }, - "White_Palace_02": { - "SceneName": "White_Palace_02", - "MapArea": "White Palace", - "TitledArea": "White Palace" - }, - "White_Palace_03_hub": { - "SceneName": "White_Palace_03_hub", - "MapArea": "White Palace", - "TitledArea": "White Palace" - }, - "White_Palace_04": { - "SceneName": "White_Palace_04", - "MapArea": "White Palace", - "TitledArea": "White Palace" - }, - "White_Palace_05": { - "SceneName": "White_Palace_05", - "MapArea": "White Palace", - "TitledArea": "White Palace" - }, - "White_Palace_06": { - "SceneName": "White_Palace_06", - "MapArea": "White Palace", - "TitledArea": "White Palace" - }, - "White_Palace_07": { - "SceneName": "White_Palace_07", - "MapArea": "White Palace", - "TitledArea": "White Palace" - }, - "White_Palace_08": { - "SceneName": "White_Palace_08", - "MapArea": "White Palace", - "TitledArea": "White Palace" - }, - "White_Palace_09": { - "SceneName": "White_Palace_09", - "MapArea": "White Palace", - "TitledArea": "White Palace" - }, - "White_Palace_11": { - "SceneName": "White_Palace_11", - "MapArea": "White Palace", - "TitledArea": "White Palace" - }, - "White_Palace_12": { - "SceneName": "White_Palace_12", - "MapArea": "White Palace", - "TitledArea": "White Palace" - }, - "White_Palace_13": { - "SceneName": "White_Palace_13", - "MapArea": "White Palace", - "TitledArea": "White Palace" - }, - "White_Palace_14": { - "SceneName": "White_Palace_14", - "MapArea": "White Palace", - "TitledArea": "White Palace" - }, - "White_Palace_15": { - "SceneName": "White_Palace_15", - "MapArea": "White Palace", - "TitledArea": "White Palace" - }, - "White_Palace_16": { - "SceneName": "White_Palace_16", - "MapArea": "White Palace", - "TitledArea": "White Palace" - }, - "White_Palace_17": { - "SceneName": "White_Palace_17", - "MapArea": "White Palace", - "TitledArea": "Path of Pain" - }, - "White_Palace_18": { - "SceneName": "White_Palace_18", - "MapArea": "White Palace", - "TitledArea": "Path of Pain" - }, - "White_Palace_19": { - "SceneName": "White_Palace_19", - "MapArea": "White Palace", - "TitledArea": "Path of Pain" - }, - "White_Palace_20": { - "SceneName": "White_Palace_20", - "MapArea": "White Palace", - "TitledArea": "Path of Pain" - } -} \ No newline at end of file diff --git a/RandomizerMod/Resources/Data/starts.json b/RandomizerMod/Resources/Data/starts.json deleted file mode 100644 index 25408cf..0000000 --- a/RandomizerMod/Resources/Data/starts.json +++ /dev/null @@ -1,267 +0,0 @@ -{ - "King's Pass": { - "name": "King's Pass", - "sceneName": "Tutorial_01", - "x": 35.5, - "y": 11.4, - "zone": "KINGS_PASS", - "transition": "Tutorial_01[right1]", - "logic": "ANY" - }, - "Stag Nest": { - "name": "Stag Nest", - "sceneName": "Cliffs_03", - "x": 85.8, - "y": 46.4, - "zone": "CLIFFS", - "transition": "Cliffs_03[right1]", - "logic": "ANY" - }, - "West Crossroads": { - "name": "West Crossroads", - "sceneName": "Crossroads_36", - "x": 40.2, - "y": 22.0, - "zone": "CROSSROADS", - "transition": "Crossroads_36[right1]", - "logic": "ANY" - }, - "East Crossroads": { - "name": "East Crossroads", - "sceneName": "Crossroads_03", - "x": 14.0, - "y": 68.0, - "zone": "CROSSROADS", - "transition": "Crossroads_03[top1]", - "logic": "ANY" - }, - "Ancestral Mound": { - "name": "Ancestral Mound", - "sceneName": "Crossroads_ShamanTemple", - "x": 37.7, - "y": 46.5, - "zone": "SHAMAN_TEMPLE", - "transition": "Crossroads_ShamanTemple[left1]", - "logic": "ANY" - }, - "West Fog Canyon": { - "name": "West Fog Canyon", - "sceneName": "Fungus3_30", - "x": 35.1, - "y": 16.4, - "zone": "FOG_CANYON", - "transition": "Fungus3_30[bot1]", - "logic": "ANY" - }, - "East Fog Canyon": { - "name": "East Fog Canyon", - "sceneName": "Fungus3_25", - "x": 77.5, - "y": 23.7, - "zone": "FOG_CANYON", - "transition": "Fungus3_25[right1]", - "logic": "ANY" - }, - "Queen's Station": { - "name": "Queen's Station", - "sceneName": "Fungus2_01", - "x": 24.0, - "y": 37.4, - "zone": "QUEENS_STATION", - "transition": "Fungus2_01[left1]", - "logic": "ANY" - }, - "Fungal Wastes": { - "name": "Fungal Wastes", - "sceneName": "Fungus2_28", - "x": 59.6, - "y": 3.4, - "zone": "WASTES", - "transition": "Fungus2_28[left1]", - "logic": "ANY" - }, - "Greenpath": { - "name": "Greenpath", - "sceneName": "Fungus1_32", - "x": 3.8, - "y": 27.4, - "zone": "GREEN_PATH", - "transition": "Fungus1_32[left1]", - "logic": "ANY" - }, - "Lower Greenpath": { - "name": "Lower Greenpath", - "sceneName": "Fungus1_13", - "x": 126.2, - "y": 37.4, - "zone": "GREEN_PATH", - "transition": "Fungus1_13[right1]", - "logic": "ANY" - }, - "West Blue Lake": { - "name": "West Blue Lake", - "sceneName": "Crossroads_50", - "x": 21.2, - "y": 44.4, - "zone": "CROSSROADS", - "transition": "Crossroads_50[left1]", - "logic": "ANY" - }, - "East Blue Lake": { - "name": "East Blue Lake", - "sceneName": "Crossroads_50", - "x": 225.2, - "y": 25.4, - "zone": "CROSSROADS", - "transition": "Crossroads_50[right1]", - "logic": "(ITEMRANDO | MAPAREARANDO) + (ENEMYPOGOS | ELEVATOR) | FULLAREARANDO | ROOMRANDO" - // first branch: ensure upper Resting Grounds or King's Station is accessible - }, - "City Storerooms": { - "name": "City Storerooms", - "sceneName": "Ruins1_17", - "x": 61.6, - "y": 3.4, - "zone": "CITY", - "transition": "Ruins1_17[right1]", - "logic": "ANY" - }, - "King's Station": { - "name": "King's Station", - "sceneName": "Ruins2_10b", - "x": 20.9, - "y": 136.3, - "zone": "CITY", - "transition": "Ruins2_10b[right1]", - "logic": "ANY" - }, - "Outside Colosseum": { - "name": "Outside Colosseum", - "sceneName": "Deepnest_East_09", - "x": 159.9, - "y": 12.4, - "zone": "COLOSSEUM", - "transition": "Deepnest_East_09[right1]", - "logic": "ANY" - }, - "Crystallized Mound": { - "name": "Crystallized Mound", - "sceneName": "Mines_35", - "x": 3.2, - "y": 48.4, - "zone": "MINES", - "transition": "Mines_35[left1]", - "logic": "ANY" - }, - "Mantis Village": { - "name": "Mantis Village", - "sceneName": "Fungus2_14", - "x": 117.8, - "y": 15.4, - "zone": "WASTES", - "transition": "Fungus2_14[right1]", - "logic": "(ITEMRANDO | MAPAREARANDO | FULLAREARANDO) + ENEMYPOGOS | ROOMRANDO | VERTICAL" - // first branch: ensure Queen's Station (or on full area, Fungus2_12[left1]) is reachable - }, - "Kingdom's Edge": { - "name": "Kingdom's Edge", - "sceneName": "Deepnest_East_15", - "x": 26.5, - "y": 4.4, - "zone": "OUTSKIRTS", - "transition": "Deepnest_East_15[left1]", - "logic": "(ITEMRANDO + ENEMYPOGOS + SWIM) | MAPAREARANDO | FULLAREARANDO | ROOMRANDO" - // first branch: ensure King's Station Stag is reachable - }, - "Hallownest's Crown": { - "name": "Hallownest's Crown", - "sceneName": "Mines_34", - "x": 128.3, - "y": 46.4, - "zone": "MINES", - "transition": "Mines_34[bot1]", - "logic": "(ITEMRANDO | MAPAREARANDO) + DARKROOMS | FULLAREARANDO | ROOMRANDO" - }, - "West Waterways": { - "name": "West Waterways", - "sceneName": "Waterways_09", - "x": 34.7, - "y": 30.4, - "zone": "WATERWAYS", - "transition": "Waterways_09[left1]", - "logic": "(ITEMRANDO + ENEMYPOGOS + SHADESKIPS + PRECISEMOVEMENT + 2MASKS) | MAPAREARANDO | FULLAREARANDO | ROOMRANDO" - }, - "Queen's Gardens": { - "name": "Queen's Gardens", - "sceneName": "Fungus3_13", - "x": 25.3, - "y": 63.4, - "zone": "ROYAL_GARDENS", - "transition": "Fungus3_13[left1]", - "logic": "(ITEMRANDO | MAPAREARANDO | FULLAREARANDO) + ENEMYPOGOS + DANGEROUSSKIPS | ROOMRANDO" - // skip logic is minimum to ensure Hallownest_Seal-Queen's_Gardens is reachable - }, - "Distant Village": { - "name": "Distant Village", - "sceneName": "Room_spider_small", - "x": 23.1, - "y": 13.4, - "zone": "DEEPNEST", - "transition": "Room_spider_small[left1]", - "logic": "FULLAREARANDO | ROOMRANDO" - }, - "Far Greenpath": { - "name": "Far Greenpath", - "sceneName": "Fungus1_13", - "x": 34.9, - "y": 23.4, - "zone": "GREEN_PATH", - "transition": "Fungus1_13[left1]", - "logic": "MAPAREARANDO | FULLAREARANDO | ROOMRANDO" - }, - "Hive": { - "name": "Hive", - "sceneName": "Hive_03", - "x": 47.2, - "y": 142.7, - "zone": "HIVE", - "transition": "Hive_03[right1]", - "logic": "ROOMRANDO" - }, - "Royal Waterways": { - "name": "Royal Waterways", - "sceneName": "Waterways_03", - "x": 93.6, - "y": 4.4, - "zone": "WATERWAYS", - "transition": "Waterways_03[left1]", - "logic": "ROOMRANDO" - }, - "City of Tears": { - "name": "City of Tears", - "sceneName": "Ruins1_27", - "x": 29.6, - "y": 6.4, - "zone": "CITY", - "transition": "Ruins1_27[left1]", - "logic": "ROOMRANDO" - }, - "Abyss": { - "name": "Abyss", - "sceneName": "Abyss_06_Core", - "x": 42.0, - "y": 5.4, - "zone": "ABYSS", - "transition": "Abyss_06_Core[right2]", - "logic": "ROOMRANDO" - }, - "Fungal Core": { - "name": "Fungal Core", - "sceneName": "Fungus2_30", - "x": 64.8, - "y": 21.4, - "zone": "WASTES", - "transition": "Fungus2_30[top1]", - "logic": "ROOMRANDO" - } -} \ No newline at end of file diff --git a/RandomizerMod/Resources/Data/transitions.json b/RandomizerMod/Resources/Data/transitions.json deleted file mode 100644 index e9ea0ad..0000000 --- a/RandomizerMod/Resources/Data/transitions.json +++ /dev/null @@ -1,8030 +0,0 @@ -{ - "Room_temple[left1]": { - "SceneName": "Room_temple", - "DoorName": "left1", - "VanillaTarget": "Crossroads_02[door1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Tutorial_01[right1]": { - "SceneName": "Tutorial_01", - "DoorName": "right1", - "VanillaTarget": "Town[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Tutorial_01[top1]": { - "SceneName": "Tutorial_01", - "DoorName": "top1", - "VanillaTarget": null, - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "OneWayOut" - }, - "Tutorial_01[top2]": { - "SceneName": "Tutorial_01", - "DoorName": "top2", - "VanillaTarget": "Cliffs_02[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Town[left1]": { - "SceneName": "Town", - "DoorName": "left1", - "VanillaTarget": "Tutorial_01[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Town[bot1]": { - "SceneName": "Town", - "DoorName": "bot1", - "VanillaTarget": "Crossroads_01[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Town[right1]": { - "SceneName": "Town", - "DoorName": "right1", - "VanillaTarget": "Mines_10[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Town[top1]": { - "SceneName": "Town", - "DoorName": "top1", - "VanillaTarget": null, - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "OneWayOut" - }, - "Town[door_station]": { - "SceneName": "Town", - "DoorName": "door_station", - "VanillaTarget": "Room_Town_Stag_Station[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Town[door_sly]": { - "SceneName": "Town", - "DoorName": "door_sly", - "VanillaTarget": "Room_shop[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Town[door_mapper]": { - "SceneName": "Town", - "DoorName": "door_mapper", - "VanillaTarget": "Room_mapper[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Town[door_jiji]": { - "SceneName": "Town", - "DoorName": "door_jiji", - "VanillaTarget": "Room_Ouiji[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Town[door_bretta]": { - "SceneName": "Town", - "DoorName": "door_bretta", - "VanillaTarget": "Room_Bretta[right1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Town[room_divine]": { - "SceneName": "Town", - "DoorName": "room_divine", - "VanillaTarget": "Grimm_Divine[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Town[room_grimm]": { - "SceneName": "Town", - "DoorName": "room_grimm", - "VanillaTarget": "Grimm_Main_Tent[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_shop[left1]": { - "SceneName": "Room_shop", - "DoorName": "left1", - "VanillaTarget": "Town[door_sly]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_Town_Stag_Station[left1]": { - "SceneName": "Room_Town_Stag_Station", - "DoorName": "left1", - "VanillaTarget": "Town[door_station]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_mapper[left1]": { - "SceneName": "Room_mapper", - "DoorName": "left1", - "VanillaTarget": "Town[door_mapper]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_Bretta[right1]": { - "SceneName": "Room_Bretta", - "DoorName": "right1", - "VanillaTarget": "Town[door_bretta]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_Ouiji[left1]": { - "SceneName": "Room_Ouiji", - "DoorName": "left1", - "VanillaTarget": "Town[door_jiji]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Grimm_Divine[left1]": { - "SceneName": "Grimm_Divine", - "DoorName": "left1", - "VanillaTarget": "Town[room_divine]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Grimm_Main_Tent[left1]": { - "SceneName": "Grimm_Main_Tent", - "DoorName": "left1", - "VanillaTarget": "Town[room_grimm]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_01[top1]": { - "SceneName": "Crossroads_01", - "DoorName": "top1", - "VanillaTarget": "Town[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Crossroads_01[left1]": { - "SceneName": "Crossroads_01", - "DoorName": "left1", - "VanillaTarget": "Crossroads_07[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_01[right1]": { - "SceneName": "Crossroads_01", - "DoorName": "right1", - "VanillaTarget": "Crossroads_02[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_02[left1]": { - "SceneName": "Crossroads_02", - "DoorName": "left1", - "VanillaTarget": "Crossroads_01[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_02[door1]": { - "SceneName": "Crossroads_02", - "DoorName": "door1", - "VanillaTarget": "Room_temple[left1]", - "Direction": "Door", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_02[right1]": { - "SceneName": "Crossroads_02", - "DoorName": "right1", - "VanillaTarget": "Crossroads_39[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_03[right1]": { - "SceneName": "Crossroads_03", - "DoorName": "right1", - "VanillaTarget": "Crossroads_15[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_03[right2]": { - "SceneName": "Crossroads_03", - "DoorName": "right2", - "VanillaTarget": "Mines_33[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_03[left1]": { - "SceneName": "Crossroads_03", - "DoorName": "left1", - "VanillaTarget": "Crossroads_21[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_03[left2]": { - "SceneName": "Crossroads_03", - "DoorName": "left2", - "VanillaTarget": "Crossroads_47[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_03[bot1]": { - "SceneName": "Crossroads_03", - "DoorName": "bot1", - "VanillaTarget": "Crossroads_19[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_03[top1]": { - "SceneName": "Crossroads_03", - "DoorName": "top1", - "VanillaTarget": "Crossroads_16[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_04[left1]": { - "SceneName": "Crossroads_04", - "DoorName": "left1", - "VanillaTarget": "Crossroads_19[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_04[top1]": { - "SceneName": "Crossroads_04", - "DoorName": "top1", - "VanillaTarget": "Crossroads_27[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_04[door_Mender_House]": { - "SceneName": "Crossroads_04", - "DoorName": "door_Mender_House", - "VanillaTarget": "Room_Mender_House[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_04[door1]": { - "SceneName": "Crossroads_04", - "DoorName": "door1", - "VanillaTarget": "Room_ruinhouse[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_04[door_charmshop]": { - "SceneName": "Crossroads_04", - "DoorName": "door_charmshop", - "VanillaTarget": "Room_Charm_Shop[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_04[right1]": { - "SceneName": "Crossroads_04", - "DoorName": "right1", - "VanillaTarget": "Crossroads_50[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Crossroads_05[left1]": { - "SceneName": "Crossroads_05", - "DoorName": "left1", - "VanillaTarget": "Crossroads_07[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_05[right1]": { - "SceneName": "Crossroads_05", - "DoorName": "right1", - "VanillaTarget": "Crossroads_40[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_06[left1]": { - "SceneName": "Crossroads_06", - "DoorName": "left1", - "VanillaTarget": "Crossroads_33[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_06[door1]": { - "SceneName": "Crossroads_06", - "DoorName": "door1", - "VanillaTarget": "Crossroads_ShamanTemple[left1]", - "Direction": "Door", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_06[right1]": { - "SceneName": "Crossroads_06", - "DoorName": "right1", - "VanillaTarget": "Crossroads_10[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_07[left1]": { - "SceneName": "Crossroads_07", - "DoorName": "left1", - "VanillaTarget": "Crossroads_38[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_07[left2]": { - "SceneName": "Crossroads_07", - "DoorName": "left2", - "VanillaTarget": "Crossroads_11_alt[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_07[left3]": { - "SceneName": "Crossroads_07", - "DoorName": "left3", - "VanillaTarget": "Crossroads_25[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_07[right1]": { - "SceneName": "Crossroads_07", - "DoorName": "right1", - "VanillaTarget": "Crossroads_01[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_07[right2]": { - "SceneName": "Crossroads_07", - "DoorName": "right2", - "VanillaTarget": "Crossroads_05[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_07[bot1]": { - "SceneName": "Crossroads_07", - "DoorName": "bot1", - "VanillaTarget": "Crossroads_33[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_08[left1]": { - "SceneName": "Crossroads_08", - "DoorName": "left1", - "VanillaTarget": "Crossroads_33[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_08[left2]": { - "SceneName": "Crossroads_08", - "DoorName": "left2", - "VanillaTarget": "Crossroads_18[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_08[right1]": { - "SceneName": "Crossroads_08", - "DoorName": "right1", - "VanillaTarget": "Crossroads_30[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_08[right2]": { - "SceneName": "Crossroads_08", - "DoorName": "right2", - "VanillaTarget": "Crossroads_13[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_09[left1]": { - "SceneName": "Crossroads_09", - "DoorName": "left1", - "VanillaTarget": "Crossroads_36[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_09[right1]": { - "SceneName": "Crossroads_09", - "DoorName": "right1", - "VanillaTarget": "Crossroads_33[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_10[left1]": { - "SceneName": "Crossroads_10", - "DoorName": "left1", - "VanillaTarget": "Crossroads_06[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_10[right1]": { - "SceneName": "Crossroads_10", - "DoorName": "right1", - "VanillaTarget": "Crossroads_21[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_11_alt[left1]": { - "SceneName": "Crossroads_11_alt", - "DoorName": "left1", - "VanillaTarget": "Fungus1_01[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Crossroads_11_alt[right1]": { - "SceneName": "Crossroads_11_alt", - "DoorName": "right1", - "VanillaTarget": "Crossroads_07[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_12[left1]": { - "SceneName": "Crossroads_12", - "DoorName": "left1", - "VanillaTarget": "Crossroads_35[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_12[right1]": { - "SceneName": "Crossroads_12", - "DoorName": "right1", - "VanillaTarget": "Crossroads_33[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_13[left1]": { - "SceneName": "Crossroads_13", - "DoorName": "left1", - "VanillaTarget": "Crossroads_08[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_13[right1]": { - "SceneName": "Crossroads_13", - "DoorName": "right1", - "VanillaTarget": "Crossroads_42[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_14[left1]": { - "SceneName": "Crossroads_14", - "DoorName": "left1", - "VanillaTarget": "Crossroads_39[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_14[left2]": { - "SceneName": "Crossroads_14", - "DoorName": "left2", - "VanillaTarget": "Crossroads_16[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_14[right1]": { - "SceneName": "Crossroads_14", - "DoorName": "right1", - "VanillaTarget": "Crossroads_48[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_14[right2]": { - "SceneName": "Crossroads_14", - "DoorName": "right2", - "VanillaTarget": "Crossroads_45[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_15[left1]": { - "SceneName": "Crossroads_15", - "DoorName": "left1", - "VanillaTarget": "Crossroads_03[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_15[right1]": { - "SceneName": "Crossroads_15", - "DoorName": "right1", - "VanillaTarget": "Crossroads_27[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_16[left1]": { - "SceneName": "Crossroads_16", - "DoorName": "left1", - "VanillaTarget": "Crossroads_40[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_16[right1]": { - "SceneName": "Crossroads_16", - "DoorName": "right1", - "VanillaTarget": "Crossroads_14[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_16[bot1]": { - "SceneName": "Crossroads_16", - "DoorName": "bot1", - "VanillaTarget": "Crossroads_03[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_18[right1]": { - "SceneName": "Crossroads_18", - "DoorName": "right1", - "VanillaTarget": "Crossroads_08[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_18[right2]": { - "SceneName": "Crossroads_18", - "DoorName": "right2", - "VanillaTarget": "Crossroads_52[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_18[bot1]": { - "SceneName": "Crossroads_18", - "DoorName": "bot1", - "VanillaTarget": "Fungus2_06[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Crossroads_19[right1]": { - "SceneName": "Crossroads_19", - "DoorName": "right1", - "VanillaTarget": "Crossroads_04[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_19[top1]": { - "SceneName": "Crossroads_19", - "DoorName": "top1", - "VanillaTarget": "Crossroads_03[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_19[left1]": { - "SceneName": "Crossroads_19", - "DoorName": "left1", - "VanillaTarget": "Crossroads_42[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_19[left2]": { - "SceneName": "Crossroads_19", - "DoorName": "left2", - "VanillaTarget": "Crossroads_43[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_21[left1]": { - "SceneName": "Crossroads_21", - "DoorName": "left1", - "VanillaTarget": "Crossroads_10[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_21[right1]": { - "SceneName": "Crossroads_21", - "DoorName": "right1", - "VanillaTarget": "Crossroads_03[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_21[top1]": { - "SceneName": "Crossroads_21", - "DoorName": "top1", - "VanillaTarget": "Crossroads_22[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_22[bot1]": { - "SceneName": "Crossroads_22", - "DoorName": "bot1", - "VanillaTarget": "Crossroads_21[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_25[right1]": { - "SceneName": "Crossroads_25", - "DoorName": "right1", - "VanillaTarget": "Crossroads_07[left3]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_25[left1]": { - "SceneName": "Crossroads_25", - "DoorName": "left1", - "VanillaTarget": "Crossroads_36[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_27[right1]": { - "SceneName": "Crossroads_27", - "DoorName": "right1", - "VanillaTarget": "Crossroads_46[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_27[bot1]": { - "SceneName": "Crossroads_27", - "DoorName": "bot1", - "VanillaTarget": "Crossroads_04[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_27[left1]": { - "SceneName": "Crossroads_27", - "DoorName": "left1", - "VanillaTarget": "Crossroads_15[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_27[left2]": { - "SceneName": "Crossroads_27", - "DoorName": "left2", - "VanillaTarget": "Crossroads_31[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_30[left1]": { - "SceneName": "Crossroads_30", - "DoorName": "left1", - "VanillaTarget": "Crossroads_08[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_31[right1]": { - "SceneName": "Crossroads_31", - "DoorName": "right1", - "VanillaTarget": "Crossroads_27[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_33[top1]": { - "SceneName": "Crossroads_33", - "DoorName": "top1", - "VanillaTarget": "Crossroads_07[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_33[left1]": { - "SceneName": "Crossroads_33", - "DoorName": "left1", - "VanillaTarget": "Crossroads_09[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_33[left2]": { - "SceneName": "Crossroads_33", - "DoorName": "left2", - "VanillaTarget": "Crossroads_12[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_33[right1]": { - "SceneName": "Crossroads_33", - "DoorName": "right1", - "VanillaTarget": "Crossroads_06[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_33[right2]": { - "SceneName": "Crossroads_33", - "DoorName": "right2", - "VanillaTarget": "Crossroads_08[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_35[bot1]": { - "SceneName": "Crossroads_35", - "DoorName": "bot1", - "VanillaTarget": "Fungus3_26[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Crossroads_35[right1]": { - "SceneName": "Crossroads_35", - "DoorName": "right1", - "VanillaTarget": "Crossroads_12[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_36[right1]": { - "SceneName": "Crossroads_36", - "DoorName": "right1", - "VanillaTarget": "Crossroads_25[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_36[right2]": { - "SceneName": "Crossroads_36", - "DoorName": "right2", - "VanillaTarget": "Crossroads_09[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_37[right1]": { - "SceneName": "Crossroads_37", - "DoorName": "right1", - "VanillaTarget": "Crossroads_49[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_38[right1]": { - "SceneName": "Crossroads_38", - "DoorName": "right1", - "VanillaTarget": "Crossroads_07[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_39[right1]": { - "SceneName": "Crossroads_39", - "DoorName": "right1", - "VanillaTarget": "Crossroads_14[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_39[left1]": { - "SceneName": "Crossroads_39", - "DoorName": "left1", - "VanillaTarget": "Crossroads_02[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_40[right1]": { - "SceneName": "Crossroads_40", - "DoorName": "right1", - "VanillaTarget": "Crossroads_16[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_40[left1]": { - "SceneName": "Crossroads_40", - "DoorName": "left1", - "VanillaTarget": "Crossroads_05[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_42[left1]": { - "SceneName": "Crossroads_42", - "DoorName": "left1", - "VanillaTarget": "Crossroads_13[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_42[right1]": { - "SceneName": "Crossroads_42", - "DoorName": "right1", - "VanillaTarget": "Crossroads_19[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_43[left1]": { - "SceneName": "Crossroads_43", - "DoorName": "left1", - "VanillaTarget": "Crossroads_49[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_43[right1]": { - "SceneName": "Crossroads_43", - "DoorName": "right1", - "VanillaTarget": "Crossroads_19[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_45[right1]": { - "SceneName": "Crossroads_45", - "DoorName": "right1", - "VanillaTarget": "Mines_01[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Crossroads_45[left1]": { - "SceneName": "Crossroads_45", - "DoorName": "left1", - "VanillaTarget": "Crossroads_14[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_46[left1]": { - "SceneName": "Crossroads_46", - "DoorName": "left1", - "VanillaTarget": "Crossroads_27[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_46b[right1]": { - "SceneName": "Crossroads_46b", - "DoorName": "right1", - "VanillaTarget": "RestingGrounds_02[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_ShamanTemple[left1]": { - "SceneName": "Crossroads_ShamanTemple", - "DoorName": "left1", - "VanillaTarget": "Crossroads_06[door1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_47[right1]": { - "SceneName": "Crossroads_47", - "DoorName": "right1", - "VanillaTarget": "Crossroads_03[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_48[left1]": { - "SceneName": "Crossroads_48", - "DoorName": "left1", - "VanillaTarget": "Crossroads_14[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_49[right1]": { - "SceneName": "Crossroads_49", - "DoorName": "right1", - "VanillaTarget": "Crossroads_43[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_49[left1]": { - "SceneName": "Crossroads_49", - "DoorName": "left1", - "VanillaTarget": "Crossroads_37[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_49b[right1]": { - "SceneName": "Crossroads_49b", - "DoorName": "right1", - "VanillaTarget": "Ruins1_28[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_50[right1]": { - "SceneName": "Crossroads_50", - "DoorName": "right1", - "VanillaTarget": "RestingGrounds_06[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Crossroads_50[left1]": { - "SceneName": "Crossroads_50", - "DoorName": "left1", - "VanillaTarget": "Crossroads_04[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Crossroads_52[left1]": { - "SceneName": "Crossroads_52", - "DoorName": "left1", - "VanillaTarget": "Crossroads_18[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_ruinhouse[left1]": { - "SceneName": "Room_ruinhouse", - "DoorName": "left1", - "VanillaTarget": "Crossroads_04[door1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_Charm_Shop[left1]": { - "SceneName": "Room_Charm_Shop", - "DoorName": "left1", - "VanillaTarget": "Crossroads_04[door_charmshop]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_Mender_House[left1]": { - "SceneName": "Room_Mender_House", - "DoorName": "left1", - "VanillaTarget": "Crossroads_04[door_Mender_House]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_01[left1]": { - "SceneName": "Fungus1_01", - "DoorName": "left1", - "VanillaTarget": "Fungus1_01b[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_01[right1]": { - "SceneName": "Fungus1_01", - "DoorName": "right1", - "VanillaTarget": "Crossroads_11_alt[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus1_01b[left1]": { - "SceneName": "Fungus1_01b", - "DoorName": "left1", - "VanillaTarget": "Fungus1_02[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_01b[right1]": { - "SceneName": "Fungus1_01b", - "DoorName": "right1", - "VanillaTarget": "Fungus1_01[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_02[left1]": { - "SceneName": "Fungus1_02", - "DoorName": "left1", - "VanillaTarget": "Fungus1_17[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_02[right1]": { - "SceneName": "Fungus1_02", - "DoorName": "right1", - "VanillaTarget": "Fungus1_01b[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_02[right2]": { - "SceneName": "Fungus1_02", - "DoorName": "right2", - "VanillaTarget": "Fungus1_06[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_03[left1]": { - "SceneName": "Fungus1_03", - "DoorName": "left1", - "VanillaTarget": "Fungus1_31[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_03[right1]": { - "SceneName": "Fungus1_03", - "DoorName": "right1", - "VanillaTarget": "Fungus1_17[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_03[bot1]": { - "SceneName": "Fungus1_03", - "DoorName": "bot1", - "VanillaTarget": "Fungus1_05[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_04[left1]": { - "SceneName": "Fungus1_04", - "DoorName": "left1", - "VanillaTarget": "Fungus1_25[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_04[right1]": { - "SceneName": "Fungus1_04", - "DoorName": "right1", - "VanillaTarget": "Fungus1_21[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_05[right1]": { - "SceneName": "Fungus1_05", - "DoorName": "right1", - "VanillaTarget": "Fungus1_14[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_05[bot1]": { - "SceneName": "Fungus1_05", - "DoorName": "bot1", - "VanillaTarget": "Fungus1_10[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_05[top1]": { - "SceneName": "Fungus1_05", - "DoorName": "top1", - "VanillaTarget": "Fungus1_03[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_06[left1]": { - "SceneName": "Fungus1_06", - "DoorName": "left1", - "VanillaTarget": "Fungus1_02[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_06[bot1]": { - "SceneName": "Fungus1_06", - "DoorName": "bot1", - "VanillaTarget": "Fungus1_07[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_07[top1]": { - "SceneName": "Fungus1_07", - "DoorName": "top1", - "VanillaTarget": "Fungus1_06[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_07[left1]": { - "SceneName": "Fungus1_07", - "DoorName": "left1", - "VanillaTarget": "Fungus1_19[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_07[right1]": { - "SceneName": "Fungus1_07", - "DoorName": "right1", - "VanillaTarget": "Fungus1_08[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_08[left1]": { - "SceneName": "Fungus1_08", - "DoorName": "left1", - "VanillaTarget": "Fungus1_07[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_09[left1]": { - "SceneName": "Fungus1_09", - "DoorName": "left1", - "VanillaTarget": "Fungus1_15[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_09[right1]": { - "SceneName": "Fungus1_09", - "DoorName": "right1", - "VanillaTarget": "Fungus1_30[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_10[left1]": { - "SceneName": "Fungus1_10", - "DoorName": "left1", - "VanillaTarget": "Fungus1_30[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_10[right1]": { - "SceneName": "Fungus1_10", - "DoorName": "right1", - "VanillaTarget": "Fungus1_19[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_10[top1]": { - "SceneName": "Fungus1_10", - "DoorName": "top1", - "VanillaTarget": "Fungus1_05[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_11[top1]": { - "SceneName": "Fungus1_11", - "DoorName": "top1", - "VanillaTarget": "Fungus1_19[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_11[right1]": { - "SceneName": "Fungus1_11", - "DoorName": "right1", - "VanillaTarget": "Fungus1_34[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_11[right2]": { - "SceneName": "Fungus1_11", - "DoorName": "right2", - "VanillaTarget": "Fungus1_37[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_11[left1]": { - "SceneName": "Fungus1_11", - "DoorName": "left1", - "VanillaTarget": "Fungus1_29[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_11[bot1]": { - "SceneName": "Fungus1_11", - "DoorName": "bot1", - "VanillaTarget": "Fungus3_01[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus1_12[left1]": { - "SceneName": "Fungus1_12", - "DoorName": "left1", - "VanillaTarget": "Fungus1_13[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_12[right1]": { - "SceneName": "Fungus1_12", - "DoorName": "right1", - "VanillaTarget": "Fungus1_29[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_13[right1]": { - "SceneName": "Fungus1_13", - "DoorName": "right1", - "VanillaTarget": "Fungus1_12[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_13[left1]": { - "SceneName": "Fungus1_13", - "DoorName": "left1", - "VanillaTarget": "Fungus3_22[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus1_14[left1]": { - "SceneName": "Fungus1_14", - "DoorName": "left1", - "VanillaTarget": "Fungus1_05[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_15[door1]": { - "SceneName": "Fungus1_15", - "DoorName": "door1", - "VanillaTarget": "Room_nailmaster_02[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_15[right1]": { - "SceneName": "Fungus1_15", - "DoorName": "right1", - "VanillaTarget": "Fungus1_09[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_16_alt[right1]": { - "SceneName": "Fungus1_16_alt", - "DoorName": "right1", - "VanillaTarget": "Fungus1_22[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_17[left1]": { - "SceneName": "Fungus1_17", - "DoorName": "left1", - "VanillaTarget": "Fungus1_03[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_17[right1]": { - "SceneName": "Fungus1_17", - "DoorName": "right1", - "VanillaTarget": "Fungus1_02[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_19[left1]": { - "SceneName": "Fungus1_19", - "DoorName": "left1", - "VanillaTarget": "Fungus1_10[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_19[right1]": { - "SceneName": "Fungus1_19", - "DoorName": "right1", - "VanillaTarget": "Fungus1_07[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_19[bot1]": { - "SceneName": "Fungus1_19", - "DoorName": "bot1", - "VanillaTarget": "Fungus1_11[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_20_v02[bot1]": { - "SceneName": "Fungus1_20_v02", - "DoorName": "bot1", - "VanillaTarget": "Fungus1_21[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_20_v02[bot2]": { - "SceneName": "Fungus1_20_v02", - "DoorName": "bot2", - "VanillaTarget": "Fungus1_32[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_20_v02[right1]": { - "SceneName": "Fungus1_20_v02", - "DoorName": "right1", - "VanillaTarget": "Fungus1_28[left2]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus1_21[bot1]": { - "SceneName": "Fungus1_21", - "DoorName": "bot1", - "VanillaTarget": "Fungus1_22[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_21[top1]": { - "SceneName": "Fungus1_21", - "DoorName": "top1", - "VanillaTarget": "Fungus1_20_v02[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_21[left1]": { - "SceneName": "Fungus1_21", - "DoorName": "left1", - "VanillaTarget": "Fungus1_04[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_21[right1]": { - "SceneName": "Fungus1_21", - "DoorName": "right1", - "VanillaTarget": "Fungus1_32[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_22[bot1]": { - "SceneName": "Fungus1_22", - "DoorName": "bot1", - "VanillaTarget": "Fungus1_30[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_22[top1]": { - "SceneName": "Fungus1_22", - "DoorName": "top1", - "VanillaTarget": "Fungus1_21[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_22[left1]": { - "SceneName": "Fungus1_22", - "DoorName": "left1", - "VanillaTarget": "Fungus1_16_alt[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_23[left1]": { - "SceneName": "Fungus1_23", - "DoorName": "left1", - "VanillaTarget": "Fungus3_48[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_23[right1]": { - "SceneName": "Fungus1_23", - "DoorName": "right1", - "VanillaTarget": "Fungus3_13[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_24[left1]": { - "SceneName": "Fungus1_24", - "DoorName": "left1", - "VanillaTarget": "Fungus3_05[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_25[right1]": { - "SceneName": "Fungus1_25", - "DoorName": "right1", - "VanillaTarget": "Fungus1_04[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_25[left1]": { - "SceneName": "Fungus1_25", - "DoorName": "left1", - "VanillaTarget": "Fungus1_26[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_26[right1]": { - "SceneName": "Fungus1_26", - "DoorName": "right1", - "VanillaTarget": "Fungus1_25[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_26[left1]": { - "SceneName": "Fungus1_26", - "DoorName": "left1", - "VanillaTarget": "Fungus1_Slug[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_26[door_SlugShrine]": { - "SceneName": "Fungus1_26", - "DoorName": "door_SlugShrine", - "VanillaTarget": "Room_Slug_Shrine[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_28[left1]": { - "SceneName": "Fungus1_28", - "DoorName": "left1", - "VanillaTarget": "Cliffs_01[right3]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_28[left2]": { - "SceneName": "Fungus1_28", - "DoorName": "left2", - "VanillaTarget": "Fungus1_20_v02[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus1_29[left1]": { - "SceneName": "Fungus1_29", - "DoorName": "left1", - "VanillaTarget": "Fungus1_12[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_29[right1]": { - "SceneName": "Fungus1_29", - "DoorName": "right1", - "VanillaTarget": "Fungus1_11[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_30[top1]": { - "SceneName": "Fungus1_30", - "DoorName": "top1", - "VanillaTarget": "Fungus1_22[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_30[top3]": { - "SceneName": "Fungus1_30", - "DoorName": "top3", - "VanillaTarget": "Fungus1_31[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_30[left1]": { - "SceneName": "Fungus1_30", - "DoorName": "left1", - "VanillaTarget": "Fungus1_09[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_30[right1]": { - "SceneName": "Fungus1_30", - "DoorName": "right1", - "VanillaTarget": "Fungus1_10[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_31[top1]": { - "SceneName": "Fungus1_31", - "DoorName": "top1", - "VanillaTarget": "Fungus1_32[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_31[bot1]": { - "SceneName": "Fungus1_31", - "DoorName": "bot1", - "VanillaTarget": "Fungus1_30[top3]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_31[right1]": { - "SceneName": "Fungus1_31", - "DoorName": "right1", - "VanillaTarget": "Fungus1_03[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_32[bot1]": { - "SceneName": "Fungus1_32", - "DoorName": "bot1", - "VanillaTarget": "Fungus1_31[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_32[top1]": { - "SceneName": "Fungus1_32", - "DoorName": "top1", - "VanillaTarget": "Fungus1_20_v02[bot2]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_32[left1]": { - "SceneName": "Fungus1_32", - "DoorName": "left1", - "VanillaTarget": "Fungus1_21[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_34[door1]": { - "SceneName": "Fungus1_34", - "DoorName": "door1", - "VanillaTarget": "Fungus1_35[left1]", - "Direction": "Door", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_34[left1]": { - "SceneName": "Fungus1_34", - "DoorName": "left1", - "VanillaTarget": "Fungus1_11[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_35[left1]": { - "SceneName": "Fungus1_35", - "DoorName": "left1", - "VanillaTarget": "Fungus1_34[door1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_35[right1]": { - "SceneName": "Fungus1_35", - "DoorName": "right1", - "VanillaTarget": "Fungus1_36[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_36[left1]": { - "SceneName": "Fungus1_36", - "DoorName": "left1", - "VanillaTarget": "Fungus1_35[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_37[left1]": { - "SceneName": "Fungus1_37", - "DoorName": "left1", - "VanillaTarget": "Fungus1_11[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus1_Slug[right1]": { - "SceneName": "Fungus1_Slug", - "DoorName": "right1", - "VanillaTarget": "Fungus1_26[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_Slug_Shrine[left1]": { - "SceneName": "Room_Slug_Shrine", - "DoorName": "left1", - "VanillaTarget": "Fungus1_26[door_SlugShrine]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_nailmaster_02[left1]": { - "SceneName": "Room_nailmaster_02", - "DoorName": "left1", - "VanillaTarget": "Fungus1_15[door1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_01[top1]": { - "SceneName": "Fungus3_01", - "DoorName": "top1", - "VanillaTarget": "Fungus1_11[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus3_01[right1]": { - "SceneName": "Fungus3_01", - "DoorName": "right1", - "VanillaTarget": "Fungus3_25[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_01[left1]": { - "SceneName": "Fungus3_01", - "DoorName": "left1", - "VanillaTarget": "Fungus3_24[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_01[right2]": { - "SceneName": "Fungus3_01", - "DoorName": "right2", - "VanillaTarget": "Fungus3_02[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_02[left1]": { - "SceneName": "Fungus3_02", - "DoorName": "left1", - "VanillaTarget": "Fungus3_01[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_02[left2]": { - "SceneName": "Fungus3_02", - "DoorName": "left2", - "VanillaTarget": "Fungus3_03[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_02[left3]": { - "SceneName": "Fungus3_02", - "DoorName": "left3", - "VanillaTarget": "Fungus3_35[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_02[right1]": { - "SceneName": "Fungus3_02", - "DoorName": "right1", - "VanillaTarget": "Fungus3_47[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_02[right2]": { - "SceneName": "Fungus3_02", - "DoorName": "right2", - "VanillaTarget": "Fungus2_01[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus3_03[right1]": { - "SceneName": "Fungus3_03", - "DoorName": "right1", - "VanillaTarget": "Fungus3_02[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_03[left1]": { - "SceneName": "Fungus3_03", - "DoorName": "left1", - "VanillaTarget": "Fungus3_34[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus3_24[right1]": { - "SceneName": "Fungus3_24", - "DoorName": "right1", - "VanillaTarget": "Fungus3_01[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_24[left1]": { - "SceneName": "Fungus3_24", - "DoorName": "left1", - "VanillaTarget": "Fungus3_44[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_24[top1]": { - "SceneName": "Fungus3_24", - "DoorName": "top1", - "VanillaTarget": "Fungus3_30[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_25[right1]": { - "SceneName": "Fungus3_25", - "DoorName": "right1", - "VanillaTarget": "Fungus3_25b[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_25[left1]": { - "SceneName": "Fungus3_25", - "DoorName": "left1", - "VanillaTarget": "Fungus3_01[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_25b[right1]": { - "SceneName": "Fungus3_25b", - "DoorName": "right1", - "VanillaTarget": "Fungus3_26[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_25b[left1]": { - "SceneName": "Fungus3_25b", - "DoorName": "left1", - "VanillaTarget": "Fungus3_25[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_26[top1]": { - "SceneName": "Fungus3_26", - "DoorName": "top1", - "VanillaTarget": "Crossroads_35[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus3_26[left1]": { - "SceneName": "Fungus3_26", - "DoorName": "left1", - "VanillaTarget": "Fungus3_28[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_26[left2]": { - "SceneName": "Fungus3_26", - "DoorName": "left2", - "VanillaTarget": "Fungus3_25b[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_26[left3]": { - "SceneName": "Fungus3_26", - "DoorName": "left3", - "VanillaTarget": "Fungus3_27[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_26[right1]": { - "SceneName": "Fungus3_26", - "DoorName": "right1", - "VanillaTarget": "Fungus2_33[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus3_27[left1]": { - "SceneName": "Fungus3_27", - "DoorName": "left1", - "VanillaTarget": "Fungus3_47[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_27[right1]": { - "SceneName": "Fungus3_27", - "DoorName": "right1", - "VanillaTarget": "Fungus3_26[left3]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_28[right1]": { - "SceneName": "Fungus3_28", - "DoorName": "right1", - "VanillaTarget": "Fungus3_26[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_30[bot1]": { - "SceneName": "Fungus3_30", - "DoorName": "bot1", - "VanillaTarget": "Fungus3_24[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_35[right1]": { - "SceneName": "Fungus3_35", - "DoorName": "right1", - "VanillaTarget": "Fungus3_02[left3]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_44[bot1]": { - "SceneName": "Fungus3_44", - "DoorName": "bot1", - "VanillaTarget": "Fungus3_34[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus3_44[door1]": { - "SceneName": "Fungus3_44", - "DoorName": "door1", - "VanillaTarget": "Room_Fungus_Shaman[left1]", - "Direction": "Door", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_44[right1]": { - "SceneName": "Fungus3_44", - "DoorName": "right1", - "VanillaTarget": "Fungus3_24[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_47[left1]": { - "SceneName": "Fungus3_47", - "DoorName": "left1", - "VanillaTarget": "Fungus3_02[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_47[right1]": { - "SceneName": "Fungus3_47", - "DoorName": "right1", - "VanillaTarget": "Fungus3_27[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_47[door1]": { - "SceneName": "Fungus3_47", - "DoorName": "door1", - "VanillaTarget": "Fungus3_archive[left1]", - "Direction": "Door", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_Fungus_Shaman[left1]": { - "SceneName": "Room_Fungus_Shaman", - "DoorName": "left1", - "VanillaTarget": "Fungus3_44[door1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_archive[left1]": { - "SceneName": "Fungus3_archive", - "DoorName": "left1", - "VanillaTarget": "Fungus3_47[door1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_archive[bot1]": { - "SceneName": "Fungus3_archive", - "DoorName": "bot1", - "VanillaTarget": "Fungus3_archive_02[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_archive_02[top1]": { - "SceneName": "Fungus3_archive_02", - "DoorName": "top1", - "VanillaTarget": "Fungus3_archive[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_01[left1]": { - "SceneName": "Fungus2_01", - "DoorName": "left1", - "VanillaTarget": "Fungus3_02[right2]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus2_01[left2]": { - "SceneName": "Fungus2_01", - "DoorName": "left2", - "VanillaTarget": "Fungus2_02[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_01[left3]": { - "SceneName": "Fungus2_01", - "DoorName": "left3", - "VanillaTarget": "Fungus2_34[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_01[right1]": { - "SceneName": "Fungus2_01", - "DoorName": "right1", - "VanillaTarget": "Fungus2_03[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_02[right1]": { - "SceneName": "Fungus2_02", - "DoorName": "right1", - "VanillaTarget": "Fungus2_01[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_34[right1]": { - "SceneName": "Fungus2_34", - "DoorName": "right1", - "VanillaTarget": "Fungus2_01[left3]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_03[left1]": { - "SceneName": "Fungus2_03", - "DoorName": "left1", - "VanillaTarget": "Fungus2_01[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_03[bot1]": { - "SceneName": "Fungus2_03", - "DoorName": "bot1", - "VanillaTarget": "Fungus2_18[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_03[right1]": { - "SceneName": "Fungus2_03", - "DoorName": "right1", - "VanillaTarget": "Fungus2_04[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_04[top1]": { - "SceneName": "Fungus2_04", - "DoorName": "top1", - "VanillaTarget": "Fungus2_05[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_04[right1]": { - "SceneName": "Fungus2_04", - "DoorName": "right1", - "VanillaTarget": "Fungus2_28[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_04[left1]": { - "SceneName": "Fungus2_04", - "DoorName": "left1", - "VanillaTarget": "Fungus2_03[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_04[right2]": { - "SceneName": "Fungus2_04", - "DoorName": "right2", - "VanillaTarget": "Fungus2_28[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_05[bot1]": { - "SceneName": "Fungus2_05", - "DoorName": "bot1", - "VanillaTarget": "Fungus2_04[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_05[right1]": { - "SceneName": "Fungus2_05", - "DoorName": "right1", - "VanillaTarget": "Fungus2_06[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_06[top1]": { - "SceneName": "Fungus2_06", - "DoorName": "top1", - "VanillaTarget": "Crossroads_18[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus2_06[left1]": { - "SceneName": "Fungus2_06", - "DoorName": "left1", - "VanillaTarget": "Fungus2_05[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_06[left2]": { - "SceneName": "Fungus2_06", - "DoorName": "left2", - "VanillaTarget": "Fungus2_33[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_06[right1]": { - "SceneName": "Fungus2_06", - "DoorName": "right1", - "VanillaTarget": "Fungus2_26[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_06[right2]": { - "SceneName": "Fungus2_06", - "DoorName": "right2", - "VanillaTarget": "Fungus2_07[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_07[left1]": { - "SceneName": "Fungus2_07", - "DoorName": "left1", - "VanillaTarget": "Fungus2_06[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_07[right1]": { - "SceneName": "Fungus2_07", - "DoorName": "right1", - "VanillaTarget": "Fungus2_08[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_08[left1]": { - "SceneName": "Fungus2_08", - "DoorName": "left1", - "VanillaTarget": "Fungus2_07[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_08[left2]": { - "SceneName": "Fungus2_08", - "DoorName": "left2", - "VanillaTarget": "Fungus2_09[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_08[right1]": { - "SceneName": "Fungus2_08", - "DoorName": "right1", - "VanillaTarget": "Fungus2_32[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_09[left1]": { - "SceneName": "Fungus2_09", - "DoorName": "left1", - "VanillaTarget": "Fungus2_10[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_09[right1]": { - "SceneName": "Fungus2_09", - "DoorName": "right1", - "VanillaTarget": "Fungus2_08[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_10[right1]": { - "SceneName": "Fungus2_10", - "DoorName": "right1", - "VanillaTarget": "Fungus2_09[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_10[right2]": { - "SceneName": "Fungus2_10", - "DoorName": "right2", - "VanillaTarget": "Fungus2_21[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_10[bot1]": { - "SceneName": "Fungus2_10", - "DoorName": "bot1", - "VanillaTarget": "Fungus2_11[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_11[top1]": { - "SceneName": "Fungus2_11", - "DoorName": "top1", - "VanillaTarget": "Fungus2_10[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_11[left1]": { - "SceneName": "Fungus2_11", - "DoorName": "left1", - "VanillaTarget": "Fungus2_18[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_11[left2]": { - "SceneName": "Fungus2_11", - "DoorName": "left2", - "VanillaTarget": "Fungus2_17[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_11[right1]": { - "SceneName": "Fungus2_11", - "DoorName": "right1", - "VanillaTarget": "Fungus2_12[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_12[left1]": { - "SceneName": "Fungus2_12", - "DoorName": "left1", - "VanillaTarget": "Fungus2_11[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_12[bot1]": { - "SceneName": "Fungus2_12", - "DoorName": "bot1", - "VanillaTarget": "Fungus2_13[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_13[top1]": { - "SceneName": "Fungus2_13", - "DoorName": "top1", - "VanillaTarget": "Fungus2_12[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_13[left2]": { - "SceneName": "Fungus2_13", - "DoorName": "left2", - "VanillaTarget": "Fungus2_14[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_13[left3]": { - "SceneName": "Fungus2_13", - "DoorName": "left3", - "VanillaTarget": "Fungus2_23[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_14[top1]": { - "SceneName": "Fungus2_14", - "DoorName": "top1", - "VanillaTarget": "Fungus2_17[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_14[right1]": { - "SceneName": "Fungus2_14", - "DoorName": "right1", - "VanillaTarget": "Fungus2_13[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_14[bot3]": { - "SceneName": "Fungus2_14", - "DoorName": "bot3", - "VanillaTarget": "Fungus2_15[top3]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_15[top3]": { - "SceneName": "Fungus2_15", - "DoorName": "top3", - "VanillaTarget": "Fungus2_14[bot3]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_15[right1]": { - "SceneName": "Fungus2_15", - "DoorName": "right1", - "VanillaTarget": "Fungus2_31[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_15[left1]": { - "SceneName": "Fungus2_15", - "DoorName": "left1", - "VanillaTarget": "Fungus2_25[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus2_17[left1]": { - "SceneName": "Fungus2_17", - "DoorName": "left1", - "VanillaTarget": "Fungus2_29[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_17[right1]": { - "SceneName": "Fungus2_17", - "DoorName": "right1", - "VanillaTarget": "Fungus2_11[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_17[bot1]": { - "SceneName": "Fungus2_17", - "DoorName": "bot1", - "VanillaTarget": "Fungus2_14[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_18[right1]": { - "SceneName": "Fungus2_18", - "DoorName": "right1", - "VanillaTarget": "Fungus2_11[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_18[bot1]": { - "SceneName": "Fungus2_18", - "DoorName": "bot1", - "VanillaTarget": "Fungus2_19[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_18[top1]": { - "SceneName": "Fungus2_18", - "DoorName": "top1", - "VanillaTarget": "Fungus2_03[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_19[top1]": { - "SceneName": "Fungus2_19", - "DoorName": "top1", - "VanillaTarget": "Fungus2_18[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_19[left1]": { - "SceneName": "Fungus2_19", - "DoorName": "left1", - "VanillaTarget": "Fungus2_20[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_20[right1]": { - "SceneName": "Fungus2_20", - "DoorName": "right1", - "VanillaTarget": "Fungus2_19[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_20[left1]": { - "SceneName": "Fungus2_20", - "DoorName": "left1", - "VanillaTarget": "Deepnest_01[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_21[right1]": { - "SceneName": "Fungus2_21", - "DoorName": "right1", - "VanillaTarget": "Ruins1_01[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus2_21[left1]": { - "SceneName": "Fungus2_21", - "DoorName": "left1", - "VanillaTarget": "Fungus2_10[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_23[right1]": { - "SceneName": "Fungus2_23", - "DoorName": "right1", - "VanillaTarget": "Fungus2_13[left3]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_23[right2]": { - "SceneName": "Fungus2_23", - "DoorName": "right2", - "VanillaTarget": "Waterways_09[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus2_26[left1]": { - "SceneName": "Fungus2_26", - "DoorName": "left1", - "VanillaTarget": "Fungus2_06[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_28[left1]": { - "SceneName": "Fungus2_28", - "DoorName": "left1", - "VanillaTarget": "Fungus2_04[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_28[left2]": { - "SceneName": "Fungus2_28", - "DoorName": "left2", - "VanillaTarget": "Fungus2_04[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_29[right1]": { - "SceneName": "Fungus2_29", - "DoorName": "right1", - "VanillaTarget": "Fungus2_17[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_29[bot1]": { - "SceneName": "Fungus2_29", - "DoorName": "bot1", - "VanillaTarget": "Fungus2_30[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_30[bot1]": { - "SceneName": "Fungus2_30", - "DoorName": "bot1", - "VanillaTarget": "Fungus2_25[top2]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "OneWayIn" - }, - "Fungus2_30[top1]": { - "SceneName": "Fungus2_30", - "DoorName": "top1", - "VanillaTarget": "Fungus2_29[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_31[left1]": { - "SceneName": "Fungus2_31", - "DoorName": "left1", - "VanillaTarget": "Fungus2_15[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_32[left1]": { - "SceneName": "Fungus2_32", - "DoorName": "left1", - "VanillaTarget": "Fungus2_08[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_33[right1]": { - "SceneName": "Fungus2_33", - "DoorName": "right1", - "VanillaTarget": "Fungus2_06[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_33[left1]": { - "SceneName": "Fungus2_33", - "DoorName": "left1", - "VanillaTarget": "Fungus3_26[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Deepnest_01[right1]": { - "SceneName": "Deepnest_01", - "DoorName": "right1", - "VanillaTarget": "Fungus2_20[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_01[bot1]": { - "SceneName": "Deepnest_01", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_01b[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Deepnest_01[bot2]": { - "SceneName": "Deepnest_01", - "DoorName": "bot2", - "VanillaTarget": "Deepnest_01b[top2]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "OneWayIn" - }, - "Deepnest_01[left1]": { - "SceneName": "Deepnest_01", - "DoorName": "left1", - "VanillaTarget": "Fungus3_39[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Deepnest_01b[top1]": { - "SceneName": "Deepnest_01b", - "DoorName": "top1", - "VanillaTarget": "Deepnest_01[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Deepnest_01b[top2]": { - "SceneName": "Deepnest_01b", - "DoorName": "top2", - "VanillaTarget": null, - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "OneWayOut" - }, - "Deepnest_01b[right1]": { - "SceneName": "Deepnest_01b", - "DoorName": "right1", - "VanillaTarget": "Deepnest_02[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_01b[right2]": { - "SceneName": "Deepnest_01b", - "DoorName": "right2", - "VanillaTarget": "Deepnest_02[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_01b[bot1]": { - "SceneName": "Deepnest_01b", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_17[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_02[left1]": { - "SceneName": "Deepnest_02", - "DoorName": "left1", - "VanillaTarget": "Deepnest_01b[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_02[left2]": { - "SceneName": "Deepnest_02", - "DoorName": "left2", - "VanillaTarget": "Deepnest_01b[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_02[right1]": { - "SceneName": "Deepnest_02", - "DoorName": "right1", - "VanillaTarget": "Deepnest_36[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_03[right1]": { - "SceneName": "Deepnest_03", - "DoorName": "right1", - "VanillaTarget": "Deepnest_30[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_03[left1]": { - "SceneName": "Deepnest_03", - "DoorName": "left1", - "VanillaTarget": "Deepnest_34[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_03[top1]": { - "SceneName": "Deepnest_03", - "DoorName": "top1", - "VanillaTarget": "Deepnest_33[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_03[left2]": { - "SceneName": "Deepnest_03", - "DoorName": "left2", - "VanillaTarget": "Deepnest_31[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_09[left1]": { - "SceneName": "Deepnest_09", - "DoorName": "left1", - "VanillaTarget": "Deepnest_10[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_10[right1]": { - "SceneName": "Deepnest_10", - "DoorName": "right1", - "VanillaTarget": "Deepnest_09[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_10[right2]": { - "SceneName": "Deepnest_10", - "DoorName": "right2", - "VanillaTarget": "Deepnest_41[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_10[right3]": { - "SceneName": "Deepnest_10", - "DoorName": "right3", - "VanillaTarget": "Deepnest_41[left2]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_10[door1]": { - "SceneName": "Deepnest_10", - "DoorName": "door1", - "VanillaTarget": "Deepnest_Spider_Town[left1]", - "Direction": "Door", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_10[door2]": { - "SceneName": "Deepnest_10", - "DoorName": "door2", - "VanillaTarget": "Room_spider_small[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_spider_small[left1]": { - "SceneName": "Room_spider_small", - "DoorName": "left1", - "VanillaTarget": "Deepnest_10[door2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_Spider_Town[left1]": { - "SceneName": "Deepnest_Spider_Town", - "DoorName": "left1", - "VanillaTarget": "Deepnest_10[door1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_14[right1]": { - "SceneName": "Deepnest_14", - "DoorName": "right1", - "VanillaTarget": "Deepnest_17[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_14[left1]": { - "SceneName": "Deepnest_14", - "DoorName": "left1", - "VanillaTarget": "Deepnest_26[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_14[bot1]": { - "SceneName": "Deepnest_14", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_33[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_14[bot2]": { - "SceneName": "Deepnest_14", - "DoorName": "bot2", - "VanillaTarget": "Deepnest_33[top2]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_16[left1]": { - "SceneName": "Deepnest_16", - "DoorName": "left1", - "VanillaTarget": "Deepnest_17[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_16[bot1]": { - "SceneName": "Deepnest_16", - "DoorName": "bot1", - "VanillaTarget": "Fungus2_25[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_17[left1]": { - "SceneName": "Deepnest_17", - "DoorName": "left1", - "VanillaTarget": "Deepnest_14[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_17[right1]": { - "SceneName": "Deepnest_17", - "DoorName": "right1", - "VanillaTarget": "Deepnest_16[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_17[top1]": { - "SceneName": "Deepnest_17", - "DoorName": "top1", - "VanillaTarget": "Deepnest_01b[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_17[bot1]": { - "SceneName": "Deepnest_17", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_30[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_25[top1]": { - "SceneName": "Fungus2_25", - "DoorName": "top1", - "VanillaTarget": "Deepnest_16[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus2_25[top2]": { - "SceneName": "Fungus2_25", - "DoorName": "top2", - "VanillaTarget": null, - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "OneWayOut" - }, - "Fungus2_25[right1]": { - "SceneName": "Fungus2_25", - "DoorName": "right1", - "VanillaTarget": "Fungus2_15[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Deepnest_26[left1]": { - "SceneName": "Deepnest_26", - "DoorName": "left1", - "VanillaTarget": "Deepnest_26b[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_26[left2]": { - "SceneName": "Deepnest_26", - "DoorName": "left2", - "VanillaTarget": "Deepnest_26b[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_26[right1]": { - "SceneName": "Deepnest_26", - "DoorName": "right1", - "VanillaTarget": "Deepnest_14[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_26[bot1]": { - "SceneName": "Deepnest_26", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_35[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_26b[right2]": { - "SceneName": "Deepnest_26b", - "DoorName": "right2", - "VanillaTarget": "Deepnest_26[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_26b[right1]": { - "SceneName": "Deepnest_26b", - "DoorName": "right1", - "VanillaTarget": "Deepnest_26[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_30[left1]": { - "SceneName": "Deepnest_30", - "DoorName": "left1", - "VanillaTarget": "Deepnest_03[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_30[top1]": { - "SceneName": "Deepnest_30", - "DoorName": "top1", - "VanillaTarget": "Deepnest_17[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_30[right1]": { - "SceneName": "Deepnest_30", - "DoorName": "right1", - "VanillaTarget": "Deepnest_37[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_31[right1]": { - "SceneName": "Deepnest_31", - "DoorName": "right1", - "VanillaTarget": "Deepnest_03[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_31[right2]": { - "SceneName": "Deepnest_31", - "DoorName": "right2", - "VanillaTarget": "Deepnest_32[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_32[left1]": { - "SceneName": "Deepnest_32", - "DoorName": "left1", - "VanillaTarget": "Deepnest_31[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_33[top1]": { - "SceneName": "Deepnest_33", - "DoorName": "top1", - "VanillaTarget": "Deepnest_14[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_33[top2]": { - "SceneName": "Deepnest_33", - "DoorName": "top2", - "VanillaTarget": "Deepnest_14[bot2]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_33[bot1]": { - "SceneName": "Deepnest_33", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_03[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_34[left1]": { - "SceneName": "Deepnest_34", - "DoorName": "left1", - "VanillaTarget": "Deepnest_39[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_34[right1]": { - "SceneName": "Deepnest_34", - "DoorName": "right1", - "VanillaTarget": "Deepnest_03[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_34[top1]": { - "SceneName": "Deepnest_34", - "DoorName": "top1", - "VanillaTarget": "Deepnest_35[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_35[left1]": { - "SceneName": "Deepnest_35", - "DoorName": "left1", - "VanillaTarget": "Deepnest_40[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_35[top1]": { - "SceneName": "Deepnest_35", - "DoorName": "top1", - "VanillaTarget": "Deepnest_26[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_35[bot1]": { - "SceneName": "Deepnest_35", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_34[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_36[left1]": { - "SceneName": "Deepnest_36", - "DoorName": "left1", - "VanillaTarget": "Deepnest_02[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_37[left1]": { - "SceneName": "Deepnest_37", - "DoorName": "left1", - "VanillaTarget": "Deepnest_30[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_37[right1]": { - "SceneName": "Deepnest_37", - "DoorName": "right1", - "VanillaTarget": "Abyss_03_b[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_37[top1]": { - "SceneName": "Deepnest_37", - "DoorName": "top1", - "VanillaTarget": "Deepnest_38[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_37[bot1]": { - "SceneName": "Deepnest_37", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_44[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_38[bot1]": { - "SceneName": "Deepnest_38", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_37[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_39[left1]": { - "SceneName": "Deepnest_39", - "DoorName": "left1", - "VanillaTarget": "Deepnest_41[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_39[top1]": { - "SceneName": "Deepnest_39", - "DoorName": "top1", - "VanillaTarget": "Deepnest_42[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_39[door1]": { - "SceneName": "Deepnest_39", - "DoorName": "door1", - "VanillaTarget": "Deepnest_45_v02[left1]", - "Direction": "Door", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_39[right1]": { - "SceneName": "Deepnest_39", - "DoorName": "right1", - "VanillaTarget": "Deepnest_34[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_40[right1]": { - "SceneName": "Deepnest_40", - "DoorName": "right1", - "VanillaTarget": "Deepnest_35[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_41[right1]": { - "SceneName": "Deepnest_41", - "DoorName": "right1", - "VanillaTarget": "Deepnest_39[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_41[left1]": { - "SceneName": "Deepnest_41", - "DoorName": "left1", - "VanillaTarget": "Deepnest_10[right2]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_41[left2]": { - "SceneName": "Deepnest_41", - "DoorName": "left2", - "VanillaTarget": "Deepnest_10[right3]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_42[bot1]": { - "SceneName": "Deepnest_42", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_39[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_42[left1]": { - "SceneName": "Deepnest_42", - "DoorName": "left1", - "VanillaTarget": "Room_Mask_Maker[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_42[top1]": { - "SceneName": "Deepnest_42", - "DoorName": "top1", - "VanillaTarget": "Deepnest_43[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Deepnest_43[bot1]": { - "SceneName": "Deepnest_43", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_42[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Deepnest_43[left1]": { - "SceneName": "Deepnest_43", - "DoorName": "left1", - "VanillaTarget": "Fungus3_50[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_43[right1]": { - "SceneName": "Deepnest_43", - "DoorName": "right1", - "VanillaTarget": "Fungus3_08[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_44[top1]": { - "SceneName": "Deepnest_44", - "DoorName": "top1", - "VanillaTarget": "Deepnest_37[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_45_v02[left1]": { - "SceneName": "Deepnest_45_v02", - "DoorName": "left1", - "VanillaTarget": "Deepnest_39[door1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_Mask_Maker[right1]": { - "SceneName": "Room_Mask_Maker", - "DoorName": "right1", - "VanillaTarget": "Deepnest_42[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_01[bot1]": { - "SceneName": "Deepnest_East_01", - "DoorName": "bot1", - "VanillaTarget": "Abyss_03_c[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_01[right1]": { - "SceneName": "Deepnest_East_01", - "DoorName": "right1", - "VanillaTarget": "Hive_03_c[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_01[top1]": { - "SceneName": "Deepnest_East_01", - "DoorName": "top1", - "VanillaTarget": "Deepnest_East_02[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_02[bot1]": { - "SceneName": "Deepnest_East_02", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_East_01[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_02[bot2]": { - "SceneName": "Deepnest_East_02", - "DoorName": "bot2", - "VanillaTarget": "Hive_03[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_02[top1]": { - "SceneName": "Deepnest_East_02", - "DoorName": "top1", - "VanillaTarget": "Waterways_14[bot2]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Deepnest_East_02[right1]": { - "SceneName": "Deepnest_East_02", - "DoorName": "right1", - "VanillaTarget": "Deepnest_East_03[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_03[left1]": { - "SceneName": "Deepnest_East_03", - "DoorName": "left1", - "VanillaTarget": "Ruins2_07[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Deepnest_East_03[left2]": { - "SceneName": "Deepnest_East_03", - "DoorName": "left2", - "VanillaTarget": "Deepnest_East_02[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_03[top1]": { - "SceneName": "Deepnest_East_03", - "DoorName": "top1", - "VanillaTarget": "Deepnest_East_07[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_03[top2]": { - "SceneName": "Deepnest_East_03", - "DoorName": "top2", - "VanillaTarget": null, - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "OneWayOut" - }, - "Deepnest_East_03[right1]": { - "SceneName": "Deepnest_East_03", - "DoorName": "right1", - "VanillaTarget": "Deepnest_East_04[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_03[right2]": { - "SceneName": "Deepnest_East_03", - "DoorName": "right2", - "VanillaTarget": "Deepnest_East_06[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_04[left1]": { - "SceneName": "Deepnest_East_04", - "DoorName": "left1", - "VanillaTarget": "Deepnest_East_03[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_04[left2]": { - "SceneName": "Deepnest_East_04", - "DoorName": "left2", - "VanillaTarget": "Deepnest_East_07[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_04[right2]": { - "SceneName": "Deepnest_East_04", - "DoorName": "right2", - "VanillaTarget": "Deepnest_East_15[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_04[right1]": { - "SceneName": "Deepnest_East_04", - "DoorName": "right1", - "VanillaTarget": "Deepnest_East_11[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_06[top1]": { - "SceneName": "Deepnest_East_06", - "DoorName": "top1", - "VanillaTarget": "Deepnest_East_18[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_06[left1]": { - "SceneName": "Deepnest_East_06", - "DoorName": "left1", - "VanillaTarget": "Deepnest_East_03[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_06[bot1]": { - "SceneName": "Deepnest_East_06", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_East_14b[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_06[door1]": { - "SceneName": "Deepnest_East_06", - "DoorName": "door1", - "VanillaTarget": "Room_nailmaster_03[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_06[right1]": { - "SceneName": "Deepnest_East_06", - "DoorName": "right1", - "VanillaTarget": "Deepnest_East_16[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_07[bot1]": { - "SceneName": "Deepnest_East_07", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_East_03[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_07[bot2]": { - "SceneName": "Deepnest_East_07", - "DoorName": "bot2", - "VanillaTarget": "Deepnest_East_03[top2]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "OneWayIn" - }, - "Deepnest_East_07[left1]": { - "SceneName": "Deepnest_East_07", - "DoorName": "left1", - "VanillaTarget": "Deepnest_East_08[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_07[left2]": { - "SceneName": "Deepnest_East_07", - "DoorName": "left2", - "VanillaTarget": "Ruins2_11_b[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Deepnest_East_07[right1]": { - "SceneName": "Deepnest_East_07", - "DoorName": "right1", - "VanillaTarget": "Deepnest_East_04[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_08[right1]": { - "SceneName": "Deepnest_East_08", - "DoorName": "right1", - "VanillaTarget": "Deepnest_East_07[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_08[top1]": { - "SceneName": "Deepnest_East_08", - "DoorName": "top1", - "VanillaTarget": "Deepnest_East_09[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_09[right1]": { - "SceneName": "Deepnest_East_09", - "DoorName": "right1", - "VanillaTarget": "Room_Colosseum_01[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_09[left1]": { - "SceneName": "Deepnest_East_09", - "DoorName": "left1", - "VanillaTarget": "Ruins2_10b[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Deepnest_East_09[bot1]": { - "SceneName": "Deepnest_East_09", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_East_08[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_10[left1]": { - "SceneName": "Deepnest_East_10", - "DoorName": "left1", - "VanillaTarget": "Deepnest_East_18[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_11[right1]": { - "SceneName": "Deepnest_East_11", - "DoorName": "right1", - "VanillaTarget": "Deepnest_East_12[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_11[left1]": { - "SceneName": "Deepnest_East_11", - "DoorName": "left1", - "VanillaTarget": "Deepnest_East_04[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_11[top1]": { - "SceneName": "Deepnest_East_11", - "DoorName": "top1", - "VanillaTarget": "Deepnest_East_13[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_11[bot1]": { - "SceneName": "Deepnest_East_11", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_East_18[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_12[right1]": { - "SceneName": "Deepnest_East_12", - "DoorName": "right1", - "VanillaTarget": "Deepnest_East_Hornet[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_12[left1]": { - "SceneName": "Deepnest_East_12", - "DoorName": "left1", - "VanillaTarget": "Deepnest_East_11[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_13[bot1]": { - "SceneName": "Deepnest_East_13", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_East_11[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_14[top2]": { - "SceneName": "Deepnest_East_14", - "DoorName": "top2", - "VanillaTarget": "Deepnest_East_16[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_14[left1]": { - "SceneName": "Deepnest_East_14", - "DoorName": "left1", - "VanillaTarget": "Deepnest_East_14b[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_14[door1]": { - "SceneName": "Deepnest_East_14", - "DoorName": "door1", - "VanillaTarget": "Deepnest_East_17[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_14b[right1]": { - "SceneName": "Deepnest_East_14b", - "DoorName": "right1", - "VanillaTarget": "Deepnest_East_14[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_14b[top1]": { - "SceneName": "Deepnest_East_14b", - "DoorName": "top1", - "VanillaTarget": "Deepnest_East_06[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_15[left1]": { - "SceneName": "Deepnest_East_15", - "DoorName": "left1", - "VanillaTarget": "Deepnest_East_04[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_16[left1]": { - "SceneName": "Deepnest_East_16", - "DoorName": "left1", - "VanillaTarget": "Deepnest_East_06[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_16[bot1]": { - "SceneName": "Deepnest_East_16", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_East_14[top2]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_17[left1]": { - "SceneName": "Deepnest_East_17", - "DoorName": "left1", - "VanillaTarget": "Deepnest_East_14[door1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_18[top1]": { - "SceneName": "Deepnest_East_18", - "DoorName": "top1", - "VanillaTarget": "Deepnest_East_11[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_18[bot1]": { - "SceneName": "Deepnest_East_18", - "DoorName": "bot1", - "VanillaTarget": "Deepnest_East_06[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_18[right2]": { - "SceneName": "Deepnest_East_18", - "DoorName": "right2", - "VanillaTarget": "Deepnest_East_10[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_nailmaster_03[left1]": { - "SceneName": "Room_nailmaster_03", - "DoorName": "left1", - "VanillaTarget": "Deepnest_East_06[door1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_Hornet[left1]": { - "SceneName": "Deepnest_East_Hornet", - "DoorName": "left1", - "VanillaTarget": "Deepnest_East_12[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Deepnest_East_Hornet[left2]": { - "SceneName": "Deepnest_East_Hornet", - "DoorName": "left2", - "VanillaTarget": "Room_Wyrm[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_Wyrm[right1]": { - "SceneName": "Room_Wyrm", - "DoorName": "right1", - "VanillaTarget": "Deepnest_East_Hornet[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "GG_Lurker[left1]": { - "SceneName": "GG_Lurker", - "DoorName": "left1", - "VanillaTarget": "Room_Colosseum_Spectate[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Hive_01[left1]": { - "SceneName": "Hive_01", - "DoorName": "left1", - "VanillaTarget": "Abyss_03_c[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Hive_01[right1]": { - "SceneName": "Hive_01", - "DoorName": "right1", - "VanillaTarget": "Hive_02[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Hive_01[right2]": { - "SceneName": "Hive_01", - "DoorName": "right2", - "VanillaTarget": "Hive_02[left3]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Hive_02[left1]": { - "SceneName": "Hive_02", - "DoorName": "left1", - "VanillaTarget": "Hive_03_c[right3]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Hive_02[left2]": { - "SceneName": "Hive_02", - "DoorName": "left2", - "VanillaTarget": "Hive_01[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Hive_02[left3]": { - "SceneName": "Hive_02", - "DoorName": "left3", - "VanillaTarget": "Hive_01[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Hive_03_c[left1]": { - "SceneName": "Hive_03_c", - "DoorName": "left1", - "VanillaTarget": "Deepnest_East_01[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Hive_03_c[right2]": { - "SceneName": "Hive_03_c", - "DoorName": "right2", - "VanillaTarget": "Hive_04[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Hive_03_c[right3]": { - "SceneName": "Hive_03_c", - "DoorName": "right3", - "VanillaTarget": "Hive_02[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Hive_03_c[top1]": { - "SceneName": "Hive_03_c", - "DoorName": "top1", - "VanillaTarget": "Hive_03[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Hive_03[bot1]": { - "SceneName": "Hive_03", - "DoorName": "bot1", - "VanillaTarget": "Hive_03_c[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Hive_03[right1]": { - "SceneName": "Hive_03", - "DoorName": "right1", - "VanillaTarget": "Hive_04[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Hive_03[top1]": { - "SceneName": "Hive_03", - "DoorName": "top1", - "VanillaTarget": "Deepnest_East_02[bot2]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Hive_04[left1]": { - "SceneName": "Hive_04", - "DoorName": "left1", - "VanillaTarget": "Hive_03[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Hive_04[left2]": { - "SceneName": "Hive_04", - "DoorName": "left2", - "VanillaTarget": "Hive_03_c[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Hive_04[right1]": { - "SceneName": "Hive_04", - "DoorName": "right1", - "VanillaTarget": "Hive_05[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Hive_05[left1]": { - "SceneName": "Hive_05", - "DoorName": "left1", - "VanillaTarget": "Hive_04[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_Colosseum_01[left1]": { - "SceneName": "Room_Colosseum_01", - "DoorName": "left1", - "VanillaTarget": "Deepnest_East_09[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_Colosseum_01[bot1]": { - "SceneName": "Room_Colosseum_01", - "DoorName": "bot1", - "VanillaTarget": "Room_Colosseum_02[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_Colosseum_02[top1]": { - "SceneName": "Room_Colosseum_02", - "DoorName": "top1", - "VanillaTarget": "Room_Colosseum_01[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_Colosseum_02[top2]": { - "SceneName": "Room_Colosseum_02", - "DoorName": "top2", - "VanillaTarget": "Room_Colosseum_Spectate[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_Colosseum_Spectate[bot1]": { - "SceneName": "Room_Colosseum_Spectate", - "DoorName": "bot1", - "VanillaTarget": "Room_Colosseum_02[top2]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_Colosseum_Spectate[right1]": { - "SceneName": "Room_Colosseum_Spectate", - "DoorName": "right1", - "VanillaTarget": "GG_Lurker[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_01[left1]": { - "SceneName": "Abyss_01", - "DoorName": "left1", - "VanillaTarget": "Waterways_05[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_01[left2]": { - "SceneName": "Abyss_01", - "DoorName": "left2", - "VanillaTarget": "Waterways_06[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_01[left3]": { - "SceneName": "Abyss_01", - "DoorName": "left3", - "VanillaTarget": "Abyss_02[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_01[right1]": { - "SceneName": "Abyss_01", - "DoorName": "right1", - "VanillaTarget": "Ruins2_04[left2]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Abyss_01[right2]": { - "SceneName": "Abyss_01", - "DoorName": "right2", - "VanillaTarget": "Waterways_07[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_02[right1]": { - "SceneName": "Abyss_02", - "DoorName": "right1", - "VanillaTarget": "Abyss_01[left3]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_02[bot1]": { - "SceneName": "Abyss_02", - "DoorName": "bot1", - "VanillaTarget": "Abyss_03[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Abyss_03[bot1]": { - "SceneName": "Abyss_03", - "DoorName": "bot1", - "VanillaTarget": "Abyss_17[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_03[bot2]": { - "SceneName": "Abyss_03", - "DoorName": "bot2", - "VanillaTarget": "Abyss_04[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_03[top1]": { - "SceneName": "Abyss_03", - "DoorName": "top1", - "VanillaTarget": "Abyss_02[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Abyss_03_b[left1]": { - "SceneName": "Abyss_03_b", - "DoorName": "left1", - "VanillaTarget": "Deepnest_37[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_03_c[right1]": { - "SceneName": "Abyss_03_c", - "DoorName": "right1", - "VanillaTarget": "Hive_01[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_03_c[top1]": { - "SceneName": "Abyss_03_c", - "DoorName": "top1", - "VanillaTarget": "Deepnest_East_01[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_04[top1]": { - "SceneName": "Abyss_04", - "DoorName": "top1", - "VanillaTarget": "Abyss_03[bot2]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_04[left1]": { - "SceneName": "Abyss_04", - "DoorName": "left1", - "VanillaTarget": "Abyss_18[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_04[bot1]": { - "SceneName": "Abyss_04", - "DoorName": "bot1", - "VanillaTarget": "Abyss_06_Core[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_04[right1]": { - "SceneName": "Abyss_04", - "DoorName": "right1", - "VanillaTarget": "Abyss_05[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_05[left1]": { - "SceneName": "Abyss_05", - "DoorName": "left1", - "VanillaTarget": "Abyss_04[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_05[right1]": { - "SceneName": "Abyss_05", - "DoorName": "right1", - "VanillaTarget": "Abyss_22[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_06_Core[top1]": { - "SceneName": "Abyss_06_Core", - "DoorName": "top1", - "VanillaTarget": "Abyss_04[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_06_Core[left1]": { - "SceneName": "Abyss_06_Core", - "DoorName": "left1", - "VanillaTarget": "Abyss_08[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_06_Core[left3]": { - "SceneName": "Abyss_06_Core", - "DoorName": "left3", - "VanillaTarget": "Abyss_12[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_06_Core[right2]": { - "SceneName": "Abyss_06_Core", - "DoorName": "right2", - "VanillaTarget": "Abyss_16[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_06_Core[bot1]": { - "SceneName": "Abyss_06_Core", - "DoorName": "bot1", - "VanillaTarget": "Abyss_15[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_08[right1]": { - "SceneName": "Abyss_08", - "DoorName": "right1", - "VanillaTarget": "Abyss_06_Core[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_09[right1]": { - "SceneName": "Abyss_09", - "DoorName": "right1", - "VanillaTarget": "Abyss_10[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_09[right2]": { - "SceneName": "Abyss_09", - "DoorName": "right2", - "VanillaTarget": "Abyss_Lighthouse_room[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_09[right3]": { - "SceneName": "Abyss_09", - "DoorName": "right3", - "VanillaTarget": "Abyss_10[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_09[left1]": { - "SceneName": "Abyss_09", - "DoorName": "left1", - "VanillaTarget": "Abyss_16[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_10[left1]": { - "SceneName": "Abyss_10", - "DoorName": "left1", - "VanillaTarget": "Abyss_09[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_10[left2]": { - "SceneName": "Abyss_10", - "DoorName": "left2", - "VanillaTarget": "Abyss_09[right3]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_12[right1]": { - "SceneName": "Abyss_12", - "DoorName": "right1", - "VanillaTarget": "Abyss_06_Core[left3]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_15[top1]": { - "SceneName": "Abyss_15", - "DoorName": "top1", - "VanillaTarget": "Abyss_06_Core[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_16[left1]": { - "SceneName": "Abyss_16", - "DoorName": "left1", - "VanillaTarget": "Abyss_06_Core[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_16[right1]": { - "SceneName": "Abyss_16", - "DoorName": "right1", - "VanillaTarget": "Abyss_09[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_17[top1]": { - "SceneName": "Abyss_17", - "DoorName": "top1", - "VanillaTarget": "Abyss_03[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_18[left1]": { - "SceneName": "Abyss_18", - "DoorName": "left1", - "VanillaTarget": "Abyss_19[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_18[right1]": { - "SceneName": "Abyss_18", - "DoorName": "right1", - "VanillaTarget": "Abyss_04[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_19[left1]": { - "SceneName": "Abyss_19", - "DoorName": "left1", - "VanillaTarget": "Abyss_21[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_19[right1]": { - "SceneName": "Abyss_19", - "DoorName": "right1", - "VanillaTarget": "Abyss_18[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_19[bot1]": { - "SceneName": "Abyss_19", - "DoorName": "bot1", - "VanillaTarget": "Abyss_20[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_19[bot2]": { - "SceneName": "Abyss_19", - "DoorName": "bot2", - "VanillaTarget": "Abyss_20[top2]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_20[top1]": { - "SceneName": "Abyss_20", - "DoorName": "top1", - "VanillaTarget": "Abyss_19[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_20[top2]": { - "SceneName": "Abyss_20", - "DoorName": "top2", - "VanillaTarget": "Abyss_19[bot2]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_21[right1]": { - "SceneName": "Abyss_21", - "DoorName": "right1", - "VanillaTarget": "Abyss_19[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_22[left1]": { - "SceneName": "Abyss_22", - "DoorName": "left1", - "VanillaTarget": "Abyss_05[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Abyss_Lighthouse_room[left1]": { - "SceneName": "Abyss_Lighthouse_room", - "DoorName": "left1", - "VanillaTarget": "Abyss_09[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_01[top1]": { - "SceneName": "Waterways_01", - "DoorName": "top1", - "VanillaTarget": "Ruins1_05b[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Waterways_01[left1]": { - "SceneName": "Waterways_01", - "DoorName": "left1", - "VanillaTarget": "Waterways_04[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_01[right1]": { - "SceneName": "Waterways_01", - "DoorName": "right1", - "VanillaTarget": "Waterways_03[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_01[bot1]": { - "SceneName": "Waterways_01", - "DoorName": "bot1", - "VanillaTarget": "Waterways_02[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_02[top1]": { - "SceneName": "Waterways_02", - "DoorName": "top1", - "VanillaTarget": "Waterways_01[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_02[top2]": { - "SceneName": "Waterways_02", - "DoorName": "top2", - "VanillaTarget": "Waterways_05[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_02[top3]": { - "SceneName": "Waterways_02", - "DoorName": "top3", - "VanillaTarget": "Waterways_04[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_02[bot1]": { - "SceneName": "Waterways_02", - "DoorName": "bot1", - "VanillaTarget": "Waterways_08[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_02[bot2]": { - "SceneName": "Waterways_02", - "DoorName": "bot2", - "VanillaTarget": "Waterways_06[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_03[left1]": { - "SceneName": "Waterways_03", - "DoorName": "left1", - "VanillaTarget": "Waterways_01[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_04[bot1]": { - "SceneName": "Waterways_04", - "DoorName": "bot1", - "VanillaTarget": "Waterways_02[top3]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_04[right1]": { - "SceneName": "Waterways_04", - "DoorName": "right1", - "VanillaTarget": "Waterways_01[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_04[left1]": { - "SceneName": "Waterways_04", - "DoorName": "left1", - "VanillaTarget": "Waterways_04b[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_04[left2]": { - "SceneName": "Waterways_04", - "DoorName": "left2", - "VanillaTarget": "Waterways_04b[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_04b[right1]": { - "SceneName": "Waterways_04b", - "DoorName": "right1", - "VanillaTarget": "Waterways_04[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_04b[right2]": { - "SceneName": "Waterways_04b", - "DoorName": "right2", - "VanillaTarget": "Waterways_04[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_04b[left1]": { - "SceneName": "Waterways_04b", - "DoorName": "left1", - "VanillaTarget": "Waterways_09[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_05[right1]": { - "SceneName": "Waterways_05", - "DoorName": "right1", - "VanillaTarget": "Abyss_01[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_05[bot1]": { - "SceneName": "Waterways_05", - "DoorName": "bot1", - "VanillaTarget": "Waterways_02[top2]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_05[bot2]": { - "SceneName": "Waterways_05", - "DoorName": "bot2", - "VanillaTarget": "Waterways_15[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_06[right1]": { - "SceneName": "Waterways_06", - "DoorName": "right1", - "VanillaTarget": "Abyss_01[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_06[top1]": { - "SceneName": "Waterways_06", - "DoorName": "top1", - "VanillaTarget": "Waterways_02[bot2]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_07[right1]": { - "SceneName": "Waterways_07", - "DoorName": "right1", - "VanillaTarget": "Waterways_13[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_07[right2]": { - "SceneName": "Waterways_07", - "DoorName": "right2", - "VanillaTarget": "Waterways_13[left2]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_07[left1]": { - "SceneName": "Waterways_07", - "DoorName": "left1", - "VanillaTarget": "Abyss_01[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_07[door1]": { - "SceneName": "Waterways_07", - "DoorName": "door1", - "VanillaTarget": "Ruins_House_03[left2]", - "Direction": "Door", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Waterways_07[top1]": { - "SceneName": "Waterways_07", - "DoorName": "top1", - "VanillaTarget": "Waterways_14[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_08[top1]": { - "SceneName": "Waterways_08", - "DoorName": "top1", - "VanillaTarget": "Waterways_02[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_08[left1]": { - "SceneName": "Waterways_08", - "DoorName": "left1", - "VanillaTarget": "Waterways_12[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_08[left2]": { - "SceneName": "Waterways_08", - "DoorName": "left2", - "VanillaTarget": "GG_Pipeway[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_09[right1]": { - "SceneName": "Waterways_09", - "DoorName": "right1", - "VanillaTarget": "Waterways_04b[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_09[left1]": { - "SceneName": "Waterways_09", - "DoorName": "left1", - "VanillaTarget": "Fungus2_23[right2]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Waterways_12[right1]": { - "SceneName": "Waterways_12", - "DoorName": "right1", - "VanillaTarget": "Waterways_08[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_13[left1]": { - "SceneName": "Waterways_13", - "DoorName": "left1", - "VanillaTarget": "Waterways_07[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_13[left2]": { - "SceneName": "Waterways_13", - "DoorName": "left2", - "VanillaTarget": "Waterways_07[right2]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_14[bot1]": { - "SceneName": "Waterways_14", - "DoorName": "bot1", - "VanillaTarget": "Waterways_07[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Waterways_14[bot2]": { - "SceneName": "Waterways_14", - "DoorName": "bot2", - "VanillaTarget": "Deepnest_East_02[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Waterways_15[top1]": { - "SceneName": "Waterways_15", - "DoorName": "top1", - "VanillaTarget": "Waterways_05[bot2]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "GG_Pipeway[right1]": { - "SceneName": "GG_Pipeway", - "DoorName": "right1", - "VanillaTarget": "Waterways_08[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "GG_Pipeway[left1]": { - "SceneName": "GG_Pipeway", - "DoorName": "left1", - "VanillaTarget": "GG_Waterways[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "GG_Waterways[right1]": { - "SceneName": "GG_Waterways", - "DoorName": "right1", - "VanillaTarget": "GG_Pipeway[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "GG_Waterways[door1]": { - "SceneName": "GG_Waterways", - "DoorName": "door1", - "VanillaTarget": "Room_GG_Shortcut[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_GG_Shortcut[left1]": { - "SceneName": "Room_GG_Shortcut", - "DoorName": "left1", - "VanillaTarget": "GG_Waterways[door1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_GG_Shortcut[top1]": { - "SceneName": "Room_GG_Shortcut", - "DoorName": "top1", - "VanillaTarget": "Ruins1_04[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Ruins1_01[left1]": { - "SceneName": "Ruins1_01", - "DoorName": "left1", - "VanillaTarget": "Fungus2_21[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Ruins1_01[top1]": { - "SceneName": "Ruins1_01", - "DoorName": "top1", - "VanillaTarget": "Ruins1_17[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_01[bot1]": { - "SceneName": "Ruins1_01", - "DoorName": "bot1", - "VanillaTarget": "Ruins1_02[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_02[top1]": { - "SceneName": "Ruins1_02", - "DoorName": "top1", - "VanillaTarget": "Ruins1_01[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_02[bot1]": { - "SceneName": "Ruins1_02", - "DoorName": "bot1", - "VanillaTarget": "Ruins1_03[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_03[top1]": { - "SceneName": "Ruins1_03", - "DoorName": "top1", - "VanillaTarget": "Ruins1_02[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_03[left1]": { - "SceneName": "Ruins1_03", - "DoorName": "left1", - "VanillaTarget": "Ruins1_04[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_03[right1]": { - "SceneName": "Ruins1_03", - "DoorName": "right1", - "VanillaTarget": "Ruins1_05c[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_03[right2]": { - "SceneName": "Ruins1_03", - "DoorName": "right2", - "VanillaTarget": "Ruins1_05b[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_04[right1]": { - "SceneName": "Ruins1_04", - "DoorName": "right1", - "VanillaTarget": "Ruins1_03[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_04[door1]": { - "SceneName": "Ruins1_04", - "DoorName": "door1", - "VanillaTarget": "Room_nailsmith[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_04[bot1]": { - "SceneName": "Ruins1_04", - "DoorName": "bot1", - "VanillaTarget": "Room_GG_Shortcut[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Ruins1_05b[left1]": { - "SceneName": "Ruins1_05b", - "DoorName": "left1", - "VanillaTarget": "Ruins1_03[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_05b[top1]": { - "SceneName": "Ruins1_05b", - "DoorName": "top1", - "VanillaTarget": "Ruins1_05c[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_05b[bot1]": { - "SceneName": "Ruins1_05b", - "DoorName": "bot1", - "VanillaTarget": "Waterways_01[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Ruins1_05b[right1]": { - "SceneName": "Ruins1_05b", - "DoorName": "right1", - "VanillaTarget": "Ruins1_27[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_05c[left2]": { - "SceneName": "Ruins1_05c", - "DoorName": "left2", - "VanillaTarget": "Ruins1_03[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_05c[bot1]": { - "SceneName": "Ruins1_05c", - "DoorName": "bot1", - "VanillaTarget": "Ruins1_05b[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_05c[top1]": { - "SceneName": "Ruins1_05c", - "DoorName": "top1", - "VanillaTarget": "Ruins1_05[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_05c[top2]": { - "SceneName": "Ruins1_05c", - "DoorName": "top2", - "VanillaTarget": "Ruins1_05[bot2]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_05c[top3]": { - "SceneName": "Ruins1_05c", - "DoorName": "top3", - "VanillaTarget": "Ruins1_05[bot3]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_05[bot1]": { - "SceneName": "Ruins1_05", - "DoorName": "bot1", - "VanillaTarget": "Ruins1_05c[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_05[bot2]": { - "SceneName": "Ruins1_05", - "DoorName": "bot2", - "VanillaTarget": "Ruins1_05c[top2]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_05[bot3]": { - "SceneName": "Ruins1_05", - "DoorName": "bot3", - "VanillaTarget": "Ruins1_05c[top3]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_05[right1]": { - "SceneName": "Ruins1_05", - "DoorName": "right1", - "VanillaTarget": "Ruins1_09[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_05[right2]": { - "SceneName": "Ruins1_05", - "DoorName": "right2", - "VanillaTarget": "Ruins1_18[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_05[top1]": { - "SceneName": "Ruins1_05", - "DoorName": "top1", - "VanillaTarget": "Ruins1_31[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_06[left1]": { - "SceneName": "Ruins1_06", - "DoorName": "left1", - "VanillaTarget": "Ruins1_17[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_06[right1]": { - "SceneName": "Ruins1_06", - "DoorName": "right1", - "VanillaTarget": "Ruins1_31[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_09[top1]": { - "SceneName": "Ruins1_09", - "DoorName": "top1", - "VanillaTarget": "Ruins1_23[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_09[left1]": { - "SceneName": "Ruins1_09", - "DoorName": "left1", - "VanillaTarget": "Ruins1_05[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_17[top1]": { - "SceneName": "Ruins1_17", - "DoorName": "top1", - "VanillaTarget": "Ruins1_28[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_17[right1]": { - "SceneName": "Ruins1_17", - "DoorName": "right1", - "VanillaTarget": "Ruins1_06[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_17[bot1]": { - "SceneName": "Ruins1_17", - "DoorName": "bot1", - "VanillaTarget": "Ruins1_01[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_18[left1]": { - "SceneName": "Ruins1_18", - "DoorName": "left1", - "VanillaTarget": "Ruins1_05[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_18[right1]": { - "SceneName": "Ruins1_18", - "DoorName": "right1", - "VanillaTarget": "Ruins2_03b[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_18[right2]": { - "SceneName": "Ruins1_18", - "DoorName": "right2", - "VanillaTarget": "Ruins2_01[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_23[top1]": { - "SceneName": "Ruins1_23", - "DoorName": "top1", - "VanillaTarget": "Ruins1_30[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_23[right1]": { - "SceneName": "Ruins1_23", - "DoorName": "right1", - "VanillaTarget": "Ruins1_25[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_23[right2]": { - "SceneName": "Ruins1_23", - "DoorName": "right2", - "VanillaTarget": "Ruins1_25[left3]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_23[bot1]": { - "SceneName": "Ruins1_23", - "DoorName": "bot1", - "VanillaTarget": "Ruins1_09[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_23[left1]": { - "SceneName": "Ruins1_23", - "DoorName": "left1", - "VanillaTarget": "Ruins1_31[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_24[left1]": { - "SceneName": "Ruins1_24", - "DoorName": "left1", - "VanillaTarget": "Ruins1_32[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_24[right1]": { - "SceneName": "Ruins1_24", - "DoorName": "right1", - "VanillaTarget": "Ruins1_30[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_24[left2]": { - "SceneName": "Ruins1_24", - "DoorName": "left2", - "VanillaTarget": "Ruins1_32[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_24[right2]": { - "SceneName": "Ruins1_24", - "DoorName": "right2", - "VanillaTarget": "Ruins1_30[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_25[left1]": { - "SceneName": "Ruins1_25", - "DoorName": "left1", - "VanillaTarget": "Ruins1_30[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_25[left2]": { - "SceneName": "Ruins1_25", - "DoorName": "left2", - "VanillaTarget": "Ruins1_23[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_25[left3]": { - "SceneName": "Ruins1_25", - "DoorName": "left3", - "VanillaTarget": "Ruins1_23[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_27[left1]": { - "SceneName": "Ruins1_27", - "DoorName": "left1", - "VanillaTarget": "Ruins1_05b[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_27[right1]": { - "SceneName": "Ruins1_27", - "DoorName": "right1", - "VanillaTarget": "Ruins2_01_b[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_28[left1]": { - "SceneName": "Ruins1_28", - "DoorName": "left1", - "VanillaTarget": "Crossroads_49b[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_28[right1]": { - "SceneName": "Ruins1_28", - "DoorName": "right1", - "VanillaTarget": "Ruins1_29[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_28[bot1]": { - "SceneName": "Ruins1_28", - "DoorName": "bot1", - "VanillaTarget": "Ruins1_17[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_29[left1]": { - "SceneName": "Ruins1_29", - "DoorName": "left1", - "VanillaTarget": "Ruins1_28[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_30[left1]": { - "SceneName": "Ruins1_30", - "DoorName": "left1", - "VanillaTarget": "Ruins1_24[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_30[left2]": { - "SceneName": "Ruins1_30", - "DoorName": "left2", - "VanillaTarget": "Ruins1_24[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_30[bot1]": { - "SceneName": "Ruins1_30", - "DoorName": "bot1", - "VanillaTarget": "Ruins1_23[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_30[right1]": { - "SceneName": "Ruins1_30", - "DoorName": "right1", - "VanillaTarget": "Ruins1_25[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_31[bot1]": { - "SceneName": "Ruins1_31", - "DoorName": "bot1", - "VanillaTarget": "Ruins1_05[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_31[left1]": { - "SceneName": "Ruins1_31", - "DoorName": "left1", - "VanillaTarget": "Ruins1_06[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_31[left2]": { - "SceneName": "Ruins1_31", - "DoorName": "left2", - "VanillaTarget": "Ruins1_31b[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_31[left3]": { - "SceneName": "Ruins1_31", - "DoorName": "left3", - "VanillaTarget": "Ruins1_31b[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_31[right1]": { - "SceneName": "Ruins1_31", - "DoorName": "right1", - "VanillaTarget": "Ruins1_23[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_31b[right1]": { - "SceneName": "Ruins1_31b", - "DoorName": "right1", - "VanillaTarget": "Ruins1_31[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_31b[right2]": { - "SceneName": "Ruins1_31b", - "DoorName": "right2", - "VanillaTarget": "Ruins1_31[left3]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_32[right1]": { - "SceneName": "Ruins1_32", - "DoorName": "right1", - "VanillaTarget": "Ruins1_24[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins1_32[right2]": { - "SceneName": "Ruins1_32", - "DoorName": "right2", - "VanillaTarget": "Ruins1_24[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_nailsmith[left1]": { - "SceneName": "Room_nailsmith", - "DoorName": "left1", - "VanillaTarget": "Ruins1_04[door1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_01[top1]": { - "SceneName": "Ruins2_01", - "DoorName": "top1", - "VanillaTarget": "Ruins2_03b[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_01[bot1]": { - "SceneName": "Ruins2_01", - "DoorName": "bot1", - "VanillaTarget": "Ruins2_01_b[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_01[left2]": { - "SceneName": "Ruins2_01", - "DoorName": "left2", - "VanillaTarget": "Ruins1_18[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_01_b[top1]": { - "SceneName": "Ruins2_01_b", - "DoorName": "top1", - "VanillaTarget": "Ruins2_01[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_01_b[left1]": { - "SceneName": "Ruins2_01_b", - "DoorName": "left1", - "VanillaTarget": "Ruins1_27[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_01_b[right1]": { - "SceneName": "Ruins2_01_b", - "DoorName": "right1", - "VanillaTarget": "Ruins2_04[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_03b[top1]": { - "SceneName": "Ruins2_03b", - "DoorName": "top1", - "VanillaTarget": "Ruins2_03[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_03b[top2]": { - "SceneName": "Ruins2_03b", - "DoorName": "top2", - "VanillaTarget": "Ruins2_03[bot2]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_03b[left1]": { - "SceneName": "Ruins2_03b", - "DoorName": "left1", - "VanillaTarget": "Ruins1_18[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_03b[bot1]": { - "SceneName": "Ruins2_03b", - "DoorName": "bot1", - "VanillaTarget": "Ruins2_01[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_03[top1]": { - "SceneName": "Ruins2_03", - "DoorName": "top1", - "VanillaTarget": "Ruins2_Watcher_Room[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_03[bot1]": { - "SceneName": "Ruins2_03", - "DoorName": "bot1", - "VanillaTarget": "Ruins2_03b[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_03[bot2]": { - "SceneName": "Ruins2_03", - "DoorName": "bot2", - "VanillaTarget": "Ruins2_03b[top2]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_04[left1]": { - "SceneName": "Ruins2_04", - "DoorName": "left1", - "VanillaTarget": "Ruins2_01_b[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_04[left2]": { - "SceneName": "Ruins2_04", - "DoorName": "left2", - "VanillaTarget": "Abyss_01[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Ruins2_04[right1]": { - "SceneName": "Ruins2_04", - "DoorName": "right1", - "VanillaTarget": "Ruins2_06[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_04[right2]": { - "SceneName": "Ruins2_04", - "DoorName": "right2", - "VanillaTarget": "Ruins2_06[left2]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_04[door_Ruin_House_01]": { - "SceneName": "Ruins2_04", - "DoorName": "door_Ruin_House_01", - "VanillaTarget": "Ruins_House_01[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_04[door_Ruin_House_02]": { - "SceneName": "Ruins2_04", - "DoorName": "door_Ruin_House_02", - "VanillaTarget": "Ruins_House_02[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_04[door_Ruin_House_03]": { - "SceneName": "Ruins2_04", - "DoorName": "door_Ruin_House_03", - "VanillaTarget": "Ruins_House_03[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_04[door_Ruin_Elevator]": { - "SceneName": "Ruins2_04", - "DoorName": "door_Ruin_Elevator", - "VanillaTarget": "Ruins_Elevator[left1]", - "Direction": "Door", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_05[left1]": { - "SceneName": "Ruins2_05", - "DoorName": "left1", - "VanillaTarget": "Ruins2_10b[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_05[top1]": { - "SceneName": "Ruins2_05", - "DoorName": "top1", - "VanillaTarget": "Ruins2_09[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_05[bot1]": { - "SceneName": "Ruins2_05", - "DoorName": "bot1", - "VanillaTarget": "Ruins2_06[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_06[left1]": { - "SceneName": "Ruins2_06", - "DoorName": "left1", - "VanillaTarget": "Ruins2_04[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_06[left2]": { - "SceneName": "Ruins2_06", - "DoorName": "left2", - "VanillaTarget": "Ruins2_04[right2]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_06[right1]": { - "SceneName": "Ruins2_06", - "DoorName": "right1", - "VanillaTarget": "Ruins2_08[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_06[right2]": { - "SceneName": "Ruins2_06", - "DoorName": "right2", - "VanillaTarget": "Ruins2_07[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_06[top1]": { - "SceneName": "Ruins2_06", - "DoorName": "top1", - "VanillaTarget": "Ruins2_05[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_07[right1]": { - "SceneName": "Ruins2_07", - "DoorName": "right1", - "VanillaTarget": "Deepnest_East_03[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Ruins2_07[left1]": { - "SceneName": "Ruins2_07", - "DoorName": "left1", - "VanillaTarget": "Ruins2_06[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_07[top1]": { - "SceneName": "Ruins2_07", - "DoorName": "top1", - "VanillaTarget": "Ruins2_11_b[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_08[left1]": { - "SceneName": "Ruins2_08", - "DoorName": "left1", - "VanillaTarget": "Ruins2_06[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_09[bot1]": { - "SceneName": "Ruins2_09", - "DoorName": "bot1", - "VanillaTarget": "Ruins2_05[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_10[right1]": { - "SceneName": "Ruins2_10", - "DoorName": "right1", - "VanillaTarget": "RestingGrounds_10[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_10[left1]": { - "SceneName": "Ruins2_10", - "DoorName": "left1", - "VanillaTarget": "RestingGrounds_06[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_10b[right1]": { - "SceneName": "Ruins2_10b", - "DoorName": "right1", - "VanillaTarget": "Deepnest_East_09[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Ruins2_10b[right2]": { - "SceneName": "Ruins2_10b", - "DoorName": "right2", - "VanillaTarget": "Ruins2_05[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_10b[left1]": { - "SceneName": "Ruins2_10b", - "DoorName": "left1", - "VanillaTarget": "Ruins_Bathhouse[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_11_b[right1]": { - "SceneName": "Ruins2_11_b", - "DoorName": "right1", - "VanillaTarget": "Deepnest_East_07[left2]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Ruins2_11_b[left1]": { - "SceneName": "Ruins2_11_b", - "DoorName": "left1", - "VanillaTarget": "Ruins2_11[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_11_b[bot1]": { - "SceneName": "Ruins2_11_b", - "DoorName": "bot1", - "VanillaTarget": "Ruins2_07[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_11[right1]": { - "SceneName": "Ruins2_11", - "DoorName": "right1", - "VanillaTarget": "Ruins2_11_b[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins2_Watcher_Room[bot1]": { - "SceneName": "Ruins2_Watcher_Room", - "DoorName": "bot1", - "VanillaTarget": "Ruins2_03[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins_House_01[left1]": { - "SceneName": "Ruins_House_01", - "DoorName": "left1", - "VanillaTarget": "Ruins2_04[door_Ruin_House_01]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins_House_02[left1]": { - "SceneName": "Ruins_House_02", - "DoorName": "left1", - "VanillaTarget": "Ruins2_04[door_Ruin_House_02]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins_House_03[left1]": { - "SceneName": "Ruins_House_03", - "DoorName": "left1", - "VanillaTarget": "Ruins2_04[door_Ruin_House_03]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins_House_03[left2]": { - "SceneName": "Ruins_House_03", - "DoorName": "left2", - "VanillaTarget": "Waterways_07[door1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Ruins_Elevator[left1]": { - "SceneName": "Ruins_Elevator", - "DoorName": "left1", - "VanillaTarget": "Ruins2_04[door_Ruin_Elevator]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins_Elevator[left2]": { - "SceneName": "Ruins_Elevator", - "DoorName": "left2", - "VanillaTarget": "Ruins_Bathhouse[door1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins_Bathhouse[door1]": { - "SceneName": "Ruins_Bathhouse", - "DoorName": "door1", - "VanillaTarget": "Ruins_Elevator[left2]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Ruins_Bathhouse[right1]": { - "SceneName": "Ruins_Bathhouse", - "DoorName": "right1", - "VanillaTarget": "Ruins2_10b[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_02[right1]": { - "SceneName": "RestingGrounds_02", - "DoorName": "right1", - "VanillaTarget": "RestingGrounds_04[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_02[left1]": { - "SceneName": "RestingGrounds_02", - "DoorName": "left1", - "VanillaTarget": "Crossroads_46b[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_02[bot1]": { - "SceneName": "RestingGrounds_02", - "DoorName": "bot1", - "VanillaTarget": "RestingGrounds_06[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_02[top1]": { - "SceneName": "RestingGrounds_02", - "DoorName": "top1", - "VanillaTarget": null, - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "OneWayOut" - }, - "RestingGrounds_04[left1]": { - "SceneName": "RestingGrounds_04", - "DoorName": "left1", - "VanillaTarget": "RestingGrounds_02[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_04[right1]": { - "SceneName": "RestingGrounds_04", - "DoorName": "right1", - "VanillaTarget": "RestingGrounds_05[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_05[left1]": { - "SceneName": "RestingGrounds_05", - "DoorName": "left1", - "VanillaTarget": "RestingGrounds_04[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_05[left2]": { - "SceneName": "RestingGrounds_05", - "DoorName": "left2", - "VanillaTarget": "RestingGrounds_07[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_05[left3]": { - "SceneName": "RestingGrounds_05", - "DoorName": "left3", - "VanillaTarget": "RestingGrounds_17[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_05[right1]": { - "SceneName": "RestingGrounds_05", - "DoorName": "right1", - "VanillaTarget": "RestingGrounds_08[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_05[right2]": { - "SceneName": "RestingGrounds_05", - "DoorName": "right2", - "VanillaTarget": "RestingGrounds_09[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_05[bot1]": { - "SceneName": "RestingGrounds_05", - "DoorName": "bot1", - "VanillaTarget": "RestingGrounds_10[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_06[left1]": { - "SceneName": "RestingGrounds_06", - "DoorName": "left1", - "VanillaTarget": "Crossroads_50[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_06[right1]": { - "SceneName": "RestingGrounds_06", - "DoorName": "right1", - "VanillaTarget": "Ruins2_10[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_06[top1]": { - "SceneName": "RestingGrounds_06", - "DoorName": "top1", - "VanillaTarget": "RestingGrounds_02[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_07[right1]": { - "SceneName": "RestingGrounds_07", - "DoorName": "right1", - "VanillaTarget": "RestingGrounds_05[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_08[left1]": { - "SceneName": "RestingGrounds_08", - "DoorName": "left1", - "VanillaTarget": "RestingGrounds_05[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_09[left1]": { - "SceneName": "RestingGrounds_09", - "DoorName": "left1", - "VanillaTarget": "RestingGrounds_05[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_10[left1]": { - "SceneName": "RestingGrounds_10", - "DoorName": "left1", - "VanillaTarget": "Ruins2_10[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_10[top1]": { - "SceneName": "RestingGrounds_10", - "DoorName": "top1", - "VanillaTarget": "RestingGrounds_05[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_10[top2]": { - "SceneName": "RestingGrounds_10", - "DoorName": "top2", - "VanillaTarget": "RestingGrounds_12[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_12[bot1]": { - "SceneName": "RestingGrounds_12", - "DoorName": "bot1", - "VanillaTarget": "RestingGrounds_10[top2]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_12[door_Mansion]": { - "SceneName": "RestingGrounds_12", - "DoorName": "door_Mansion", - "VanillaTarget": "Room_Mansion[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "RestingGrounds_17[right1]": { - "SceneName": "RestingGrounds_17", - "DoorName": "right1", - "VanillaTarget": "RestingGrounds_05[left3]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_Mansion[left1]": { - "SceneName": "Room_Mansion", - "DoorName": "left1", - "VanillaTarget": "RestingGrounds_12[door_Mansion]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_01[bot1]": { - "SceneName": "Mines_01", - "DoorName": "bot1", - "VanillaTarget": "Mines_02[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_01[left1]": { - "SceneName": "Mines_01", - "DoorName": "left1", - "VanillaTarget": "Crossroads_45[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Mines_02[top1]": { - "SceneName": "Mines_02", - "DoorName": "top1", - "VanillaTarget": "Mines_01[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_02[top2]": { - "SceneName": "Mines_02", - "DoorName": "top2", - "VanillaTarget": "Mines_03[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_02[left1]": { - "SceneName": "Mines_02", - "DoorName": "left1", - "VanillaTarget": "Mines_33[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Mines_02[right1]": { - "SceneName": "Mines_02", - "DoorName": "right1", - "VanillaTarget": "Mines_29[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_03[right1]": { - "SceneName": "Mines_03", - "DoorName": "right1", - "VanillaTarget": "Mines_17[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_03[bot1]": { - "SceneName": "Mines_03", - "DoorName": "bot1", - "VanillaTarget": "Mines_02[top2]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_03[top1]": { - "SceneName": "Mines_03", - "DoorName": "top1", - "VanillaTarget": "Mines_05[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_04[right1]": { - "SceneName": "Mines_04", - "DoorName": "right1", - "VanillaTarget": "Mines_07[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_04[top1]": { - "SceneName": "Mines_04", - "DoorName": "top1", - "VanillaTarget": "Mines_37[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_04[left1]": { - "SceneName": "Mines_04", - "DoorName": "left1", - "VanillaTarget": "Mines_17[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_04[left2]": { - "SceneName": "Mines_04", - "DoorName": "left2", - "VanillaTarget": "Mines_29[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_04[left3]": { - "SceneName": "Mines_04", - "DoorName": "left3", - "VanillaTarget": "Mines_29[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_05[right1]": { - "SceneName": "Mines_05", - "DoorName": "right1", - "VanillaTarget": "Mines_19[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_05[top1]": { - "SceneName": "Mines_05", - "DoorName": "top1", - "VanillaTarget": "Mines_11[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_05[bot1]": { - "SceneName": "Mines_05", - "DoorName": "bot1", - "VanillaTarget": "Mines_03[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_05[left1]": { - "SceneName": "Mines_05", - "DoorName": "left1", - "VanillaTarget": "Mines_30[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_05[left2]": { - "SceneName": "Mines_05", - "DoorName": "left2", - "VanillaTarget": "Mines_06[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_06[right1]": { - "SceneName": "Mines_06", - "DoorName": "right1", - "VanillaTarget": "Mines_05[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_06[left1]": { - "SceneName": "Mines_06", - "DoorName": "left1", - "VanillaTarget": "Mines_36[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_07[right1]": { - "SceneName": "Mines_07", - "DoorName": "right1", - "VanillaTarget": "Mines_28[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_07[left1]": { - "SceneName": "Mines_07", - "DoorName": "left1", - "VanillaTarget": "Mines_04[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_10[right1]": { - "SceneName": "Mines_10", - "DoorName": "right1", - "VanillaTarget": "Mines_30[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_10[left1]": { - "SceneName": "Mines_10", - "DoorName": "left1", - "VanillaTarget": "Town[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Mines_10[bot1]": { - "SceneName": "Mines_10", - "DoorName": "bot1", - "VanillaTarget": "Mines_16[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_11[right1]": { - "SceneName": "Mines_11", - "DoorName": "right1", - "VanillaTarget": "Mines_18[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_11[top1]": { - "SceneName": "Mines_11", - "DoorName": "top1", - "VanillaTarget": "Mines_13[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_11[bot1]": { - "SceneName": "Mines_11", - "DoorName": "bot1", - "VanillaTarget": "Mines_05[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_13[right1]": { - "SceneName": "Mines_13", - "DoorName": "right1", - "VanillaTarget": "Mines_20[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_13[top1]": { - "SceneName": "Mines_13", - "DoorName": "top1", - "VanillaTarget": null, - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "OneWayOut" - }, - "Mines_13[bot1]": { - "SceneName": "Mines_13", - "DoorName": "bot1", - "VanillaTarget": "Mines_11[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_16[top1]": { - "SceneName": "Mines_16", - "DoorName": "top1", - "VanillaTarget": "Mines_10[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_17[right1]": { - "SceneName": "Mines_17", - "DoorName": "right1", - "VanillaTarget": "Mines_04[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_17[left1]": { - "SceneName": "Mines_17", - "DoorName": "left1", - "VanillaTarget": "Mines_03[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_18[top1]": { - "SceneName": "Mines_18", - "DoorName": "top1", - "VanillaTarget": "Mines_32[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_18[left1]": { - "SceneName": "Mines_18", - "DoorName": "left1", - "VanillaTarget": "Mines_11[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_18[right1]": { - "SceneName": "Mines_18", - "DoorName": "right1", - "VanillaTarget": "Mines_20[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_19[left1]": { - "SceneName": "Mines_19", - "DoorName": "left1", - "VanillaTarget": "Mines_05[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_19[right1]": { - "SceneName": "Mines_19", - "DoorName": "right1", - "VanillaTarget": "Mines_20[left3]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_20[left1]": { - "SceneName": "Mines_20", - "DoorName": "left1", - "VanillaTarget": "Mines_13[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_20[left2]": { - "SceneName": "Mines_20", - "DoorName": "left2", - "VanillaTarget": "Mines_18[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_20[left3]": { - "SceneName": "Mines_20", - "DoorName": "left3", - "VanillaTarget": "Mines_19[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_20[bot1]": { - "SceneName": "Mines_20", - "DoorName": "bot1", - "VanillaTarget": "Mines_37[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_20[right1]": { - "SceneName": "Mines_20", - "DoorName": "right1", - "VanillaTarget": "Mines_23[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_20[right2]": { - "SceneName": "Mines_20", - "DoorName": "right2", - "VanillaTarget": "Mines_31[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_23[left1]": { - "SceneName": "Mines_23", - "DoorName": "left1", - "VanillaTarget": "Mines_20[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_23[right1]": { - "SceneName": "Mines_23", - "DoorName": "right1", - "VanillaTarget": "Mines_25[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_23[right2]": { - "SceneName": "Mines_23", - "DoorName": "right2", - "VanillaTarget": "Mines_24[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_23[top1]": { - "SceneName": "Mines_23", - "DoorName": "top1", - "VanillaTarget": null, - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "OneWayOut" - }, - "Mines_24[left1]": { - "SceneName": "Mines_24", - "DoorName": "left1", - "VanillaTarget": "Mines_23[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_25[left1]": { - "SceneName": "Mines_25", - "DoorName": "left1", - "VanillaTarget": "Mines_23[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_25[top1]": { - "SceneName": "Mines_25", - "DoorName": "top1", - "VanillaTarget": "Mines_34[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_28[left1]": { - "SceneName": "Mines_28", - "DoorName": "left1", - "VanillaTarget": "Mines_07[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_28[bot1]": { - "SceneName": "Mines_28", - "DoorName": "bot1", - "VanillaTarget": "RestingGrounds_02[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "OneWayIn" - }, - "Mines_28[door1]": { - "SceneName": "Mines_28", - "DoorName": "door1", - "VanillaTarget": "Mines_35[left1]", - "Direction": "Door", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_29[left1]": { - "SceneName": "Mines_29", - "DoorName": "left1", - "VanillaTarget": "Mines_02[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_29[right1]": { - "SceneName": "Mines_29", - "DoorName": "right1", - "VanillaTarget": "Mines_04[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_29[right2]": { - "SceneName": "Mines_29", - "DoorName": "right2", - "VanillaTarget": "Mines_04[left3]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_30[left1]": { - "SceneName": "Mines_30", - "DoorName": "left1", - "VanillaTarget": "Mines_10[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_30[right1]": { - "SceneName": "Mines_30", - "DoorName": "right1", - "VanillaTarget": "Mines_05[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_31[left1]": { - "SceneName": "Mines_31", - "DoorName": "left1", - "VanillaTarget": "Mines_20[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_32[bot1]": { - "SceneName": "Mines_32", - "DoorName": "bot1", - "VanillaTarget": "Mines_18[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_33[right1]": { - "SceneName": "Mines_33", - "DoorName": "right1", - "VanillaTarget": "Mines_02[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Mines_33[left1]": { - "SceneName": "Mines_33", - "DoorName": "left1", - "VanillaTarget": "Crossroads_03[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_34[bot1]": { - "SceneName": "Mines_34", - "DoorName": "bot1", - "VanillaTarget": "Mines_25[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_34[bot2]": { - "SceneName": "Mines_34", - "DoorName": "bot2", - "VanillaTarget": "Mines_23[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "OneWayIn" - }, - "Mines_34[left1]": { - "SceneName": "Mines_34", - "DoorName": "left1", - "VanillaTarget": "Mines_13[top1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "OneWayIn" - }, - "Mines_35[left1]": { - "SceneName": "Mines_35", - "DoorName": "left1", - "VanillaTarget": "Mines_28[door1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_36[right1]": { - "SceneName": "Mines_36", - "DoorName": "right1", - "VanillaTarget": "Mines_06[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_37[bot1]": { - "SceneName": "Mines_37", - "DoorName": "bot1", - "VanillaTarget": "Mines_04[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Mines_37[top1]": { - "SceneName": "Mines_37", - "DoorName": "top1", - "VanillaTarget": "Mines_20[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_04[left1]": { - "SceneName": "Fungus3_04", - "DoorName": "left1", - "VanillaTarget": "Fungus3_21[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_04[left2]": { - "SceneName": "Fungus3_04", - "DoorName": "left2", - "VanillaTarget": "Fungus3_13[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_04[right1]": { - "SceneName": "Fungus3_04", - "DoorName": "right1", - "VanillaTarget": "Fungus3_34[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_04[right2]": { - "SceneName": "Fungus3_04", - "DoorName": "right2", - "VanillaTarget": "Fungus3_05[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_05[left1]": { - "SceneName": "Fungus3_05", - "DoorName": "left1", - "VanillaTarget": "Fungus3_04[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_05[right1]": { - "SceneName": "Fungus3_05", - "DoorName": "right1", - "VanillaTarget": "Fungus1_24[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_05[right2]": { - "SceneName": "Fungus3_05", - "DoorName": "right2", - "VanillaTarget": "Fungus3_11[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_08[left1]": { - "SceneName": "Fungus3_08", - "DoorName": "left1", - "VanillaTarget": "Deepnest_43[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_08[right1]": { - "SceneName": "Fungus3_08", - "DoorName": "right1", - "VanillaTarget": "Fungus3_11[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_08[top1]": { - "SceneName": "Fungus3_08", - "DoorName": "top1", - "VanillaTarget": "Fungus3_10[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_10[top1]": { - "SceneName": "Fungus3_10", - "DoorName": "top1", - "VanillaTarget": "Fungus3_13[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_10[bot1]": { - "SceneName": "Fungus3_10", - "DoorName": "bot1", - "VanillaTarget": "Fungus3_08[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_11[left1]": { - "SceneName": "Fungus3_11", - "DoorName": "left1", - "VanillaTarget": "Fungus3_05[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_11[left2]": { - "SceneName": "Fungus3_11", - "DoorName": "left2", - "VanillaTarget": "Fungus3_08[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_11[right1]": { - "SceneName": "Fungus3_11", - "DoorName": "right1", - "VanillaTarget": "Fungus3_39[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_13[left1]": { - "SceneName": "Fungus3_13", - "DoorName": "left1", - "VanillaTarget": "Fungus1_23[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_13[left2]": { - "SceneName": "Fungus3_13", - "DoorName": "left2", - "VanillaTarget": "Fungus3_40[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_13[left3]": { - "SceneName": "Fungus3_13", - "DoorName": "left3", - "VanillaTarget": "Fungus3_49[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_13[bot1]": { - "SceneName": "Fungus3_13", - "DoorName": "bot1", - "VanillaTarget": "Fungus3_10[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_13[right1]": { - "SceneName": "Fungus3_13", - "DoorName": "right1", - "VanillaTarget": "Fungus3_04[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_21[right1]": { - "SceneName": "Fungus3_21", - "DoorName": "right1", - "VanillaTarget": "Fungus3_04[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_21[top1]": { - "SceneName": "Fungus3_21", - "DoorName": "top1", - "VanillaTarget": "Fungus3_22[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_22[right1]": { - "SceneName": "Fungus3_22", - "DoorName": "right1", - "VanillaTarget": "Fungus1_13[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus3_22[left1]": { - "SceneName": "Fungus3_22", - "DoorName": "left1", - "VanillaTarget": "Fungus3_23[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_22[bot1]": { - "SceneName": "Fungus3_22", - "DoorName": "bot1", - "VanillaTarget": "Fungus3_21[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_23[right1]": { - "SceneName": "Fungus3_23", - "DoorName": "right1", - "VanillaTarget": "Fungus3_22[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_23[left1]": { - "SceneName": "Fungus3_23", - "DoorName": "left1", - "VanillaTarget": "Fungus3_48[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_34[right1]": { - "SceneName": "Fungus3_34", - "DoorName": "right1", - "VanillaTarget": "Fungus3_03[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus3_34[left1]": { - "SceneName": "Fungus3_34", - "DoorName": "left1", - "VanillaTarget": "Fungus3_04[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_34[top1]": { - "SceneName": "Fungus3_34", - "DoorName": "top1", - "VanillaTarget": "Fungus3_44[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus3_39[right1]": { - "SceneName": "Fungus3_39", - "DoorName": "right1", - "VanillaTarget": "Deepnest_01[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Fungus3_39[left1]": { - "SceneName": "Fungus3_39", - "DoorName": "left1", - "VanillaTarget": "Fungus3_11[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_40[right1]": { - "SceneName": "Fungus3_40", - "DoorName": "right1", - "VanillaTarget": "Fungus3_13[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_40[top1]": { - "SceneName": "Fungus3_40", - "DoorName": "top1", - "VanillaTarget": "Fungus3_48[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_48[right1]": { - "SceneName": "Fungus3_48", - "DoorName": "right1", - "VanillaTarget": "Fungus3_23[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_48[right2]": { - "SceneName": "Fungus3_48", - "DoorName": "right2", - "VanillaTarget": "Fungus1_23[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_48[door1]": { - "SceneName": "Fungus3_48", - "DoorName": "door1", - "VanillaTarget": "Room_Queen[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_48[bot1]": { - "SceneName": "Fungus3_48", - "DoorName": "bot1", - "VanillaTarget": "Fungus3_40[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_49[right1]": { - "SceneName": "Fungus3_49", - "DoorName": "right1", - "VanillaTarget": "Fungus3_13[left3]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Fungus3_50[right1]": { - "SceneName": "Fungus3_50", - "DoorName": "right1", - "VanillaTarget": "Deepnest_43[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_Queen[left1]": { - "SceneName": "Room_Queen", - "DoorName": "left1", - "VanillaTarget": "Fungus3_48[door1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Cliffs_01[right1]": { - "SceneName": "Cliffs_01", - "DoorName": "right1", - "VanillaTarget": "Cliffs_02[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Cliffs_01[right2]": { - "SceneName": "Cliffs_01", - "DoorName": "right2", - "VanillaTarget": "Cliffs_04[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Cliffs_01[right3]": { - "SceneName": "Cliffs_01", - "DoorName": "right3", - "VanillaTarget": "Fungus1_28[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Cliffs_01[right4]": { - "SceneName": "Cliffs_01", - "DoorName": "right4", - "VanillaTarget": "Cliffs_06[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Cliffs_02[right1]": { - "SceneName": "Cliffs_02", - "DoorName": "right1", - "VanillaTarget": "Town[top1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "OneWayIn" - }, - "Cliffs_02[bot1]": { - "SceneName": "Cliffs_02", - "DoorName": "bot1", - "VanillaTarget": "Tutorial_01[top2]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "Both" - }, - "Cliffs_02[bot2]": { - "SceneName": "Cliffs_02", - "DoorName": "bot2", - "VanillaTarget": "Tutorial_01[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": true, - "Sides": "OneWayIn" - }, - "Cliffs_02[door1]": { - "SceneName": "Cliffs_02", - "DoorName": "door1", - "VanillaTarget": "Room_nailmaster[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Cliffs_02[left1]": { - "SceneName": "Cliffs_02", - "DoorName": "left1", - "VanillaTarget": "Cliffs_01[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Cliffs_02[left2]": { - "SceneName": "Cliffs_02", - "DoorName": "left2", - "VanillaTarget": "Cliffs_03[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Cliffs_03[right1]": { - "SceneName": "Cliffs_03", - "DoorName": "right1", - "VanillaTarget": "Cliffs_02[left2]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Cliffs_04[right1]": { - "SceneName": "Cliffs_04", - "DoorName": "right1", - "VanillaTarget": "Cliffs_05[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Cliffs_04[left1]": { - "SceneName": "Cliffs_04", - "DoorName": "left1", - "VanillaTarget": "Cliffs_01[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Cliffs_05[left1]": { - "SceneName": "Cliffs_05", - "DoorName": "left1", - "VanillaTarget": "Cliffs_04[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Cliffs_06[left1]": { - "SceneName": "Cliffs_06", - "DoorName": "left1", - "VanillaTarget": "Cliffs_01[right4]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "Room_nailmaster[left1]": { - "SceneName": "Room_nailmaster", - "DoorName": "left1", - "VanillaTarget": "Cliffs_02[door1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_01[left1]": { - "SceneName": "White_Palace_01", - "DoorName": "left1", - "VanillaTarget": "White_Palace_11[door2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_01[right1]": { - "SceneName": "White_Palace_01", - "DoorName": "right1", - "VanillaTarget": "White_Palace_02[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_01[top1]": { - "SceneName": "White_Palace_01", - "DoorName": "top1", - "VanillaTarget": "White_Palace_03_hub[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_02[left1]": { - "SceneName": "White_Palace_02", - "DoorName": "left1", - "VanillaTarget": "White_Palace_01[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_03_hub[left1]": { - "SceneName": "White_Palace_03_hub", - "DoorName": "left1", - "VanillaTarget": "White_Palace_14[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_03_hub[left2]": { - "SceneName": "White_Palace_03_hub", - "DoorName": "left2", - "VanillaTarget": "White_Palace_04[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_03_hub[right1]": { - "SceneName": "White_Palace_03_hub", - "DoorName": "right1", - "VanillaTarget": "White_Palace_15[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_03_hub[top1]": { - "SceneName": "White_Palace_03_hub", - "DoorName": "top1", - "VanillaTarget": "White_Palace_06[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_03_hub[bot1]": { - "SceneName": "White_Palace_03_hub", - "DoorName": "bot1", - "VanillaTarget": "White_Palace_01[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_04[top1]": { - "SceneName": "White_Palace_04", - "DoorName": "top1", - "VanillaTarget": "White_Palace_14[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_04[right2]": { - "SceneName": "White_Palace_04", - "DoorName": "right2", - "VanillaTarget": "White_Palace_03_hub[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_05[left1]": { - "SceneName": "White_Palace_05", - "DoorName": "left1", - "VanillaTarget": "White_Palace_15[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_05[left2]": { - "SceneName": "White_Palace_05", - "DoorName": "left2", - "VanillaTarget": "White_Palace_15[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_05[right1]": { - "SceneName": "White_Palace_05", - "DoorName": "right1", - "VanillaTarget": "White_Palace_16[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_05[right2]": { - "SceneName": "White_Palace_05", - "DoorName": "right2", - "VanillaTarget": "White_Palace_16[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_06[left1]": { - "SceneName": "White_Palace_06", - "DoorName": "left1", - "VanillaTarget": "White_Palace_18[right1]", - "Direction": "Left", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_06[top1]": { - "SceneName": "White_Palace_06", - "DoorName": "top1", - "VanillaTarget": "White_Palace_07[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_06[bot1]": { - "SceneName": "White_Palace_06", - "DoorName": "bot1", - "VanillaTarget": "White_Palace_03_hub[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_07[top1]": { - "SceneName": "White_Palace_07", - "DoorName": "top1", - "VanillaTarget": "White_Palace_12[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_07[bot1]": { - "SceneName": "White_Palace_07", - "DoorName": "bot1", - "VanillaTarget": "White_Palace_06[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_08[left1]": { - "SceneName": "White_Palace_08", - "DoorName": "left1", - "VanillaTarget": "White_Palace_13[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_08[right1]": { - "SceneName": "White_Palace_08", - "DoorName": "right1", - "VanillaTarget": "White_Palace_13[left3]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_09[right1]": { - "SceneName": "White_Palace_09", - "DoorName": "right1", - "VanillaTarget": "White_Palace_13[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_11[door2]": { - "SceneName": "White_Palace_11", - "DoorName": "door2", - "VanillaTarget": "White_Palace_01[left1]", - "Direction": "Door", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_12[right1]": { - "SceneName": "White_Palace_12", - "DoorName": "right1", - "VanillaTarget": "White_Palace_13[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_12[bot1]": { - "SceneName": "White_Palace_12", - "DoorName": "bot1", - "VanillaTarget": "White_Palace_07[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_13[right1]": { - "SceneName": "White_Palace_13", - "DoorName": "right1", - "VanillaTarget": "White_Palace_08[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_13[left1]": { - "SceneName": "White_Palace_13", - "DoorName": "left1", - "VanillaTarget": "White_Palace_09[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_13[left2]": { - "SceneName": "White_Palace_13", - "DoorName": "left2", - "VanillaTarget": "White_Palace_12[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_13[left3]": { - "SceneName": "White_Palace_13", - "DoorName": "left3", - "VanillaTarget": "White_Palace_08[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_14[bot1]": { - "SceneName": "White_Palace_14", - "DoorName": "bot1", - "VanillaTarget": "White_Palace_04[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_14[right1]": { - "SceneName": "White_Palace_14", - "DoorName": "right1", - "VanillaTarget": "White_Palace_03_hub[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_15[left1]": { - "SceneName": "White_Palace_15", - "DoorName": "left1", - "VanillaTarget": "White_Palace_03_hub[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_15[right1]": { - "SceneName": "White_Palace_15", - "DoorName": "right1", - "VanillaTarget": "White_Palace_05[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_15[right2]": { - "SceneName": "White_Palace_15", - "DoorName": "right2", - "VanillaTarget": "White_Palace_05[left2]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_16[left1]": { - "SceneName": "White_Palace_16", - "DoorName": "left1", - "VanillaTarget": "White_Palace_05[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_16[left2]": { - "SceneName": "White_Palace_16", - "DoorName": "left2", - "VanillaTarget": "White_Palace_05[right2]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_17[right1]": { - "SceneName": "White_Palace_17", - "DoorName": "right1", - "VanillaTarget": "White_Palace_19[left1]", - "Direction": "Right", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_17[bot1]": { - "SceneName": "White_Palace_17", - "DoorName": "bot1", - "VanillaTarget": "White_Palace_18[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_18[top1]": { - "SceneName": "White_Palace_18", - "DoorName": "top1", - "VanillaTarget": "White_Palace_17[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_18[right1]": { - "SceneName": "White_Palace_18", - "DoorName": "right1", - "VanillaTarget": "White_Palace_06[left1]", - "Direction": "Right", - "IsTitledAreaTransition": true, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_19[top1]": { - "SceneName": "White_Palace_19", - "DoorName": "top1", - "VanillaTarget": "White_Palace_20[bot1]", - "Direction": "Top", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_19[left1]": { - "SceneName": "White_Palace_19", - "DoorName": "left1", - "VanillaTarget": "White_Palace_17[right1]", - "Direction": "Left", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - }, - "White_Palace_20[bot1]": { - "SceneName": "White_Palace_20", - "DoorName": "bot1", - "VanillaTarget": "White_Palace_19[top1]", - "Direction": "Bot", - "IsTitledAreaTransition": false, - "IsMapAreaTransition": false, - "Sides": "Both" - } -} \ No newline at end of file diff --git a/RandomizerMod/Resources/Logic/items.json b/RandomizerMod/Resources/Logic/items.json deleted file mode 100644 index e21bde8..0000000 --- a/RandomizerMod/Resources/Logic/items.json +++ /dev/null @@ -1,998 +0,0 @@ -[ - { - "Effect": "DREAMER++ >> Lurien++", - "Name": "Lurien" - }, - { - "Effect": "DREAMER++ >> Monomon++", - "Name": "Monomon" - }, - { - "Effect": "DREAMER++ >> Herrah++", - "Name": "Herrah" - }, - { - "Effect": "World_Sense++", - "Name": "World_Sense" - }, - { - "Effect": "DREAMER++", - "Name": "Dreamer" - }, - { - "Effect": "LEFTDASH++ >> RIGHTDASH++", - "Name": "Mothwing_Cloak" - }, - { - "Effect": "LEFTCLAW++ >> RIGHTCLAW++", - "Name": "Mantis_Claw" - }, - { - "Effect": "LEFTSUPERDASH++ >> RIGHTSUPERDASH++", - "Name": "Crystal_Heart" - }, - { - "Effect": "WINGS++", - "Name": "Monarch_Wings" - }, - { - "Effect": "*Mothwing_Cloak", - "Name": "Shade_Cloak" - }, - { - "Effect": "ACID++", - "Name": "Isma's_Tear" - }, - { - "Effect": "DREAMNAIL++", - "Name": "Dream_Nail" - }, - { - "Effect": "DREAMNAIL++", - "Name": "Dream_Gate" - }, - { - "Effect": "DREAMNAIL++", - "Name": "Awoken_Dream_Nail" - }, - { - "Effect": "FIREBALL++ >> SPELLS++", - "Name": "Vengeful_Spirit" - }, - { - "Effect": "*Vengeful_Spirit", - "Name": "Shade_Soul" - }, - { - "Effect": "QUAKE++ >> SPELLS++", - "Name": "Desolate_Dive" - }, - { - "Effect": "*Desolate_Dive", - "Name": "Descending_Dark" - }, - { - "Effect": "SCREAM++ >> SPELLS++", - "Name": "Howling_Wraiths" - }, - { - "Effect": "*Howling_Wraiths", - "Name": "Abyss_Shriek" - }, - { - "Effect": "Cyclone_Slash++", - "Name": "Cyclone_Slash" - }, - { - "Effect": "Dash_Slash++", - "Name": "Dash_Slash" - }, - { - "Effect": "Great_Slash++", - "Name": "Great_Slash" - }, - { - "Effect": "FOCUS++", - "Name": "Focus" - }, - { - "Effect": "SWIM++", - "Name": "Swim" - }, - { - "Effect": "`Gathering_Swarm<1` => CHARMS++ >> Gathering_Swarm++", - "Name": "Gathering_Swarm" - }, - { - "Effect": "`Wayward_Compass<1` => CHARMS++ >> Wayward_Compass++", - "Name": "Wayward_Compass" - }, - { - "Effect": "`Grubsong<1` => CHARMS++ >> Grubsong++", - "Name": "Grubsong" - }, - { - "Effect": "`Stalwart_Shell<1` => CHARMS++ >> Stalwart_Shell++", - "Name": "Stalwart_Shell" - }, - { - "Effect": "`Baldur_Shell<1` => CHARMS++ >> Baldur_Shell++", - "Name": "Baldur_Shell" - }, - { - "Effect": "`Fury_of_the_Fallen<1` => CHARMS++ >> Fury_of_the_Fallen++", - "Name": "Fury_of_the_Fallen" - }, - { - "Effect": "`Quick_Focus<1` => CHARMS++ >> Quick_Focus++", - "Name": "Quick_Focus" - }, - { - "Effect": "`Lifeblood_Heart<1` => CHARMS++ >> Lifeblood_Heart++", - "Name": "Lifeblood_Heart" - }, - { - "Effect": "`Lifeblood_Core<1` => CHARMS++ >> Lifeblood_Core++", - "Name": "Lifeblood_Core" - }, - { - "Effect": "`Defender's_Crest<1` => CHARMS++ >> Defender's_Crest++", - "Name": "Defender's_Crest" - }, - { - "Effect": "`Flukenest<1` => CHARMS++ >> Flukenest++", - "Name": "Flukenest" - }, - { - "Effect": "`Thorns_of_Agony<1` => CHARMS++ >> Thorns_of_Agony++", - "Name": "Thorns_of_Agony" - }, - { - "Effect": "`Mark_of_Pride<1` => CHARMS++ >> Mark_of_Pride++", - "Name": "Mark_of_Pride" - }, - { - "Effect": "`Steady_Body<1` => CHARMS++ >> Steady_Body++", - "Name": "Steady_Body" - }, - { - "Effect": "`Heavy_Blow<1` => CHARMS++ >> Heavy_Blow++", - "Name": "Heavy_Blow" - }, - { - "Effect": "`Sharp_Shadow<1` => CHARMS++ >> Sharp_Shadow++", - "Name": "Sharp_Shadow" - }, - { - "Effect": "`Spore_Shroom<1` => CHARMS++ >> Spore_Shroom++", - "Name": "Spore_Shroom" - }, - { - "Effect": "`Longnail<1` => CHARMS++ >> Longnail++", - "Name": "Longnail" - }, - { - "Effect": "`Shaman_Stone<1` => CHARMS++ >> Shaman_Stone++", - "Name": "Shaman_Stone" - }, - { - "Effect": "`Soul_Catcher<1` => CHARMS++ >> Soul_Catcher++", - "Name": "Soul_Catcher" - }, - { - "Effect": "`Soul_Eater<1` => CHARMS++ >> Soul_Eater++", - "Name": "Soul_Eater" - }, - { - "Effect": "`Glowing_Womb<1` => CHARMS++ >> Glowing_Womb++", - "Name": "Glowing_Womb" - }, - { - "Effect": "`Fragile_Heart<1` => CHARMS++ >> Fragile_Heart++", - "Name": "Fragile_Heart" - }, - { - "Effect": "*Fragile_Heart", - "Name": "Unbreakable_Heart" - }, - { - "Effect": "`Fragile_Greed<1` => CHARMS++ >> Fragile_Greed++", - "Name": "Fragile_Greed" - }, - { - "Effect": "*Fragile_Greed", - "Name": "Unbreakable_Greed" - }, - { - "Effect": "`Fragile_Strength<1` => CHARMS++ >> Fragile_Strength++", - "Name": "Fragile_Strength" - }, - { - "Effect": "*Fragile_Strength", - "Name": "Unbreakable_Strength" - }, - { - "Effect": "`Nailmaster's_Glory<1` => CHARMS++ >> Nailmaster's_Glory++", - "Name": "Nailmaster's_Glory" - }, - { - "Effect": "`Joni's_Blessing<1` => CHARMS++ >> Joni's_Blessing++", - "Name": "Joni's_Blessing" - }, - { - "Effect": "`Shape_of_Unn<1` => CHARMS++ >> Shape_of_Unn++", - "Name": "Shape_of_Unn" - }, - { - "Effect": "`Hiveblood<1` => CHARMS++ >> Hiveblood++", - "Name": "Hiveblood" - }, - { - "Effect": "`Dream_Wielder<1` => CHARMS++ >> Dream_Wielder++", - "Name": "Dream_Wielder" - }, - { - "Effect": "`Dashmaster<1` => CHARMS++ >> Dashmaster++", - "Name": "Dashmaster" - }, - { - "Effect": "`Quick_Slash<1` => CHARMS++ >> Quick_Slash++", - "Name": "Quick_Slash" - }, - { - "Effect": "`Spell_Twister<1` => CHARMS++ >> Spell_Twister++", - "Name": "Spell_Twister" - }, - { - "Effect": "`Deep_Focus<1` => CHARMS++ >> Deep_Focus++", - "Name": "Deep_Focus" - }, - { - "Effect": "`Grubberfly's_Elegy<1` => CHARMS++ >> Grubberfly's_Elegy++", - "Name": "Grubberfly's_Elegy" - }, - { - "Effect": "`WHITEFRAGMENT=1` => CHARMS++ >> WHITEFRAGMENT++", - "Name": "Queen_Fragment" - }, - { - "Effect": "*Queen_Fragment", - "Name": "King_Fragment" - }, - { - "Effect": "*Queen_Fragment", - "Name": "Void_Heart" - }, - { - "Effect": "`Sprintmaster<1` => CHARMS++ >> Sprintmaster++", - "Name": "Sprintmaster" - }, - { - "Effect": "`Dreamshield<1` => CHARMS++ >> Dreamshield++", - "Name": "Dreamshield" - }, - { - "Effect": "`Weaversong<1` => CHARMS++ >> Weaversong++", - "Name": "Weaversong" - }, - { - "Effect": "`Grimmchild<1` => CHARMS++ >> Grimmchild++", - "Name": "Grimmchild1" - }, - { - "Effect": "`Grimmchild<1` => (CHARMS++ >> FLAMES += 6 >> First_Grimmchild_Upgrade++) >> Grimmchild++", - "Name": "Grimmchild2" - }, - { - "Effect": "CREST++", - "Name": "City_Crest" - }, - { - "Effect": "LANTERN++", - "Name": "Lumafly_Lantern" - }, - { - "Effect": "TRAM++", - "Name": "Tram_Pass" - }, - { - "Effect": "SIMPLE++", - "Name": "Simple_Key" - }, - { - "Effect": "SHOPKEY++", - "Name": "Shopkeeper's_Key" - }, - { - "Effect": "ELEGANT++", - "Name": "Elegant_Key" - }, - { - "Effect": "Love_Key++", - "Name": "Love_Key" - }, - { - "Effect": "King's_Brand++", - "Name": "King's_Brand" - }, - { - "Effect": "Godtuner++", - "Name": "Godtuner" - }, - { - "Effect": "Collector's_Map++", - "Name": "Collector's_Map" - }, - { - "Effect": "MASKSHARDS++", - "Name": "Mask_Shard" - }, - { - "Effect": "MASKSHARDS += 2", - "Name": "Double_Mask_Shard" - }, - { - "Effect": "MASKSHARDS += 4", - "Name": "Full_Mask" - }, - { - "Effect": "VESSELFRAGMENTS++", - "Name": "Vessel_Fragment" - }, - { - "Effect": "VESSELFRAGMENTS += 2", - "Name": "Double_Vessel_Fragment" - }, - { - "Effect": "VESSELFRAGMENTS += 3", - "Name": "Full_Soul_Vessel" - }, - { - "Effect": "NOTCHES++", - "Name": "Charm_Notch" - }, - { - "Effect": "Salubra's_Blessing++", - "Name": "Salubra's_Blessing" - }, - { - "Effect": "PALEORE++", - "Name": "Pale_Ore" - }, - { - "Effect": "GEO += 200", - "Name": "Geo_Chest-False_Knight" - }, - { - "Effect": "GEO += 380", - "Name": "Geo_Chest-Soul_Master" - }, - { - "Effect": "GEO += 655", - "Name": "Geo_Chest-Watcher_Knights" - }, - { - "Effect": "GEO += 85", - "Name": "Geo_Chest-Greenpath" - }, - { - "Effect": "GEO += 620", - "Name": "Geo_Chest-Mantis_Lords" - }, - { - "Effect": "GEO += 150", - "Name": "Geo_Chest-Resting_Grounds" - }, - { - "Effect": "GEO += 80", - "Name": "Geo_Chest-Crystal_Peak" - }, - { - "Effect": "GEO += 160", - "Name": "Geo_Chest-Weavers_Den" - }, - { - "Effect": "GEO += 8", - "Name": "Geo_Chest-Junk_Pit_1" - }, - { - "Effect": "GEO += 8", - "Name": "Geo_Chest-Junk_Pit_2" - }, - { - "Effect": "GEO += 25", - "Name": "Geo_Chest-Junk_Pit_3" - }, - { - "Effect": "GEO += 10", - "Name": "Geo_Chest-Junk_Pit_5" - }, - { - "Effect": "_", - "Name": "Lumafly_Escape" - }, - { - "Effect": "GEO++", - "Name": "One_Geo" - }, - { - "Effect": "RANCIDEGGS++", - "Name": "Rancid_Egg" - }, - { - "Effect": "WANDERERSJOURNALS++", - "Name": "Wanderer's_Journal" - }, - { - "Effect": "HALLOWNESTSEALS++", - "Name": "Hallownest_Seal" - }, - { - "Effect": "KINGSIDOLS++", - "Name": "King's_Idol" - }, - { - "Effect": "ARCANEEGGS++", - "Name": "Arcane_Egg" - }, - { - "Effect": "ESSENCE += 29", - "Name": "Whispering_Root-Crossroads" - }, - { - "Effect": "ESSENCE += 44", - "Name": "Whispering_Root-Greenpath" - }, - { - "Effect": "ESSENCE += 20", - "Name": "Whispering_Root-Leg_Eater" - }, - { - "Effect": "ESSENCE += 18", - "Name": "Whispering_Root-Mantis_Village" - }, - { - "Effect": "ESSENCE += 45", - "Name": "Whispering_Root-Deepnest" - }, - { - "Effect": "ESSENCE += 29", - "Name": "Whispering_Root-Queens_Gardens" - }, - { - "Effect": "ESSENCE += 51", - "Name": "Whispering_Root-Kingdoms_Edge" - }, - { - "Effect": "ESSENCE += 35", - "Name": "Whispering_Root-Waterways" - }, - { - "Effect": "ESSENCE += 28", - "Name": "Whispering_Root-City" - }, - { - "Effect": "ESSENCE += 20", - "Name": "Whispering_Root-Resting_Grounds" - }, - { - "Effect": "ESSENCE += 34", - "Name": "Whispering_Root-Spirits_Glade" - }, - { - "Effect": "ESSENCE += 21", - "Name": "Whispering_Root-Crystal_Peak" - }, - { - "Effect": "ESSENCE += 46", - "Name": "Whispering_Root-Howling_Cliffs" - }, - { - "Effect": "ESSENCE += 42", - "Name": "Whispering_Root-Ancestral_Mound" - }, - { - "Effect": "ESSENCE += 20", - "Name": "Whispering_Root-Hive" - }, - { - "Effect": "ESSENCE += 100", - "Name": "Boss_Essence-Elder_Hu" - }, - { - "Effect": "ESSENCE += 100", - "Name": "Boss_Essence-Xero" - }, - { - "Effect": "ESSENCE += 100", - "Name": "Boss_Essence-Gorb" - }, - { - "Effect": "ESSENCE += 150", - "Name": "Boss_Essence-Marmu" - }, - { - "Effect": "ESSENCE += 200", - "Name": "Boss_Essence-No_Eyes" - }, - { - "Effect": "ESSENCE += 200", - "Name": "Boss_Essence-Galien" - }, - { - "Effect": "ESSENCE += 250", - "Name": "Boss_Essence-Markoth" - }, - { - "Effect": "ESSENCE += 300", - "Name": "Boss_Essence-Failed_Champion" - }, - { - "Effect": "ESSENCE += 300", - "Name": "Boss_Essence-Soul_Tyrant" - }, - { - "Effect": "ESSENCE += 400", - "Name": "Boss_Essence-Lost_Kin" - }, - { - "Effect": "ESSENCE += 300", - "Name": "Boss_Essence-White_Defender" - }, - { - "Effect": "ESSENCE += 300", - "Name": "Boss_Essence-Grey_Prince_Zote" - }, - { - "Effect": "GRUBS++", - "Name": "Grub" - }, - { - "Effect": "_", - "Name": "Mimic_Grub" - }, - { - "Effect": "QUILL++", - "Name": "Quill" - }, - { - "Effect": "`Crossroads_Map<1` => MAPS++ >> Crossroads_Map++", - "Name": "Crossroads_Map" - }, - { - "Effect": "`Greenpath_Map<1` => MAPS++ >> Greenpath_Map++", - "Name": "Greenpath_Map" - }, - { - "Effect": "`Fog_Canyon_Map<1` => MAPS++ >> Fog_Canyon_Map++", - "Name": "Fog_Canyon_Map" - }, - { - "Effect": "`Fungal_Wastes_Map<1` => MAPS++ >> Fungal_Wastes_Map++", - "Name": "Fungal_Wastes_Map" - }, - { - "Effect": "`Deepnest_Map<1` => MAPS++ >> Deepnest_Map++", - "Name": "Deepnest_Map" - }, - { - "Effect": "`Ancient_Basin_Map<1` => MAPS++ >> Ancient_Basin_Map++", - "Name": "Ancient_Basin_Map" - }, - { - "Effect": "`Kingdom's_Edge_Map<1` => MAPS++ >> Kingdom's_Edge_Map++", - "Name": "Kingdom's_Edge_Map" - }, - { - "Effect": "`City_of_Tears_Map<1` => MAPS++ >> City_of_Tears_Map++", - "Name": "City_of_Tears_Map" - }, - { - "Effect": "`Royal_Waterways_Map<1` => MAPS++ >> Royal_Waterways_Map++", - "Name": "Royal_Waterways_Map" - }, - { - "Effect": "`Howling_Cliffs_Map<1` => MAPS++ >> Howling_Cliffs_Map++", - "Name": "Howling_Cliffs_Map" - }, - { - "Effect": "`Crystal_Peak_Map<1` => MAPS++ >> Crystal_Peak_Map++", - "Name": "Crystal_Peak_Map" - }, - { - "Effect": "`Queen's_Gardens_Map<1` => MAPS++ >> Queen's_Gardens_Map++", - "Name": "Queen's_Gardens_Map" - }, - { - "Effect": "`Resting_Grounds_Map<1` => MAPS++ >> Resting_Grounds_Map++", - "Name": "Resting_Grounds_Map" - }, - { - "Effect": "Dirtmouth_Stag++", - "Name": "Dirtmouth_Stag" - }, - { - "Effect": "`Crossroads_Stag<1` => STAGS++ >> Crossroads_Stag++", - "Name": "Crossroads_Stag" - }, - { - "Effect": "`Greenpath_Stag<1` => STAGS++ >> Greenpath_Stag++", - "Name": "Greenpath_Stag" - }, - { - "Effect": "`Queen's_Station_Stag<1` => STAGS++ >> Queen's_Station_Stag++", - "Name": "Queen's_Station_Stag" - }, - { - "Effect": "`Queen's_Gardens_Stag<1` => STAGS++ >> Queen's_Gardens_Stag++", - "Name": "Queen's_Gardens_Stag" - }, - { - "Effect": "`City_Storerooms_Stag<1` => STAGS++ >> City_Storerooms_Stag++", - "Name": "City_Storerooms_Stag" - }, - { - "Effect": "`King's_Station_Stag<1` => STAGS++ >> King's_Station_Stag++", - "Name": "King's_Station_Stag" - }, - { - "Effect": "`Resting_Grounds_Stag<1` => STAGS++ >> Resting_Grounds_Stag++", - "Name": "Resting_Grounds_Stag" - }, - { - "Effect": "`Distant_Village_Stag<1` => STAGS++ >> Distant_Village_Stag++", - "Name": "Distant_Village_Stag" - }, - { - "Effect": "`Hidden_Station_Stag<1` => STAGS++ >> Hidden_Station_Stag++", - "Name": "Hidden_Station_Stag" - }, - { - "Effect": "`Stag_Nest_Stag<1` => STAGS++ >> Stag_Nest_Stag++", - "Name": "Stag_Nest_Stag" - }, - { - "Effect": "_", - "Name": "Lifeblood_Cocoon_Small" - }, - { - "Effect": "_", - "Name": "Lifeblood_Cocoon_Large" - }, - { - "Effect": "FLAMES++", - "Name": "Grimmkin_Flame" - }, - { - "Effect": "JOURNAL++", - "Name": "Hunter's_Journal" - }, - { - "Effect": "_", - "Name": "Journal_Entry-Void_Tendrils" - }, - { - "Effect": "_", - "Name": "Journal_Entry-Charged_Lumafly" - }, - { - "Effect": "_", - "Name": "Journal_Entry-Goam" - }, - { - "Effect": "_", - "Name": "Journal_Entry-Garpede" - }, - { - "Effect": "_", - "Name": "Journal_Entry-Seal_of_Binding" - }, - { - "Effect": "Elevator_Pass++", - "Name": "Elevator_Pass" - }, - { - "Effect": "`LEFTDASH<1 | RIGHTDASH<1 | LEFTDASH<2 + RIGHTDASH<2` => (`LEFTDASH + RIGHTDASH` => (LEFTDASH++ >> RIGHTDASH++) >|> `LEFTDASH<1 + RIGHTDASH>1` => LEFTDASH += 2 >|> LEFTDASH++)", - "Name": "Left_Mothwing_Cloak" - }, - { - "Effect": "`LEFTDASH<1 | RIGHTDASH<1 | LEFTDASH<2 + RIGHTDASH<2` => (`LEFTDASH + RIGHTDASH` => (LEFTDASH++ >> RIGHTDASH++) >|> `RIGHTDASH<1 + LEFTDASH>1` => RIGHTDASH += 2 >|> RIGHTDASH++)", - "Name": "Right_Mothwing_Cloak" - }, - { - "Effect": "*Left_Mothwing_Cloak", // left-right bias is randomized in BuiltinRequests if SplitCloak is active - "Name": "Split_Shade_Cloak" - }, - { - "Effect": "`LEFTCLAW<1` => LEFTCLAW++ >|> RIGHTCLAW++", - "Name": "Left_Mantis_Claw" - }, - { - "Effect": "`RIGHTCLAW<1` => RIGHTCLAW++ >|> LEFTCLAW++", - "Name": "Right_Mantis_Claw" - }, - { - "Effect": "LEFTSLASH++", - "Name": "Leftslash" - }, - { - "Effect": "RIGHTSLASH++", - "Name": "Rightslash" - }, - { - "Effect": "UPSLASH++", - "Name": "Upslash" - }, - { - "Effect": "DOWNSLASH++", - "Name": "Downslash" - }, - { - "Effect": "LEFTSUPERDASH++", - "Name": "Left_Crystal_Heart" - }, - { - "Effect": "RIGHTSUPERDASH++", - "Name": "Right_Crystal_Heart" - }, - { - "Effect": "GEO += 15", - "Name": "Geo_Rock-Default" - }, - { - "Effect": "GEO += 15", - "Name": "Geo_Rock-Deepnest" - }, - { - "Effect": "GEO += 35", - "Name": "Geo_Rock-Abyss" - }, - { - "Effect": "GEO += 26", - "Name": "Geo_Rock-GreenPath01" - }, - { - "Effect": "GEO += 44", - "Name": "Geo_Rock-Outskirts" - }, - { - "Effect": "GEO += 420", - "Name": "Geo_Rock-Outskirts420" - }, - { - "Effect": "GEO += 30", - "Name": "Geo_Rock-GreenPath02" - }, - { - "Effect": "GEO += 22", - "Name": "Geo_Rock-Fung01" - }, - { - "Effect": "GEO += 17", - "Name": "Geo_Rock-Fung02" - }, - { - "Effect": "GEO += 30", - "Name": "Geo_Rock-City" - }, - { - "Effect": "GEO += 56", - "Name": "Geo_Rock-Hive" - }, - { - "Effect": "GEO += 24", - "Name": "Geo_Rock-Mine" - }, - { - "Effect": "GEO += 25", - "Name": "Geo_Rock-Grave02" - }, - { - "Effect": "GEO += 25", - "Name": "Geo_Rock-Grave01" - }, - { - "Effect": "GEO += 300", - "Name": "Boss_Geo-Massive_Moss_Charger" - }, - { - "Effect": "GEO += 420", - "Name": "Boss_Geo-Gorgeous_Husk" - }, - { - "Effect": "GEO += 200", - "Name": "Boss_Geo-Sanctum_Soul_Warrior" - }, - { - "Effect": "GEO += 200", - "Name": "Boss_Geo-Elegant_Soul_Warrior" - }, - { - "Effect": "GEO += 385", - "Name": "Boss_Geo-Crystal_Guardian" - }, - { - "Effect": "GEO += 550", - "Name": "Boss_Geo-Enraged_Guardian" - }, - { - "Effect": "GEO += 50", - "Name": "Boss_Geo-Gruz_Mother" - }, - { - "Effect": "GEO += 65", - "Name": "Boss_Geo-Vengefly_King" - }, - { - "Effect": "_", - "Name": "Soul_Refill" - }, - { - "Effect": "_", - "Name": "Soul_Totem-A" - }, - { - "Effect": "_", - "Name": "Soul_Totem-B" - }, - { - "Effect": "_", - "Name": "Soul_Totem-C" - }, - { - "Effect": "_", - "Name": "Soul_Totem-D" - }, - { - "Effect": "_", - "Name": "Soul_Totem-E" - }, - { - "Effect": "_", - "Name": "Soul_Totem-F" - }, - { - "Effect": "_", - "Name": "Soul_Totem-G" - }, - { - "Effect": "_", - "Name": "Soul_Totem-Palace" - }, - { - "Effect": "_", - "Name": "Soul_Totem-Path_of_Pain" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-City_Entrance" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Pleasure_House" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Sanctum_Entrance" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Sanctum_Past_Soul_Master" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Watcher's_Spire" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Archives_Upper" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Archives_Left" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Archives_Right" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Pilgrim's_Way_1" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Pilgrim's_Way_2" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Mantis_Outskirts" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Mantis_Village" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Greenpath_Upper_Hidden" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Greenpath_Below_Toll" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Greenpath_Lifeblood" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Greenpath_Stag" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Greenpath_QG" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Greenpath_Lower_Hidden" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Dung_Defender" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Spore_Shroom" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Fungal_Wastes_Hidden" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Fungal_Wastes_Below_Shrumal_Ogres" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Fungal_Core" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Ancient_Basin" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-King's_Pass_Focus" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-King's_Pass_Fury" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-King's_Pass_Exit" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-World_Sense" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Howling_Cliffs" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Kingdom's_Edge" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Palace_Workshop" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Palace_Throne" - }, - { - "Effect": "_", - "Name": "Lore_Tablet-Path_of_Pain_Entrance" - } -] \ No newline at end of file diff --git a/RandomizerMod/Resources/Logic/locations.json b/RandomizerMod/Resources/Logic/locations.json deleted file mode 100644 index 62a0d42..0000000 --- a/RandomizerMod/Resources/Logic/locations.json +++ /dev/null @@ -1,2423 +0,0 @@ -[ - { - "name": "Start", - "logic": "ANY" - }, - { - "name": "Sly", - "logic": "Room_shop[left1] + Rescued_Sly" - }, - { - "name": "Sly_(Key)", - "logic": "Room_shop[left1] + Rescued_Sly + SHOPKEY" - }, - { - "name": "Iselda", - "logic": "Room_mapper[left1]" - }, - { - "name": "Salubra", - "logic": "Room_Charm_Shop[left1]" - }, - { - "name": "Leg_Eater", - "logic": "Fungus2_26[left1]" - }, - { - "name": "Grubfather", - "logic": "Crossroads_38[right1]" - }, - { - "name": "Seer", - "logic": "RestingGrounds_07[right1]" - }, - { - "name": "Lurien", - "logic": "Ruins2_Watcher_Room[bot1] + DREAMNAIL" - }, - { - "name": "Monomon", - "logic": "Uumuu_Arena + Defeated_Uumuu + DREAMNAIL + (ACID + LEFTCLAW | ACID + RIGHTCLAW + WINGS | LEFTSUPERDASH + FULLCLAW | LEFTSUPERDASH + RIGHTCLAW + WINGS | RIGHTSUPERDASH + LEFTCLAW + WINGS | ACID + $SHRIEKPOGO[3,before:ROOMSOUL] | LEFTDASH + ANYCLAW + ACIDSKIPS + $SHRIEKPOGO[2,before:ROOMSOUL] | LEFTDASH + ACIDSKIPS + COMPLEXSKIPS + $SHRIEKPOGO[5] | FULLCLAW + WINGS + FULLSHARPSHADOW + FIREBALL + FIREBALLSKIPS + ACIDSKIPS + COMPLEXSKIPS)" - }, - { - "name": "Herrah", - "logic": "Deepnest_Spider_Town[left1] + DREAMNAIL + (WINGS + ANYCLAW + (Herrah | COMBAT[Right_Devout]) | (FULLCLAW | ENEMYPOGOS + $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[3,before:ROOMSOUL]) + (Herrah + COMBAT[Left_Devout] | COMBAT[Any_Devout])) | Bench-Beast's_Den + $SHRIEKPOGO[1,2,2] + $SHRIEKPOGO[3,before:ROOMSOUL] + (Herrah | COMBAT[Left_Devout])" - }, - { - "name": "World_Sense", - "logic": "Room_temple[left1] + Opened_Black_Egg_Temple" - }, - { - "name": "Mothwing_Cloak", - "logic": "Fungus1_04[right1] + Defeated_Hornet_1" - }, - { - "name": "Mantis_Claw", - "logic": "Fungus2_14 + (LEFTDASH | WINGS | LEFTSUPERDASH + ANYCLAW | ($SHADESKIP[2HITS] | LEFTCLAW) + ENEMYPOGOS | SPELLAIRSTALL + $CASTSPELL[1,1,before:ROOMSOUL])" - }, - { - "name": "Crystal_Heart", - "logic": "Mines_31[left1] + RIGHTSUPERDASH | Mines_31 + (RIGHTDASH | WINGS | RIGHTSUPERDASH | SPELLAIRSTALL + $CASTSPELL | PRECISEMOVEMENT + (RIGHTCLAW | LEFTDASH))" - }, - { - "name": "Monarch_Wings", - "logic": "Abyss_21[right1] + (RIGHTCLAW | WINGS)" - }, - { - "name": "Shade_Cloak", - "logic": "(Abyss_10[left2] + RIGHTSHADOWDASH | Abyss_10[left1] + (RIGHTCLAW | WINGS + $SHADESKIP[2HITS] | $SHRIEKPOGO[2])) + (WINGS | RIGHTSUPERDASH | RIGHTDASH + (LEFTCLAW | PRECISEMOVEMENT | BACKGROUNDPOGOS)) | (Abyss_10[left2] + RIGHTSHADOWDASH | Abyss_10[left1]) + (RIGHTSHADOWDASH | VOIDHEART + (RIGHTDASH | RIGHTSUPERDASH | SWIM | WINGS | FULLCLAW)) + (WINGS | LEFTCLAW + RIGHTSUPERDASH | LEFTCLAW + RIGHTDASH | BACKGROUNDPOGOS + RIGHTDASH)" - }, - { - "name": "Isma's_Tear", - "logic": "Waterways_13" - }, - { - "name": "Dream_Nail", - "logic": "RestingGrounds_04[left1] | RestingGrounds_04[right1]" - }, - { - "name": "Vengeful_Spirit", - "logic": "Crossroads_ShamanTemple[left1]" - }, - { - "name": "Shade_Soul", - "logic": "Ruins1_31b[right1] | Ruins1_31b[right2] + Defeated_Elegant_Warrior" - }, - { - "name": "Desolate_Dive", - "logic": "Ruins1_24[right1] + Defeated_Soul_Master" - }, - { - "name": "Descending_Dark", - "logic": "Mines_35[left1] + Broke_Crystallized_Mound_Quake_Floor + (LEFTCLAW | RIGHTCLAW + PRECISEMOVEMENT + (RIGHTDASH | OBSCURESKIPS + DIFFICULTSKIPS) | WINGS + OBSCURESKIPS | $SHRIEKPOGO[2])" - }, - { - "name": "Howling_Wraiths", - "logic": "Room_Fungus_Shaman[left1]" - }, - { - "name": "Abyss_Shriek", - "logic": "Abyss_12[right1] + SCREAM + $CASTSPELL" - }, - { - "name": "Cyclone_Slash", - "logic": "Room_nailmaster[left1]" - }, - { - "name": "Dash_Slash", - "logic": "Room_nailmaster_03[left1] + Can_Visit_Lemm" - }, - { - "name": "Great_Slash", - "logic": "Room_nailmaster_02[left1]" - }, - { - "name": "Focus", - "logic": "Tutorial_01" - }, - { - "name": "Baldur_Shell", - "logic": "(Fungus1_28[left1] | (Fungus1_28[left2] + (FULLCLAW | WINGS | RIGHTDASH | RIGHTSUPERDASH | $SHADESKIP))) + Defeated_Right_Cliffs_Baldur" - }, - { - "name": "Fury_of_the_Fallen", - "logic": "Tutorial_01" - }, - { - "name": "Lifeblood_Core", - "logic": "Abyss_08[right1] + (PRECISEMOVEMENT | (FULLDASH + WINGS))" - }, - { - "name": "Defender's_Crest", - "logic": "Waterways_05[bot1] + (ANYCLAW | WINGS) + Defeated_Dung_Defender" - }, - { - "name": "Flukenest", - "logic": "Waterways_12[right1] + (SWIM | LEFTSUPERDASH | LEFTDASH + $SHRIEKPOGO[4]) + Defeated_Flukemarm" - }, - { - "name": "Thorns_of_Agony", - "logic": "Fungus1_14[left1] + (RIGHTDASH | LEFTCLAW + RIGHTSUPERDASH)" - }, - { - "name": "Mark_of_Pride", - "logic": "(Fungus2_31[left1] + Defeated_Mantis_Lords | Bench-Mantis_Village) + (LEFTCLAW | WINGS | RIGHTCLAW + (BACKGROUNDPOGOS | $SHADESKIP))" - }, - { - "name": "Sharp_Shadow", - "logic": "Deepnest_44[top1] + RIGHTSHADOWDASH + (LEFTSHADOWDASH | DAMAGEBOOSTS + ($TAKEDAMAGE + $TAKEDAMAGE + $TAKEDAMAGE | LEFTDASH + $TAKEDAMAGE + $TAKEDAMAGE | QUAKE + $CASTSPELL[2] + $TAKEDAMAGE))" - }, - { - "name": "Spore_Shroom", - "logic": "(Fungus2_20[left1] | Fungus2_20[right1]) + (RIGHTCLAW | WINGS) + (ACID | RIGHTDASH | LEFTCLAW + RIGHTSUPERDASH | $SHRIEKPOGO[2,before:AREASOUL])" - }, - { - "name": "Soul_Catcher", - "logic": "Crossroads_ShamanTemple[left1] + (Defeated_Ancestral_Mound_Baldur + (UPWALLBREAK | (LEFTSUPERDASH + RIGHTCLAW | RIGHTSUPERDASH + LEFTCLAW) + OBSCURESKIPS) | (ANYCLAW | WINGS + $SHADESKIP | $SHRIEKPOGO[2,before:ROOMSOUL]) + UPWALLBREAK)" - }, - { - "name": "Soul_Eater", - "logic": "RestingGrounds_10 + (ANYCLAW | WINGS) + UPWALLBREAK" - }, - { - "name": "Glowing_Womb", - "logic": "Crossroads_22[bot1] + (ANYCLAW | WINGS | BACKGROUNDPOGOS | ENEMYPOGOS)" - }, - { - "name": "Nailmaster's_Glory", - "logic": "Room_shop[left1] + Rescued_Sly + CYCLONE + DASHSLASH + GREATSLASH" - }, - { - "name": "Joni's_Blessing", - "logic": "Cliffs_05[left1]" - }, - { - "name": "Shape_of_Unn", - "logic": "Fungus1_Slug[right1] + (ACID | FULLSKIPACID | ACIDSKIPS + FULLDASH + $SHRIEKPOGO[1,1])" - }, - { - "name": "Hiveblood", - "logic": "Hive_05[left1] + Defeated_Hive_Knight" - }, - { - "name": "Dashmaster", - "logic": "Fungus2_23" - }, - { - "name": "Quick_Slash", - "logic": "Deepnest_East_14b[top1] | (Deepnest_East_14b[right1] + (FULLCLAW | WINGS | ENEMYPOGOS + DANGEROUSSKIPS))" - }, - { - "name": "Spell_Twister", - "logic": "Ruins1_30 + (ANYCLAW | WINGS)" - }, - { - "name": "Deep_Focus", - "logic": "Mines_36[right1]" - }, - { - "name": "Queen_Fragment", - "logic": "Room_Queen[left1]" - }, - { - "name": "King_Fragment", - "logic": "White_Palace_09[right1] + (LEFTSUPERDASH + (FULLCLAW | WINGS) | RIGHTCLAW + LEFTDASH + OBSCURESKIPS + PRECISEMOVEMENT + ($SHRIEKPOGO[1,1,1,1,1] | LEFTSHARPSHADOW + $SHRIEKPOGO[1,1,1,1]))" - }, - { - "name": "Void_Heart", - "logic": "Abyss_15[top1] + RIGHTSHADOWDASH + DREAMNAIL + (ENEMYPOGOS | ANYCLAW | WINGS) + (FULLCLAW | WINGS | OBSCURESKIPS + RIGHTCLAW | OBSCURESKIPS + LEFTCLAW + FULLSUPERDASH)" - }, - { - "name": "Dreamshield", - "logic": "RestingGrounds_17[right1]" - }, - { - "name": "Weaversong", - "logic": "Deepnest_45_v02[left1] + (RIGHTCLAW | WINGS + (LEFTCLAW | ENEMYPOGOS) | LEFTCLAW + ENEMYPOGOS + DIFFICULTSKIPS | $SHRIEKPOGO[3,before:AREASOUL])" - }, - { - "name": "Grimmchild", - "logic": "Nightmare_Lantern_Lit + Grimm_Main_Tent[left1]" - }, - { - "name": "Unbreakable_Heart", - "logic": "Grimm_Divine[left1] + FRAGILEHEART + Can_Visit_Lemm" - }, - { - "name": "Unbreakable_Greed", - "logic": "Grimm_Divine[left1] + FRAGILEGREED + Can_Visit_Lemm" - }, - { - "name": "Unbreakable_Strength", - "logic": "Grimm_Divine[left1] + FRAGILESTRENGTH + Can_Visit_Lemm" - }, - { - "name": "City_Crest", - "logic": "(Crossroads_10[left1] | Crossroads_10[right1]) + Defeated_False_Knight" - }, - { - "name": "Tram_Pass", - "logic": "Deepnest_26b[right2] + (LEFTCLAW | WINGS)" - }, - { - "name": "Simple_Key-Basin", - "logic": "Abyss_20[top1] | Abyss_20[top2]" - }, - { - "name": "Simple_Key-City", - "logic": "(Ruins1_17[top1] | Ruins1_17[right1]) + (RIGHTDASH | WINGS | RIGHTSUPERDASH | ENEMYPOGOS)" - }, - { - "name": "Simple_Key-Lurker", - "logic": "GG_Lurker[left1] + (SWIM | RIGHTDASH | WINGS | (LEFTCLAW + FULLSUPERDASH)) + RIGHTCLAW + Defeated_Pale_Lurker" - }, - { - "name": "Shopkeeper's_Key", - "logic": "Mines_11 + (ANYCLAW | WINGS | ENEMYPOGOS)" - }, - { - "name": "Love_Key", - "logic": "Fungus3_39[left1] + (ACID | RIGHTSKIPACID | ACIDSKIPS + (RIGHTCLAW + RIGHTDASH + WINGS + (DASHMASTER | SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL]) | RIGHTDASH + $SHRIEKPOGO[before:ROOMSOUL] | COMPLEXSKIPS + RIGHTSHARPSHADOW + WINGS))" - }, - { - "name": "King's_Brand", - "logic": "Room_Wyrm[right1]" - }, - { - "name": "Godtuner", - "logic": "GG_Waterways + GODTUNERUNLOCK" - }, - { - "name": "Collector's_Map", - "logic": "Ruins2_11[right1] + (LEFTCLAW | RIGHTCLAW + (WINGS | RIGHTDASH | PRECISEMOVEMENT) | WINGS + COMPLEXSKIPS + ENEMYPOGOS | $SHRIEKPOGO[5,before:AREASOUL]) + Defeated_Collector" - }, - { - "name": "Mask_Shard-Brooding_Mawlek", - "logic": "(Crossroads_09[left1] | Crossroads_09[right1]) + Defeated_Brooding_Mawlek" - }, - { - "name": "Mask_Shard-Crossroads_Goam", - "logic": "(Crossroads_13[left1] | Crossroads_13[right1]) + (ANYCLAW | WINGS | ENEMYPOGOS)" - }, - { - "name": "Mask_Shard-Stone_Sanctuary", - "logic": "Fungus1_36[left1]" - }, - { - "name": "Mask_Shard-Queen's_Station", - "logic": "Fungus2_01 + (FULLCLAW + (LEFTDASH | LEFTSUPERDASH) | WINGS)" - }, - { - "name": "Mask_Shard-Deepnest", - "logic": "Fungus2_25[top2]" - }, - { - "name": "Mask_Shard-Waterways", - "logic": "Waterways_04b[left1] + (SWIM | LEFTDASH + (LEFTCLAW | $SHRIEKPOGO[before:ROOMSOUL])) | Waterways_04b[right1] + (WINGS | LEFTDASH | SWIM | RIGHTCLAW + RIGHTDASH + LEFTSUPERDASH) + (SWIM | LEFTDASH + (LEFTCLAW | $SHRIEKPOGO[before:ROOMSOUL])) | Waterways_04b[right2] + (SWIM | LEFTSKIPACID)" - }, - { - "name": "Mask_Shard-Enraged_Guardian", - "logic": "Mines_32[bot1] + Defeated_Enraged_Guardian" - }, - { - "name": "Mask_Shard-Hive", - "logic": "Hive_04[left1] | Hive_04[left2] | Hive_04[right1]" - }, - { - "name": "Mask_Shard-Grey_Mourner", - "logic": "Room_Mansion[left1] + Can_Deliver_Flower" - }, - { - "name": "Mask_Shard-Bretta", - "logic": "Room_Bretta[right1]" - }, - { - "name": "Vessel_Fragment-Greenpath", - "logic": "Fungus1_13[right1] + (LEFTCLAW | DAMAGEBOOSTS + $TAKEDAMAGE + WINGS + ENEMYPOGOS | WINGS + RIGHTCLAW + (LEFTDASH | LEFTSUPERDASH) | ENEMYPOGOS + $SHRIEKPOGO[2,before:AREASOUL]) | $StartLocation[Lower Greenpath]" - }, - { - "name": "Vessel_Fragment-City", - "logic": "Ruins2_09[bot1] + Defeated_King's_Station_Arena" - }, - { - "name": "Vessel_Fragment-Crossroads", - "logic": "Crossroads_37[right1]" - }, - { - "name": "Vessel_Fragment-Basin", - "logic": "(Abyss_04 + (ANYCLAW | WINGS + ENEMYPOGOS) | Abyss_04[top1]) + Can_Visit_Lemm + Defeated_Colosseum_2" - }, - { - "name": "Vessel_Fragment-Deepnest", - "logic": "Deepnest_38[bot1] + (RIGHTCLAW | WINGS)" - }, - { - "name": "Vessel_Fragment-Stag_Nest", - "logic": "Cliffs_03[right1] | ((ALLSTAGS | Stag_Nest_Stag) + Can_Stag)" - }, - { - "name": "Charm_Notch-Shrumal_Ogres", - "logic": "(Fungus2_05[bot1] | Fungus2_05[right1]) + Defeated_Shrumal_Ogre_Arena" - }, - { - "name": "Charm_Notch-Fog_Canyon", - "logic": "Fungus3_28[right1] + (ACID | ACIDSKIPS + (LEFTSKIPACID | WINGS + LEFTDASH | WINGS + RIGHTCLAW + SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL] | DAMAGEBOOSTS + $TAKEDAMAGE + FULLCLAW + FULLDASH)) + (RIGHTCLAW | LEFTCLAW + WINGS | LEFTCLAW + ENEMYPOGOS)" - }, - { - "name": "Charm_Notch-Colosseum", - "logic": "Room_Colosseum_01[left1] + Can_Replenish_Geo + Defeated_Colosseum_1" - }, - { - "name": "Charm_Notch-Grimm", - "logic": "Grimm_Main_Tent[left1] + Defeated_Grimm" - }, - { - "name": "Pale_Ore-Basin", - "logic": "Abyss_17[top1] + (ANYCLAW | WINGS | DAMAGEBOOSTS + $TAKEDAMAGE)" - }, - { - "name": "Pale_Ore-Crystal_Peak", - "logic": "Mines_34[bot1] + (LEFTCLAW + (WINGS | RIGHTDASH | RIGHTSUPERDASH | SPIKETUNNELS) | RIGHTCLAW + (WINGS | ENEMYPOGOS + (RIGHTDASH | SPIKETUNNELS)) | $SHRIEKPOGO[before:ROOMSOUL]) | $StartLocation[Hallownest's Crown]" - }, - { - "name": "Pale_Ore-Nosk", - "logic": "Deepnest_32[left1] + Defeated_Nosk" - }, - { - "name": "Pale_Ore-Colosseum", - "logic": "Room_Colosseum_01[left1] + Can_Replenish_Geo + (ANYCLAW | (SPICYCOMBATSKIPS + WINGS)) + Defeated_Colosseum_2" - }, - { - "name": "Geo_Chest-False_Knight", - "logic": "(Crossroads_10[left1] | Crossroads_10[right1]) + Defeated_False_Knight" - }, - { - "name": "Geo_Chest-Soul_Master", - "logic": "Ruins1_32[right1] + (ANYCLAW | $SHRIEKPOGO[before:AREASOUL])" - }, - { - "name": "Geo_Chest-Watcher_Knights", - "logic": "Ruins2_03[top1] | Ruins2_03[bot1] + Defeated_Watcher_Knights + (ANYCLAW | $SHRIEKPOGO[8,before:AREASOUL])" - }, - { - "name": "Geo_Chest-Greenpath", - "logic": "Fungus1_13[right1]" - }, - { - "name": "Geo_Chest-Mantis_Lords", - "logic": "(Fungus2_31[left1] + Defeated_Mantis_Lords | Bench-Mantis_Village) + (ANYCLAW | WINGS)" - }, - { - "name": "Geo_Chest-Resting_Grounds", - "logic": "RestingGrounds_10" - }, - { - "name": "Geo_Chest-Crystal_Peak", - "logic": "Mines_37[bot1] + (ANYCLAW | $SHRIEKPOGO[before:AREASOUL]) | Mines_37[bot1] + WINGS + GLOWINGWOMB + $SHADESKIP[2HITS] + COMPLEXSKIPS | Mines_37[top1] + WINGS + GRUBBERFLYSELEGY + LEFTSLASH + $SHADESKIP + COMPLEXSKIPS + (FULLDASH | FULLSUPERDASH + RIGHTCLAW + OBSCURESKIPS + PRECISEMOVEMENT | DASHSPRINT + OBSCURESKIPS)" - }, - { - "name": "Geo_Chest-Weavers_Den", - "logic": "Deepnest_45_v02[left1] + (RIGHTCLAW | WINGS + (LEFTCLAW | ENEMYPOGOS) | LEFTCLAW + ENEMYPOGOS + DIFFICULTSKIPS) + Broke_Weavers_Den_Secret_Wall + (LEFTDASH + WINGS | LEFTSUPERDASH | FIREBALLSKIPS + WINGS + (FIREBALL + $CASTSPELL[3,before:AREASOUL] | SCREAM + $CASTSPELL[4,before:AREASOUL] | $SHRIEKPOGO[3,before:AREASOUL])) + (LEFTDASH | SPIKETUNNELS) + (RIGHTCLAW | WINGS + ENEMYPOGOS | LEFTCLAW + LEFTDASH + ENEMYPOGOS + DANGEROUSSKIPS + COMPLEXSKIPS)" - }, - { - "name": "Geo_Chest-Junk_Pit_1", - "logic": "GG_Waterways" - }, - { - "name": "Geo_Chest-Junk_Pit_2", - "logic": "GG_Waterways" - }, - { - "name": "Geo_Chest-Junk_Pit_3", - "logic": "GG_Waterways" - }, - { - "name": "Geo_Chest-Junk_Pit_5", - "logic": "GG_Waterways" - }, - { - "name": "Lumafly_Escape-Junk_Pit_Chest_4", - "logic": "GG_Waterways" - }, - { - "name": "Rancid_Egg-Sheo", - "logic": "Fungus1_15[right1] | Fungus1_15[door1]" - }, - { - "name": "Rancid_Egg-Fungal_Core", - "logic": "Fungus2_29" - }, - { - "name": "Rancid_Egg-Queen's_Gardens", - "logic": "(Fungus3_34 + (RIGHTCLAW + BACKGROUNDPOGOS | WINGS | FULLDASH | $SHADESKIP[2HITS])) | (Fungus3_34[left1] + (RIGHTDASH | LEFTCLAW + RIGHTSUPERDASH + (RIGHTCLAW | BACKGROUNDPOGOS + LEFTDASH | $SHADESKIP[2HITS] | SPELLAIRSTALL + $CASTSPELL[2,before:AREASOUL])))" - }, - { - "name": "Rancid_Egg-Blue_Lake", - "logic": "Crossroads_50[left1] + (RIGHTSUPERDASH | RIGHTDASH + $SHRIEKPOGO[1,1]) | (Crossroads_50[left1] | Crossroads_50[right1]) + SWIM + (WINGS + ENEMYPOGOS | $SHRIEKPOGO[2,before:MAPAREASOUL]) | Crossroads_50[right1] + LEFTSUPERDASH + COMPLEXSKIPS + $SHRIEKPOGO[3,before:MAPAREASOUL]" - }, - { - "name": "Rancid_Egg-Crystal_Peak_Dive_Entrance", - "logic": "Mines_01[left1] + Broke_Crystal_Peak_Entrance_Quake_Floor + (RIGHTDASH | WINGS | LEFTCLAW + RIGHTSUPERDASH | RIGHTCLAW + SPELLAIRSTALL + $CASTSPELL[3,before:ITEMSOUL,after:AREASOUL]) | Mines_01[bot1] + (ANYCLAW + WINGS | FULLCLAW + FULLSUPERDASH | LEFTCLAW + FULLDASH + BACKGROUNDPOGOS | LEFTCLAW + WINGS + (RIGHTDASH | RIGHTSUPERDASH) | BACKGROUNDPOGOS + RIGHTDASH + $SHRIEKPOGO[5,before:AREASOUL])" - }, - { - "name": "Rancid_Egg-Crystal_Peak_Dark_Room", - "logic": "Mines_29[left1] | Mines_29[right1] | Mines_29[right2]" - }, - { - "name": "Rancid_Egg-Crystal_Peak_Tall_Room", - "logic": "Mines_20 + Broke_Crystal_Peak_Dive_Egg_Quake_Floor" - }, - { - "name": "Rancid_Egg-City_of_Tears_Left", - "logic": "Ruins1_05c + (ANYCLAW | WINGS | BACKGROUNDPOGOS | DAMAGEBOOSTS + $TAKEDAMAGE[2])" - }, - { - "name": "Rancid_Egg-City_of_Tears_Pleasure_House", - "logic": "Ruins_Elevator[left1] | Ruins_Elevator[left2]" - }, - { - "name": "Rancid_Egg-Beast's_Den", - "logic": "Deepnest_Spider_Town[left1] + (WINGS + ANYCLAW | (FULLCLAW | WINGS + COMPLEXSKIPS + $SHADESKIP[2HITS] | $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL]) + COMBAT[Left_Devout])" - }, - { - "name": "Rancid_Egg-Dark_Deepnest", - "logic": "(LANTERN | DARKROOMS) + (Deepnest_39[left1] | Deepnest_39[top1] | Deepnest_39[door1] | (Deepnest_39[right1] + (LEFTCLAW | WINGS + RIGHTCLAW | WINGS + ENEMYPOGOS | RIGHTCLAW + ENEMYPOGOS)))" - }, - { - "name": "Rancid_Egg-Weaver's_Den", - "logic": "Deepnest_45_v02[left1] + (SPIKETUNNELS | LEFTDASH) + (LANTERN | DARKROOMS)" - }, - { - "name": "Rancid_Egg-Near_Quick_Slash", - "logic": "Deepnest_East_14[top2] + Broke_Oro_Quake_Floor_2 + Broke_Oro_Quake_Floor_3 + (RIGHTCLAW | WINGS | LEFTCLAW + ENEMYPOGOS | FULLDASH + DAMAGEBOOSTS + ENEMYPOGOS + COMPLEXSKIPS + $TAKEDAMAGE + $TAKEDAMAGE) | (Deepnest_East_14[left1] + (RIGHTDASH | SPIKETUNNELS) | Deepnest_East_14[door1] + (LEFTDASH | PRECISEMOVEMENT)) + RIGHTCLAW + WINGS + (LEFTDASH | ENEMYPOGOS)" - }, - { - "name": "Rancid_Egg-Upper_Kingdom's_Edge", - "logic": "Deepnest_East_07 + (ANYCLAW | WINGS)" - }, - { - "name": "Rancid_Egg-Waterways_East", - "logic": "Waterways_07" - }, - { - "name": "Rancid_Egg-Waterways_Main", - "logic": "Waterways_02 + (ANYCLAW | WINGS) | Waterways_02[top1] | Waterways_02[top3] + Broke_Waterways_Bench_Quake_Floor_3 | Bench-Waterways" - }, - { - "name": "Rancid_Egg-Waterways_West_Bluggsac", - "logic": "(Waterways_04 | Waterways_04[left2]) + SWIM + (ANYCLAW | WINGS | RIGHTDASH | ENEMYPOGOS) | Waterways_04 + (LEFTSKIPACID + WINGS | COMPLEXSKIPS + FIREBALLSKIPS + ACIDSKIPS + FIREBALL + LEFTDASH + RIGHTCLAW + WINGS | ACIDSKIPS + LEFTDASH + ($SHRIEKPOGO[1,before:ROOMSOUL] + (RIGHTCLAW | ENEMYPOGOS) | $SHRIEKPOGO[2,before:ROOMSOUL])) | Waterways_04[left2] + (RIGHTSKIPACID + WINGS | ACIDSKIPS + RIGHTDASH + ($SHRIEKPOGO + ANYCLAW | $SHRIEKPOGO[2]))" - }, - { - "name": "Rancid_Egg-Waterways_West_Pickup", - "logic": "Waterways_04b[left1] + (ANYCLAW | WINGS + ENEMYPOGOS + DANGEROUSSKIPS | $SHRIEKPOGO[5,before:AREASOUL])" - }, - { - "name": "Rancid_Egg-Tuk_Defender's_Crest", - "logic": "Waterways_03[left1] + DEFENDERSCREST" - }, - { - "name": "Wanderer's_Journal-Cliffs", - "logic": "Cliffs_01[right1] | Cliffs_01[right2] | (Cliffs_01[right3] + (ANYCLAW | WINGS | (FULLDASH + ENEMYPOGOS))) | Cliffs_01[right4]" - }, - { - "name": "Wanderer's_Journal-Greenpath_Stag", - "logic": "Fungus1_22[left1] | Fungus1_22[top1]" - }, - { - "name": "Wanderer's_Journal-Greenpath_Lower", - "logic": "Fungus1_11 + (ANYCLAW | $SHRIEKPOGO[3,before:AREASOUL])" - }, - { - "name": "Wanderer's_Journal-Fungal_Wastes_Thorns_Gauntlet", - "logic": "Fungus2_04 + (LEFTCLAW + WINGS | RIGHTCLAW + (WINGS | RIGHTDASH | RIGHTSUPERDASH + LEFTCLAW | SPELLAIRSTALL + $CASTSPELL[3,before:AREASOUL]) | ($SHRIEKPOGO[4,before:AREASOUL,NOSTALL] | ($SHRIEKPOGO[3,1,before:AREASOUL,NOSTALL] + LEFTDASH | $SHRIEKPOGO[3,before:AREASOUL,NOSTALL] + RIGHTDASH) + COMPLEXSKIPS))" - }, - { - "name": "Wanderer's_Journal-Above_Mantis_Village", - "logic": "Fungus2_17 + (ANYCLAW | $SHRIEKPOGO[5,before:AREASOUL])" - }, - { - "name": "Wanderer's_Journal-Crystal_Peak_Crawlers", - "logic": "Mines_20" // crystal crawler pogos are in skipless logic - }, - { - "name": "Wanderer's_Journal-Resting_Grounds_Catacombs", - "logic": "RestingGrounds_10 + (ANYCLAW | WINGS)" - }, - { - "name": "Wanderer's_Journal-King's_Station", - "logic": "(Ruins2_05[bot1] + ENEMYPOGOS) | Ruins2_05[left1] | Ruins2_05[top1]" - }, - { - "name": "Wanderer's_Journal-Pleasure_House", - "logic": "Ruins_Elevator[left1] | Ruins_Elevator[left2]" - }, - { - "name": "Wanderer's_Journal-City_Storerooms", - "logic": "Ruins1_28 | Ruins1_28[left1]" - }, - { - "name": "Wanderer's_Journal-Ancient_Basin", - "logic": "(Abyss_02[right1] | (Abyss_02[bot1] + (LEFTCLAW | WINGS))) + ((LEFTCLAW + RIGHTSUPERDASH) | RIGHTDASH | SPIKETUNNELS)" - }, - { - "name": "Wanderer's_Journal-Kingdom's_Edge_Entrance", - "logic": "Deepnest_East_07[bot1]" - }, - { - "name": "Wanderer's_Journal-Kingdom's_Edge_Camp", - "logic": "Deepnest_East_13[bot1]" - }, - { - "name": "Wanderer's_Journal-Kingdom's_Edge_Requires_Dive", - "logic": "(Deepnest_East_18 + (ANYCLAW | WINGS) | Deepnest_East_18[top1]) + Broke_Edge_Journal_Quake_Floor" - }, - { - "name": "Hallownest_Seal-Crossroads_Well", - "logic": "(Crossroads_01[left1] | Crossroads_01[top1] | Crossroads_01[right1]) + (ANYCLAW | WINGS + (INFECTED | ($SHADESKIP + (ANYDASH | SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL]) | $SHADESKIP[2HITS])) | INFECTED + ANYDASH + DAMAGEBOOSTS + $TAKEDAMAGE[3] | $SHRIEKPOGO[5,before:AREASOUL])" - }, - { - "name": "Hallownest_Seal-Greenpath", - "logic": "(Fungus1_10[left1] | Fungus1_10[top1] | Fungus1_10[right1]) + (ACID | WINGS + SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL] | LEFTDASH + (SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL] | DASHMASTER + OBSCURESKIPS | WINGS | LEFTCLAW) | LEFTSUPERDASH)" - }, - { - "name": "Hallownest_Seal-Fog_Canyon_West", - "logic": "Fungus3_30[bot1]" - }, - { - "name": "Hallownest_Seal-Fog_Canyon_East", - "logic": "Fungus3_26[top1] + (LEFTCLAW | WINGS | LEFTSUPERDASH | LEFTDASH | DAMAGEBOOSTS + $TAKEDAMAGE | SPELLAIRSTALL + $CASTSPELL[2])" - }, - { - "name": "Hallownest_Seal-Queen's_Station", - "logic": "Fungus2_34[right1] + WINGS" - }, - { - "name": "Hallownest_Seal-Fungal_Wastes_Sporgs", - "logic": "Fungus2_03 + (ANYCLAW | WINGS | LEFTDASH | LEFTSUPERDASH | ENEMYPOGOS) + (RIGHTDASH | RIGHTCLAW | WINGS | LEFTCLAW | PRECISEMOVEMENT | ENEMYPOGOS + DANGEROUSSKIPS)" - }, - { - "name": "Hallownest_Seal-Mantis_Lords", - "logic": "(Fungus2_31[left1] + Defeated_Mantis_Lords | Bench-Mantis_Village) + (ANYCLAW | WINGS)" - }, - { - "name": "Hallownest_Seal-Resting_Grounds_Catacombs", - "logic": "RestingGrounds_10 + UPWALLBREAK" - }, - { - "name": "Hallownest_Seal-King's_Station", - "logic": "Ruins2_08[left1] + (LEFTCLAW | WINGS | (RIGHTCLAW + LEFTDASH))" - }, - { - "name": "Hallownest_Seal-City_Rafters", - "logic": "Ruins1_03" - }, - { - "name": "Hallownest_Seal-Soul_Sanctum", - "logic": "Ruins1_32[right1] + (ANYCLAW | $SHRIEKPOGO[before:AREASOUL]) + Broke_Quake_Floor_After_Soul_Master_1 + Broke_Quake_Floor_After_Soul_Master_2" - }, - { - "name": "Hallownest_Seal-Watcher_Knight", - "logic": "(Ruins2_03[top1] | Ruins2_03[bot1] + Defeated_Watcher_Knights + (ANYCLAW | $SHRIEKPOGO[8,before:AREASOUL])) + (RIGHTCLAW | WINGS | LEFTCLAW + RIGHTSUPERDASH | RIGHTDASH + BACKGROUNDPOGOS)" - }, - { - "name": "Hallownest_Seal-Deepnest_By_Mantis_Lords", - "logic": "Deepnest_16[bot1] + (LEFTCLAW | RIGHTCLAW + WINGS | WINGS + ANYDASH + ENEMYPOGOS + COMPLEXSKIPS + $SHADESKIP[2HITS] | $SHRIEKPOGO[6])" - }, - { - "name": "Hallownest_Seal-Beast's_Den", - "logic": "Deepnest_Spider_Town[left1]" - }, - { - "name": "Hallownest_Seal-Queen's_Gardens", - "logic": "(Fungus3_48[right2] | Fungus3_48[bot1]) + (FULLCLAW | WINGS | ENEMYPOGOS + DANGEROUSSKIPS)" - }, - { - "name": "King's_Idol-Cliffs", - "logic": "Cliffs_01" - }, - { - "name": "King's_Idol-Crystal_Peak", - "logic": "(Mines_30[right1] | Mines_30[left1] + RIGHTSUPERDASH) + (RIGHTCLAW + RIGHTDASH + BACKGROUNDPOGOS | WINGS)" - }, - { - "name": "King's_Idol-Glade_of_Hope", - "logic": "RestingGrounds_08[left1] + (SWIM + LEFTCLAW | SWIM + WINGS + ANYCLAW | RIGHTSUPERDASH + FULLCLAW | RIGHTSUPERDASH + WINGS + ANYCLAW | WINGS + RIGHTDASH | WINGS + LEFTCLAW + OBSCURESKIPS | RIGHTCLAW + RIGHTDASH + DIFFICULTSKIPS + (SWIM | RIGHTSUPERDASH) | $SHRIEKPOGO[1,1] | $SHRIEKPOGO + (SWIM | RIGHTDASH | RIGHTSUPERDASH))" - }, - { - "name": "King's_Idol-Dung_Defender", - "logic": "Waterways_15[top1]" - }, - { - "name": "King's_Idol-Great_Hopper", - "logic": "Deepnest_East_08[top1] | Deepnest_East_08[right1]" - }, - { - "name": "King's_Idol-Pale_Lurker", - "logic": "GG_Lurker[left1] + (SWIM | RIGHTSKIPACID)" - }, - { - "name": "King's_Idol-Deepnest", - "logic": "Deepnest_33[top1]" - }, - { - "name": "Arcane_Egg-Lifeblood_Core", - "logic": "Abyss_08[right1] + (PRECISEMOVEMENT | LEFTDASH) + (RIGHTSUPERDASH + (RIGHTCLAW | WINGS))" - }, - { - "name": "Arcane_Egg-Shade_Cloak", - "logic": "Abyss_10[left2] + RIGHTSHADOWDASH | Abyss_10[left1] + (RIGHTSHADOWDASH | VOIDHEART + (SWIM | RIGHTDASH | RIGHTSUPERDASH | FULLCLAW | WINGS) | (RIGHTCLAW | WINGS + $SHADESKIP[2HITS] | $SHRIEKPOGO[2]) + (LEFTSHADOWDASH | VOIDHEART + (LEFTDASH | LEFTSUPERDASH)))" - }, - { - "name": "Arcane_Egg-Birthplace", - "logic": "Abyss_15[top1]" - }, - { - "name": "Whispering_Root-Crossroads", - "logic": "Crossroads_07 + (RIGHTCLAW | WINGS + LEFTCLAW | $SHRIEKPOGO[5,before:AREASOUL]) + (WINGS | FULLSUPERDASH | ANYDASH | INFECTED) + DREAMNAIL + UPWALLBREAK" - }, - { - "name": "Whispering_Root-Greenpath", - "logic": "Fungus1_13[left1] + Fungus1_13[right1]/ + (LEFTCLAW | RIGHTCLAW + WINGS + (LEFTDASH | LEFTSUPERDASH | DAMAGEBOOSTS + $TAKEDAMAGE) | $SHRIEKPOGO[2] + ENEMYPOGOS) + DREAMNAIL + (SIDESLASH | GREATSLASH | CYCLONE | FULLDASHSLASH | ANYDASHSLASH + DASHMASTER + OBSCURESKIPS)" - }, - { - "name": "Whispering_Root-Leg_Eater", - "logic": "(Fungus2_33[left1] | Fungus2_33[right1]) + DREAMNAIL" - }, - { - "name": "Whispering_Root-Mantis_Village", - "logic": "Fungus2_17 + (ANYCLAW | $SHRIEKPOGO[5,before:AREASOUL] + ENEMYPOGOS) + DREAMNAIL" - }, - { - "name": "Whispering_Root-Deepnest", - "logic": "Deepnest_39 + (LANTERN | DARKROOMS) + (FULLCLAW | WINGS + ANYCLAW | WINGS + ENEMYPOGOS) + DREAMNAIL" - }, - { - "name": "Whispering_Root-Queens_Gardens", - "logic": "Fungus3_11 + (LEFTCLAW | WINGS | RIGHTCLAW + ENEMYPOGOS) + DREAMNAIL" - }, - { - "name": "Whispering_Root-Kingdoms_Edge", - "logic": "Deepnest_East_07 + (ANYCLAW | WINGS) + DREAMNAIL" - }, - { - "name": "Whispering_Root-Waterways", - "logic": "Abyss_01[left3] + (FULLCLAW + (RIGHTDASH | WINGS | RIGHTSUPERDASH | ENEMYPOGOS) | LEFTCLAW + FULLDASH + OBSCURESKIPS | WINGS + ANYCLAW | $SHRIEKPOGO[2]) + DREAMNAIL" - }, - { - "name": "Whispering_Root-City", - "logic": "(Ruins1_17[top1] | Ruins1_17[right1]) + (FULLDASH | WINGS | FULLSUPERDASH | ENEMYPOGOS) + DREAMNAIL" - }, - { - "name": "Whispering_Root-Resting_Grounds", - "logic": "RestingGrounds_05 + DREAMNAIL" - }, - { - "name": "Whispering_Root-Spirits_Glade", - "logic": "RestingGrounds_08[left1] + DREAMNAIL + (WINGS + (SWIM + ANYCLAW | RIGHTDASH + ANYCLAW | RIGHTSUPERDASH + ANYCLAW | FULLDASH | LEFTCLAW + OBSCURESKIPS) | LEFTCLAW + SWIM + RIGHTDASH | FULLCLAW + RIGHTSUPERDASH + RIGHTDASH | RIGHTCLAW + RIGHTDASH + DIFFICULTSKIPS + (SWIM | RIGHTSUPERDASH) | $SHRIEKPOGO[1,1] | $SHRIEKPOGO + (SWIM | RIGHTDASH | RIGHTSUPERDASH))" - }, - { - "name": "Whispering_Root-Crystal_Peak", - "logic": "(Mines_23[left1] | Mines_23[top1] | Mines_23[right1] | Mines_23[right2]) + (RIGHTCLAW | WINGS) + (FULLDASH | WINGS) + DREAMNAIL" - }, - { - "name": "Whispering_Root-Howling_Cliffs", - "logic": "Cliffs_01 + (LEFTCLAW | (RIGHTCLAW + FULLDASH) | WINGS | (FULLDASH + ENEMYPOGOS)) + DREAMNAIL" - }, - { - "name": "Whispering_Root-Ancestral_Mound", - "logic": "Crossroads_ShamanTemple[left1] + (WINGS | FULLCLAW + ENEMYPOGOS) + (ANYCLAW | Defeated_Ancestral_Mound_Baldur | $SHRIEKPOGO[2,before:ROOMSOUL]) + DREAMNAIL + UPWALLBREAK" - }, - { - "name": "Whispering_Root-Hive", - "logic": "(Hive_02[left1] | Hive_02[left2] | Hive_02[left3]) + (RIGHTCLAW | WINGS | FULLDASH + LEFTCLAW) + DREAMNAIL" - }, - { - "name": "Boss_Essence-Elder_Hu", - "logic": "Fungus2_32[left1] + DREAMNAIL + Defeated_Elder_Hu" - }, - { - "name": "Boss_Essence-Xero", - "logic": "(RestingGrounds_02[top1] | RestingGrounds_02 + (ANYCLAW | WINGS | RIGHTSUPERDASH | BACKGROUNDPOGOS)) + DREAMNAIL + Defeated_Xero" - }, - { - "name": "Boss_Essence-Gorb", - "logic": "Cliffs_02 + DREAMNAIL + Defeated_Gorb" - }, - { - "name": "Boss_Essence-Marmu", - "logic": "(Fungus3_40[top1] | ((Fungus3_40[right1] | Can_Stag + Queen's_Gardens_Stag | Bench-Gardens_Stag) + (LEFTCLAW | (RIGHTCLAW + LEFTSUPERDASH) | WINGS | LEFTDASH))) + DREAMNAIL + Defeated_Marmu" - }, - { - "name": "Boss_Essence-No_Eyes", - "logic": "(Fungus1_35[left1] | Fungus1_35[right1]) + LANTERN + DREAMNAIL + Defeated_No_Eyes" - }, - { - "name": "Boss_Essence-Galien", - "logic": "Deepnest_40[right1] + DREAMNAIL + Defeated_Galien" - }, - { - "name": "Boss_Essence-Markoth", - "logic": "Deepnest_East_10[left1] + DREAMNAIL + Defeated_Markoth" - }, - { - "name": "Boss_Essence-Failed_Champion", - "logic": "(Crossroads_10[left1] | Crossroads_10[right1]) + Defeated_False_Knight + Defeated_Failed_Champion + (ANYCLAW | WINGS + INFECTED | $SHRIEKPOGO[2,before:AREASOUL]) + DREAMNAIL" - }, - { - "name": "Boss_Essence-Soul_Tyrant", - "logic": "(Ruins1_24[right1] | Ruins1_24[left1]) + Defeated_Soul_Master + Defeated_Soul_Tyrant + DREAMNAIL" - }, - { - "name": "Boss_Essence-Lost_Kin", - "logic": "Abyss_19[bot1] + (ANYCLAW | WINGS) + DREAMNAIL + Defeated_Broken_Vessel + Defeated_Lost_Kin" - }, - { - "name": "Boss_Essence-White_Defender", - "logic": "Waterways_15[top1] + DREAMNAIL + DREAMER3 + Defeated_Dung_Defender + Defeated_White_Defender" - }, - { - "name": "Boss_Essence-Grey_Prince_Zote", - "logic": "Room_Bretta[right1] + DREAMNAIL + WINGS + Rescued_Bretta + Defeated_Colosseum_Zote + Defeated_Grey_Prince_Zote" - }, - { - "name": "Grub-Crossroads_Acid", - "logic": "Crossroads_35[right1]" - }, - { - "name": "Grub-Crossroads_Center", - "logic": "(Crossroads_05[left1] | Crossroads_05[right1]) + (ENEMYPOGOS | RIGHTDASH | WINGS | RIGHTSUPERDASH)" - }, - { - "name": "Grub-Crossroads_Stag", - "logic": "Crossroads_03" - }, - { - "name": "Grub-Crossroads_Spike", - "logic": "Crossroads_31[right1]" - }, - { - "name": "Grub-Crossroads_Guarded", - "logic": "Crossroads_48[left1]" - }, - { - "name": "Grub-Greenpath_Cornifer", - "logic": "(Fungus1_06[left1] | Fungus1_06[bot1]) + (SIDESLASH | GREATSLASH | CYCLONE | RIGHTDASH | LEFTDASHSLASH + DASHMASTER + OBSCURESKIPS | RIGHTCLAW | WINGS | RIGHTSUPERDASH | ENEMYPOGOS)" - }, - { - "name": "Grub-Greenpath_Journal", - "logic": "(Fungus1_07[left1] | Fungus1_07[top1] | Fungus1_07[right1]) + (SIDESLASH | GREATSLASH | CYCLONE | RIGHTDASH | LEFTDASHSLASH | WINGS | ACID + (RIGHTCLAW | ENEMYPOGOS) | ENEMYPOGOS + DIFFICULTSKIPS)" - }, - { - "name": "Grub-Greenpath_MMC", - "logic": "Fungus1_13[right1]" - }, - { - "name": "Grub-Greenpath_Stag", - "logic": "Fungus1_21" - }, - { - "name": "Grub-Fog_Canyon", - "logic": "Fungus3_47 + (LEFTSUPERDASH | $SHRIEKPOGO[2,before:AREASOUL])" - }, - { - "name": "Grub-Fungal_Bouncy", - "logic": "Fungus2_18[right1]" - }, - { - "name": "Grub-Fungal_Spore_Shroom", - "logic": "Fungus2_20[left1] | Fungus2_20[right1]" - }, - { - "name": "Grub-Deepnest_Mimic", - "logic": "Deepnest_36[left1]" - }, - { - "name": "Grub-Deepnest_Nosk", - "logic": "Deepnest_31[right1] | Deepnest_31[right2] + (ANYCLAW | WINGS)" - }, - { - "name": "Grub-Deepnest_Spike", - "logic": "Deepnest_03[top1] + LEFTCLAW | Deepnest_03 + (FULLCLAW | WINGS | LEFTCLAW + $SHADESKIP | RIGHTCLAW + ENEMYPOGOS + (COMPLEXSKIPS | Deepnest_03[left1]/) + (RIGHTDASH | DANGEROUSSKIPS))" - }, - { - "name": "Grub-Dark_Deepnest", - "logic": "(LANTERN | DARKROOMS) + (Deepnest_39 + (RIGHTCLAW | WINGS + (LEFTCLAW | ENEMYPOGOS)) | Deepnest_39[top1] | Deepnest_39[left1] + (RIGHTCLAW | WINGS | RIGHTDASH))" - }, - { - "name": "Grub-Beast's_Den", - "logic": "Deepnest_Spider_Town[left1] + (WINGS + ANYCLAW | (FULLCLAW | WINGS + COMPLEXSKIPS + $SHADESKIP[2HITS] | $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL]) + COMBAT[Left_Devout])" - }, - { - "name": "Grub-Kingdom's_Edge_Oro", - "logic": "(Deepnest_East_14[door1] | Deepnest_East_14[top2] + Broke_Oro_Quake_Floor_2 + Broke_Oro_Quake_Floor_3 + (RIGHTCLAW | WINGS | LEFTCLAW + ENEMYPOGOS | FULLDASH + DAMAGEBOOSTS + ENEMYPOGOS + COMPLEXSKIPS + $TAKEDAMAGE + $TAKEDAMAGE) + (RIGHTDASH | PRECISEMOVEMENT) | Deepnest_East_14[left1] + (RIGHTDASH | SPIKETUNNELS)) + (ANYCLAW | WINGS | $SHADESKIP[2HITS] + ENEMYPOGOS + (ANYDASH | SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL]))" - }, - { - "name": "Grub-Kingdom's_Edge_Camp", - "logic": "Deepnest_East_11 + (ANYCLAW | WINGS | PRECISEMOVEMENT + (LEFTDASH | DAMAGEBOOSTS + $TAKEDAMAGE))" - }, - { - "name": "Grub-Hive_External", - "logic": "Hive_03[top1]" - }, - { - "name": "Grub-Hive_Internal", - "logic": "(Hive_04[left1] | Hive_04[right1]) + (ANYCLAW + WINGS + (LEFTCLAW + RIGHTSUPERDASH | RIGHTCLAW + LEFTSUPERDASH | ENEMYPOGOS + DIFFICULTSKIPS) | FULLCLAW + LEFTSUPERDASH + OBSCURESKIPS + PRECISEMOVEMENT)" - }, - { - "name": "Grub-Basin_Requires_Wings", - "logic": "Abyss_19 + (WINGS + (ANYCLAW | ENEMYPOGOS) | ANYCLAW + ENEMYPOGOS + BACKGROUNDPOGOS + $SLOPEBALL[before:ROOMSOUL])" - }, - { - "name": "Grub-Basin_Requires_Dive", - "logic": "Abyss_17[top1] + Broke_Basin_Grub_Quake_Floor" - }, - { - "name": "Grub-Waterways_Main", - "logic": "Waterways_04 + (RIGHTCLAW | SWIM | CYCLONE | (FIREBALL | SCREAM) + $CASTSPELL[before:ROOMSOUL]) | Waterways_04[left2] + (SWIM | RIGHTSKIPACID)" - }, - { - "name": "Grub-Isma's_Grove", - "logic": "Waterways_13 + (ACID | RIGHTSKIPACID) + ANYCLAW | Waterways_13[left1] + (FULLCLAW | ANYCLAW + (WINGS | ENEMYPOGOS) | LEFTCLAW + (RIGHTDASH | RIGHTSUPERDASH) | $SHRIEKPOGO[5] + ENEMYPOGOS) + (ACID | RIGHTSKIPACID | RIGHTDASH + ACIDSKIPS + $SHRIEKPOGO)" - }, - { - "name": "Grub-Waterways_Requires_Tram", - "logic": "Waterways_14[bot1] + (ANYCLAW | $SHRIEKPOGO[2]) + (RIGHTSUPERDASH + WINGS + (RIGHTCLAW | LEFTCLAW + ENEMYPOGOS | ENEMYPOGOS + DANGEROUSSKIPS) | ACID + (RIGHTCLAW | LEFTCLAW + WINGS | WINGS + ENEMYPOGOS + DANGEROUSSKIPS)) | Waterways_14[bot2] + (RIGHTCLAW | WINGS + LEFTCLAW | $SHRIEKPOGO[before:ITEMSOUL]) + (LEFTSUPERDASH + WINGS + (RIGHTCLAW | LEFTCLAW + ENEMYPOGOS | ENEMYPOGOS + DANGEROUSSKIPS) | ACID + (RIGHTCLAW | LEFTCLAW + WINGS | WINGS + ENEMYPOGOS + DANGEROUSSKIPS))" - }, - { - "name": "Grub-City_of_Tears_Left", - "logic": "(Ruins1_05[top1] | Ruins1_05[right1] | Ruins1_05 + (LEFTCLAW | WINGS + (RIGHTCLAW | BACKGROUNDPOGOS) | $SHRIEKPOGO[2,before:AREASOUL])) + (RIGHTCLAW | WINGS | LEFTCLAW + BACKGROUNDPOGOS | ENEMYPOGOS)" - }, - { - "name": "Grub-Soul_Sanctum", - "logic": "Ruins1_32[right1] + (ANYCLAW | $SHRIEKPOGO[before:AREASOUL]) + Broke_Quake_Floor_After_Soul_Master_1 + Broke_Quake_Floor_After_Soul_Master_2 + Broke_Quake_Floor_After_Soul_Master_3" - }, - { - "name": "Grub-Watcher's_Spire", - "logic": "Ruins2_03[bot2] + (RIGHTCLAW | WINGS + LEFTCLAW | $SHRIEKPOGO[5,before:AREASOUL])" - }, - { - "name": "Grub-City_of_Tears_Guarded", - "logic": "Ruins_House_01[left1]" - }, - { - "name": "Grub-King's_Station", - "logic": "(Ruins2_07[left1] + (SWIM | RIGHTSKIPACID) | Ruins2_07[top1] | Ruins2_07[right1] + (LEFTDASH | SWIM | LEFTCLAW | WINGS)) + (LEFTDASH | SWIM | RIGHTCLAW + LEFTSUPERDASH | WINGS + LEFTSUPERDASH | RIGHTCLAW + WINGS + PRECISEMOVEMENT | WINGS + SPELLAIRSTALL + $CASTSPELL[3] | $SHRIEKPOGO)" - }, - { - "name": "Grub-Resting_Grounds", - "logic": "RestingGrounds_10 + (LEFTCLAW | WINGS | ENEMYPOGOS + DANGEROUSSKIPS + RIGHTCLAW) + UPWALLBREAK" - }, - { - "name": "Grub-Crystal_Peak_Below_Chest", - "logic": "Mines_04[top1]" - }, - { - "name": "Grub-Crystallized_Mound", - "logic": "Mines_35[left1] + Broke_Crystallized_Mound_Quake_Floor + (LEFTCLAW | RIGHTCLAW + PRECISEMOVEMENT + (RIGHTDASH | OBSCURESKIPS) | WINGS)" - }, - { - "name": "Grub-Crystal_Peak_Spike", - "logic": "Mines_03 + (FULLCLAW + FULLDASH | SPIKETUNNELS + (FULLCLAW + ((LEFTDASH | LEFTSUPERDASH) + (RIGHTDASH | RIGHTSUPERDASH) | SPELLAIRSTALL + $CASTSPELL[2]) | WINGS + (FULLDASH | SPELLAIRSTALL + $CASTSPELL[2])))" - }, - { - "name": "Grub-Crystal_Peak_Mimic", - "logic": "Mines_16[top1] + (LEFTCLAW | WINGS | RIGHTCLAW + (LEFTDASH | SPELLAIRSTALL + $CASTSPELL[2]))" - }, - { - "name": "Grub-Crystal_Peak_Crushers", - "logic": "(Mines_19[left1] | Mines_19[right1]) + (ANYCLAW | WINGS) + (LEFTDASH | OBSCURESKIPS + DANGEROUSSKIPS + DASHSPRINT | LEFTSUPERDASH + DANGEROUSSKIPS + DIFFICULTSKIPS)" - }, - { - "name": "Grub-Crystal_Heart", - "logic": "Mines_31[left1] + (LEFTCLAW + RIGHTSUPERDASH | WINGS + (LEFTCLAW + RIGHTDASH | RIGHTCLAW | BACKGROUNDPOGOS) | FULLCLAW + RIGHTDASH + SPELLAIRSTALL + $CASTSPELL[3] | $SHRIEKPOGO[2,before:AREASOUL])" - }, - { - "name": "Grub-Hallownest_Crown", - "logic": "Mines_24[left1] + (RIGHTDASH | RIGHTSUPERDASH | SPIKETUNNELS)" - }, - { - "name": "Grub-Howling_Cliffs", - "logic": "Fungus1_28[left1]" - }, - { - "name": "Grub-Queen's_Gardens_Stag", - "logic": "Fungus3_10[bot1] + (WINGS | FULLDASH) + Defeated_West_Queen's_Gardens_Arena | Fungus3_10[top1]" - }, - { - "name": "Grub-Queen's_Gardens_Marmu", - "logic": "(Fungus3_48[bot1] | Fungus3_48[right2]) + (FULLCLAW | WINGS + ANYCLAW | ENEMYPOGOS + $SHRIEKPOGO[2,before:ROOMSOUL])" - }, - { - "name": "Grub-Queen's_Gardens_Top", - "logic": "Fungus3_22 + (FULLCLAW + LEFTSUPERDASH + (RIGHTSUPERDASH | WINGS) | COMPLEXSKIPS + SPELLAIRSTALL + $CASTSPELL[3,before:ROOMSOUL] + WINGS + LEFTCLAW + (RIGHTCLAW + LEFTSHARPSHADOW | RIGHTCLAW + LEFTDASH + DIFFICULTSKIPS | LEFTSHARPSHADOW + DIFFICULTSKIPS) | LEFTDASH + LEFTCLAW + ($SHRIEKPOGO[2,before:ROOMSOUL] + ENEMYPOGOS + COMPLEXSKIPS | $SHRIEKPOGO[before:ROOMSOUL] + RIGHTCLAW) | RIGHTCLAW + (FULLDASH + $SHRIEKPOGO[5,before:AREASOUL] | LEFTSUPERDASH + $SHRIEKPOGO[4,before:AREASOUL]))" - }, - { - "name": "Grub-Collector_1", - "logic": "*Collector's_Map" - }, - { - "name": "Grub-Collector_2", - "logic": "*Collector's_Map" - }, - { - "name": "Grub-Collector_3", - "logic": "*Collector's_Map" - }, - { - "name": "Mimic_Grub-Deepnest_1", - "logic": "Deepnest_36[left1]" - }, - { - "name": "Mimic_Grub-Deepnest_2", - "logic": "Deepnest_36[left1]" - }, - { - "name": "Mimic_Grub-Deepnest_3", - "logic": "Deepnest_36[left1]" - }, - { - "name": "Mimic_Grub-Crystal_Peak", - "logic": "Mines_16[top1]" - }, - { - "name": "Crossroads_Map", - "logic": "Crossroads_33" - }, - { - "name": "Greenpath_Map", - "logic": "Fungus1_06[bot1] | Fungus1_06[left1] + (SIDESLASH | GREATSLASH | CYCLONE | RIGHTDASH | LEFTDASHSLASH | RIGHTSUPERDASH | ENEMYPOGOS | RIGHTCLAW | WINGS | SPELLAIRSTALL + $CASTSPELL[2,before:AREASOUL])" - }, - { - "name": "Fog_Canyon_Map", - "logic": "(Fungus3_25[left1] + RIGHTSHADOWDASH | Fungus3_25[right1]) + (WINGS | ENEMYPOGOS + (LEFTCLAW + LEFTDASH | COMPLEXSKIPS + FULLDASH)) | $StartLocation[East Fog Canyon] + LEFTDASH + LEFTCLAW" - }, - { - "name": "Fungal_Wastes_Map", - "logic": "Fungus2_18" - }, - { - "name": "Deepnest_Map-Upper", - "logic": "Deepnest_01b | Deepnest_01b[bot1]" - }, - { - "name": "Deepnest_Map-Right", - "logic": "(Fungus2_25[top1] | Fungus2_25[top2] | Fungus2_25[right1]) + (ANYCLAW | $SHRIEKPOGO)" - }, - { - "name": "Ancient_Basin_Map", - "logic": "Abyss_04[top1] + (RIGHTDASH | ANYCLAW | WINGS | RIGHTSUPERDASH | PRECISEMOVEMENT) | (Abyss_04[left1] | Abyss_04[right1] | Abyss_04[bot1]) + (ANYCLAW | WINGS + ENEMYPOGOS)" - }, - { - "name": "Kingdom's_Edge_Map", - "logic": "Deepnest_East_03" - }, - { - "name": "City_of_Tears_Map", - "logic": "(Ruins1_31 | Ruins1_31[bot1] | Ruins1_31[left1])" - }, - { - "name": "Royal_Waterways_Map", - "logic": "(Waterways_09[left1] | Waterways_09[right1]) + (LEFTCLAW | ((LEFTDASH | LEFTSUPERDASH) + RIGHTCLAW) | WINGS) | $StartLocation[West Waterways]" - }, - { - "name": "Howling_Cliffs_Map", - "logic": "Cliffs_01[right1] | Cliffs_01[right2] | Cliffs_01 + (FULLDASH + ENEMYPOGOS | ANYCLAW | WINGS)" - }, - { - "name": "Crystal_Peak_Map", - "logic": "Mines_30[right1] | (RIGHTSUPERDASH + Mines_30[left1])" - }, - { - "name": "Queen's_Gardens_Map", - "logic": "Fungus1_24[left1] + (ANYCLAW | WINGS)" - }, - { - "name": "Resting_Grounds_Map", - "logic": "RestingGrounds_09[left1] | Resting_Grounds_Stag + Can_Stag" - }, - { - "name": "Dirtmouth_Stag", - "logic": "Room_Town_Stag_Station[left1] | Can_Stag" - }, - { - "name": "Crossroads_Stag", - "logic": "Crossroads_47[right1] | Crossroads_Stag + Can_Stag" - }, - { - "name": "Greenpath_Stag", - "logic": "Fungus1_16_alt[right1] | Greenpath_Stag + Can_Stag" - }, - { - "name": "Queen's_Station_Stag", - "logic": "Fungus2_02[right1] | Queen's_Station_Stag + Can_Stag" - }, - { - "name": "Queen's_Gardens_Stag", - "logic": "Fungus3_40[top1] + (RIGHTDASH | WINGS | RIGHTCLAW | LEFTCLAW + RIGHTSUPERDASH | ENEMYPOGOS | $SHADESKIP | SPELLAIRSTALL + $CASTSPELL[2,before:ROOMSOUL]) | Fungus3_40[right1] | Queen's_Gardens_Stag + Can_Stag | Bench-Gardens_Stag" - }, - { - "name": "City_Storerooms_Stag", - "logic": "Ruins1_29[left1] | City_Storerooms_Stag + Can_Stag" - }, - { - "name": "King's_Station_Stag", - "logic": "Ruins2_08[left1] | King's_Station_Stag + Can_Stag" - }, - { - "name": "Resting_Grounds_Stag", - "logic": "RestingGrounds_09[left1] | Resting_Grounds_Stag + Can_Stag" - }, - { - "name": "Distant_Village_Stag", - "logic": "Deepnest_09[left1] | Distant_Village_Stag + Can_Stag" - }, - { - "name": "Hidden_Station_Stag", - "logic": "Abyss_22[left1] | Hidden_Station_Stag + Can_Stag" - }, - { - "name": "Stag_Nest_Stag", - "logic": "Cliffs_03[right1] | (Stag_Nest_Stag | ALLSTAGS) + Can_Stag" - }, - { - "name": "Lifeblood_Cocoon-King's_Pass", - "logic": "Tutorial_01" - }, - { - "name": "Lifeblood_Cocoon-Ancestral_Mound", - "logic": "Crossroads_ShamanTemple[left1] + (UPWALLBREAK | (((LEFTSUPERDASH + RIGHTCLAW) | (RIGHTSUPERDASH + LEFTCLAW)) + OBSCURESKIPS))" - }, - { - "name": "Lifeblood_Cocoon-Greenpath", - "logic": "Fungus1_32[bot1] | Fungus1_32[top1] | Fungus1_32[left1]" - }, - { - "name": "Lifeblood_Cocoon-Fog_Canyon_West", - "logic": "Fungus3_30[bot1]" - }, - { - "name": "Lifeblood_Cocoon-Mantis_Village", - "logic": "(Fungus2_15[top3] | Fungus2_15[right1] | Fungus2_15[left1]) + (LEFTCLAW + WINGS | RIGHTCLAW + LEFTSUPERDASH | $SHRIEKPOGO[4])" - }, - { - "name": "Lifeblood_Cocoon-Failed_Tramway", - "logic": "(Deepnest_26 + (LEFTCLAW | WINGS + ENEMYPOGOS | $SHRIEKPOGO) | Deepnest_26[left1] + Opened_Tramway_Exit_Gate) + (LEFTCLAW | WINGS + (RIGHTCLAW + (LEFTDASH | LEFTSUPERDASH | OBSCURESKIPS + PRECISEMOVEMENT) | ENEMYPOGOS | $SHADESKIP))" - }, - { - "name": "Lifeblood_Cocoon-Galien", - "logic": "Deepnest_40[right1] + (RIGHTCLAW | WINGS + LEFTCLAW | LEFTCLAW + LEFTDASH + OBSCURESKIPS | $SHRIEKPOGO[2,2,before:AREASOUL])" - }, - { - "name": "Lifeblood_Cocoon-Kingdom's_Edge", - "logic": "Deepnest_East_15[left1]" - }, - { - "name": "Grimmkin_Flame-City_Storerooms", - "logic": "Ruins1_28 + GRIMMCHILD" - }, - { - "name": "Grimmkin_Flame-Greenpath", - "logic": "(Fungus1_10[left1] | Fungus1_10[top1] | Fungus1_10[right1]) + GRIMMCHILD" - }, - { - "name": "Grimmkin_Flame-Crystal_Peak", - "logic": "(Mines_10[bot1] + (RIGHTCLAW + RIGHTSUPERDASH + (LEFTCLAW | RIGHTDASH + WINGS) | RIGHTDASH + $SHRIEKPOGO[3,1] | RIGHTSUPERDASH + $SHRIEKPOGO[3,2] | COMPLEXSKIPS + WINGS + RIGHTDASH + SPELLAIRSTALL + $SHADESKIP[2HITS] + $CASTSPELL[2]) | Mines_10[right1] + (LEFTSUPERDASH | WINGS + LEFTDASH + (LEFTCLAW + (SPELLAIRSTALL + $CASTSPELL[2] | OBSCURESKIPS + LEFTSHARPSHADOW) | $SHRIEKPOGO))) + GRIMMCHILD" - }, - { - "name": "Grimmkin_Flame-King's_Pass", - "logic": "Tutorial_01 + First_Grimmchild_Upgrade + GRIMMCHILD" - }, - { - "name": "Grimmkin_Flame-Resting_Grounds", - "logic": "(RestingGrounds_06[left1] | RestingGrounds_06[right1] | RestingGrounds_06[top1]) + First_Grimmchild_Upgrade + GRIMMCHILD" - }, - { - "name": "Grimmkin_Flame-Kingdom's_Edge", - "logic": "Deepnest_East_03 + First_Grimmchild_Upgrade + GRIMMCHILD" - }, - { - "name": "Grimmkin_Flame-Fungal_Core", - "logic": "Fungus2_30[top1] + Second_Grimmchild_Upgrade + GRIMMCHILD" - }, - { - "name": "Grimmkin_Flame-Ancient_Basin", - "logic": "(Abyss_02[right1] | (Abyss_02[bot1] + (LEFTCLAW | WINGS) + (RIGHTCLAW | WINGS | RIGHTDASH | RIGHTSUPERDASH | ENEMYPOGOS))) + Second_Grimmchild_Upgrade + GRIMMCHILD" - }, - { - "name": "Grimmkin_Flame-Hive", - "logic": "(Hive_03[right1] | (Hive_03[bot1] + (FULLCLAW | WINGS | (FULLDASH + ENEMYPOGOS)))) + Second_Grimmchild_Upgrade + GRIMMCHILD" - }, - { - "name": "Grimmkin_Flame-Brumm", - "logic": "Room_spider_small[left1] + Second_Grimmchild_Upgrade + GRIMMCHILD" - }, - { - "name": "Hunter's_Journal", - "logic": "Fungus1_08[left1]" - }, - { - "name": "Journal_Entry-Void_Tendrils", - "logic": "Abyss_09[right3]" - }, - { - "name": "Journal_Entry-Charged_Lumafly", - "logic": "Uumuu_Arena + Defeated_Uumuu + (RIGHTCLAW + (ACID | RIGHTSUPERDASH | RIGHTDASH + WINGS | RIGHTSHARPSHADOW + SPELLAIRSTALL + $CASTSPELL[3,before:ROOMSOUL]) | LEFTCLAW + WINGS + (ACID | RIGHTSUPERDASH | RIGHTDASH + SPELLAIRSTALL + $CASTSPELL[3,before:ROOMSOUL]) | ACIDSKIPS + (RIGHTSUPERDASH + $SHRIEKPOGO[4,1,before:AREASOUL,NORIGHTSTALL] | ACID + $SHRIEKPOGO[3,1,before:AREASOUL,NORIGHTSTALL] | RIGHTDASH + $SHRIEKPOGO[1,3,1,before:AREASOUL] | RIGHTCLAW + $SHRIEKPOGO[2,1,before:ROOMSOUL] | LEFTCLAW + $SHRIEKPOGO[3,before:ROOMSOUL] | RIGHTDASH + LEFTCLAW + $SHRIEKPOGO[before:ROOMSOUL]))" - }, - { - "name": "Journal_Entry-Goam", - "logic": "Crossroads_52[left1] + Broke_Goam_Entry_Quake_Floor" - }, - { - "name": "Journal_Entry-Garpede", - "logic": "Deepnest_44[top1]" - }, - { - "name": "Journal_Entry-Seal_of_Binding", - "logic": "White_Palace_20[bot1] + Completed_Path_of_Pain" - }, - { - "name": "Elevator_Pass", - "logic": "Crossroads_49b[right1]" - }, - { - "name": "Split_Mothwing_Cloak", - "logic": "*Mothwing_Cloak" - }, - { - "name": "Left_Mantis_Claw", - "logic": "*Mantis_Claw" - }, - { - "name": "Right_Mantis_Claw", - "logic": "*Mantis_Claw" - }, - { - "name": "Split_Crystal_Heart", - "logic": "Mines_31[left1] + RIGHTSUPERDASH | Mines_31 + (RIGHTDASH | WINGS | RIGHTSUPERDASH | SPELLAIRSTALL + $CASTSPELL | PRECISEMOVEMENT + (RIGHTCLAW | LEFTDASH))" - }, - { - "name": "Leftslash", - "logic": "Tutorial_01" - }, - { - "name": "Rightslash", - "logic": "Tutorial_01" - }, - { - "name": "Upslash", - "logic": "Tutorial_01" - }, - { - "name": "Egg_Shop", - "logic": "Room_Ouiji[left1]" - }, - { - "name": "Geo_Rock-Broken_Elevator_1", - "logic": "Abyss_01[right1] | Abyss_01[left1] | (Abyss_01 + (WINGS | RIGHTCLAW | (LEFTCLAW + FULLDASH)))" - }, - { - "name": "Geo_Rock-Broken_Elevator_2", - "logic": "(Abyss_01[right1] | Abyss_01[left1] | (Abyss_01 + (WINGS | RIGHTCLAW | (LEFTCLAW + FULLDASH)))) + (RIGHTDASH | LEFTCLAW + RIGHTSUPERDASH | SPIKETUNNELS)" - }, - { - "name": "Geo_Rock-Broken_Elevator_3", - "logic": "Abyss_01[right1] | Abyss_01[left1] | (Abyss_01 + (WINGS | RIGHTCLAW | (LEFTCLAW + FULLDASH)))" - }, - { - "name": "Geo_Rock-Broken_Bridge_Upper", - "logic": "(Abyss_02[right1] | (Abyss_02[bot1] + (LEFTCLAW | WINGS))) + (RIGHTCLAW | WINGS | ENEMYPOGOS)" - }, - { - "name": "Geo_Rock-Broken_Bridge_Lower", - "logic": "Abyss_02[right1] | (Abyss_02[bot1] + (LEFTCLAW | WINGS))" - }, - { - "name": "Geo_Rock-Broken_Bridge_Lower_Dupe", - "logic": "*Geo_Rock-Broken_Bridge_Lower" - }, - { - "name": "Geo_Rock-Abyss_1", - "logic": "(Abyss_06_Core[top1] + BRAND + (LEFTDASH | LEFTCLAW | WINGS | RIGHTSUPERDASH)) | ((Abyss_06_Core[left1] | Abyss_06_Core[left3] | Abyss_06_Core[right2] | Abyss_06_Core[bot1]) + ((FULLCLAW + FULLDASH) | WINGS))" - }, - { - "name": "Geo_Rock-Abyss_2", - "logic": "(Abyss_06_Core[top1] + BRAND + (LEFTDASH | LEFTCLAW | WINGS)) | ((Abyss_06_Core[left1] | Abyss_06_Core[left3] | Abyss_06_Core[right2] | Abyss_06_Core[bot1]) + ((FULLCLAW + FULLDASH) | WINGS))" - }, - { - "name": "Geo_Rock-Abyss_3", - "logic": "(Abyss_06_Core[top1] + BRAND) | ((Abyss_06_Core[left3] | Abyss_06_Core[right2] | Abyss_06_Core[bot1]) + ((LEFTCLAW + (PRECISEMOVEMENT | RIGHTCLAW) + FULLDASH) | WINGS)) | Abyss_06_Core[left1]" - }, - { - "name": "Geo_Rock-Basin_Tunnel", - "logic": "(Abyss_18[right1] + (LEFTCLAW | WINGS | LEFTSUPERDASH)) | (Abyss_18[left1] + (RIGHTCLAW | WINGS | RIGHTSUPERDASH))" - }, - { - "name": "Geo_Rock-Basin_Grub", - "logic": "Abyss_19 + WINGS" - }, - { - "name": "Geo_Rock-Basin_Before_Broken_Vessel", - "logic": "(Abyss_19[bot1] + (ANYCLAW | WINGS)) | Abyss_19[bot2] | Abyss_19[right1]" - }, - { - "name": "Geo_Rock-Cliffs_Main_1", - "logic": "Cliffs_01[right1] | Cliffs_01[right2] + (LEFTDASH | ANYCLAW | WINGS) | (Cliffs_01[right3] | Cliffs_01[right4]) + ((FULLDASH + ENEMYPOGOS) | ANYCLAW | WINGS)" - }, - { - "name": "Geo_Rock-Cliffs_Main_2", - "logic": "Cliffs_01[right1] | Cliffs_01[right2] | ((Cliffs_01[right3] | Cliffs_01[right4]) + ((FULLDASH + ENEMYPOGOS) | ANYCLAW | WINGS))" - }, - { - "name": "Geo_Rock-Cliffs_Main_3", - "logic": "((Cliffs_01[right1] | Cliffs_01[right2]) + (RIGHTDASH | ANYCLAW | WINGS | RIGHTSUPERDASH | ENEMYPOGOS | SPELLAIRSTALL + $CASTSPELL[2,before:ROOMSOUL])) | ((Cliffs_01[right3] | Cliffs_01[right4]) + ((FULLDASH + ENEMYPOGOS) | ANYCLAW | WINGS))" - }, - { - "name": "Geo_Rock-Cliffs_Main_4", - "logic": "Cliffs_01[right1] | Cliffs_01[right2] | ((Cliffs_01[right3] | Cliffs_01[right4]) + ((FULLDASH + ENEMYPOGOS) | ANYCLAW | WINGS))" - }, - { - "name": "Geo_Rock-Below_Gorb_Dupe", - "logic": "*Geo_Rock-Below_Gorb" - }, - { - "name": "Geo_Rock-Below_Gorb", - "logic": "Cliffs_02" - }, - { - "name": "Geo_Rock-Crossroads_Well", - "logic": "Crossroads_01[left1] | Crossroads_01[top1] | Crossroads_01[right1]" - }, - { - "name": "Geo_Rock-Crossroads_Center_Grub", - "logic": "Crossroads_05[left1] | Crossroads_05[right1]" - }, - { - "name": "Geo_Rock-Crossroads_Root", - "logic": "Crossroads_07 + (RIGHTCLAW | WINGS + LEFTCLAW | $SHRIEKPOGO[5,before:AREASOUL]) + UPWALLBREAK" - }, - { - "name": "Geo_Rock-Crossroads_Root_Dupe_1", - "logic": "*Geo_Rock-Crossroads_Root" - }, - { - "name": "Geo_Rock-Crossroads_Root_Dupe_2", - "logic": "*Geo_Rock-Crossroads_Root" - }, - { - "name": "Geo_Rock-Crossroads_Aspid_Arena", - "logic": "Crossroads_08" - }, - { - "name": "Geo_Rock-Crossroads_Aspid_Arena_Dupe_1", - "logic": "*Geo_Rock-Crossroads_Aspid_Arena" - }, - { - "name": "Geo_Rock-Crossroads_Aspid_Arena_Dupe_2", - "logic": "*Geo_Rock-Crossroads_Aspid_Arena" - }, - { - "name": "Geo_Rock-Crossroads_Aspid_Arena_Hidden", - "logic": "Crossroads_08" - }, - { - "name": "Geo_Rock-Crossroads_Above_False_Knight", - "logic": "(Crossroads_10[left1] | Crossroads_10[right1]) + Defeated_False_Knight + (ANYCLAW | WINGS + INFECTED | $SHRIEKPOGO[2,before:AREASOUL])" - }, - { - "name": "Geo_Rock-Crossroads_Before_Acid_Grub", - "logic": "Crossroads_12[left1] | Crossroads_12[right1]" - }, - { - "name": "Geo_Rock-Crossroads_Below_Goam_Mask_Shard", - "logic": "Crossroads_13[left1] | Crossroads_13[right1]" - }, - { - "name": "Geo_Rock-Crossroads_After_Goam_Mask_Shard", - "logic": "Crossroads_13[left1] | Crossroads_13[right1]" - }, - { - "name": "Geo_Rock-Crossroads_Above_Lever", - "logic": "Crossroads_16[left1] | Crossroads_16[right1] | Crossroads_16[bot1]" - }, - { - "name": "Geo_Rock-Crossroads_Before_Fungal", - "logic": "Crossroads_18[right1] | Crossroads_18[bot1] | Crossroads_18[right2]" - }, - { - "name": "Geo_Rock-Crossroads_Before_Fungal_Dupe_1", - "logic": "*Geo_Rock-Crossroads_Before_Fungal" - }, - { - "name": "Geo_Rock-Crossroads_Before_Fungal_Dupe_2", - "logic": "*Geo_Rock-Crossroads_Before_Fungal" - }, - { - "name": "Geo_Rock-Crossroads_Before_Shops", - "logic": "Crossroads_19" - }, - { - "name": "Geo_Rock-Crossroads_Before_Glowing_Womb", - "logic": "Crossroads_21" - }, - { - "name": "Geo_Rock-Crossroads_Above_Tram", - "logic": "Crossroads_27" - }, - { - "name": "Geo_Rock-Crossroads_Above_Mawlek", - "logic": "Crossroads_36[right1] | Crossroads_36[right2]" - }, - { - "name": "Geo_Rock-Crossroads_Vessel_Fragment", - "logic": "Crossroads_37[right1]" - }, - { - "name": "Geo_Rock-Crossroads_Goam_Alcove", - "logic": "Crossroads_42[left1] | Crossroads_42[right1]" - }, - { - "name": "Geo_Rock-Crossroads_Goam_Damage_Boost", - "logic": "(Crossroads_42[left1] | Crossroads_42[right1]) + $TAKEDAMAGE" - }, - { - "name": "Geo_Rock-Crossroads_Tram", - "logic": "Crossroads_46[left1] | Crossroads_46b[right1] + TRAM" - }, - { - "name": "Geo_Rock-Crossroads_Goam_Journal", - "logic": "Crossroads_52[left1] + Broke_Goam_Entry_Quake_Floor" - }, - { - "name": "Geo_Rock-Crossroads_Goam_Journal_Dupe", - "logic": "*Geo_Rock-Crossroads_Goam_Journal" - }, - { - "name": "Geo_Rock-Ancestral_Mound", - "logic": "Crossroads_ShamanTemple[left1] + (UPWALLBREAK | (LEFTSUPERDASH + RIGHTCLAW | RIGHTSUPERDASH + LEFTCLAW) + OBSCURESKIPS)" - }, - { - "name": "Geo_Rock-Ancestral_Mound_Dupe", - "logic": "*Geo_Rock-Ancestral_Mound" - }, - { - "name": "Geo_Rock-Ancestral_Mound_Tree", - "logic": "Crossroads_ShamanTemple[left1] + (WINGS | ENEMYPOGOS + (RIGHTCLAW | COMPLEXSKIPS)) + (UPWALLBREAK | (LEFTSUPERDASH + RIGHTCLAW | RIGHTSUPERDASH + LEFTCLAW) + OBSCURESKIPS)" - }, - { - "name": "Geo_Rock-Ancestral_Mound_Tree_Dupe", - "logic": "*Geo_Rock-Ancestral_Mound_Tree" - }, - { - "name": "Geo_Rock-Moss_Prophet", - "logic": "Deepnest_01" - }, - { - "name": "Geo_Rock-Moss_Prophet_Dupe", - "logic": "*Geo_Rock-Moss_Prophet" - }, - { - "name": "Geo_Rock-Deepnest_Below_Mimics", - "logic": "Deepnest_02" - }, - { - "name": "Geo_Rock-Deepnest_Below_Mimics_Dupe", - "logic": "*Geo_Rock-Deepnest_Below_Mimics" - }, - { - "name": "Geo_Rock-Deepnest_Below_Spike_Grub", - "logic": "Deepnest_03[top1] | Deepnest_03[left1] + RIGHTCLAW | Deepnest_03 + (FULLCLAW | WINGS | LEFTCLAW + $SHADESKIP | RIGHTCLAW + ENEMYPOGOS + COMPLEXSKIPS)" - }, - { - "name": "Geo_Rock-Deepnest_Below_Spike_Grub_Dupe", - "logic": "*Geo_Rock-Deepnest_Below_Spike_Grub" - }, - { - "name": "Geo_Rock-Deepnest_Spike_Grub_Right", - "logic": "Deepnest_03[top1] | Deepnest_03[left1] + RIGHTCLAW | Deepnest_03 + (FULLCLAW | WINGS | LEFTCLAW + $SHADESKIP | RIGHTCLAW + ENEMYPOGOS + COMPLEXSKIPS)" - }, - { - "name": "Geo_Rock-Deepnest_By_Mantis_Lords_Garpede_Pogo", - "logic": "Deepnest_16[bot1]" - }, - { - "name": "Geo_Rock-Deepnest_By_Mantis_Lords_Garpede_Pogo_Dupe", - "logic": "*Geo_Rock-Deepnest_By_Mantis_Lords_Garpede_Pogo" - }, - { - "name": "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_1", - "logic": "Deepnest_16[bot1] + (LEFTCLAW | RIGHTCLAW + WINGS | $SHRIEKPOGO[6])" - }, - { - "name": "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_2", - "logic": "Deepnest_16[bot1] + (LEFTCLAW | RIGHTCLAW + WINGS | $SHRIEKPOGO[6])" - }, - { - "name": "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_3", - "logic": "Deepnest_16[bot1] + (LEFTCLAW | RIGHTCLAW + WINGS | $SHRIEKPOGO[6])" - }, - { - "name": "Geo_Rock-Deepnest_Nosk_1", - "logic": "Deepnest_31[right1] + (ANYCLAW | WINGS | LEFTDASH) | Deepnest_31[right2] + (ANYCLAW | WINGS)" - }, - { - "name": "Geo_Rock-Deepnest_Nosk_2", - "logic": "Deepnest_31[right1] + (ANYCLAW | WINGS | LEFTDASH) | Deepnest_31[right2] + (ANYCLAW | WINGS)" - }, - { - "name": "Geo_Rock-Deepnest_Nosk_3", - "logic": "Deepnest_31[right2] | Deepnest_31[right1] + (ANYCLAW | $SHRIEKPOGO[3,before:AREASOUL])" - }, - { - "name": "Geo_Rock-Deepnest_Above_Galien", - "logic": "(LANTERN | DARKROOMS) + (Deepnest_35[top1] | Deepnest_35 + (ANYCLAW | $SHRIEKPOGO[8,before:AREASOUL]))" - }, - { - "name": "Geo_Rock-Deepnest_Galien_Spike", - "logic": "Deepnest_35 + (RIGHTCLAW | WINGS + LEFTCLAW | $SHRIEKPOGO[3,before:AREASOUL])" - }, - { - "name": "Geo_Rock-Deepnest_Garpede_1", - "logic": "Deepnest_37" - }, - { - "name": "Geo_Rock-Deepnest_Garpede_2", - "logic": "Deepnest_37" - }, - { - "name": "Geo_Rock-Dark_Deepnest_Above_Grub_1", - "logic": "(LANTERN | DARKROOMS) + (Deepnest_39 + (RIGHTCLAW | WINGS + (LEFTCLAW | ENEMYPOGOS)) | Deepnest_39[top1] | Deepnest_39[left1] + (RIGHTCLAW | WINGS | RIGHTDASH))" - }, - { - "name": "Geo_Rock-Dark_Deepnest_Above_Grub_2", - "logic": "*Geo_Rock-Dark_Deepnest_Above_Grub_1" - }, - { - "name": "Geo_Rock-Dark_Deepnest_Bottom_Left", - "logic": "Deepnest_39" - }, - { - "name": "Geo_Rock-Above_Mask_Maker_1", - "logic": "((Deepnest_43[bot1] + FULLCLAW) | Deepnest_43[left1] | Deepnest_43[right1]) + (ANYCLAW | WINGS)" - }, - { - "name": "Geo_Rock-Above_Mask_Maker_2", - "logic": "((Deepnest_43[bot1] + FULLCLAW) | Deepnest_43[left1] | Deepnest_43[right1]) + (ANYCLAW | WINGS)" - }, - { - "name": "Geo_Rock-Lower_Kingdom's_Edge_1", - "logic": "(Deepnest_East_01[bot1] | Deepnest_East_01[top1] | Deepnest_East_01[right1]) + (LEFTDASH | ANYCLAW | WINGS | ENEMYPOGOS)" - }, - { - "name": "Geo_Rock-Lower_Kingdom's_Edge_2", - "logic": "((Deepnest_East_01[bot1] + (RIGHTCLAW | WINGS)) | Deepnest_East_01[top1] | Deepnest_East_01[right1]) + (LEFTDASH | ANYCLAW | WINGS | ENEMYPOGOS)" - }, - { - "name": "Geo_Rock-Lower_Kingdom's_Edge_3", - "logic": "Deepnest_East_02" - }, - { - "name": "Geo_Rock-Lower_Kingdom's_Edge_Dive", - "logic": "Deepnest_East_02 + Broke_Lower_Edge_Quake_Floor | Deepnest_East_02[bot2] + (ACID | RIGHTSKIPACID)" - }, - { - "name": "Geo_Rock-Kingdom's_Edge_Below_Bardoon", - "logic": "Deepnest_East_04" - }, - { - "name": "Geo_Rock-Kingdom's_Edge_Oro_Far_Left", - "logic": "(Deepnest_East_06[left1] | Deepnest_East_06[top1] | (Deepnest_East_06[bot1] | Deepnest_East_06[door1] | Deepnest_East_06[right1]) + (LEFTCLAW | WINGS + ENEMYPOGOS)) + (RIGHTCLAW | WINGS + LEFTCLAW | WINGS + $SHADESKIP | WINGS + $SHRIEKPOGO[2,before:ROOMSOUL])" - }, - { - "name": "Geo_Rock-Kingdom's_Edge_Oro_Middle_Left", - "logic": "Deepnest_East_06[top1] | Deepnest_East_06[left1] + (RIGHTCLAW | WINGS + BACKGROUNDPOGOS) | (Deepnest_East_06[bot1] | Deepnest_East_06[door1] | Deepnest_East_06[right1]) + (LEFTCLAW | WINGS + ENEMYPOGOS)" - }, - { - "name": "Geo_Rock-Kingdom's_Edge_Above_Root", - "logic": "Deepnest_East_07" - }, - { - "name": "Geo_Rock-Kingdom's_Edge_Above_Tower", - "logic": "Deepnest_East_07" - }, - { - "name": "Geo_Rock-Kingdom's_Edge_Below_Colosseum", - "logic": "(Deepnest_East_08[top1] | (Deepnest_East_08[right1] + (ANYCLAW | WINGS))) + (ANYCLAW | WINGS | RIGHTDASH)" - }, - { - "name": "Geo_Rock-Kingdom's_Edge_Above_420_Geo_Rock", - "logic": "Deepnest_East_17[left1] + Broke_420_Rock_Quake_Floor_1 + Broke_420_Rock_Quake_Floor_2" - }, - { - "name": "Geo_Rock-Kingdom's_Edge_420_Geo_Rock", - "logic": "Deepnest_East_17[left1] + Broke_420_Rock_Quake_Floor_1 + Broke_420_Rock_Quake_Floor_2 + Broke_420_Rock_Quake_Floor_3 + Broke_420_Rock_Quake_Floor_4 + Broke_420_Rock_Quake_Floor_5 + Broke_420_Rock_Quake_Floor_6 + Broke_420_Rock_Quake_Floor_7 + Broke_420_Rock_Quake_Floor_8 + Broke_420_Rock_Quake_Floor_9 + Broke_420_Rock_Quake_Floor_10 + Broke_420_Rock_Quake_Floor_11" - }, - { - "name": "Geo_Rock-Beast's_Den_Above_Trilobite", - "logic": "Deepnest_Spider_Town[left1] + (FULLCLAW | WINGS + ANYCLAW | WINGS + COMPLEXSKIPS + $SHADESKIP[2HITS] | $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL]) + COMBAT[Left_Devout] | Bench-Beast's_Den + (LEFTCLAW | RIGHTCLAW + WINGS | $SHRIEKPOGO[1,2,2])" - }, - { - "name": "Geo_Rock-Beast's_Den_Above_Trilobite_Dupe", - "logic": "*Geo_Rock-Beast's_Den_Above_Trilobite" - }, - { - "name": "Geo_Rock-Beast's_Den_Below_Herrah", - "logic": "Deepnest_Spider_Town[left1] + (WINGS + ANYCLAW | (FULLCLAW | WINGS + COMPLEXSKIPS + $SHADESKIP[2HITS] | $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL]) + COMBAT[Left_Devout]) | Bench-Beast's_Den + $SHRIEKPOGO[1,2,2]" - }, - { - "name": "Geo_Rock-Beast's_Den_Below_Egg", - "logic": "Deepnest_Spider_Town[left1] + (WINGS + ANYCLAW | (FULLCLAW | WINGS + COMPLEXSKIPS + $SHADESKIP[2HITS] | $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL]) + COMBAT[Left_Devout]) | Bench-Beast's_Den + $SHRIEKPOGO[1,2,2]" - }, - { - "name": "Geo_Rock-Beast's_Den_Below_Egg_Dupe", - "logic": "*Geo_Rock-Beast's_Den_Below_Egg" - }, - { - "name": "Geo_Rock-Beast's_Den_Bottom", - "logic": "Deepnest_Spider_Town[left1]" - }, - { - "name": "Geo_Rock-Beast's_Den_Bottom_Dupe", - "logic": "*Geo_Rock-Beast's_Den_Bottom" - }, - { - "name": "Geo_Rock-Beast's_Den_After_Herrah", - "logic": "Deepnest_Spider_Town[left1] + (WINGS + ANYCLAW + (Herrah | COMBAT[Right_Devout]) | (FULLCLAW | $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[3,before:ROOMSOUL]) + (Herrah + COMBAT[Left_Devout] | COMBAT[Any_Devout])) | Bench-Beast's_Den + $SHRIEKPOGO[1,2,2] + $SHRIEKPOGO[3,before:ROOMSOUL] + (Herrah | COMBAT[Left_Devout])" - }, - { - "name": "Geo_Rock-Greenpath_Entrance", - "logic": "Fungus1_01[left1] | Fungus1_01[right1]" - }, - { - "name": "Geo_Rock-Greenpath_Waterfall", - "logic": "Fungus1_01b[left1] | Fungus1_01b[right1]" - }, - { - "name": "Geo_Rock-Greenpath_Below_Skip_Squit", - "logic": "Fungus1_02[left1] | Fungus1_02[right1] | Fungus1_02[right2]" - }, - { - "name": "Geo_Rock-Greenpath_Skip_Squit", - "logic": "Fungus1_02[left1] | Fungus1_02[right1] | Fungus1_02[right2]" - }, - { - "name": "Geo_Rock-Greenpath_Second_Skip_Fool_Eater", - "logic": "Fungus1_03[left1] | Fungus1_03[right1] | Fungus1_03[bot1]" - }, - { - "name": "Geo_Rock-Greenpath_Second_Skip_Fool_Eater_Dupe", - "logic": "*Geo_Rock-Greenpath_Second_Skip_Fool_Eater" - }, - { - "name": "Geo_Rock-Greenpath_Second_Skip_Lower", - "logic": "Fungus1_03[left1] | Fungus1_03[right1] | Fungus1_03[bot1]" - }, - { - "name": "Geo_Rock-Greenpath_Below_Hornet", - "logic": "(Fungus1_04[left1] | Fungus1_04[right1] + Defeated_Hornet_1) + (RIGHTDASH | WINGS | (RIGHTSUPERDASH | ACID) + RIGHTCLAW) | Fungus1_04[left1] + (ACID + LEFTCLAW | SPELLAIRSTALL + $CASTSPELL[3]) | Fungus1_04[right1] + Defeated_Hornet_1 + (LEFTCLAW + PRECISEMOVEMENT | SPELLAIRSTALL + $CASTSPELL[2])" - }, - { - "name": "Geo_Rock-Greenpath_Above_Thorns", - "logic": "Fungus1_05[top1] | Fungus1_05[right1] | Fungus1_05[bot1]" - }, - { - "name": "Geo_Rock-Greenpath_Hunter's_Journal", - "logic": "Fungus1_07[top1] | Fungus1_07[left1] | Fungus1_07[right1]" - }, - { - "name": "Geo_Rock-Greenpath_Acid_Bridge", - "logic": "(Fungus1_10[left1] | Fungus1_10[right1] | Fungus1_10[top1]) + (ANYDASH | RIGHTCLAW | WINGS | SPELLAIRSTALL + $CASTSPELL[2,before:ROOMSOUL] | $SHADESKIP | LEFTCLAW + OBSCURESKIPS + PRECISEMOVEMENT)" - }, - { - "name": "Geo_Rock-Greenpath_After_MMC_Hidden", - "logic": "(Fungus1_12[left1] | Fungus1_12[right1])" - }, - { - "name": "Geo_Rock-Greenpath_After_MMC", - "logic": "(Fungus1_12[left1] | Fungus1_12[right1])" - }, - { - "name": "Geo_Rock-Greenpath_After_MMC_Dupe", - "logic": "*Geo_Rock-Greenpath_After_MMC" - }, - { - "name": "Geo_Rock-Greenpath_Obbles_Fool_Eater", - "logic": "Fungus1_19[left1] | Fungus1_19[right1] | Fungus1_19[bot1]" - }, - { - "name": "Geo_Rock-Greenpath_Moss_Knights", - "logic": "Fungus1_21" - }, - { - "name": "Geo_Rock-Greenpath_Moss_Knights_Dupe_1", - "logic": "*Geo_Rock-Greenpath_Moss_Knights" - }, - { - "name": "Geo_Rock-Greenpath_Moss_Knights_Dupe_2", - "logic": "*Geo_Rock-Greenpath_Moss_Knights" - }, - { - "name": "Geo_Rock-Greenpath_Below_Stag", - "logic": "Fungus1_22[top1] | Fungus1_22[left1]" - }, - { - "name": "Geo_Rock-Greenpath_Below_Stag_Fool_Eater", - "logic": "Fungus1_22[top1] | Fungus1_22[left1] | Fungus1_22[bot1]" - }, - { - "name": "Geo_Rock-Baldur_Shell_Top_Left", - "logic": "Fungus1_28[left1] | Fungus1_28[left2]" - }, - { - "name": "Geo_Rock-Baldur_Shell_Alcove", - "logic": "Fungus1_28[left1] | Fungus1_28[left2]" - }, - { - "name": "Geo_Rock-Greenpath_MMC", - "logic": "Fungus1_29[left1] | Fungus1_29[right1]" - }, - { - "name": "Geo_Rock-Greenpath_Below_Toll", - "logic": "Fungus1_31[top1] | Fungus1_31[bot1] | Fungus1_31[right1]" - }, - { - "name": "Geo_Rock-Greenpath_Toll_Hidden", - "logic": "Fungus1_31[top1] | Fungus1_31[bot1] | Fungus1_31[right1]" - }, - { - "name": "Geo_Rock-Greenpath_Toll_Hidden_Dupe", - "logic": "*Geo_Rock-Greenpath_Toll_Hidden" - }, - { - "name": "Geo_Rock-Fungal_Below_Shrumal_Ogres", - "logic": "Fungus2_04" - }, - { - "name": "Geo_Rock-Fungal_Above_Cloth", - "logic": "Fungus2_08[left1] | Fungus2_08[left2] | Fungus2_08[right1]" - }, - { - "name": "Geo_Rock-Fungal_After_Cloth", - "logic": "(Fungus2_10[right1] | Fungus2_10[right2] | Fungus2_10[bot1]) + (RIGHTDASH | RIGHTCLAW | WINGS)" - }, - { - "name": "Geo_Rock-Fungal_Below_Pilgrim's_Way", - "logic": "Fungus2_11[top1] | Fungus2_11[left1] | Fungus2_11[left2] | Fungus2_11[right1]" - }, - { - "name": "Geo_Rock-Fungal_Below_Pilgrim's_Way_Dupe", - "logic": "*Geo_Rock-Fungal_Below_Pilgrim's_Way" - }, - { - "name": "Geo_Rock-Mantis_Outskirts_Guarded", - "logic": "Fungus2_13" - }, - { - "name": "Geo_Rock-Mantis_Outskirts_Guarded_Dupe", - "logic": "*Geo_Rock-Mantis_Outskirts_Guarded" - }, - { - "name": "Geo_Rock-Mantis_Outskirts_Alcove", - "logic": "Fungus2_13 + (LEFTDASH | LEFTSUPERDASH | ANYCLAW | WINGS | ACID | ENEMYPOGOS | PRECISEMOVEMENT) | Fungus2_13[left3] + (RIGHTDASH | ACID | WINGS | LEFTCLAW | RIGHTCLAW + PRECISEMOVEMENT | SPELLAIRSTALL + $CASTSPELL[before:AREASOUL] | $SHADESKIP) | Bench-Bretta" - }, - { - "name": "Geo_Rock-Mantis_Village_After_Lever", - "logic": "Fungus2_14 + (RIGHTCLAW | WINGS | (LEFTCLAW + (RIGHTDASH | RIGHTSUPERDASH)) | ENEMYPOGOS)" - }, - { - "name": "Geo_Rock-Mantis_Village_Above_Claw", - "logic": "Fungus2_14 + (COMPLEXSKIPS + ENEMYPOGOS | WINGS | (ANYCLAW + (LEFTDASH | LEFTSUPERDASH | ENEMYPOGOS)))" - }, - { - "name": "Geo_Rock-Mantis_Village_Above_Claw_Dupe", - "logic": "*Geo_Rock-Mantis_Village_Above_Claw" - }, - { - "name": "Geo_Rock-Mantis_Village_Below_Lore", - "logic": "Fungus2_14[top1] | Fungus2_14 + (WINGS | LEFTDASH | LEFTSUPERDASH | FULLCLAW | SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL]) + (LEFTCLAW | RIGHTCLAW + WINGS | (RIGHTCLAW | WINGS) + OBSCURESKIPS + ENEMYPOGOS | $SHRIEKPOGO[before:ROOMSOUL])" - }, - { - "name": "Geo_Rock-Mantis_Village_Above_Lever", - "logic": "(Fungus2_14[top1] | Fungus2_14 + (WINGS | LEFTDASH | LEFTSUPERDASH | FULLCLAW | SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL]) + (LEFTCLAW | RIGHTCLAW + WINGS | (RIGHTCLAW | WINGS) + OBSCURESKIPS + ENEMYPOGOS | $SHRIEKPOGO[before:ROOMSOUL])) + (LEFTCLAW + (RIGHTDASH | RIGHTSUPERDASH | BACKGROUNDPOGOS) | WINGS | RIGHTCLAW)" - }, - { - "name": "Geo_Rock-Above_Mantis_Lords_1", - "logic": "Fungus2_15 + (ANYCLAW | WINGS | RIGHTDASH | RIGHTSUPERDASH | SPELLAIRSTALL + $CASTSPELL)" - }, - { - "name": "Geo_Rock-Above_Mantis_Lords_2", - "logic": "Fungus2_15" - }, - { - "name": "Geo_Rock-Fungal_After_Bouncy_Grub", - "logic": "Fungus2_18[right1]" - }, - { - "name": "Geo_Rock-Fungal_After_Bouncy_Grub_Dupe", - "logic": "*Geo_Rock-Fungal_After_Bouncy_Grub" - }, - { - "name": "Geo_Rock-Fungal_Bouncy_Grub_Lever", - "logic": "Fungus2_18[right1]" - }, - { - "name": "Geo_Rock-Fungal_After_Cornifer", - "logic": "Fungus2_18" - }, - { - "name": "Geo_Rock-Fungal_Above_City_Entrance", - "logic": "Fungus2_21[right1] + (FULLCLAW + (LEFTDASH | LEFTSUPERDASH | SPELLAIRSTALL + $CASTSPELL[before:ITEMSOUL] | PRECISEMOVEMENT + OBSCURESKIPS) | ANYCLAW + WINGS | $SHRIEKPOGO[7,before:ITEMSOUL])" - }, - { - "name": "Geo_Rock-Deepnest_By_Mantis_Lords_1", - "logic": "Fungus2_25[top1] | (Fungus2_25[top2] | Fungus2_25[right1]) + (ANYCLAW | WINGS)" - }, - { - "name": "Geo_Rock-Deepnest_By_Mantis_Lords_2", - "logic": "Fungus2_25[top1] | (Fungus2_25[top2] | Fungus2_25[right1]) + (ANYCLAW | WINGS)" - }, - { - "name": "Geo_Rock-Deepnest_Lower_Cornifer", - "logic": "(Fungus2_25[top1] | Fungus2_25[top2] | Fungus2_25[right1]) + (ANYCLAW | $SHRIEKPOGO)" - }, - { - "name": "Geo_Rock-Fungal_Core_Entrance", - "logic": "Fungus2_29" - }, - { - "name": "Geo_Rock-Fungal_Core_Hidden", - "logic": "Fungus2_30[top1]" - }, - { - "name": "Geo_Rock-Fungal_Core_Above_Elder", - "logic": "Fungus2_30[top1] + WINGS" - }, - { - "name": "Geo_Rock-Queen's_Gardens_Acid_Entrance", - "logic": "Fungus3_03[right1] + (RIGHTCLAW | WINGS + $SHADESKIP | $SHRIEKPOGO[before:AREASOUL])" - }, - { - "name": "Geo_Rock-Queen's_Gardens_Below_Stag", - "logic": "Fungus3_10[top1]" - }, - { - "name": "Geo_Rock-Fog_Canyon_East", - "logic": "Fungus3_26 + (FIREBALL | RIGHTDASHSLASH | DAMAGEBOOSTS + $TAKEDAMAGE[2])" - }, - { - "name": "Geo_Rock-Love_Key", - "logic": "Fungus3_39[left1]" - }, - { - "name": "Geo_Rock-Love_Key_Dupe", - "logic": "*Geo_Rock-Love_Key" - }, - { - "name": "Geo_Rock-Queen's_Gardens_Above_Marmu", - "logic": "(Fungus3_48[bot1] + (ANYCLAW | WINGS)) | (Fungus3_48[right2] + (RIGHTSUPERDASH | RIGHTDASH | SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL] | ANYCLAW | WINGS))" - }, - { - "name": "Geo_Rock-Pale_Lurker", - "logic": "GG_Lurker[left1] + (RIGHTCLAW + (WINGS + (RIGHTDASH | BACKGROUNDPOGOS) | RIGHTSUPERDASH + LEFTCLAW) | $SHRIEKPOGO[3] + BACKGROUNDPOGOS)" - }, - { - "name": "Geo_Rock-Godhome_Pipeway", - "logic": "GG_Pipeway[left1] + ((LEFTCLAW + RIGHTSUPERDASH) | (ANYCLAW + (RIGHTDASH | SWIM)) | WINGS) | GG_Pipeway[right1] + ((LEFTCLAW + RIGHTSUPERDASH) | (ANYCLAW + (RIGHTDASH | SWIM)) | WINGS)" - }, - { - "name": "Geo_Rock-Hive_Entrance", - "logic": "Hive_01[left1] | Hive_01[right1]" - }, - { - "name": "Geo_Rock-Hive_Outside_Bench", - "logic": "Hive_02[left2] | ((Hive_02[left1] | Hive_02[left3]) + (WINGS | ANYCLAW))" - }, - { - "name": "Geo_Rock-Hive_Below_Root", - "logic": "Hive_02[left1] | ((Hive_02[left2] | Hive_02[left3]) + (RIGHTDASH | WINGS | RIGHTCLAW | ENEMYPOGOS))" - }, - { - "name": "Geo_Rock-Hive_After_Root", - "logic": "Hive_02[left1] | ((Hive_02[left2] | Hive_02[left3]) + (RIGHTCLAW | WINGS | (FULLDASH + LEFTCLAW)))" - }, - { - "name": "Geo_Rock-Hive_Below_Stash", - "logic": "Hive_03[bot1] | Hive_03[right1]" - }, - { - "name": "Geo_Rock-Hive_Stash", - "logic": "Hive_03[right1] | (Hive_03[bot1] + (FULLCLAW | WINGS | (LEFTCLAW + FULLDASH) | (RIGHTCLAW + FULLDASH + ENEMYPOGOS)))" - }, - { - "name": "Geo_Rock-Hive_Stash_Dupe", - "logic": "*Geo_Rock-Hive_Stash" - }, - { - "name": "Geo_Rock-Hive_Below_Grub", - "logic": "Hive_04[left1] | (Hive_04[right1] + ((FULLCLAW + LEFTDASH) | WINGS))" - }, - { - "name": "Geo_Rock-Hive_Above_Mask", - "logic": "Hive_04[left1] | (Hive_04[right1] + ((FULLCLAW + LEFTDASH) | WINGS))" - }, - { - "name": "Geo_Rock-Crystal_Peak_Lower_Middle", - "logic": "Mines_02[top2] | Mines_02 + (RIGHTCLAW | WINGS)" - }, - { - "name": "Geo_Rock-Crystal_Peak_Lower_Conveyer_1", - "logic": "Mines_02" - }, - { - "name": "Geo_Rock-Crystal_Peak_Lower_Conveyer_2", - "logic": "Mines_02" - }, - { - "name": "Geo_Rock-Crystal_Peak_Before_Dark_Room", - "logic": "Mines_04" - }, - { - "name": "Geo_Rock-Crystal_Peak_Before_Dark_Room_Dupe", - "logic": "*Geo_Rock-Crystal_Peak_Before_Dark_Room" - }, - { - "name": "Geo_Rock-Crystal_Peak_Above_Spike_Grub", - "logic": "Mines_05" - }, - { - "name": "Geo_Rock-Crystal_Peak_Mimic_Grub", - "logic": "Mines_16[top1] + (ANYCLAW | WINGS | ENEMYPOGOS + DANGEROUSSKIPS)" - }, - { - "name": "Geo_Rock-Crystal_Peak_Dive_Egg", - "logic": "Mines_20 + Broke_Crystal_Peak_Dive_Egg_Quake_Floor" - }, - { - "name": "Geo_Rock-Crystal_Peak_Dive_Egg_Dupe", - "logic": "*Geo_Rock-Crystal_Peak_Dive_Egg" - }, - { - "name": "Geo_Rock-Crystal_Peak_Conga_Line", - "logic": "Mines_20" - }, - { - "name": "Geo_Rock-Hallownest_Crown_Dive", - "logic": "(Mines_25[top1] | Mines_25[left1] + (FULLCLAW | WINGS + ANYCLAW | ENEMYPOGOS + BACKGROUNDPOGOS + $SHRIEKPOGO[5])) + Broke_Hallownest's_Crown_Quake_Floor" - }, - { - "name": "Geo_Rock-Hallownest_Crown_Dive_Dupe", - "logic": "*Geo_Rock-Hallownest_Crown_Dive" - }, - { - "name": "Geo_Rock-Hallownest_Crown_Hidden", - "logic": "Mines_25[left1] + (FULLCLAW | WINGS + ANYCLAW | ENEMYPOGOS + BACKGROUNDPOGOS + $SHRIEKPOGO[5]) | Mines_25[top1] + (ANYCLAW | (FIREBALL | SCREAM) + $CASTSPELL[before:ROOMSOUL] | CYCLONE)" - }, - { - "name": "Geo_Rock-Hallownest_Crown_Hidden_Dupe_1", - "logic": "*Geo_Rock-Hallownest_Crown_Hidden" - }, - { - "name": "Geo_Rock-Hallownest_Crown_Hidden_Dupe_2", - "logic": "*Geo_Rock-Hallownest_Crown_Hidden" - }, - { - "name": "Geo_Rock-Crystal_Peak_Before_Crystal_Heart", - "logic": "Mines_31[left1]" - }, - { - "name": "Geo_Rock-Crystal_Peak_Entrance", - "logic": "(Mines_33[left1] | Mines_33[right1]) + LANTERN" - }, - { - "name": "Geo_Rock-Crystal_Peak_Entrance_Dupe_1", - "logic": "*Geo_Rock-Crystal_Peak_Entrance" - }, - { - "name": "Geo_Rock-Crystal_Peak_Entrance_Dupe_2", - "logic": "*Geo_Rock-Crystal_Peak_Entrance" - }, - { - "name": "Geo_Rock-Crystal_Peak_Above_Crushers_Lower", - "logic": "Mines_37[top1] + (ANYCLAW | WINGS + $SHADESKIP | $SHRIEKPOGO[before:AREASOUL])" - }, - { - "name": "Geo_Rock-Crystal_Peak_Above_Crushers_Higher", - "logic": "Mines_37[top1] + (LEFTCLAW | WINGS + RIGHTCLAW | $SHRIEKPOGO[1,5,before:AREASOUL])" - }, - { - "name": "Geo_Rock-Resting_Grounds_Catacombs_Grub", - "logic": "RestingGrounds_10 + (LEFTCLAW | WINGS | ENEMYPOGOS + DANGEROUSSKIPS + RIGHTCLAW) + UPWALLBREAK" - }, - { - "name": "Geo_Rock-Resting_Grounds_Catacombs_Left_Dupe", - "logic": "*Geo_Rock-Resting_Grounds_Catacombs_Left" - }, - { - "name": "Geo_Rock-Resting_Grounds_Catacombs_Left", - "logic": "RestingGrounds_10 + UPWALLBREAK" - }, - { - "name": "Geo_Rock-Overgrown_Mound", - "logic": "Room_Fungus_Shaman[left1]" - }, - { - "name": "Geo_Rock-Fluke_Hermit_Dupe", - "logic": "Room_GG_Shortcut" - }, - { - "name": "Geo_Rock-Fluke_Hermit", - "logic": "Room_GG_Shortcut[top1] | Room_GG_Shortcut + (ANYCLAW | WINGS + ENEMYPOGOS)" - }, - { - "name": "Geo_Rock-Pleasure_House", - "logic": "Ruins_Elevator[left1] | Ruins_Elevator[left2]" - }, - { - "name": "Geo_Rock-City_of_Tears_Quirrel", - "logic": "Ruins1_03" - }, - { - "name": "Geo_Rock-City_of_Tears_Lemm", - "logic": "Ruins1_05b + (ANYCLAW | WINGS | BACKGROUNDPOGOS)" - }, - { - "name": "Geo_Rock-City_of_Tears_Above_Lemm", - "logic": "Ruins1_05c" - }, - { - "name": "Geo_Rock-Soul_Sanctum", - "logic": "Ruins1_32[right1] + (ANYCLAW | $SHRIEKPOGO[before:AREASOUL]) + Broke_Sanctum_Geo_Rock_Quake_Floor" - }, - { - "name": "Geo_Rock-Watcher's_Spire", - "logic": "(Ruins2_01[top1] | Ruins2_01[left2] | (Ruins2_01[bot1] + ((FULLCLAW + (LEFTDASH | LEFTSUPERDASH)) | (ANYCLAW + ENEMYPOGOS) | (WINGS + ENEMYPOGOS + DIFFICULTSKIPS)))) + (LEFTDASH | LEFTSUPERDASH | WINGS)" - }, - { - "name": "Geo_Rock-Above_King's_Station", - "logic": "Ruins2_05[bot1] + (LEFTCLAW | WINGS | ENEMYPOGOS) | Ruins2_05[left1] | Ruins2_05[top1]" - }, - { - "name": "Geo_Rock-King's_Station", - "logic": "(Ruins2_06[left1] | Ruins2_06[top1] | Ruins2_06[right1] | Ruins2_06[right2]) + (RIGHTCLAW | (WINGS | LEFTCLAW) + $SHADESKIP | WINGS + (LEFTCLAW | ENEMYPOGOS)) | Ruins2_06[left2] + (RIGHTSUPERDASH | WINGS | SWIM | RIGHTCLAW + RIGHTDASH + PRECISEMOVEMENT) + (RIGHTCLAW | WINGS + (LEFTCLAW | ENEMYPOGOS))" - }, - { - "name": "Geo_Rock-King's_Pass_Left", - "logic": "Tutorial_01[right1] | Tutorial_01[top1] | Tutorial_01[top2]" - }, - { - "name": "Geo_Rock-King's_Pass_Below_Fury", - "logic": "Tutorial_01[right1] | Tutorial_01[top1] | Tutorial_01[top2]" - }, - { - "name": "Geo_Rock-King's_Pass_Hidden", - "logic": "Tutorial_01[right1] | Tutorial_01[top1] | Tutorial_01[top2]" - }, - { - "name": "Geo_Rock-King's_Pass_Collapse", - "logic": "Tutorial_01[right1] | Tutorial_01[top1] | Tutorial_01[top2]" - }, - { - "name": "Geo_Rock-King's_Pass_Above_Fury", - "logic": "Tutorial_01[right1] | Tutorial_01[top1] | Tutorial_01[top2]" - }, - { - "name": "Geo_Rock-Waterways_Tuk", - "logic": "Waterways_01[right1] | Waterways_01 + (RIGHTCLAW | WINGS | ENEMYPOGOS)" - }, - { - "name": "Geo_Rock-Waterways_Tuk_Alcove", - "logic": "Waterways_01[top1] | Waterways_01[right1] | Waterways_01 + (ANYCLAW | WINGS | ENEMYPOGOS)" - }, - { - "name": "Geo_Rock-Waterways_Left", - "logic": "Waterways_04b[left1] + (PRECISEMOVEMENT | RIGHTDASH | RIGHTSUPERDASH | ANYCLAW | ENEMYPOGOS | SPELLAIRSTALL + $CASTSPELL[after:ROOMSOUL] | $TAKEDAMAGE) | Waterways_04b[right1] + (WINGS | LEFTDASH | SWIM | (RIGHTCLAW + RIGHTDASH + LEFTSUPERDASH)) | Waterways_04b[right2] + (WINGS | (LEFTCLAW + ENEMYPOGOS + DANGEROUSSKIPS)) + (LEFTCLAW | ENEMYPOGOS) + (SWIM | (LEFTSUPERDASH + RIGHTCLAW))" - }, - { - "name": "Geo_Rock-Waterways_East", - "logic": "Waterways_07[top1] | Waterways_07[door1] | Waterways_07 + (ANYCLAW | ENEMYPOGOS + $SHRIEKPOGO[2,before:ROOMSOUL])" - }, - { - "name": "Geo_Rock-Waterways_Flukemarm", - "logic": "Waterways_08[left2] | (Waterways_08[top1] + (ENEMYPOGOS | RIGHTCLAW | WINGS | RIGHTSUPERDASH) | Waterways_08[left1]) + (ANYCLAW | WINGS)" - }, - { - "name": "Boss_Geo-Massive_Moss_Charger", - "logic": "Fungus1_29[left1] | Fungus1_29[right1]" - }, - { - "name": "Boss_Geo-Gorgeous_Husk", - "logic": "Ruins_House_02[left1]" - }, - { - "name": "Boss_Geo-Sanctum_Soul_Warrior", - "logic": "Ruins1_23[top1] | Ruins1_23 + (LEFTCLAW | WINGS | RIGHTCLAW + LEFTSUPERDASH + (BACKGROUNDPOGOS | OBSCURESKIPS))" - }, - { - "name": "Boss_Geo-Elegant_Soul_Warrior", - "logic": "(Ruins1_31b[right1] | Ruins1_31b[right2]) + Defeated_Elegant_Warrior" - }, - { - "name": "Boss_Geo-Crystal_Guardian", - "logic": "(Mines_18[left1] | Mines_18[right1] | Mines_18[top1]) + Defeated_Crystal_Guardian" - }, - { - "name": "Boss_Geo-Enraged_Guardian", - "logic": "Mines_32[bot1] + Defeated_Enraged_Guardian" - }, - { - "name": "Boss_Geo-Gruz_Mother", - "logic": "(Crossroads_04[left1] | Crossroads_04[door_Mender_House] | Crossroads_04[door1] | Crossroads_04[door_charmshop] | Crossroads_04[right1] | Crossroads_04[top1]) + Defeated_Gruz_Mother" - }, - { - "name": "Boss_Geo-Vengefly_King", - "logic": "(Fungus1_20_v02[bot1] | Fungus1_20_v02[bot2] | Fungus1_20_v02[right1]) + (SIDESLASH | UPSLASH | ENEMYPOGOS | (FIREBALL | QUAKE | SCREAM) + $CASTSPELL[before:ROOMSOUL] | WINGS | CYCLONE | GREATSLASH | ANYDASHSLASH)" - }, - { - "name": "Soul_Totem-Basin", - "logic": "Abyss_04[top1] | ((Abyss_04[left1] | Abyss_04[right1] | Abyss_04[bot1]) + (ANYCLAW | (WINGS + ENEMYPOGOS)))" - }, - { - "name": "Soul_Totem-Cliffs_Main", - "logic": "Cliffs_01" - }, - { - "name": "Soul_Totem-Cliffs_Gorb", - "logic": "Cliffs_02 | Cliffs_02[left1] | Cliffs_02[door1]" - }, - { - "name": "Soul_Totem-Cliffs_Joni's", - "logic": "(Cliffs_04[left1] | Cliffs_04[right1]) + (LANTERN | DARKROOMS)" - }, - { - "name": "Soul_Totem-Crossroads_Goam_Journal", - "logic": "Crossroads_18 + (LEFTDASH | WINGS | LEFTCLAW | RIGHTCLAW + LEFTSUPERDASH + OBSCURESKIPS)" - }, - { - "name": "Soul_Totem-Crossroads_Shops", - "logic": "Crossroads_19" - }, - { - "name": "Soul_Totem-Crossroads_Mawlek_Upper", - "logic": "Crossroads_25[left1] | Crossroads_25[right1]" - }, - { - "name": "Soul_Totem-Crossroads_Acid", - "logic": "(Crossroads_35[right1] + ((ACIDSKIPS + ((LEFTCLAW + RIGHTSUPERDASH + (WINGS | RIGHTCLAW)) | (WINGS + RIGHTDASH))) | ACID)) | Crossroads_35[bot1]" - }, - { - "name": "Soul_Totem-Crossroads_Mawlek_Lower", - "logic": "Crossroads_36[right1] | Crossroads_36[right2]" - }, - { - "name": "Soul_Totem-Crossroads_Myla", - "logic": "Crossroads_45[left1] | Crossroads_45[right1]" - }, - { - "name": "Soul_Totem-Ancestral_Mound", - "logic": "Crossroads_ShamanTemple[left1] + (UPWALLBREAK | (((LEFTSUPERDASH + RIGHTCLAW) | (RIGHTSUPERDASH + LEFTCLAW)) + OBSCURESKIPS))" - }, - { - "name": "Soul_Totem-Distant_Village", - "logic": "Deepnest_10[door1] | Deepnest_10[door2] | Deepnest_10[right1] | Deepnest_10[right2] + (LEFTDASH | FULLCLAW + PRECISEMOVEMENT | WINGS | SPELLAIRSTALL + $CASTSPELL) | Deepnest_10[right3] + OBSCURESKIPS + RIGHTCLAW + WINGS + LEFTSUPERDASH" - }, - { - "name": "Soul_Totem-Deepnest_Vessel", - "logic": "Deepnest_38[bot1] + (RIGHTCLAW | WINGS)" - }, - { - "name": "Soul_Totem-Mask_Maker", - "logic": "(LANTERN | DARKROOMS) + (Deepnest_42[left1] | Deepnest_42[bot1] | Deepnest_42[top1])" - }, - { - "name": "Soul_Totem-Lower_Kingdom's_Edge_1", - "logic": "Deepnest_East_01[top1] | Deepnest_East_01[bot1] | Deepnest_East_01[right1]" - }, - { - "name": "Soul_Totem-Lower_Kingdom's_Edge_2", - "logic": "(Deepnest_East_02[top1] | Deepnest_East_02[bot1] | Deepnest_East_02[right1]) + (RIGHTDASH | WINGS | RIGHTSUPERDASH | ACID | ENEMYPOGOS | SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL])" - }, - { - "name": "Soul_Totem-Upper_Kingdom's_Edge", - "logic": "Deepnest_East_07[left1] | Deepnest_East_07 + (ANYCLAW | WINGS)" - }, - { - "name": "Soul_Totem-Kingdom's_Edge_Camp", - "logic": "(Deepnest_East_11[left1] | Deepnest_East_11[top1] + Broke_Camp_Bench_Wall | Deepnest_East_11[right1] | Deepnest_East_11[bot1] + (FULLCLAW | WINGS | ENEMYPOGOS)) + (LEFTDASH | LEFTCLAW | WINGS | DIFFICULTSKIPS)" - }, - { - "name": "Soul_Totem-Oro_Dive_2", - "logic": "Deepnest_East_14[top2] + Broke_Oro_Quake_Floor_2 + (RIGHTCLAW | WINGS | LEFTCLAW + ENEMYPOGOS | FULLDASH + DAMAGEBOOSTS + ENEMYPOGOS + COMPLEXSKIPS + $TAKEDAMAGE + $TAKEDAMAGE)" - }, - { - "name": "Soul_Totem-Oro_Dive_1", - "logic": "Deepnest_East_14[top2]" - }, - { - "name": "Soul_Totem-Oro", - "logic": "Deepnest_East_16[left1] | Deepnest_East_16[bot1]" - }, - { - "name": "Soul_Totem-420_Geo_Rock", - "logic": "Deepnest_East_17[left1] + Broke_420_Rock_Quake_Floor_1 + Broke_420_Rock_Quake_Floor_2 + Broke_420_Rock_Quake_Floor_3 + Broke_420_Rock_Quake_Floor_4 + Broke_420_Rock_Quake_Floor_5 + Broke_420_Rock_Quake_Floor_6 + Broke_420_Rock_Quake_Floor_7 + Broke_420_Rock_Quake_Floor_8" - }, - { - "name": "Soul_Totem-Beast's_Den", - "logic": "Deepnest_Spider_Town[left1] + (LEFTCLAW | WINGS) + COMBAT[Left_Devout]" - }, - { - "name": "Soul_Totem-Greenpath_Hunter's_Journal", - "logic": "Fungus1_07[top1] | Fungus1_07[right1] | Fungus1_07[left1]" - }, - { - "name": "Soul_Totem-Greenpath_MMC", - "logic": "Fungus1_29[left1] | Fungus1_29[right1]" - }, - { - "name": "Soul_Totem-Greenpath_Below_Toll", - "logic": "Fungus1_30" - }, - { - "name": "Soul_Totem-Before_Pilgrim's_Way", - "logic": "Fungus2_10[right1] | Fungus2_10[right2] | Fungus2_10[bot1]" - }, - { - "name": "Soul_Totem-Pilgrim's_Way", - "logic": "(Fungus2_21 | Fungus2_21[left1] + WINGS + RIGHTDASH) + (RIGHTCLAW | LEFTCLAW + WINGS | WINGS + LEFTDASH + DANGEROUSSKIPS + DIFFICULTSKIPS | $SHRIEKPOGO[2,before:AREASOUL] | LEFTDASH + $SHRIEKPOGO[1,before:AREASOUL]) | Fungus2_21[left1] + RIGHTDASH + $SHRIEKPOGO[1,before:AREASOUL]" - // right dash shriek pogo comes from the top-left, left dash shriek pogo comes through thorns tunnel, double shriek pogo comes from walkway - }, - { - "name": "Soul_Totem-Fungal_Core", - "logic": "Fungus2_29" - }, - { - "name": "Soul_Totem-Top_Left_Queen's_Gardens", - "logic": "Fungus3_21[right1] + (WINGS | RIGHTCLAW + (LEFTDASH | SPELLAIRSTALL + $CASTSPELL)) | Fungus3_21[top1] + RIGHTDASH" - }, - { - "name": "Soul_Totem-Below_Marmu", - "logic": "Fungus3_40[top1] | (Fungus3_40[right1] | Can_Stag + Queen's_Gardens_Stag | Bench-Gardens_Stag) + (LEFTCLAW | RIGHTCLAW + LEFTSUPERDASH | WINGS | LEFTDASH)" - }, - { - "name": "Soul_Totem-Upper_Crystal_Peak", - "logic": "Mines_20 | Mines_20[left2] | (Mines_20[left3] | Mines_20[bot1]) + (ANYCLAW | $SHRIEKPOGO[3,before:AREASOUL])" - }, - { - "name": "Soul_Totem-Hallownest_Crown", - "logic": "(Mines_25[left1] + (FULLCLAW | WINGS + ANYCLAW | ENEMYPOGOS + BACKGROUNDPOGOS + $SHRIEKPOGO[5]) | Mines_25[top1]) + Broke_Hallownest's_Crown_Quake_Floor" - }, - { - "name": "Soul_Totem-Outside_Crystallized_Mound", - "logic": "Mines_28[door1]" - }, - { - "name": "Soul_Totem-Crystal_Heart_1", - "logic": "Mines_31" - }, - { - "name": "Soul_Totem-Crystal_Heart_2", - "logic": "Mines_31[left1] + RIGHTSUPERDASH + ANYCLAW + WINGS | Mines_31 + (RIGHTDASH | WINGS | RIGHTSUPERDASH | SPELLAIRSTALL + $CASTSPELL | PRECISEMOVEMENT + (RIGHTCLAW | LEFTDASH))" - }, - { - "name": "Soul_Totem-Crystallized_Mound", - "logic": "Mines_35[left1] + Broke_Crystallized_Mound_Quake_Floor + (LEFTCLAW | RIGHTCLAW + PRECISEMOVEMENT + (RIGHTDASH | OBSCURESKIPS) | WINGS) + (WINGS | LEFTDASH | BACKGROUNDPOGOS)" - }, - { - "name": "Soul_Totem-Resting_Grounds", - "logic": "RestingGrounds_05" - }, - { - "name": "Soul_Totem-Below_Xero", - "logic": "RestingGrounds_06[left1] | RestingGrounds_06[right1] | RestingGrounds_06[top1]" - }, - { - "name": "Soul_Totem-Sanctum_Below_Soul_Master", - "logic": "Ruins1_24[left2] | Ruins1_24[right2]" - }, - { - "name": "Soul_Totem-Sanctum_Below_Chest", - "logic": "Ruins1_32[right1] + (ANYCLAW | $SHRIEKPOGO[before:AREASOUL])" - }, - { - "name": "Soul_Totem-Sanctum_Above_Grub", - "logic": "Ruins1_32[right1] + (ANYCLAW | $SHRIEKPOGO[before:AREASOUL]) + Broke_Quake_Floor_After_Soul_Master_1 + Broke_Quake_Floor_After_Soul_Master_2" - }, - { - "name": "Soul_Totem-Waterways_Entrance", - "logic": "Waterways_01 + (LEFTCLAW | WINGS | RIGHTCLAW + (LEFTDASH | LEFTSUPERDASH | ENEMYPOGOS)) | (Waterways_01[top1] | Waterways_01[right1]) + (LEFTDASH | ENEMYPOGOS | SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL] | $SHADESKIP)" - }, - { - "name": "Soul_Totem-Top_Left_Waterways", - "logic": "Waterways_04b[left1] + (ANYCLAW | WINGS + ENEMYPOGOS + DANGEROUSSKIPS | $SHRIEKPOGO[5,before:AREASOUL]) | Waterways_04b[right1] + (WINGS | LEFTDASH | SWIM | RIGHTCLAW + RIGHTDASH + LEFTSUPERDASH) + (ANYCLAW | WINGS + ENEMYPOGOS + DANGEROUSSKIPS) | Waterways_04b[right2] + (WINGS | LEFTCLAW + ENEMYPOGOS + DANGEROUSSKIPS) + (LEFTCLAW | ENEMYPOGOS) + (SWIM | LEFTSUPERDASH + RIGHTCLAW) + (ANYCLAW | WINGS + ENEMYPOGOS + DANGEROUSSKIPS)" - }, - { - "name": "Soul_Totem-Waterways_East", - "logic": "Waterways_07 + (LEFTCLAW + (LEFTDASH | WINGS | LEFTSUPERDASH | SPELLAIRSTALL + $CASTSPELL[2,before:ROOMSOUL] + RIGHTCLAW | ENEMYPOGOS) | RIGHTCLAW + WINGS | LEFTDASH + $SHRIEKPOGO[2] | $SHRIEKPOGO[2,NORIGHTSTALL] + $SHRIEKPOGO[2])" - }, - { - "name": "Soul_Totem-Waterways_Flukemarm", - "logic": "Waterways_08[top1] + (ENEMYPOGOS | RIGHTCLAW | WINGS | RIGHTSUPERDASH) | Waterways_08[left1] | Waterways_08[left2]" - }, - { - "name": "Soul_Totem-White_Palace_Entrance", - "logic": "White_Palace_02[left1] + (LEFTCLAW + WINGS | RIGHTCLAW + LEFTSUPERDASH | LEFTDASH + $SHRIEKPOGO[4] | LEFTSUPERDASH + $SHRIEKPOGO)" - }, - { - "name": "Soul_Totem-White_Palace_Hub", - "logic": "White_Palace_03_hub[left1] | White_Palace_03_hub + (LEFTDASH | FULLCLAW | WINGS)" - }, - { - "name": "Soul_Totem-White_Palace_Left", - "logic": "White_Palace_04[top1] | White_Palace_04[right2] + (LEFTDASH | LEFTSUPERDASH + PRECISEMOVEMENT | OBSCURESKIPS + SPRINT) + (WINGS + (ANYCLAW | PRECISEMOVEMENT) | OBSCURESKIPS + RIGHTCLAW + RIGHTDASH + LEFTSUPERDASH)" - }, - { - "name": "Soul_Totem-White_Palace_Final", - "logic": "*King_Fragment" - }, - { - "name": "Soul_Totem-White_Palace_Right", - "logic": "White_Palace_15[right1]" - }, - { - "name": "Soul_Totem-Path_of_Pain_Below_Lever", - "logic": "White_Palace_17[bot1] + (RIGHTCLAW + WINGS | $SHRIEKPOGO[1,1,1,1,1,1,1,1] + FULLDASH | LEFTCLAW + $SHRIEKPOGO[1,2,NOSTALL])" - }, - { - "name": "Soul_Totem-Path_of_Pain_Left_of_Lever", - "logic": "White_Palace_17[bot1] + FULLDASH + (FULLCLAW + WINGS | RIGHTCLAW + $SHRIEKPOGO[2,NOSTALL] | LEFTCLAW + $SHRIEKPOGO[1,2,NOSTALL])" - }, - { - "name": "Soul_Totem-Path_of_Pain_Entrance", - "logic": "(White_Palace_18[right1] + ((FULLDASH + WINGS) | LEFTSUPERDASH)) | (White_Palace_18[top1] + FULLDASH + FULLCLAW + WINGS + FULLSUPERDASH)" - }, - { - "name": "Soul_Totem-Path_of_Pain_Second", - "logic": "(White_Palace_18[right1] + FULLDASH + FULLCLAW + WINGS) | (White_Palace_18[top1] + FULLDASH + FULLCLAW + WINGS + FULLSUPERDASH)" - }, - { - "name": "Soul_Totem-Path_of_Pain_Hidden", - "logic": "(White_Palace_19[left1] | White_Palace_19[top1]) + FULLCLAW + WINGS + FULLDASH" - }, - { - "name": "Soul_Totem-Path_of_Pain_Below_Thornskip", - "logic": "White_Palace_19[left1] | White_Palace_19[top1] + RIGHTDASH + (RIGHTCLAW + WINGS | (RIGHTCLAW | WINGS) + PRECISEMOVEMENT | DIFFICULTSKIPS + DANGEROUSSKIPS)" - }, - { - "name": "Soul_Totem-Path_of_Pain_Final", - "logic": "White_Palace_20[bot1] + (LEFTCLAW + WINGS | RIGHTCLAW | $SHRIEKPOGO)" - }, - { - "name": "Soul_Totem-Pale_Lurker", - "logic": "GG_Lurker[left1]" - }, - { - "name": "Lore_Tablet-City_Entrance", - "logic": "Ruins1_02[top1] | (Ruins1_02[bot1] + (ANYCLAW | WINGS))" - }, - { - "name": "Lore_Tablet-Pleasure_House", - "logic": "Ruins_Elevator[left1] | Ruins_Elevator[left2]" - }, - { - "name": "Lore_Tablet-Sanctum_Entrance", - "logic": "Ruins1_23 + (LEFTCLAW | WINGS | RIGHTCLAW + (BACKGROUNDPOGOS | OBSCURESKIPS))" - }, - { - "name": "Lore_Tablet-Sanctum_Past_Soul_Master", - "logic": "Ruins1_32[right1] + (ANYCLAW | $SHRIEKPOGO[before:AREASOUL]) + Broke_Sanctum_Geo_Rock_Quake_Floor" - }, - { - "name": "Lore_Tablet-Watcher's_Spire", - "logic": "Ruins2_Watcher_Room[bot1]" - }, - { - "name": "Lore_Tablet-Archives_Upper", - "logic": "Fungus3_archive_02[top1] + (ANYCLAW | WINGS | ENEMYPOGOS)" - }, - { - "name": "Lore_Tablet-Archives_Left", - "logic": "*Journal_Entry-Charged_Lumafly + (ANYCLAW | WINGS | $SHRIEKPOGO[2])" - }, - { - "name": "Lore_Tablet-Archives_Right", - "logic": "Uumuu_Arena + Defeated_Uumuu + (ANYSUPERDASH | ACID | ACIDSKIPS + LEFTDASH + LEFTCLAW + WINGS)" - }, - { - "name": "Lore_Tablet-Pilgrim's_Way_1", - "logic": "Crossroads_11_alt[right1]" - }, - { - "name": "Lore_Tablet-Pilgrim's_Way_2", - "logic": "Fungus2_21[left1]" - }, - { - "name": "Lore_Tablet-Mantis_Outskirts", - "logic": "Fungus2_12[bot1] | Fungus2_12[left1]" - }, - { - "name": "Lore_Tablet-Mantis_Village", - "logic": "Fungus2_14[top1] | Fungus2_14 + (WINGS | LEFTDASH | LEFTSUPERDASH | FULLCLAW | SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL]) + (LEFTCLAW | RIGHTCLAW + WINGS | (RIGHTCLAW | WINGS) + OBSCURESKIPS + ENEMYPOGOS | $SHRIEKPOGO[before:ROOMSOUL])" - }, - { - "name": "Lore_Tablet-Greenpath_Upper_Hidden", - "logic": "Fungus1_17[left1] | Fungus1_17[right1]" - }, - { - "name": "Lore_Tablet-Greenpath_Below_Toll", - "logic": "Fungus1_30" - }, - { - "name": "Lore_Tablet-Greenpath_Lifeblood", - "logic": "Fungus1_32[bot1] | Fungus1_32[top1] | Fungus1_32[left1]" - }, - { - "name": "Lore_Tablet-Greenpath_Stag", - "logic": "Fungus1_21" - }, - { - "name": "Lore_Tablet-Greenpath_QG", - "logic": "Fungus1_13[left1] + (SIDESLASH | CYCLONE | GREATSLASH | RIGHTDASHSLASH | LEFTDASHSLASH + DASHMASTER + OBSCURESKIPS) | Fungus1_13[right1] + (LEFTCLAW | RIGHTCLAW + WINGS + (LEFTDASH | LEFTSUPERDASH) | (WINGS | LEFTSUPERDASH) + DAMAGEBOOSTS + $TAKEDAMAGE | $SHRIEKPOGO[2,before:AREASOUL]) + (SIDESLASH | CYCLONE | GREATSLASH | LEFTDASHSLASH | RIGHTDASHSLASH + DASHMASTER + OBSCURESKIPS) | $StartLocation[Lower Greenpath] + (SIDESLASH | CYCLONE | GREATSLASH | LEFTDASHSLASH | RIGHTDASHSLASH + DASHMASTER + OBSCURESKIPS)" - }, - { - "name": "Lore_Tablet-Greenpath_Lower_Hidden", - "logic": "Fungus1_19[bot1] | Fungus1_19[left1] | Fungus1_19[right1]" - }, - { - "name": "Lore_Tablet-Dung_Defender", - "logic": "Waterways_07 + (ANYCLAW | ENEMYPOGOS + $SHRIEKPOGO[before:ROOMSOUL]) | (Waterways_07[door1] | Waterways_07[top1] | Waterways_07[right1]) + (ANYCLAW | WINGS)" - }, - { - "name": "Lore_Tablet-Spore_Shroom", - "logic": "(Fungus2_20[left1] | Fungus2_20[right1]) + (RIGHTDASH | RIGHTSUPERDASH | WINGS) + SPORESHROOM" - }, - { - "name": "Lore_Tablet-Fungal_Wastes_Hidden", - "logic": "(Fungus2_07[left1] | Fungus2_07[right1]) + (LEFTCLAW | WINGS + (RIGHTCLAW | ENEMYPOGOS) | RIGHTCLAW + ENEMYPOGOS) + SPORESHROOM" - }, - { - "name": "Lore_Tablet-Fungal_Wastes_Below_Shrumal_Ogres", - "logic": "Fungus2_04 + SPORESHROOM" - }, - { - "name": "Lore_Tablet-Fungal_Core", - "logic": "Fungus2_30[top1] + SPORESHROOM" - }, - { - "name": "Lore_Tablet-Ancient_Basin", - "logic": "Abyss_06_Core[top1]" - }, - { - "name": "Lore_Tablet-King's_Pass_Focus", - "logic": "Tutorial_01" - }, - { - "name": "Lore_Tablet-King's_Pass_Fury", - "logic": "Tutorial_01" - }, - { - "name": "Lore_Tablet-King's_Pass_Exit", - "logic": "Tutorial_01" - }, - { - "name": "Lore_Tablet-World_Sense", - "logic": "Room_temple[left1] + Opened_Black_Egg_Temple" - }, - { - "name": "Lore_Tablet-Howling_Cliffs", - "logic": "Cliffs_01[right1] | Cliffs_01[right2] | ((Cliffs_01[right3] | Cliffs_01[right4]) + (ANYCLAW | WINGS | (FULLDASH + ENEMYPOGOS)))" - }, - { - "name": "Lore_Tablet-Kingdom's_Edge", - "logic": "Deepnest_East_17[left1] + Broke_420_Rock_Quake_Floor_1 + Broke_420_Rock_Quake_Floor_2 + Broke_420_Rock_Quake_Floor_3 + Broke_420_Rock_Quake_Floor_4 + Broke_420_Rock_Quake_Floor_5 + SPORESHROOM" - }, - { - "name": "Lore_Tablet-Palace_Workshop", - "logic": "White_Palace_08[right1] | White_Palace_08[left1] + (ANYCLAW + WINGS | $SHRIEKPOGO)" - }, - { - "name": "Lore_Tablet-Palace_Throne", - "logic": "*King_Fragment" - }, - { - "name": "Lore_Tablet-Path_of_Pain_Entrance", - "logic": "White_Palace_18[right1] | (White_Palace_18[top1] + FULLDASH + FULLCLAW + WINGS + FULLSUPERDASH)" - } -] diff --git a/RandomizerMod/Resources/Logic/macros.json b/RandomizerMod/Resources/Logic/macros.json deleted file mode 100644 index bf6c3aa..0000000 --- a/RandomizerMod/Resources/Logic/macros.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - // macros for modes - "AREARANDO": "MAPAREARANDO | FULLAREARANDO", - "NONRANDOMELEVATORS": "RANDOMELEVATORS=0", - - // whether selecting benches in Benchwarp can be considered in logic. By default, only warp to start is considered. Overwrite macro to TRUE to allow. - "INCLUDEBENCHWARPSELECT": "FALSE", - // whether warping to start can be required for flower quest. By default, it is not required. Overwrite macro to TRUE to allow. - "WARPTOSTARTFLOWERHANDLING": "$STAGSTATEMODIFIER", - // logic for state improvements to bench waypoints when warp select is allowed. - "WARPSTARTTOBENCH": "INCLUDEBENCHWARPSELECT + Start_State + $WARPTOBENCH", - - // macros for alternate item names - "LOVE": "Love_Key", - "GRIMMCHILD": "$EQUIPPEDCHARM[Grimmchild]", - "BRAND": "King's_Brand", - "CYCLONE": "Cyclone_Slash", - "GREATSLASH": "Great_Slash", - "DASHSLASH": "Dash_Slash", - - // macros for basic skills - "DREAMGATE": "DREAMNAIL>1 + ESSENCE", - "SUPERDASH": "LEFTSUPERDASH + RIGHTSUPERDASH", - "ANYCLAW": "LEFTCLAW | RIGHTCLAW", - "FULLCLAW": "LEFTCLAW + RIGHTCLAW", - "ANYDASH": "LEFTDASH | RIGHTDASH", - "FULLDASH": "LEFTDASH + RIGHTDASH", - "LEFTFIREBALL": "FIREBALL", - "RIGHTFIREBALL": "FIREBALL", - "ANYSUPERDASH": "LEFTSUPERDASH | RIGHTSUPERDASH", - "FULLSUPERDASH": "LEFTSUPERDASH + RIGHTSUPERDASH", - "ANYFIREBALL": "LEFTFIREBALL | RIGHTFIREBALL", - "FULLFIREBALL": "LEFTFIREBALL + RIGHTFIREBALL", - "ANYSHADOWDASH": "LEFTDASH>1 | RIGHTDASH>1", - "LEFTSHADOWDASH": "ANYSHADOWDASH + LEFTDASH", - "RIGHTSHADOWDASH": "ANYSHADOWDASH + RIGHTDASH", - "FULLSHADOWDASH": "LEFTSHADOWDASH + RIGHTSHADOWDASH", - "SIDESLASH": "LEFTSLASH | RIGHTSLASH", - "ANYDASHSLASH": "DASHSLASH + ANYDASH", - "LEFTDASHSLASH": "DASHSLASH + LEFTDASH", - "RIGHTDASHSLASH": "DASHSLASH + RIGHTDASH", - "FULLDASHSLASH": "DASHSLASH + FULLDASH", - "DASH": "FULLDASH", - "CLAW": "FULLCLAW", - "SHADOWDASH": "FULLSHADOWDASH", - "INFECTION": "DREAMER", - "DREAMER3": "DREAMER>2", - "AWOKEN": "DREAMNAIL>2", - - // macros for charms with the ability to equip - "GLOWINGWOMB": "$EQUIPPEDCHARM[Glowing_Womb]", - "GRUBBERFLYSELEGY": "$EQUIPPEDCHARM[Grubberfly's_Elegy]", - "WEAVERSONG": "$EQUIPPEDCHARM[Weaversong]", - "SPORESHROOM": "$EQUIPPEDCHARM[Spore_Shroom]", - "MARKOFPRIDE": "$EQUIPPEDCHARM[Mark_of_Pride]", - "LONGNAIL": "$EQUIPPEDCHARM[Longnail]", - "LONGMARK": "$EQUIPPEDCHARM[Longnail] + $EQUIPPEDCHARM[Mark_of_Pride]", - - "FRAGILEHEART": "$EQUIPPEDCHARM[Fragile_Heart]", - "FRAGILEGREED": "$EQUIPPEDCHARM[Fragile_Greed]", - "FRAGILESTRENGTH": "$EQUIPPEDCHARM[Fragile_Strength]", - "UHEART": "Fragile_Heart>1 + FRAGILEHEART", - "UGREED": "Fragile_Greed>1 + FRAGILEGREED", - "USTRENGTH": "Fragile_Strength>1 + FRAGILESTRENGTH", - "DEFENDERSCREST": "$EQUIPPEDCHARM[Defender's_Crest]", - - "DASHMASTER": "$EQUIPPEDCHARM[Dashmaster]", - "LEFTSHARPSHADOW": "LEFTSHADOWDASH + $EQUIPPEDCHARM[Sharp_Shadow]", - "RIGHTSHARPSHADOW": "RIGHTSHADOWDASH + $EQUIPPEDCHARM[Sharp_Shadow]", - "FULLSHARPSHADOW": "LEFTSHADOWDASH + RIGHTSHADOWDASH + $EQUIPPEDCHARM[Sharp_Shadow]", - "SHARPSHADOW": "FULLSHARPSHADOW", - "KINGSOUL": "$EQUIPPEDCHARM[Kingsoul]", - "VOIDHEART": "$EQUIPPEDCHARM[Void_Heart]", - "SPRINT": "$EQUIPPEDCHARM[Sprintmaster]", - "DASHSPRINT": "$EQUIPPEDCHARM[Dashmaster] + $EQUIPPEDCHARM[Sprintmaster]", - // deprecated, see LifebloodCountVariable for definition of $LIFEBLOOD - "LIFEBLOOD": "$EQUIPPEDCHARM[Lifeblood_Heart] | $EQUIPPEDCHARM[Lifeblood_Core] | $EQUIPPEDCHARM[Joni's_Blessing]", - - // macros for simple comparisons - "6FLAMES": "FLAMES>5", - "3FLAMES": "FLAMES>2", - "200ESSENCE": "ESSENCE>199", - "SIMPLE1": "SIMPLE", - "SIMPLE3": "SIMPLE>2", - "SIMPLE4": "SIMPLE>3", - "ALLSTAGS": "STAGS>8", - - // deprecated mask comparisons for checking shade health - "2MASKS": "MASKSHARDS>7 | UHEART", - "3MASKS": "MASKSHARDS>11 | UHEART", - "4MASKS": "MASKSHARDS>15 | MASKSHARDS>7 + UHEART", - "6MASKS": "MASKSHARDS>23 | MASKSHARDS>15 + UHEART", - - // deprecated macros for the ability to take a certain number of hits. Due to inclusion of lifeblood, these cannot be used in nonterminal logic without the DGBENCH (or similar) requirement - "2HITS": "MASKSHARDS>7 | Can_Bench + (FRAGILEHEART | Lifeblood_Heart + NOTCHES>$SafeNotchCost[8] | Lifeblood_Core | Joni's_Blessing + NOTCHES>$SafeNotchCost[27])", - "3HITS": "MASKSHARDS>11 | MASKSHARDS>7 + Can_Bench + Joni's_Blessing + NOTCHES>$SafeNotchCost[27] | Can_Bench + (FRAGILEHEART + NOTCHES>$SafeNotchCost[23] | Lifeblood_Heart + NOTCHES>$SafeNotchCost[8] | Lifeblood_Core)", - "4HITS": "MASKSHARDS>15 | MASKSHARDS>11 + Can_Bench + (Lifeblood_Core | Joni's_Blessing + NOTCHES>$SafeNotchCost[27]) | MASKSHARDS>7 + Can_Bench + (FRAGILEHEART + NOTCHES>$SafeNotchCost[23] | Lifeblood_Heart + NOTCHES>$SafeNotchCost[8] | Lifeblood_Core + NOTCHES>$SafeNotchCost[9])", - - // deprecated macros for the next nearest place where the player can move respawn, in nonterminal logic - "DGSHADESKIPS": "DREAMGATE + SHADESKIPS", - "ITEMSHADESKIPS": "ITEMRANDO + SHADESKIPS | DGSHADESKIPS", - "MAPAREASHADESKIPS": "(ITEMRANDO | MAPAREARANDO) + SHADESKIPS | DGSHADESKIPS", - "AREASHADESKIPS": "(ITEMRANDO | AREARANDO) + SHADESKIPS | DGSHADESKIPS", - "ROOMSHADESKIPS": "SHADESKIPS", - "TERMINALSHADESKIPS": "SHADESKIPS", - - // deprecated macros for the next nearest place where the player can refill soul, in nonterminal logic - "DGSOUL": "DREAMGATE", - "ITEMSOUL": "ITEMRANDO | DGSOUL", - "MAPAREASOUL": "ITEMRANDO | MAPAREARANDO | DGSOUL", - "AREASOUL": "ITEMRANDO | AREARANDO | DGSOUL", - "ROOMSOUL": "ANY", - "TERMINALSOUL": "ANY", - - // deprecated macros for the next nearest bench where the player can change charms, in nonterminal logic - "DGBENCH": "DREAMGATE", - "ITEMBENCH": "ITEMRANDO | DGBENCH", - "MAPAREABENCH": "ITEMRANDO | MAPAREARANDO | DGBENCH", - "AREABENCH": "ITEMRANDO | AREARANDO | DGBENCH", - "ROOMBENCH": "ANY", - - // macros for baldurs - "ALLBALDURS": "FIREBALL | QUAKE | GLOWINGWOMB | (WEAVERSONG | SPORESHROOM + FOCUS) + OBSCURESKIPS | CYCLONE + DIFFICULTSKIPS", - "LEFTBALDURS": "ALLBALDURS | GRUBBERFLYSELEGY + LEFTSLASH | LEFTDASHSLASH | (MARKOFPRIDE + LEFTSLASH | LEFTDASH + LEFTSLASH) + DIFFICULTSKIPS", - "RIGHTBALDURS": "ALLBALDURS | GRUBBERFLYSELEGY + RIGHTSLASH | RIGHTDASHSLASH | (MARKOFPRIDE + RIGHTSLASH | RIGHTDASH + RIGHTSLASH) + DIFFICULTSKIPS", - "BALDURS": "LEFTBALDURS + RIGHTBALDURS", - - // macros for common skip combos - "INFECTED": "INFECTIONSKIPS + INFECTION", - "AIRSTALL": "FIREBALLSKIPS + (FIREBALL | SCREAM)", // deprecated - "SPELLAIRSTALL": "FIREBALLSKIPS + (FIREBALL | SCREAM)", - "LEFTTUNNEL": "SPIKETUNNELS + LEFTDASH + (DASHMASTER | AIRSTALL)", // deprecated - "RIGHTTUNNEL": "SPIKETUNNELS + RIGHTDASH + (DASHMASTER | AIRSTALL)", // deprecated - "TUNNEL": "LEFTTUNNEL + RIGHTTUNNEL", // deprecated - "SKIPACID": "FULLCLAW + FULLDASH + SUPERDASH + ACIDSKIPS", // deprecated - "LEFTSKIPACID": "FULLCLAW + FULLDASH + LEFTSUPERDASH + ACIDSKIPS", - "RIGHTSKIPACID": "FULLCLAW + FULLDASH + RIGHTSUPERDASH + ACIDSKIPS", - "FULLSKIPACID": "FULLCLAW + FULLDASH + FULLSUPERDASH + ACIDSKIPS", - - // macros for combat abilities - "UPWALLBREAK": "SIDESLASH | UPSLASH | FIREBALL | SCREAM | QUAKE | CYCLONE | GREATSLASH | FULLDASHSLASH", - "MILDCOMBATSKIPS": "PROFICIENTCOMBAT", - "SPICYCOMBATSKIPS": "DIFFICULTSKIPS + PROFICIENTCOMBAT", - "NAILCOMBAT": "SIDESLASH | UPSLASH | MILDCOMBATSKIPS + (CYCLONE | GREATSLASH) | SPICYCOMBATSKIPS", - "MINIBOSS": "SPELLS + NAILCOMBAT | SPICYCOMBATSKIPS", - "AERIALMINIBOSS": "(FIREBALL | SCREAM) + ANYDASH + (SIDESLASH | UPSLASH) | MILDCOMBATSKIPS + (FIREBALL | SCREAM) + (SIDESLASH | UPSLASH) | SPICYCOMBATSKIPS + (SIDESLASH | UPSLASH | CYCLONE | GREATSLASH)", - "BOSS": "SPELLS>1 + (ANYDASH + (SIDESLASH | UPSLASH) | MILDCOMBATSKIPS + NAILCOMBAT)", - "BOSSFLUKE": "FIREBALL>1 | SCREAM>1 | SPELLS>1 + MILDCOMBATSKIPS | CURSED + (FIREBALL | SCREAM)", - - // macros for simple key requirements - "WATERWAYSUNLOCK": "SIMPLE4", - "PLEASUREHOUSEUNLOCK": "SIMPLE4", - "GODTUNERUNLOCK": "SIMPLE4", - "JIJIUNLOCK": "SIMPLE4", - - // macros for boss logic - "COMBAT[Gruz_Mother]": "ANY", - "COMBAT[False_Knight]": "ANY", - "COMBAT[Brooding_Mawlek]": "MINIBOSS", - "COMBAT[Hornet_1]": "ANY", - "COMBAT[Mantis_Lords]": "ANY", - "COMBAT[Sanctum_Warrior]": "ANY", - "COMBAT[Soul_Master]": "NAILCOMBAT", - "COMBAT[Elegant_Warrior]": "MINIBOSS", - "COMBAT[Crystal_Guardian]": "ANY", - "COMBAT[Enraged_Guardian]": "BOSS", - "COMBAT[Flukemarm]": "BOSSFLUKE", - "COMBAT[Dung_Defender]": "BOSS", - "COMBAT[Broken_Vessel]": "MINIBOSS", - "COMBAT[Hornet_2]": "BOSS", - "COMBAT[Watcher_Knights]": "BOSS", - "COMBAT[Uumuu]": "AERIALMINIBOSS", - "COMBAT[Nosk]": "BOSS", - "COMBAT[Traitor_Lord]": "BOSS + (FULLSHADOWDASH | QUAKE + PROFICIENTCOMBAT)", - "COMBAT[Grimm]": "BOSS", - "COMBAT[Collector]": "BOSS", - "COMBAT[Hive_Knight]": "BOSS", - "COMBAT[Pale_Lurker]": "BOSS", - "COMBAT[Elder_Hu]": "AERIALMINIBOSS", - "COMBAT[Xero]": "AERIALMINIBOSS", - "COMBAT[Gorb]": "AERIALMINIBOSS", - "COMBAT[Marmu]": "AERIALMINIBOSS", - "COMBAT[No_Eyes]": "AERIALMINIBOSS", - "COMBAT[Galien]": "AERIALMINIBOSS", - "COMBAT[Markoth]": "AERIALMINIBOSS", - "COMBAT[Failed_Champion]": "BOSS", - "COMBAT[Soul_Tyrant]": "BOSS", - "COMBAT[Lost_Kin]": "BOSS", - "COMBAT[White_Defender]": "BOSS", - "COMBAT[Grey_Prince_Zote]": "BOSS", - "COMBAT[Colosseum_1]": "BOSS + (FOCUS | SPICYCOMBATSKIPS)", - "COMBAT[Colosseum_2]": "BOSS + (FOCUS | SPICYCOMBATSKIPS)", - "COMBAT[West_Queen's_Gardens_Arena]": "MINIBOSS", - "COMBAT[King's_Station_Arena]": "MINIBOSS", - "COMBAT[White_Palace_Arenas]": "MINIBOSS", - "COMBAT[Path_of_Pain_Arena]": "BOSS", - "COMBAT[Right_Devout]": "RIGHTSLASH | RIGHTSHADOWDASH | LEFTDASH", - "COMBAT[Left_Devout]": "LEFTSLASH | LEFTSHADOWDASH | RIGHTDASH", - "COMBAT[Any_Devout]": "(LEFTSLASH | LEFTSHADOWDASH | RIGHTDASH) + (RIGHTSLASH | RIGHTSHADOWDASH | LEFTDASH)" -} diff --git a/RandomizerMod/Resources/Logic/state.json b/RandomizerMod/Resources/Logic/state.json deleted file mode 100644 index cc09194..0000000 --- a/RandomizerMod/Resources/Logic/state.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "Fields": { - "Bool": [ - "USEDSHADE", - "OVERCHARMED", - "CANNOTOVERCHARM", - "CANNOTREGAINSOUL", - "CANNOTSHADESKIP", - "BROKEHEART", - "BROKEGREED", - "BROKESTRENGTH", - "NOFLOWER", - "NOPASSEDCHARMEQUIP", - "CHARM1", - "CHARM2", - "CHARM3", - "CHARM4", - "CHARM5", - "CHARM6", - "CHARM7", - "CHARM8", - "CHARM9", - "CHARM10", - "CHARM11", - "CHARM12", - "CHARM13", - "CHARM14", - "CHARM15", - "CHARM16", - "CHARM17", - "CHARM18", - "CHARM19", - "CHARM20", - "CHARM21", - "CHARM22", - "CHARM23", - "CHARM24", - "CHARM25", - "CHARM26", - "CHARM27", - "CHARM28", - "CHARM29", - "CHARM30", - "CHARM31", - "CHARM32", - "CHARM33", - "CHARM34", - "CHARM35", - "CHARM36", - "CHARM37", - "CHARM38", - "CHARM39", - "CHARM40", - - "noCHARM1", - "noCHARM2", - "noCHARM3", - "noCHARM4", - "noCHARM5", - "noCHARM6", - "noCHARM7", - "noCHARM8", - "noCHARM9", - "noCHARM10", - "noCHARM11", - "noCHARM12", - "noCHARM13", - "noCHARM14", - "noCHARM15", - "noCHARM16", - "noCHARM17", - "noCHARM18", - "noCHARM19", - "noCHARM20", - "noCHARM21", - "noCHARM22", - "noCHARM23", - "noCHARM24", - "noCHARM25", - "noCHARM26", - "noCHARM27", - "noCHARM28", - "noCHARM29", - "noCHARM30", - "noCHARM31", - "noCHARM32", - "noCHARM33", - "noCHARM34", - "noCHARM35", - "noCHARM36", - "noCHARM37", - "noCHARM38", - "noCHARM39", - "noCHARM40" - - ], - "Int": [ - "SPENTSOUL", - "SPENTRESERVESOUL", - "SOULLIMITER", - "REQUIREDMAXSOUL", - "SPENTHP", - "SPENTBLUEHP", - "LAZYSPENTHP", - "USEDNOTCHES", - "MAXNOTCHCOST" - ] - }, - "Properties": { - "NOFLOWER": { - "DefaultValue": true - }, - "NOPASSEDCHARMEQUIP": { - "DefaultValue": true - } - }, - "NamedStates": {}, - "NamedStateUnions": {} -} diff --git a/RandomizerMod/Resources/Logic/terms.json b/RandomizerMod/Resources/Logic/terms.json deleted file mode 100644 index 889b51c..0000000 --- a/RandomizerMod/Resources/Logic/terms.json +++ /dev/null @@ -1,155 +0,0 @@ -{ - "SignedByte": [ - "ITEMRANDO", - "MAPAREARANDO", - "FULLAREARANDO", - "ROOMRANDO", - "PRECISEMOVEMENT", - "PROFICIENTCOMBAT", - "BACKGROUNDPOGOS", - "ENEMYPOGOS", - "OBSCURESKIPS", - "SHADESKIPS", - "INFECTIONSKIPS", - "FIREBALLSKIPS", - "SPIKETUNNELS", - "ACIDSKIPS", - "DAMAGEBOOSTS", - "DANGEROUSSKIPS", - "DARKROOMS", - "COMPLEXSKIPS", - "DIFFICULTSKIPS", - "SLOPEBALLSKIPS", - "SHRIEKPOGOSKIPS", - "RANDOMNAIL", - "CURSED", - "RANDOMFOCUS", - "CURSEDMASKS", - "CURSEDNOTCHES", - "RANDOMELEVATORS", - "DREAMER", - "Lurien", - "Monomon", - "Herrah", - "World_Sense", - "LEFTDASH", - "RIGHTDASH", - "LEFTCLAW", - "RIGHTCLAW", - "LEFTSUPERDASH", - "RIGHTSUPERDASH", - "WINGS", - "ACID", - "DREAMNAIL", - "FIREBALL", - "SPELLS", - "QUAKE", - "SCREAM", - "Cyclone_Slash", - "Dash_Slash", - "Great_Slash", - "FOCUS", - "SWIM", - "Gathering_Swarm", - "Wayward_Compass", - "Grubsong", - "Stalwart_Shell", - "Baldur_Shell", - "Fury_of_the_Fallen", - "Quick_Focus", - "Lifeblood_Heart", - "Lifeblood_Core", - "Defender's_Crest", - "Flukenest", - "Thorns_of_Agony", - "Mark_of_Pride", - "Steady_Body", - "Heavy_Blow", - "Sharp_Shadow", - "Spore_Shroom", - "Longnail", - "Shaman_Stone", - "Soul_Catcher", - "Soul_Eater", - "Glowing_Womb", - "Fragile_Heart", - "Fragile_Greed", - "Fragile_Strength", - "Nailmaster's_Glory", - "Joni's_Blessing", - "Shape_of_Unn", - "Hiveblood", - "Dream_Wielder", - "Dashmaster", - "Quick_Slash", - "Spell_Twister", - "Deep_Focus", - "Grubberfly's_Elegy", - "WHITEFRAGMENT", - "Sprintmaster", - "Dreamshield", - "Weaversong", - "Grimmchild", - "CREST", - "LANTERN", - "TRAM", - "SIMPLE", - "SHOPKEY", - "ELEGANT", - "Love_Key", - "King's_Brand", - "Godtuner", - "Collector's_Map", - "QUILL", - "Crossroads_Map", - "Greenpath_Map", - "Fog_Canyon_Map", - "Fungal_Wastes_Map", - "Deepnest_Map", - "Ancient_Basin_Map", - "Kingdom's_Edge_Map", - "City_of_Tears_Map", - "Royal_Waterways_Map", - "Howling_Cliffs_Map", - "Crystal_Peak_Map", - "Queen's_Gardens_Map", - "Resting_Grounds_Map", - "Dirtmouth_Stag", - "Crossroads_Stag", - "Greenpath_Stag", - "Queen's_Station_Stag", - "Queen's_Gardens_Stag", - "City_Storerooms_Stag", - "King's_Station_Stag", - "Resting_Grounds_Stag", - "Distant_Village_Stag", - "Hidden_Station_Stag", - "Stag_Nest_Stag", - "JOURNAL", - "Salubra's_Blessing", - "Elevator_Pass", - "LEFTSLASH", - "RIGHTSLASH", - "UPSLASH", - "DOWNSLASH" - ], - "Int": [ - "GEO", - "GRUBS", - "ESSENCE", - "RANCIDEGGS", - "CHARMS", - "MASKSHARDS", - "VESSELFRAGMENTS", - "NOTCHES", - "PALEORE", - "WANDERERSJOURNALS", - "HALLOWNESTSEALS", - "KINGSIDOLS", - "ARCANEEGGS", - "MAPS", - "STAGS", - "FLAMES" - ], - "State": [] -} \ No newline at end of file diff --git a/RandomizerMod/Resources/Logic/transitions.json b/RandomizerMod/Resources/Logic/transitions.json deleted file mode 100644 index 1e8548b..0000000 --- a/RandomizerMod/Resources/Logic/transitions.json +++ /dev/null @@ -1,6255 +0,0 @@ -[ - { - "sceneName": "Room_temple", - "gateName": "left1", - "logic": "Room_temple[left1] | Bench-Black_Egg_Temple", - "oneWayType": "TwoWay", - "Name": "Room_temple[left1]" - }, - { - "sceneName": "Tutorial_01", - "gateName": "right1", - "logic": "Tutorial_01[right1] | Tutorial_01", - "oneWayType": "TwoWay", - "Name": "Tutorial_01[right1]" - }, - { - "sceneName": "Tutorial_01", - "gateName": "top1", - "logic": "NONE", - "oneWayType": "OneWayOut", - "Name": "Tutorial_01[top1]" - }, - { - "sceneName": "Tutorial_01", - "gateName": "top2", - "logic": "Tutorial_01[top2] | Tutorial_01 + (ANYCLAW | WINGS + COMPLEXSKIPS + ENEMYPOGOS | $SHRIEKPOGO[1,2])", - "oneWayType": "TwoWay", - "Name": "Tutorial_01[top2]" - }, - { - "sceneName": "Town", - "gateName": "left1", - "logic": "Town[left1] | Town + LEFTCLAW | Town[right1] + (LEFTCLAW | LEFTSUPERDASH)", - "oneWayType": "TwoWay", - "Name": "Town[left1]" - }, - { - "sceneName": "Town", - "gateName": "bot1", - "logic": "Town[bot1] | Town", - "oneWayType": "TwoWay", - "Name": "Town[bot1]" - }, - { - "sceneName": "Town", - "gateName": "right1", - "logic": "Town[right1] | (Town + LEFTCLAW | Town[left1]) + WINGS + RIGHTSUPERDASH", - "oneWayType": "TwoWay", - "Name": "Town[right1]" - }, - { - "sceneName": "Town", - "gateName": "top1", - "logic": "NONE", - "oneWayType": "OneWayOut", - "Name": "Town[top1]" - }, - { - "sceneName": "Town", - "gateName": "door_station", - "logic": "Town[door_station] | Town + Dirtmouth_Stag", - "oneWayType": "TwoWay", - "Name": "Town[door_station]" - }, - { - "sceneName": "Town", - "gateName": "door_sly", - "logic": "Town[door_sly] | Town + Rescued_Sly", - "oneWayType": "TwoWay", - "Name": "Town[door_sly]" - }, - { - "sceneName": "Town", - "gateName": "door_mapper", - "logic": "Town[door_mapper] | Town", - "oneWayType": "TwoWay", - "Name": "Town[door_mapper]" - }, - { - "sceneName": "Town", - "gateName": "door_jiji", - "logic": "Town[door_jiji] | Town + JIJIUNLOCK", - "oneWayType": "TwoWay", - "Name": "Town[door_jiji]" - }, - { - "sceneName": "Town", - "gateName": "door_bretta", - "logic": "Town[door_bretta] | Town + Rescued_Bretta", - "oneWayType": "TwoWay", - "Name": "Town[door_bretta]" - }, - { - "sceneName": "Town", - "gateName": "room_divine", - "logic": "Town[room_divine] | Town + Nightmare_Lantern_Lit", - "oneWayType": "TwoWay", - "Name": "Town[room_divine]" - }, - { - "sceneName": "Town", - "gateName": "room_grimm", - "logic": "Town[room_grimm] | Town + Nightmare_Lantern_Lit", - "oneWayType": "TwoWay", - "Name": "Town[room_grimm]" - }, - { - "sceneName": "Room_shop", - "gateName": "left1", - "logic": "Room_shop[left1]", - "oneWayType": "TwoWay", - "Name": "Room_shop[left1]" - }, - { - "sceneName": "Room_Town_Stag_Station", - "gateName": "left1", - "logic": "Room_Town_Stag_Station[left1] | Dirtmouth_Stag + Can_Stag", - "oneWayType": "TwoWay", - "Name": "Room_Town_Stag_Station[left1]" - }, - { - "sceneName": "Room_mapper", - "gateName": "left1", - "logic": "Room_mapper[left1]", - "oneWayType": "TwoWay", - "Name": "Room_mapper[left1]" - }, - { - "sceneName": "Room_Bretta", - "gateName": "right1", - "logic": "Room_Bretta[right1]", - "oneWayType": "TwoWay", - "Name": "Room_Bretta[right1]" - }, - { - "sceneName": "Room_Ouiji", - "gateName": "left1", - "logic": "Room_Ouiji[left1]", - "oneWayType": "TwoWay", - "Name": "Room_Ouiji[left1]" - }, - { - "sceneName": "Grimm_Divine", - "gateName": "left1", - "logic": "Grimm_Divine[left1]", - "oneWayType": "TwoWay", - "Name": "Grimm_Divine[left1]" - }, - { - "sceneName": "Grimm_Main_Tent", - "gateName": "left1", - "logic": "Grimm_Main_Tent[left1]", - "oneWayType": "TwoWay", - "Name": "Grimm_Main_Tent[left1]" - }, - { - "sceneName": "Crossroads_01", - "gateName": "top1", - "logic": "Crossroads_01[top1] | Crossroads_01[left1] | Crossroads_01[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_01[top1]" - }, - { - "sceneName": "Crossroads_01", - "gateName": "left1", - "logic": "Crossroads_01[left1] | Crossroads_01[top1] | Crossroads_01[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_01[left1]" - }, - { - "sceneName": "Crossroads_01", - "gateName": "right1", - "logic": "Crossroads_01[right1] | Crossroads_01[top1] | Crossroads_01[left1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_01[right1]" - }, - { - "sceneName": "Crossroads_02", - "gateName": "left1", - "logic": "Crossroads_02[left1] | Crossroads_02[door1] | Crossroads_02[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_02[left1]" - }, - { - "sceneName": "Crossroads_02", - "gateName": "door1", - "logic": "Crossroads_02[door1] | Crossroads_02[left1] | Crossroads_02[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_02[door1]" - }, - { - "sceneName": "Crossroads_02", - "gateName": "right1", - "logic": "Crossroads_02[right1] | Crossroads_02[left1] | Crossroads_02[door1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_02[right1]" - }, - { - "sceneName": "Crossroads_03", - "gateName": "right1", - "logic": "Crossroads_03[right1] | Crossroads_03", - "oneWayType": "TwoWay", - "Name": "Crossroads_03[right1]" - }, - { - "sceneName": "Crossroads_03", - "gateName": "right2", - "logic": "Crossroads_03[right2] | Crossroads_03", - "oneWayType": "TwoWay", - "Name": "Crossroads_03[right2]" - }, - { - "sceneName": "Crossroads_03", - "gateName": "left1", - "logic": "Crossroads_03[left1] | Crossroads_03", - "oneWayType": "TwoWay", - "Name": "Crossroads_03[left1]" - }, - { - "sceneName": "Crossroads_03", - "gateName": "left2", - "logic": "Crossroads_03[left2] | Crossroads_03", - "oneWayType": "TwoWay", - "Name": "Crossroads_03[left2]" - }, - { - "sceneName": "Crossroads_03", - "gateName": "bot1", - "logic": "Crossroads_03[bot1] | Crossroads_03", - "oneWayType": "TwoWay", - "Name": "Crossroads_03[bot1]" - }, - { - "sceneName": "Crossroads_03", - "gateName": "top1", - "logic": "Crossroads_03[top1] | Crossroads_03", - "oneWayType": "TwoWay", - "Name": "Crossroads_03[top1]" - }, - { - "sceneName": "Crossroads_04", - "gateName": "left1", - "logic": "Crossroads_04[left1] | Crossroads_04[door_Mender_House] | Crossroads_04[door1] | Crossroads_04[door_charmshop] | Crossroads_04[right1] | Crossroads_04[top1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_04[left1]" - }, - { - "sceneName": "Crossroads_04", - "gateName": "top1", - "logic": "Crossroads_04[top1] | Crossroads_04[door_Mender_House] | Crossroads_04[door1] | Crossroads_04[door_charmshop] | Crossroads_04[right1] | Crossroads_04[left1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_04[top1]" - }, - { - "sceneName": "Crossroads_04", - "gateName": "door_Mender_House", - "logic": "Crossroads_04[door_Mender_House] | Crossroads_04[door1] | Crossroads_04[door_charmshop] | Crossroads_04[right1] | (Crossroads_04[left1] | Crossroads_04[top1]) + Defeated_Gruz_Mother", - "oneWayType": "TwoWay", - "Name": "Crossroads_04[door_Mender_House]" - }, - { - "sceneName": "Crossroads_04", - "gateName": "door1", - "logic": "Crossroads_04[door1] | Crossroads_04[door_Mender_House] | Crossroads_04[door_charmshop] | Crossroads_04[right1] | (Crossroads_04[left1] | Crossroads_04[top1]) + Defeated_Gruz_Mother", - "oneWayType": "TwoWay", - "Name": "Crossroads_04[door1]" - }, - { - "sceneName": "Crossroads_04", - "gateName": "door_charmshop", - "logic": "Crossroads_04[door_charmshop] | Crossroads_04[right1] | (Crossroads_04[door1] | Crossroads_04[door_Mender_House] | (Crossroads_04[left1] | Crossroads_04[top1]) + Defeated_Gruz_Mother) + (RIGHTCLAW | RIGHTDASH | WINGS | RIGHTSUPERDASH | SPELLAIRSTALL + $CASTSPELL[3,before:AREASOUL] | $SHADESKIP | INFECTED) | Bench-Salubra", - "oneWayType": "TwoWay", - "Name": "Crossroads_04[door_charmshop]" - }, - { - "sceneName": "Crossroads_04", - "gateName": "right1", - "logic": "Crossroads_04[right1] | (Crossroads_04[door_Mender_House] | Crossroads_04[door1] | Crossroads_04[door_charmshop] | (Crossroads_04[left1] | Crossroads_04[top1]) + Defeated_Gruz_Mother) + (RIGHTCLAW + WINGS | LEFTCLAW + RIGHTSUPERDASH | INFECTED | $SHADESKIP + (RIGHTCLAW | WINGS) | COMPLEXSKIPS + SPELLAIRSTALL + DAMAGEBOOSTS + $SHADESKIP[2HITS] + $TAKEDAMAGE + $CASTSPELL[2,before:ROOMSOUL] + (DIFFICULTSKIPS | RIGHTDASH) | $SHRIEKPOGO[2,before:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "Crossroads_04[right1]" - }, - { - "sceneName": "Crossroads_05", - "gateName": "left1", - "logic": "Crossroads_05[left1] | Crossroads_05[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_05[left1]" - }, - { - "sceneName": "Crossroads_05", - "gateName": "right1", - "logic": "Crossroads_05[right1] | Crossroads_05[left1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_05[right1]" - }, - { - "sceneName": "Crossroads_06", - "gateName": "left1", - "logic": "Crossroads_06[left1] | Crossroads_06[door1] | Crossroads_06[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_06[left1]" - }, - { - "sceneName": "Crossroads_06", - "gateName": "door1", - "logic": "Crossroads_06[door1] | Crossroads_06[left1] | Crossroads_06[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_06[door1]" - }, - { - "sceneName": "Crossroads_06", - "gateName": "right1", - "logic": "Crossroads_06[right1] | Crossroads_06[left1] | Crossroads_06[door1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_06[right1]" - }, - { - "sceneName": "Crossroads_07", - "gateName": "left1", - "logic": "Crossroads_07[left1] | Crossroads_07", - "oneWayType": "TwoWay", - "Name": "Crossroads_07[left1]" - }, - { - "sceneName": "Crossroads_07", - "gateName": "left2", - "logic": "Crossroads_07[left2] | Crossroads_07", - "oneWayType": "TwoWay", - "Name": "Crossroads_07[left2]" - }, - { - "sceneName": "Crossroads_07", - "gateName": "left3", - "logic": "Crossroads_07[left3] | Crossroads_07", - "oneWayType": "TwoWay", - "Name": "Crossroads_07[left3]" - }, - { - "sceneName": "Crossroads_07", - "gateName": "right1", - "logic": "Crossroads_07[right1] | Crossroads_07", - "oneWayType": "TwoWay", - "Name": "Crossroads_07[right1]" - }, - { - "sceneName": "Crossroads_07", - "gateName": "right2", - "logic": "Crossroads_07[right2] | Crossroads_07", - "oneWayType": "TwoWay", - "Name": "Crossroads_07[right2]" - }, - { - "sceneName": "Crossroads_07", - "gateName": "bot1", - "logic": "Crossroads_07[bot1] | Crossroads_07", - "oneWayType": "TwoWay", - "Name": "Crossroads_07[bot1]" - }, - { - "sceneName": "Crossroads_08", - "gateName": "left1", - "logic": "Crossroads_08[left1] | Crossroads_08", - "oneWayType": "TwoWay", - "Name": "Crossroads_08[left1]" - }, - { - "sceneName": "Crossroads_08", - "gateName": "left2", - "logic": "Crossroads_08[left2] | Crossroads_08", - "oneWayType": "TwoWay", - "Name": "Crossroads_08[left2]" - }, - { - "sceneName": "Crossroads_08", - "gateName": "right1", - "logic": "Crossroads_08[right1] | Crossroads_08", - "oneWayType": "TwoWay", - "Name": "Crossroads_08[right1]" - }, - { - "sceneName": "Crossroads_08", - "gateName": "right2", - "logic": "Crossroads_08[right2] | Crossroads_08", - "oneWayType": "TwoWay", - "Name": "Crossroads_08[right2]" - }, - { - "sceneName": "Crossroads_09", - "gateName": "left1", - "logic": "Crossroads_09[left1] | Crossroads_09[right1] + Defeated_Brooding_Mawlek", - "oneWayType": "TwoWay", - "Name": "Crossroads_09[left1]" - }, - { - "sceneName": "Crossroads_09", - "gateName": "right1", - "logic": "Crossroads_09[right1] | Crossroads_09[left1] + Defeated_Brooding_Mawlek", - "oneWayType": "TwoWay", - "Name": "Crossroads_09[right1]" - }, - { - "sceneName": "Crossroads_10", - "gateName": "left1", - "logic": "Crossroads_10[left1] | Crossroads_10[right1] + Defeated_False_Knight", - "oneWayType": "TwoWay", - "Name": "Crossroads_10[left1]" - }, - { - "sceneName": "Crossroads_10", - "gateName": "right1", - "logic": "Crossroads_10[right1] | Crossroads_10[left1] + Defeated_False_Knight", - "oneWayType": "TwoWay", - "Name": "Crossroads_10[right1]" - }, - { - "sceneName": "Crossroads_11_alt", - "gateName": "left1", - "logic": "Crossroads_11_alt[left1] | Crossroads_11_alt[right1] + Defeated_Crossroads_Baldur", - "oneWayType": "TwoWay", - "Name": "Crossroads_11_alt[left1]" - }, - { - "sceneName": "Crossroads_11_alt", - "gateName": "right1", - "logic": "Crossroads_11_alt[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_11_alt[right1]" - }, - { - "sceneName": "Crossroads_12", - "gateName": "left1", - "logic": "Crossroads_12[left1] | Crossroads_12[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_12[left1]" - }, - { - "sceneName": "Crossroads_12", - "gateName": "right1", - "logic": "Crossroads_12[right1] | Crossroads_12[left1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_12[right1]" - }, - { - "sceneName": "Crossroads_13", - "gateName": "left1", - "logic": "Crossroads_13[left1] | Crossroads_13[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_13[left1]" - }, - { - "sceneName": "Crossroads_13", - "gateName": "right1", - "logic": "Crossroads_13[right1] | Crossroads_13[left1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_13[right1]" - }, - { - "sceneName": "Crossroads_14", - "gateName": "left1", - "logic": "Crossroads_14[left1] | Crossroads_14", - "oneWayType": "TwoWay", - "Name": "Crossroads_14[left1]" - }, - { - "sceneName": "Crossroads_14", - "gateName": "left2", - "logic": "Crossroads_14[left2] | Crossroads_14", - "oneWayType": "TwoWay", - "Name": "Crossroads_14[left2]" - }, - { - "sceneName": "Crossroads_14", - "gateName": "right1", - "logic": "Crossroads_14[right1] | Crossroads_14", - "oneWayType": "TwoWay", - "Name": "Crossroads_14[right1]" - }, - { - "sceneName": "Crossroads_14", - "gateName": "right2", - "logic": "Crossroads_14[right2] | Crossroads_14", - "oneWayType": "TwoWay", - "Name": "Crossroads_14[right2]" - }, - { - "sceneName": "Crossroads_15", - "gateName": "left1", - "logic": "Crossroads_15[left1] | Crossroads_15[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_15[left1]" - }, - { - "sceneName": "Crossroads_15", - "gateName": "right1", - "logic": "Crossroads_15[right1] | Crossroads_15[left1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_15[right1]" - }, - { - "sceneName": "Crossroads_16", - "gateName": "left1", - "logic": "Crossroads_16[left1] | Crossroads_16[right1] | Crossroads_16[bot1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_16[left1]" - }, - { - "sceneName": "Crossroads_16", - "gateName": "right1", - "logic": "Crossroads_16[right1] | Crossroads_16[left1] | Crossroads_16[bot1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_16[right1]" - }, - { - "sceneName": "Crossroads_16", - "gateName": "bot1", - "logic": "Crossroads_16[bot1] | Crossroads_16[left1] | Crossroads_16[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_16[bot1]" - }, - { - "sceneName": "Crossroads_18", - "gateName": "right1", - "logic": "Crossroads_18[right1] | Crossroads_18", - "oneWayType": "TwoWay", - "Name": "Crossroads_18[right1]" - }, - { - "sceneName": "Crossroads_18", - "gateName": "right2", - "logic": "Crossroads_18[right2] | Crossroads_18", - "oneWayType": "TwoWay", - "Name": "Crossroads_18[right2]" - }, - { - "sceneName": "Crossroads_18", - "gateName": "bot1", - "logic": "Crossroads_18[bot1] | Crossroads_18", - "oneWayType": "TwoWay", - "Name": "Crossroads_18[bot1]" - }, - { - "sceneName": "Crossroads_19", - "gateName": "right1", - "logic": "Crossroads_19[right1] | Crossroads_19", - "oneWayType": "TwoWay", - "Name": "Crossroads_19[right1]" - }, - { - "sceneName": "Crossroads_19", - "gateName": "top1", - "logic": "Crossroads_19[top1] | Crossroads_19", - "oneWayType": "TwoWay", - "Name": "Crossroads_19[top1]" - }, - { - "sceneName": "Crossroads_19", - "gateName": "left1", - "logic": "Crossroads_19[left1] | Crossroads_19", - "oneWayType": "TwoWay", - "Name": "Crossroads_19[left1]" - }, - { - "sceneName": "Crossroads_19", - "gateName": "left2", - "logic": "Crossroads_19[left2] | Crossroads_19", - "oneWayType": "TwoWay", - "Name": "Crossroads_19[left2]" - }, - { - "sceneName": "Crossroads_21", - "gateName": "left1", - "logic": "Crossroads_21[left1] | Crossroads_21", - "oneWayType": "TwoWay", - "Name": "Crossroads_21[left1]" - }, - { - "sceneName": "Crossroads_21", - "gateName": "right1", - "logic": "Crossroads_21[right1] | Crossroads_21", - "oneWayType": "TwoWay", - "Name": "Crossroads_21[right1]" - }, - { - "sceneName": "Crossroads_21", - "gateName": "top1", - "logic": "Crossroads_21[top1] + (WINGS | ANYCLAW | INFECTED) | Crossroads_21 + (ANYCLAW | WINGS | INFECTED) + (LEFTSUPERDASH | SPIKETUNNELS + LEFTDASH + (DASHMASTER | SPELLAIRSTALL + $CASTSPELL[2,before:ROOMSOUL,after:ROOMSOUL]))", - "oneWayType": "TwoWay", - "Name": "Crossroads_21[top1]" - }, - { - "sceneName": "Crossroads_22", - "gateName": "bot1", - "logic": "Crossroads_22[bot1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_22[bot1]" - }, - { - "sceneName": "Crossroads_25", - "gateName": "right1", - "logic": "Crossroads_25[right1] | Crossroads_25[left1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_25[right1]" - }, - { - "sceneName": "Crossroads_25", - "gateName": "left1", - "logic": "Crossroads_25[left1] | Crossroads_25[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_25[left1]" - }, - { - "sceneName": "Crossroads_27", - "gateName": "right1", - "logic": "Crossroads_27[right1] | Crossroads_27", - "oneWayType": "TwoWay", - "Name": "Crossroads_27[right1]" - }, - { - "sceneName": "Crossroads_27", - "gateName": "bot1", - "logic": "Crossroads_27[bot1] | Crossroads_27", - "oneWayType": "TwoWay", - "Name": "Crossroads_27[bot1]" - }, - { - "sceneName": "Crossroads_27", - "gateName": "left1", - "logic": "Crossroads_27[left1] | Crossroads_27", - "oneWayType": "TwoWay", - "Name": "Crossroads_27[left1]" - }, - { - "sceneName": "Crossroads_27", - "gateName": "left2", - "logic": "Crossroads_27[left2] | Crossroads_27", - "oneWayType": "TwoWay", - "Name": "Crossroads_27[left2]" - }, - { - "sceneName": "Crossroads_30", - "gateName": "left1", - "logic": "Crossroads_30[left1] | Bench-Crossroads_Hot_Springs | Crossroads_Hot_Spring", - "oneWayType": "TwoWay", - "Name": "Crossroads_30[left1]" - }, - { - "sceneName": "Crossroads_31", - "gateName": "right1", - "logic": "Crossroads_31[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_31[right1]" - }, - { - "sceneName": "Crossroads_33", - "gateName": "top1", - "logic": "Crossroads_33[top1] | Crossroads_33", - "oneWayType": "TwoWay", - "Name": "Crossroads_33[top1]" - }, - { - "sceneName": "Crossroads_33", - "gateName": "left1", - "logic": "Crossroads_33[left1] | Crossroads_33 + Opened_Mawlek_Wall", - "oneWayType": "TwoWay", - "Name": "Crossroads_33[left1]" - }, - { - "sceneName": "Crossroads_33", - "gateName": "left2", - "logic": "Crossroads_33[left2] | Crossroads_33", - "oneWayType": "TwoWay", - "Name": "Crossroads_33[left2]" - }, - { - "sceneName": "Crossroads_33", - "gateName": "right1", - "logic": "Crossroads_33[right1] | Crossroads_33 + Opened_Shaman_Pillar", - "oneWayType": "TwoWay", - "Name": "Crossroads_33[right1]" - }, - { - "sceneName": "Crossroads_33", - "gateName": "right2", - "logic": "Crossroads_33[right2] | Crossroads_33", - "oneWayType": "TwoWay", - "Name": "Crossroads_33[right2]" - }, - { - "sceneName": "Crossroads_35", - "gateName": "bot1", - "logic": "Crossroads_35[bot1] | Crossroads_35[right1] + (ACID | (((LEFTCLAW + RIGHTSUPERDASH + (WINGS | RIGHTCLAW)) | (WINGS + RIGHTDASH)) + ACIDSKIPS))", - "oneWayType": "TwoWay", - "Name": "Crossroads_35[bot1]" - }, - { - "sceneName": "Crossroads_35", - "gateName": "right1", - "logic": "Crossroads_35[right1] | Crossroads_35[bot1] + (RIGHTCLAW + (ACID | ACIDSKIPS + (LEFTSUPERDASH + LEFTCLAW | WINGS + LEFTDASH)) | ACID + $SHRIEKPOGO[1,2,before:ITEMSOUL] | ACIDSKIPS + LEFTDASH + $SHRIEKPOGO[1,2,1,before:ITEMSOUL])", - "oneWayType": "TwoWay", - "Name": "Crossroads_35[right1]" - }, - { - "sceneName": "Crossroads_36", - "gateName": "right1", - "logic": "Crossroads_36[right1] | Crossroads_36[right2]", - "oneWayType": "TwoWay", - "Name": "Crossroads_36[right1]" - }, - { - "sceneName": "Crossroads_36", - "gateName": "right2", - "logic": "Crossroads_36[right2] | Crossroads_36[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_36[right2]" - }, - { - "sceneName": "Crossroads_37", - "gateName": "right1", - "logic": "Crossroads_37[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_37[right1]" - }, - { - "sceneName": "Crossroads_38", - "gateName": "right1", - "logic": "Crossroads_38[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_38[right1]" - }, - { - "sceneName": "Crossroads_39", - "gateName": "right1", - "logic": "Crossroads_39[right1] | Crossroads_39[left1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_39[right1]" - }, - { - "sceneName": "Crossroads_39", - "gateName": "left1", - "logic": "Crossroads_39[left1] | Crossroads_39[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_39[left1]" - }, - { - "sceneName": "Crossroads_40", - "gateName": "right1", - "logic": "Crossroads_40[right1] | Crossroads_40[left1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_40[right1]" - }, - { - "sceneName": "Crossroads_40", - "gateName": "left1", - "logic": "Crossroads_40[left1] | Crossroads_40[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_40[left1]" - }, - { - "sceneName": "Crossroads_42", - "gateName": "left1", - "logic": "Crossroads_42[left1] | Crossroads_42[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_42[left1]" - }, - { - "sceneName": "Crossroads_42", - "gateName": "right1", - "logic": "Crossroads_42[right1] | Crossroads_42[left1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_42[right1]" - }, - { - "sceneName": "Crossroads_43", - "gateName": "left1", - "logic": "Crossroads_43[left1] | Crossroads_43[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_43[left1]" - }, - { - "sceneName": "Crossroads_43", - "gateName": "right1", - "logic": "Crossroads_43[right1] | Crossroads_43[left1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_43[right1]" - }, - { - "sceneName": "Crossroads_45", - "gateName": "right1", - "logic": "Crossroads_45[right1] | Crossroads_45[left1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_45[right1]" - }, - { - "sceneName": "Crossroads_45", - "gateName": "left1", - "logic": "Crossroads_45[left1] | Crossroads_45[right1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_45[left1]" - }, - { - "sceneName": "Crossroads_46", - "gateName": "left1", - "logic": "Crossroads_46[left1] | Upper_Tram", - "oneWayType": "TwoWay", - "Name": "Crossroads_46[left1]" - }, - { - "sceneName": "Crossroads_46b", - "gateName": "right1", - "logic": "Crossroads_46b[right1] | Upper_Tram", - "oneWayType": "TwoWay", - "Name": "Crossroads_46b[right1]" - }, - { - "sceneName": "Crossroads_ShamanTemple", - "gateName": "left1", - "logic": "Crossroads_ShamanTemple[left1] | Bench-Ancestral_Mound", - "oneWayType": "TwoWay", - "Name": "Crossroads_ShamanTemple[left1]" - }, - { - "sceneName": "Crossroads_47", - "gateName": "right1", - "logic": "Crossroads_47[right1] | Can_Stag + Crossroads_Stag | Bench-Crossroads_Stag", - "oneWayType": "TwoWay", - "Name": "Crossroads_47[right1]" - }, - { - "sceneName": "Crossroads_48", - "gateName": "left1", - "logic": "Crossroads_48[left1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_48[left1]" - }, - { - "sceneName": "Crossroads_49", - "gateName": "right1", - "logic": "Crossroads_49[right1] | Left_Elevator", - "oneWayType": "TwoWay", - "Name": "Crossroads_49[right1]" - }, - { - "sceneName": "Crossroads_49", - "gateName": "left1", - "logic": "Crossroads_49[left1] | Left_Elevator", - "oneWayType": "TwoWay", - "Name": "Crossroads_49[left1]" - }, - { - "sceneName": "Crossroads_49b", - "gateName": "right1", - "logic": "Crossroads_49b[right1] | Left_Elevator", - "oneWayType": "TwoWay", - "Name": "Crossroads_49b[right1]" - }, - { - "sceneName": "Crossroads_50", - "gateName": "right1", - "logic": "Crossroads_50[right1] | Crossroads_50[left1] + (RIGHTSUPERDASH | SWIM)", - "oneWayType": "TwoWay", - "Name": "Crossroads_50[right1]" - }, - { - "sceneName": "Crossroads_50", - "gateName": "left1", - "logic": "Crossroads_50[left1] | Crossroads_50[right1] + (LEFTSUPERDASH | SWIM) + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Crossroads_50[left1]" - }, - { - "sceneName": "Crossroads_52", - "gateName": "left1", - "logic": "Crossroads_52[left1]", - "oneWayType": "TwoWay", - "Name": "Crossroads_52[left1]" - }, - { - "sceneName": "Room_ruinhouse", - "gateName": "left1", - "logic": "Room_ruinhouse[left1]", - "oneWayType": "TwoWay", - "Name": "Room_ruinhouse[left1]" - }, - { - "sceneName": "Room_Charm_Shop", - "gateName": "left1", - "logic": "Room_Charm_Shop[left1]", - "oneWayType": "TwoWay", - "Name": "Room_Charm_Shop[left1]" - }, - { - "sceneName": "Room_Mender_House", - "gateName": "left1", - "logic": "Room_Mender_House[left1]", - "oneWayType": "TwoWay", - "Name": "Room_Mender_House[left1]" - }, - { - "sceneName": "Fungus1_01", - "gateName": "left1", - "logic": "Fungus1_01[left1] | Fungus1_01[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_01[left1]" - }, - { - "sceneName": "Fungus1_01", - "gateName": "right1", - "logic": "Fungus1_01[right1] | Fungus1_01[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_01[right1]" - }, - { - "sceneName": "Fungus1_01b", - "gateName": "left1", - "logic": "Fungus1_01b[left1] | Fungus1_01b[right1] | Bench-Waterfall", - "oneWayType": "TwoWay", - "Name": "Fungus1_01b[left1]" - }, - { - "sceneName": "Fungus1_01b", - "gateName": "right1", - "logic": "Fungus1_01b[right1] | Fungus1_01b[left1] | Bench-Waterfall", - "oneWayType": "TwoWay", - "Name": "Fungus1_01b[right1]" - }, - { - "sceneName": "Fungus1_02", - "gateName": "left1", - "logic": "Fungus1_02[left1] | (Fungus1_02[right1] | Fungus1_02[right2]) + (LEFTCLAW | WINGS | LEFTDASH | LEFTSUPERDASH | ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Fungus1_02[left1]" - }, - { - "sceneName": "Fungus1_02", - "gateName": "right1", - "logic": "Fungus1_02[right1] | Fungus1_02[left1] | Fungus1_02[right2]", - "oneWayType": "TwoWay", - "Name": "Fungus1_02[right1]" - }, - { - "sceneName": "Fungus1_02", - "gateName": "right2", - "logic": "Fungus1_02[right2] | Fungus1_02[left1] | Fungus1_02[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_02[right2]" - }, - { - "sceneName": "Fungus1_03", - "gateName": "left1", - "logic": "Fungus1_03[left1] | Fungus1_03[right1] | Fungus1_03[bot1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_03[left1]" - }, - { - "sceneName": "Fungus1_03", - "gateName": "right1", - "logic": "Fungus1_03[right1] | Fungus1_03[left1] | Fungus1_03[bot1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_03[right1]" - }, - { - "sceneName": "Fungus1_03", - "gateName": "bot1", - "logic": "Fungus1_03[bot1] | Fungus1_03[left1] | Fungus1_03[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_03[bot1]" - }, - { - "sceneName": "Fungus1_04", - "gateName": "left1", - "logic": "Fungus1_04[left1] | Fungus1_04[right1] + Defeated_Hornet_1 + ((LEFTDASH | LEFTSUPERDASH) + (RIGHTDASH | RIGHTSUPERDASH | LEFTCLAW + PRECISEMOVEMENT) | WINGS | ACID | SPELLAIRSTALL + $CASTSPELL[1,1])", - "oneWayType": "TwoWay", - "Name": "Fungus1_04[left1]" - }, - { - "sceneName": "Fungus1_04", - "gateName": "right1", - "logic": "Fungus1_04[right1] | Fungus1_04[left1] + (FULLDASH | WINGS | FULLSUPERDASH + FULLCLAW | RIGHTCLAW + (ACID | RIGHTDASH | RIGHTSUPERDASH + PRECISEMOVEMENT | SPELLAIRSTALL + $CASTSPELL) | LEFTCLAW + (RIGHTDASH + PRECISEMOVEMENT | SPELLAIRSTALL + COMPLEXSKIPS + $CASTSPELL[2,1,3]))", - "oneWayType": "TwoWay", - "Name": "Fungus1_04[right1]" - }, - { - "sceneName": "Fungus1_05", - "gateName": "right1", - "logic": "Fungus1_05[right1] | Fungus1_05[bot1] | Fungus1_05[top1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_05[right1]" - }, - { - "sceneName": "Fungus1_05", - "gateName": "bot1", - "logic": "Fungus1_05[bot1] | Fungus1_05[right1] | Fungus1_05[top1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_05[bot1]" - }, - { - "sceneName": "Fungus1_05", - "gateName": "top1", - "logic": "Fungus1_05[top1] | Fungus1_05[right1] | Fungus1_05[bot1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_05[top1]" - }, - { - "sceneName": "Fungus1_06", - "gateName": "left1", - "logic": "Fungus1_06[left1] | Fungus1_06[bot1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_06[left1]" - }, - { - "sceneName": "Fungus1_06", - "gateName": "bot1", - "logic": "Fungus1_06[bot1] | Fungus1_06[left1] + (SIDESLASH | GREATSLASH | CYCLONE | RIGHTDASH | LEFTDASHSLASH | RIGHTSUPERDASH | ENEMYPOGOS | RIGHTCLAW | WINGS | SPELLAIRSTALL + $CASTSPELL[before:AREASOUL,after:ROOMSOUL])", - "oneWayType": "TwoWay", - "Name": "Fungus1_06[bot1]" - }, - { - "sceneName": "Fungus1_07", - "gateName": "top1", - "logic": "Fungus1_07[top1] | Fungus1_07[left1] | Fungus1_07[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_07[top1]" - }, - { - "sceneName": "Fungus1_07", - "gateName": "left1", - "logic": "Fungus1_07[left1] | Fungus1_07[top1] | Fungus1_07[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_07[left1]" - }, - { - "sceneName": "Fungus1_07", - "gateName": "right1", - "logic": "Fungus1_07[right1] | Fungus1_07[top1] | Fungus1_07[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_07[right1]" - }, - { - "sceneName": "Fungus1_08", - "gateName": "left1", - "logic": "Fungus1_08[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_08[left1]" - }, - { - "sceneName": "Fungus1_09", - "gateName": "left1", - "logic": "Fungus1_09[left1] | Fungus1_09[right1] + (LEFTCLAW + (LEFTSUPERDASH + RIGHTCLAW + (LEFTDASH | WINGS) | WINGS + LEFTDASH) | RIGHTCLAW + LEFTDASH + WINGS + LEFTSUPERDASH + DANGEROUSSKIPS + PRECISEMOVEMENT | LEFTDASH + (RIGHTCLAW + $SHRIEKPOGO[1,1,1,before:AREASOUL,after:AREASOUL] | $SHRIEKPOGO[1,1,1,1,1,1,before:AREASOUL,after:AREASOUL]) | LEFTCLAW + (RIGHTCLAW | DIFFICULTSKIPS) + $SHRIEKPOGO[2,before:AREASOUL,after:AREASOUL,NOSTALL])", - "oneWayType": "TwoWay", - "Name": "Fungus1_09[left1]" - }, - { - "sceneName": "Fungus1_09", - "gateName": "right1", - "logic": "Fungus1_09[right1] | Fungus1_09[left1] + ((LEFTCLAW | RIGHTCLAW + WINGS | WINGS + $SHADESKIP | $SHRIEKPOGO[before:ROOMSOUL,after:AREASOUL]) + (SIDESLASH | GREATSLASH | CYCLONE | RIGHTDASHSLASH | LEFTDASHSLASH + DASHMASTER + OBSCURESKIPS) | FULLCLAW + RIGHTDASH + $SHRIEKPOGO[before:ROOMSOUL,after:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "Fungus1_09[right1]" - }, - { - "sceneName": "Fungus1_10", - "gateName": "left1", - "logic": "Fungus1_10[left1] | Fungus1_10[right1] | Fungus1_10[top1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_10[left1]" - }, - { - "sceneName": "Fungus1_10", - "gateName": "right1", - "logic": "Fungus1_10[right1] | Fungus1_10[left1] | Fungus1_10[top1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_10[right1]" - }, - { - "sceneName": "Fungus1_10", - "gateName": "top1", - "logic": "Fungus1_10[top1] | Fungus1_10[left1] | Fungus1_10[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_10[top1]" - }, - { - "sceneName": "Fungus1_11", - "gateName": "top1", - "logic": "Fungus1_11[top1] | Fungus1_11", - "oneWayType": "TwoWay", - "Name": "Fungus1_11[top1]" - }, - { - "sceneName": "Fungus1_11", - "gateName": "right1", - "logic": "Fungus1_11[right1] | Fungus1_11", - "oneWayType": "TwoWay", - "Name": "Fungus1_11[right1]" - }, - { - "sceneName": "Fungus1_11", - "gateName": "right2", - "logic": "Fungus1_11[right2] | Fungus1_11", - "oneWayType": "TwoWay", - "Name": "Fungus1_11[right2]" - }, - { - "sceneName": "Fungus1_11", - "gateName": "left1", - "logic": "Fungus1_11[left1] | Fungus1_11 + (LEFTCLAW | WINGS | LEFTSUPERDASH | LEFTDASH | SPELLAIRSTALL + $CASTSPELL[2,before:AREASOUL,after:AREASOUL] | $SHADESKIP)", - "oneWayType": "TwoWay", - "Name": "Fungus1_11[left1]" - }, - { - "sceneName": "Fungus1_11", - "gateName": "bot1", - "logic": "Fungus1_11[bot1] | Fungus1_11", - "oneWayType": "TwoWay", - "Name": "Fungus1_11[bot1]" - }, - { - "sceneName": "Fungus1_12", - "gateName": "left1", - "logic": "Fungus1_12[left1] | Fungus1_12[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_12[left1]" - }, - { - "sceneName": "Fungus1_12", - "gateName": "right1", - "logic": "Fungus1_12[right1] | Fungus1_12[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_12[right1]" - }, - { - "sceneName": "Fungus1_13", - "gateName": "right1", - "logic": "Fungus1_13[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_13[right1]" - }, - { - "sceneName": "Fungus1_13", - "gateName": "left1", - "logic": "Fungus1_13[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_13[left1]" - }, - { - "sceneName": "Fungus1_14", - "gateName": "left1", - "logic": "Fungus1_14[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_14[left1]" - }, - { - "sceneName": "Fungus1_15", - "gateName": "door1", - "logic": "Fungus1_15[door1] | Fungus1_15[right1] + (RIGHTCLAW + WINGS | RIGHTSUPERDASH + (LEFTCLAW | WINGS | $SHADESKIP[2HITS] + (LEFTDASH | LEFTSUPERDASH | DAMAGEBOOSTS + $TAKEDAMAGE) | $SHADESKIP[3HITS]) | RIGHTDASH + (LEFTCLAW | WINGS | RIGHTCLAW + (DAMAGEBOOSTS + $TAKEDAMAGE | PRECISEMOVEMENT + OBSCURESKIPS) | $SHADESKIP + (LEFTDASH | LEFTSUPERDASH | DAMAGEBOOSTS + $TAKEDAMAGE) | $SHADESKIP[2HITS]) | $SHRIEKPOGO[1,1]) | Bench-Sheo", - "oneWayType": "TwoWay", - "Name": "Fungus1_15[door1]" - }, - { - "sceneName": "Fungus1_15", - "gateName": "right1", - "logic": "Fungus1_15[right1] | Fungus1_15[door1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_15[right1]" - }, - { - "sceneName": "Fungus1_16_alt", - "gateName": "right1", - "logic": "Fungus1_16_alt[right1] | Can_Stag + Greenpath_Stag | Bench-Greenpath_Stag", - "oneWayType": "TwoWay", - "Name": "Fungus1_16_alt[right1]" - }, - { - "sceneName": "Fungus1_17", - "gateName": "left1", - "logic": "Fungus1_17[left1] | Fungus1_17[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_17[left1]" - }, - { - "sceneName": "Fungus1_17", - "gateName": "right1", - "logic": "Fungus1_17[right1] | Fungus1_17[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_17[right1]" - }, - { - "sceneName": "Fungus1_19", - "gateName": "left1", - "logic": "Fungus1_19[left1] | Fungus1_19[right1] | Fungus1_19[bot1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_19[left1]" - }, - { - "sceneName": "Fungus1_19", - "gateName": "right1", - "logic": "Fungus1_19[right1] | Fungus1_19[left1] | Fungus1_19[bot1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_19[right1]" - }, - { - "sceneName": "Fungus1_19", - "gateName": "bot1", - "logic": "Fungus1_19[bot1] | Fungus1_19[left1] | Fungus1_19[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_19[bot1]" - }, - { - "sceneName": "Fungus1_20_v02", - "gateName": "bot1", - "logic": "Fungus1_20_v02[bot1] | Fungus1_20_v02[bot2] | Fungus1_20_v02[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_20_v02[bot1]" - }, - { - "sceneName": "Fungus1_20_v02", - "gateName": "bot2", - "logic": "Fungus1_20_v02[bot2] | Fungus1_20_v02[bot1] | Fungus1_20_v02[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_20_v02[bot2]" - }, - { - "sceneName": "Fungus1_20_v02", - "gateName": "right1", - "logic": "Fungus1_20_v02[right1] | Fungus1_20_v02[bot1] | Fungus1_20_v02[bot2]", - "oneWayType": "TwoWay", - "Name": "Fungus1_20_v02[right1]" - }, - { - "sceneName": "Fungus1_21", - "gateName": "bot1", - "logic": "Fungus1_21[bot1] | Fungus1_21", - "oneWayType": "TwoWay", - "Name": "Fungus1_21[bot1]" - }, - { - "sceneName": "Fungus1_21", - "gateName": "top1", - "logic": "Fungus1_21[top1] | Fungus1_21", - "oneWayType": "TwoWay", - "Name": "Fungus1_21[top1]" - }, - { - "sceneName": "Fungus1_21", - "gateName": "left1", - "logic": "Fungus1_21[left1] | Fungus1_21", - "oneWayType": "TwoWay", - "Name": "Fungus1_21[left1]" - }, - { - "sceneName": "Fungus1_21", - "gateName": "right1", - "logic": "Fungus1_21[right1] | Fungus1_21", - "oneWayType": "TwoWay", - "Name": "Fungus1_21[right1]" - }, - { - "sceneName": "Fungus1_22", - "gateName": "bot1", - "logic": "Fungus1_22[bot1] | Fungus1_22[top1] | Fungus1_22[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_22[bot1]" - }, - { - "sceneName": "Fungus1_22", - "gateName": "top1", - "logic": "Fungus1_22[top1] | Fungus1_22[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_22[top1]" - }, - { - "sceneName": "Fungus1_22", - "gateName": "left1", - "logic": "Fungus1_22[left1] | Fungus1_22[top1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_22[left1]" - }, - { - "sceneName": "Fungus1_23", - "gateName": "left1", - "logic": "Fungus1_23[left1] | Fungus1_23[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_23[left1]" - }, - { - "sceneName": "Fungus1_23", - "gateName": "right1", - "logic": "Fungus1_23[right1] | Fungus1_23[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_23[right1]" - }, - { - "sceneName": "Fungus1_24", - "gateName": "left1", - "logic": "Fungus1_24[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_24[left1]" - }, - { - "sceneName": "Fungus1_25", - "gateName": "right1", - "logic": "Fungus1_25[right1] | Fungus1_25[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_25[right1]" - }, - { - "sceneName": "Fungus1_25", - "gateName": "left1", - "logic": "Fungus1_25[left1] | Fungus1_25[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_25[left1]" - }, - { - "sceneName": "Fungus1_26", - "gateName": "right1", - "logic": "Fungus1_26[right1] | Fungus1_26[door_SlugShrine] | Fungus1_26[left1] + (ACID | ACIDSKIPS + LEFTCLAW + WINGS + RIGHTSUPERDASH | COMPLEXSKIPS + ACIDSKIPS + LEFTCLAW + RIGHTDASH + ENEMYPOGOS + (FIREBALL + FIREBALLSKIPS + $CASTSPELL[2] | RIGHTSHARPSHADOW | $SHRIEKPOGO))", - "oneWayType": "TwoWay", - "Name": "Fungus1_26[right1]" - }, - { - "sceneName": "Fungus1_26", - "gateName": "left1", - "logic": "Fungus1_26[left1] | (Fungus1_26[right1] | Fungus1_26[door_SlugShrine]) + (ACID | COMPLEXSKIPS + ACIDSKIPS + WINGS + (LEFTSUPERDASH | ENEMYPOGOS + LEFTCLAW + SPELLAIRSTALL + $CASTSPELL) + LEFTDASH + (FIREBALL + FIREBALLSKIPS + $CASTSPELL[2] | LEFTSHARPSHADOW | $SHRIEKPOGO) | RIGHTSKIPACID + $SHRIEKPOGO[2]) + (ANYCLAW | WINGS | $SLOPEBALL)", - "oneWayType": "TwoWay", - "Name": "Fungus1_26[left1]" - }, - { - "sceneName": "Fungus1_26", - "gateName": "door_SlugShrine", - "logic": "Fungus1_26[door_SlugShrine] | Fungus1_26[right1] | Fungus1_26[left1] + (ACID | ACIDSKIPS + LEFTCLAW + WINGS + RIGHTSUPERDASH | COMPLEXSKIPS + ACIDSKIPS + LEFTCLAW + RIGHTDASH + ENEMYPOGOS + (FIREBALL + FIREBALLSKIPS + $CASTSPELL[2] | RIGHTSHARPSHADOW | $SHRIEKPOGO))", - "oneWayType": "TwoWay", - "Name": "Fungus1_26[door_SlugShrine]" - }, - { - "sceneName": "Fungus1_28", - "gateName": "left1", - "logic": "Fungus1_28[left1] | Fungus1_28[left2] + ((FULLCLAW | WINGS + ANYCLAW) + Defeated_Right_Cliffs_Baldur | WINGS + LEFTCLAW | WINGS + (ANYDASH | SPELLAIRSTALL + $CASTSPELL[2,before:ITEMSOUL,after:AREASOUL]) + DIFFICULTSKIPS + $SHADESKIP[2HITS] | $SHRIEKPOGO[6,before:ITEMSOUL,after:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "Fungus1_28[left1]" - }, - { - "sceneName": "Fungus1_28", - "gateName": "left2", - "logic": "Fungus1_28[left2] | Fungus1_28[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_28[left2]" - }, - { - "sceneName": "Fungus1_29", - "gateName": "left1", - "logic": "Fungus1_29[left1] | Fungus1_29[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_29[left1]" - }, - { - "sceneName": "Fungus1_29", - "gateName": "right1", - "logic": "Fungus1_29[right1] | Fungus1_29[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_29[right1]" - }, - { - "sceneName": "Fungus1_30", - "gateName": "top1", - "logic": "Fungus1_30[top1] | Fungus1_30", - "oneWayType": "TwoWay", - "Name": "Fungus1_30[top1]" - }, - { - "sceneName": "Fungus1_30", - "gateName": "top3", - "logic": "Fungus1_30[top3] | Fungus1_30", - "oneWayType": "TwoWay", - "Name": "Fungus1_30[top3]" - }, - { - "sceneName": "Fungus1_30", - "gateName": "left1", - "logic": "Fungus1_30[left1] | Fungus1_30", - "oneWayType": "TwoWay", - "Name": "Fungus1_30[left1]" - }, - { - "sceneName": "Fungus1_30", - "gateName": "right1", - "logic": "Fungus1_30[right1] | Fungus1_30", - "oneWayType": "TwoWay", - "Name": "Fungus1_30[right1]" - }, - { - "sceneName": "Fungus1_31", - "gateName": "top1", - "logic": "Fungus1_31[top1] | Fungus1_31[bot1] | Fungus1_31[right1] | Bench-Greenpath_Toll", - "oneWayType": "TwoWay", - "Name": "Fungus1_31[top1]" - }, - { - "sceneName": "Fungus1_31", - "gateName": "bot1", - "logic": "Fungus1_31[bot1] | Fungus1_31[top1] | Fungus1_31[right1] | Bench-Greenpath_Toll", - "oneWayType": "TwoWay", - "Name": "Fungus1_31[bot1]" - }, - { - "sceneName": "Fungus1_31", - "gateName": "right1", - "logic": "Fungus1_31[right1] | Fungus1_31[top1] | Fungus1_31[bot1] | Bench-Greenpath_Toll", - "oneWayType": "TwoWay", - "Name": "Fungus1_31[right1]" - }, - { - "sceneName": "Fungus1_32", - "gateName": "bot1", - "logic": "Fungus1_32[bot1] | Fungus1_32[top1] | Fungus1_32[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_32[bot1]" - }, - { - "sceneName": "Fungus1_32", - "gateName": "top1", - "logic": "Fungus1_32[top1] | Fungus1_32[bot1] | Fungus1_32[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_32[top1]" - }, - { - "sceneName": "Fungus1_32", - "gateName": "left1", - "logic": "Fungus1_32[left1] | Fungus1_32[bot1] | Fungus1_32[top1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_32[left1]" - }, - { - "sceneName": "Fungus1_34", - "gateName": "door1", - "logic": "Fungus1_34[door1] | Fungus1_34[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_34[door1]" - }, - { - "sceneName": "Fungus1_34", - "gateName": "left1", - "logic": "Fungus1_34[left1] | Fungus1_34[door1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_34[left1]" - }, - { - "sceneName": "Fungus1_35", - "gateName": "left1", - "logic": "Fungus1_35[left1] | Fungus1_35[right1] + (LANTERN | DARKROOMS)", - "oneWayType": "TwoWay", - "Name": "Fungus1_35[left1]" - }, - { - "sceneName": "Fungus1_35", - "gateName": "right1", - "logic": "Fungus1_35[right1] | Fungus1_35[left1] + (LANTERN | DARKROOMS)", - "oneWayType": "TwoWay", - "Name": "Fungus1_35[right1]" - }, - { - "sceneName": "Fungus1_36", - "gateName": "left1", - "logic": "Fungus1_36[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_36[left1]" - }, - { - "sceneName": "Fungus1_37", - "gateName": "left1", - "logic": "Fungus1_37[left1] | Bench-Stone_Sanctuary", - "oneWayType": "TwoWay", - "Name": "Fungus1_37[left1]" - }, - { - "sceneName": "Fungus1_Slug", - "gateName": "right1", - "logic": "Fungus1_Slug[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus1_Slug[right1]" - }, - { - "sceneName": "Room_Slug_Shrine", - "gateName": "left1", - "logic": "Room_Slug_Shrine[left1] | Bench-Lake_of_Unn", - "oneWayType": "TwoWay", - "Name": "Room_Slug_Shrine[left1]" - }, - { - "sceneName": "Room_nailmaster_02", - "gateName": "left1", - "logic": "Room_nailmaster_02[left1]", - "oneWayType": "TwoWay", - "Name": "Room_nailmaster_02[left1]" - }, - { - "sceneName": "Fungus3_01", - "gateName": "top1", - "logic": "Fungus3_01[top1] | Fungus3_01", - "oneWayType": "TwoWay", - "Name": "Fungus3_01[top1]" - }, - { - "sceneName": "Fungus3_01", - "gateName": "right1", - "logic": "Fungus3_01[right1] | Fungus3_01", - "oneWayType": "TwoWay", - "Name": "Fungus3_01[right1]" - }, - { - "sceneName": "Fungus3_01", - "gateName": "left1", - "logic": "Fungus3_01[left1] | Fungus3_01", - "oneWayType": "TwoWay", - "Name": "Fungus3_01[left1]" - }, - { - "sceneName": "Fungus3_01", - "gateName": "right2", - "logic": "Fungus3_01[right2] | Fungus3_01", - "oneWayType": "TwoWay", - "Name": "Fungus3_01[right2]" - }, - { - "sceneName": "Fungus3_02", - "gateName": "left1", - "logic": "Fungus3_02[left1] | Fungus3_02", - "oneWayType": "TwoWay", - "Name": "Fungus3_02[left1]" - }, - { - "sceneName": "Fungus3_02", - "gateName": "left2", - "logic": "Fungus3_02[left2] | Fungus3_02", - "oneWayType": "TwoWay", - "Name": "Fungus3_02[left2]" - }, - { - "sceneName": "Fungus3_02", - "gateName": "left3", - "logic": "Fungus3_02[left3] | Fungus3_02", - "oneWayType": "TwoWay", - "Name": "Fungus3_02[left3]" - }, - { - "sceneName": "Fungus3_02", - "gateName": "right1", - "logic": "Fungus3_02[right1] | Fungus3_02 + Opened_Archives_Exit_Wall", - "oneWayType": "TwoWay", - "Name": "Fungus3_02[right1]" - }, - { - "sceneName": "Fungus3_02", - "gateName": "right2", - "logic": "Fungus3_02[right2] | Fungus3_02", - "oneWayType": "TwoWay", - "Name": "Fungus3_02[right2]" - }, - { - "sceneName": "Fungus3_03", - "gateName": "right1", - "logic": "Fungus3_03[right1] | Fungus3_03[left1] + (ACID | RIGHTSKIPACID)", - "oneWayType": "TwoWay", - "Name": "Fungus3_03[right1]" - }, - { - "sceneName": "Fungus3_03", - "gateName": "left1", - "logic": "Fungus3_03[left1] | Fungus3_03[right1] + (ACID | LEFTSKIPACID)", - "oneWayType": "TwoWay", - "Name": "Fungus3_03[left1]" - }, - { - "sceneName": "Fungus3_24", - "gateName": "right1", - "logic": "Fungus3_24[right1] | Fungus3_24[left1] | Fungus3_24[top1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_24[right1]" - }, - { - "sceneName": "Fungus3_24", - "gateName": "left1", - "logic": "Fungus3_24[left1] | Fungus3_24[right1] | Fungus3_24[top1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_24[left1]" - }, - { - "sceneName": "Fungus3_24", - "gateName": "top1", - "logic": "Fungus3_24[top1] | Fungus3_24[right1] | Fungus3_24[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_24[top1]" - }, - { - "sceneName": "Fungus3_25", - "gateName": "right1", - "logic": "Fungus3_25[right1] | Fungus3_25[left1] + RIGHTSHADOWDASH", - "oneWayType": "TwoWay", - "Name": "Fungus3_25[right1]" - }, - { - "sceneName": "Fungus3_25", - "gateName": "left1", - "logic": "Fungus3_25[left1] | Fungus3_25[right1] + LEFTSHADOWDASH", - "oneWayType": "TwoWay", - "Name": "Fungus3_25[left1]" - }, - { - "sceneName": "Fungus3_25b", - "gateName": "right1", - "logic": "Fungus3_25b[right1] | Fungus3_25b[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_25b[right1]" - }, - { - "sceneName": "Fungus3_25b", - "gateName": "left1", - "logic": "Fungus3_25b[left1] | Fungus3_25b[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_25b[left1]" - }, - { - "sceneName": "Fungus3_26", - "gateName": "top1", - "logic": "Fungus3_26[top1] | Fungus3_26 + (ANYCLAW | WINGS | (RIGHTDASH + (LEFTDASH | SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL,after:ROOMSOUL]) + ENEMYPOGOS))", - "oneWayType": "TwoWay", - "Name": "Fungus3_26[top1]" - }, - { - "sceneName": "Fungus3_26", - "gateName": "left1", - "logic": "Fungus3_26[left1] | Fungus3_26", - "oneWayType": "TwoWay", - "Name": "Fungus3_26[left1]" - }, - { - "sceneName": "Fungus3_26", - "gateName": "left2", - "logic": "Fungus3_26[left2] | Fungus3_26", - "oneWayType": "TwoWay", - "Name": "Fungus3_26[left2]" - }, - { - "sceneName": "Fungus3_26", - "gateName": "left3", - "logic": "Fungus3_26[left3] | Fungus3_26", - "oneWayType": "TwoWay", - "Name": "Fungus3_26[left3]" - }, - { - "sceneName": "Fungus3_26", - "gateName": "right1", - "logic": "Fungus3_26[right1] | Fungus3_26", - "oneWayType": "TwoWay", - "Name": "Fungus3_26[right1]" - }, - { - "sceneName": "Fungus3_27", - "gateName": "left1", - "logic": "Fungus3_27[left1] | Fungus3_27[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_27[left1]" - }, - { - "sceneName": "Fungus3_27", - "gateName": "right1", - "logic": "Fungus3_27[right1] | Fungus3_27[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_27[right1]" - }, - { - "sceneName": "Fungus3_28", - "gateName": "right1", - "logic": "Fungus3_28[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_28[right1]" - }, - { - "sceneName": "Fungus3_30", - "gateName": "bot1", - "logic": "Fungus3_30[bot1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_30[bot1]" - }, - { - "sceneName": "Fungus3_35", - "gateName": "right1", - "logic": "Fungus3_35[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_35[right1]" - }, - { - "sceneName": "Fungus3_44", - "gateName": "bot1", - "logic": "Fungus3_44[bot1] | Fungus3_44 + LEFTSHADOWDASH", - "oneWayType": "TwoWay", - "Name": "Fungus3_44[bot1]" - }, - { - "sceneName": "Fungus3_44", - "gateName": "door1", - "logic": "Fungus3_44[door1] | Fungus3_44 + (ANYCLAW | WINGS + ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Fungus3_44[door1]" - }, - { - "sceneName": "Fungus3_44", - "gateName": "right1", - "logic": "Fungus3_44[right1] | Fungus3_44", - "oneWayType": "TwoWay", - "Name": "Fungus3_44[right1]" - }, - { - "sceneName": "Fungus3_47", - "gateName": "left1", - "logic": "Fungus3_47[left1] | Fungus3_47", - "oneWayType": "TwoWay", - "Name": "Fungus3_47[left1]" - }, - { - "sceneName": "Fungus3_47", - "gateName": "right1", - "logic": "Fungus3_47[right1] | Fungus3_47", - "oneWayType": "TwoWay", - "Name": "Fungus3_47[right1]" - }, - { - "sceneName": "Fungus3_47", - "gateName": "door1", - "logic": "Fungus3_47[door1] | Fungus3_47", - "oneWayType": "TwoWay", - "Name": "Fungus3_47[door1]" - }, - { - "sceneName": "Room_Fungus_Shaman", - "gateName": "left1", - "logic": "Room_Fungus_Shaman[left1]", - "oneWayType": "TwoWay", - "Name": "Room_Fungus_Shaman[left1]" - }, - { - "sceneName": "Fungus3_archive", - "gateName": "left1", - "logic": "Fungus3_archive[left1] | Fungus3_archive[bot1] | Bench-Archives", - "oneWayType": "TwoWay", - "Name": "Fungus3_archive[left1]" - }, - { - "sceneName": "Fungus3_archive", - "gateName": "bot1", - "logic": "Fungus3_archive[bot1] | Fungus3_archive[left1] | Bench-Archives", - "oneWayType": "TwoWay", - "Name": "Fungus3_archive[bot1]" - }, - { - "sceneName": "Fungus3_archive_02", - "gateName": "top1", - "logic": "Fungus3_archive_02[top1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_archive_02[top1]" - }, - { - "sceneName": "Fungus2_01", - "gateName": "left1", - "logic": "Fungus2_01[left1] | Fungus2_01", - "oneWayType": "TwoWay", - "Name": "Fungus2_01[left1]" - }, - { - "sceneName": "Fungus2_01", - "gateName": "left2", - "logic": "Fungus2_01[left2] | Fungus2_01", - "oneWayType": "TwoWay", - "Name": "Fungus2_01[left2]" - }, - { - "sceneName": "Fungus2_01", - "gateName": "left3", - "logic": "Fungus2_01[left3] | Fungus2_01", - "oneWayType": "TwoWay", - "Name": "Fungus2_01[left3]" - }, - { - "sceneName": "Fungus2_01", - "gateName": "right1", - "logic": "Fungus2_01[right1] | Fungus2_01 + (RIGHTDASH | RIGHTCLAW | WINGS | RIGHTSUPERDASH | SPELLAIRSTALL + $CASTSPELL[3,before:ITEMSOUL,after:MAPAREASOUL])", - "oneWayType": "TwoWay", - "Name": "Fungus2_01[right1]" - }, - { - "sceneName": "Fungus2_02", - "gateName": "right1", - "logic": "Fungus2_02[right1] | Can_Stag + Queen's_Station_Stag | Bench-Queen's_Station", - "oneWayType": "TwoWay", - "Name": "Fungus2_02[right1]" - }, - { - "sceneName": "Fungus2_34", - "gateName": "right1", - "logic": "Fungus2_34[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus2_34[right1]" - }, - { - "sceneName": "Fungus2_03", - "gateName": "left1", - "logic": "Fungus2_03[left1] | Fungus2_03", - "oneWayType": "TwoWay", - "Name": "Fungus2_03[left1]" - }, - { - "sceneName": "Fungus2_03", - "gateName": "bot1", - "logic": "Fungus2_03[bot1] | Fungus2_03", - "oneWayType": "TwoWay", - "Name": "Fungus2_03[bot1]" - }, - { - "sceneName": "Fungus2_03", - "gateName": "right1", - "logic": "Fungus2_03[right1] | Fungus2_03", - "oneWayType": "TwoWay", - "Name": "Fungus2_03[right1]" - }, - { - "sceneName": "Fungus2_04", - "gateName": "top1", - "logic": "Fungus2_04[top1] | Fungus2_04[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus2_04[top1]" - }, - { - "sceneName": "Fungus2_04", - "gateName": "right1", - "logic": "Fungus2_04[right1] | Fungus2_04[top1]", - "oneWayType": "TwoWay", - "Name": "Fungus2_04[right1]" - }, - { - "sceneName": "Fungus2_04", - "gateName": "left1", - "logic": "Fungus2_04[left1] | Fungus2_04", - "oneWayType": "TwoWay", - "Name": "Fungus2_04[left1]" - }, - { - "sceneName": "Fungus2_04", - "gateName": "right2", - "logic": "Fungus2_04[right2] | Fungus2_04", - "oneWayType": "TwoWay", - "Name": "Fungus2_04[right2]" - }, - { - "sceneName": "Fungus2_05", - "gateName": "bot1", - "logic": "Fungus2_05[bot1] | Fungus2_05[right1] + Defeated_Shrumal_Ogre_Arena", - "oneWayType": "TwoWay", - "Name": "Fungus2_05[bot1]" - }, - { - "sceneName": "Fungus2_05", - "gateName": "right1", - "logic": "Fungus2_05[right1] | Fungus2_05[bot1] + Defeated_Shrumal_Ogre_Arena", - "oneWayType": "TwoWay", - "Name": "Fungus2_05[right1]" - }, - { - "sceneName": "Fungus2_06", - "gateName": "top1", - "logic": "Fungus2_06[top1] | Fungus2_06[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus2_06[top1]" - }, - { - "sceneName": "Fungus2_06", - "gateName": "left1", - "logic": "Fungus2_06[left1] | Fungus2_06", - "oneWayType": "TwoWay", - "Name": "Fungus2_06[left1]" - }, - { - "sceneName": "Fungus2_06", - "gateName": "left2", - "logic": "Fungus2_06[left2] | Fungus2_06 + ACID", - "oneWayType": "TwoWay", - "Name": "Fungus2_06[left2]" - }, - { - "sceneName": "Fungus2_06", - "gateName": "right1", - "logic": "Fungus2_06[right1] | Fungus2_06 + (ACID | RIGHTDASH | WINGS | RIGHTCLAW + PRECISEMOVEMENT | RIGHTSUPERDASH | $SHADESKIP | SPELLAIRSTALL + $CASTSPELL[before:AREASOUL,after:ROOMSOUL]) | Fungus2_06[top1]", - // the shadeskip is technically missable since it is not possible to die with isma. this should be ok since isma still provides access with strictly better state. - "oneWayType": "TwoWay", - "Name": "Fungus2_06[right1]" - }, - { - "sceneName": "Fungus2_06", - "gateName": "right2", - "logic": "Fungus2_06[right2] | Fungus2_06", - "oneWayType": "TwoWay", - "Name": "Fungus2_06[right2]" - }, - { - "sceneName": "Fungus2_07", - "gateName": "left1", - "logic": "Fungus2_07[left1] | Fungus2_07[right1] + (ANYCLAW | LEFTDASH | WINGS | ACID)", - "oneWayType": "TwoWay", - "Name": "Fungus2_07[left1]" - }, - { - "sceneName": "Fungus2_07", - "gateName": "right1", - "logic": "Fungus2_07[right1] | Fungus2_07[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus2_07[right1]" - }, - { - "sceneName": "Fungus2_08", - "gateName": "left1", - "logic": "Fungus2_08[left1] | Fungus2_08[left2] | Fungus2_08[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus2_08[left1]" - }, - { - "sceneName": "Fungus2_08", - "gateName": "left2", - "logic": "Fungus2_08[left2] | Fungus2_08[left1] | Fungus2_08[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus2_08[left2]" - }, - { - "sceneName": "Fungus2_08", - "gateName": "right1", - "logic": "Fungus2_08[right1] | Fungus2_08[left1] | Fungus2_08[left2]", - "oneWayType": "TwoWay", - "Name": "Fungus2_08[right1]" - }, - { - "sceneName": "Fungus2_09", - "gateName": "left1", - "logic": "Fungus2_09[left1] | Fungus2_09[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus2_09[left1]" - }, - { - "sceneName": "Fungus2_09", - "gateName": "right1", - "logic": "Fungus2_09[right1] | Fungus2_09[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus2_09[right1]" - }, - { - "sceneName": "Fungus2_10", - "gateName": "right1", - "logic": "Fungus2_10[right1] | Fungus2_10[right2] | Fungus2_10[bot1]", - "oneWayType": "TwoWay", - "Name": "Fungus2_10[right1]" - }, - { - "sceneName": "Fungus2_10", - "gateName": "right2", - "logic": "Fungus2_10[right2] | Fungus2_10[right1] | Fungus2_10[bot1]", - "oneWayType": "TwoWay", - "Name": "Fungus2_10[right2]" - }, - { - "sceneName": "Fungus2_10", - "gateName": "bot1", - "logic": "Fungus2_10[bot1] | Fungus2_10[right1] | Fungus2_10[right2]", - "oneWayType": "TwoWay", - "Name": "Fungus2_10[bot1]" - }, - { - "sceneName": "Fungus2_11", - "gateName": "top1", - "logic": "Fungus2_11[top1] | Fungus2_11", - "oneWayType": "TwoWay", - "Name": "Fungus2_11[top1]" - }, - { - "sceneName": "Fungus2_11", - "gateName": "left1", - "logic": "Fungus2_11[left1] | Fungus2_11", - "oneWayType": "TwoWay", - "Name": "Fungus2_11[left1]" - }, - { - "sceneName": "Fungus2_11", - "gateName": "left2", - "logic": "Fungus2_11[left2] | Fungus2_11 + (LEFTCLAW | WINGS | ENEMYPOGOS + (OBSCURESKIPS | LEFTDASH) | $SHADESKIP[2HITS])", - "oneWayType": "TwoWay", - "Name": "Fungus2_11[left2]" - }, - { - "sceneName": "Fungus2_11", - "gateName": "right1", - "logic": "Fungus2_11[right1] | Fungus2_11", - "oneWayType": "TwoWay", - "Name": "Fungus2_11[right1]" - }, - { - "sceneName": "Fungus2_12", - "gateName": "left1", - "logic": "Fungus2_12[left1] | Fungus2_12[bot1] + (ANYCLAW | WINGS | LEFTDASH | ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Fungus2_12[left1]" - }, - { - "sceneName": "Fungus2_12", - "gateName": "bot1", - "logic": "Fungus2_12[bot1] | Fungus2_12[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus2_12[bot1]" - }, - { - "sceneName": "Fungus2_13", - "gateName": "top1", - "logic": "Fungus2_13[top1] | Fungus2_13 + (ANYCLAW | WINGS | ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Fungus2_13[top1]" - }, - { - "sceneName": "Fungus2_13", - "gateName": "left2", - "logic": "Fungus2_13[left2] | Fungus2_13", - "oneWayType": "TwoWay", - "Name": "Fungus2_13[left2]" - }, - { - "sceneName": "Fungus2_13", - "gateName": "left3", - "logic": "Fungus2_13[left3] | Fungus2_13 + (LEFTDASH | LEFTSUPERDASH | ANYCLAW | WINGS | ACID | ENEMYPOGOS | PRECISEMOVEMENT) | Bench-Bretta", - "oneWayType": "TwoWay", - "Name": "Fungus2_13[left3]" - }, - { - "sceneName": "Fungus2_14", - "gateName": "top1", - "logic": "Fungus2_14[top1] + (ANYCLAW | WINGS + PRECISEMOVEMENT) | Fungus2_14 + (LEFTCLAW | WINGS + RIGHTCLAW | $SHRIEKPOGO[1,1,before:ROOMSOUL])", - "oneWayType": "TwoWay", - "Name": "Fungus2_14[top1]" - }, - { - "sceneName": "Fungus2_14", - "gateName": "right1", - "logic": "Fungus2_14[right1] | Fungus2_14 + (RIGHTCLAW | WINGS | ACID | RIGHTDASH + ENEMYPOGOS | RIGHTSUPERDASH | ENEMYPOGOS + DIFFICULTSKIPS)", - "oneWayType": "TwoWay", - "Name": "Fungus2_14[right1]" - }, - { - "sceneName": "Fungus2_14", - "gateName": "bot3", - "logic": "Fungus2_14[bot3] | Fungus2_14[top1] + (RIGHTCLAW | WINGS | LEFTCLAW + (RIGHTDASH | RIGHTSUPERDASH | BACKGROUNDPOGOS)) | Fungus2_14 + WINGS + ENEMYPOGOS + OBSCURESKIPS", - "oneWayType": "TwoWay", - "Name": "Fungus2_14[bot3]" - }, - { - "sceneName": "Fungus2_15", - "gateName": "top3", - "logic": "Fungus2_15[top3] | Fungus2_15 + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Fungus2_15[top3]" - }, - { - "sceneName": "Fungus2_15", - "gateName": "right1", - "logic": "Fungus2_15[right1] | Fungus2_15 + (ANYCLAW | WINGS + ENEMYPOGOS | $SHRIEKPOGO[2,before:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "Fungus2_15[right1]" - }, - { - "sceneName": "Fungus2_15", - "gateName": "left1", - "logic": "Fungus2_15[left1] | (Fungus2_15[top3] | Fungus2_15[right1]) + Defeated_Mantis_Lords", - "oneWayType": "TwoWay", - "Name": "Fungus2_15[left1]" - }, - { - "sceneName": "Fungus2_17", - "gateName": "left1", - "logic": "Fungus2_17[left1] | Fungus2_17 + LEFTCLAW | Fungus2_17[right1] + (LEFTDASH | WINGS) | Fungus2_17[bot1] + WINGS + ENEMYPOGOS", - "oneWayType": "TwoWay", - "Name": "Fungus2_17[left1]" - }, - { - "sceneName": "Fungus2_17", - "gateName": "right1", - "logic": "Fungus2_17[right1] | Fungus2_17 + (RIGHTCLAW | LEFTCLAW + (RIGHTDASH | RIGHTSUPERDASH)) | Fungus2_17[left1] + WINGS | Fungus2_17[bot1] + WINGS + ENEMYPOGOS", - "oneWayType": "TwoWay", - "Name": "Fungus2_17[right1]" - }, - { - "sceneName": "Fungus2_17", - "gateName": "bot1", - "logic": "Fungus2_17[bot1] | Fungus2_17", - "oneWayType": "TwoWay", - "Name": "Fungus2_17[bot1]" - }, - { - "sceneName": "Fungus2_18", - "gateName": "right1", - "logic": "Fungus2_18[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus2_18[right1]" - }, - { - "sceneName": "Fungus2_18", - "gateName": "bot1", - "logic": "Fungus2_18[bot1] | Fungus2_18 + (ANYCLAW | WINGS + (ENEMYPOGOS + OBSCURESKIPS | $SHADESKIP))", - "oneWayType": "TwoWay", - "Name": "Fungus2_18[bot1]" - }, - { - "sceneName": "Fungus2_18", - "gateName": "top1", - "logic": "Fungus2_18[top1] | Fungus2_18", - "oneWayType": "TwoWay", - "Name": "Fungus2_18[top1]" - }, - { - "sceneName": "Fungus2_19", - "gateName": "top1", - "logic": "Fungus2_19[top1] | Fungus2_19[left1] + (RIGHTCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Fungus2_19[top1]" - }, - { - "sceneName": "Fungus2_19", - "gateName": "left1", - "logic": "Fungus2_19[left1] | Fungus2_19[top1] + (LEFTCLAW | WINGS + LEFTDASH | $SHRIEKPOGO[before:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "Fungus2_19[left1]" - }, - { - "sceneName": "Fungus2_20", - "gateName": "right1", - "logic": "Fungus2_20[right1] | Fungus2_20", - "oneWayType": "TwoWay", - "Name": "Fungus2_20[right1]" - }, - { - "sceneName": "Fungus2_20", - "gateName": "left1", - "logic": "Fungus2_20[left1] | Fungus2_20", - "oneWayType": "TwoWay", - "Name": "Fungus2_20[left1]" - }, - { - "sceneName": "Fungus2_21", - "gateName": "right1", - "logic": "Fungus2_21[right1] | Fungus2_21 + CREST", - "oneWayType": "TwoWay", - "Name": "Fungus2_21[right1]" - }, - { - "sceneName": "Fungus2_21", - "gateName": "left1", - "logic": "Fungus2_21[left1] | Fungus2_21", - "oneWayType": "TwoWay", - "Name": "Fungus2_21[left1]" - }, - { - "sceneName": "Fungus2_23", - "gateName": "right1", - "logic": "Fungus2_23[right1] | Fungus2_23", - "oneWayType": "TwoWay", - "Name": "Fungus2_23[right1]" - }, - { - "sceneName": "Fungus2_23", - "gateName": "right2", - "logic": "Fungus2_23[right2] | Fungus2_23 + Opened_Waterways_Exit", - "oneWayType": "TwoWay", - "Name": "Fungus2_23[right2]" - }, - { - "sceneName": "Fungus2_26", - "gateName": "left1", - "logic": "Fungus2_26[left1] | Bench-Leg_Eater", - "oneWayType": "TwoWay", - "Name": "Fungus2_26[left1]" - }, - { - "sceneName": "Fungus2_28", - "gateName": "left1", - "logic": "Fungus2_28[left1] | Fungus2_28[left2]", - "oneWayType": "TwoWay", - "Name": "Fungus2_28[left1]" - }, - { - "sceneName": "Fungus2_28", - "gateName": "left2", - "logic": "Fungus2_28[left2] | Fungus2_28[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus2_28[left2]" - }, - { - "sceneName": "Fungus2_29", - "gateName": "right1", - "logic": "Fungus2_29[right1] | Fungus2_29[bot1] + (ANYCLAW | WINGS) | Fungus2_29", - "oneWayType": "TwoWay", - "Name": "Fungus2_29[right1]" - }, - { - "sceneName": "Fungus2_29", - "gateName": "bot1", - "logic": "Fungus2_29[bot1] | Fungus2_29", - "oneWayType": "TwoWay", - "Name": "Fungus2_29[bot1]" - }, - { - "sceneName": "Fungus2_30", - "gateName": "bot1", - "logic": "Fungus2_30[bot1] | Fungus2_30[top1]", - "oneWayType": "OneWayIn", - "Name": "Fungus2_30[bot1]" - }, - { - "sceneName": "Fungus2_30", - "gateName": "top1", - "logic": "Fungus2_30[top1] + (ANYCLAW | WINGS + PRECISEMOVEMENT)", - "oneWayType": "TwoWay", - "Name": "Fungus2_30[top1]" - }, - { - "sceneName": "Fungus2_31", - "gateName": "left1", - "logic": "Fungus2_31[left1] | Bench-Mantis_Village + Defeated_Mantis_Lords", - "oneWayType": "TwoWay", - "Name": "Fungus2_31[left1]" - }, - { - "sceneName": "Fungus2_32", - "gateName": "left1", - "logic": "Fungus2_32[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus2_32[left1]" - }, - { - "sceneName": "Fungus2_33", - "gateName": "right1", - "logic": "Fungus2_33[right1] | Fungus2_33[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus2_33[right1]" - }, - { - "sceneName": "Fungus2_33", - "gateName": "left1", - "logic": "Fungus2_33[left1] | Fungus2_33[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus2_33[left1]" - }, - { - "sceneName": "Deepnest_01", - "gateName": "right1", - "logic": "Deepnest_01[right1] | Deepnest_01", - "oneWayType": "TwoWay", - "Name": "Deepnest_01[right1]" - }, - { - "sceneName": "Deepnest_01", - "gateName": "bot1", - "logic": "Deepnest_01[bot1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_01[bot1]" - }, - { - "sceneName": "Deepnest_01", - "gateName": "bot2", - "logic": "Deepnest_01[bot2] | Deepnest_01", - "oneWayType": "OneWayIn", - "Name": "Deepnest_01[bot2]" - }, - { - "sceneName": "Deepnest_01", - "gateName": "left1", - "logic": "Deepnest_01[left1] | Deepnest_01", - "oneWayType": "TwoWay", - "Name": "Deepnest_01[left1]" - }, - { - "sceneName": "Deepnest_01b", - "gateName": "top1", - "logic": "Deepnest_01b[top1] + (ANYCLAW | WINGS | ENEMYPOGOS + DANGEROUSSKIPS) | Deepnest_01b + (ANYCLAW + WINGS | (ANYCLAW | WINGS) + $SHADESKIP | $SHRIEKPOGO[1,1,before:ROOMSOUL,after:ROOMSOUL]) | Deepnest_01b[right1] + (ANYCLAW | WINGS + ENEMYPOGOS + DANGEROUSSKIPS | $SHRIEKPOGO[1,before:ROOMSOUL,after:ROOMSOUL])", - "oneWayType": "TwoWay", - "Name": "Deepnest_01b[top1]" - }, - { - "sceneName": "Deepnest_01b", - "gateName": "top2", - "logic": "NONE", - "oneWayType": "OneWayOut", - "Name": "Deepnest_01b[top2]" - }, - { - "sceneName": "Deepnest_01b", - "gateName": "right1", - "logic": "Deepnest_01b[right1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_01b[right1]" - }, - { - "sceneName": "Deepnest_01b", - "gateName": "right2", - "logic": "Deepnest_01b[right2] | Deepnest_01b[top1] | Deepnest_01b[top2] | Deepnest_01b + (WINGS | RIGHTDASH | RIGHTSUPERDASH)", - "oneWayType": "TwoWay", - "Name": "Deepnest_01b[right2]" - }, - { - "sceneName": "Deepnest_01b", - "gateName": "bot1", - "logic": "Deepnest_01b[bot1] | Deepnest_01b", - "oneWayType": "TwoWay", - "Name": "Deepnest_01b[bot1]" - }, - { - "sceneName": "Deepnest_02", - "gateName": "left1", - "logic": "Deepnest_02[left1] | Deepnest_02 + (ANYCLAW | $SHRIEKPOGO[3,before:ROOMSOUL,after:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "Deepnest_02[left1]" - }, - { - "sceneName": "Deepnest_02", - "gateName": "left2", - "logic": "Deepnest_02[left2] | Deepnest_02", - "oneWayType": "TwoWay", - "Name": "Deepnest_02[left2]" - }, - { - "sceneName": "Deepnest_02", - "gateName": "right1", - "logic": "Deepnest_02[right1] | Deepnest_02[left1] | Deepnest_02 + (ANYCLAW | WINGS | ENEMYPOGOS | BACKGROUNDPOGOS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_02[right1]" - }, - { - "sceneName": "Deepnest_03", - "gateName": "right1", - "logic": "Deepnest_03[right1] | Deepnest_03", - "oneWayType": "TwoWay", - "Name": "Deepnest_03[right1]" - }, - { - "sceneName": "Deepnest_03", - "gateName": "left1", - "logic": "Deepnest_03[left1] | Deepnest_03[top1] | Deepnest_03 + (LEFTCLAW | WINGS | RIGHTCLAW + ENEMYPOGOS + COMPLEXSKIPS)", // marked as complex due to randomness in corpse spawn. Damage boost and background pogo alternatives also exist, but are intentionally omitted. - "oneWayType": "TwoWay", - "Name": "Deepnest_03[left1]" - }, - { - "sceneName": "Deepnest_03", - "gateName": "top1", - "logic": "Deepnest_03[top1] + (ANYCLAW | WINGS) | Deepnest_03[left1] + RIGHTCLAW | Deepnest_03 + (FULLCLAW | WINGS | RIGHTCLAW + ENEMYPOGOS + COMPLEXSKIPS | LEFTCLAW + $SHADESKIP)", - "oneWayType": "TwoWay", - "Name": "Deepnest_03[top1]" - }, - { - "sceneName": "Deepnest_03", - "gateName": "left2", - "logic": "Deepnest_03[left2] | Deepnest_03 + (LEFTSUPERDASH | WINGS | LEFTCLAW + ($SHADESKIP | $SLOPEBALL[before:ROOMSOUL]))", - "oneWayType": "TwoWay", - "Name": "Deepnest_03[left2]" - }, - { - "sceneName": "Deepnest_09", - "gateName": "left1", - "logic": "Deepnest_09[left1] | Can_Stag + Distant_Village_Stag", - "oneWayType": "TwoWay", - "Name": "Deepnest_09[left1]" - }, - { - "sceneName": "Deepnest_10", - "gateName": "right1", - "logic": "Deepnest_10[right1] | Deepnest_10 + (FULLCLAW | WINGS) | Deepnest_10[door1] + (RIGHTCLAW | RIGHTDASH | RIGHTSUPERDASH)", - "oneWayType": "TwoWay", - "Name": "Deepnest_10[right1]" - }, - { - "sceneName": "Deepnest_10", - "gateName": "right2", - "logic": "Deepnest_10[right2] | Deepnest_10", - "oneWayType": "TwoWay", - "Name": "Deepnest_10[right2]" - }, - { - "sceneName": "Deepnest_10", - "gateName": "right3", - "logic": "Deepnest_10[right3] | Deepnest_10", - "oneWayType": "TwoWay", - "Name": "Deepnest_10[right3]" - }, - { - "sceneName": "Deepnest_10", - "gateName": "door1", - "logic": "Deepnest_10[door1] | Deepnest_10 + (LEFTCLAW | WINGS) | Deepnest_10[right1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_10[door1]" - }, - { - "sceneName": "Deepnest_10", - "gateName": "door2", - "logic": "Deepnest_10[door2] | Deepnest_10 + (ANYCLAW | WINGS | LEFTDASH) | Deepnest_10[door1] | Deepnest_10[right1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_10[door2]" - }, - { - "sceneName": "Room_spider_small", - "gateName": "left1", - "logic": "Room_spider_small[left1]", - "oneWayType": "TwoWay", - "Name": "Room_spider_small[left1]" - }, - { - "sceneName": "Deepnest_Spider_Town", - "gateName": "left1", - "logic": "Deepnest_Spider_Town[left1] | Bench-Beast's_Den", - "oneWayType": "TwoWay", - "Name": "Deepnest_Spider_Town[left1]" - }, - { - "sceneName": "Deepnest_14", - "gateName": "right1", - "logic": "Deepnest_14[right1] | Deepnest_14 + (RIGHTCLAW | LEFTCLAW + RIGHTSUPERDASH | WINGS | RIGHTDASH) | Deepnest_14[left1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_14[right1]" - }, - { - "sceneName": "Deepnest_14", - "gateName": "left1", - "logic": "Deepnest_14[left1] | Deepnest_14 + (WINGS | (RIGHTCLAW | RIGHTDASH | LEFTCLAW + RIGHTSUPERDASH) + (LEFTCLAW | LEFTDASH | RIGHTCLAW + LEFTSUPERDASH)) | Bench-Failed_Tramway", - "oneWayType": "TwoWay", - "Name": "Deepnest_14[left1]" - }, - { - "sceneName": "Deepnest_14", - "gateName": "bot1", - "logic": "Deepnest_14[bot1] | Deepnest_14", - "oneWayType": "TwoWay", - "Name": "Deepnest_14[bot1]" - }, - { - "sceneName": "Deepnest_14", - "gateName": "bot2", - "logic": "Deepnest_14[bot2] | Deepnest_14", - "oneWayType": "TwoWay", - "Name": "Deepnest_14[bot2]" - }, - { - "sceneName": "Deepnest_16", - "gateName": "left1", - "logic": "Deepnest_16[left1] | Deepnest_16[bot1] + (LEFTCLAW | RIGHTCLAW + WINGS | $SHRIEKPOGO[6])", - "oneWayType": "TwoWay", - "Name": "Deepnest_16[left1]" - }, - { - "sceneName": "Deepnest_16", - "gateName": "bot1", - "logic": "Deepnest_16[bot1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_16[bot1]" - }, - { - "sceneName": "Deepnest_17", - "gateName": "left1", - "logic": "Deepnest_17[left1] | Deepnest_17", - "oneWayType": "TwoWay", - "Name": "Deepnest_17[left1]" - }, - { - "sceneName": "Deepnest_17", - "gateName": "right1", - "logic": "Deepnest_17[right1] | Deepnest_17", - "oneWayType": "TwoWay", - "Name": "Deepnest_17[right1]" - }, - { - "sceneName": "Deepnest_17", - "gateName": "top1", - "logic": "Deepnest_17[top1] | Deepnest_17", - "oneWayType": "TwoWay", - "Name": "Deepnest_17[top1]" - }, - { - "sceneName": "Deepnest_17", - "gateName": "bot1", - "logic": "Deepnest_17[bot1] | Deepnest_17", - "oneWayType": "TwoWay", - "Name": "Deepnest_17[bot1]" - }, - { - "sceneName": "Fungus2_25", - "gateName": "top1", - "logic": "Fungus2_25[top1] + (ANYCLAW | WINGS) | (Fungus2_25[top2] | Fungus2_25[right1]) + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Fungus2_25[top1]" - }, - { - "sceneName": "Fungus2_25", - "gateName": "top2", - "logic": "NONE", - "oneWayType": "OneWayOut", - "Name": "Fungus2_25[top2]" - }, - { - "sceneName": "Fungus2_25", - "gateName": "right1", - "logic": "Fungus2_25[right1] | (Fungus2_25[top1] | Fungus2_25[top2]) + Defeated_Mantis_Lords", - "oneWayType": "TwoWay", - "Name": "Fungus2_25[right1]" - }, - { - "sceneName": "Deepnest_26", - "gateName": "left1", - "logic": "Deepnest_26[left1] | Deepnest_26 + (LEFTCLAW | (WINGS + ENEMYPOGOS) | $SHRIEKPOGO) + Opened_Tramway_Exit_Gate", - "oneWayType": "TwoWay", - "Name": "Deepnest_26[left1]" - }, - { - "sceneName": "Deepnest_26", - "gateName": "left2", - "logic": "Deepnest_26[left2] | Deepnest_26 + (LEFTCLAW | (WINGS + ENEMYPOGOS) | $SHRIEKPOGO)", - "oneWayType": "TwoWay", - "Name": "Deepnest_26[left2]" - }, - { - "sceneName": "Deepnest_26", - "gateName": "right1", - "logic": "Deepnest_26[right1] | Deepnest_26", - "oneWayType": "TwoWay", - "Name": "Deepnest_26[right1]" - }, - { - "sceneName": "Deepnest_26", - "gateName": "bot1", - "logic": "Deepnest_26[bot1] | Deepnest_26", - "oneWayType": "TwoWay", - "Name": "Deepnest_26[bot1]" - }, - { - "sceneName": "Deepnest_26b", - "gateName": "right2", - "logic": "Deepnest_26b[right2]", - "oneWayType": "TwoWay", - "Name": "Deepnest_26b[right2]" - }, - { - "sceneName": "Deepnest_26b", - "gateName": "right1", - "logic": "Deepnest_26b[right1] | Deepnest_26b[right2] + (WINGS | (LEFTCLAW + (RIGHTDASH | ENEMYPOGOS)))", - "oneWayType": "TwoWay", - "Name": "Deepnest_26b[right1]" - }, - { - "sceneName": "Deepnest_30", - "gateName": "left1", - "logic": "Deepnest_30[left1] | Deepnest_30[right1] | Deepnest_30[top1] + (ANYCLAW | WINGS) | Bench-Deepnest_Hot_Springs | Deepnest_Hot_Spring", - "oneWayType": "TwoWay", - "Name": "Deepnest_30[left1]" - }, - { - "sceneName": "Deepnest_30", - "gateName": "top1", - "logic": "Deepnest_30[top1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_30[top1]" - }, - { - "sceneName": "Deepnest_30", - "gateName": "right1", - "logic": "Deepnest_30[right1] | Deepnest_30[left1] | Deepnest_30[top1] + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_30[right1]" - }, - { - "sceneName": "Deepnest_31", - "gateName": "right1", - "logic": "Deepnest_31[right1] | Deepnest_31[right2] + (RIGHTCLAW | WINGS | LEFTCLAW + RIGHTDASH)", - "oneWayType": "TwoWay", - "Name": "Deepnest_31[right1]" - }, - { - "sceneName": "Deepnest_31", - "gateName": "right2", - "logic": "Deepnest_31[right2] | Deepnest_31[right1] + (ANYCLAW | $SHRIEKPOGO[3,before:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "Deepnest_31[right2]" - }, - { - "sceneName": "Deepnest_32", - "gateName": "left1", - "logic": "Deepnest_32[left1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_32[left1]" - }, - { - "sceneName": "Deepnest_33", - "gateName": "top1", - "logic": "Deepnest_33[top1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_33[top1]" - }, - { - "sceneName": "Deepnest_33", - "gateName": "top2", - "logic": "Deepnest_33[top2] | (Deepnest_33[top1] | Deepnest_33[bot1]) + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_33[top2]" - }, - { - "sceneName": "Deepnest_33", - "gateName": "bot1", - "logic": "Deepnest_33[bot1] | Deepnest_33[top1] | Deepnest_33[top2]", - "oneWayType": "TwoWay", - "Name": "Deepnest_33[bot1]" - }, - { - "sceneName": "Deepnest_34", - "gateName": "left1", - "logic": "Deepnest_34[left1] | Deepnest_34 + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_34[left1]" - }, - { - "sceneName": "Deepnest_34", - "gateName": "right1", - "logic": "Deepnest_34[right1] | Deepnest_34 + (ANYCLAW | WINGS | RIGHTDASH)", - "oneWayType": "TwoWay", - "Name": "Deepnest_34[right1]" - }, - { - "sceneName": "Deepnest_34", - "gateName": "top1", - "logic": "Deepnest_34[top1] + (RIGHTCLAW | WINGS) | Deepnest_34 + (FULLCLAW | WINGS + (LEFTCLAW | RIGHTCLAW + LEFTDASH) | RIGHTCLAW + $SHRIEKPOGO[before:ROOMSOUL,after:ROOMSOUL] | $SHRIEKPOGO[5,2,before:AREASOUL,after:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "Deepnest_34[top1]" - }, - { - "sceneName": "Deepnest_35", - "gateName": "left1", - "logic": "Deepnest_35[left1] | Deepnest_35", - "oneWayType": "TwoWay", - "Name": "Deepnest_35[left1]" - }, - { - "sceneName": "Deepnest_35", - "gateName": "top1", - "logic": "Deepnest_35[top1] + (ANYCLAW | WINGS) | Deepnest_35 + ANYCLAW", - "oneWayType": "TwoWay", - "Name": "Deepnest_35[top1]" - }, - { - "sceneName": "Deepnest_35", - "gateName": "bot1", - "logic": "Deepnest_35[bot1] | Deepnest_35", - "oneWayType": "TwoWay", - "Name": "Deepnest_35[bot1]" - }, - { - "sceneName": "Deepnest_36", - "gateName": "left1", - "logic": "Deepnest_36[left1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_36[left1]" - }, - { - "sceneName": "Deepnest_37", - "gateName": "left1", - "logic": "Deepnest_37[left1] | Deepnest_37", - "oneWayType": "TwoWay", - "Name": "Deepnest_37[left1]" - }, - { - "sceneName": "Deepnest_37", - "gateName": "right1", - "logic": "Deepnest_37[right1] | Deepnest_37", - "oneWayType": "TwoWay", - "Name": "Deepnest_37[right1]" - }, - { - "sceneName": "Deepnest_37", - "gateName": "top1", - "logic": "Deepnest_37[top1] | Deepnest_37", - "oneWayType": "TwoWay", - "Name": "Deepnest_37[top1]" - }, - { - "sceneName": "Deepnest_37", - "gateName": "bot1", - "logic": "Deepnest_37[bot1] | Deepnest_37", - "oneWayType": "TwoWay", - "Name": "Deepnest_37[bot1]" - }, - { - "sceneName": "Deepnest_38", - "gateName": "bot1", - "logic": "Deepnest_38[bot1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_38[bot1]" - }, - { - "sceneName": "Deepnest_39", - "gateName": "left1", - "logic": "Deepnest_39[left1] | Deepnest_39[top1] + (LANTERN | DARKROOMS) + (LEFTDASH | LEFTSUPERDASH | RIGHTCLAW | WINGS | ENEMYPOGOS | SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL,after:ROOMSOUL]) | Deepnest_39[door1] + (LANTERN | DARKROOMS) + (RIGHTCLAW | ANYCLAW + (WINGS | LEFTDASH | LEFTSUPERDASH | SPELLAIRSTALL + $CASTSPELL[3,before:ROOMSOUL,after:ROOMSOUL]) | ENEMYPOGOS + (ANYCLAW | WINGS)) | Deepnest_39[right1] + (LANTERN | DARKROOMS) + (FULLCLAW | WINGS + ANYCLAW | ENEMYPOGOS + (ANYCLAW | WINGS))", - "oneWayType": "TwoWay", - "Name": "Deepnest_39[left1]" - }, - { - "sceneName": "Deepnest_39", - "gateName": "top1", - "logic": "Deepnest_39[top1] + (LEFTCLAW | WINGS) | Deepnest_39[left1] + (LANTERN | DARKROOMS) + (WINGS | LEFTCLAW + (RIGHTDASH | RIGHTCLAW | ENEMYPOGOS | SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL,after:ROOMSOUL])) | Deepnest_39[door1] + (LANTERN | DARKROOMS) + (ANYCLAW + WINGS | FULLCLAW | LEFTCLAW + ((LEFTDASH | LEFTSUPERDASH) + (RIGHTDASH | SPELLAIRSTALL + $CASTSPELL[1,before:ROOMSOUL,after:ROOMSOUL]) | SPELLAIRSTALL + $CASTSPELL[3,1,before:ROOMSOUL,after:ROOMSOUL]) | ENEMYPOGOS + (ANYCLAW | WINGS)) | Deepnest_39[right1] + (LANTERN | DARKROOMS) + (FULLCLAW | WINGS + ANYCLAW | ENEMYPOGOS + (ANYCLAW | WINGS))", - "oneWayType": "TwoWay", - "Name": "Deepnest_39[top1]" - }, - { - "sceneName": "Deepnest_39", - "gateName": "door1", - "logic": "Deepnest_39[door1] | (Deepnest_39[left1] | Deepnest_39[top1] | Deepnest_39[right1] + (FULLCLAW | WINGS + ANYCLAW | ENEMYPOGOS + (ANYCLAW | WINGS))) + (LANTERN | DARKROOMS) + (RIGHTDASH | WINGS | RIGHTCLAW + (RIGHTSUPERDASH | SPELLAIRSTALL + $CASTSPELL[1,1,before:ROOMSOUL,after:ROOMSOUL]))", - "oneWayType": "TwoWay", - "Name": "Deepnest_39[door1]" - }, - { - "sceneName": "Deepnest_39", - "gateName": "right1", - "logic": "Deepnest_39[right1] | (Deepnest_39[left1] | Deepnest_39[top1] | Deepnest_39[door1]) + (LANTERN | DARKROOMS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_39[right1]" - }, - { - "sceneName": "Deepnest_40", - "gateName": "right1", - "logic": "Deepnest_40[right1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_40[right1]" - }, - { - "sceneName": "Deepnest_41", - "gateName": "right1", - "logic": "Deepnest_41[right1] | Deepnest_41[left1] + (LANTERN | DARKROOMS) + (RIGHTCLAW | WINGS + (LEFTCLAW | ENEMYPOGOS) | LEFTCLAW + ENEMYPOGOS) | Deepnest_41[left2] + (LANTERN | DARKROOMS) + (FULLCLAW | WINGS + (LEFTCLAW + ENEMYPOGOS | RIGHTCLAW | DIFFICULTSKIPS + COMPLEXSKIPS + ENEMYPOGOS + ANYDASH + $SHADESKIP))", - "oneWayType": "TwoWay", - "Name": "Deepnest_41[right1]" - }, - { - "sceneName": "Deepnest_41", - "gateName": "left1", - "logic": "Deepnest_41[left1] | Deepnest_41[right1] + (LANTERN | DARKROOMS) + (LEFTCLAW | WINGS + (RIGHTCLAW | ENEMYPOGOS) | RIGHTCLAW + ENEMYPOGOS) | Deepnest_41[left2] + (LANTERN | DARKROOMS) + (FULLCLAW | WINGS + (LEFTCLAW + ENEMYPOGOS | RIGHTCLAW))", - "oneWayType": "TwoWay", - "Name": "Deepnest_41[left1]" - }, - { - "sceneName": "Deepnest_41", - "gateName": "left2", - "logic": "Deepnest_41[left2]", - "oneWayType": "TwoWay", - "Name": "Deepnest_41[left2]" - }, - { - "sceneName": "Deepnest_42", - "gateName": "bot1", - "logic": "Deepnest_42[bot1] | Deepnest_42", - "oneWayType": "TwoWay", - "Name": "Deepnest_42[bot1]" - }, - { - "sceneName": "Deepnest_42", - "gateName": "left1", - "logic": "Deepnest_42[left1] | Deepnest_42", - "oneWayType": "TwoWay", - "Name": "Deepnest_42[left1]" - }, - { - "sceneName": "Deepnest_42", - "gateName": "top1", - "logic": "Deepnest_42[top1] | Deepnest_42 + (WINGS | ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_42[top1]" - }, - { - "sceneName": "Deepnest_43", - "gateName": "bot1", - "logic": "Deepnest_43[bot1] | (Deepnest_43[left1] | Deepnest_43[right1]) + (ANYCLAW | WINGS | ENEMYPOGOS + DANGEROUSSKIPS + LEFTDASH)", - "oneWayType": "TwoWay", - "Name": "Deepnest_43[bot1]" - }, - { - "sceneName": "Deepnest_43", - "gateName": "left1", - "logic": "Deepnest_43[left1] | Deepnest_43[right1] | Deepnest_43[bot1] + (FULLCLAW | WINGS + ANYCLAW | ENEMYPOGOS + $SHRIEKPOGO[2,before:ITEMSOUL,after:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "Deepnest_43[left1]" - }, - { - "sceneName": "Deepnest_43", - "gateName": "right1", - "logic": "Deepnest_43[left1] | Deepnest_43[right1] | Deepnest_43[bot1] + (FULLCLAW | WINGS + ANYCLAW | ENEMYPOGOS + $SHRIEKPOGO[2,before:ITEMSOUL,after:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "Deepnest_43[right1]" - }, - { - "sceneName": "Deepnest_44", - "gateName": "top1", - "logic": "Deepnest_44[top1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_44[top1]" - }, - { - "sceneName": "Deepnest_45_v02", - "gateName": "left1", - "logic": "Deepnest_45_v02[left1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_45_v02[left1]" - }, - { - "sceneName": "Room_Mask_Maker", - "gateName": "right1", - "logic": "Room_Mask_Maker[right1]", - "oneWayType": "TwoWay", - "Name": "Room_Mask_Maker[right1]" - }, - { - "sceneName": "Deepnest_East_01", - "gateName": "bot1", - "logic": "Deepnest_East_01[bot1] | Deepnest_East_01[right1] | Deepnest_East_01[top1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_01[bot1]" - }, - { - "sceneName": "Deepnest_East_01", - "gateName": "right1", - "logic": "Deepnest_East_01[right1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_01[right1]" - }, - { - "sceneName": "Deepnest_East_01", - "gateName": "top1", - "logic": "Deepnest_East_01[top1] | Deepnest_East_01[bot1] + (LEFTCLAW | WINGS | ENEMYPOGOS | RIGHTCLAW + OBSCURESKIPS) | Deepnest_East_01[right1] + (RIGHTDASH | LEFTCLAW | WINGS | ENEMYPOGOS | RIGHTCLAW + OBSCURESKIPS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_01[top1]" - }, - { - "sceneName": "Deepnest_East_02", - "gateName": "bot1", - "logic": "Deepnest_East_02[bot1] | Deepnest_East_02", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_02[bot1]" - }, - { - "sceneName": "Deepnest_East_02", - "gateName": "bot2", - "logic": "Deepnest_East_02[bot2] | Deepnest_East_02 + Broke_Lower_Edge_Quake_Floor + (ACID | LEFTSKIPACID | LEFTDASH + WINGS + ACIDSKIPS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_02[bot2]" - }, - { - "sceneName": "Deepnest_East_02", - "gateName": "top1", - "logic": "Deepnest_East_02[top1] + (ANYCLAW | WINGS | ENEMYPOGOS + COMPLEXSKIPS + ANYDASH) | Deepnest_East_02 + (ANYCLAW | WINGS | ENEMYPOGOS + COMPLEXSKIPS + ANYDASH)", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_02[top1]" - }, - { - "sceneName": "Deepnest_East_02", - "gateName": "right1", - "logic": "Deepnest_East_02[right1] | Deepnest_East_02", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_02[right1]" - }, - { - "sceneName": "Deepnest_East_03", - "gateName": "left1", - "logic": "Deepnest_East_03[left1] | Deepnest_East_03", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_03[left1]" - }, - { - "sceneName": "Deepnest_East_03", - "gateName": "left2", - "logic": "Deepnest_East_03[left2] | Deepnest_East_03 + Opened_Lower_Kingdom's_Edge_Wall", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_03[left2]" - }, - { - "sceneName": "Deepnest_East_03", - "gateName": "top1", - "logic": "Deepnest_East_03[top1] + (LEFTCLAW | WINGS) | Deepnest_East_03 + (UPWALLBREAK | RIGHTSUPERDASH + OBSCURESKIPS) + (LEFTCLAW | RIGHTCLAW + WINGS + $SHADESKIP[2HITS] | RIGHTCLAW + $SHRIEKPOGO[3,before:AREASOUL,NORIGHTSTALL] | $SHRIEKPOGO[3,before:AREASOUL,NORIGHTSTALL] + $SHRIEKPOGO[5])", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_03[top1]" - }, - { - "sceneName": "Deepnest_East_03", - "gateName": "top2", - "logic": "NONE", - "oneWayType": "OneWayOut", - "Name": "Deepnest_East_03[top2]" - }, - { - "sceneName": "Deepnest_East_03", - "gateName": "right1", - "logic": "Deepnest_East_03[right1] | Deepnest_East_03 + (LEFTCLAW + RIGHTSUPERDASH | RIGHTCLAW | WINGS | RIGHTDASH) | Deepnest_East_03[top2]", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_03[right1]" - }, - { - "sceneName": "Deepnest_East_03", - "gateName": "right2", - "logic": "Deepnest_East_03[right2] | Deepnest_East_03", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_03[right2]" - }, - { - "sceneName": "Deepnest_East_04", - "gateName": "left1", - "logic": "Deepnest_East_04[left1] | Deepnest_East_04 + (ACID | ACIDSKIPS + LEFTDASH + WINGS + (SPELLAIRSTALL + $CASTSPELL[3,before:ROOMSOUL,after:AREASOUL] | $SHRIEKPOGO[before:ROOMSOUL,after:AREASOUL]))", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_04[left1]" - }, - { - "sceneName": "Deepnest_East_04", - "gateName": "left2", - "logic": "Deepnest_East_04[left2] | Deepnest_East_04 + (LEFTCLAW | WINGS | ENEMYPOGOS) | Deepnest_East_04[right2]", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_04[left2]" - }, - { - "sceneName": "Deepnest_East_04", - "gateName": "right2", - "logic": "Deepnest_East_04[right2] | (Deepnest_East_04 + (LEFTCLAW | WINGS | ENEMYPOGOS) | Deepnest_East_04[left2]) + (WINGS | ANYCLAW + ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_04[right2]" - }, - { - "sceneName": "Deepnest_East_04", - "gateName": "right1", - "logic": "Deepnest_East_04[right1] | Deepnest_East_04", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_04[right1]" - }, - { - "sceneName": "Deepnest_East_06", - "gateName": "top1", - "logic": "Deepnest_East_06[top1] + (LEFTCLAW | WINGS + PRECISEMOVEMENT) | Deepnest_East_06[left1] + (FULLCLAW | WINGS + ENEMYPOGOS) | (Deepnest_East_06[bot1] | Deepnest_East_06[door1] | Deepnest_East_06[right1]) + (LEFTCLAW | WINGS + ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_06[top1]" - }, - { - "sceneName": "Deepnest_East_06", - "gateName": "left1", - "logic": "Deepnest_East_06[left1] | Deepnest_East_06[top1] | (Deepnest_East_06[bot1] | Deepnest_East_06[door1] | Deepnest_East_06[right1]) + (LEFTCLAW | WINGS + ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_06[left1]" - }, - { - "sceneName": "Deepnest_East_06", - "gateName": "bot1", - "logic": "Deepnest_East_06[bot1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_06[bot1]" - }, - { - "sceneName": "Deepnest_East_06", - "gateName": "door1", - "logic": "Deepnest_East_06[door1] | Deepnest_East_06[right1] | Deepnest_East_06[left1] + (RIGHTCLAW | WINGS + BACKGROUNDPOGOS) | (Deepnest_East_06[top1] | Deepnest_East_06[bot1]) + (RIGHTCLAW | WINGS | ENEMYPOGOS + DANGEROUSSKIPS) | Bench-Oro", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_06[door1]" - }, - { - "sceneName": "Deepnest_East_06", - "gateName": "right1", - "logic": "Deepnest_East_06[right1] | Deepnest_East_06[door1] | Deepnest_East_06[left1] + (RIGHTCLAW | WINGS + BACKGROUNDPOGOS) | (Deepnest_East_06[top1] | Deepnest_East_06[bot1]) + (RIGHTCLAW | WINGS | ENEMYPOGOS + DANGEROUSSKIPS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_06[right1]" - }, - { - "sceneName": "Deepnest_East_07", - "gateName": "bot1", - "logic": "Deepnest_East_07[bot1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_07[bot1]" - }, - { - "sceneName": "Deepnest_East_07", - "gateName": "bot2", - "logic": "Deepnest_East_07[bot2] | Deepnest_East_07", - "oneWayType": "OneWayIn", - "Name": "Deepnest_East_07[bot2]" - }, - { - "sceneName": "Deepnest_East_07", - "gateName": "left1", - "logic": "Deepnest_East_07[left1] | Deepnest_East_07 + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_07[left1]" - }, - { - "sceneName": "Deepnest_East_07", - "gateName": "left2", - "logic": "Deepnest_East_07[left2] | Deepnest_East_07", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_07[left2]" - }, - { - "sceneName": "Deepnest_East_07", - "gateName": "right1", - "logic": "Deepnest_East_07[right1] | Deepnest_East_07", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_07[right1]" - }, - { - "sceneName": "Deepnest_East_08", - "gateName": "right1", - "logic": "Deepnest_East_08[right1] | Deepnest_East_08[top1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_08[right1]" - }, - { - "sceneName": "Deepnest_East_08", - "gateName": "top1", - "logic": "Deepnest_East_08[top1] + (ANYCLAW | WINGS) | Deepnest_East_08[right1] + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_08[top1]" - }, - { - "sceneName": "Deepnest_East_09", - "gateName": "right1", - "logic": "Deepnest_East_09[right1] | Deepnest_East_09[bot1] + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_09[right1]" - }, - { - "sceneName": "Deepnest_East_09", - "gateName": "left1", - "logic": "Deepnest_East_09[left1] | Deepnest_East_09[right1] | (Deepnest_East_09[bot1] + (ANYCLAW | WINGS))", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_09[left1]" - }, - { - "sceneName": "Deepnest_East_09", - "gateName": "bot1", - "logic": "Deepnest_East_09[bot1] | Deepnest_East_09[right1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_09[bot1]" - }, - { - "sceneName": "Deepnest_East_10", - "gateName": "left1", - "logic": "Deepnest_East_10[left1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_10[left1]" - }, - { - "sceneName": "Deepnest_East_11", - "gateName": "right1", - "logic": "Deepnest_East_11[right1] | Deepnest_East_11[top1] + Broke_Camp_Bench_Wall | (Deepnest_East_11[left1] | Deepnest_East_11[bot1]) + (WINGS | FULLCLAW + $SHADESKIP | ENEMYPOGOS + DANGEROUSSKIPS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_11[right1]" - }, - { - "sceneName": "Deepnest_East_11", - "gateName": "left1", - "logic": "Deepnest_East_11[left1] | Deepnest_East_11[top1] + Broke_Camp_Bench_Wall | Deepnest_East_11[right1] | Deepnest_East_11[bot1] + (RIGHTCLAW | LEFTCLAW + ENEMYPOGOS | WINGS | FULLDASH + ENEMYPOGOS | ENEMYPOGOS + DANGEROUSSKIPS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_11[left1]" - }, - { - "sceneName": "Deepnest_East_11", - "gateName": "top1", - "logic": "Deepnest_East_11[top1] + (LEFTCLAW | WINGS) + Broke_Camp_Bench_Wall | Deepnest_East_11[right1] + (LEFTCLAW | WINGS + BACKGROUNDPOGOS) + Broke_Camp_Bench_Wall | (Deepnest_East_11[left1] | Deepnest_East_11[bot1]) + (WINGS | FULLCLAW + $SHADESKIP | ENEMYPOGOS + DANGEROUSSKIPS) + (LEFTCLAW | WINGS + BACKGROUNDPOGOS) + Broke_Camp_Bench_Wall", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_11[top1]" - }, - { - "sceneName": "Deepnest_East_11", - "gateName": "bot1", - "logic": "Deepnest_East_11[bot1] | Deepnest_East_11[left1] | Deepnest_East_11[top1] + Broke_Camp_Bench_Wall | Deepnest_East_11[right1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_11[bot1]" - }, - { - "sceneName": "Deepnest_East_12", - "gateName": "right1", - "logic": "Deepnest_East_12[right1] | Deepnest_East_12[left1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_12[right1]" - }, - { - "sceneName": "Deepnest_East_12", - "gateName": "left1", - "logic": "Deepnest_East_12[left1] | Deepnest_East_12[right1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_12[left1]" - }, - { - "sceneName": "Deepnest_East_13", - "gateName": "bot1", - "logic": "Deepnest_East_13[bot1] | Bench-Camp", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_13[bot1]" - }, - { - "sceneName": "Deepnest_East_14", - "gateName": "top2", - "logic": "Deepnest_East_14[top2] + (ANYCLAW | WINGS + PRECISEMOVEMENT)", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_14[top2]" - }, - { - "sceneName": "Deepnest_East_14", - "gateName": "left1", - "logic": "Deepnest_East_14[left1] | Deepnest_East_14[top2] + Broke_Oro_Quake_Floor_2 + Broke_Oro_Quake_Floor_3 + (RIGHTCLAW | WINGS | LEFTCLAW + ENEMYPOGOS | FULLDASH + DAMAGEBOOSTS + ENEMYPOGOS + COMPLEXSKIPS + $TAKEDAMAGE + $TAKEDAMAGE) + (LEFTDASH | SPIKETUNNELS) | Deepnest_East_14[door1] + (LEFTDASH | SPIKETUNNELS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_14[left1]" - }, - { - "sceneName": "Deepnest_East_14", - "gateName": "door1", - "logic": "Deepnest_East_14[door1] | Deepnest_East_14[top2] + Broke_Oro_Quake_Floor_2 + Broke_Oro_Quake_Floor_3 + (RIGHTCLAW | WINGS | LEFTCLAW + ENEMYPOGOS | FULLDASH + DAMAGEBOOSTS + ENEMYPOGOS + COMPLEXSKIPS + $TAKEDAMAGE + $TAKEDAMAGE) + (RIGHTDASH | PRECISEMOVEMENT) | Deepnest_East_14[left1] + (RIGHTDASH | SPIKETUNNELS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_14[door1]" - }, - { - "sceneName": "Deepnest_East_14b", - "gateName": "right1", - "logic": "Deepnest_East_14b[right1] | Deepnest_East_14b[top1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_14b[right1]" - }, - { - "sceneName": "Deepnest_East_14b", - "gateName": "top1", - "logic": "Deepnest_East_14b[top1] + (ANYCLAW | WINGS | ENEMYPOGOS) | Deepnest_East_14b[right1] + (ENEMYPOGOS + DANGEROUSSKIPS | FULLCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_14b[top1]" - }, - { - "sceneName": "Deepnest_East_15", - "gateName": "left1", - "logic": "Deepnest_East_15[left1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_15[left1]" - }, - { - "sceneName": "Deepnest_East_16", - "gateName": "left1", - "logic": "Deepnest_East_16[left1] | Deepnest_East_16[bot1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_16[left1]" - }, - { - "sceneName": "Deepnest_East_16", - "gateName": "bot1", - "logic": "Deepnest_East_16[bot1] | Deepnest_East_16[left1] + Broke_Oro_Quake_Floor_1", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_16[bot1]" - }, - { - "sceneName": "Deepnest_East_17", - "gateName": "left1", - "logic": "Deepnest_East_17[left1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_17[left1]" - }, - { - "sceneName": "Deepnest_East_18", - "gateName": "top1", - "logic": "Deepnest_East_18[top1] | Deepnest_East_18 + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_18[top1]" - }, - { - "sceneName": "Deepnest_East_18", - "gateName": "bot1", - "logic": "Deepnest_East_18[bot1] | Deepnest_East_18", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_18[bot1]" - }, - { - "sceneName": "Deepnest_East_18", - "gateName": "right2", - "logic": "Deepnest_East_18[right2] | Deepnest_East_18 + (RIGHTCLAW | WINGS | BACKGROUNDPOGOS | ENEMYPOGOS | $SHADESKIP) + RIGHTSHADOWDASH", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_18[right2]" - }, - { - "sceneName": "Room_nailmaster_03", - "gateName": "left1", - "logic": "Room_nailmaster_03[left1]", - "oneWayType": "TwoWay", - "Name": "Room_nailmaster_03[left1]" - }, - { - "sceneName": "Deepnest_East_Hornet", - "gateName": "left1", - "logic": "Deepnest_East_Hornet[left1]", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_Hornet[left1]" - }, - { - "sceneName": "Deepnest_East_Hornet", - "gateName": "left2", - "logic": "Deepnest_East_Hornet[left2] | Deepnest_East_Hornet[left1] + Defeated_Hornet_2", - "oneWayType": "TwoWay", - "Name": "Deepnest_East_Hornet[left2]" - }, - { - "sceneName": "Room_Wyrm", - "gateName": "right1", - "logic": "Room_Wyrm[right1]", - "oneWayType": "TwoWay", - "Name": "Room_Wyrm[right1]" - }, - { - "sceneName": "GG_Lurker", - "gateName": "left1", - "logic": "GG_Lurker[left1]", - "oneWayType": "TwoWay", - "Name": "GG_Lurker[left1]" - }, - { - "sceneName": "Hive_01", - "gateName": "left1", - "logic": "Hive_01[left1] | Hive_01[right1]", - "oneWayType": "TwoWay", - "Name": "Hive_01[left1]" - }, - { - "sceneName": "Hive_01", - "gateName": "right1", - "logic": "Hive_01[right1] | Hive_01[left1] + (ANYCLAW + WINGS | ENEMYPOGOS + (RIGHTCLAW | WINGS | LEFTCLAW + (RIGHTDASH | RIGHTSUPERDASH)))", - "oneWayType": "TwoWay", - "Name": "Hive_01[right1]" - }, - { - "sceneName": "Hive_01", - "gateName": "right2", - "logic": "Hive_01[right2] | Bench-Hive", - "oneWayType": "TwoWay", - "Name": "Hive_01[right2]" - }, - { - "sceneName": "Hive_02", - "gateName": "left1", - "logic": "Hive_02[left1] | (Hive_02[left2] | Hive_02[left3]) + (RIGHTCLAW | WINGS | FULLDASH + LEFTCLAW)", - "oneWayType": "TwoWay", - "Name": "Hive_02[left1]" - }, - { - "sceneName": "Hive_02", - "gateName": "left2", - "logic": "Hive_02[left2] | (Hive_02[left1] | Hive_02[left3]) + (LEFTCLAW | RIGHTCLAW + (LEFTDASH | LEFTSUPERDASH | ENEMYPOGOS) | WINGS)", - "oneWayType": "TwoWay", - "Name": "Hive_02[left2]" - }, - { - "sceneName": "Hive_02", - "gateName": "left3", - "logic": "Hive_02[left3] | Hive_02[left2] | Hive_02[left1]", - "oneWayType": "TwoWay", - "Name": "Hive_02[left3]" - }, - { - "sceneName": "Hive_03_c", - "gateName": "left1", - "logic": "Hive_03_c[left1] | Hive_03_c + (RIGHTCLAW | WINGS | LEFTCLAW + (RIGHTDASH | RIGHTSUPERDASH | ENEMYPOGOS) | ENEMYPOGOS + COMPLEXSKIPS)", - // enemypogos: using hiveling - // complex enemypogos: luring hive solider and pogoing multiple times - "oneWayType": "TwoWay", - "Name": "Hive_03_c[left1]" - }, - { - "sceneName": "Hive_03_c", - "gateName": "right2", - "logic": "Hive_03_c[right2]", - "oneWayType": "TwoWay", - "Name": "Hive_03_c[right2]" - }, - { - "sceneName": "Hive_03_c", - "gateName": "right3", - "logic": "Hive_03_c[right3] | Hive_03_c", - "oneWayType": "TwoWay", - "Name": "Hive_03_c[right3]" - }, - { - "sceneName": "Hive_03_c", - "gateName": "top1", - "logic": "Hive_03_c[top1] | Hive_03_c + (FULLCLAW | WINGS | FULLDASH + ANYCLAW) | Hive_03_c[right2] + FULLDASH", - "oneWayType": "TwoWay", - "Name": "Hive_03_c[top1]" - }, - { - "sceneName": "Hive_03", - "gateName": "bot1", - "logic": "Hive_03[bot1] | Hive_03[right1]", - "oneWayType": "TwoWay", - "Name": "Hive_03[bot1]" - }, - { - "sceneName": "Hive_03", - "gateName": "right1", - "logic": "Hive_03[right1] | Hive_03[bot1] + (FULLCLAW | WINGS | LEFTCLAW + FULLDASH | RIGHTCLAW + FULLDASH + ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Hive_03[right1]" - }, - { - "sceneName": "Hive_03", - "gateName": "top1", - "logic": "Hive_03[top1]", - "oneWayType": "TwoWay", - "Name": "Hive_03[top1]" - }, - { - "sceneName": "Hive_04", - "gateName": "left1", - "logic": "Hive_04[left1] | Hive_04[right1] + ((FULLCLAW + LEFTDASH) | WINGS)", - "oneWayType": "TwoWay", - "Name": "Hive_04[left1]" - }, - { - "sceneName": "Hive_04", - "gateName": "left2", - "logic": "Hive_04[left2] | Hive_04[left1] | Hive_04[right1]", - "oneWayType": "TwoWay", - "Name": "Hive_04[left2]" - }, - { - "sceneName": "Hive_04", - "gateName": "right1", - "logic": "Hive_04[right1] | Hive_04[left1] + ((FULLCLAW + (RIGHTDASH | ENEMYPOGOS)) | WINGS)", - "oneWayType": "TwoWay", - "Name": "Hive_04[right1]" - }, - { - "sceneName": "Hive_05", - "gateName": "left1", - "logic": "Hive_05[left1]", - "oneWayType": "TwoWay", - "Name": "Hive_05[left1]" - }, - { - "sceneName": "Room_Colosseum_01", - "gateName": "left1", - "logic": "Room_Colosseum_01[left1] | Room_Colosseum_01[bot1]", - "oneWayType": "TwoWay", - "Name": "Room_Colosseum_01[left1]" - }, - { - "sceneName": "Room_Colosseum_01", - "gateName": "bot1", - "logic": "Room_Colosseum_01[bot1] | Room_Colosseum_01[left1]", - "oneWayType": "TwoWay", - "Name": "Room_Colosseum_01[bot1]" - }, - { - "sceneName": "Room_Colosseum_02", - "gateName": "top1", - "logic": "Room_Colosseum_02[top1] + (ANYCLAW | WINGS + PRECISEMOVEMENT) | (Room_Colosseum_02[top2] | Bench-Colosseum | Colosseum_Hot_Spring) + (ANYCLAW | $SHRIEKPOGO[2])", - "oneWayType": "TwoWay", - "Name": "Room_Colosseum_02[top1]" - }, - { - "sceneName": "Room_Colosseum_02", - "gateName": "top2", - "logic": "Room_Colosseum_02[top2] + (ANYCLAW | WINGS + PRECISEMOVEMENT) | (Room_Colosseum_02[top1] | Bench-Colosseum | Colosseum_Hot_Spring) + (ANYCLAW | $SHRIEKPOGO[2])", - "oneWayType": "TwoWay", - "Name": "Room_Colosseum_02[top2]" - }, - { - "sceneName": "Room_Colosseum_Spectate", - "gateName": "bot1", - "logic": "Room_Colosseum_Spectate[bot1] | Room_Colosseum_Spectate[right1]", - "oneWayType": "TwoWay", - "Name": "Room_Colosseum_Spectate[bot1]" - }, - { - "sceneName": "Room_Colosseum_Spectate", - "gateName": "right1", - "logic": "Room_Colosseum_Spectate[right1] | Room_Colosseum_Spectate[bot1]", - "oneWayType": "TwoWay", - "Name": "Room_Colosseum_Spectate[right1]" - }, - { - "sceneName": "Abyss_01", - "gateName": "left1", - "logic": "Abyss_01[left1] | Abyss_01[right1] + Opened_Dung_Defender_Wall | Abyss_01 + Opened_Dung_Defender_Wall + (RIGHTCLAW + (LEFTDASH | LEFTSUPERDASH | ENEMYPOGOS) | LEFTCLAW + LEFTDASH | WINGS)", - "oneWayType": "TwoWay", - "Name": "Abyss_01[left1]" - }, - { - "sceneName": "Abyss_01", - "gateName": "left2", - "logic": "Abyss_01[left2] | Abyss_01 + SPIKETUNNELS + (LEFTDASH + (DASHMASTER | SPELLAIRSTALL + $CASTSPELL) | RIGHTCLAW + LEFTDASH) | Abyss_01[right2] + LEFTSUPERDASH", - "oneWayType": "TwoWay", - "Name": "Abyss_01[left2]" - }, - { - "sceneName": "Abyss_01", - "gateName": "left3", - "logic": "Abyss_01[left3] | Abyss_01", - "oneWayType": "TwoWay", - "Name": "Abyss_01[left3]" - }, - { - "sceneName": "Abyss_01", - "gateName": "right1", - "logic": "Abyss_01[right1] | Abyss_01 + (FULLCLAW + (RIGHTDASH | RIGHTSUPERDASH | ENEMYPOGOS) | RIGHTCLAW + WINGS | LEFTCLAW + (WINGS | FULLDASH) | WINGS + ENEMYPOGOS) | Abyss_01[left1] + LEFTCLAW + (RIGHTSUPERDASH | ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Abyss_01[right1]" - }, - { - "sceneName": "Abyss_01", - "gateName": "right2", - "logic": "Abyss_01[right2] | Abyss_01 + SPIKETUNNELS + (RIGHTDASH + (DASHMASTER | SPELLAIRSTALL + $CASTSPELL[2]) | RIGHTCLAW + LEFTDASH + RIGHTSUPERDASH) | Abyss_01[left2] + RIGHTSUPERDASH", - "oneWayType": "TwoWay", - "Name": "Abyss_01[right2]" - }, - { - "sceneName": "Abyss_02", - "gateName": "right1", - "logic": "Abyss_02[right1] | Abyss_02[bot1] + (LEFTCLAW | WINGS) + (RIGHTCLAW | WINGS | RIGHTDASH | RIGHTSUPERDASH | ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Abyss_02[right1]" - }, - { - "sceneName": "Abyss_02", - "gateName": "bot1", - "logic": "Abyss_02[bot1] | Abyss_02[right1]", - "oneWayType": "TwoWay", - "Name": "Abyss_02[bot1]" - }, - { - "sceneName": "Abyss_03", - "gateName": "bot1", - "logic": "Abyss_03[bot1] | Abyss_03 | Lower_Tram", - "oneWayType": "TwoWay", - "Name": "Abyss_03[bot1]" - }, - { - "sceneName": "Abyss_03", - "gateName": "bot2", - "logic": "Abyss_03[bot2] | Abyss_03 | Lower_Tram", - "oneWayType": "TwoWay", - "Name": "Abyss_03[bot2]" - }, - { - "sceneName": "Abyss_03", - "gateName": "top1", - "logic": "Abyss_03[top1] | Abyss_03 | Lower_Tram", - "oneWayType": "TwoWay", - "Name": "Abyss_03[top1]" - }, - { - "sceneName": "Abyss_03_b", - "gateName": "left1", - "logic": "Abyss_03_b[left1] | Abyss_03_b | Lower_Tram", - "oneWayType": "TwoWay", - "Name": "Abyss_03_b[left1]" - }, - { - "sceneName": "Abyss_03_c", - "gateName": "right1", - "logic": "Abyss_03_c[right1] | Abyss_03_c | Lower_Tram", - "oneWayType": "TwoWay", - "Name": "Abyss_03_c[right1]" - }, - { - "sceneName": "Abyss_03_c", - "gateName": "top1", - "logic": "Abyss_03_c[top1] | (Abyss_03_c | Lower_Tram) + (RIGHTCLAW | WINGS | ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Abyss_03_c[top1]" - }, - { - "sceneName": "Abyss_04", - "gateName": "top1", - "logic": "Abyss_04[top1] | Abyss_04 + (ANYCLAW | (WINGS + ENEMYPOGOS))", - "oneWayType": "TwoWay", - "Name": "Abyss_04[top1]" - }, - { - "sceneName": "Abyss_04", - "gateName": "left1", - "logic": "Abyss_04[left1] | Abyss_04", - "oneWayType": "TwoWay", - "Name": "Abyss_04[left1]" - }, - { - "sceneName": "Abyss_04", - "gateName": "bot1", - "logic": "Abyss_04[bot1] | Abyss_04", - "oneWayType": "TwoWay", - "Name": "Abyss_04[bot1]" - }, - { - "sceneName": "Abyss_04", - "gateName": "right1", - "logic": "Abyss_04[right1] | Abyss_04 + (ANYCLAW + WINGS | (ANYCLAW | WINGS) + $SLOPEBALL)", - "oneWayType": "TwoWay", - "Name": "Abyss_04[right1]" - }, - { - "sceneName": "Abyss_05", - "gateName": "left1", - "logic": "Abyss_05[left1] | Abyss_05", - "oneWayType": "TwoWay", - "Name": "Abyss_05[left1]" - }, - { - "sceneName": "Abyss_05", - "gateName": "right1", - "logic": "Abyss_05[right1] | Abyss_05", - "oneWayType": "TwoWay", - "Name": "Abyss_05[right1]" - }, - { - "sceneName": "Abyss_06_Core", - "gateName": "top1", - "logic": "Abyss_06_Core[top1] + (RIGHTCLAW | WINGS + (LEFTCLAW | PRECISEMOVEMENT))", - "oneWayType": "TwoWay", - "Name": "Abyss_06_Core[top1]" - }, - { - "sceneName": "Abyss_06_Core", - "gateName": "left1", - "logic": "Abyss_06_Core[left1] | Warp-Lifeblood_Core_to_Abyss | (Abyss_06_Core[top1] + BRAND | Abyss_06_Core + (LEFTCLAW + (PRECISEMOVEMENT | RIGHTCLAW) + FULLDASH | WINGS)) + $LIFEBLOOD", - "oneWayType": "TwoWay", - "Name": "Abyss_06_Core[left1]" - }, - { - "sceneName": "Abyss_06_Core", - "gateName": "left3", - "logic": "Abyss_06_Core[left3] | Abyss_06_Core", - "oneWayType": "TwoWay", - "Name": "Abyss_06_Core[left3]" - }, - { - "sceneName": "Abyss_06_Core", - "gateName": "right2", - "logic": "Abyss_06_Core[right2] | Abyss_06_Core", - "oneWayType": "TwoWay", - "Name": "Abyss_06_Core[right2]" - }, - { - "sceneName": "Abyss_06_Core", - "gateName": "bot1", - "logic": "Abyss_06_Core[bot1] | Abyss_06_Core + KINGSOUL", - "oneWayType": "TwoWay", - "Name": "Abyss_06_Core[bot1]" - }, - { - "sceneName": "Abyss_08", - "gateName": "right1", - "logic": "Abyss_08[right1]", - "oneWayType": "TwoWay", - "Name": "Abyss_08[right1]" - }, - { - "sceneName": "Abyss_09", - "gateName": "right1", - "logic": "Abyss_09[right1] | Abyss_09 + (Lit_Abyss_Lighthouse | VOIDHEART) + (SWIM | RIGHTSUPERDASH | RIGHTSHARPSHADOW + $SHRIEKPOGO[1,1,1,1,1,1,1])", - "oneWayType": "TwoWay", - "Name": "Abyss_09[right1]" - }, - { - "sceneName": "Abyss_09", - "gateName": "right2", - "logic": "Abyss_09[right2] | Abyss_09 + (FULLCLAW + LEFTDASH | WINGS | (LEFTCLAW + RIGHTDASH | RIGHTCLAW + LEFTDASH) + PRECISEMOVEMENT)", - "oneWayType": "TwoWay", - "Name": "Abyss_09[right2]" - }, - { - "sceneName": "Abyss_09", - "gateName": "right3", - "logic": "Abyss_09[right3]", - "oneWayType": "TwoWay", - "Name": "Abyss_09[right3]" - }, - { - "sceneName": "Abyss_09", - "gateName": "left1", - "logic": "Abyss_09[left1] | Abyss_09", - "oneWayType": "TwoWay", - "Name": "Abyss_09[left1]" - }, - { - "sceneName": "Abyss_10", - "gateName": "left1", - "logic": "Abyss_10[left1] | Abyss_10[left2] + RIGHTSHADOWDASH", - "oneWayType": "TwoWay", - "Name": "Abyss_10[left1]" - }, - { - "sceneName": "Abyss_10", - "gateName": "left2", - "logic": "Abyss_10[left2] | Abyss_10[left1] + LEFTSHADOWDASH + (RIGHTCLAW | (WINGS | LEFTCLAW) + (RIGHTSHADOWDASH | VOIDHEART) | WINGS + $SHADESKIP[2HITS] | $SHRIEKPOGO[2])", - "oneWayType": "TwoWay", - "Name": "Abyss_10[left2]" - }, - { - "sceneName": "Abyss_12", - "gateName": "right1", - "logic": "Abyss_12[right1]", - "oneWayType": "TwoWay", - "Name": "Abyss_12[right1]" - }, - { - "sceneName": "Abyss_15", - "gateName": "top1", - "logic": "Abyss_15[top1] + (ANYCLAW | WINGS + PRECISEMOVEMENT)", - "oneWayType": "TwoWay", - "Name": "Abyss_15[top1]" - }, - { - "sceneName": "Abyss_16", - "gateName": "left1", - "logic": "Abyss_16[left1] | Abyss_16[right1] + (ANYCLAW | WINGS | LEFTDASH | LEFTSUPERDASH)", - "oneWayType": "TwoWay", - "Name": "Abyss_16[left1]" - }, - { - "sceneName": "Abyss_16", - "gateName": "right1", - "logic": "Abyss_16[right1] | Abyss_16[left1] + (RIGHTCLAW | WINGS | RIGHTDASH)", - "oneWayType": "TwoWay", - "Name": "Abyss_16[right1]" - }, - { - "sceneName": "Abyss_17", - "gateName": "top1", - "logic": "Abyss_17[top1] + (RIGHTCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Abyss_17[top1]" - }, - { - "sceneName": "Abyss_18", - "gateName": "left1", - "logic": "Abyss_18[left1] | Abyss_18[right1] + (WINGS | LEFTSUPERDASH | $SLOPEBALL[before:AREASOUL,after:AREASOUL] + LEFTDASH + LEFTCLAW)", - "oneWayType": "TwoWay", - "Name": "Abyss_18[left1]" - }, - { - "sceneName": "Abyss_18", - "gateName": "right1", - "logic": "Abyss_18[right1] | Abyss_18[left1] + (RIGHTCLAW | WINGS | RIGHTSUPERDASH) | Bench-Basin_Toll", - "oneWayType": "TwoWay", - "Name": "Abyss_18[right1]" - }, - { - "sceneName": "Abyss_19", - "gateName": "left1", - "logic": "Abyss_19[left1] | Abyss_19[bot1] + (ANYCLAW | WINGS) + Defeated_Broken_Vessel", - "oneWayType": "TwoWay", - "Name": "Abyss_19[left1]" - }, - { - "sceneName": "Abyss_19", - "gateName": "right1", - "logic": "Abyss_19[right1] | (Abyss_19[bot1] + (ANYCLAW | WINGS)) | (Abyss_19[bot2] + WINGS)", - "oneWayType": "TwoWay", - "Name": "Abyss_19[right1]" - }, - { - "sceneName": "Abyss_19", - "gateName": "bot1", - "logic": "Abyss_19[bot1]", - "oneWayType": "TwoWay", - "Name": "Abyss_19[bot1]" - }, - { - "sceneName": "Abyss_19", - "gateName": "bot2", - "logic": "Abyss_19[bot2] | (Abyss_19[bot1] + (ANYCLAW | WINGS)) | Abyss_19[right1]", - "oneWayType": "TwoWay", - "Name": "Abyss_19[bot2]" - }, - { - "sceneName": "Abyss_20", - "gateName": "top1", - "logic": "Abyss_20[top1] | Abyss_20[top2] + (LEFTCLAW | ENEMYPOGOS + WINGS | RIGHTCLAW + $SHRIEKPOGO[2,before:AREASOUL,after:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "Abyss_20[top1]" - }, - { - "sceneName": "Abyss_20", - "gateName": "top2", - "logic": "Abyss_20[top2] | Abyss_20[top1] + (RIGHTCLAW | $SHRIEKPOGO[1,1,before:AREASOUL,after:AREASOUL] | COMPLEXSKIPS + WINGS + ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Abyss_20[top2]" - }, - { - "sceneName": "Abyss_21", - "gateName": "right1", - "logic": "Abyss_21[right1]", - "oneWayType": "TwoWay", - "Name": "Abyss_21[right1]" - }, - { - "sceneName": "Abyss_22", - "gateName": "left1", - "logic": "Abyss_22[left1] | Can_Stag + Hidden_Station_Stag | Bench-Hidden_Station", - "oneWayType": "TwoWay", - "Name": "Abyss_22[left1]" - }, - { - "sceneName": "Abyss_Lighthouse_room", - "gateName": "left1", - "logic": "Abyss_Lighthouse_room[left1]", - "oneWayType": "TwoWay", - "Name": "Abyss_Lighthouse_room[left1]" - }, - { - "sceneName": "Waterways_01", - "gateName": "top1", - "logic": "Waterways_01[top1] + (ANYCLAW | WINGS + PRECISEMOVEMENT) | Waterways_01 + Opened_Waterways_Manhole + (LEFTCLAW | RIGHTCLAW + (LEFTDASH | LEFTSUPERDASH | ENEMYPOGOS) | WINGS + $SHADESKIP[2HITS] | WINGS + $SHRIEKPOGO[2,before:ROOMSOUL,after:ITEMSOUL])", - "oneWayType": "TwoWay", - "Name": "Waterways_01[top1]" - }, - { - "sceneName": "Waterways_01", - "gateName": "left1", - "logic": "Waterways_01[left1] | Waterways_01", - "oneWayType": "TwoWay", - "Name": "Waterways_01[left1]" - }, - { - "sceneName": "Waterways_01", - "gateName": "right1", - "logic": "Waterways_01[right1] | Waterways_01 + (RIGHTCLAW | WINGS | LEFTCLAW + RIGHTSUPERDASH | ENEMYPOGOS) | Waterways_01[top1] + RIGHTDASH", - "oneWayType": "TwoWay", - "Name": "Waterways_01[right1]" - }, - { - "sceneName": "Waterways_01", - "gateName": "bot1", - "logic": "Waterways_01[bot1] | Waterways_01", - "oneWayType": "TwoWay", - "Name": "Waterways_01[bot1]" - }, - { - "sceneName": "Waterways_02", - "gateName": "top1", - "logic": "Waterways_02[top1] + (ANYCLAW | WINGS + PRECISEMOVEMENT) | Waterways_02 + (ANYCLAW | ENEMYPOGOS + WINGS)", - "oneWayType": "TwoWay", - "Name": "Waterways_02[top1]" - }, - { - "sceneName": "Waterways_02", - "gateName": "top2", - "logic": "Waterways_02[top2] + (ANYCLAW | WINGS) | Waterways_02 + (RIGHTCLAW | LEFTCLAW + WINGS | (WINGS | LEFTCLAW) + ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Waterways_02[top2]" - }, - { - "sceneName": "Waterways_02", - "gateName": "top3", - "logic": "Waterways_02[top3] + (ANYCLAW | WINGS + PRECISEMOVEMENT)", - "oneWayType": "TwoWay", - "Name": "Waterways_02[top3]" - }, - { - "sceneName": "Waterways_02", - "gateName": "bot1", - "logic": "Waterways_02[bot1] | (Waterways_02[top1] | Waterways_02[top2] + (ANYCLAW | WINGS | SWIM) | (Waterways_02[top3] + Broke_Waterways_Bench_Quake_Floor_3 | Bench-Waterways) | Waterways_02[bot1] | Waterways_02[bot2] + (ANYCLAW | WINGS | SWIM)) + Broke_Flukemarm_Quake_Floor", - "oneWayType": "TwoWay", - "Name": "Waterways_02[bot1]" - }, - { - "sceneName": "Waterways_02", - "gateName": "bot2", - "logic": "Waterways_02[bot2] | Waterways_02[top1] | Waterways_02[top2] | (Waterways_02[top3] + Broke_Waterways_Bench_Quake_Floor_3 | Bench-Waterways) + (ANYCLAW | WINGS | RIGHTSUPERDASH | SWIM | ENEMYPOGOS + DANGEROUSSKIPS + RIGHTDASH) | Waterways_02[bot1] + (ANYCLAW | WINGS | ENEMYPOGOS + SWIM | ENEMYPOGOS + DANGEROUSSKIPS + RIGHTDASH) | Waterways_02[bot2]", - "oneWayType": "TwoWay", - "Name": "Waterways_02[bot2]" - }, - { - "sceneName": "Waterways_03", - "gateName": "left1", - "logic": "Waterways_03[left1]", - "oneWayType": "TwoWay", - "Name": "Waterways_03[left1]" - }, - { - "sceneName": "Waterways_04", - "gateName": "bot1", - "logic": "Waterways_04[bot1] | Waterways_04 + Broke_Waterways_Bench_Quake_Floor_1 + Broke_Waterways_Bench_Quake_Floor_2", - "oneWayType": "TwoWay", - "Name": "Waterways_04[bot1]" - }, - { - "sceneName": "Waterways_04", - "gateName": "right1", - "logic": "Waterways_04[right1] | Waterways_04 + (RIGHTCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Waterways_04[right1]" - }, - { - "sceneName": "Waterways_04", - "gateName": "left1", - "logic": "Waterways_04[left1] | Waterways_04 + (LEFTCLAW | RIGHTCLAW + (LEFTDASH | LEFTSUPERDASH | WINGS) | WINGS + ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Waterways_04[left1]" - }, - { - "sceneName": "Waterways_04", - "gateName": "left2", - "logic": "Waterways_04[left2] | Waterways_04 + (SWIM | LEFTSKIPACID | RIGHTCLAW + $SHRIEKPOGO[1,1] | $SHRIEKPOGO[1,1,1])", - "oneWayType": "TwoWay", - "Name": "Waterways_04[left2]" - }, - { - "sceneName": "Waterways_04b", - "gateName": "right1", - "logic": "Waterways_04b[right1] | Waterways_04b[left1] + WINGS | Waterways_04b[right2] + WINGS + (LEFTCLAW | ENEMYPOGOS) + (SWIM | (LEFTSUPERDASH + RIGHTCLAW))", - "oneWayType": "TwoWay", - "Name": "Waterways_04b[right1]" - }, - { - "sceneName": "Waterways_04b", - "gateName": "right2", - "logic": "Waterways_04b[right2] | Waterways_04b[left1] + ((LEFTCLAW + RIGHTSUPERDASH) | SWIM) | Waterways_04b[right1] + (WINGS | LEFTDASH | SWIM | (RIGHTCLAW + RIGHTDASH + LEFTSUPERDASH)) + ((LEFTCLAW + RIGHTSUPERDASH) | SWIM)", - "oneWayType": "TwoWay", - "Name": "Waterways_04b[right2]" - }, - { - "sceneName": "Waterways_04b", - "gateName": "left1", - "logic": "Waterways_04b[left1] | Waterways_04b[right1] + (WINGS | LEFTDASH | SWIM | (RIGHTCLAW + RIGHTDASH + LEFTSUPERDASH)) | Waterways_04b[right2] + (WINGS | (LEFTCLAW + ENEMYPOGOS)) + (LEFTCLAW | ENEMYPOGOS) + (SWIM | (LEFTSUPERDASH + RIGHTCLAW))", - "oneWayType": "TwoWay", - "Name": "Waterways_04b[left1]" - }, - { - "sceneName": "Waterways_05", - "gateName": "right1", - "logic": "Waterways_05[right1] | Waterways_05[bot1] + (ANYCLAW | WINGS) + Defeated_Dung_Defender | Waterways_05[bot2]", - "oneWayType": "TwoWay", - "Name": "Waterways_05[right1]" - }, - { - "sceneName": "Waterways_05", - "gateName": "bot1", - "logic": "Waterways_05[bot1]", - "oneWayType": "TwoWay", - "Name": "Waterways_05[bot1]" - }, - { - "sceneName": "Waterways_05", - "gateName": "bot2", - "logic": "Waterways_05[bot2] | (Waterways_05[right1] | Waterways_05[bot1] + (ANYCLAW | WINGS) + Defeated_Dung_Defender) + Broke_Dung_Defender_Quake_Floor", - "oneWayType": "TwoWay", - "Name": "Waterways_05[bot2]" - }, - { - "sceneName": "Waterways_06", - "gateName": "right1", - "logic": "Waterways_06[right1] | Waterways_06[top1] + (ACID + (WINGS | RIGHTCLAW | OBSCURESKIPS) | RIGHTSUPERDASH | RIGHTDASH + $SHRIEKPOGO[1,1,before:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "Waterways_06[right1]" - }, - { - "sceneName": "Waterways_06", - "gateName": "top1", - "logic": "Waterways_06[top1] + (ANYCLAW | WINGS | ENEMYPOGOS + DANGEROUSSKIPS) | Waterways_06[right1] + (ACID | LEFTSUPERDASH | $SHRIEKPOGO[1,1,after:AREASOUL]) + (ENEMYPOGOS + DANGEROUSSKIPS | (LEFTCLAW + (LEFTDASH | ENEMYPOGOS | RIGHTCLAW + PRECISEMOVEMENT)) | WINGS)", - "oneWayType": "TwoWay", - "Name": "Waterways_06[top1]" - }, - { - "sceneName": "Waterways_07", - "gateName": "right1", - "logic": "Waterways_07[right1] | (Waterways_07 + (ANYCLAW | ENEMYPOGOS + $SHRIEKPOGO[before:ROOMSOUL]) | (Waterways_07[door1] | Waterways_07[top1]) + (ANYCLAW | WINGS)) + Lever-Dung_Defender", - "oneWayType": "TwoWay", - "Name": "Waterways_07[right1]" - }, - { - "sceneName": "Waterways_07", - "gateName": "right2", - "logic": "Waterways_07[right2] | Waterways_07 + (ACID | RIGHTSKIPACID | ACIDSKIPS + RIGHTDASH + $SHRIEKPOGO[before:ROOMSOUL])", - "oneWayType": "TwoWay", - "Name": "Waterways_07[right2]" - }, - { - "sceneName": "Waterways_07", - "gateName": "left1", - "logic": "Waterways_07[left1] | Waterways_07 + (FULLCLAW + LEFTSUPERDASH | ANYCLAW + ACID + WINGS | LEFTCLAW + ACID + LEFTSUPERDASH | LEFTCLAW + LEFTDASH + WINGS | RIGHTCLAW + WINGS + LEFTDASH | RIGHTCLAW + WINGS + LEFTSUPERDASH | LEFTDASH + $SHRIEKPOGO[1,1])", - "oneWayType": "TwoWay", - "Name": "Waterways_07[left1]" - }, - { - "sceneName": "Waterways_07", - "gateName": "door1", - "logic": "Waterways_07[door1] | Waterways_07 + ANYCLAW | Waterways_07[top1] + (ANYCLAW | WINGS | BACKGROUNDPOGOS) | (Waterways_07 + ENEMYPOGOS + $SHRIEKPOGO[1,1,before:ROOMSOUL] | Waterways_07[right1]) + $SHRIEKPOGO[4]", - "oneWayType": "TwoWay", - "Name": "Waterways_07[door1]" - }, - { - "sceneName": "Waterways_07", - "gateName": "top1", - "logic": "Waterways_07[top1] + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Waterways_07[top1]" - }, - { - "sceneName": "Waterways_08", - "gateName": "top1", - "logic": "Waterways_08[top1] + (ANYCLAW | WINGS) | (Waterways_08[left1] + (LEFTCLAW | WINGS)) | (Waterways_08[left2] + (ANYCLAW | WINGS))", - "oneWayType": "TwoWay", - "Name": "Waterways_08[top1]" - }, - { - "sceneName": "Waterways_08", - "gateName": "left1", - "logic": "Waterways_08[left1] | Waterways_08[top1] + (ENEMYPOGOS | RIGHTCLAW | WINGS | RIGHTSUPERDASH) | Waterways_08[left2]", - "oneWayType": "TwoWay", - "Name": "Waterways_08[left1]" - }, - { - "sceneName": "Waterways_08", - "gateName": "left2", - "logic": "Waterways_08[left2] | Waterways_08[left1] + (LEFTCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Waterways_08[left2]" - }, - { - "sceneName": "Waterways_09", - "gateName": "right1", - "logic": "Waterways_09[right1] | Waterways_09[left1]", - "oneWayType": "TwoWay", - "Name": "Waterways_09[right1]" - }, - { - "sceneName": "Waterways_09", - "gateName": "left1", - "logic": "Waterways_09[left1] | Waterways_09[right1] + Opened_Waterways_Exit", - "oneWayType": "TwoWay", - "Name": "Waterways_09[left1]" - }, - { - "sceneName": "Waterways_12", - "gateName": "right1", - "logic": "Waterways_12[right1]", - "oneWayType": "TwoWay", - "Name": "Waterways_12[right1]" - }, - { - "sceneName": "Waterways_13", - "gateName": "left1", - "logic": "Waterways_13[left1] | Waterways_13 + (RIGHTCLAW | LEFTCLAW + WINGS) + (ACID | FULLSKIPACID)", - "oneWayType": "TwoWay", - "Name": "Waterways_13[left1]" - }, - { - "sceneName": "Waterways_13", - "gateName": "left2", - "logic": "Waterways_13[left2] | Waterways_13 + (ACID | LEFTSKIPACID | ACIDSKIPS + LEFTDASH + $SHRIEKPOGO[1])", - "oneWayType": "TwoWay", - "Name": "Waterways_13[left2]" - }, - { - "sceneName": "Waterways_14", - "gateName": "bot1", - "logic": "Waterways_14[bot1] | Waterways_14[bot2] + (RIGHTCLAW | WINGS + LEFTCLAW | $SHRIEKPOGO[before:ITEMSOUL]) + (ACID | LEFTSUPERDASH)", - "oneWayType": "TwoWay", - "Name": "Waterways_14[bot1]" - }, - { - "sceneName": "Waterways_14", - "gateName": "bot2", - "logic": "Waterways_14[bot2] | Waterways_14[bot1] + (ANYCLAW | $SHRIEKPOGO[2]) + (ACID | RIGHTSUPERDASH)", - "oneWayType": "TwoWay", - "Name": "Waterways_14[bot2]" - }, - { - "sceneName": "Waterways_15", - "gateName": "top1", - "logic": "Waterways_15[top1] + (ANYCLAW | WINGS + PRECISEMOVEMENT)", - "oneWayType": "TwoWay", - "Name": "Waterways_15[top1]" - }, - { - "sceneName": "GG_Pipeway", - "gateName": "right1", - "logic": "GG_Pipeway[right1] | GG_Pipeway[left1] + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "GG_Pipeway[right1]" - }, - { - "sceneName": "GG_Pipeway", - "gateName": "left1", - "logic": "GG_Pipeway[left1] | GG_Pipeway[right1] + (ANYCLAW | WINGS + ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "GG_Pipeway[left1]" - }, - { - "sceneName": "GG_Waterways", - "gateName": "right1", - "logic": "GG_Waterways[right1] | GG_Waterways[door1] + (LEFTCLAW + (RIGHTDASH | WINGS | RIGHTSUPERDASH) | WINGS + RIGHTCLAW) | GG_Waterways + (SWIM + RIGHTCLAW + WINGS | FULLCLAW + RIGHTSUPERDASH)", - "oneWayType": "TwoWay", - "Name": "GG_Waterways[right1]" - }, - { - "sceneName": "GG_Waterways", - "gateName": "door1", - "logic": "GG_Waterways[door1] | GG_Waterways + (LEFTCLAW + (RIGHTDASH | WINGS | RIGHTSUPERDASH + RIGHTCLAW) | WINGS + RIGHTCLAW + PRECISEMOVEMENT | FULLCLAW + SPELLAIRSTALL + $CASTSPELL | $SHRIEKPOGO[2]) | GG_Waterways[right1] + WINGS + RIGHTDASH + RIGHTCLAW + DIFFICULTSKIPS", - "oneWayType": "TwoWay", - "Name": "GG_Waterways[door1]" - }, - { - "sceneName": "Room_GG_Shortcut", - "gateName": "left1", - "logic": "Room_GG_Shortcut[left1] | Room_GG_Shortcut[top1] + (WINGS | SWIM | RIGHTDASH | RIGHTSUPERDASH)", - "oneWayType": "TwoWay", - "Name": "Room_GG_Shortcut[left1]" - }, - { - "sceneName": "Room_GG_Shortcut", - "gateName": "top1", - "logic": "Room_GG_Shortcut[top1] + (WINGS | LEFTCLAW) | Room_GG_Shortcut + (LEFTCLAW | RIGHTCLAW + WINGS | $SHRIEKPOGO[2])", - "oneWayType": "TwoWay", - "Name": "Room_GG_Shortcut[top1]" - }, - { - "sceneName": "Ruins1_01", - "gateName": "left1", - "logic": "Ruins1_01[left1] | Ruins1_01[top1] | (Ruins1_01[bot1] + (ANYCLAW | WINGS))", - "oneWayType": "TwoWay", - "Name": "Ruins1_01[left1]" - }, - { - "sceneName": "Ruins1_01", - "gateName": "top1", - "logic": "Ruins1_01[top1] | Ruins1_01[left1] | (Ruins1_01[bot1] + (ANYCLAW | WINGS))", - "oneWayType": "TwoWay", - "Name": "Ruins1_01[top1]" - }, - { - "sceneName": "Ruins1_01", - "gateName": "bot1", - "logic": "Ruins1_01[bot1] | Ruins1_01[top1] | Ruins1_01[left1]", - "oneWayType": "TwoWay", - "Name": "Ruins1_01[bot1]" - }, - { - "sceneName": "Ruins1_02", - "gateName": "top1", - "logic": "Ruins1_02[top1] | Ruins1_02[bot1] + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Ruins1_02[top1]" - }, - { - "sceneName": "Ruins1_02", - "gateName": "bot1", - "logic": "Ruins1_02[bot1] | Ruins1_02[top1] | Bench-Quirrel", - "oneWayType": "TwoWay", - "Name": "Ruins1_02[bot1]" - }, - { - "sceneName": "Ruins1_03", - "gateName": "top1", - "logic": "Ruins1_03[top1] + (ANYCLAW | WINGS) | Ruins1_03 + (ANYCLAW | WINGS | ENEMYPOGOS + COMPLEXSKIPS)", - "oneWayType": "TwoWay", - "Name": "Ruins1_03[top1]" - }, - { - "sceneName": "Ruins1_03", - "gateName": "left1", - "logic": "Ruins1_03[left1] | Ruins1_03", - "oneWayType": "TwoWay", - "Name": "Ruins1_03[left1]" - }, - { - "sceneName": "Ruins1_03", - "gateName": "right1", - "logic": "Ruins1_03[right1] | Ruins1_03", - "oneWayType": "TwoWay", - "Name": "Ruins1_03[right1]" - }, - { - "sceneName": "Ruins1_03", - "gateName": "right2", - "logic": "Ruins1_03[right2] | Ruins1_03", - "oneWayType": "TwoWay", - "Name": "Ruins1_03[right2]" - }, - { - "sceneName": "Ruins1_04", - "gateName": "right1", - "logic": "Ruins1_04[right1] | Ruins1_04[door1] | Ruins1_04[bot1] + (ENEMYPOGOS | RIGHTDASH | RIGHTSUPERDASH | WINGS | RIGHTCLAW | PRECISEMOVEMENT)", - "oneWayType": "TwoWay", - "Name": "Ruins1_04[right1]" - }, - { - "sceneName": "Ruins1_04", - "gateName": "door1", - "logic": "Ruins1_04[door1] | (Ruins1_04[bot1] | Ruins1_04[right1] + (ENEMYPOGOS | LEFTDASH | WINGS | LEFTCLAW | RIGHTCLAW + PRECISEMOVEMENT)) + (FULLCLAW | WINGS | (ENEMYPOGOS + (ANYCLAW | RIGHTDASH)))", - "oneWayType": "TwoWay", - "Name": "Ruins1_04[door1]" - }, - { - "sceneName": "Ruins1_04", - "gateName": "bot1", - "logic": "Ruins1_04[bot1]", - "oneWayType": "TwoWay", - "Name": "Ruins1_04[bot1]" - }, - { - "sceneName": "Ruins1_05b", - "gateName": "left1", - "logic": "Ruins1_05b[left1] | Ruins1_05b", - "oneWayType": "TwoWay", - "Name": "Ruins1_05b[left1]" - }, - { - "sceneName": "Ruins1_05b", - "gateName": "top1", - "logic": "Ruins1_05b[top1] + (ANYCLAW | WINGS + PRECISEMOVEMENT)", - "oneWayType": "TwoWay", - "Name": "Ruins1_05b[top1]" - }, - { - "sceneName": "Ruins1_05b", - "gateName": "bot1", - "logic": "Ruins1_05b[bot1] | Ruins1_05b + Opened_Waterways_Manhole", - "oneWayType": "TwoWay", - "Name": "Ruins1_05b[bot1]" - }, - { - "sceneName": "Ruins1_05b", - "gateName": "right1", - "logic": "Ruins1_05b[right1] | Ruins1_05b", - "oneWayType": "TwoWay", - "Name": "Ruins1_05b[right1]" - }, - { - "sceneName": "Ruins1_05c", - "gateName": "left2", - "logic": "Ruins1_05c[left2] | Ruins1_05c", - "oneWayType": "TwoWay", - "Name": "Ruins1_05c[left2]" - }, - { - "sceneName": "Ruins1_05c", - "gateName": "bot1", - "logic": "Ruins1_05c[bot1] | Ruins1_05c", - "oneWayType": "TwoWay", - "Name": "Ruins1_05c[bot1]" - }, - { - "sceneName": "Ruins1_05c", - "gateName": "top1", - "logic": "Ruins1_05c[top1] + (ANYCLAW | WINGS + PRECISEMOVEMENT) | Ruins1_05c + (WINGS + (ANYCLAW | ENEMYPOGOS + (DIFFICULTSKIPS | $SHRIEKPOGO[before:ROOMSOUL,after:AREASOUL])) | FULLCLAW + (FULLDASH | WINGS | FULLSUPERDASH | ENEMYPOGOS)) | Ruins1_05c[top2] + ANYCLAW", - "oneWayType": "TwoWay", - "Name": "Ruins1_05c[top1]" - }, - { - "sceneName": "Ruins1_05c", - "gateName": "top2", - "logic": "Ruins1_05c[top2] + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Ruins1_05c[top2]" - }, - { - "sceneName": "Ruins1_05c", - "gateName": "top3", - "logic": "Ruins1_05c[top3] + (RIGHTCLAW | WINGS) | Ruins1_05c[top2] + (RIGHTCLAW | WINGS | LEFTCLAW + ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Ruins1_05c[top3]" - }, - { - "sceneName": "Ruins1_05", - "gateName": "bot1", - "logic": "Ruins1_05[bot1]", - "oneWayType": "TwoWay", - "Name": "Ruins1_05[bot1]" - }, - { - "sceneName": "Ruins1_05", - "gateName": "bot2", - "logic": "Ruins1_05[bot2] | Ruins1_05[bot1] + (FULLCLAW | WINGS + (ANYCLAW | ENEMYPOGOS))", - "oneWayType": "TwoWay", - "Name": "Ruins1_05[bot2]" - }, - { - "sceneName": "Ruins1_05", - "gateName": "bot3", - "logic": "Ruins1_05[bot3] | Ruins1_05", - "oneWayType": "TwoWay", - "Name": "Ruins1_05[bot3]" - }, - { - "sceneName": "Ruins1_05", - "gateName": "right1", - "logic": "Ruins1_05[right1] | Ruins1_05[top1] | Ruins1_05 + (LEFTCLAW | WINGS + (RIGHTCLAW | BACKGROUNDPOGOS))", - "oneWayType": "TwoWay", - "Name": "Ruins1_05[right1]" - }, - { - "sceneName": "Ruins1_05", - "gateName": "right2", - "logic": "Ruins1_05[right2] | Ruins1_05", - "oneWayType": "TwoWay", - "Name": "Ruins1_05[right2]" - }, - { - "sceneName": "Ruins1_05", - "gateName": "top1", - "logic": "Ruins1_05[top1] + (RIGHTCLAW | WINGS + (ANYCLAW | PRECISEMOVEMENT)) | (Ruins1_05 + (LEFTCLAW | WINGS + BACKGROUNDPOGOS) | Ruins1_05[right1]) + (RIGHTCLAW | WINGS + LEFTCLAW | $SHADESKIP + WINGS | $SHADESKIP + LEFTCLAW | ENEMYPOGOS + $SHRIEKPOGO[2,before:MAPAREASOUL,after:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "Ruins1_05[top1]" - }, - { - "sceneName": "Ruins1_06", - "gateName": "left1", - "logic": "Ruins1_06[left1] | Ruins1_06[right1]", - "oneWayType": "TwoWay", - "Name": "Ruins1_06[left1]" - }, - { - "sceneName": "Ruins1_06", - "gateName": "right1", - "logic": "Ruins1_06[right1] | Ruins1_06[left1]", - "oneWayType": "TwoWay", - "Name": "Ruins1_06[right1]" - }, - { - "sceneName": "Ruins1_09", - "gateName": "top1", - "logic": "Ruins1_09[top1] + (ANYCLAW | WINGS) | Ruins1_09[left1] + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Ruins1_09[top1]" - }, - { - "sceneName": "Ruins1_09", - "gateName": "left1", - "logic": "Ruins1_09[left1] | Ruins1_09[top1]", - "oneWayType": "TwoWay", - "Name": "Ruins1_09[left1]" - }, - { - "sceneName": "Ruins1_17", - "gateName": "top1", - "logic": "Ruins1_17[top1] | Ruins1_17[right1]", - "oneWayType": "TwoWay", - "Name": "Ruins1_17[top1]" - }, - { - "sceneName": "Ruins1_17", - "gateName": "right1", - "logic": "Ruins1_17[right1] | Ruins1_17[top1]", - "oneWayType": "TwoWay", - "Name": "Ruins1_17[right1]" - }, - { - "sceneName": "Ruins1_17", - "gateName": "bot1", - "logic": "Ruins1_17[bot1] | Ruins1_17[top1] | Ruins1_17[right1]", - "oneWayType": "TwoWay", - "Name": "Ruins1_17[bot1]" - }, - { - "sceneName": "Ruins1_18", - "gateName": "left1", - "logic": "Ruins1_18[left1] | Ruins1_18[right1]", - "oneWayType": "TwoWay", - "Name": "Ruins1_18[left1]" - }, - { - "sceneName": "Ruins1_18", - "gateName": "right1", - "logic": "Ruins1_18[right1]", - "oneWayType": "TwoWay", - "Name": "Ruins1_18[right1]" - }, - { - "sceneName": "Ruins1_18", - "gateName": "right2", - "logic": "Ruins1_18[right2] | Bench-Watcher's_Spire", - "oneWayType": "TwoWay", - "Name": "Ruins1_18[right2]" - }, - { - "sceneName": "Ruins1_23", - "gateName": "top1", - "logic": "Ruins1_23[top1] + WINGS + PRECISEMOVEMENT | (Ruins1_23[top1] | Ruins1_23 + Defeated_Sanctum_Warrior + Broke_Sanctum_Glass_Floor) + WINGS + (LEFTCLAW + (RIGHTDASH | RIGHTSUPERDASH) | RIGHTCLAW + (LEFTDASH | LEFTSUPERDASH) | BACKGROUNDPOGOS)", - "oneWayType": "TwoWay", - "Name": "Ruins1_23[top1]" - }, - { - "sceneName": "Ruins1_23", - "gateName": "right1", - "logic": "Ruins1_23[right1] | (Ruins1_23[top1] | Ruins1_23 + (LEFTCLAW | WINGS | RIGHTCLAW + LEFTSUPERDASH + (BACKGROUNDPOGOS | OBSCURESKIPS))) + Defeated_Sanctum_Warrior", - "oneWayType": "TwoWay", - "Name": "Ruins1_23[right1]" - }, - { - "sceneName": "Ruins1_23", - "gateName": "right2", - "logic": "Ruins1_23[right2]", - "oneWayType": "TwoWay", - "Name": "Ruins1_23[right2]" - }, - { - "sceneName": "Ruins1_23", - "gateName": "bot1", - "logic": "Ruins1_23[bot1] | Ruins1_23", - "oneWayType": "TwoWay", - "Name": "Ruins1_23[bot1]" - }, - { - "sceneName": "Ruins1_23", - "gateName": "left1", - "logic": "Ruins1_23[left1] | Ruins1_23", - "oneWayType": "TwoWay", - "Name": "Ruins1_23[left1]" - }, - { - "sceneName": "Ruins1_24", - "gateName": "left1", - "logic": "Ruins1_24[left1] | Ruins1_24[right1] + (LEFTCLAW | WINGS | (RIGHTCLAW + LEFTSUPERDASH)) + Defeated_Soul_Master", - "oneWayType": "TwoWay", - "Name": "Ruins1_24[left1]" - }, - { - "sceneName": "Ruins1_24", - "gateName": "right1", - "logic": "Ruins1_24[right1]", - "oneWayType": "TwoWay", - "Name": "Ruins1_24[right1]" - }, - { - "sceneName": "Ruins1_24", - "gateName": "left2", - "logic": "Ruins1_24[left2] | Ruins1_24[right2]", - "oneWayType": "TwoWay", - "Name": "Ruins1_24[left2]" - }, - { - "sceneName": "Ruins1_24", - "gateName": "right2", - "logic": "Ruins1_24[right2] | Ruins1_24[left2]", - "oneWayType": "TwoWay", - "Name": "Ruins1_24[right2]" - }, - { - "sceneName": "Ruins1_25", - "gateName": "left1", - "logic": "Ruins1_25[left1] | (Ruins1_25[left2] | Ruins1_25[left3]) + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Ruins1_25[left1]" - }, - { - "sceneName": "Ruins1_25", - "gateName": "left2", - "logic": "Ruins1_25[left2] | (Ruins1_25[left1] | Ruins1_25[left3]) + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Ruins1_25[left2]" - }, - { - "sceneName": "Ruins1_25", - "gateName": "left3", - "logic": "Ruins1_25[left3] | (Ruins1_25[left1] + (ANYCLAW | WINGS)) | Ruins1_25[left2]", - "oneWayType": "TwoWay", - "Name": "Ruins1_25[left3]" - }, - { - "sceneName": "Ruins1_27", - "gateName": "left1", - "logic": "Ruins1_27[left1] | Ruins1_27[right1]", - "oneWayType": "TwoWay", - "Name": "Ruins1_27[left1]" - }, - { - "sceneName": "Ruins1_27", - "gateName": "right1", - "logic": "Ruins1_27[right1] | Ruins1_27[left1] + Lever-City_Fountain", - "oneWayType": "TwoWay", - "Name": "Ruins1_27[right1]" - }, - { - "sceneName": "Ruins1_28", - "gateName": "left1", - "logic": "Ruins1_28[left1] | Ruins1_28", - "oneWayType": "TwoWay", - "Name": "Ruins1_28[left1]" - }, - { - "sceneName": "Ruins1_28", - "gateName": "right1", - "logic": "Ruins1_28[right1] | Ruins1_28", - "oneWayType": "TwoWay", - "Name": "Ruins1_28[right1]" - }, - { - "sceneName": "Ruins1_28", - "gateName": "bot1", - "logic": "Ruins1_28[bot1] | Ruins1_28", - "oneWayType": "TwoWay", - "Name": "Ruins1_28[bot1]" - }, - { - "sceneName": "Ruins1_29", - "gateName": "left1", - "logic": "Ruins1_29[left1] | Can_Stag + City_Storerooms_Stag | Bench-City_Storerooms", - "oneWayType": "TwoWay", - "Name": "Ruins1_29[left1]" - }, - { - "sceneName": "Ruins1_30", - "gateName": "left1", - "logic": "Ruins1_30[left1] | Ruins1_30 + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Ruins1_30[left1]" - }, - { - "sceneName": "Ruins1_30", - "gateName": "left2", - "logic": "Ruins1_30[left2]", - "oneWayType": "TwoWay", - "Name": "Ruins1_30[left2]" - }, - { - "sceneName": "Ruins1_30", - "gateName": "bot1", - "logic": "Ruins1_30[bot1] | Ruins1_30 + Broke_Sanctum_Glass_Floor", - "oneWayType": "TwoWay", - "Name": "Ruins1_30[bot1]" - }, - { - "sceneName": "Ruins1_30", - "gateName": "right1", - "logic": "Ruins1_30[right1] | Ruins1_30 + (ANYCLAW | WINGS) | Ruins1_30[left1]", - "oneWayType": "TwoWay", - "Name": "Ruins1_30[right1]" - }, - { - "sceneName": "Ruins1_31", - "gateName": "bot1", - "logic": "Ruins1_31[bot1] | Ruins1_31 | Ruins1_31[left1]", - "oneWayType": "TwoWay", - "Name": "Ruins1_31[bot1]" - }, - { - "sceneName": "Ruins1_31", - "gateName": "left1", - "logic": "Ruins1_31[left1] | Ruins1_31 | Ruins1_31[bot1] | Bench-City_Toll", - "oneWayType": "TwoWay", - "Name": "Ruins1_31[left1]" - }, - { - "sceneName": "Ruins1_31", - "gateName": "left2", - "logic": "Ruins1_31[left2] | Ruins1_31 + Lever-Shade_Soul + (ANYCLAW + WINGS + (RIGHTCLAW | RIGHTDASH | RIGHTSUPERDASH) | LEFTCLAW + $SHRIEKPOGO[before:AREASOUL] | $SHRIEKPOGO[3,before:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "Ruins1_31[left2]" - }, - { - "sceneName": "Ruins1_31", - "gateName": "left3", - "logic": "Ruins1_31[left3] | Ruins1_31 + ELEGANT", - "oneWayType": "TwoWay", - "Name": "Ruins1_31[left3]" - }, - { - "sceneName": "Ruins1_31", - "gateName": "right1", - "logic": "Ruins1_31[right1] | Ruins1_31", - "oneWayType": "TwoWay", - "Name": "Ruins1_31[right1]" - }, - { - "sceneName": "Ruins1_31b", - "gateName": "right1", - "logic": "Ruins1_31b[right1] | Ruins1_31b[right2] + Defeated_Elegant_Warrior", - "oneWayType": "TwoWay", - "Name": "Ruins1_31b[right1]" - }, - { - "sceneName": "Ruins1_31b", - "gateName": "right2", - "logic": "Ruins1_31b[right2] | Ruins1_31b[right1] + Defeated_Elegant_Warrior", - "oneWayType": "TwoWay", - "Name": "Ruins1_31b[right2]" - }, - { - "sceneName": "Ruins1_32", - "gateName": "right1", - "logic": "Ruins1_32[right1]", - "oneWayType": "TwoWay", - "Name": "Ruins1_32[right1]" - }, - { - "sceneName": "Ruins1_32", - "gateName": "right2", - "logic": "Ruins1_32[right2] | Ruins1_32[right1] + (ANYCLAW | ENEMYPOGOS + $SHRIEKPOGO[before:AREASOUL,after:ROOMSOUL]) + Broke_Quake_Floor_After_Soul_Master_1 + Broke_Quake_Floor_After_Soul_Master_2 + Broke_Quake_Floor_After_Soul_Master_3 + Broke_Quake_Floor_After_Soul_Master_4", - "oneWayType": "TwoWay", - "Name": "Ruins1_32[right2]" - }, - { - "sceneName": "Room_nailsmith", - "gateName": "left1", - "logic": "Room_nailsmith[left1]", - "oneWayType": "TwoWay", - "Name": "Room_nailsmith[left1]" - }, - { - "sceneName": "Ruins2_01", - "gateName": "top1", - "logic": "Ruins2_01[top1] | Ruins2_01[left2] + (ANYCLAW | WINGS) | Ruins2_01 + (FULLCLAW + (LEFTDASH | LEFTSUPERDASH) | ANYCLAW + (WINGS | ENEMYPOGOS) | WINGS + ENEMYPOGOS + DIFFICULTSKIPS)", - "oneWayType": "TwoWay", - "Name": "Ruins2_01[top1]" - }, - { - "sceneName": "Ruins2_01", - "gateName": "bot1", - "logic": "Ruins2_01[bot1] | Ruins2_01", - "oneWayType": "TwoWay", - "Name": "Ruins2_01[bot1]" - }, - { - "sceneName": "Ruins2_01", - "gateName": "left2", - "logic": "Ruins2_01[left2] | Ruins2_01[top1] | Ruins2_01 + (FULLCLAW + (LEFTDASH | LEFTSUPERDASH) | ANYCLAW + (WINGS | ENEMYPOGOS) | WINGS + ENEMYPOGOS + DIFFICULTSKIPS)", - "oneWayType": "TwoWay", - "Name": "Ruins2_01[left2]" - }, - { - "sceneName": "Ruins2_01_b", - "gateName": "top1", - "logic": "Ruins2_01_b[top1] | Ruins2_01_b + (LEFTCLAW + BACKGROUNDPOGOS | WINGS)", - "oneWayType": "TwoWay", - "Name": "Ruins2_01_b[top1]" - }, - { - "sceneName": "Ruins2_01_b", - "gateName": "left1", - "logic": "Ruins2_01_b[left1] | Ruins2_01_b", - "oneWayType": "TwoWay", - "Name": "Ruins2_01_b[left1]" - }, - { - "sceneName": "Ruins2_01_b", - "gateName": "right1", - "logic": "Ruins2_01_b[right1] | Ruins2_01_b", - "oneWayType": "TwoWay", - "Name": "Ruins2_01_b[right1]" - }, - { - "sceneName": "Ruins2_03b", - "gateName": "top1", - "logic": "Ruins2_03b[top1] + (RIGHTCLAW | WINGS) | Ruins2_03b + (RIGHTCLAW | WINGS | $SHADESKIP)", - "oneWayType": "TwoWay", - "Name": "Ruins2_03b[top1]" - }, - // ^^^ the shade skip is by dying to the elevator at its upper position - { - "sceneName": "Ruins2_03b", - "gateName": "top2", - "logic": "Ruins2_03b[top2] + (ANYCLAW | WINGS) | Ruins2_03b + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Ruins2_03b[top2]" - }, - // ^^^ there is also a shade skip for this transition, but the only way to get the shade in position is by dying to the fireball of the shade in the left position - { - "sceneName": "Ruins2_03b", - "gateName": "left1", - "logic": "Ruins2_03b[left1] | Ruins2_03b", - "oneWayType": "TwoWay", - "Name": "Ruins2_03b[left1]" - }, - { - "sceneName": "Ruins2_03b", - "gateName": "bot1", - "logic": "Ruins2_03b[bot1] | Ruins2_03b", - "oneWayType": "TwoWay", - "Name": "Ruins2_03b[bot1]" - }, - { - "sceneName": "Ruins2_03", - "gateName": "top1", - "logic": "Ruins2_03[top1] | Ruins2_03[bot1] + ANYCLAW + Defeated_Watcher_Knights", - "oneWayType": "TwoWay", - "Name": "Ruins2_03[top1]" - }, - { - "sceneName": "Ruins2_03", - "gateName": "bot1", - "logic": "Ruins2_03[bot1] | Ruins2_03[top1] + Defeated_Watcher_Knights", - "oneWayType": "TwoWay", - "Name": "Ruins2_03[bot1]" - }, - { - "sceneName": "Ruins2_03", - "gateName": "bot2", - "logic": "Ruins2_03[bot2]", - "oneWayType": "TwoWay", - "Name": "Ruins2_03[bot2]" - }, - { - "sceneName": "Ruins2_04", - "gateName": "left1", - "logic": "Ruins2_04[left1] | Ruins2_04", - "oneWayType": "TwoWay", - "Name": "Ruins2_04[left1]" - }, - { - "sceneName": "Ruins2_04", - "gateName": "left2", - "logic": "Ruins2_04[left2] | Ruins2_04", - "oneWayType": "TwoWay", - "Name": "Ruins2_04[left2]" - }, - { - "sceneName": "Ruins2_04", - "gateName": "right1", - "logic": "Ruins2_04[right1] | Ruins2_04[door_Ruin_House_02] | Ruins2_04[door_Ruin_Elevator] + ANYCLAW | Ruins2_04 + ((LEFTDASH | LEFTCLAW) + (RIGHTDASH | RIGHTCLAW) | WINGS)", - "oneWayType": "TwoWay", - "Name": "Ruins2_04[right1]" - }, - { - "sceneName": "Ruins2_04", - "gateName": "right2", - "logic": "Ruins2_04[right2] | Ruins2_04", - "oneWayType": "TwoWay", - "Name": "Ruins2_04[right2]" - }, - { - "sceneName": "Ruins2_04", - "gateName": "door_Ruin_House_01", - "logic": "Ruins2_04[door_Ruin_House_01] | Ruins2_04[right1] | Ruins2_04[door_Ruin_House_02] | Ruins2_04[door_Ruin_Elevator] + (ANYCLAW | RIGHTSUPERDASH) | Ruins2_04 + (((LEFTDASH | LEFTCLAW) + (RIGHTDASH | RIGHTCLAW)) | WINGS)", - "oneWayType": "TwoWay", - "Name": "Ruins2_04[door_Ruin_House_01]" - }, - { - "sceneName": "Ruins2_04", - "gateName": "door_Ruin_House_02", - "logic": "Ruins2_04[door_Ruin_House_02] | Ruins2_04[right1] | Ruins2_04[door_Ruin_Elevator] + ANYCLAW | Ruins2_04 + ((LEFTDASH | LEFTCLAW) + (RIGHTDASH | RIGHTCLAW) | WINGS)", - "oneWayType": "TwoWay", - "Name": "Ruins2_04[door_Ruin_House_02]" - }, - { - "sceneName": "Ruins2_04", - "gateName": "door_Ruin_House_03", - "logic": "Ruins2_04[door_Ruin_House_03] | Ruins2_04 + Opened_Emilitia_Door", - "oneWayType": "TwoWay", - "Name": "Ruins2_04[door_Ruin_House_03]" - }, - { - "sceneName": "Ruins2_04", - "gateName": "door_Ruin_Elevator", - "logic": "Ruins2_04[door_Ruin_Elevator] | (Ruins2_04[right1] | Ruins2_04[door_Ruin_House_02] | Ruins2_04 + ((LEFTDASH | LEFTCLAW) + (RIGHTDASH | RIGHTCLAW) | WINGS)) + PLEASUREHOUSEUNLOCK", - "oneWayType": "TwoWay", - "Name": "Ruins2_04[door_Ruin_Elevator]" - }, - { - "sceneName": "Ruins2_05", - "gateName": "left1", - "logic": "Ruins2_05[left1] | Ruins2_05[top1] | Ruins2_05[bot1] + (LEFTCLAW | WINGS | ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Ruins2_05[left1]" - }, - { - "sceneName": "Ruins2_05", - "gateName": "top1", - "logic": "Ruins2_05[top1] | (Ruins2_05[left1] | Ruins2_05[bot1]) + (LEFTCLAW | WINGS | ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Ruins2_05[top1]" - }, - { - "sceneName": "Ruins2_05", - "gateName": "bot1", - "logic": "Ruins2_05[bot1] | Ruins2_05[left1] | Ruins2_05[top1]", - "oneWayType": "TwoWay", - "Name": "Ruins2_05[bot1]" - }, - { - "sceneName": "Ruins2_06", - "gateName": "left1", - "logic": "Ruins2_06[left1] | Ruins2_06[left1] | Ruins2_06[top1] | Ruins2_06[right1] + (LEFTCLAW | RIGHTCLAW | WINGS | ENEMYPOGOS) | Ruins2_06[right2] + (RIGHTCLAW | WINGS | ENEMYPOGOS) | Ruins2_06[left2] + (WINGS | RIGHTSUPERDASH | SWIM | RIGHTCLAW + RIGHTDASH + PRECISEMOVEMENT) + (RIGHTCLAW | WINGS | ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Ruins2_06[left1]" - }, - { - "sceneName": "Ruins2_06", - "gateName": "left2", - "logic": "Ruins2_06[left2] | (Ruins2_06[left1] | Ruins2_06[top1] | Ruins2_06[right1] | Ruins2_06[right2]) + (LEFTDASH | LEFTSUPERDASH | WINGS | SWIM | ENEMYPOGOS + DIFFICULTSKIPS | SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL,after:MAPAREASOUL])", - "oneWayType": "TwoWay", - "Name": "Ruins2_06[left2]" - }, - { - "sceneName": "Ruins2_06", - "gateName": "right1", - "logic": "Ruins2_06[right1] | Ruins2_06[left1] | Ruins2_06[top1] | Ruins2_06[right1] | Ruins2_06[right2] + (RIGHTCLAW | WINGS | $SHADESKIP | ENEMYPOGOS) | Ruins2_06[left2] + (WINGS | RIGHTSUPERDASH | SWIM | RIGHTCLAW + RIGHTDASH + PRECISEMOVEMENT) + (RIGHTCLAW | WINGS | ENEMYPOGOS | $SHADESKIP)", - "oneWayType": "TwoWay", - "Name": "Ruins2_06[right1]" - }, - { - "sceneName": "Ruins2_06", - "gateName": "right2", - "logic": "Ruins2_06[right2] | Ruins2_06[left1] | Ruins2_06[top1] | Ruins2_06[right1] | Ruins2_06[right2] | Ruins2_06[left2] + (WINGS | RIGHTSUPERDASH | SWIM | RIGHTCLAW + RIGHTDASH + PRECISEMOVEMENT)", - "oneWayType": "TwoWay", - "Name": "Ruins2_06[right2]" - }, - { - "sceneName": "Ruins2_06", - "gateName": "top1", - "logic": "Ruins2_06[top1] | Ruins2_06[left1] | Ruins2_06[top1] | Ruins2_06[right1] + (LEFTCLAW | RIGHTCLAW | WINGS | ENEMYPOGOS) | Ruins2_06[right2] + (RIGHTCLAW | WINGS | ENEMYPOGOS) | Ruins2_06[left2] + (WINGS | RIGHTSUPERDASH | SWIM | RIGHTCLAW + RIGHTDASH + PRECISEMOVEMENT) + (RIGHTCLAW | WINGS | ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Ruins2_06[top1]" - }, - { - "sceneName": "Ruins2_07", - "gateName": "right1", - "logic": "Ruins2_07[right1] | Ruins2_07[left1] + (SWIM | RIGHTSKIPACID | (COMPLEXSKIPS + ACIDSKIPS + RIGHTDASH + WINGS + (SPELLAIRSTALL + $CASTSPELL | RIGHTSHARPSHADOW))) | Ruins2_07[right1] | Ruins2_07[top1]", - "oneWayType": "TwoWay", - "Name": "Ruins2_07[right1]" - }, - { - "sceneName": "Ruins2_07", - "gateName": "left1", - "logic": "Ruins2_07[left1] | Ruins2_07[right1] + (SWIM | LEFTSKIPACID | (COMPLEXSKIPS + ACIDSKIPS + LEFTDASH + WINGS + (SPELLAIRSTALL + (RIGHTCLAW + $CASTSPELL | LEFTCLAW + $CASTSPELL[2]) | ANYCLAW + LEFTSHARPSHADOW))) | Ruins2_07[top1] + (SWIM | LEFTSKIPACID | (COMPLEXSKIPS + ACIDSKIPS + LEFTDASH + RIGHTCLAW + WINGS + (SPELLAIRSTALL + $CASTSPELL[3] | LEFTSHARPSHADOW)))", - "oneWayType": "TwoWay", - "Name": "Ruins2_07[left1]" - }, - { - "sceneName": "Ruins2_07", - "gateName": "top1", - "logic": "Ruins2_07[top1] + (ANYCLAW | WINGS) | Ruins2_07[left1] + (SWIM | RIGHTSKIPACID | (COMPLEXSKIPS + ACIDSKIPS + RIGHTDASH + WINGS + (SPELLAIRSTALL + $CASTSPELL | RIGHTSHARPSHADOW))) + (ANYCLAW | WINGS) | Ruins2_07[right1] + (LEFTCLAW | WINGS | (RIGHTCLAW + (SWIM | LEFTDASH))) | Ruins2_07[top1] + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Ruins2_07[top1]" - }, - { - "sceneName": "Ruins2_08", - "gateName": "left1", - "logic": "Ruins2_08[left1] | Can_Stag + King's_Station_Stag | Bench-King's_Station", - "oneWayType": "TwoWay", - "Name": "Ruins2_08[left1]" - }, - { - "sceneName": "Ruins2_09", - "gateName": "bot1", - "logic": "Ruins2_09[bot1]", - "oneWayType": "TwoWay", - "Name": "Ruins2_09[bot1]" - }, - { - "sceneName": "Ruins2_10", - "gateName": "right1", - "logic": "Ruins2_10[right1] | Right_Elevator + Opened_Resting_Grounds_Catacombs_Wall", - "oneWayType": "TwoWay", - "Name": "Ruins2_10[right1]" - }, - { - "sceneName": "Ruins2_10", - "gateName": "left1", - "logic": "Ruins2_10[left1] | Right_Elevator", - "oneWayType": "TwoWay", - "Name": "Ruins2_10[left1]" - }, - { - "sceneName": "Ruins2_10b", - "gateName": "right1", - "logic": "Ruins2_10b[right1] | (Right_Elevator | Ruins2_10b[right2]) + (LEFTCLAW + WINGS | RIGHTCLAW + WINGS | FULLCLAW) | Ruins2_10b[left1] + (LEFTCLAW | RIGHTCLAW + WINGS)", - "oneWayType": "TwoWay", - "Name": "Ruins2_10b[right1]" - }, - { - "sceneName": "Ruins2_10b", - "gateName": "right2", - "logic": "Ruins2_10b[right2] | Ruins2_10b[left1] | Ruins2_10b[right1] | Right_Elevator", - "oneWayType": "TwoWay", - "Name": "Ruins2_10b[right2]" - }, - { - "sceneName": "Ruins2_10b", - "gateName": "left1", - "logic": "Ruins2_10b[left1] | (Ruins2_10b[right1] | (Right_Elevator | Ruins2_10b[right2]) + (ANYCLAW + WINGS | FULLCLAW)) + Opened_Pleasure_House_Wall", - "oneWayType": "TwoWay", - "Name": "Ruins2_10b[left1]" - }, - { - "sceneName": "Ruins2_11_b", - "gateName": "right1", - "logic": "Ruins2_11_b[right1] | Ruins2_11_b[left1]", - "oneWayType": "TwoWay", - "Name": "Ruins2_11_b[right1]" - }, - { - "sceneName": "Ruins2_11_b", - "gateName": "left1", - "logic": "Ruins2_11_b[left1] | Ruins2_11_b[right1] + LOVE", - "oneWayType": "TwoWay", - "Name": "Ruins2_11_b[left1]" - }, - { - "sceneName": "Ruins2_11_b", - "gateName": "bot1", - "logic": "Ruins2_11_b[bot1] | Ruins2_11_b[right1] | Ruins2_11_b[left1]", - "oneWayType": "TwoWay", - "Name": "Ruins2_11_b[bot1]" - }, - { - "sceneName": "Ruins2_11", - "gateName": "right1", - "logic": "Ruins2_11[right1]", - "oneWayType": "TwoWay", - "Name": "Ruins2_11[right1]" - }, - { - "sceneName": "Ruins2_Watcher_Room", - "gateName": "bot1", - "logic": "Ruins2_Watcher_Room[bot1]", - "oneWayType": "TwoWay", - "Name": "Ruins2_Watcher_Room[bot1]" - }, - { - "sceneName": "Ruins_House_01", - "gateName": "left1", - "logic": "Ruins_House_01[left1]", - "oneWayType": "TwoWay", - "Name": "Ruins_House_01[left1]" - }, - { - "sceneName": "Ruins_House_02", - "gateName": "left1", - "logic": "Ruins_House_02[left1]", - "oneWayType": "TwoWay", - "Name": "Ruins_House_02[left1]" - }, - { - "sceneName": "Ruins_House_03", - "gateName": "left1", - "logic": "Ruins_House_03[left1] | Ruins_House_03[left2] + ANYCLAW", - "oneWayType": "TwoWay", - "Name": "Ruins_House_03[left1]" - }, - { - "sceneName": "Ruins_House_03", - "gateName": "left2", - "logic": "Ruins_House_03[left2] | Ruins_House_03[left1]", - "oneWayType": "TwoWay", - "Name": "Ruins_House_03[left2]" - }, - { - "sceneName": "Ruins_Elevator", - "gateName": "left1", - "logic": "Ruins_Elevator[left1] | Ruins_Elevator[left2]", - "oneWayType": "TwoWay", - "Name": "Ruins_Elevator[left1]" - }, - { - "sceneName": "Ruins_Elevator", - "gateName": "left2", - "logic": "Ruins_Elevator[left2] | Ruins_Elevator[left1]", - "oneWayType": "TwoWay", - "Name": "Ruins_Elevator[left2]" - }, - { - "sceneName": "Ruins_Bathhouse", - "gateName": "door1", - "logic": "Ruins_Bathhouse[door1] | Ruins_Bathhouse[right1] | Bench-Pleasure_House | Pleasure_House_Hot_Spring", - "oneWayType": "TwoWay", - "Name": "Ruins_Bathhouse[door1]" - }, - { - "sceneName": "Ruins_Bathhouse", - "gateName": "right1", - "logic": "Ruins_Bathhouse[right1] | Ruins_Bathhouse[door1]", - "oneWayType": "TwoWay", - "Name": "Ruins_Bathhouse[right1]" - }, - { - "sceneName": "RestingGrounds_02", - "gateName": "right1", - "logic": "RestingGrounds_02[right1] | RestingGrounds_02", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_02[right1]" - }, - { - "sceneName": "RestingGrounds_02", - "gateName": "left1", - "logic": "RestingGrounds_02[left1] | RestingGrounds_02", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_02[left1]" - }, - { - "sceneName": "RestingGrounds_02", - "gateName": "bot1", - "logic": "RestingGrounds_02[bot1] | RestingGrounds_02 + Opened_Resting_Grounds_Floor", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_02[bot1]" - }, - { - "sceneName": "RestingGrounds_02", - "gateName": "top1", - "logic": "NONE", - "oneWayType": "OneWayOut", - "Name": "RestingGrounds_02[top1]" - }, - { - "sceneName": "RestingGrounds_04", - "gateName": "left1", - "logic": "RestingGrounds_04[left1] | RestingGrounds_04[right1]", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_04[left1]" - }, - { - "sceneName": "RestingGrounds_04", - "gateName": "right1", - "logic": "RestingGrounds_04[right1] | RestingGrounds_04[left1]", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_04[right1]" - }, - { - "sceneName": "RestingGrounds_05", - "gateName": "left1", - "logic": "RestingGrounds_05[left1] | RestingGrounds_05", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_05[left1]" - }, - { - "sceneName": "RestingGrounds_05", - "gateName": "left2", - "logic": "RestingGrounds_05[left2] | RestingGrounds_05", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_05[left2]" - }, - { - "sceneName": "RestingGrounds_05", - "gateName": "left3", - "logic": "RestingGrounds_05[left3] | RestingGrounds_05", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_05[left3]" - }, - { - "sceneName": "RestingGrounds_05", - "gateName": "right1", - "logic": "RestingGrounds_05[right1] | RestingGrounds_05 + Opened_Glade_Door", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_05[right1]" - }, - { - "sceneName": "RestingGrounds_05", - "gateName": "right2", - "logic": "RestingGrounds_05[right2] | RestingGrounds_05", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_05[right2]" - }, - { - "sceneName": "RestingGrounds_05", - "gateName": "bot1", - "logic": "RestingGrounds_05[bot1] | RestingGrounds_05 + Broke_Resting_Grounds_Quake_Floor", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_05[bot1]" - }, - { - "sceneName": "RestingGrounds_06", - "gateName": "left1", - "logic": "RestingGrounds_06[left1] | RestingGrounds_06[right1] | RestingGrounds_06[top1]", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_06[left1]" - }, - { - "sceneName": "RestingGrounds_06", - "gateName": "right1", - "logic": "RestingGrounds_06[right1] | RestingGrounds_06[left1] | RestingGrounds_06[top1]", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_06[right1]" - }, - { - "sceneName": "RestingGrounds_06", - "gateName": "top1", - "logic": "RestingGrounds_06[top1] | (RestingGrounds_06[left1] | RestingGrounds_06[right1]) + (LEFTCLAW | WINGS | LEFTDASH | ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_06[top1]" - }, - { - "sceneName": "RestingGrounds_07", - "gateName": "right1", - "logic": "RestingGrounds_07[right1]", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_07[right1]" - }, - { - "sceneName": "RestingGrounds_08", - "gateName": "left1", - "logic": "RestingGrounds_08[left1]", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_08[left1]" - }, - { - "sceneName": "RestingGrounds_09", - "gateName": "left1", - "logic": "RestingGrounds_09[left1] | Can_Stag + Resting_Grounds_Stag | Bench-Grounds_Stag", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_09[left1]" - }, - { - "sceneName": "RestingGrounds_10", - "gateName": "left1", - "logic": "RestingGrounds_10[left1] | RestingGrounds_10", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_10[left1]" - }, - { - "sceneName": "RestingGrounds_10", - "gateName": "top1", - "logic": "RestingGrounds_10[top1] + (ANYCLAW | WINGS + PRECISEMOVEMENT) | RestingGrounds_10 + Broke_Crypts_One_Way_Floor + (RIGHTCLAW | LEFTCLAW + (WINGS | PRECISEMOVEMENT))", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_10[top1]" - }, - { - "sceneName": "RestingGrounds_10", - "gateName": "top2", - "logic": "RestingGrounds_10[top2] + (LEFTCLAW | WINGS + (RIGHTCLAW | PRECISEMOVEMENT)) | RestingGrounds_10 + (LEFTCLAW | WINGS + RIGHTCLAW | $SHADESKIP + WINGS | $SHADESKIP[2HITS] + DAMAGEBOOSTS + $TAKEDAMAGE + (ANYDASH | SPELLAIRSTALL + $CASTSPELL) | $SHRIEKPOGO[before:ROOMSOUL]) + UPWALLBREAK", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_10[top2]" - }, - { - "sceneName": "RestingGrounds_12", - "gateName": "bot1", - "logic": "RestingGrounds_12[bot1] | RestingGrounds_12[door_Mansion]", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_12[bot1]" - }, - { - "sceneName": "RestingGrounds_12", - "gateName": "door_Mansion", - "logic": "RestingGrounds_12[door_Mansion] | RestingGrounds_12[bot1] | Bench-Grey_Mourner", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_12[door_Mansion]" - }, - { - "sceneName": "RestingGrounds_17", - "gateName": "right1", - "logic": "RestingGrounds_17[right1]", - "oneWayType": "TwoWay", - "Name": "RestingGrounds_17[right1]" - }, - { - "sceneName": "Room_Mansion", - "gateName": "left1", - "logic": "Room_Mansion[left1] | Grey_Mourner", - "oneWayType": "TwoWay", - "Name": "Room_Mansion[left1]" - }, - { - "sceneName": "Mines_01", - "gateName": "bot1", - "logic": "Mines_01[bot1] | Mines_01[left1] + Broke_Crystal_Peak_Entrance_Quake_Floor", - "oneWayType": "TwoWay", - "Name": "Mines_01[bot1]" - }, - { - "sceneName": "Mines_01", - "gateName": "left1", - "logic": "Mines_01[left1] | Mines_01[bot1] + Broke_Crystal_Peak_Entrance_Quake_Floor + (ANYCLAW + WINGS | FULLCLAW + LEFTSUPERDASH | LEFTCLAW + FULLDASH + BACKGROUNDPOGOS)", - "oneWayType": "TwoWay", - "Name": "Mines_01[left1]" - }, - { - "sceneName": "Mines_02", - "gateName": "top1", - "logic": "Mines_02[top1] + (ANYCLAW | WINGS) | Mines_02 + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Mines_02[top1]" - }, - { - "sceneName": "Mines_02", - "gateName": "top2", - "logic": "Mines_02 + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Mines_02[top2]" - }, - { - "sceneName": "Mines_02", - "gateName": "left1", - "logic": "Mines_02[left1] | Mines_02", - "oneWayType": "TwoWay", - "Name": "Mines_02[left1]" - }, - { - "sceneName": "Mines_02", - "gateName": "right1", - "logic": "Mines_02[right1] | Mines_02", - "oneWayType": "TwoWay", - "Name": "Mines_02[right1]" - }, - { - "sceneName": "Mines_03", - "gateName": "right1", - "logic": "Mines_03[right1] | Mines_03[top1] | Mines_03 + (LEFTCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Mines_03[right1]" - }, - { - "sceneName": "Mines_03", - "gateName": "bot1", - "logic": "Mines_03[bot1] | Mines_03", - "oneWayType": "TwoWay", - "Name": "Mines_03[bot1]" - }, - { - "sceneName": "Mines_03", - "gateName": "top1", - "logic": "Mines_03[top1] | Mines_03[right1] + RIGHTCLAW | Mines_03 + (LEFTCLAW | (SPIKETUNNELS + WINGS + (FULLDASH | SPELLAIRSTALL + $CASTSPELL[2])))", - "oneWayType": "TwoWay", - "Name": "Mines_03[top1]" - }, - { - "sceneName": "Mines_04", - "gateName": "right1", - "logic": "Mines_04[right1] | Mines_04", - "oneWayType": "TwoWay", - "Name": "Mines_04[right1]" - }, - { - "sceneName": "Mines_04", - "gateName": "top1", - "logic": "Mines_04[top1] + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Mines_04[top1]" - }, - { - "sceneName": "Mines_04", - "gateName": "left1", - "logic": "Mines_04[left1] | Mines_04[top1] | Mines_04 + (LEFTCLAW | WINGS | LEFTDASH + ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Mines_04[left1]" - }, - { - "sceneName": "Mines_04", - "gateName": "left2", - "logic": "Mines_04[left2] | Mines_04", - "oneWayType": "TwoWay", - "Name": "Mines_04[left2]" - }, - { - "sceneName": "Mines_04", - "gateName": "left3", - "logic": "Mines_04[left3] | Mines_04", - "oneWayType": "TwoWay", - "Name": "Mines_04[left3]" - }, - { - "sceneName": "Mines_05", - "gateName": "right1", - "logic": "Mines_05[right1] | Mines_05[left1] | Mines_05[top1] | Mines_05 + (LEFTCLAW | WINGS | RIGHTCLAW + ($SHADESKIP | BACKGROUNDPOGOS))", - "oneWayType": "TwoWay", - "Name": "Mines_05[right1]" - }, - { - "sceneName": "Mines_05", - "gateName": "top1", - "logic": "Mines_05[top1] | Mines_05[left1] | Mines_05[right1] + RIGHTCLAW | Mines_05 + (LEFTCLAW | WINGS | RIGHTCLAW + ($SHADESKIP | BACKGROUNDPOGOS))", - "oneWayType": "TwoWay", - "Name": "Mines_05[top1]" - }, - { - "sceneName": "Mines_05", - "gateName": "bot1", - "logic": "Mines_05[bot1] | Mines_05", - "oneWayType": "TwoWay", - "Name": "Mines_05[bot1]" - }, - { - "sceneName": "Mines_05", - "gateName": "left1", - "logic": "Mines_05[left1] | Mines_05[right1] + RIGHTCLAW | Mines_05[top1] | Mines_05 + (LEFTCLAW | WINGS | RIGHTCLAW + ($SHADESKIP | BACKGROUNDPOGOS))", - "oneWayType": "TwoWay", - "Name": "Mines_05[left1]" - }, - { - "sceneName": "Mines_05", - "gateName": "left2", - "logic": "Mines_05[left2] | Mines_05", - "oneWayType": "TwoWay", - "Name": "Mines_05[left2]" - }, - { - "sceneName": "Mines_06", - "gateName": "right1", - "logic": "Mines_06[right1] | Mines_06[left1]", - "oneWayType": "TwoWay", - "Name": "Mines_06[right1]" - }, - { - "sceneName": "Mines_06", - "gateName": "left1", - "logic": "Mines_06[left1] | Mines_06[right1] + (LEFTSUPERDASH + (ANYCLAW | WINGS) | WINGS + LEFTDASH + BACKGROUNDPOGOS + (LEFTCLAW | PRECISEMOVEMENT | DAMAGEBOOSTS + $TAKEDAMAGE | SPELLAIRSTALL + $CASTSPELL) | BACKGROUNDPOGOS + $SHRIEKPOGO[1,2,NOSTALL])", - "oneWayType": "TwoWay", - "Name": "Mines_06[left1]" - }, - { - "sceneName": "Mines_07", - "gateName": "right1", - "logic": "Mines_07[right1] | Mines_07[left1] + (LANTERN | DARKROOMS)", - "oneWayType": "TwoWay", - "Name": "Mines_07[right1]" - }, - { - "sceneName": "Mines_07", - "gateName": "left1", - "logic": "Mines_07[left1] | Mines_07[right1] + (LANTERN | DARKROOMS)", - "oneWayType": "TwoWay", - "Name": "Mines_07[left1]" - }, - { - "sceneName": "Mines_10", - "gateName": "right1", - "logic": "Mines_10[right1] | Mines_10[bot1] + (RIGHTCLAW + RIGHTSUPERDASH + (LEFTCLAW | RIGHTDASH + WINGS) | RIGHTDASH + $SHRIEKPOGO[3,1] | RIGHTSUPERDASH + $SHRIEKPOGO[3,2] | COMPLEXSKIPS + WINGS + RIGHTDASH + RIGHTSUPERDASH + SPELLAIRSTALL + $SHADESKIP[2HITS] + $CASTSPELL[2])", - "oneWayType": "TwoWay", - "Name": "Mines_10[right1]" - }, - { - "sceneName": "Mines_10", - "gateName": "left1", - "logic": "Mines_10[left1] | Mines_10[bot1] + (LEFTSUPERDASH | WINGS | LEFTDASH)", - "oneWayType": "TwoWay", - "Name": "Mines_10[left1]" - }, - { - "sceneName": "Mines_10", - "gateName": "bot1", - "logic": "Mines_10[bot1] | Mines_10[left1] + (RIGHTSUPERDASH | WINGS + RIGHTDASH | WINGS + LEFTCLAW | FULLCLAW + RIGHTDASH | OBSCURESKIPS + RIGHTSHARPSHADOW + (RIGHTCLAW | SPELLAIRSTALL + $CASTSPELL[2]) | RIGHTCLAW + (RIGHTDASH | WINGS) + SPELLAIRSTALL + $CASTSPELL[2] | $SHRIEKPOGO | COMPLEXSKIPS + DAMAGEBOOSTS + RIGHTDASH + $SHADESKIP + (LEFTCLAW | RIGHTSHARPSHADOW | SPELLAIRSTALL + $CASTSPELL[2]) + $TAKEDAMAGE) | Mines_10[right1] + (LEFTSUPERDASH | WINGS + LEFTDASH + (LEFTCLAW + (SPELLAIRSTALL + $CASTSPELL[2] | OBSCURESKIPS + LEFTSHARPSHADOW) | $SHRIEKPOGO)) + (LEFTCLAW + (LEFTSUPERDASH | WINGS + LEFTDASH) | (LEFTDASH | LEFTSUPERDASH) + $SHRIEKPOGO) + (LEFTSUPERDASH + RIGHTCLAW | WINGS + LEFTDASH)", - "oneWayType": "TwoWay", - "Name": "Mines_10[bot1]" - }, - { - "sceneName": "Mines_11", - "gateName": "right1", - "logic": "Mines_11[right1] | Mines_11", - "oneWayType": "TwoWay", - "Name": "Mines_11[right1]" - }, - { - "sceneName": "Mines_11", - "gateName": "top1", - "logic": "Mines_11[top1] | Mines_11 + (ANYCLAW | WINGS | ENEMYPOGOS)", - "oneWayType": "TwoWay", - "Name": "Mines_11[top1]" - }, - { - "sceneName": "Mines_11", - "gateName": "bot1", - "logic": "Mines_11[bot1] | Mines_11", - "oneWayType": "TwoWay", - "Name": "Mines_11[bot1]" - }, - { - "sceneName": "Mines_13", - "gateName": "right1", - "logic": "Mines_13[right1] | (Mines_13[bot1] + (ANYCLAW | WINGS)) | Mines_13[top1]", - "oneWayType": "TwoWay", - "Name": "Mines_13[right1]" - }, - { - "sceneName": "Mines_13", - "gateName": "top1", - "logic": "NONE", - "oneWayType": "OneWayOut", - "Name": "Mines_13[top1]" - }, - { - "sceneName": "Mines_13", - "gateName": "bot1", - "logic": "Mines_13[bot1] | Mines_13[top1] | Mines_13[right1]", - "oneWayType": "TwoWay", - "Name": "Mines_13[bot1]" - }, - { - "sceneName": "Mines_16", - "gateName": "top1", - "logic": "Mines_16[top1]", - "oneWayType": "TwoWay", - "Name": "Mines_16[top1]" - }, - { - "sceneName": "Mines_17", - "gateName": "right1", - "logic": "Mines_17[right1] | Mines_17[left1]", - "oneWayType": "TwoWay", - "Name": "Mines_17[right1]" - }, - { - "sceneName": "Mines_17", - "gateName": "left1", - "logic": "Mines_17[left1] | Mines_17[right1]", - "oneWayType": "TwoWay", - "Name": "Mines_17[left1]" - }, - { - "sceneName": "Mines_18", - "gateName": "top1", - "logic": "Mines_18[top1] + (ANYCLAW | WINGS) | Mines_18 + (ANYCLAW + WINGS | $SHRIEKPOGO[before:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "Mines_18[top1]" - }, - { - "sceneName": "Mines_18", - "gateName": "left1", - "logic": "Mines_18[left1] | Mines_18 | Bench-Crystal_Guardian", - "oneWayType": "TwoWay", - "Name": "Mines_18[left1]" - }, - { - "sceneName": "Mines_18", - "gateName": "right1", - "logic": "Mines_18[right1] | Mines_18", - "oneWayType": "TwoWay", - "Name": "Mines_18[right1]" - }, - { - "sceneName": "Mines_19", - "gateName": "left1", - "logic": "Mines_19[left1] | Mines_19[right1]", - "oneWayType": "TwoWay", - "Name": "Mines_19[left1]" - }, - { - "sceneName": "Mines_19", - "gateName": "right1", - "logic": "Mines_19[right1] | Mines_19[left1]", - "oneWayType": "TwoWay", - "Name": "Mines_19[right1]" - }, - { - "sceneName": "Mines_20", - "gateName": "left1", - "logic": "Mines_20[left1] | Mines_20", - "oneWayType": "TwoWay", - "Name": "Mines_20[left1]" - }, - { - "sceneName": "Mines_20", - "gateName": "left2", - "logic": "Mines_20[left2] | Mines_20", - "oneWayType": "TwoWay", - "Name": "Mines_20[left2]" - }, - { - "sceneName": "Mines_20", - "gateName": "left3", - "logic": "Mines_20[left3] | Mines_20 | Mines_20[bot1] | Mines_20[left2] | Mines_20[right2]", - "oneWayType": "TwoWay", - "Name": "Mines_20[left3]" - }, - { - "sceneName": "Mines_20", - "gateName": "bot1", - "logic": "Mines_20[bot1] | Mines_20 | Mines_20[left3] | Mines_20[left2] | Mines_20[right2]", - "oneWayType": "TwoWay", - "Name": "Mines_20[bot1]" - }, - { - "sceneName": "Mines_20", - "gateName": "right1", - "logic": "Mines_20[right1] | Mines_20 + (RIGHTCLAW + BACKGROUNDPOGOS | LEFTDASH + LEFTCLAW + BACKGROUNDPOGOS | WINGS)", - "oneWayType": "TwoWay", - "Name": "Mines_20[right1]" - }, - { - "sceneName": "Mines_20", - "gateName": "right2", - "logic": "Mines_20[right2] | Mines_20", - "oneWayType": "TwoWay", - "Name": "Mines_20[right2]" - }, - { - "sceneName": "Mines_23", - "gateName": "left1", - "logic": "Mines_23[left1] | Mines_23[right1] + (LEFTDASH | WINGS | LEFTSUPERDASH | LEFTCLAW | PRECISEMOVEMENT | ENEMYPOGOS) | Mines_23[top1] | Mines_23[right2] + (LEFTDASH | WINGS | (LEFTCLAW + LEFTSUPERDASH))", - "oneWayType": "TwoWay", - "Name": "Mines_23[left1]" - }, - { - "sceneName": "Mines_23", - "gateName": "right1", - "logic": "Mines_23[right1] | Mines_23[top1] + (RIGHTDASH | WINGS | (RIGHTSUPERDASH + RIGHTCLAW)) | Mines_23[left1] + (WINGS | (RIGHTDASH + RIGHTCLAW) | (RIGHTSUPERDASH + FULLCLAW)) | Mines_23[right2] + (WINGS | (FULLCLAW + FULLSUPERDASH) | (RIGHTCLAW + FULLDASH))", - "oneWayType": "TwoWay", - "Name": "Mines_23[right1]" - }, - { - "sceneName": "Mines_23", - "gateName": "right2", - "logic": "Mines_23[right2] | Mines_23[right1] | Mines_23[top1] + (RIGHTDASH | (RIGHTSUPERDASH + RIGHTCLAW) | WINGS) | Mines_23[left1] + (RIGHTDASH | WINGS | (RIGHTCLAW + RIGHTSUPERDASH))", - "oneWayType": "TwoWay", - "Name": "Mines_23[right2]" - }, - { - "sceneName": "Mines_23", - "gateName": "top1", - "logic": "NONE", - "oneWayType": "OneWayOut", - "Name": "Mines_23[top1]" - }, - { - "sceneName": "Mines_24", - "gateName": "left1", - "logic": "Mines_24[left1]", - "oneWayType": "TwoWay", - "Name": "Mines_24[left1]" - }, - { - "sceneName": "Mines_25", - "gateName": "left1", - "logic": "Mines_25[left1] | Mines_25[top1]", - "oneWayType": "TwoWay", - "Name": "Mines_25[left1]" - }, - { - "sceneName": "Mines_25", - "gateName": "top1", - "logic": "Mines_25[top1] + (WINGS + (ANYCLAW | PRECISEMOVEMENT) | ANYCLAW + ENEMYPOGOS + COMPLEXSKIPS) | Mines_25[left1] + (LEFTCLAW | WINGS + RIGHTCLAW | ENEMYPOGOS + BACKGROUNDPOGOS + $SHRIEKPOGO[5]) + (WINGS | ENEMYPOGOS + COMPLEXSKIPS)", - "oneWayType": "TwoWay", - "Name": "Mines_25[top1]" - }, - { - "sceneName": "Mines_28", - "gateName": "left1", - "logic": "Mines_28[left1] | Mines_28[door1] + (LEFTSUPERDASH | WINGS + LEFTDASH | LEFTCLAW + LEFTDASH + PRECISEMOVEMENT + (RIGHTCLAW | LEFTSLASH + DIFFICULTSKIPS) | SPELLAIRSTALL + (WINGS + $CASTSPELL | LEFTDASH + $CASTSPELL[2]) | $SHRIEKPOGO)", - "oneWayType": "TwoWay", - "Name": "Mines_28[left1]" - }, - { - "sceneName": "Mines_28", - "gateName": "bot1", - "logic": "Mines_28[bot1] | Mines_28[left1] | Mines_28[door1]", - "oneWayType": "OneWayIn", - "Name": "Mines_28[bot1]" - }, - { - "sceneName": "Mines_28", - "gateName": "door1", - "logic": "Mines_28[door1] | Mines_28[left1] + (RIGHTSUPERDASH | WINGS + RIGHTDASH | SPELLAIRSTALL + (WINGS + $CASTSPELL[before:AREASOUL] | RIGHTDASH + $CASTSPELL[2,before:AREASOUL]) | $SHRIEKPOGO[before:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "Mines_28[door1]" - }, - { - "sceneName": "Mines_29", - "gateName": "left1", - "logic": "Mines_29[left1] | Mines_29[right1] | Mines_29[right2] | Bench-Peak_Dark_Room", - "oneWayType": "TwoWay", - "Name": "Mines_29[left1]" - }, - { - "sceneName": "Mines_29", - "gateName": "right1", - "logic": "Mines_29[right1] | Mines_29[left1] | Mines_29[right2]", - "oneWayType": "TwoWay", - "Name": "Mines_29[right1]" - }, - { - "sceneName": "Mines_29", - "gateName": "right2", - "logic": "Mines_29[right2] | Mines_29[left1] | Mines_29[right1]", - "oneWayType": "TwoWay", - "Name": "Mines_29[right2]" - }, - { - "sceneName": "Mines_30", - "gateName": "left1", - "logic": "Mines_30[left1] | Mines_30[right1] + LEFTSUPERDASH", - "oneWayType": "TwoWay", - "Name": "Mines_30[left1]" - }, - { - "sceneName": "Mines_30", - "gateName": "right1", - "logic": "Mines_30[right1] | Mines_30[left1] + RIGHTSUPERDASH", - "oneWayType": "TwoWay", - "Name": "Mines_30[right1]" - }, - { - "sceneName": "Mines_31", - "gateName": "left1", - "logic": "Mines_31[left1]", - "oneWayType": "TwoWay", - "Name": "Mines_31[left1]" - }, - { - "sceneName": "Mines_32", - "gateName": "bot1", - "logic": "Mines_32[bot1]", - "oneWayType": "TwoWay", - "Name": "Mines_32[bot1]" - }, - { - "sceneName": "Mines_33", - "gateName": "right1", - "logic": "Mines_33[right1] | Mines_33[left1] + LANTERN", - "oneWayType": "TwoWay", - "Name": "Mines_33[right1]" - }, - { - "sceneName": "Mines_33", - "gateName": "left1", - "logic": "Mines_33[left1] | Mines_33[right1] + LANTERN", - "oneWayType": "TwoWay", - "Name": "Mines_33[left1]" - }, - { - "sceneName": "Mines_34", - "gateName": "bot1", - "logic": "Mines_34[bot1]", - "oneWayType": "TwoWay", - "Name": "Mines_34[bot1]" - }, - { - "sceneName": "Mines_34", - "gateName": "bot2", - "logic": "Mines_34[bot2] | Mines_34[bot1] + ((LEFTCLAW | RIGHTCLAW + WINGS) + (WINGS | FULLSUPERDASH | FULLDASH) | $SHRIEKPOGO[before:AREASOUL]) | $StartLocation[Hallownest's Crown]", - "oneWayType": "OneWayIn", - "Name": "Mines_34[bot2]" - }, - { - "sceneName": "Mines_34", - "gateName": "left1", - "logic": "Mines_34[left1] | Mines_34[bot1] + ((LEFTCLAW | RIGHTCLAW + WINGS) + (WINGS | FULLSUPERDASH | FULLDASH) + (LEFTSUPERDASH | WINGS + LEFTDASH) | $SHRIEKPOGO[1,2,before:AREASOUL,NOSTALL]) | $StartLocation[Hallownest's Crown] + (LEFTSUPERDASH | WINGS + LEFTDASH | $SHRIEKPOGO[2,NOSTALL])", - "oneWayType": "OneWayIn", - "Name": "Mines_34[left1]" - }, - { - "sceneName": "Mines_35", - "gateName": "left1", - "logic": "Mines_35[left1]", - "oneWayType": "TwoWay", - "Name": "Mines_35[left1]" - }, - { - "sceneName": "Mines_36", - "gateName": "right1", - "logic": "Mines_36[right1]", - "oneWayType": "TwoWay", - "Name": "Mines_36[right1]" - }, - { - "sceneName": "Mines_37", - "gateName": "bot1", - "logic": "Mines_37[bot1] | Mines_37[top1] + (FULLDASH | FULLSUPERDASH + RIGHTCLAW + OBSCURESKIPS + PRECISEMOVEMENT + COMPLEXSKIPS | DASHSPRINT + OBSCURESKIPS)", - "oneWayType": "TwoWay", - "Name": "Mines_37[bot1]" - }, - { - "sceneName": "Mines_37", - "gateName": "top1", - "logic": "Mines_37[top1] | Mines_37[bot1] + (ANYCLAW | ENEMYPOGOS + $SHRIEKPOGO[before:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "Mines_37[top1]" - }, - { - "sceneName": "Fungus3_04", - "gateName": "left1", - "logic": "Fungus3_04[left1] | Fungus3_04[left2]", - "oneWayType": "TwoWay", - "Name": "Fungus3_04[left1]" - }, - { - "sceneName": "Fungus3_04", - "gateName": "left2", - "logic": "Fungus3_04[left2] | Fungus3_04[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_04[left2]" - }, - { - "sceneName": "Fungus3_04", - "gateName": "right1", - "logic": "Fungus3_04[right1] | Fungus3_04", - "oneWayType": "TwoWay", - "Name": "Fungus3_04[right1]" - }, - { - "sceneName": "Fungus3_04", - "gateName": "right2", - "logic": "Fungus3_04[right2] | Fungus3_04", - "oneWayType": "TwoWay", - "Name": "Fungus3_04[right2]" - }, - { - "sceneName": "Fungus3_05", - "gateName": "left1", - "logic": "Fungus3_05[left1] | Fungus3_05[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_05[left1]" - }, - { - "sceneName": "Fungus3_05", - "gateName": "right1", - "logic": "Fungus3_05[right1] | Fungus3_05[left1] + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Fungus3_05[right1]" - }, - { - "sceneName": "Fungus3_05", - "gateName": "right2", - "logic": "Fungus3_05[right2] | (Fungus3_05[left1] | Fungus3_05[right1]) + (WINGS | (LEFTDASH | RIGHTCLAW + LEFTSUPERDASH) + (RIGHTDASH | RIGHTSUPERDASH))", - "oneWayType": "TwoWay", - "Name": "Fungus3_05[right2]" - }, - { - "sceneName": "Fungus3_08", - "gateName": "left1", - "logic": "Fungus3_08[left1] | Fungus3_08[right1] | Fungus3_08[top1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_08[left1]" - }, - { - "sceneName": "Fungus3_08", - "gateName": "right1", - "logic": "Fungus3_08[right1] | Fungus3_08[left1] | Fungus3_08[top1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_08[right1]" - }, - { - "sceneName": "Fungus3_08", - "gateName": "top1", - "logic": "Fungus3_08[top1] + (LEFTCLAW | WINGS + (ANYCLAW | PRECISEMOVEMENT)) | (Fungus3_08[right1] | Fungus3_08[left1]) + (LEFTCLAW | (WINGS + (RIGHTCLAW | ENEMYPOGOS)))", - "oneWayType": "TwoWay", - "Name": "Fungus3_08[top1]" - }, - { - "sceneName": "Fungus3_10", - "gateName": "top1", - "logic": "Fungus3_10[top1] | Fungus3_10[bot1] + (FULLDASH | WINGS) + Defeated_West_Queen's_Gardens_Arena", - "oneWayType": "TwoWay", - "Name": "Fungus3_10[top1]" - }, - { - "sceneName": "Fungus3_10", - "gateName": "bot1", - "logic": "Fungus3_10[bot1] | Fungus3_10[top1] + (FULLDASH | WINGS) + Defeated_West_Queen's_Gardens_Arena", - "oneWayType": "TwoWay", - "Name": "Fungus3_10[bot1]" - }, - { - "sceneName": "Fungus3_11", - "gateName": "left1", - "logic": "Fungus3_11[left1] | Fungus3_11", - "oneWayType": "TwoWay", - "Name": "Fungus3_11[left1]" - }, - { - "sceneName": "Fungus3_11", - "gateName": "left2", - "logic": "Fungus3_11[left2] | Fungus3_11", - "oneWayType": "TwoWay", - "Name": "Fungus3_11[left2]" - }, - { - "sceneName": "Fungus3_11", - "gateName": "right1", - "logic": "Fungus3_11[right1] | Fungus3_11", - "oneWayType": "TwoWay", - "Name": "Fungus3_11[right1]" - }, - { - "sceneName": "Fungus3_13", - "gateName": "left1", - "logic": "Fungus3_13[left1] | Fungus3_13[right1] | Fungus3_13 + (LEFTCLAW | WINGS | FULLDASH + DIFFICULTSKIPS + $SHADESKIP[2HITS]) | Fungus3_13[left3] + ENEMYPOGOS", - "oneWayType": "TwoWay", - "Name": "Fungus3_13[left1]" - }, - { - "sceneName": "Fungus3_13", - "gateName": "left2", - "logic": "Fungus3_13[left2] | Fungus3_13 + Opened_Gardens_Stag_Exit", - "oneWayType": "TwoWay", - "Name": "Fungus3_13[left2]" - }, - { - "sceneName": "Fungus3_13", - "gateName": "left3", - "logic": "Fungus3_13[left3] | Fungus3_13[right1] | Fungus3_13[left1] | Fungus3_13 + (LEFTCLAW | WINGS | FULLDASH + DIFFICULTSKIPS + $SHADESKIP[2HITS])", - "oneWayType": "TwoWay", - "Name": "Fungus3_13[left3]" - }, - { - "sceneName": "Fungus3_13", - "gateName": "bot1", - "logic": "Fungus3_13[bot1] | Fungus3_13", - "oneWayType": "TwoWay", - "Name": "Fungus3_13[bot1]" - }, - { - "sceneName": "Fungus3_13", - "gateName": "right1", - "logic": "Fungus3_13[right1] | Fungus3_13[left1] | Fungus3_13 + (LEFTCLAW | WINGS | FULLDASH + DIFFICULTSKIPS + $SHADESKIP[2HITS]) | Fungus3_13[left3] + ENEMYPOGOS", - "oneWayType": "TwoWay", - "Name": "Fungus3_13[right1]" - }, - { - "sceneName": "Fungus3_21", - "gateName": "right1", - "logic": "Fungus3_21[right1] | Fungus3_21[top1] + RIGHTDASH", - "oneWayType": "TwoWay", - "Name": "Fungus3_21[right1]" - }, - { - "sceneName": "Fungus3_21", - "gateName": "top1", - "logic": "Fungus3_21[top1] | Fungus3_21[right1] + LEFTDASH + (RIGHTCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Fungus3_21[top1]" - }, - { - "sceneName": "Fungus3_22", - "gateName": "right1", - "logic": "Fungus3_22[right1] | Fungus3_22 + (RIGHTCLAW | WINGS | LEFTCLAW + BACKGROUNDPOGOS)", - "oneWayType": "TwoWay", - "Name": "Fungus3_22[right1]" - }, - { - "sceneName": "Fungus3_22", - "gateName": "left1", - "logic": "Fungus3_22[left1] | Fungus3_22", - "oneWayType": "TwoWay", - "Name": "Fungus3_22[left1]" - }, - { - "sceneName": "Fungus3_22", - "gateName": "bot1", - "logic": "Fungus3_22[bot1] | Fungus3_22", - "oneWayType": "TwoWay", - "Name": "Fungus3_22[bot1]" - }, - { - "sceneName": "Fungus3_23", - "gateName": "right1", - "logic": "Fungus3_23[right1] | Fungus3_23[left1] + RIGHTSHADOWDASH + Defeated_Traitor_Lord", - "oneWayType": "TwoWay", - "Name": "Fungus3_23[right1]" - }, - { - "sceneName": "Fungus3_23", - "gateName": "left1", - "logic": "Fungus3_23[left1] | Fungus3_23[right1] + LEFTSHADOWDASH + (ANYCLAW | WINGS) + Defeated_Traitor_Lord", - "oneWayType": "TwoWay", - "Name": "Fungus3_23[left1]" - }, - { - "sceneName": "Fungus3_34", - "gateName": "right1", - "logic": "Fungus3_34[right1] | Fungus3_34", - "oneWayType": "TwoWay", - "Name": "Fungus3_34[right1]" - }, - { - "sceneName": "Fungus3_34", - "gateName": "left1", - "logic": "Fungus3_34[left1] | Fungus3_34 + (LEFTDASH | WINGS | RIGHTCLAW + (LEFTSUPERDASH | BACKGROUNDPOGOS | ENEMYPOGOS) | $SHADESKIP)", - "oneWayType": "TwoWay", - "Name": "Fungus3_34[left1]" - }, - { - "sceneName": "Fungus3_34", - "gateName": "top1", - "logic": "Fungus3_34[top1] + (WINGS | ANYCLAW) | Fungus3_34 + (WINGS | ANYCLAW)", - "oneWayType": "TwoWay", - "Name": "Fungus3_34[top1]" - }, - { - "sceneName": "Fungus3_39", - "gateName": "right1", - "logic": "Fungus3_39[right1] | Fungus3_39[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_39[right1]" - }, - { - "sceneName": "Fungus3_39", - "gateName": "left1", - "logic": "Fungus3_39[left1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_39[left1]" - }, - { - "sceneName": "Fungus3_40", - "gateName": "right1", - "logic": "Fungus3_40[right1] | Fungus3_40[top1] + (RIGHTDASH | WINGS | RIGHTCLAW | LEFTCLAW + RIGHTSUPERDASH | ENEMYPOGOS | $SHADESKIP | SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL,after:ROOMSOUL]) | (Can_Stag + Queen's_Gardens_Stag) | Bench-Gardens_Stag", - "oneWayType": "TwoWay", - "Name": "Fungus3_40[right1]" - }, - { - "sceneName": "Fungus3_40", - "gateName": "top1", - "logic": "Fungus3_40[top1] | (Fungus3_40[right1] | Can_Stag + Queen's_Gardens_Stag | Bench-Gardens_Stag) + (LEFTCLAW | RIGHTCLAW + LEFTSUPERDASH | WINGS | LEFTDASH)", - "oneWayType": "TwoWay", - "Name": "Fungus3_40[top1]" - }, - { - "sceneName": "Fungus3_48", - "gateName": "right1", - "logic": "Fungus3_48[right1] | Fungus3_48[door1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_48[right1]" - }, - { - "sceneName": "Fungus3_48", - "gateName": "right2", - "logic": "Fungus3_48[right2] | Fungus3_48[bot1] + (ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Fungus3_48[right2]" - }, - { - "sceneName": "Fungus3_48", - "gateName": "door1", - "logic": "Fungus3_48[door1] | Fungus3_48[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_48[door1]" - }, - { - "sceneName": "Fungus3_48", - "gateName": "bot1", - "logic": "Fungus3_48[bot1] | Fungus3_48[right2]", - "oneWayType": "TwoWay", - "Name": "Fungus3_48[bot1]" - }, - { - "sceneName": "Fungus3_49", - "gateName": "right1", - "logic": "Fungus3_49[right1]", - "oneWayType": "TwoWay", - "Name": "Fungus3_49[right1]" - }, - { - "sceneName": "Fungus3_50", - "gateName": "right1", - "logic": "Fungus3_50[right1] | Bench-Gardens_Toll", - "oneWayType": "TwoWay", - "Name": "Fungus3_50[right1]" - }, - { - "sceneName": "Room_Queen", - "gateName": "left1", - "logic": "Room_Queen[left1]", - "oneWayType": "TwoWay", - "Name": "Room_Queen[left1]" - }, - { - "sceneName": "Cliffs_01", - "gateName": "right1", - "logic": "Cliffs_01[right1] | Cliffs_01 + ((FULLDASH + ENEMYPOGOS) | LEFTCLAW | (RIGHTCLAW + FULLDASH) | WINGS)", - "oneWayType": "TwoWay", - "Name": "Cliffs_01[right1]" - }, - { - "sceneName": "Cliffs_01", - "gateName": "right2", - "logic": "Cliffs_01[right2] | Cliffs_01[right1] | Cliffs_01 + (FULLDASH + ENEMYPOGOS | ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Cliffs_01[right2]" - }, - { - "sceneName": "Cliffs_01", - "gateName": "right3", - "logic": "Cliffs_01[right3] | Cliffs_01", - "oneWayType": "TwoWay", - "Name": "Cliffs_01[right3]" - }, - { - "sceneName": "Cliffs_01", - "gateName": "right4", - "logic": "Cliffs_01[right4] | Cliffs_01[right1] | Cliffs_01[right2] | Cliffs_01 + (FULLDASH + ENEMYPOGOS | ANYCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "Cliffs_01[right4]" - }, - { - "sceneName": "Cliffs_02", - "gateName": "right1", - "logic": "Cliffs_02[right1] | Cliffs_02 + (RIGHTSUPERDASH | WINGS + RIGHTDASH | $SHRIEKPOGO[2,before:ROOMSOUL,NOSTALL])", - "oneWayType": "OneWayIn", - "Name": "Cliffs_02[right1]" - }, - { - "sceneName": "Cliffs_02", - "gateName": "bot1", - "logic": "Cliffs_02[bot1]", - "oneWayType": "TwoWay", - "Name": "Cliffs_02[bot1]" - }, - { - "sceneName": "Cliffs_02", - "gateName": "bot2", - "logic": "Cliffs_02[bot2] | Cliffs_02 | (Cliffs_02[bot1] + RIGHTCLAW)", - "oneWayType": "OneWayIn", - "Name": "Cliffs_02[bot2]" - }, - { - "sceneName": "Cliffs_02", - "gateName": "door1", - "logic": "Cliffs_02[door1] | Cliffs_02 | Cliffs_02[left1] | Cliffs_02[door1]", - "oneWayType": "TwoWay", - "Name": "Cliffs_02[door1]" - }, - { - "sceneName": "Cliffs_02", - "gateName": "left1", - "logic": "Cliffs_02[left1] | Cliffs_02 | Cliffs_02[left1] | Cliffs_02[door1]", - "oneWayType": "TwoWay", - "Name": "Cliffs_02[left1]" - }, - { - "sceneName": "Cliffs_02", - "gateName": "left2", - "logic": "Cliffs_02[left2] | Cliffs_02 + WINGS + ENEMYPOGOS", - "oneWayType": "TwoWay", - "Name": "Cliffs_02[left2]" - }, - { - "sceneName": "Cliffs_03", - "gateName": "right1", - "logic": "Cliffs_03[right1] | (ALLSTAGS | Stag_Nest_Stag) + Can_Stag", - "oneWayType": "TwoWay", - "Name": "Cliffs_03[right1]" - }, - { - "sceneName": "Cliffs_04", - "gateName": "right1", - "logic": "Cliffs_04[right1] | Cliffs_04[left1] + (DARKROOMS | LANTERN)", - "oneWayType": "TwoWay", - "Name": "Cliffs_04[right1]" - }, - { - "sceneName": "Cliffs_04", - "gateName": "left1", - "logic": "Cliffs_04[left1] | Cliffs_04[right1] + (DARKROOMS | LANTERN) + (ANYCLAW | WINGS | Broke_Cliffs_Dark_Room_Quake_Floor)", - "oneWayType": "TwoWay", - "Name": "Cliffs_04[left1]" - }, - { - "sceneName": "Cliffs_05", - "gateName": "left1", - "logic": "Cliffs_05[left1]", - "oneWayType": "TwoWay", - "Name": "Cliffs_05[left1]" - }, - { - "sceneName": "Cliffs_06", - "gateName": "left1", - "logic": "Cliffs_06[left1]", - "oneWayType": "TwoWay", - "Name": "Cliffs_06[left1]" - }, - { - "sceneName": "Room_nailmaster", - "gateName": "left1", - "logic": "Room_nailmaster[left1] | Bench-Mato", - "oneWayType": "TwoWay", - "Name": "Room_nailmaster[left1]" - }, - { - "sceneName": "White_Palace_01", - "gateName": "left1", - "logic": "White_Palace_01[left1] | White_Palace_01", - "oneWayType": "TwoWay", - "Name": "White_Palace_01[left1]" - }, - { - "sceneName": "White_Palace_01", - "gateName": "right1", - "logic": "White_Palace_01[right1] | White_Palace_01 + (RIGHTDASH | ANYCLAW + RIGHTSUPERDASH | WINGS) | White_Palace_01[top1] + Palace_Entrance_Lantern_Lit", - "oneWayType": "TwoWay", - "Name": "White_Palace_01[right1]" - }, - { - "sceneName": "White_Palace_01", - "gateName": "top1", - "logic": "White_Palace_01[top1] | White_Palace_01 + (RIGHTDASH | ANYCLAW + RIGHTSUPERDASH | WINGS) + Palace_Entrance_Lantern_Lit + (LEFTCLAW | RIGHTCLAW + WINGS)", - "oneWayType": "TwoWay", - "Name": "White_Palace_01[top1]" - }, - { - "sceneName": "White_Palace_02", - "gateName": "left1", - "logic": "White_Palace_02[left1]", - "oneWayType": "TwoWay", - "Name": "White_Palace_02[left1]" - }, - { - "sceneName": "White_Palace_03_hub", - "gateName": "left1", - "logic": "White_Palace_03_hub[left1]", - "oneWayType": "TwoWay", - "Name": "White_Palace_03_hub[left1]" - }, - { - "sceneName": "White_Palace_03_hub", - "gateName": "left2", - "logic": "White_Palace_03_hub[left2] | White_Palace_03_hub", - "oneWayType": "TwoWay", - "Name": "White_Palace_03_hub[left2]" - }, - { - "sceneName": "White_Palace_03_hub", - "gateName": "right1", - "logic": "White_Palace_03_hub[right1] | White_Palace_03_hub + ((RIGHTCLAW + (RIGHTDASH | LEFTCLAW)) | WINGS)", - "oneWayType": "TwoWay", - "Name": "White_Palace_03_hub[right1]" - }, - { - "sceneName": "White_Palace_03_hub", - "gateName": "top1", - "logic": "White_Palace_03_hub[top1] + (ANYCLAW | WINGS) | White_Palace_03_hub + Palace_Atrium_Gates_Opened + (WINGS | FULLCLAW + LEFTSUPERDASH)", - "oneWayType": "TwoWay", - "Name": "White_Palace_03_hub[top1]" - }, - { - "sceneName": "White_Palace_03_hub", - "gateName": "bot1", - "logic": "White_Palace_03_hub[bot1] | White_Palace_03_hub", - "oneWayType": "TwoWay", - "Name": "White_Palace_03_hub[bot1]" - }, - { - "sceneName": "White_Palace_04", - "gateName": "top1", - "logic": "White_Palace_04[top1] + (ANYCLAW | WINGS) | White_Palace_04[right2] + (LEFTDASH | LEFTSUPERDASH + PRECISEMOVEMENT | OBSCURESKIPS + SPRINT) + (WINGS + (ANYCLAW | PRECISEMOVEMENT) | OBSCURESKIPS + FULLCLAW + RIGHTDASH + FULLSUPERDASH)", - "oneWayType": "TwoWay", - "Name": "White_Palace_04[top1]" - }, - { - "sceneName": "White_Palace_04", - "gateName": "right2", - "logic": "White_Palace_04[right2] | White_Palace_04[top1] + WINGS + (RIGHTDASH | RIGHTSUPERDASH | OBSCURESKIPS + SPRINT)", - "oneWayType": "TwoWay", - "Name": "White_Palace_04[right2]" - }, - { - "sceneName": "White_Palace_05", - "gateName": "left1", - "logic": "White_Palace_05[left1] | White_Palace_05[right1] + ((LEFTDASH | WINGS) + (ANYCLAW + WINGS | FULLCLAW) | (RIGHTCLAW | WINGS) + PRECISEMOVEMENT)", - "oneWayType": "TwoWay", - "Name": "White_Palace_05[left1]" - }, - { - "sceneName": "White_Palace_05", - "gateName": "left2", - "logic": "White_Palace_05[left2] | White_Palace_05[right2]", - "oneWayType": "TwoWay", - "Name": "White_Palace_05[left2]" - }, - { - "sceneName": "White_Palace_05", - "gateName": "right1", - "logic": "White_Palace_05[right1] | White_Palace_05[left1] + (RIGHTDASH | WINGS | PRECISEMOVEMENT)", - "oneWayType": "TwoWay", - "Name": "White_Palace_05[right1]" - }, - { - "sceneName": "White_Palace_05", - "gateName": "right2", - "logic": "White_Palace_05[right2] | White_Palace_05[left2]", - "oneWayType": "TwoWay", - "Name": "White_Palace_05[right2]" - }, - { - "sceneName": "White_Palace_06", - "gateName": "left1", - "logic": "White_Palace_06[left1] | White_Palace_06[top1] | White_Palace_06[bot1] | Warp-Path_of_Pain_Complete", - "oneWayType": "TwoWay", - "Name": "White_Palace_06[left1]" - }, - { - "sceneName": "White_Palace_06", - "gateName": "top1", - "logic": "White_Palace_06[top1] | (White_Palace_06[left1] | White_Palace_06[bot1] | Warp-Path_of_Pain_Complete) + (RIGHTCLAW + (WINGS | LEFTCLAW) | LEFTCLAW + $SHRIEKPOGO[before:ROOMSOUL] | $SHRIEKPOGO[2,before:ROOMSOUL,NOLEFTSTALL]) | Bench-Palace_Balcony + (LEFTCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "White_Palace_06[top1]" - }, - { - "sceneName": "White_Palace_06", - "gateName": "bot1", - "logic": "White_Palace_06[bot1] | White_Palace_06[left1] | White_Palace_06[top1] | Warp-Path_of_Pain_Complete | Bench-Palace_Balcony", - "oneWayType": "TwoWay", - "Name": "White_Palace_06[bot1]" - }, - { - "sceneName": "White_Palace_07", - "gateName": "top1", - "logic": "White_Palace_07[top1] | White_Palace_07[bot1] + ((RIGHTCLAW | LEFTCLAW + FULLDASH) + WINGS | $SHRIEKPOGO[2] + BACKGROUNDPOGOS)", - "oneWayType": "TwoWay", - "Name": "White_Palace_07[top1]" - }, - { - "sceneName": "White_Palace_07", - "gateName": "bot1", - "logic": "White_Palace_07[bot1] | White_Palace_07[top1]", - "oneWayType": "TwoWay", - "Name": "White_Palace_07[bot1]" - }, - { - "sceneName": "White_Palace_08", - "gateName": "left1", - "logic": "White_Palace_08[left1] | White_Palace_08[right1]", - "oneWayType": "TwoWay", - "Name": "White_Palace_08[left1]" - }, - { - "sceneName": "White_Palace_08", - "gateName": "right1", - "logic": "White_Palace_08[right1] | White_Palace_08[left1] + (ANYCLAW + WINGS | $SHRIEKPOGO[before:AREASOUL,after:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "White_Palace_08[right1]" - }, - { - "sceneName": "White_Palace_09", - "gateName": "right1", - "logic": "White_Palace_09[right1]", - "oneWayType": "TwoWay", - "Name": "White_Palace_09[right1]" - }, - { - "sceneName": "White_Palace_11", - "gateName": "door2", - "logic": "(White_Palace_11[door2] | Warp-Palace_Grounds_to_White_Palace) + COMBAT[White_Palace_Arenas]", - "oneWayType": "TwoWay", - "Name": "White_Palace_11[door2]" - }, - { - "sceneName": "White_Palace_12", - "gateName": "right1", - "logic": "White_Palace_12[right1] | White_Palace_12[bot1] + (SPIKETUNNELS | RIGHTDASH | (RIGHTSUPERDASH + LEFTCLAW) | WINGS) + RIGHTCLAW + LEFTSUPERDASH", - "oneWayType": "TwoWay", - "Name": "White_Palace_12[right1]" - }, - { - "sceneName": "White_Palace_12", - "gateName": "bot1", - "logic": "White_Palace_12[bot1]", - "oneWayType": "TwoWay", - "Name": "White_Palace_12[bot1]" - }, - { - "sceneName": "White_Palace_13", - "gateName": "right1", - "logic": "White_Palace_13[right1] | (White_Palace_13 | White_Palace_13[left1]) + (RIGHTSUPERDASH | SPIKETUNNELS + RIGHTDASH + (DASHMASTER | SPELLAIRSTALL + $CASTSPELL)) + (WINGS | FULLDASH + RIGHTCLAW)", - "oneWayType": "TwoWay", - "Name": "White_Palace_13[right1]" - }, - { - "sceneName": "White_Palace_13", - "gateName": "left1", - "logic": "White_Palace_13[left1] | White_Palace_13 + (FULLSUPERDASH + (RIGHTCLAW | LEFTCLAW + $SHRIEKPOGO[before:ROOMSOUL] | LEFTDASH + $SHRIEKPOGO[1,2,before:ROOMSOUL] | $SHRIEKPOGO[1,3,before:ROOMSOUL]))", - "oneWayType": "TwoWay", - "Name": "White_Palace_13[left1]" - }, - { - "sceneName": "White_Palace_13", - "gateName": "left2", - "logic": "White_Palace_13[left2] | White_Palace_13 + ((LEFTCLAW + WINGS + (FULLDASH | LEFTSUPERDASH)) | (RIGHTCLAW + FULLDASH + LEFTSUPERDASH))", - "oneWayType": "TwoWay", - "Name": "White_Palace_13[left2]" - }, - { - "sceneName": "White_Palace_13", - "gateName": "left3", - "logic": "White_Palace_13[left3] | White_Palace_13 + WINGS", - "oneWayType": "TwoWay", - "Name": "White_Palace_13[left3]" - }, - { - "sceneName": "White_Palace_14", - "gateName": "bot1", - "logic": "White_Palace_14[bot1] | White_Palace_14[right1] + ((LEFTDASH | LEFTSUPERDASH | WINGS) + (LEFTCLAW | WINGS + RIGHTCLAW) + (LEFTDASH | DANGEROUSSKIPS + DIFFICULTSKIPS) + (LEFTDASH | LEFTSUPERDASH | OBSCURESKIPS + DASHSPRINT) | FULLDASH + $SHRIEKPOGO[before:ROOMSOUL])", - // dangerous + difficult: it is possible to pogo past the large moving saw. Right-to-left, there is no wall to superdash. - // shriek pogo goes through the top route. all others take the lower route. - "oneWayType": "TwoWay", - "Name": "White_Palace_14[bot1]" - }, - { - "sceneName": "White_Palace_14", - "gateName": "right1", - "logic": "White_Palace_14[right1] | White_Palace_14[bot1] + (RIGHTCLAW | WINGS) + (RIGHTDASH | RIGHTSUPERDASH | OBSCURESKIPS + DASHSPRINT) + (RIGHTDASH | LEFTCLAW + RIGHTSUPERDASH | DANGEROUSSKIPS + DIFFICULTSKIPS) + (WINGS | ANYCLAW + RIGHTSUPERDASH | RIGHTCLAW + RIGHTDASH | RIGHTCLAW + SPELLAIRSTALL + $CASTSPELL[3,before:AREASOUL,after:AREASOUL])", - // dangerous + difficult: it is possible to pogo past the large moving saw. - // the required airstalls with dashsprint can be reduced by one by taking the top path, but this is considerably harder. - "oneWayType": "TwoWay", - "Name": "White_Palace_14[right1]" - }, - { - "sceneName": "White_Palace_15", - "gateName": "left1", - "logic": "White_Palace_15[left1] | White_Palace_15[right1] | White_Palace_15[right2] + (LEFTCLAW | WINGS + RIGHTCLAW | $SHRIEKPOGO)", - "oneWayType": "TwoWay", - "Name": "White_Palace_15[left1]" - }, - { - "sceneName": "White_Palace_15", - "gateName": "right1", - "logic": "White_Palace_15[right1] | (White_Palace_15[left1] | White_Palace_15[right2]) + (WINGS + (LEFTCLAW + RIGHTDASH | RIGHTCLAW + LEFTDASH) + $SLOPEBALL[before:AREASOUL,after:ROOMSOUL] | ANYCLAW + $SHRIEKPOGO[2,before:AREASOUL,after:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "White_Palace_15[right1]" - }, - { - "sceneName": "White_Palace_15", - "gateName": "right2", - "logic": "White_Palace_15[right2] | White_Palace_15[right1] | White_Palace_15[left1] + (ANYCLAW | $SHRIEKPOGO[before:AREASOUL])", - "oneWayType": "TwoWay", - "Name": "White_Palace_15[right2]" - }, - { - "sceneName": "White_Palace_16", - "gateName": "left1", - "logic": "White_Palace_16[left1] | White_Palace_16[left2] + (FULLCLAW | WINGS)", - "oneWayType": "TwoWay", - "Name": "White_Palace_16[left1]" - }, - { - "sceneName": "White_Palace_16", - "gateName": "left2", - "logic": "White_Palace_16[left2] | White_Palace_16[left1]", - "oneWayType": "TwoWay", - "Name": "White_Palace_16[left2]" - }, - { - "sceneName": "White_Palace_17", - "gateName": "right1", - "logic": "White_Palace_17[right1] | White_Palace_17[bot1] + Lever-Path_of_Pain", - "oneWayType": "TwoWay", - "Name": "White_Palace_17[right1]" - }, - { - "sceneName": "White_Palace_17", - "gateName": "bot1", - "logic": "White_Palace_17[bot1]", - "oneWayType": "TwoWay", - "Name": "White_Palace_17[bot1]" - }, - { - "sceneName": "White_Palace_18", - "gateName": "top1", - "logic": "White_Palace_18[top1] + (LEFTCLAW | WINGS) | White_Palace_18[right1] + FULLDASH + FULLCLAW + WINGS + FULLSUPERDASH", - "oneWayType": "TwoWay", - "Name": "White_Palace_18[top1]" - }, - { - "sceneName": "White_Palace_18", - "gateName": "right1", - "logic": "White_Palace_18[right1] | White_Palace_18[top1] + FULLDASH + FULLCLAW + WINGS + FULLSUPERDASH", - "oneWayType": "TwoWay", - "Name": "White_Palace_18[right1]" - }, - { - "sceneName": "White_Palace_19", - "gateName": "top1", - "logic": "White_Palace_19[top1] | White_Palace_19[left1] + FULLDASH + FULLCLAW + FULLSUPERDASH + WINGS", - "oneWayType": "TwoWay", - "Name": "White_Palace_19[top1]" - }, - { - "sceneName": "White_Palace_19", - "gateName": "left1", - "logic": "White_Palace_19[left1] | White_Palace_19[top1] + RIGHTDASH + (RIGHTCLAW + WINGS | (RIGHTCLAW | WINGS) + PRECISEMOVEMENT | DIFFICULTSKIPS + DANGEROUSSKIPS)", - "oneWayType": "TwoWay", - "Name": "White_Palace_19[left1]" - }, - { - "sceneName": "White_Palace_20", - "gateName": "bot1", - "logic": "White_Palace_20[bot1]", - "oneWayType": "TwoWay", - "Name": "White_Palace_20[bot1]" - } -] diff --git a/RandomizerMod/Resources/Logic/waypoints.json b/RandomizerMod/Resources/Logic/waypoints.json deleted file mode 100644 index 684652a..0000000 --- a/RandomizerMod/Resources/Logic/waypoints.json +++ /dev/null @@ -1,1347 +0,0 @@ -[ - { - "name": "Start_State", - "logic": "$DEFAULTSTATE | Can_Bench + $WARPTOSTART + WARPTOSTARTFLOWERHANDLING" - }, - { - "name": "Can_Replenish_Geo", - "logic": "Tutorial_01 | $ANY + Can_Replenish_Geo-Crossroads | Fungus1_01[right1] | Fungus2_03[left1] | Fungus2_06[top1] | Fungus2_12[left1] | Fungus2_14[top1] | Deepnest_41[left1] + (DARKROOMS | LANTERN) | Ruins1_01[left1] | Ruins1_17[right1] | Ruins2_04[right2] | Ruins2_06[right2] | Abyss_04[left1] | Abyss_12[right1] | Fungus3_40[top1] | Mines_02[left1] | Cliffs_02[left1] | Deepnest_East_01[bot1] | Deepnest_East_03[left1] | Deepnest_East_07[left2] | Deepnest_East_08[top1] | Waterways_02[top1] | Waterways_01[right1] | Waterways_04b[left1]", - "Stateless": true - }, - { - "name": "Can_Replenish_Geo-Crossroads", - "logic": "Crossroads_01[top1] | Crossroads_03 | Crossroads_04[door1] | Crossroads_05[left1] | Crossroads_07 | Crossroads_08 | Crossroads_11_alt[left1] + INFECTED | Crossroads_12[right1] + INFECTED | Crossroads_13[left1] | Crossroads_15[left1] | Crossroads_16[left1] | Crossroads_19 | Crossroads_21 | Crossroads_22[bot1] | Crossroads_25[right1] | Crossroads_27 | Crossroads_35[right1] | Crossroads_37[right1] | Crossroads_39[left1] | Crossroads_40[left1] | Crossroads_42[left1] | Crossroads_48[left1] | Crossroads_ShamanTemple[left1]", - "Stateless": true - }, - { - "name": "Rescued_Sly", - "logic": "Room_ruinhouse[left1]", - "Stateless": true - }, - { - "name": "Rescued_Bretta", - "logic": "Fungus2_23 + (FULLCLAW + FULLDASH | FULLCLAW + FULLSUPERDASH | LEFTCLAW + WINGS | RIGHTCLAW + ENEMYPOGOS + WINGS | COMPLEXSKIPS + DAMAGEBOOSTS + FULLCLAW + $SHADESKIP[2HITS] + SPELLAIRSTALL + $CASTSPELL[1,1,before:ROOMSOUL] + $TAKEDAMAGE[2])", - "Stateless": true - }, - { - "name": "Rescued_Deepnest_Zote", - "logic": "Deepnest_33[top1]", - "Stateless": true - }, - { - "name": "Defeated_Colosseum_Zote", - "logic": "Room_Colosseum_01[left1] + Rescued_Deepnest_Zote + Defeated_Colosseum_1", - "Stateless": true - }, - { - "name": "Lever-Shade_Soul", - "logic": "Ruins1_31b[right1] | Ruins1_31b[right2] + Defeated_Elegant_Warrior", - "Stateless": true - }, - { - "name": "Lever-City_Fountain", - "logic": "Ruins1_27[right1] | Ruins1_27[left1] + (RIGHTCLAW + (WINGS | $SLOPEBALL[before:AREASOUL,after:ROOMSOUL]) | LEFTCLAW + RIGHTSUPERDASH + $SHRIEKPOGO[before:AREASOUL,after:AREASOUL] | LEFTCLAW + RIGHTDASH + $SHRIEKPOGO[1,1,before:AREASOUL,after:AREASOUL] | RIGHTDASH + PRECISEMOVEMENT + $SHRIEKPOGO[3,before:AREASOUL,after:AREASOUL] | $SHRIEKPOGO[4,before:AREASOUL,after:AREASOUL,NOLEFTSTALL])", - "Stateless": true - }, - { - "name": "Lever-Path_of_Pain", - "logic": "White_Palace_17[bot1] + (FULLDASH + FULLCLAW + WINGS | FULLDASH + (LEFTCLAW + $SHRIEKPOGO[1,2,NOSTALL] | RIGHTCLAW + $SHRIEKPOGO[2,NOSTALL]))", - "Stateless": true - }, - { - "name": "Completed_Path_of_Pain", - "logic": "White_Palace_20[bot1] + (FULLCLAW + RIGHTDASH + WINGS | RIGHTDASH + PRECISEMOVEMENT + DANGEROUSSKIPS + $SHRIEKPOGO[1,1,before:AREASOUL]) + Defeated_Path_of_Pain_Arena", - "Stateless": true - }, - { - "name": "Lever-Dung_Defender", - "logic": "Waterways_05[bot1] + (ANYCLAW | WINGS) + Defeated_Dung_Defender | Waterways_05[bot2] | Waterways_05[right1]", - "Stateless": true - }, - { - "name": "Warp-Lifeblood_Core_to_Abyss", - "logic": "Abyss_08[right1] + (PRECISEMOVEMENT | LEFTDASH)" - }, - { - "name": "Warp-Palace_Grounds_to_White_Palace", - "logic": "Abyss_05 + AWOKEN" - }, - { - "name": "Warp-White_Palace_Entrance_to_Palace_Grounds", - "logic": "White_Palace_11[door2] + COMBAT[White_Palace_Arenas]" - }, - { - "name": "Warp-White_Palace_Atrium_to_Palace_Grounds", - "logic": "White_Palace_03_hub[left1] | White_Palace_03_hub[top1] + Palace_Atrium_Gates_Opened | White_Palace_03_hub[right1] + Palace_Atrium_Gates_Opened | White_Palace_03_hub + (PRECISEMOVEMENT | LEFTCLAW | LEFTDASH | LEFTSUPERDASH | WINGS)" - }, - { - "name": "Warp-Path_of_Pain_Complete", - "logic": "White_Palace_20[bot1] + Completed_Path_of_Pain" - }, - { - "name": "Upper_Tram", - "logic": "TRAM + (Crossroads_46[left1] | Crossroads_46b[right1]) | Bench-Upper_Tram" - }, - { - "name": "Lower_Tram", - "logic": "TRAM + (Abyss_03 | Abyss_03_b | Abyss_03_c) | Bench-Lower_Tram" - }, - { - "name": "Left_Elevator", - "logic": "(Crossroads_49[left1] | Crossroads_49[right1] | Crossroads_49b[right1]) + (Crossroads_49b[right1]/ + NONRANDOMELEVATORS | Elevator_Pass)" - }, - { - "name": "Right_Elevator", - "logic": "(Ruins2_10[right1] | Ruins2_10[left1] | Ruins2_10b[right1] | Ruins2_10b[right2] | Ruins2_10b[left1]) + (NONRANDOMELEVATORS | Elevator_Pass)" - }, - { - "name": "Crossroads_Hot_Spring", - "logic": "Crossroads_30[left1] + $HOTSPRINGRESET" - }, - { - "name": "Deepnest_Hot_Spring", - "logic": "Deepnest_30[left1] + $HOTSPRINGRESET" - }, - { - "name": "Colosseum_Hot_Spring", - "logic": "(Room_Colosseum_02[top1] | Room_Colosseum_02[top2]) + $HOTSPRINGRESET" - }, - { - "name": "Pleasure_House_Hot_Spring", - "logic": "(Ruins_Bathhouse[door1] | Ruins_Bathhouse[right1]) + $HOTSPRINGRESET" - }, - { - "name": "Defeated_Gruz_Mother", - "logic": "(Crossroads_04[left1] | Crossroads_04[top1] | Crossroads_04[door_Mender_House] | Crossroads_04[door1] | Crossroads_04[door_charmshop] | Crossroads_04[right1]) + COMBAT[Gruz_Mother]", - "Stateless": true - }, - { - "name": "Defeated_False_Knight", - "logic": "(Crossroads_10[right1] | Crossroads_10[left1] + (ANYCLAW | WINGS)) + COMBAT[False_Knight]", - "Stateless": true - }, - { - "name": "Defeated_Brooding_Mawlek", - "logic": "(Crossroads_09[left1] | Crossroads_09[right1]) + COMBAT[Brooding_Mawlek]", - "Stateless": true - }, - { - "name": "Defeated_Hornet_1", - "logic": "Fungus1_04[right1] + COMBAT[Hornet_1]", - "Stateless": true - }, - { - "name": "Defeated_Mantis_Lords", - "logic": "(Fungus2_15[top3] | Fungus2_15[right1] | Fungus2_15[left1]) + COMBAT[Mantis_Lords]", - "Stateless": true - }, - { - "name": "Defeated_Sanctum_Warrior", - "logic": "(Ruins1_23[top1] | Ruins1_23 + (LEFTCLAW | WINGS | RIGHTCLAW + LEFTSUPERDASH + (BACKGROUNDPOGOS | OBSCURESKIPS))) + COMBAT[Sanctum_Warrior]", - "Stateless": true - }, - { - "name": "Defeated_Soul_Master", - "logic": "Ruins1_24[right1] + COMBAT[Soul_Master]", - "Stateless": true - }, - { - "name": "Defeated_Elegant_Warrior", - "logic": "(Ruins1_31b[right1] | Ruins1_31b[right2]) + COMBAT[Elegant_Warrior]", - "Stateless": true - }, - { - "name": "Defeated_Crystal_Guardian", - "logic": "(Mines_18[left1] | Mines_18[right1] | Mines_18[top1]) + (SIDESLASH | UPSLASH | GREATSLASH | CYCLONE | ANYDASHSLASH) + COMBAT[Crystal_Guardian]", - "Stateless": true - }, - { - "name": "Defeated_Enraged_Guardian", - "logic": "Mines_32[bot1] + Defeated_Crystal_Guardian + COMBAT[Enraged_Guardian]", - "Stateless": true - }, - { - "name": "Defeated_Flukemarm", - "logic": "Waterways_12[right1] + (SWIM | LEFTSUPERDASH | ACIDSKIPS + LEFTDASH + $SHRIEKPOGO[4,before:AREASOUL]) + COMBAT[Flukemarm]", - "Stateless": true - }, - { - "name": "Defeated_Dung_Defender", - "logic": "Waterways_05[bot1] + (ANYCLAW | WINGS) + COMBAT[Dung_Defender]", - "Stateless": true - }, - { - "name": "Defeated_Broken_Vessel", - "logic": "Abyss_19[bot1] + (ANYCLAW | WINGS) + COMBAT[Broken_Vessel]", - "Stateless": true - }, - { - "name": "Defeated_Hornet_2", - "logic": "Deepnest_East_Hornet[left1] + COMBAT[Hornet_2]", - "Stateless": true - }, - { - "name": "Defeated_Watcher_Knights", - "logic": "(Ruins2_03[bot1] | Ruins2_03[top1]) + COMBAT[Watcher_Knights]", - "Stateless": true - }, - { - "name": "Defeated_Uumuu", - "logic": "Uumuu_Arena + COMBAT[Uumuu]", - "Stateless": true - }, - { - "name": "Uumuu_Arena", - "logic": "Fungus3_archive_02[top1] + (ANYSUPERDASH | ACID | ACIDSKIPS + (LEFTDASH + LEFTCLAW + WINGS | LEFTDASH + $SHRIEKPOGO[before:ROOMSOUL] | RIGHTDASH + $SHRIEKPOGO[2,before:ROOMSOUL] | ANYCLAW + $SHRIEKPOGO[2,before:ROOMSOUL] | $SHRIEKPOGO[3,before:ROOMSOUL]))" - }, - { - "name": "Defeated_Nosk", - "logic": "Deepnest_32[left1] + COMBAT[Nosk]", - "Stateless": true - }, - { - "name": "Defeated_Traitor_Lord", - "logic": "(Fungus3_23[left1] + ANYSHADOWDASH | Fungus3_23[right1] + LEFTSHADOWDASH + (ANYCLAW | WINGS)) + COMBAT[Traitor_Lord]", - "Stateless": true - }, - { - "name": "Defeated_Grimm", - "logic": "Grimm_Main_Tent[left1] + GRIMMCHILD + 6FLAMES + COMBAT[Grimm]", - "Stateless": true - }, - { - "name": "Defeated_Collector", - "logic": "Ruins2_11[right1] + (LEFTCLAW | RIGHTCLAW + (RIGHTDASH | PRECISEMOVEMENT) | WINGS) + COMBAT[Collector]", - "Stateless": true - }, - { - "name": "Defeated_Hive_Knight", - "logic": "Hive_05[left1] + COMBAT[Hive_Knight]", - "Stateless": true - }, - { - "name": "Defeated_Pale_Lurker", - "logic": "GG_Lurker[left1] + (SWIM | RIGHTDASH | WINGS | (LEFTCLAW + FULLSUPERDASH)) + RIGHTCLAW + COMBAT[Pale_Lurker]", - "Stateless": true - }, - { - "name": "Defeated_Elder_Hu", - "logic": "Fungus2_32[left1] + DREAMNAIL + COMBAT[Elder_Hu]", - "Stateless": true - }, - { - "name": "Defeated_Xero", - "logic": "(RestingGrounds_02[top1] | RestingGrounds_02 + (ANYCLAW | WINGS | RIGHTSUPERDASH | BACKGROUNDPOGOS)) + DREAMNAIL + COMBAT[Xero]", - "Stateless": true - }, - { - "name": "Defeated_Gorb", - "logic": "Cliffs_02 + DREAMNAIL + COMBAT[Gorb]", - "Stateless": true - }, - { - "name": "Defeated_Marmu", - "logic": "(Fungus3_40[top1] | Fungus3_40[right1] + (LEFTCLAW | RIGHTCLAW + LEFTSUPERDASH | WINGS | LEFTDASH)) + DREAMNAIL + COMBAT[Marmu]", - "Stateless": true - }, - { - "name": "Defeated_No_Eyes", - "logic": "(Fungus1_35[left1] | Fungus1_35[right1]) + LANTERN + DREAMNAIL + COMBAT[No_Eyes]", - "Stateless": true - }, - { - "name": "Defeated_Galien", - "logic": "Deepnest_40[right1] + DREAMNAIL + COMBAT[Galien]", - "Stateless": true - }, - { - "name": "Defeated_Markoth", - "logic": "Deepnest_East_10[left1] + DREAMNAIL + COMBAT[Markoth]", - "Stateless": true - }, - { - "name": "Defeated_Failed_Champion", - "logic": "(Crossroads_10[left1] | Crossroads_10[right1]) + Defeated_False_Knight + (ANYCLAW | WINGS + INFECTED | $SHRIEKPOGO[2,before:AREASOUL]) + (WINGS | LEFTDASH | LEFTSUPERDASH) + DREAMNAIL + COMBAT[Failed_Champion]", - "Stateless": true - }, - { - "name": "Defeated_Soul_Tyrant", - "logic": "(Ruins1_24[right1] | Ruins1_24[left1]) + Defeated_Soul_Master + (LEFTCLAW + PRECISEMOVEMENT | WINGS | LEFTDASH) + DREAMNAIL + COMBAT[Soul_Tyrant]", - "Stateless": true - }, - { - "name": "Defeated_Lost_Kin", - "logic": "(Abyss_19[left1] | Abyss_19[bot1]) + Defeated_Broken_Vessel + DREAMNAIL + (LEFTCLAW | WINGS) + COMBAT[Lost_Kin]", - "Stateless": true - }, - { - "name": "Defeated_White_Defender", - "logic": "Waterways_15[top1] + DREAMNAIL + DREAMER3 + Defeated_Dung_Defender + COMBAT[White_Defender]", - "Stateless": true - }, - { - "name": "Defeated_Grey_Prince_Zote", - "logic": "Room_Bretta[right1] + DREAMNAIL + WINGS + Rescued_Bretta + Defeated_Colosseum_Zote + COMBAT[Grey_Prince_Zote]", - "Stateless": true - }, - { - "name": "Defeated_Colosseum_1", - "logic": "Room_Colosseum_01[left1] + Can_Replenish_Geo + COMBAT[Colosseum_1]", - "Stateless": true - }, - { - "name": "Defeated_Colosseum_2", - "logic": "Room_Colosseum_01[left1] + Can_Replenish_Geo + (ANYCLAW | (SPICYCOMBATSKIPS + WINGS)) + COMBAT[Colosseum_2]", - "Stateless": true - }, - { - "name": "Defeated_Ancestral_Mound_Baldur", - "logic": "Crossroads_ShamanTemple[left1] + LEFTBALDURS + (UPWALLBREAK | (LEFTSUPERDASH + RIGHTCLAW | RIGHTSUPERDASH + LEFTCLAW) + OBSCURESKIPS)", - "Stateless": true - }, - { - "name": "Defeated_Crossroads_Baldur", - "logic": "Crossroads_11_alt[right1] + LEFTBALDURS", - "Stateless": true - }, - { - "name": "Defeated_Right_Cliffs_Baldur", - "logic": "(Fungus1_28[left1] | Fungus1_28[left2] + (FULLCLAW | WINGS | RIGHTDASH | RIGHTSUPERDASH | $SHADESKIP)) + RIGHTBALDURS", - "Stateless": true - }, - { - "name": "Defeated_Shrumal_Ogre_Arena", - "logic": "(Fungus2_05[bot1] | Fungus2_05[right1]) + (SIDESLASH | UPSLASH | CYCLONE | GREATSLASH | FULLDASHSLASH | ANYDASHSLASH + DASHMASTER + OBSCURESKIPS | SPICYCOMBATSKIPS)", - "Stateless": true - }, - { - "name": "Defeated_King's_Station_Arena", - "logic": "Ruins2_09[bot1] + COMBAT[King's_Station_Arena]", - "Stateless": true - }, - { - "name": "Defeated_West_Queen's_Gardens_Arena", - "logic": "(Fungus3_10[bot1] | Fungus3_10[top1] + (FULLDASH | WINGS)) + COMBAT[West_Queen's_Gardens_Arena]", - "Stateless": true - }, - { - "name": "Defeated_Path_of_Pain_Arena", - "logic": "White_Palace_20[bot1] + (FULLCLAW + RIGHTDASH + WINGS | RIGHTDASH + PRECISEMOVEMENT + DANGEROUSSKIPS + $SHRIEKPOGO[1,1,before:AREASOUL]) + COMBAT[Path_of_Pain_Arena]", - "Stateless": true - }, - { - "name": "Can_Bench", - "logic": "Bench-Dirtmouth | Bench-Mato | Bench-Crossroads_Hot_Springs | Bench-Crossroads_Stag | Bench-Salubra | Bench-Black_Egg_Temple | Bench-Waterfall | Bench-Stone_Sanctuary | Bench-Greenpath_Toll | Bench-Greenpath_Stag | Bench-Lake_of_Unn | Bench-Sheo | Bench-Archives | Bench-Queen's_Station | Bench-Leg_Eater | Bench-Bretta | Bench-Mantis_Village | Bench-Quirrel | Bench-City_Toll | Bench-City_Storerooms | Bench-Watcher's_Spire | Bench-King's_Station | Bench-Pleasure_House | Bench-Waterways | Bench-Godhome_Atrium | Bench-Godhome_Roof | Bench-Hall_of_Gods | Bench-Deepnest_Hot_Springs | Bench-Failed_Tramway | Bench-Basin_Toll | Bench-Hidden_Station | Bench-Oro | Bench-Camp | Bench-Colosseum | Bench-Hive | Bench-Peak_Dark_Room | Bench-Crystal_Guardian | Bench-Grounds_Stag | Bench-Grey_Mourner | Bench-Gardens_Cornifer | Bench-Gardens_Toll | Bench-Gardens_Stag | Bench-Ancestral_Mound | Bench-Beast's_Den | Bench-Palace_Entrance | Bench-Palace_Atrium | Bench-Palace_Balcony | Bench-Upper_Tram | Bench-Lower_Tram" - }, - { - "name": "Can_Warp_To_DG_Bench", - "logic": "INCLUDEBENCHWARPSELECT + (Bench-Dirtmouth/ | Bench-Mato/ | Bench-Crossroads_Hot_Springs/ | Bench-Crossroads_Stag/ | Bench-Salubra/ | Bench-Black_Egg_Temple/ | Bench-Waterfall/ | Bench-Stone_Sanctuary/ | Bench-Greenpath_Toll/ | Bench-Greenpath_Stag/ | Bench-Lake_of_Unn/ | Bench-Sheo/ | Bench-Archives/ | Bench-Queen's_Station/ | Bench-Leg_Eater/ | Bench-Bretta/ | Bench-Mantis_Village/ | Bench-Quirrel/ | Bench-City_Toll/ | Bench-City_Storerooms/ | Bench-Watcher's_Spire/ | Bench-King's_Station/ | Bench-Pleasure_House/ | Bench-Waterways/ | Bench-Godhome_Atrium/ | Bench-Godhome_Roof/ | Bench-Hall_of_Gods/ | Bench-Deepnest_Hot_Springs/ | Bench-Failed_Tramway/ | Bench-Basin_Toll/ | Bench-Hidden_Station/ | Bench-Oro/ | Bench-Camp/ | Bench-Colosseum/ | Bench-Hive/ | Bench-Peak_Dark_Room/ | Bench-Crystal_Guardian/ | Bench-Grounds_Stag/ | Bench-Grey_Mourner/ | Bench-Gardens_Cornifer/ | Bench-Gardens_Toll/ | Bench-Gardens_Stag/)", - "Stateless": true - }, - { - "name": "Can_Warp_To_Bench", - "logic": "INCLUDEBENCHWARPSELECT + (Can_Warp_To_DG_Bench | Bench-Ancestral_Mound/ | Bench-Beast's_Den/ | Bench-Palace_Entrance/ | Bench-Palace_Atrium/ | Bench-Palace_Balcony/ | Bench-Upper_Tram/ | Bench-Lower_Tram/)", - "Stateless": true - }, - { - "name": "Can_Stag", - "logic": "(Room_Town_Stag_Station[left1] | Crossroads_47[right1] | Fungus1_16_alt[right1] | Fungus2_02[right1] | *Queen's_Gardens_Stag | Ruins1_29[left1] | Ruins2_08[left1] | RestingGrounds_09[left1] | Deepnest_09[left1] | Abyss_22[left1]) + $STAGSTATEMODIFIER" - // QG is the only one as a reference since all of the others have trivial logic. Fewer references means less Can_Stag recursion. - }, - { - "name": "Can_Visit_Lemm", - "logic": "Ruins1_05b[top1] + Ruins1_27[left1]/", - "Stateless": true - }, - { - "name": "Can_Repair_Fragile_Charms", - "logic": "Fungus2_26[left1] + Can_Replenish_Geo", - "Stateless": true - }, - { - "name": "Grey_Mourner", - "logic": "Room_Mansion[left1] + $FLOWERGET" - }, - { - "name": "Can_Deliver_Flower", - "logic": "Fungus3_49[right1] + (LEFTDASH | LEFTSUPERDASH + (RIGHTCLAW | WINGS) | WINGS + DIFFICULTSKIPS) + NOFLOWER=FALSE", - "Stateless": true - }, - { - "name": "First_Grimmchild_Upgrade", - "logic": "Grimm_Main_Tent[left1] + GRIMMCHILD + 3FLAMES", - "Stateless": true - }, - { - "name": "Second_Grimmchild_Upgrade", - "logic": "Grimm_Main_Tent[left1] + GRIMMCHILD + 6FLAMES + Defeated_Grimm", - "Stateless": true - }, - { - "name": "Nightmare_Lantern_Lit", - "logic": "Cliffs_06[left1]/ + DREAMNAIL | Grimmchild", - "Stateless": true - }, - { - "name": "Opened_Waterways_Manhole", - "logic": "Ruins1_05b + WATERWAYSUNLOCK", - "Stateless": true - }, - { - "name": "Opened_Dung_Defender_Wall", - "logic": "Waterways_05[bot1] + (ANYCLAW | WINGS) + Defeated_Dung_Defender | Waterways_05[bot2] | Waterways_05[right1]", - "Stateless": true - }, - { - "name": "Opened_Resting_Grounds_Floor", - "logic": "(RestingGrounds_06[left1] | RestingGrounds_06[right1]) + (LEFTDASH | LEFTCLAW | WINGS | ENEMYPOGOS) | RestingGrounds_06[top1]", - "Stateless": true - }, - { - "name": "Broke_Crypts_One_Way_Floor", - "logic": "RestingGrounds_10[top1]", - "Stateless": true - }, - { - "name": "Opened_Resting_Grounds_Catacombs_Wall", - "logic": "RestingGrounds_10", - "Stateless": true - }, - { - "name": "Opened_Pleasure_House_Wall", - "logic": "Ruins_Bathhouse[door1] | Ruins_Bathhouse[right1]", - "Stateless": true - }, - { - "name": "Opened_Gardens_Stag_Exit", - "logic": "Fungus3_40[top1] + (RIGHTDASH | WINGS | RIGHTCLAW | LEFTCLAW + RIGHTSUPERDASH | ENEMYPOGOS | $SHADESKIP | SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL,after:ROOMSOUL]) | Fungus3_40[right1] | Queen's_Gardens_Stag + Can_Stag", - "Stateless": true - }, - { - "name": "Opened_Mawlek_Wall", - "logic": "Crossroads_09[right1] | Crossroads_09[left1] + Defeated_Brooding_Mawlek", - "Stateless": true - }, - { - "name": "Opened_Shaman_Pillar", - "logic": "Crossroads_06[left1]/ | Crossroads_06[door1]/ | Crossroads_06[right1]/ | INFECTION", - "Stateless": true - }, - { - "name": "Opened_Archives_Exit_Wall", - "logic": "Fungus3_47", - "Stateless": true - }, - { - "name": "Opened_Tramway_Exit_Gate", - "logic": "Deepnest_26b[right2] + (WINGS | LEFTCLAW + (RIGHTDASH | ENEMYPOGOS))", - "Stateless": true - }, - { - "name": "Broke_Camp_Bench_Wall", - "logic": "Deepnest_East_11[top1] + (SIDESLASH | CYCLONE | GREATSLASH | (FIREBALL | QUAKE) + $CASTSPELL) | Deepnest_East_11[right1] + (LEFTCLAW | WINGS + BACKGROUNDPOGOS) + UPWALLBREAK | (Deepnest_East_11[left1] | Deepnest_East_11[bot1]) + (WINGS | FULLCLAW + $SHADESKIP | ENEMYPOGOS + DANGEROUSSKIPS) + (LEFTCLAW | WINGS + BACKGROUNDPOGOS) + UPWALLBREAK", - "Stateless": true - }, - { - "name": "Broke_Sanctum_Glass_Floor", - "logic": "Ruins1_30 + QUAKE + $CASTSPELL", - "Stateless": true - }, - { - "name": "Broke_Goam_Entry_Quake_Floor", - "logic": "Crossroads_52[left1] + QUAKE + $CASTSPELL[before:ITEMSOUL]", - "Stateless": true - }, - { - "name": "Broke_Pilgrim's_Way_Quake_Floor", - "logic": "Fungus2_21[right1] + (FULLCLAW + (LEFTDASH | LEFTSUPERDASH) | ANYCLAW + WINGS) + QUAKE + $CASTSPELL[before:ITEMSOUL] | Fungus2_21[right1] + $SHRIEKPOGO[7,before:ITEMSOUL] + QUAKE + $CASTSPELL", - "Stateless": true - }, - { - "name": "Broke_Sanctum_Geo_Rock_Quake_Floor", - "logic": "Ruins1_32[right1] + QUAKE + (ANYCLAW + $CASTSPELL[before:AREASOUL] | $SHRIEKPOGO[before:AREASOUL] + $CASTSPELL)", - "Stateless": true - }, - { - "name": "Broke_Quake_Floor_After_Soul_Master_1", - "logic": "Ruins1_32[right1] + QUAKE + (ANYCLAW + $CASTSPELL[before:AREASOUL] | $SHRIEKPOGO[before:AREASOUL] + $CASTSPELL)", - "Stateless": true - }, - { - "name": "Broke_Quake_Floor_After_Soul_Master_2", - "logic": "Ruins1_32[right1] + Broke_Quake_Floor_After_Soul_Master_1 + QUAKE + $CASTSPELL[before:ROOMSOUL]", - "Stateless": true - }, - { - "name": "Broke_Quake_Floor_After_Soul_Master_3", - "logic": "Ruins1_32[right1] + Broke_Quake_Floor_After_Soul_Master_1 + Broke_Quake_Floor_After_Soul_Master_2 + QUAKE + $CASTSPELL[before:ROOMSOUL]", - "Stateless": true - }, - { - "name": "Broke_Quake_Floor_After_Soul_Master_4", - "logic": "Ruins1_32[right1] + Broke_Quake_Floor_After_Soul_Master_1 + Broke_Quake_Floor_After_Soul_Master_2 + Broke_Quake_Floor_After_Soul_Master_3 + QUAKE + $CASTSPELL[before:ROOMSOUL]", - "Stateless": true - }, - { - "name": "Broke_Sanctum_Escape_Quake_Floor_1", - "logic": "Ruins1_30[left2] + (LEFTCLAW | RIGHTCLAW + BACKGROUNDPOGOS | WINGS) + QUAKE + $CASTSPELL[before:ROOMSOUL]", - "Stateless": true - }, - { - "name": "Broke_Sanctum_Escape_Quake_Floor_2", - "logic": "Ruins1_30[left2] + Broke_Sanctum_Escape_Quake_Floor_1 + (LEFTCLAW | RIGHTCLAW + BACKGROUNDPOGOS | WINGS) + QUAKE + $CASTSPELL[before:ROOMSOUL]", - "Stateless": true - }, - { - "name": "Broke_Crystal_Peak_Entrance_Quake_Floor", - "logic": "Mines_01[left1] + QUAKE + $CASTSPELL", - "Stateless": true - }, - { - "name": "Broke_Crystal_Peak_Dive_Egg_Quake_Floor", - "logic": "Mines_20 + QUAKE + $CASTSPELL[before:ROOMSOUL]", - "Stateless": true - }, - { - "name": "Broke_Hallownest's_Crown_Quake_Floor", - "logic": "(Mines_25[left1] + (FULLCLAW | WINGS + ANYCLAW | ENEMYPOGOS + BACKGROUNDPOGOS + $SHRIEKPOGO[5]) | Mines_25[top1]) + QUAKE + $CASTSPELL[before:ROOMSOUL]", - "Stateless": true - }, - { - "name": "Broke_Crystallized_Mound_Quake_Floor", - "logic": "Mines_35[left1] + QUAKE + $CASTSPELL", - "Stateless": true - }, - { - "name": "Broke_Resting_Grounds_Quake_Floor", - "logic": "RestingGrounds_05 + QUAKE + $CASTSPELL", - "Stateless": true - }, - { - "name": "Broke_Cliffs_Dark_Room_Quake_Floor", - "logic": "Cliffs_04[right1] + (DARKROOMS | LANTERN) + QUAKE + $CASTSPELL[before:ROOMSOUL]", - "Stateless": true - }, - { - "name": "Broke_Weavers_Den_Secret_Wall", - "logic": "Deepnest_45_v02[left1] + (LEFTCLAW + WINGS | (LEFTCLAW | WINGS) + SCREAM + $CASTSPELL[before:AREASOUL] | (RIGHTCLAW | WINGS + (LEFTCLAW | ENEMYPOGOS) | LEFTCLAW + ENEMYPOGOS + DIFFICULTSKIPS) + (LEFTSUPERDASH | WINGS + LEFTDASH | FIREBALL + $CASTSPELL[before:AREASOUL]))", - // downslash reaches with claw wings - // cdash/wings dash allow 2 pogos per cycle, so they are compatible with enemy pogo health. - "Stateless": true - }, - { - "name": "Broke_Basin_Grub_Quake_Floor", - "logic": "Abyss_17[top1] + QUAKE + $CASTSPELL[before:ROOMSOUL]", - "Stateless": true - }, - { - "name": "Broke_Lower_Edge_Quake_Floor", - "logic": "Deepnest_East_02 + QUAKE + $CASTSPELL[before:ROOMSOUL]", - "Stateless": true - }, - { - "name": "Broke_Oro_Quake_Floor_1", - "logic": "(Deepnest_East_16[left1] | Deepnest_East_16[bot1]) + QUAKE + $CASTSPELL[before:ROOMSOUL]", - "Stateless": true - }, - { - "name": "Broke_Oro_Quake_Floor_2", - "logic": "Deepnest_East_14[top2] + QUAKE + $CASTSPELL[before:AREASOUL]", - "Stateless": true - }, - { - "name": "Broke_Oro_Quake_Floor_3", - "logic": "Deepnest_East_14[top2] + Broke_Oro_Quake_Floor_2 + (RIGHTCLAW | WINGS | LEFTCLAW + ENEMYPOGOS) + QUAKE + $CASTSPELL[before:ROOMSOUL]", - "Stateless": true - }, - { - "name": "Broke_420_Rock_Quake_Floor_1", - "logic": "Deepnest_East_17[left1] + QUAKE + $CASTSPELL[before:AREASOUL]", - "Stateless": true - }, - { - "name": "Broke_420_Rock_Quake_Floor_2", - "logic": "Deepnest_East_17[left1] + Broke_420_Rock_Quake_Floor_1 + QUAKE + $CASTSPELL[before:AREASOUL]", - "Stateless": true - }, - { - "name": "Broke_420_Rock_Quake_Floor_3", - "logic": "Deepnest_East_17[left1] + Broke_420_Rock_Quake_Floor_1 + Broke_420_Rock_Quake_Floor_2 + QUAKE + $CASTSPELL[before:AREASOUL]", - "Stateless": true - }, - { - "name": "Broke_420_Rock_Quake_Floor_4", - "logic": "Deepnest_East_17[left1] + Broke_420_Rock_Quake_Floor_1 + Broke_420_Rock_Quake_Floor_2 + Broke_420_Rock_Quake_Floor_3 + QUAKE + $CASTSPELL[before:AREASOUL]", - "Stateless": true - }, - { - "name": "Broke_420_Rock_Quake_Floor_5", - "logic": "Deepnest_East_17[left1] + Broke_420_Rock_Quake_Floor_1 + Broke_420_Rock_Quake_Floor_2 + Broke_420_Rock_Quake_Floor_3 + Broke_420_Rock_Quake_Floor_4 + QUAKE + $CASTSPELL[before:AREASOUL]", - "Stateless": true - }, - { - "name": "Broke_420_Rock_Quake_Floor_6", - "logic": "Deepnest_East_17[left1] + Broke_420_Rock_Quake_Floor_1 + Broke_420_Rock_Quake_Floor_2 + Broke_420_Rock_Quake_Floor_3 + Broke_420_Rock_Quake_Floor_4 + Broke_420_Rock_Quake_Floor_5 + QUAKE + $CASTSPELL[before:AREASOUL]", - "Stateless": true - }, - { - "name": "Broke_420_Rock_Quake_Floor_7", - "logic": "Deepnest_East_17[left1] + Broke_420_Rock_Quake_Floor_1 + Broke_420_Rock_Quake_Floor_2 + Broke_420_Rock_Quake_Floor_3 + Broke_420_Rock_Quake_Floor_4 + Broke_420_Rock_Quake_Floor_5 + Broke_420_Rock_Quake_Floor_6 + QUAKE + $CASTSPELL[before:AREASOUL]", - "Stateless": true - }, - { - "name": "Broke_420_Rock_Quake_Floor_8", - "logic": "Deepnest_East_17[left1] + Broke_420_Rock_Quake_Floor_1 + Broke_420_Rock_Quake_Floor_2 + Broke_420_Rock_Quake_Floor_3 + Broke_420_Rock_Quake_Floor_4 + Broke_420_Rock_Quake_Floor_5 + Broke_420_Rock_Quake_Floor_6 + Broke_420_Rock_Quake_Floor_7 + QUAKE + $CASTSPELL[before:AREASOUL]", - "Stateless": true - }, - { - "name": "Broke_420_Rock_Quake_Floor_9", - "logic": "Deepnest_East_17[left1] + Broke_420_Rock_Quake_Floor_1 + Broke_420_Rock_Quake_Floor_2 + Broke_420_Rock_Quake_Floor_3 + Broke_420_Rock_Quake_Floor_4 + Broke_420_Rock_Quake_Floor_5 + Broke_420_Rock_Quake_Floor_6 + Broke_420_Rock_Quake_Floor_7 + Broke_420_Rock_Quake_Floor_8 + QUAKE + $CASTSPELL[before:AREASOUL]", - "Stateless": true - }, - { - "name": "Broke_420_Rock_Quake_Floor_10", - "logic": "Deepnest_East_17[left1] + Broke_420_Rock_Quake_Floor_1 + Broke_420_Rock_Quake_Floor_2 + Broke_420_Rock_Quake_Floor_3 + Broke_420_Rock_Quake_Floor_4 + Broke_420_Rock_Quake_Floor_5 + Broke_420_Rock_Quake_Floor_6 + Broke_420_Rock_Quake_Floor_7 + Broke_420_Rock_Quake_Floor_8 + Broke_420_Rock_Quake_Floor_9 + QUAKE + $CASTSPELL[before:AREASOUL]", - "Stateless": true - }, - { - "name": "Broke_420_Rock_Quake_Floor_11", - "logic": "Deepnest_East_17[left1] + Broke_420_Rock_Quake_Floor_1 + Broke_420_Rock_Quake_Floor_2 + Broke_420_Rock_Quake_Floor_3 + Broke_420_Rock_Quake_Floor_4 + Broke_420_Rock_Quake_Floor_5 + Broke_420_Rock_Quake_Floor_6 + Broke_420_Rock_Quake_Floor_7 + Broke_420_Rock_Quake_Floor_8 + Broke_420_Rock_Quake_Floor_9 + Broke_420_Rock_Quake_Floor_10 + QUAKE + $CASTSPELL[before:AREASOUL]", - "Stateless": true - }, - { - "name": "Broke_Waterways_Bench_Quake_Floor_1", - "logic": "(Waterways_04[right1] | Waterways_04[left1] + ENEMYPOGOS) + QUAKE + $CASTSPELL", // omit additional branches which result in Waterways_04[right1] - "Stateless": true - }, - { - "name": "Broke_Waterways_Bench_Quake_Floor_2", - "logic": "Waterways_04[bot1] | (Waterways_04[right1] | Waterways_04[left1] + ENEMYPOGOS) + Broke_Waterways_Bench_Quake_Floor_1 + QUAKE + $CASTSPELL", - "Stateless": true - }, - { - "name": "Broke_Waterways_Bench_Quake_Floor_3", - "logic": "Waterways_02[top3] + QUAKE + $CASTSPELL", - "Stateless": true - }, - { - "name": "Broke_Flukemarm_Quake_Floor", - "logic": "Waterways_02[bot1] | (Waterways_02[top1] | Waterways_02[top2] + (ANYCLAW | WINGS | SWIM) | Waterways_02[top3] + Broke_Waterways_Bench_Quake_Floor_3 | Waterways_02[bot1] | Waterways_02[bot2] + (ANYCLAW | WINGS | SWIM)) + QUAKE + $CASTSPELL[before:ROOMSOUL]", - "Stateless": true - }, - { - "name": "Broke_Dung_Defender_Quake_Floor", - "logic": "Waterways_05[bot2] | (Waterways_05[right1] | Waterways_05[bot1] + (ANYCLAW | WINGS) + Defeated_Dung_Defender) + QUAKE + $CASTSPELL", - "Stateless": true - }, - { - "name": "Broke_Edge_Journal_Quake_Floor", - "logic": "(Deepnest_East_18 + (ANYCLAW | WINGS) | Deepnest_East_18[top1]) + QUAKE + $CASTSPELL", - "Stateless": true - }, - { - "name": "Opened_Emilitia_Door", - "logic": "Ruins_House_03[left1] | (ANYCLAW + Ruins_House_03[left2])", - "Stateless": true - }, - { - "name": "Lit_Abyss_Lighthouse", - "logic": "Abyss_Lighthouse_room[left1]", - "Stateless": true - }, - { - "name": "Opened_Lower_Kingdom's_Edge_Wall", - "logic": "Deepnest_East_02", - "Stateless": true - }, - { - "name": "Opened_Glade_Door", - "logic": "RestingGrounds_07[right1] + 200ESSENCE", - "Stateless": true - }, - { - "name": "Opened_Waterways_Exit", - "logic": "(Waterways_09[left1] | Waterways_09[right1]) + (LEFTCLAW | WINGS | (RIGHTCLAW + (LEFTDASH | LEFTSUPERDASH))) | $StartLocation[West Waterways]", - "Stateless": true - }, - { - "name": "Palace_Entrance_Lantern_Lit", - "logic": "White_Palace_02[left1] + (LEFTCLAW + WINGS | $SHRIEKPOGO[2,before:AREASOUL,NORIGHTSTALL]) + COMBAT[White_Palace_Arenas]", - "Stateless": true - }, - { - "name": "Palace_Left_Lantern_Lit", - "logic": "White_Palace_14[right1]", - "Stateless": true - }, - { - "name": "Palace_Right_Lantern_Lit", - "logic": "White_Palace_15[right1]", - "Stateless": true - }, - { - "name": "Palace_Atrium_Gates_Opened", - "logic": "Palace_Left_Lantern_Lit + Palace_Right_Lantern_Lit", - "Stateless": true - }, - { - "name": "Opened_Black_Egg_Temple", - "logic": "Room_temple[left1] + DREAMER3", - "Stateless": true - }, - // note: bench waypoints may be modified or removed by connections which modify benches. They should not be relied on as room waypoints. - { - "name": "Bench-Dirtmouth", - "logic": "Town + $BENCHRESET | WARPSTARTTOBENCH + Bench-Dirtmouth/" - }, - { - "name": "Bench-Mato", - "logic": "Room_nailmaster[left1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Mato/" - }, - { - "name": "Bench-Crossroads_Hot_Springs", - "logic": "(Crossroads_30[left1] | Crossroads_Hot_Spring) + $BENCHRESET | WARPSTARTTOBENCH + Bench-Crossroads_Hot_Springs/" - }, - { - "name": "Bench-Crossroads_Stag", - "logic": "Crossroads_47[right1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Crossroads_Stag/" - }, - { - "name": "Bench-Salubra", - "logic": "Crossroads_04[door_charmshop] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Salubra/" - }, - { - "name": "Bench-Ancestral_Mound", - "logic": "Crossroads_ShamanTemple[left1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Ancestral_Mound/" - }, - { - "name": "Bench-Black_Egg_Temple", - "logic": "Room_temple[left1] + Opened_Black_Egg_Temple + $BENCHRESET | WARPSTARTTOBENCH + Bench-Black_Egg_Temple/" - }, - { - "name": "Bench-Waterfall", - "logic": "(Fungus1_01b[left1] | Fungus1_01b[right1]) + $BENCHRESET | WARPSTARTTOBENCH + Bench-Waterfall/" - }, - { - "name": "Bench-Stone_Sanctuary", - "logic": "Fungus1_37[left1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Stone_Sanctuary/" - }, - { - "name": "Bench-Greenpath_Toll", - "logic": "(Fungus1_31[bot1] | Fungus1_31[right1] | Fungus1_31[top1]) + $BENCHRESET | WARPSTARTTOBENCH + Bench-Greenpath_Toll/" - }, - { - "name": "Bench-Greenpath_Stag", - "logic": "Fungus1_16_alt[right1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Greenpath_Stag/" - }, - { - "name": "Bench-Lake_of_Unn", - "logic": "Room_Slug_Shrine[left1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Lake_of_Unn/" - }, - { - "name": "Bench-Sheo", - "logic": "Fungus1_15[door1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Sheo/" - }, - { - "name": "Bench-Archives", - "logic": "Fungus3_archive[bot1] + (ANYCLAW | WINGS) + $BENCHRESET | WARPSTARTTOBENCH + Bench-Archives/" - }, - { - "name": "Bench-Queen's_Station", - "logic": "Fungus2_02[right1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Queen's_Station/" - }, - { - "name": "Bench-Leg_Eater", - "logic": "Fungus2_26[left1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Leg_Eater/" - }, - { - "name": "Bench-Bretta", - "logic": "(Fungus2_13 + (LEFTDASH | LEFTSUPERDASH | ANYCLAW | WINGS | ACID | ENEMYPOGOS | PRECISEMOVEMENT) | Fungus2_13[left3] + (RIGHTDASH | ACID | WINGS | LEFTCLAW | RIGHTCLAW + PRECISEMOVEMENT | SPELLAIRSTALL + $CASTSPELL[before:AREASOUL,after:ROOMSOUL] | PRECISEMOVEMENT + $SHADESKIP)) + $BENCHRESET | WARPSTARTTOBENCH + Bench-Bretta/" - }, - { - "name": "Bench-Mantis_Village", - "logic": "Fungus2_31[left1] + Defeated_Mantis_Lords + $BENCHRESET | WARPSTARTTOBENCH + Bench-Mantis_Village/" - }, - { - "name": "Bench-Quirrel", - "logic": "(Ruins1_02[bot1] + (ANYCLAW | WINGS) | Ruins1_02[top1]) + $BENCHRESET | WARPSTARTTOBENCH + Bench-Quirrel/" - }, - { - "name": "Bench-City_Toll", - "logic": "Ruins1_31[left1] + Can_Replenish_Geo + $BENCHRESET | WARPSTARTTOBENCH + Bench-City_Toll/" - }, - { - "name": "Bench-City_Storerooms", - "logic": "Ruins1_29[left1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-City_Storerooms/" - }, - { - "name": "Bench-Watcher's_Spire", - "logic": "Ruins1_18[right2] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Watcher's_Spire/" - }, - { - "name": "Bench-King's_Station", - "logic": "Ruins2_08[left1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-King's_Station/" - }, - { - "name": "Bench-Pleasure_House", - "logic": "(Ruins_Bathhouse[door1] | Pleasure_House_Hot_Spring) + $BENCHRESET | WARPSTARTTOBENCH + Bench-Pleasure_House/" - }, - { - "name": "Bench-Waterways", - "logic": "(Waterways_02[top3] + Broke_Waterways_Bench_Quake_Floor_3 | Waterways_02 + (LEFTCLAW | WINGS + RIGHTCLAW | ENEMYPOGOS + DANGEROUSSKIPS + (WINGS | RIGHTCLAW) | $SHRIEKPOGO[3,before:ROOMSOUL])) + $BENCHRESET | WARPSTARTTOBENCH + Bench-Waterways/" - }, - { - "name": "Bench-Godhome_Atrium", - "logic": "GG_Atrium + (RIGHTCLAW + (RIGHTDASH | LEFTCLAW + RIGHTSUPERDASH | WINGS) | LEFTCLAW + WINGS | $SHRIEKPOGO[4,NOLEFTSTALL]) + $BENCHRESET | WARPSTARTTOBENCH + Bench-Godhome_Atrium/" - }, - { - "name": "Bench-Godhome_Roof", - "logic": "FALSE + $BENCHRESET | WARPSTARTTOBENCH + Bench-Godhome_Roof/" - }, - { - "name": "Bench-Hall_of_Gods", - "logic": "GG_Workshop + (ANYCLAW | $SHRIEKPOGO[6]) + $BENCHRESET | WARPSTARTTOBENCH + Bench-Hall_of_Gods/" - }, - { - "name": "Bench-Deepnest_Hot_Springs", - "logic": "(Deepnest_30[left1] | Deepnest_Hot_Spring) + $BENCHRESET | WARPSTARTTOBENCH + Bench-Deepnest_Hot_Springs/" - }, - { - "name": "Bench-Failed_Tramway", - "logic": "Deepnest_14[left1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Failed_Tramway/" - }, - { - "name": "Bench-Beast's_Den", - "logic": "Deepnest_Spider_Town[left1] + (WINGS + (LEFTCLAW + RIGHTSUPERDASH | RIGHTCLAW + (LEFTSUPERDASH | LEFTDASH)) | (FULLCLAW | WINGS + ANYCLAW | WINGS + COMPLEXSKIPS + $SHADESKIP[2HITS] | ENEMYPOGOS + $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL]) + COMBAT[Left_Devout]) + $BENCHRESET | WARPSTARTTOBENCH + Bench-Beast's_Den/" - }, - { - "name": "Bench-Basin_Toll", - "logic": "Abyss_18[right1] + Can_Replenish_Geo + $BENCHRESET | WARPSTARTTOBENCH + Bench-Basin_Toll/" - }, - { - "name": "Bench-Hidden_Station", - "logic": "Abyss_22[left1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Hidden_Station/" - }, - { - "name": "Bench-Oro", - "logic": "Deepnest_East_06[door1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Oro/" - }, - { - "name": "Bench-Camp", - "logic": "Deepnest_East_13[bot1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Camp/" - }, - { - "name": "Bench-Colosseum", - "logic": "(Room_Colosseum_02[top1] | Room_Colosseum_02[top2] | Colosseum_Hot_Spring) + $BENCHRESET | WARPSTARTTOBENCH + Bench-Colosseum/" - }, - { - "name": "Bench-Hive", - "logic": "Hive_01[right2] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Hive/" - }, - { - "name": "Bench-Peak_Dark_Room", - "logic": "Mines_29[left1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Peak_Dark_Room/" - }, - { - "name": "Bench-Crystal_Guardian", - "logic": "Mines_18[left1] + Defeated_Crystal_Guardian + $BENCHRESET | WARPSTARTTOBENCH + Bench-Crystal_Guardian/" - }, - { - "name": "Bench-Grounds_Stag", - "logic": "RestingGrounds_09[left1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Grounds_Stag/" - }, - { - "name": "Bench-Grey_Mourner", - "logic": "RestingGrounds_12[door_Mansion] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Grey_Mourner/" - }, - { - "name": "Bench-Gardens_Cornifer", - "logic": "Fungus1_24[left1] + (ANYCLAW | WINGS) + $BENCHRESET | WARPSTARTTOBENCH + Bench-Gardens_Cornifer/" - }, - { - "name": "Bench-Gardens_Toll", - "logic": "Fungus3_50[right1] + Can_Replenish_Geo + $BENCHRESET | WARPSTARTTOBENCH + Bench-Gardens_Toll/" - }, - { - "name": "Bench-Gardens_Stag", - "logic": "Fungus3_40[right1] | Fungus3_40[top1] + (RIGHTDASH | WINGS | RIGHTCLAW | LEFTCLAW + RIGHTSUPERDASH | ENEMYPOGOS | $SHADESKIP | SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL,after:ROOMSOUL]) | Can_Stag + Queen's_Gardens_Stag | WARPSTARTTOBENCH + Bench-Gardens_Stag/" - }, - { - "name": "Bench-Palace_Entrance", - "logic": "White_Palace_01 + $BENCHRESET | WARPSTARTTOBENCH + Bench-Palace_Entrance/" - }, - { - "name": "Bench-Palace_Atrium", - "logic": "White_Palace_03_hub + $BENCHRESET | WARPSTARTTOBENCH + Bench-Palace_Atrium/" - }, - { - "name": "Bench-Palace_Balcony", - "logic": "White_Palace_06[top1] + $BENCHRESET | WARPSTARTTOBENCH + Bench-Palace_Balcony/" - }, - { - "name": "Bench-Upper_Tram", - "logic": "Upper_Tram + $BENCHRESET | WARPSTARTTOBENCH + Bench-Upper_Tram/" - }, - { - "name": "Bench-Lower_Tram", - "logic": "Lower_Tram + $BENCHRESET | WARPSTARTTOBENCH + Bench-Lower_Tram/" - }, - { - "name": "Tutorial_01", - "logic": "Tutorial_01[right1] | Tutorial_01[top1] | Tutorial_01[top2]" - }, - { - "name": "Town", - "logic": "Town[left1] | Town[top1] | Town[bot1] | Town[right1] | Town[door_station] | Town[door_sly] | Town[door_mapper] | Town[door_bretta] | Town[door_jiji] | Town[room_grimm] | Town[room_divine] | Bench-Dirtmouth" - }, - { - "name": "Crossroads_03", - "logic": "Crossroads_03[right1] | Crossroads_03[right2] | Crossroads_03[left1] | Crossroads_03[left2] | Crossroads_03[bot1]" - }, - { - "name": "Crossroads_07", - "logic": "Crossroads_07[left1] | Crossroads_07[left2] | Crossroads_07[left3] | Crossroads_07[right1] | Crossroads_07[right2] | Crossroads_07[bot1]" - }, - { - "name": "Crossroads_08", - "logic": "Crossroads_08[left1] | Crossroads_08[left2] | Crossroads_08[right1] | Crossroads_08[right2]" - }, - { - "name": "Crossroads_14", - "logic": "Crossroads_14[left1] | Crossroads_14[left2] | Crossroads_14[right1] | Crossroads_14[right2]" - }, - { - "name": "Crossroads_18", - "logic": "Crossroads_18[right1] + (LEFTDASH | WINGS | INFECTED | LEFTCLAW + SPELLAIRSTALL + $CASTSPELL[2,before:AREASOUL,after:ITEMSOUL] | $SLOPEBALL[before:AREASOUL,after:ITEMSOUL]) | Crossroads_18[bot1] | Crossroads_18[right2]" - }, - { - "name": "Crossroads_19", - "logic": "Crossroads_19[left1] | Crossroads_19[left2] | Crossroads_19[right1] | Crossroads_19[top1]" - }, - { - "name": "Crossroads_21", - "logic": "Crossroads_21[left1] | Crossroads_21[right1] | Crossroads_21[top1]" - }, - { - "name": "Crossroads_27", - "logic": "Crossroads_27[right1] | Crossroads_27[bot1] | Crossroads_27[left1] | Crossroads_27[left2]" - }, - { - "name": "Crossroads_33", - "logic": "Crossroads_33[top1] | Crossroads_33[left1] | Crossroads_33[left2] | Crossroads_33[right1] | Crossroads_33[right2]" - }, - { - "name": "Fungus1_11", - "logic": "Fungus1_11[left1] | Fungus1_11[top1] | Fungus1_11[bot1] | Fungus1_11[right1] | Fungus1_11[right2]" - }, - { - "name": "Fungus1_21", - "logic": "Fungus1_21[left1] | Fungus1_21[top1] | Fungus1_21[right1] + (LEFTCLAW | RIGHTCLAW + LEFTSUPERDASH | WINGS | LEFTDASH | (CYCLONE | GREATSLASH) + OBSCURESKIPS) | Fungus1_21[bot1]" - }, - { - "name": "Fungus1_30", - "logic": "Fungus1_30[left1] | Fungus1_30[right1] | Fungus1_30[top1] | Fungus1_30[top3]" - }, - { - "name": "Fungus3_01", - "logic": "Fungus3_01[left1] | Fungus3_01[top1] | Fungus3_01[right1] | Fungus3_01[right2]" - }, - { - "name": "Fungus3_02", - "logic": "Fungus3_02[left1] | Fungus3_02[left2] | Fungus3_02[left3] | Fungus3_02[right1] | Fungus3_02[right2]" - }, - { - "name": "Fungus3_26", - "logic": "Fungus3_26[top1] | Fungus3_26[left1] | Fungus3_26[left2] | Fungus3_26[left3] | Fungus3_26[right1]" - }, - { - "name": "Fungus3_44", - "logic": "(Fungus3_44[bot1] + (RIGHTCLAW | WINGS)) | Fungus3_44[door1] | Fungus3_44[right1]" - }, - { - "name": "Fungus3_47", - "logic": "Fungus3_47[left1] | Fungus3_47[door1] | Fungus3_47[right1]" - }, - { - "name": "Fungus2_01", - "logic": "Fungus2_01[left1] | Fungus2_01[left2] | Fungus2_01[left3] | Fungus2_01[right1]" - }, - { - "name": "Fungus2_03", - "logic": "Fungus2_03[left1] | Fungus2_03[bot1] | Fungus2_03[right1]" - }, - { - "name": "Fungus2_04", - "logic": "Fungus2_04[left1] | Fungus2_04[right1] | Fungus2_04[right2] | Fungus2_04[top1]" - }, - { - "name": "Fungus2_06", - "logic": "Fungus2_06[left1] | (Fungus2_06[left2] + ACID) | Fungus2_06[top1] | Fungus2_06[right1] | Fungus2_06[right2]" - }, - { - "name": "Fungus2_11", - "logic": "Fungus2_11[top1] | Fungus2_11[left1] | Fungus2_11[left2] | Fungus2_11[right1]" - }, - { - "name": "Fungus2_13", - "logic": "Fungus2_13[top1] | Fungus2_13[left2] | Fungus2_13[left3] + (RIGHTDASH | ACID | WINGS | LEFTCLAW | RIGHTCLAW + PRECISEMOVEMENT | SPELLAIRSTALL + $CASTSPELL[before:AREASOUL,after:ROOMSOUL] | PRECISEMOVEMENT + $SHADESKIP) | Bench-Bretta + (RIGHTDASH | RIGHTSUPERDASH | ANYCLAW | WINGS | ENEMYPOGOS | PRECISEMOVEMENT)" - }, - { - "name": "Fungus2_14", - "logic": "Fungus2_14[top1] | Fungus2_14[bot3] | Fungus2_14[right1] + (LEFTDASH | LEFTCLAW + (RIGHTCLAW | PRECISEMOVEMENT) | WINGS | LEFTSUPERDASH | ACID)" - }, - { - "name": "Fungus2_15", // the bottom of the upper chamber - "logic": "Fungus2_15[top3] | Fungus2_15[left1] + (RIGHTCLAW | LEFTCLAW + RIGHTSUPERDASH + WINGS | $SHRIEKPOGO[7]) | Fungus2_15[right1] + (LEFTCLAW | WINGS + RIGHTCLAW)" - }, - { - "name": "Fungus2_17", - "logic": "Fungus2_17[right1] | Fungus2_17[left1] | Fungus2_17[bot1]" - }, - { - "name": "Fungus2_18", - "logic": "Fungus2_18[top1] | Fungus2_18[right1] + (LEFTDASH | LEFTCLAW | WINGS | RIGHTCLAW | ENEMYPOGOS) | Fungus2_18[bot1] + (RIGHTCLAW | WINGS)" - }, - { - "name": "Fungus2_20", - "logic": "Fungus2_20[left1] | Fungus2_20[right1]" - }, - { - "name": "Fungus2_21", // in front of the city crest statue, levers activated - "logic": "Fungus2_21[left1] + (RIGHTSUPERDASH | ACID | RIGHTCLAW + RIGHTDASH | WINGS + LEFTCLAW + (RIGHTDASH | OBSCURESKIPS + DANGEROUSSKIPS | SPELLAIRSTALL + $CASTSPELL[2,before:AREASOUL,after:ITEMSOUL]) | RIGHTCLAW + WINGS + SPELLAIRSTALL + $CASTSPELL[2,1,before:AREASOUL,after:ITEMSOUL]) | Fungus2_21[right1] + (FULLCLAW + (LEFTDASH | LEFTSUPERDASH | SPELLAIRSTALL + $CASTSPELL[before:ITEMSOUL]) | ANYCLAW + WINGS | $SHRIEKPOGO[7,before:ITEMSOUL]) + Broke_Pilgrim's_Way_Quake_Floor" - // obscure + dangerous = thorn stand - }, - { - "name": "Fungus2_23", - "logic": "Fungus2_23[right1] | Fungus2_23[right2] + Opened_Waterways_Exit" - }, - { - "name": "Fungus2_29", // above the claw + wings entrance to fungal core - "logic": "Fungus2_29[right1] + (ANYCLAW + WINGS | $SHRIEKPOGO[3,before:MAPAREASOUL]) | Fungus2_29[bot1] + (LEFTCLAW | WINGS + (RIGHTCLAW + (RIGHTDASH | OBSCURESKIPS) | ENEMYPOGOS | $SHRIEKPOGO[2,before:ROOMSOUL]))" - }, - { - "name": "Deepnest_01", - "logic": "Deepnest_01[left1] | Deepnest_01[bot1] | Deepnest_01[right1]" - }, - { - "name": "Deepnest_01b", - "logic": "Deepnest_01b[top1] | Deepnest_01b[top2] | Deepnest_01b[right1] | (Deepnest_01b[right2] + (ANYCLAW | WINGS)) | (Deepnest_01b[bot1] + (ANYCLAW | WINGS))" - }, - { - "name": "Deepnest_02", - "logic": "Deepnest_02[left1] | Deepnest_02[left2] | Deepnest_02[right1]" - }, - { - "name": "Deepnest_03", - "logic": "Deepnest_03[right1] | Deepnest_03[top1] | Deepnest_03[left1] | Deepnest_03[left2]" - }, - { - "name": "Deepnest_10", - "logic": "Deepnest_10[right1] | Deepnest_10[right2] | Deepnest_10[door1] | Deepnest_10[door2]" - }, - { - "name": "Deepnest_14", - "logic": "Deepnest_14[left1] | Deepnest_14[bot1] | Deepnest_14[bot2]" - }, - { - "name": "Deepnest_17", - "logic": "Deepnest_17[left1] | Deepnest_17[right1] | Deepnest_17[top1] | Deepnest_17[bot1]" - }, - { - "name": "Deepnest_26", - "logic": "Deepnest_26[right1] | Deepnest_26[bot1] | Deepnest_26[left1] + (RIGHTCLAW | (LEFTCLAW + RIGHTSUPERDASH) | WINGS) + Opened_Tramway_Exit_Gate" - }, - { - "name": "Deepnest_34", - "logic": "(LANTERN | DARKROOMS) + (Deepnest_34[left1] | Deepnest_34[right1] | Deepnest_34[top1])" - }, - { - "name": "Deepnest_35", - "logic": "(LANTERN | DARKROOMS) + (Deepnest_35[bot1] + (ANYCLAW | ENEMYPOGOS + $SHADESKIP[2HITS] + WINGS + ANYDASH | ENEMYPOGOS + $SHRIEKPOGO[4,before:AREASOUL,after:AREASOUL]) | Deepnest_35[left1] | Deepnest_35[top1])" - }, - { - "name": "Deepnest_37", - "logic": "Deepnest_37[left1] | Deepnest_37[top1] | Deepnest_37[right1] | Deepnest_37[bot1]" - }, - { - "name": "Deepnest_39", - "logic": "(LANTERN | DARKROOMS) + (Deepnest_39[right1] | Deepnest_39[door1] | Deepnest_39[top1] | Deepnest_39[left1])" - }, - { - "name": "Deepnest_41", - "logic": "(LANTERN | DARKROOMS) + (Deepnest_41[left1] + (RIGHTCLAW | LEFTCLAW + WINGS | (LEFTCLAW | WINGS) + ENEMYPOGOS) | Deepnest_41[left2] + (FULLCLAW | WINGS + ANYCLAW) | Deepnest_41[right1] + (LEFTCLAW | WINGS))" - }, - { - "name": "Deepnest_42", - "logic": "(LANTERN | DARKROOMS) + ((Deepnest_42[bot1] + FULLCLAW) | Deepnest_42[left1] | Deepnest_42[top1])" - }, - { - "name": "Deepnest_East_02", - "logic": "Deepnest_East_02[bot1] + (LEFTCLAW | WINGS | ENEMYPOGOS + (RIGHTCLAW | ANYDASH + COMPLEXSKIPS)) | Deepnest_East_02[top1] | Deepnest_East_02[right1]" - }, - { - "name": "Deepnest_East_03", - "logic": "Deepnest_East_03[left1] | Deepnest_East_03[left2] | Deepnest_East_03[top1] | Deepnest_East_03[right1] | Deepnest_East_03[right2] | Deepnest_East_03[top2]" - }, - { - "name": "Deepnest_East_04", - "logic": "Deepnest_East_04[left1] + (ACID | RIGHTSKIPACID | ACIDSKIPS + DAMAGEBOOSTS + WINGS + RIGHTDASH + RIGHTSUPERDASH + $TAKEDAMAGE | ACIDSKIPS + RIGHTDASH + $SHRIEKPOGO[before:AREASOUL,after:ROOMSOUL]) | Deepnest_East_04[left2] | Deepnest_East_04[right2] | Deepnest_East_04[right1] + (ACID | LEFTDASH | WINGS | SPELLAIRSTALL + $CASTSPELL[before:AREASOUL,after:ROOMSOUL] | DAMAGEBOOSTS + $TAKEDAMAGE)" - }, - { - "name": "Deepnest_East_07", - "logic": "Deepnest_East_07[right1] | Deepnest_East_07[left1] | Deepnest_East_07[left2]" - }, - { - "name": "Deepnest_East_11", - "logic": "Deepnest_East_11[left1] | Deepnest_East_11[bot1] | Deepnest_East_11[top1] + Broke_Camp_Bench_Wall | Deepnest_East_11[right1]" - }, - { - "name": "Deepnest_East_18", - "logic": "Deepnest_East_18[top1] | Deepnest_East_18[bot1] | (Deepnest_East_18[right2] + LEFTSHADOWDASH)" - }, - { - "name": "Hive_03_c", - "logic": "Hive_03_c[left1] | Hive_03_c[top1] | Hive_03_c[right2] | Hive_03_c[right3]" - }, - { - "name": "Abyss_03", - "logic": "Abyss_03[top1] | (Abyss_03[bot1] + (RIGHTCLAW | WINGS)) | Abyss_03[bot2]" - }, - { - "name": "Abyss_03_b", - "logic": "Abyss_03_b[left1]" - }, - { - "name": "Abyss_03_c", - "logic": "Abyss_03_c[top1] | Abyss_03_c[right1]" - }, - { - "name": "Abyss_04", - "logic": "Abyss_04[top1] | Abyss_04[right1] | Abyss_04[bot1] | Abyss_04[left1]" - }, - { - "name": "Abyss_06_Core", - "logic": "(Abyss_06_Core[top1] + BRAND) | Abyss_06_Core[left1] | Abyss_06_Core[left3] | Abyss_06_Core[bot1] | Abyss_06_Core[right2]" - }, - { - "name": "Abyss_09", - "logic": "Abyss_09[left1] + (RIGHTCLAW + (RIGHTDASH | RIGHTSUPERDASH | SWIM + VOIDHEART) | WINGS | DAMAGEBOOSTS + (RIGHTDASH | SPELLAIRSTALL + $CASTSPELL) + $SHADESKIP + $TAKEDAMAGE) | Abyss_09[right1] + (Lit_Abyss_Lighthouse | VOIDHEART) + (LEFTSUPERDASH | SWIM | LEFTSHARPSHADOW + $SHRIEKPOGO[1,1,1,1,1,1,1]) | Abyss_09[right2]" - }, - { - "name": "Abyss_19", - "logic": "(Abyss_19[bot1] + (ANYCLAW | WINGS)) | Abyss_19[right1]" - }, - { - "name": "Abyss_01", - "logic": "Abyss_01[left1] | Abyss_01[right1] | Abyss_01[left3] + (RIGHTCLAW | LEFTCLAW + WINGS | $SHRIEKPOGO[before:AREASOUL]) | Abyss_01[left2] + (RIGHTSUPERDASH | SPIKETUNNELS + RIGHTDASH + (DASHMASTER | SPELLAIRSTALL + $CASTSPELL)) | Abyss_01[right2] + (LEFTSUPERDASH | SPIKETUNNELS + LEFTDASH + (DASHMASTER | SPELLAIRSTALL + $CASTSPELL[2]))" - }, - { - "name": "Waterways_01", - "logic": "Waterways_01[top1] | Waterways_01[right1] | Waterways_01[bot1] | Waterways_01[left1]" - }, - { - "name": "Waterways_02", - "logic": "Waterways_02[top1] | Waterways_02[top2] | Waterways_02[top3] + Broke_Waterways_Bench_Quake_Floor_3 | Waterways_02[bot1] | Waterways_02[bot2] | Bench-Waterways" - }, - { - "name": "Waterways_04", - "logic": "Waterways_04[right1] | Waterways_04[left1] + (RIGHTCLAW | WINGS | ENEMYPOGOS) | Waterways_04[left2] + ((RIGHTCLAW | WINGS + ENEMYPOGOS) + (SWIM | RIGHTSKIPACID) | ACIDSKIPS + RIGHTDASH + (LEFTCLAW + $SHRIEKPOGO[1,1] | RIGHTCLAW + $SHRIEKPOGO[1,1,1,1,1] | $SHRIEKPOGO[1,1,1,1,1,1,1]))" - }, - { - "name": "Waterways_04b", - "logic": "Waterways_04b[right1] | Waterways_04b[right2] | Waterways_04b[left1]" - }, - { - "name": "Waterways_07", - "logic": "Waterways_07[left1] + (ACID + (RIGHTCLAW | WINGS) | FULLCLAW + RIGHTSUPERDASH | WINGS + RIGHTDASH + ANYCLAW | RIGHTDASH + $SHRIEKPOGO[1,after:ROOMSOUL]) | Waterways_07[right1] + (ANYCLAW | WINGS) | Waterways_07[right2] + (ACID | ACIDSKIPS + DANGEROUSSKIPS + DIFFICULTSKIPS + LEFTDASH + $SHRIEKPOGO[2,after:ROOMSOUL]) | Waterways_07[door1] | Waterways_07[top1]" - }, - { - "name": "Waterways_13", // equivalent to *Isma's_Tear - "logic": "Waterways_13[left1] + (FULLCLAW | ANYCLAW + (WINGS | ENEMYPOGOS) | LEFTCLAW + (RIGHTDASH | RIGHTSUPERDASH) | ENEMYPOGOS + $SHRIEKPOGO[5]) | Waterways_13[left2] + (ACID + (RIGHTCLAW | WINGS | ENEMYPOGOS) | ACIDSKIPS + LEFTCLAW + RIGHTSUPERDASH + (WINGS | RIGHTCLAW) | ACIDSKIPS + RIGHTDASH + $SHRIEKPOGO[1,1])" - }, - { - "name": "GG_Waterways", - "logic": "GG_Waterways[door1] | GG_Waterways[right1] + (LEFTSUPERDASH | SWIM) | Warp-Godhome_to_Junk_Pit" - }, - { - "name": "Room_GG_Shortcut", // equivalent to *Geo_Rock-Fluke_Hermit_Dupe - // A to first ledge: (LEFTCLAW + WINGS | RIGHTCLAW) - // B up from first ledge without crossing pool: RIGHTCLAW + WINGS - // C to left side of pool: LEFTDASH + WINGS | LEFTSUPERDASH + WINGS | SWIM | LEFTSUPERDASH + LEFTDASH + LEFTCLAW + PRECISEMOVEMENT - // D up from left side with right claw: RIGHTCLAW + (RIGHTDASH | WINGS | LEFTCLAW + RIGHTSUPERDASH | LEFTCLAW + ENEMYPOGOS) - // E up from left side without right claw: LEFTCLAW + RIGHTDASH + WINGS + PRECISEMOVEMENT - // Room_GG_Shortcut[left1] + A + (B | C + (D | E)) - "logic": "Room_GG_Shortcut[top1] | Room_GG_Shortcut[left1] + (LEFTCLAW + WINGS | RIGHTCLAW) + (RIGHTCLAW + WINGS | (LEFTDASH + WINGS | LEFTSUPERDASH + WINGS | SWIM | LEFTSUPERDASH + LEFTDASH + LEFTCLAW + PRECISEMOVEMENT | $SHRIEKPOGO[2]) + (RIGHTCLAW + (RIGHTDASH | WINGS | LEFTCLAW + (RIGHTSUPERDASH | ENEMYPOGOS)) | LEFTCLAW + RIGHTDASH + WINGS + PRECISEMOVEMENT | LEFTCLAW + $SHRIEKPOGO[2]))" - }, - { - "name": "Warp-Junk_Pit_to_Godhome", - "logic": "GG_Waterways + GODTUNERUNLOCK + DREAMNAIL" - }, - { - "name": "Warp-Godhome_to_Junk_Pit", - "logic": "Warp-Junk_Pit_to_Godhome | GG_Atrium" - }, - { - "name": "GG_Atrium", - "logic": "Warp-Junk_Pit_to_Godhome + (RIGHTCLAW | WINGS | LEFTCLAW + RIGHTSUPERDASH) | GG_Workshop + (LEFTCLAW | RIGHTCLAW + WINGS | $SHRIEKPOGO[5]) | Bench-Godhome_Atrium" - }, - { - "name": "GG_Workshop", - "logic": "GG_Atrium + (SWIM + $HOTSPRINGRESET | ANY) | Bench-Hall_of_Gods" - }, - { - "name": "Ruins1_03", - "logic": "Ruins1_03[top1] | Ruins1_03[left1] | Ruins1_03[right1] | Ruins1_03[right2]" - }, - { - "name": "Ruins1_05b", - "logic": "Ruins1_05b[top1] | Ruins1_05b[right1] | Ruins1_05b[left1] | Ruins1_05b[bot1]" - }, - { - "name": "Ruins1_05c", - "logic": "Ruins1_05c[bot1] | Ruins1_05c[left2] | Ruins1_05c[top1] | Ruins1_05c[top2] | Ruins1_05c[top3]" - }, - { - "name": "Ruins1_05", - "logic": "Ruins1_05[bot3] | Ruins1_05[right1] | Ruins1_05[right2] | Ruins1_05[top1]" - }, - { - "name": "Ruins1_23", - "logic": "Ruins1_23[right2] | Ruins1_23[left1] | Ruins1_23[bot1]" - }, - { - "name": "Ruins1_28", - "logic": "Ruins1_28[left1] + (RIGHTCLAW | WINGS | RIGHTDASH | LEFTCLAW + RIGHTSUPERDASH | BACKGROUNDPOGOS | $SHADESKIP) | Ruins1_28[bot1] | Ruins1_28[right1]" - }, - { - "name": "Ruins1_30", - "logic": "Ruins1_30[left1] | (Ruins1_30[left2] + (LEFTCLAW | RIGHTCLAW + BACKGROUNDPOGOS | WINGS) + Broke_Sanctum_Escape_Quake_Floor_1 + Broke_Sanctum_Escape_Quake_Floor_2) | Ruins1_30[bot1] | Ruins1_30[right1]" - }, - { - "name": "Ruins1_31", - "logic": "Ruins1_31[right1] | Ruins1_31[left2] | Ruins1_31[left3]" - }, - { - "name": "Ruins2_01", - "logic": "Ruins2_01[top1] | Ruins2_01[bot1] | Ruins2_01[left2]" - }, - { - "name": "Ruins2_01_b", - "logic": "Ruins2_01_b[top1] | Ruins2_01_b[left1] | Ruins2_01_b[right1]" - }, - { - "name": "Ruins2_03b", - "logic": "Ruins2_03b[top1] | Ruins2_03b[top2] | Ruins2_03b[left1] | Ruins2_03b[bot1]" - }, - { - "name": "Ruins2_04", - "logic": "Ruins2_04[left1] | Ruins2_04[left2] | Ruins2_04[right1] | Ruins2_04[right2] | Ruins2_04[door_Ruin_House_01] | Ruins2_04[door_Ruin_House_02] | Ruins2_04[door_Ruin_House_03] | Ruins2_04[door_Ruin_Elevator]" - }, - { - "name": "Ruins2_10", - "logic": "Ruins2_10[right1] | Ruins2_10[left1] | Right_Elevator" - }, - { - "name": "RestingGrounds_02", - "logic": "RestingGrounds_02[top1] | RestingGrounds_02[left1] | RestingGrounds_02[bot1] | RestingGrounds_02[right1]" - }, - { - "name": "RestingGrounds_05", - "logic": "RestingGrounds_05[left1] | RestingGrounds_05[left2] | RestingGrounds_05[left3] | RestingGrounds_05[right1] | RestingGrounds_05[right2] | RestingGrounds_05[bot1]" - }, - { - "name": "RestingGrounds_10", - "logic": "RestingGrounds_10[left1] | RestingGrounds_10[top1] | RestingGrounds_10[top2]" - }, - { - "name": "Mines_02", - "logic": "Mines_02[top1] | Mines_02[top2] | Mines_02[left1] | Mines_02[right1]" - }, - { - "name": "Mines_03", - "logic": "Mines_03[right1] | Mines_03[top1] | Mines_03[bot1]" - }, - { - "name": "Mines_04", - "logic": "Mines_04[left1] | Mines_04[left2] | Mines_04[left3] + (FULLCLAW | WINGS + (ANYCLAW | ENEMYPOGOS) | $SHRIEKPOGO[2,2,before:AREASOUL,after:AREASOUL]) | Mines_04[right1] | Mines_04[top1]" - }, - { - "name": "Mines_05", - "logic": "Mines_05[right1] | Mines_05[top1] | Mines_05[bot1] | Mines_05[left1] | Mines_05[left2]" - // equivalent to left2 (breakable wall before deep focus) - // note: crystal crawler pogos required in skipless logic - }, - { - "name": "Mines_10", // deprecated - "logic": "Mines_10[left1] + Mines_10[bot1]/ | Mines_10[bot1] + Mines_10[left1]/" - }, - { - "name": "Mines_11", - "logic": "Mines_11[bot1] + (LEFTCLAW | WINGS | RIGHTCLAW + BACKGROUNDPOGOS) | Mines_11[right1] | Mines_11[top1]" - }, - { - "name": "Mines_18", - "logic": "Mines_18[left1] | Mines_18[right1] | Mines_18[top1]" - }, - { - "name": "Mines_20", - "logic": "Mines_20[left1] | Mines_20[right1] | (Mines_20[right2] + (FULLCLAW | WINGS + ANYCLAW))" - }, - { - "name": "Mines_23", - "logic": "(FULLDASH | WINGS | FULLCLAW + FULLSUPERDASH) + (Mines_23[left1] | Mines_23[top1] | Mines_23[right2]) | Mines_23[right1]" - }, - { - "name": "Mines_31", // first CH totem - "logic": "Mines_31[left1] + (LEFTCLAW + (RIGHTDASH | WINGS | SPELLAIRSTALL + $CASTSPELL[2] | RIGHTSUPERDASH + PRECISEMOVEMENT) | WINGS + $SHADESKIP[2HITS] | $SHRIEKPOGO[4,before:AREASOUL] | ANYCLAW + RIGHTSUPERDASH + WINGS)" - // 6 shriek pogos to ascend from CH side - }, - { - "name": "Fungus3_04", - "logic": "Fungus3_04[left1] | Fungus3_04[left2] | Fungus3_04[right1] | Fungus3_04[right2]" - }, - { - "name": "Fungus3_11", - "logic": "Fungus3_11[left1] | Fungus3_11[left2] + (LEFTCLAW | RIGHTCLAW + WINGS | ENEMYPOGOS + $SHRIEKPOGO[before:AREASOUL,after:ROOMSOUL]) | Fungus3_11[right1] + (LEFTCLAW | WINGS | RIGHTCLAW + ENEMYPOGOS)" - }, - { - "name": "Fungus3_13", - "logic": "Fungus3_13[left1] | Fungus3_13[left2] | Fungus3_13[left3] | Fungus3_13[bot1] | Fungus3_13[right1]" - }, - { - "name": "Fungus3_22", - "logic": "Fungus3_22[right1] | Fungus3_22[left1] | Fungus3_22[bot1]" - }, - { - "name": "Fungus3_34", - "logic": "(Fungus3_34[left1] + (RIGHTDASH | RIGHTSUPERDASH | WINGS | $SHADESKIP)) | Fungus3_34[right1] | Fungus3_34[top1]" - }, - { - "name": "Fungus3_40", - "logic": "Fungus3_40[top1] | Fungus3_40[right1]" - }, - { - "name": "Cliffs_01", - "logic": "Cliffs_01[right1] | Cliffs_01[right2] | Cliffs_01[right3] | Cliffs_01[right4]" - }, - { - "name": "Cliffs_02", - "logic": "Cliffs_02[bot1] + (LEFTCLAW | WINGS | (RIGHTCLAW + (LEFTDASH | LEFTSUPERDASH | ENEMYPOGOS))) | (Cliffs_02[door1] | Cliffs_02[left1]) + (ANYCLAW | WINGS | ENEMYPOGOS) | Cliffs_02[left2]" - }, - { - "name": "White_Palace_01", - "logic": "White_Palace_01[left1] + (WINGS | RIGHTCLAW + ANYDASH) | (White_Palace_01[right1] + (LEFTDASH | LEFTSUPERDASH + RIGHTCLAW | LEFTCLAW + PRECISEMOVEMENT | WINGS) | White_Palace_01[top1] + Palace_Entrance_Lantern_Lit) + (LEFTDASH + (BACKGROUNDPOGOS | LEFTCLAW) | LEFTSUPERDASH + RIGHTCLAW | WINGS) | Bench-Palace_Entrance" - }, - { - "name": "White_Palace_03_hub", - "logic": "White_Palace_03_hub[left1] | White_Palace_03_hub[left2] | White_Palace_03_hub[bot1] + (ANYCLAW | $SHRIEKPOGO[4,after:AREASOUL]) | White_Palace_03_hub[right1] | White_Palace_03_hub[top1] + Palace_Atrium_Gates_Opened | Bench-Palace_Atrium" - }, - { - "name": "White_Palace_13", - "logic": "(White_Palace_13[left2] + (RIGHTSUPERDASH | RIGHTDASH + WINGS | RIGHTDASH + ANYCLAW | WINGS + ANYCLAW | (RIGHTDASH | WINGS) + PRECISEMOVEMENT) | White_Palace_13[right1] + OBSCURESKIPS + LEFTSUPERDASH + (WINGS | LEFTDASH)) + (FULLCLAW + WINGS + (LEFTDASH | LEFTSUPERDASH) | LEFTCLAW + LEFTDASH + (WINGS | SPELLAIRSTALL + $CASTSPELL[3,before:ROOMSOUL,after:ROOMSOUL]) + (RIGHTDASH | RIGHTSUPERDASH) | FULLCLAW + RIGHTDASH + LEFTSUPERDASH + (LEFTDASH | SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL]) | LEFTCLAW + $SHRIEKPOGO[2,before:ROOMSOUL,after:ROOMSOUL] | RIGHTCLAW + $SHRIEKPOGO[3,before:ROOMSOUL,after:ROOMSOUL,NOSTALL]) | White_Palace_13[left1] + (RIGHTCLAW + FULLSUPERDASH | RIGHTSUPERDASH + SPIKETUNNELS + LEFTDASH + (DASHMASTER | SPELLAIRSTALL + $CASTSPELL[after:ROOMSOUL])) | White_Palace_13[left3]" - }, - { - "name": "Abyss_05", - "logic": "Abyss_05[left1] | Abyss_05[right1] | Warp-White_Palace_Entrance_to_Palace_Grounds | Warp-White_Palace_Atrium_to_Palace_Grounds" - } -] diff --git a/RandomizerMod/Resources/entries.txt b/RandomizerMod/Resources/entries.txt deleted file mode 100644 index 5c86d36..0000000 --- a/RandomizerMod/Resources/entries.txt +++ /dev/null @@ -1,168 +0,0 @@ -Great Hopper -Mantis Petra -Gluttonous Husk -Pilflip -Garpede -Weathered Mask -Uumuu -Violent Husk -Tiktik -Sharp Baldur -Death Loodle -Winged Sentry -Wandering Husk -Husk Miner -Obble -Mossy Vagabond -Crawlid -Maskfly -Hornet -Gruzzer -Lance Sentry -Husk Bully -Grimmkin Novice -Goam -Mistake -Nightmare King -Leaping Husk -Nosk -Aspid Mother -Boofly -Great Nailsage Sly -Sibling -Gorb -Loodle -Deepling -Armoured Squit -Fungified Husk -Primal Aspid -Baldur -Grey Prince Zote -Little Weaver -Corpse Creeper -Squit -Charged Lumafly -Hollow Knight -Mosskin -Broken Vessel -Fungling -Ooma -Husk Warrior -Mantis Warrior -Mossfly -Hiveling -Mosscreep -Hopping Zoteling -Kingsmould -Volatile Mosskin -Stalking Devout -Lesser Mawlek -Wingmould -Shrumeling -Aluba -Mantis Lords -Aspid Hunter -Volt Twister -Aspid Hatchling -Crystal Hunter -Void Idol -Shrumal Ogre -No Eyes -Radiance -Glimback -Seal of Binding -Watcher Knight -Xero -Vengefly -Lifeseed -Pure Vessel -Shielded Fool -Traitor Lord -Hive Guardian -Spiny Husk -Cowardly Husk -Hopper -Gorgeous Husk -Dirtcarver -Menderbug -Marmu -Soul Twister -God Tamer -Nailmasters Oro & Mato -Bluggsac -Sporg -Flukemarm -Pale Lurker -Husk Hornhead -Gruz Mother -Mantis Youth -Vengefly King -Massive Moss Charger -Dung Defender -Grimmkin Master -Shrumal Warrior -Hive Knight -Winged Zoteling -Duranda -Moss Charger -Elder Hu -Heavy Sentry -Flukefey -Husk Hive -Paintmaster Sheo -Entombed Husk -Durandoo -Volatile Zoteling -Soul Master -Mantis Traitor -Markoth -Grimmkin Nightmare -Sturdy Fool -Heavy Fool -White Defender -Shadow Creeper -Elder Baldur -Royal Retainer -Hive Soldier -Void Tendrils -Shade -Ambloom -Flukemunga -Folly -Slobbering Husk -Crystallised Husk -Crystal Crawler -Volatile Gruzzer -Grub Mimic -Great Husk Sentry -Crystal Guardian -The Collector -Zote -Flukemon -Lightseed -Galien -Husk Guard -Grimm -Maggot -Husk Dandy -Gulka -Hunter's Mark -Carver Hatcher -Winged Fool -Shardmite -Husk Sentry -Mawlurk -Deephunter -False Knight -Belfly -Fool Eater -Brooding Mawlek -Moss Knight -Fungoon -Soul Warrior -Oblobble -Infected Balloon -Battle Obble -Uoma -Furious Vengefly -Hwurmp \ No newline at end of file diff --git a/RandomizerMod/Resources/logo.png b/RandomizerMod/Resources/logo.png deleted file mode 100644 index 50f5b22..0000000 Binary files a/RandomizerMod/Resources/logo.png and /dev/null differ diff --git a/RandomizerMod/Settings/BinaryFormatting.cs b/RandomizerMod/Settings/BinaryFormatting.cs deleted file mode 100644 index 543a24a..0000000 --- a/RandomizerMod/Settings/BinaryFormatting.cs +++ /dev/null @@ -1,237 +0,0 @@ -using System.Collections; -using System.Text; -using System.Reflection; -using MenuChanger.Attributes; - -namespace RandomizerMod.Settings -{ - public class MinValueAttribute : Attribute - { - public MinValueAttribute(int value) { Value = value; } - public readonly int Value; - } - - public class MaxValueAttribute : Attribute - { - public MaxValueAttribute(int value) { Value = value; } - public readonly int Value; - } - - public readonly struct ConstrainedIntField - { - public ConstrainedIntField(FieldInfo field) - { - this.field = field; - - if (field.GetCustomAttribute() is MenuRangeAttribute mr) - { - this.minValue = (int)mr.min; - this.maxValue = (int)mr.max; - } - else - { - if (field.GetCustomAttribute() is MinValueAttribute min) - { - this.minValue = min.Value; - } - else if (field.FieldType.IsEnum) - { - this.minValue = Enum.GetValues(field.FieldType).Cast().Min(); - } - else this.minValue = int.MinValue; - - if (field.GetCustomAttribute() is MaxValueAttribute max) - { - this.maxValue = max.Value; - } - else if (field.FieldType.IsEnum) - { - this.maxValue = Enum.GetValues(field.FieldType).Cast().Max(); - } - else this.maxValue = int.MaxValue; - } - } - - public readonly FieldInfo field; - public readonly int minValue; - public readonly int maxValue; - } - - public static class BinaryFormatting - { - public const char CLASS_SEPARATOR = ';'; - public const char STRING_SEPARATOR = '\''; - - public class ReflectionData - { - static Dictionary cache = new Dictionary(); - - public static ReflectionData GetReflectionData(Type T) - { - if (cache.TryGetValue(T, out ReflectionData rd)) return rd; - else - { - cache[T] = rd = new ReflectionData(T); - return rd; - } - } - - public FieldInfo[] boolFields; - public FieldInfo[] stringFields; - public ConstrainedIntField[] intFields; - public FieldInfo[] floatFields; - - public ReflectionData(Type T) - { - FieldInfo[] fields = T.GetFields(BindingFlags.Public | BindingFlags.Instance); - boolFields = fields.Where(f => f.FieldType == typeof(bool)).OrderBy(f => f.Name).ToArray(); - stringFields = fields.Where(f => f.FieldType == typeof(string)).OrderBy(f => f.Name).ToArray(); - intFields = fields.Where(f => f.FieldType == typeof(int) || f.FieldType.IsEnum).OrderBy(f => f.Name).Select(f => new ConstrainedIntField(f)).ToArray(); - floatFields = fields.Where(f => f.FieldType == typeof(float)).OrderBy(f => f.Name).ToArray(); - } - } - - public static string Serialize(object o) - { - Type T = o.GetType(); - ReflectionData rd = ReflectionData.GetReflectionData(T); - - using MemoryStream stream = new(); - BinaryWriter writer = new(stream); - foreach (ConstrainedIntField f in rd.intFields) - { - int range = f.maxValue - f.minValue; - int value = (int)f.field.GetValue(o); - if (range < 0) - { - writer.Write(value); - } - else if (range <= byte.MaxValue) - { - writer.Write((byte)(value - f.minValue)); - } - else if (range <= ushort.MaxValue) - { - writer.Write((ushort)(value - f.minValue)); - } - else - { - writer.Write(value); - } - } - foreach (FieldInfo fi in rd.floatFields) - { - writer.Write((float)fi.GetValue(o)); - } - - bool[] boolValues = rd.boolFields.Select(f => (bool)f.GetValue(o)).ToArray(); - foreach (byte b in ConvertBoolArrayToByteArray(boolValues)) - { - writer.Write(b); - } - - writer.Close(); - StringBuilder sb = new(Convert.ToBase64String(stream.ToArray())); - foreach (FieldInfo f in rd.stringFields) - { - string s = (string)f.GetValue(o); - sb.Append(STRING_SEPARATOR); - if (s != null) sb.Append(Convert.ToBase64String(Encoding.ASCII.GetBytes(s))); - // this is less compressed than just adding the string directly, but it avoids the risk of special characters in the string - // and critically, prevents people from memeing about the start location name being readable from the settings string. - } - return sb.ToString(); - } - - public static void Deserialize(string code, object o) - { - Type T = o.GetType(); - ReflectionData rd = ReflectionData.GetReflectionData(T); - - string[] pieces = code.Split(STRING_SEPARATOR); - code = pieces[0]; - - byte[] bytes; - try - { - bytes = Convert.FromBase64String(code); - } - catch (Exception e) - { - LogHelper.LogWarn($"Malformatted Base64 string {{{code}}}\n" + e); - return; - } - - - using MemoryStream stream = new(bytes); - using BinaryReader reader = new(stream); - try - { - foreach (ConstrainedIntField field in rd.intFields) - { - int range = field.maxValue - field.minValue; - if (range < 0) - { - field.field.SetValue(o, reader.ReadInt32()); - } - else if (range <= byte.MaxValue) - { - field.field.SetValue(o, field.minValue + reader.ReadByte()); - } - else if (range <= ushort.MaxValue) - { - field.field.SetValue(o, field.minValue + reader.ReadUInt16()); - } - else - { - field.field.SetValue(o, reader.ReadInt32()); - } - } - foreach (FieldInfo fi in rd.floatFields) - { - fi.SetValue(o, reader.ReadSingle()); - } - - bool[] boolValues = ConvertByteArrayToBoolArray(reader.ReadBytes(bytes.Length - (int)stream.Position)); - int cap = Math.Min(boolValues.Length, rd.boolFields.Length); - for (int i = 0; i < cap; i++) - { - rd.boolFields[i].SetValue(o, boolValues[i]); - } - - cap = Math.Min(rd.stringFields.Length, pieces.Length - 1); - for (int i = 0; i < cap; i++) - { - string s = pieces[i + 1]; - s = s.Length != 0 ? Encoding.ASCII.GetString(Convert.FromBase64String(s)) : null; - rd.stringFields[i].SetValue(o, s); - } - } - catch (Exception e) - { - LogHelper.LogError($"Error in deserializing {T.Name}:\n{e}"); - } - } - - public static bool[] ConvertByteArrayToBoolArray(byte[] bytes) - { - BitArray bits = new(bytes); - bool[] bools = new bool[bits.Count]; - bits.CopyTo(bools, 0); - return bools; - } - - public static byte[] ConvertBoolArrayToByteArray(bool[] boolArr) - { - BitArray bits = new(boolArr); - byte[] bytes = new byte[bits.Length / 8 + 1]; - if (bits.Length > 0) - { - bits.CopyTo(bytes, 0); - } - - return bytes; - } - - } -} diff --git a/RandomizerMod/Settings/CostSettings.cs b/RandomizerMod/Settings/CostSettings.cs deleted file mode 100644 index dead1f9..0000000 --- a/RandomizerMod/Settings/CostSettings.cs +++ /dev/null @@ -1,78 +0,0 @@ -using MenuChanger.Attributes; - -namespace RandomizerMod.Settings -{ - public class CostSettings : SettingsModule - { - [DynamicBound(nameof(MaximumGrubCost), true)] - [MenuRange(0, 46)] - public int MinimumGrubCost; - - [TriggerValidation(nameof(GrubTolerance))] - [DynamicBound(nameof(MinimumGrubCost), false)] - [MenuRange(0, 46)] - public int MaximumGrubCost; - - [DynamicBound(nameof(GrubToleranceUB), true)] - [MenuRange(0, 46)] - public int GrubTolerance; - private int GrubToleranceUB => 46 - MaximumGrubCost; - - - [DynamicBound(nameof(MaximumEssenceCost), true)] - [MenuRange(0, 2800)] - public int MinimumEssenceCost; - - [DynamicBound(nameof(MinimumEssenceCost), false)] - [MenuRange(0, 2800)] - public int MaximumEssenceCost; - - [MenuRange(0, 250)] - public int EssenceTolerance; - - - [DynamicBound(nameof(MaximumEggCost), true)] - [MenuRange(0, 21)] - public int MinimumEggCost; - - [TriggerValidation(nameof(EggTolerance))] - [DynamicBound(nameof(MinimumEggCost), false)] - [MenuRange(0, 21)] - public int MaximumEggCost; - - [DynamicBound(nameof(EggToleranceUB), true)] - [MenuRange(0, 21)] - public int EggTolerance; - private int EggToleranceUB => 21 - MaximumEggCost; - - - [DynamicBound(nameof(MaximumCharmCost), true)] - [MenuRange(0, 40)] - public int MinimumCharmCost; - - [TriggerValidation(nameof(CharmTolerance))] - [DynamicBound(nameof(MinimumCharmCost), false)] - [MenuRange(0, 40)] - public int MaximumCharmCost; - - [DynamicBound(nameof(CharmToleranceUB), true)] - [MenuRange(0, 40)] - public int CharmTolerance; - private int CharmToleranceUB => 40 - MaximumCharmCost; - - - public override void Clamp(GenerationSettings gs) - { - if (MaximumGrubCost < MinimumGrubCost) MaximumGrubCost = MinimumGrubCost; - if (GrubTolerance + MaximumGrubCost > 46) GrubTolerance = 46 - MaximumGrubCost; - - if (MaximumEssenceCost < MinimumEssenceCost) MaximumEssenceCost = MinimumEssenceCost; - - if (MaximumEggCost < MinimumEggCost) MaximumEggCost = MinimumEggCost; - if (EggTolerance + MaximumEggCost > 21) EggTolerance = 21 - MaximumEggCost; - - if (MaximumCharmCost < MinimumCharmCost) MaximumCharmCost = MinimumCharmCost; - if (CharmTolerance + MaximumCharmCost > 40) CharmTolerance = 40 - MaximumCharmCost; - } - } -} diff --git a/RandomizerMod/Settings/CursedSettings.cs b/RandomizerMod/Settings/CursedSettings.cs deleted file mode 100644 index 47916e7..0000000 --- a/RandomizerMod/Settings/CursedSettings.cs +++ /dev/null @@ -1,33 +0,0 @@ -using MenuChanger.Attributes; -using RandomizerCore.Extensions; -using System.Text; - -namespace RandomizerMod.Settings -{ - [Serializable] - public class CursedSettings : SettingsModule - { - public bool LongerProgressionChains; - public bool ReplaceJunkWithOneGeo; - public bool RemoveSpellUpgrades; - public bool Deranged; - [MenuRange(0, 4)] - public int CursedMasks; - [MenuRange(0, 2)] - public int CursedNotches; - public bool RandomizeMimics; - [MinValue(0)] - public int MaximumGrubsReplacedByMimics; - - public string ToMultiline() - { - StringBuilder sb = new("Curses"); - foreach (var field in Util.GetFieldNames(typeof(CursedSettings))) - { - sb.AppendLine($"{field.FromCamelCase()}: {Util.Get(this, field)}"); - } - - return sb.ToString(); - } - } -} diff --git a/RandomizerMod/Settings/DuplicateItemSettings.cs b/RandomizerMod/Settings/DuplicateItemSettings.cs deleted file mode 100644 index 2a3ab86..0000000 --- a/RandomizerMod/Settings/DuplicateItemSettings.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace RandomizerMod.Settings -{ - public class DuplicateItemSettings : SettingsModule - { - public bool MothwingCloak; - public bool MantisClaw; - public bool CrystalHeart; - public bool MonarchWings; - public bool ShadeCloak; - public bool DreamNail; - public bool VoidHeart; - public bool Dreamer; - public bool SwimmingItems; - public bool LevelOneSpells; - - public bool LevelTwoSpells; - public bool Grimmchild; - public bool NailArts; - public bool CursedNailItems; - public bool DuplicateUniqueKeys; - public SimpleKeySetting SimpleKeyHandling; - public SplitItemSetting SplitClawHandling; - public SplitItemSetting SplitCloakHandling; - public SplitItemSetting SplitSuperdashHandling; - public enum SimpleKeySetting - { - NoDupe, - TwoExtraKeysInLogic, - TwoDupeKeys, - } - - public enum SplitItemSetting - { - NoDupe, - DupeLeft, - DupeRight, - DupeRandom, - DupeBoth, - } - } -} diff --git a/RandomizerMod/Settings/GenerationSettings.cs b/RandomizerMod/Settings/GenerationSettings.cs deleted file mode 100644 index 327e832..0000000 --- a/RandomizerMod/Settings/GenerationSettings.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System.Reflection; - -namespace RandomizerMod.Settings -{ - [Serializable] - public class GenerationSettings : ICloneable - { - public int Seed; - public TransitionSettings TransitionSettings = Presets.TransitionPresetData.None.Clone() as TransitionSettings; - public SkipSettings SkipSettings = Presets.SkipPresetData.Casual.Clone() as SkipSettings; - public PoolSettings PoolSettings = Presets.PoolPresetData.Standard.Clone() as PoolSettings; - public NoveltySettings NoveltySettings = Presets.NoveltyPresetData.Basic.Clone() as NoveltySettings; - public CostSettings CostSettings = Presets.CostPresetData.Standard.Clone() as CostSettings; - public CursedSettings CursedSettings = Presets.CursePresetData.None.Clone() as CursedSettings; - public LongLocationSettings LongLocationSettings = Presets.LongLocationPresetData.Standard.Clone() as LongLocationSettings; - public StartLocationSettings StartLocationSettings = Presets.StartLocationPresetData.KingsPass.Clone() as StartLocationSettings; - public StartItemSettings StartItemSettings = Presets.StartItemPresetData.EarlyGeo.Clone() as StartItemSettings; - public MiscSettings MiscSettings = Presets.MiscPresetData.Standard.Clone() as MiscSettings; - public ProgressionDepthSettings ProgressionDepthSettings = new(); - public DuplicateItemSettings DuplicateItemSettings = Presets.DuplicateItemPresetData.DuplicateMajorItems.Clone() as DuplicateItemSettings; - public SplitGroupSettings SplitGroupSettings = Presets.SplitGroupPresetData.Disabled.Clone() as SplitGroupSettings; - - public GenerationSettings() - { - } - - private SettingsModule[] modules => moduleFields.Select(f => f.GetValue(this) as SettingsModule).ToArray(); - private static readonly FieldInfo[] moduleFields = typeof(GenerationSettings).GetFields().Where(f => f.FieldType.IsSubclassOf(typeof(SettingsModule))) - .OrderBy(f => f.Name).ToArray(); - - public string Serialize() - { - return RandomizerMod.Version + string.Join(BinaryFormatting.CLASS_SEPARATOR.ToString(), modules.Select(o => BinaryFormatting.Serialize(o)).ToArray()) + BinaryFormatting.CLASS_SEPARATOR + Seed; - } - - public static GenerationSettings Deserialize(string code) - { - if (!code.StartsWith(RandomizerMod.Version)) - { - throw new ArgumentException("Invalid settings code: outdated RandomizerMod version."); - } - else code = code.Substring(RandomizerMod.Version.Length); - - GenerationSettings gs = new(); - string[] pieces = code.Split(BinaryFormatting.CLASS_SEPARATOR); - object[] fields = gs.modules; - - if (pieces.Length < fields.Length) - { - throw new ArgumentException("Invalid settings code: not enough pieces."); - } - else if (pieces.Length > fields.Length + 1) - { - throw new ArgumentException("Invalid settings code: too many pieces."); - } - - for (int i = 0; i < fields.Length; i++) - { - BinaryFormatting.Deserialize(pieces[i], fields[i]); - } - - if (pieces.Length == fields.Length + 1 && int.TryParse(pieces[fields.Length], out int seed)) gs.Seed = seed; - else gs.Seed = int.MinValue; - - return gs; - } - - public void Randomize(Random rng) - { - Seed = rng.Next(1000000000); - foreach (SettingsModule m in modules) m.Randomize(rng); - Clamp(); - } - - public void Clamp() - { - foreach (SettingsModule m in modules) m.Clamp(this); - } - - public object Clone() - { - GenerationSettings gs = MemberwiseClone() as GenerationSettings; - foreach (FieldInfo f in moduleFields) f.SetValue(gs, (f.GetValue(this) as SettingsModule).Clone()); - return gs; - } - - public void CopyTo(GenerationSettings target) - { - foreach (FieldInfo fi in moduleFields) - { - ((SettingsModule)fi.GetValue(this)).CopyTo((SettingsModule)fi.GetValue(target)); - } - } - - // fields for hard-coding the path of a logic setting - private const bool True = true; - private const bool False = false; - } -} diff --git a/RandomizerMod/Settings/GlobalSettings.cs b/RandomizerMod/Settings/GlobalSettings.cs deleted file mode 100644 index 35f925f..0000000 --- a/RandomizerMod/Settings/GlobalSettings.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace RandomizerMod.Settings -{ - public class GlobalSettings - { - public GenerationSettings DefaultMenuSettings = new(); - public List Profiles = new(){ null }; - - public static bool IsInvalid(GlobalSettings value) - { - return value is null || value.Profiles is null || value.DefaultMenuSettings is null; - } - } - - public class MenuProfile - { - public string name; - public GenerationSettings settings; - public override string ToString() - { - return name; - } - } -} diff --git a/RandomizerMod/Settings/LongLocationSettings.cs b/RandomizerMod/Settings/LongLocationSettings.cs deleted file mode 100644 index 61410a3..0000000 --- a/RandomizerMod/Settings/LongLocationSettings.cs +++ /dev/null @@ -1,59 +0,0 @@ -namespace RandomizerMod.Settings -{ - public class LongLocationSettings : SettingsModule - { - public enum WPSetting - { - Allowed, - ExcludePathOfPain, - ExcludeWhitePalace - } - - public enum BossEssenceSetting - { - All, - ExcludeZoteAndWhiteDefender, - ExcludeAllDreamBosses, - ExcludeAllDreamWarriors - } - - public enum CostItemHintSettings - { - CostAndName, - CostOnly, - NameOnly, - None - } - - public WPSetting WhitePalaceRando; - public BossEssenceSetting BossEssenceRando; - - public bool ColosseumPreview; - public bool KingFragmentPreview; - - public bool FlowerQuestPreview; - public bool GreyPrinceZotePreview; - - public bool WhisperingRootPreview; - public bool DreamerPreview; - - public bool AbyssShriekPreview; - public bool VoidHeartPreview; - - public bool GodtunerPreview; - public bool LoreTabletPreview; - - public bool BasinFountainPreview; - public bool NailmasterPreview; - - public bool StagPreview; - public bool MapPreview; - - public bool DivinePreview; - - public CostItemHintSettings GeoShopPreview; - public CostItemHintSettings GrubfatherPreview; - public CostItemHintSettings SeerPreview; - public CostItemHintSettings EggShopPreview; - } -} diff --git a/RandomizerMod/Settings/MiscSettings.cs b/RandomizerMod/Settings/MiscSettings.cs deleted file mode 100644 index 977dc74..0000000 --- a/RandomizerMod/Settings/MiscSettings.cs +++ /dev/null @@ -1,46 +0,0 @@ -using MenuChanger.Attributes; - -namespace RandomizerMod.Settings -{ - public class MiscSettings : SettingsModule - { - public bool RandomizeNotchCosts; - [MenuRange(0, 240)][DynamicBound(nameof(MaxRandomNotchTotal), true)] public int MinRandomNotchTotal = 70; - [MenuRange(0, 240)][DynamicBound(nameof(MinRandomNotchTotal), false)] public int MaxRandomNotchTotal = 110; - public bool ExtraPlatforms; - public SalubraNotchesSetting SalubraNotches; - public MaskShardType MaskShards; - public VesselFragmentType VesselFragments; - public bool SteelSoul; - public ToggleableFireballSetting FireballUpgrade; - - public enum MaskShardType - { - FourShardsPerMask, - TwoShardsPerMask, - OneShardPerMask - } - - public enum VesselFragmentType - { - ThreeFragmentsPerVessel, - TwoFragmentsPerVessel, - OneFragmentPerVessel - } - - public enum SalubraNotchesSetting - { - GroupedWithCharmNotchesPool, - Vanilla, - Randomized, - AutoGivenAtCharmThreshold - } - - public enum ToggleableFireballSetting - { - Normal, - Deferred, - Toggleable - } - } -} diff --git a/RandomizerMod/Settings/NoveltySettings.cs b/RandomizerMod/Settings/NoveltySettings.cs deleted file mode 100644 index 92484c3..0000000 --- a/RandomizerMod/Settings/NoveltySettings.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace RandomizerMod.Settings -{ - public class NoveltySettings : SettingsModule - { - public bool RandomizeSwim; - public bool RandomizeElevatorPass; - public bool RandomizeNail; - public bool RandomizeFocus; - public bool SplitClaw; - public bool SplitCloak; - public bool SplitSuperdash; - public bool EggShop; - } -} diff --git a/RandomizerMod/Settings/PoolSettings.cs b/RandomizerMod/Settings/PoolSettings.cs deleted file mode 100644 index 1c2aa92..0000000 --- a/RandomizerMod/Settings/PoolSettings.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace RandomizerMod.Settings -{ - public class PoolSettings : SettingsModule - { - public bool Dreamers; - public bool Skills; - public bool Charms; - public bool Keys; - public bool MaskShards; - public bool VesselFragments; - public bool PaleOre; - public bool CharmNotches; - public bool GeoChests; - public bool Relics; - public bool RancidEggs; - public bool Stags; - public bool Maps; - public bool WhisperingRoots; - public bool Grubs; - public bool LifebloodCocoons; - public bool SoulTotems; - public bool GrimmkinFlames; - public bool GeoRocks; - public bool BossEssence; - public bool BossGeo; - public bool LoreTablets; - - public bool JournalEntries; - public bool JunkPitChests; - } -} diff --git a/RandomizerMod/Settings/Presets/Captions.cs b/RandomizerMod/Settings/Presets/Captions.cs deleted file mode 100644 index fac307e..0000000 --- a/RandomizerMod/Settings/Presets/Captions.cs +++ /dev/null @@ -1,401 +0,0 @@ -using MenuChanger.Extensions; -using System.Text; - -namespace RandomizerMod.Settings.Presets -{ - public static class Captions - { - public static string Caption(this PoolSettings ps) - { - return string.Join(", ", typeof(PoolSettings).GetFields().Where(f => (bool)f.GetValue(ps)).Select(f => Localize(f.GetMenuName()))); - } - - public static string Caption(this SkipSettings ss) - { - return string.Join(", ", typeof(SkipSettings).GetFields().Where(f => (bool)f.GetValue(ss)).Select(f => Localize(f.GetMenuName()))); - } - - public static string Caption(this CostSettings cs) - { - StringBuilder sb = new(); - sb.AppendLine(Localize("Grub costs may be randomized in ") + $"[{cs.MinimumGrubCost}, {cs.MaximumGrubCost}] ({Localize("tol")}:{cs.GrubTolerance})"); - sb.AppendLine(Localize("Essence costs may be randomized in ") + $"[{cs.MinimumEssenceCost}, {cs.MaximumEssenceCost}] ({Localize("tol")}:{cs.EssenceTolerance})"); - sb.AppendLine(Localize("Egg shop costs may be randomized in ") + $"[{cs.MinimumEggCost}, {cs.MaximumEggCost}] ({Localize("tol")}:{cs.EggTolerance})"); - sb.AppendLine(Localize("Salubra charm costs may be randomized in ") + $"[{cs.MinimumCharmCost}, {cs.MaximumCharmCost}] ({Localize("tol")}:{cs.CharmTolerance})"); - return sb.ToString(); - } - - public static string Caption(this LongLocationSettings ll, GenerationSettings Settings) - { - StringBuilder sb = new(); - switch (ll.WhitePalaceRando) - { - case LongLocationSettings.WPSetting.ExcludePathOfPain: - sb.Append(Localize("Locations (such as soul totems) in Path of Pain will not be randomized. ")); - break; - case LongLocationSettings.WPSetting.ExcludeWhitePalace: - sb.Append(Localize("Locations (such as soul totems or lore tablets) in White Palace will not be randomized. ")); - break; - } - switch (ll.BossEssenceRando) - { - case LongLocationSettings.BossEssenceSetting.ExcludeAllDreamBosses when Settings.PoolSettings.BossEssence: - sb.Append(Localize("Dream Boss essence rewards will not be randomized. ")); - break; - case LongLocationSettings.BossEssenceSetting.ExcludeAllDreamWarriors when Settings.PoolSettings.BossEssence: - sb.Append(Localize("Dream Warrior essence rewards will not be randomized. ")); - break; - case LongLocationSettings.BossEssenceSetting.ExcludeZoteAndWhiteDefender when Settings.PoolSettings.BossEssence: - sb.Append(Localize("Grey Prince Zote and White Defender essence rewards will not be randomized. ")); - break; - } - sb.Append(Localize("See Long Location Options for details regarding location previews.")); - - return sb.ToString(); - } - - public static string Caption(this NoveltySettings ns) - { - StringBuilder sb = new(); - List terms = new(); - - if (ns.RandomizeSwim) terms.Add(Localize("swim")); - if (ns.RandomizeElevatorPass) terms.Add(Localize("ride elevators")); - if (ns.RandomizeFocus) terms.Add(Localize("heal")); - if (ns.RandomizeNail) terms.Add(Localize("attack left or right or up")); - if (terms.Count > 0) - { - string ability = terms.Count > 1 ? "abilities" : "ability"; - sb.Append(Localize($"The {ability} to ")); - for (int i = 0; i < terms.Count - 1; i++) - { - sb.Append(terms[i]); - sb.Append(", "); - } - if (terms.Count == 2) sb.Remove(sb.Length - 2, 1); - if (terms.Count > 1) sb.Append(Localize("and ")); - sb.Append(terms[terms.Count - 1]); - sb.Append(Localize(" will be removed and randomized.")); - } - terms.Clear(); - if (ns.SplitClaw) sb.Append(Localize("The abilities to walljump from left and right slopes will be separated. ")); - if (ns.SplitCloak) sb.Append(Localize("The abilities to dash left and right will be separated. ")); - if (ns.SplitSuperdash) sb.Append(Localize("The abilities to superdash left and right will be separated. ")); - if (ns.EggShop) sb.Append(Localize("Jiji will trade items for rancid eggs. ")); - - return sb.ToString(); - } - - public static string Caption(this CursedSettings cs) - { - StringBuilder sb = new(); - if (cs.ReplaceJunkWithOneGeo) sb.Append(Localize("Luxury items like mask shards and pale ore and the like are replaced with 1 geo pickups. ")); - if (cs.RemoveSpellUpgrades) sb.Append(Localize("Spell upgrades are completely removed. ")); - if (cs.LongerProgressionChains) sb.Append(Localize("Progression items are harder to find on average. ")); - if (cs.Deranged) sb.Append(Localize("Placements are much less likely to be vanilla. ")); - if (cs.CursedMasks > 0) - { - if (cs.CursedMasks == 4) sb.Append(Localize($"Start with only 1 mask. ")); - else sb.Append(Localize($"Start with only {5 - cs.CursedMasks} masks. ")); - } - if (cs.CursedNotches > 0) - { - if (cs.CursedNotches == 2) sb.Append(Localize("Start with only 1 charm notch. ")); - else sb.Append(Localize($"Start with only {3 - cs.CursedNotches} charm notches. ")); - } - if (cs.RandomizeMimics) sb.Append(Localize("Some grub bottles may contain a surprise...")); - - return sb.ToString(); - } - - public static string Caption(this StartItemSettings si) - { - StringBuilder sb = new(); - if (si.MinimumStartGeo == si.MaximumStartGeo) - { - sb.Append($"{Localize("Start with")} {si.MinimumStartGeo} {Localize("geo")}. "); - } - else - { - sb.Append($"{Localize("Start with random geo between")} {si.MinimumStartGeo} {Localize("and")} {si.MaximumStartGeo}. "); - } - - switch (si.VerticalMovement) - { - default: - case StartItemSettings.StartVerticalType.None: - break; - case StartItemSettings.StartVerticalType.ZeroOrMore: - sb.Append(Localize("May start with random vertical movement items. ")); - break; - case StartItemSettings.StartVerticalType.MantisClaw: - sb.Append(Localize("Start with Mantis Claw. ")); - break; - case StartItemSettings.StartVerticalType.MonarchWings: - sb.Append(Localize("Start with Monarch Wings. ")); - break; - case StartItemSettings.StartVerticalType.OneRandomItem: - sb.Append(Localize("Start with a random vertical movement item. ")); - break; - case StartItemSettings.StartVerticalType.All: - sb.Append(Localize("Start with all vertical movement. ")); - break; - } - - switch (si.HorizontalMovement) - { - default: - case StartItemSettings.StartHorizontalType.None: - break; - case StartItemSettings.StartHorizontalType.ZeroOrMore: - sb.Append(Localize("May start with random horizontal movement items. ")); - break; - case StartItemSettings.StartHorizontalType.MothwingCloak: - sb.Append(Localize("Start with Mothwing Cloak. ")); - break; - case StartItemSettings.StartHorizontalType.CrystalHeart: - sb.Append(Localize("Start with Crystal Heart. ")); - break; - case StartItemSettings.StartHorizontalType.OneRandomItem: - sb.Append(Localize("Start with a random horizontal movement item. ")); - break; - case StartItemSettings.StartHorizontalType.All: - sb.Append(Localize("Start with all horizontal movement. ")); - break; - } - - switch (si.Charms) - { - default: - case StartItemSettings.StartCharmType.None: - break; - case StartItemSettings.StartCharmType.ZeroOrMore: - sb.Append(Localize("May start with random equipped charms. ")); - break; - case StartItemSettings.StartCharmType.OneRandomItem: - sb.Append(Localize("Start with a random equipped charm. ")); - break; - } - - switch (si.Stags) - { - default: - case StartItemSettings.StartStagType.None: - break; - case StartItemSettings.StartStagType.DirtmouthStag: - sb.Append(Localize("Start with Dirtmouth Stag door unlocked. ")); - break; - case StartItemSettings.StartStagType.ZeroOrMoreRandomStags: - sb.Append(Localize("May start with some random stags. ")); - break; - case StartItemSettings.StartStagType.OneRandomStag: - sb.Append(Localize("Start with a random stag. ")); - break; - case StartItemSettings.StartStagType.ManyRandomStags: - sb.Append(Localize("Start with several random stags. ")); - break; - case StartItemSettings.StartStagType.AllStags: - sb.Append(Localize("Start with all stags. ")); - break; - } - - switch (si.MiscItems) - { - default: - case StartItemSettings.StartMiscItems.None: - break; - case StartItemSettings.StartMiscItems.DreamNail: - sb.Append(Localize("Start with Dream Nail. ")); - break; - case StartItemSettings.StartMiscItems.DreamNailAndMore: - sb.Append(Localize("Start with Dream Nail and a random assortment of useful items. ")); - break; - case StartItemSettings.StartMiscItems.ZeroOrMore: - sb.Append(Localize("May start with a random assortment of useful items. ")); - break; - case StartItemSettings.StartMiscItems.Many: - sb.Append(Localize("Start with many random useful items. ")); - break; - } - - return sb.ToString(); - } - - public static string Caption(this StartLocationSettings sl) - { - switch (sl.StartLocationType) - { - default: - case StartLocationSettings.RandomizeStartLocationType.Fixed: - return Localize("The randomizer will start at ") + Localize(sl.StartLocation); - case StartLocationSettings.RandomizeStartLocationType.RandomExcludingKP: - return Localize("The randomizer will start at a random location.") + - Localize(" It will not start at King's Pass or any location that requires additional items."); - case StartLocationSettings.RandomizeStartLocationType.Random: - return Localize("The randomizer will start at a random location."); - } - } - - public static string Caption(this TransitionSettings ts) - { - if (ts.Mode == TransitionSettings.TransitionMode.None) return string.Empty; - - StringBuilder sb = new(); - switch (ts.Mode) - { - case TransitionSettings.TransitionMode.MapAreaRandomizer: - sb.Append(Localize("Transitions between areas with different maps (e.g. Greenpath, Fog Canyon) will be randomized. ")); - break; - case TransitionSettings.TransitionMode.FullAreaRandomizer: - sb.Append(Localize("Transitions between areas with different titles (e.g. Greenpath, Lake of Unn) will be randomized. ")); - break; - case TransitionSettings.TransitionMode.RoomRandomizer: - sb.Append(Localize("Transitions between rooms will be randomized. ")); - break; - } - switch (ts.TransitionMatching) - { - case TransitionSettings.TransitionMatchingSetting.MatchingDirections: - sb.Append(Localize("Transition directions will be preserved. ")); - break; - case TransitionSettings.TransitionMatchingSetting.MatchingDirectionsAndNoDoorToDoor: - sb.Append(Localize("Transition directions will be preserved, and doors will not map to doors. ")); - break; - default: - sb.Append(Localize("Transition directions will be randomized. ")); - break; - } - switch (ts.AreaConstraint) - { - case TransitionSettings.AreaConstraintSetting.None: - break; - case TransitionSettings.AreaConstraintSetting.MoreConnectedMapAreas: - sb.Append(Localize("Where possible, transitions will connect to the same map area. ")); - break; - case TransitionSettings.AreaConstraintSetting.MoreConnectedTitledAreas: - sb.Append(Localize("Where possible, transitions will connect to the same titled area. ")); - break; - } - if (ts.Coupled) sb.Append(Localize("Transitions will be reversible.")); - else sb.Append(Localize("Transitions may not be reversible.")); - return sb.ToString(); - } - - public static string Caption(this MiscSettings ms) - { - StringBuilder sb = new(); - if (ms.RandomizeNotchCosts) - { - sb.Append(Localize($"Notch costs of charms will be randomized to a total in [{ms.MinRandomNotchTotal},{ms.MaxRandomNotchTotal}]. ")); - } - else - { - sb.Append(Localize("Notch costs of charms will not be randomized. ")); - } - - if (ms.ExtraPlatforms) - { - sb.Append(Localize("Extra platforms will be added in certain places to prevent softlocks. ")); - } - else - { - sb.Append(Localize("Softlock-prevention platforms will not be provided. ")); - } - - switch (ms.SalubraNotches) - { - case MiscSettings.SalubraNotchesSetting.GroupedWithCharmNotchesPool: - sb.Append(Localize("Salubra notches will behave like other charm notches. ")); - break; - case MiscSettings.SalubraNotchesSetting.Vanilla: - sb.Append(Localize("Salubra notches will never be randomized. ")); - break; - case MiscSettings.SalubraNotchesSetting.Randomized: - sb.Append(Localize("Salubra notches will always be randomized. ")); - break; - case MiscSettings.SalubraNotchesSetting.AutoGivenAtCharmThreshold: - sb.Append(Localize("Salubra notches will be automatically given. ")); - break; - } - switch (ms.MaskShards) - { - case MiscSettings.MaskShardType.FourShardsPerMask: - break; - case MiscSettings.MaskShardType.TwoShardsPerMask: - sb.Append(Localize("Mask Shards will be consolidated to double shards. ")); - break; - case MiscSettings.MaskShardType.OneShardPerMask: - sb.Append(Localize("Mask Shards will be consolidated to quadruple shards. ")); - break; - } - switch (ms.VesselFragments) - { - case MiscSettings.VesselFragmentType.ThreeFragmentsPerVessel: - break; - case MiscSettings.VesselFragmentType.TwoFragmentsPerVessel: - sb.Append(Localize("Vessel Fragments will be consolidated to double fragments. ")); - break; - case MiscSettings.VesselFragmentType.OneFragmentPerVessel: - sb.Append(Localize("Vessel Fragments will be consolidated to triple fragments. ")); - break; - } - if (ms.SteelSoul) - { - sb.Append(Localize("Steel soul mode will be enabled. ")); - } - switch (ms.FireballUpgrade) - { - case MiscSettings.ToggleableFireballSetting.Deferred: - sb.Append(Localize("Once obtained, the Shade Soul upgrade will be deferred until activated from the inventory. ")); - break; - case MiscSettings.ToggleableFireballSetting.Toggleable: - sb.Append(Localize("Once obtained, the Shade Soul upgrade can be toggled freely from the inventory. ")); - break; - } - - return sb.ToString(); - } - - public static string Caption(this DuplicateItemSettings ds) - { - return Localize("For more information, see the Duplicate Items page in Advanced Settings."); - } - - public static string Caption(this SplitGroupSettings sgs) - { - var groups = SplitGroupSettings.IntFields.Values.Select(fi => (fi, (int)fi.GetValue(sgs))) - .Where(p => p.Item2 >= 0) - .GroupBy(p => p.Item2); - - StringBuilder sb = new(); - - if (sgs.RandomizeOnStart) - { - sb.Append("Randomized: "); - sb.Append(string.Join(", ", groups.Where(g => g.Key < 3).SelectMany(g => g.Select(p => Localize(p.fi.GetMenuName()))))); - sb.Append(". "); - foreach (var g in groups.Where(g => g.Key >= 3)) - { - sb.Append(g.Key); - sb.Append(": "); - sb.Append(string.Join(", ", g.Select(p => Localize(p.fi.GetMenuName())))); - sb.Append(". "); - } - } - else - { - foreach (var g in groups) - { - sb.Append(g.Key); - sb.Append(": "); - sb.Append(string.Join(", ", g.Select(p => Localize(p.fi.GetMenuName())))); - sb.Append(". "); - } - } - - if (sb.Length == 0) sb.Append(Localize("Disabled.")); - - return sb.ToString(); - } - } -} diff --git a/RandomizerMod/Settings/Presets/CostPresetData.cs b/RandomizerMod/Settings/Presets/CostPresetData.cs deleted file mode 100644 index cbbff13..0000000 --- a/RandomizerMod/Settings/Presets/CostPresetData.cs +++ /dev/null @@ -1,83 +0,0 @@ -namespace RandomizerMod.Settings.Presets -{ - public static class CostPresetData - { - public static CostSettings Standard; - public static CostSettings More; - public static CostSettings Less; - public static CostSettings Expert; - public static Dictionary CostPresets; - - static CostPresetData() - { - Standard = new CostSettings - { - GrubTolerance = 2, - MinimumGrubCost = 1, - MaximumGrubCost = 23, - EssenceTolerance = 150, - MinimumEssenceCost = 1, - MaximumEssenceCost = 900, - MinimumEggCost = 1, - MaximumEggCost = 15, - EggTolerance = 2, - MinimumCharmCost = 1, - MaximumCharmCost = 20, - CharmTolerance = 2, - }; - Less = new CostSettings - { - GrubTolerance = 2, - MinimumGrubCost = 1, - MaximumGrubCost = 15, - EssenceTolerance = 150, - MinimumEssenceCost = 1, - MaximumEssenceCost = 600, - MinimumEggCost = 1, - MaximumEggCost = 10, - EggTolerance = 2, - MinimumCharmCost = 1, - MaximumCharmCost = 10, - CharmTolerance = 2, - }; - More = new CostSettings - { - GrubTolerance = 4, - MinimumGrubCost = 1, - MaximumGrubCost = 42, - EssenceTolerance = 200, - MinimumEssenceCost = 1, - MaximumEssenceCost = 1800, - MinimumEggCost = 1, - MaximumEggCost = 19, - EggTolerance = 2, - MinimumCharmCost = 1, - MaximumCharmCost = 38, - CharmTolerance = 2, - }; - Expert = new CostSettings - { - GrubTolerance = 0, - MinimumGrubCost = 5, - MaximumGrubCost = 42, - EssenceTolerance = 20, - MinimumEssenceCost = 1, - MaximumEssenceCost = 1800, - MinimumEggCost = 5, - MaximumEggCost = 15, - EggTolerance = 0, - MinimumCharmCost = 5, - MaximumCharmCost = 40, - CharmTolerance = 0, - }; - - CostPresets = new Dictionary - { - { "Standard", Standard }, - { "More", More }, - { "Less", Less }, - { "Expert", Expert }, - }; - } - } -} diff --git a/RandomizerMod/Settings/Presets/CursePresetData.cs b/RandomizerMod/Settings/Presets/CursePresetData.cs deleted file mode 100644 index 8bd5694..0000000 --- a/RandomizerMod/Settings/Presets/CursePresetData.cs +++ /dev/null @@ -1,68 +0,0 @@ -namespace RandomizerMod.Settings.Presets -{ - public static class CursePresetData - { - public static CursedSettings None; - public static CursedSettings Classic; - public static CursedSettings Modern; - public static CursedSettings UltraCursed; - - public static Dictionary CursedPresets; - - static CursePresetData() - { - None = new CursedSettings - { - ReplaceJunkWithOneGeo = false, - RemoveSpellUpgrades = false, - LongerProgressionChains = false, - Deranged = false, - CursedMasks = 0, - CursedNotches = 0, - RandomizeMimics = false, - MaximumGrubsReplacedByMimics = 0, - }; - Classic = new CursedSettings - { - ReplaceJunkWithOneGeo = true, - RemoveSpellUpgrades = true, - LongerProgressionChains = true, - Deranged = false, - CursedMasks = 0, - CursedNotches = 0, - RandomizeMimics = false, - MaximumGrubsReplacedByMimics = 0, - }; - Modern = new CursedSettings - { - ReplaceJunkWithOneGeo = false, - RemoveSpellUpgrades = false, - LongerProgressionChains = false, - Deranged = true, - CursedMasks = 4, - CursedNotches = 2, - RandomizeMimics = true, - MaximumGrubsReplacedByMimics = 10, - }; - UltraCursed = new CursedSettings - { - ReplaceJunkWithOneGeo = true, - RemoveSpellUpgrades = true, - LongerProgressionChains = true, - Deranged = true, - CursedMasks = 4, - CursedNotches = 2, - RandomizeMimics = true, - MaximumGrubsReplacedByMimics = 10, - }; - - CursedPresets = new Dictionary - { - { "None", None }, - { "Classic", Classic }, - { "Modern", Modern }, - { "Ultra Cursed", UltraCursed }, - }; - } - } -} diff --git a/RandomizerMod/Settings/Presets/DuplicateItemPresetData.cs b/RandomizerMod/Settings/Presets/DuplicateItemPresetData.cs deleted file mode 100644 index ae56ecd..0000000 --- a/RandomizerMod/Settings/Presets/DuplicateItemPresetData.cs +++ /dev/null @@ -1,63 +0,0 @@ -namespace RandomizerMod.Settings.Presets -{ - public static class DuplicateItemPresetData - { - public static DuplicateItemSettings DuplicateMajorItems; - public static DuplicateItemSettings None; - public static Dictionary Presets; - - - static DuplicateItemPresetData() - { - DuplicateMajorItems = new() - { - MothwingCloak = true, - MantisClaw = true, - CrystalHeart = true, - MonarchWings = true, - ShadeCloak = true, - DreamNail = true, - VoidHeart = true, - Dreamer = true, - SwimmingItems = true, - LevelOneSpells = true, - LevelTwoSpells = false, - Grimmchild = false, - NailArts = false, - CursedNailItems = false, - DuplicateUniqueKeys = false, - SimpleKeyHandling = DuplicateItemSettings.SimpleKeySetting.TwoExtraKeysInLogic, - SplitClawHandling = DuplicateItemSettings.SplitItemSetting.NoDupe, - SplitCloakHandling = DuplicateItemSettings.SplitItemSetting.DupeBoth, - }; - None = new() - { - MothwingCloak = false, - MantisClaw = false, - CrystalHeart = false, - MonarchWings = false, - ShadeCloak = false, - DreamNail = false, - VoidHeart = false, - Dreamer = false, - SwimmingItems = false, - LevelOneSpells = false, - LevelTwoSpells = false, - Grimmchild = false, - NailArts = false, - CursedNailItems = false, - DuplicateUniqueKeys = false, - SimpleKeyHandling = DuplicateItemSettings.SimpleKeySetting.NoDupe, - SplitClawHandling = DuplicateItemSettings.SplitItemSetting.NoDupe, - SplitCloakHandling = DuplicateItemSettings.SplitItemSetting.NoDupe, - }; - - Presets = new() - { - { "Duplicate Major Items", DuplicateMajorItems }, - { "None", None }, - }; - } - - } -} diff --git a/RandomizerMod/Settings/Presets/LongLocationPresetData.cs b/RandomizerMod/Settings/Presets/LongLocationPresetData.cs deleted file mode 100644 index f454136..0000000 --- a/RandomizerMod/Settings/Presets/LongLocationPresetData.cs +++ /dev/null @@ -1,153 +0,0 @@ -namespace RandomizerMod.Settings.Presets -{ - public static class LongLocationPresetData - { - public static LongLocationSettings Standard; - public static LongLocationSettings Easier; - public static LongLocationSettings FewerHints; - public static LongLocationSettings DAB; - public static LongLocationSettings NoPreviews; - - public static Dictionary LongLocationPresets; - - static LongLocationPresetData() - { - Standard = new LongLocationSettings - { - WhitePalaceRando = LongLocationSettings.WPSetting.Allowed, - BossEssenceRando = LongLocationSettings.BossEssenceSetting.All, - ColosseumPreview = true, - KingFragmentPreview = true, - FlowerQuestPreview = true, - GreyPrinceZotePreview = true, - WhisperingRootPreview = true, - AbyssShriekPreview = true, - VoidHeartPreview = true, - DreamerPreview = true, - GodtunerPreview = true, - BasinFountainPreview = true, - NailmasterPreview = true, - MapPreview = true, - StagPreview = true, - LoreTabletPreview = true, - DivinePreview = true, - GeoShopPreview = LongLocationSettings.CostItemHintSettings.CostAndName, - GrubfatherPreview = LongLocationSettings.CostItemHintSettings.CostAndName, - SeerPreview = LongLocationSettings.CostItemHintSettings.CostAndName, - EggShopPreview = LongLocationSettings.CostItemHintSettings.CostAndName, - }; - - Easier = new LongLocationSettings - { - WhitePalaceRando = LongLocationSettings.WPSetting.ExcludePathOfPain, - BossEssenceRando = LongLocationSettings.BossEssenceSetting.ExcludeZoteAndWhiteDefender, - ColosseumPreview = true, - KingFragmentPreview = true, - FlowerQuestPreview = true, - GreyPrinceZotePreview = true, - WhisperingRootPreview = true, - AbyssShriekPreview = true, - VoidHeartPreview = true, - DreamerPreview = true, - GodtunerPreview = true, - BasinFountainPreview = true, - NailmasterPreview = true, - StagPreview = true, - MapPreview = true, - LoreTabletPreview = true, - DivinePreview = true, - GeoShopPreview = LongLocationSettings.CostItemHintSettings.CostAndName, - GrubfatherPreview = LongLocationSettings.CostItemHintSettings.CostAndName, - SeerPreview = LongLocationSettings.CostItemHintSettings.CostAndName, - EggShopPreview = LongLocationSettings.CostItemHintSettings.CostAndName, - }; - - FewerHints = new LongLocationSettings - { - WhitePalaceRando = LongLocationSettings.WPSetting.Allowed, - BossEssenceRando = LongLocationSettings.BossEssenceSetting.All, - ColosseumPreview = true, - KingFragmentPreview = true, - FlowerQuestPreview = true, - GreyPrinceZotePreview = true, - WhisperingRootPreview = false, - AbyssShriekPreview = false, - VoidHeartPreview = false, - DreamerPreview = false, - GodtunerPreview = false, - BasinFountainPreview = false, - NailmasterPreview = false, - StagPreview = false, - MapPreview = false, - LoreTabletPreview = false, - DivinePreview = false, - GeoShopPreview = LongLocationSettings.CostItemHintSettings.CostAndName, - GrubfatherPreview = LongLocationSettings.CostItemHintSettings.CostOnly, - SeerPreview = LongLocationSettings.CostItemHintSettings.CostOnly, - EggShopPreview = LongLocationSettings.CostItemHintSettings.CostOnly, - }; - - DAB = new LongLocationSettings - { - WhitePalaceRando = LongLocationSettings.WPSetting.ExcludeWhitePalace, - BossEssenceRando = LongLocationSettings.BossEssenceSetting.ExcludeAllDreamBosses, - ColosseumPreview = true, - KingFragmentPreview = true, - FlowerQuestPreview = true, - GreyPrinceZotePreview = true, - WhisperingRootPreview = true, - AbyssShriekPreview = true, - VoidHeartPreview = true, - DreamerPreview = true, - GodtunerPreview = true, - BasinFountainPreview = true, - NailmasterPreview = true, - StagPreview = true, - MapPreview = true, - LoreTabletPreview = true, - DivinePreview = true, - GeoShopPreview = LongLocationSettings.CostItemHintSettings.CostAndName, - GrubfatherPreview = LongLocationSettings.CostItemHintSettings.CostAndName, - SeerPreview = LongLocationSettings.CostItemHintSettings.CostAndName, - EggShopPreview = LongLocationSettings.CostItemHintSettings.CostAndName, - }; - - NoPreviews = new LongLocationSettings - { - WhitePalaceRando = LongLocationSettings.WPSetting.Allowed, - BossEssenceRando = LongLocationSettings.BossEssenceSetting.All, - ColosseumPreview = false, - KingFragmentPreview = false, - FlowerQuestPreview = false, - GreyPrinceZotePreview = false, - WhisperingRootPreview = false, - AbyssShriekPreview = false, - VoidHeartPreview = false, - DreamerPreview = false, - GodtunerPreview = false, - BasinFountainPreview = false, - NailmasterPreview = false, - StagPreview = false, - MapPreview = false, - LoreTabletPreview = false, - DivinePreview = false, - GeoShopPreview = LongLocationSettings.CostItemHintSettings.None, - GrubfatherPreview = LongLocationSettings.CostItemHintSettings.None, - SeerPreview = LongLocationSettings.CostItemHintSettings.None, - EggShopPreview = LongLocationSettings.CostItemHintSettings.None, - }; - - - LongLocationPresets = new Dictionary - { - { "Standard", Standard }, - { "Easier", Easier }, - { "Fewer Hints", FewerHints }, - { "DAB", DAB }, - { "No Previews", NoPreviews }, - }; - } - - - } -} diff --git a/RandomizerMod/Settings/Presets/MiscPresetData.cs b/RandomizerMod/Settings/Presets/MiscPresetData.cs deleted file mode 100644 index 5aa5573..0000000 --- a/RandomizerMod/Settings/Presets/MiscPresetData.cs +++ /dev/null @@ -1,59 +0,0 @@ -namespace RandomizerMod.Settings.Presets -{ - public static class MiscPresetData - { - public static MiscSettings Standard; - public static MiscSettings Classic; - public static MiscSettings ConsolidatedItems; - public static Dictionary MiscPresets; - - static MiscPresetData() - { - Standard = new MiscSettings - { - MaskShards = MiscSettings.MaskShardType.FourShardsPerMask, - VesselFragments = MiscSettings.VesselFragmentType.ThreeFragmentsPerVessel, - RandomizeNotchCosts = true, - MinRandomNotchTotal = 70, - MaxRandomNotchTotal = 110, - ExtraPlatforms = true, - SalubraNotches = MiscSettings.SalubraNotchesSetting.GroupedWithCharmNotchesPool, - SteelSoul = false, - FireballUpgrade = MiscSettings.ToggleableFireballSetting.Normal, - }; - - Classic = new MiscSettings - { - MaskShards = MiscSettings.MaskShardType.FourShardsPerMask, - VesselFragments = MiscSettings.VesselFragmentType.ThreeFragmentsPerVessel, - RandomizeNotchCosts = false, - MinRandomNotchTotal = 70, - MaxRandomNotchTotal = 110, - ExtraPlatforms = true, - SalubraNotches = MiscSettings.SalubraNotchesSetting.AutoGivenAtCharmThreshold, - SteelSoul = false, - FireballUpgrade = MiscSettings.ToggleableFireballSetting.Normal, - }; - - ConsolidatedItems = new MiscSettings - { - MaskShards = MiscSettings.MaskShardType.OneShardPerMask, - VesselFragments = MiscSettings.VesselFragmentType.OneFragmentPerVessel, - RandomizeNotchCosts = true, - MinRandomNotchTotal = 70, - MaxRandomNotchTotal = 110, - ExtraPlatforms = true, - SalubraNotches = MiscSettings.SalubraNotchesSetting.GroupedWithCharmNotchesPool, - SteelSoul = false, - FireballUpgrade = MiscSettings.ToggleableFireballSetting.Normal, - }; - - MiscPresets = new Dictionary - { - { "Standard", Standard }, - { "Classic", Classic }, - { "Consolidated Items", ConsolidatedItems }, - }; - } - } -} diff --git a/RandomizerMod/Settings/Presets/NoveltyPresetData.cs b/RandomizerMod/Settings/Presets/NoveltyPresetData.cs deleted file mode 100644 index 0b0dd78..0000000 --- a/RandomizerMod/Settings/Presets/NoveltyPresetData.cs +++ /dev/null @@ -1,84 +0,0 @@ -namespace RandomizerMod.Settings.Presets -{ - public static class NoveltyPresetData - { - public static Dictionary NoveltyPresets; - public static NoveltySettings None; - public static NoveltySettings Basic; - public static NoveltySettings Clawful; - public static NoveltySettings SplitStuff; - public static NoveltySettings Everything; - - - static NoveltyPresetData() - { - None = new() - { - RandomizeSwim = false, - RandomizeElevatorPass = false, - RandomizeNail = false, - RandomizeFocus = false, - SplitClaw = false, - SplitCloak = false, - SplitSuperdash = false, - EggShop = false, - }; - - Basic = new() - { - RandomizeSwim = true, - RandomizeElevatorPass = true, - RandomizeNail = false, - RandomizeFocus = false, - SplitClaw = false, - SplitCloak = false, - SplitSuperdash = false, - EggShop = true, - }; - - Clawful = new() - { - RandomizeSwim = true, - RandomizeElevatorPass = true, - RandomizeNail = false, - RandomizeFocus = false, - SplitClaw = true, - SplitCloak = false, - EggShop = true, - }; - - SplitStuff = new() - { - RandomizeSwim = true, - RandomizeElevatorPass = true, - RandomizeNail = false, - RandomizeFocus = false, - SplitClaw = true, - SplitCloak = true, - SplitSuperdash = true, - EggShop = true, - }; - - Everything = new() - { - RandomizeSwim = true, - RandomizeElevatorPass = true, - RandomizeNail = true, - RandomizeFocus = true, - SplitClaw = true, - SplitCloak = true, - SplitSuperdash = true, - EggShop = true, - }; - - NoveltyPresets = new() - { - { "Basic", Basic }, - { "Clawful", Clawful }, - { "Split Stuff", SplitStuff }, - { "Everything", Everything }, - { "None", None }, - }; - } - } -} diff --git a/RandomizerMod/Settings/Presets/PoolPresetData.cs b/RandomizerMod/Settings/Presets/PoolPresetData.cs deleted file mode 100644 index 341c96a..0000000 --- a/RandomizerMod/Settings/Presets/PoolPresetData.cs +++ /dev/null @@ -1,194 +0,0 @@ -namespace RandomizerMod.Settings.Presets -{ - public static class PoolPresetData - { - public static PoolSettings Standard; - public static PoolSettings Super; - public static PoolSettings LifeTotems; - public static PoolSettings SpoilerDAB; - public static PoolSettings Everything; - public static PoolSettings Vanilla; - public static Dictionary PoolPresets; - - static PoolPresetData() - { - Standard = new PoolSettings - { - Dreamers = true, - Skills = true, - Charms = true, - Keys = true, - MaskShards = true, - VesselFragments = true, - PaleOre = true, - CharmNotches = true, - GeoChests = true, - Relics = true, - RancidEggs = true, - Stags = true, - Maps = false, - WhisperingRoots = false, - Grubs = false, - LifebloodCocoons = false, - SoulTotems = false, - GrimmkinFlames = false, - GeoRocks = false, - BossEssence = false, - BossGeo = false, - LoreTablets = false, - JournalEntries = false, - JunkPitChests = false, - }; - - Super = new PoolSettings - { - Dreamers = true, - Skills = true, - Charms = true, - Keys = true, - MaskShards = true, - VesselFragments = true, - PaleOre = true, - CharmNotches = true, - GeoChests = true, - Relics = true, - RancidEggs = true, - Stags = true, - Maps = true, - WhisperingRoots = true, - Grubs = true, - LifebloodCocoons = false, - SoulTotems = false, - GrimmkinFlames = false, - GeoRocks = false, - BossEssence = false, - BossGeo = false, - LoreTablets = false, - JournalEntries = false, - JunkPitChests = false, - }; - - LifeTotems = new PoolSettings - { - Dreamers = true, - Skills = true, - Charms = true, - Keys = true, - MaskShards = true, - VesselFragments = true, - PaleOre = true, - CharmNotches = true, - GeoChests = true, - Relics = true, - RancidEggs = true, - Stags = true, - Maps = false, - WhisperingRoots = false, - Grubs = false, - LifebloodCocoons = true, - SoulTotems = true, - GrimmkinFlames = false, - GeoRocks = false, - BossEssence = false, - BossGeo = true, - LoreTablets = false, - JournalEntries = false, - JunkPitChests = false, - }; - - SpoilerDAB = new PoolSettings - { - Dreamers = true, - Skills = true, - Charms = true, - Keys = true, - MaskShards = true, - VesselFragments = true, - PaleOre = true, - CharmNotches = true, - GeoChests = true, - Relics = true, - RancidEggs = true, - Stags = true, - Maps = true, - WhisperingRoots = true, - Grubs = false, - LifebloodCocoons = true, - SoulTotems = true, - GrimmkinFlames = false, - GeoRocks = false, - BossEssence = false, - BossGeo = false, - LoreTablets = false, - JournalEntries = false, - JunkPitChests = false, - }; - - Everything = new PoolSettings - { - Dreamers = true, - Skills = true, - Charms = true, - Keys = true, - MaskShards = true, - VesselFragments = true, - PaleOre = true, - CharmNotches = true, - GeoChests = true, - Relics = true, - RancidEggs = true, - Stags = true, - Maps = true, - WhisperingRoots = true, - Grubs = true, - LifebloodCocoons = true, - SoulTotems = true, - GrimmkinFlames = true, - GeoRocks = true, - BossEssence = true, - BossGeo = true, - LoreTablets = true, - JournalEntries = true, - JunkPitChests = true, - }; - - Vanilla = new PoolSettings - { - Dreamers = false, - Skills = false, - Charms = false, - Keys = false, - MaskShards = false, - VesselFragments = false, - PaleOre = false, - CharmNotches = false, - GeoChests = false, - Relics = false, - RancidEggs = false, - Stags = false, - Maps = false, - WhisperingRoots = false, - Grubs = false, - LifebloodCocoons = false, - SoulTotems = false, - GrimmkinFlames = false, - GeoRocks = false, - BossEssence = false, - BossGeo = false, - LoreTablets = false, - JournalEntries = false, - JunkPitChests = false, - }; - - PoolPresets = new Dictionary - { - { "Standard", Standard }, - { "Super", Super }, - { "LifeTotems", LifeTotems }, - { "Spoiler DAB", SpoilerDAB }, - { "EVERYTHING", Everything }, - { "Vanilla", Vanilla }, - }; - } - } -} diff --git a/RandomizerMod/Settings/Presets/ProgressionDepthPresetData.cs b/RandomizerMod/Settings/Presets/ProgressionDepthPresetData.cs deleted file mode 100644 index 8468013..0000000 --- a/RandomizerMod/Settings/Presets/ProgressionDepthPresetData.cs +++ /dev/null @@ -1,46 +0,0 @@ -namespace RandomizerMod.Settings.Presets -{ - public static class ProgressionDepthPresetData - { - public static ProgressionDepthSettings Default; - public static ProgressionDepthSettings Relaxed; - public static ProgressionDepthSettings Unweighted; - public static ProgressionDepthSettings DelayedWeight; - public static Dictionary Presets; - - static ProgressionDepthPresetData() - { - Default = new(); - Relaxed = new() - { - LocationPriorityTransformCoefficient = 2.5f, - LocationPriorityTransformType = RandomizerCore.Randomization.PriorityTransformUtil.TransformType.SquareRoot - }; - Unweighted = new() - { - ItemLocationPriorityInteraction = RandomizerCore.Randomization.PriorityTransformUtil.ItemPriorityDepthEffect.Ignore, - LocationPriorityTransformCoefficient = 0f, - LocationPriorityTransformType = RandomizerCore.Randomization.PriorityTransformUtil.TransformType.Linear, - DuplicateItemPenalty = false, - MultiLocationPenalty = false, - TransitionPriorityTransformCoefficient = 0f, - TransitionTransitionPriorityInteraction = RandomizerCore.Randomization.PriorityTransformUtil.ItemPriorityDepthEffect.Ignore, - TransitionPriorityTransformType = RandomizerCore.Randomization.PriorityTransformUtil.TransformType.Linear, - }; - DelayedWeight = new() - { - ItemLocationPriorityInteraction = RandomizerCore.Randomization.PriorityTransformUtil.ItemPriorityDepthEffect.Fade, - LocationPriorityTransformCoefficient = 0.1f, - LocationPriorityTransformType = RandomizerCore.Randomization.PriorityTransformUtil.TransformType.Quadratic, - }; - - Presets = new() - { - { "Default", Default }, - { "Relaxed", Relaxed }, - { "Unweighted", Unweighted }, - { "Delayed Weight", DelayedWeight}, - }; - } - } -} diff --git a/RandomizerMod/Settings/Presets/SkipPresetData.cs b/RandomizerMod/Settings/Presets/SkipPresetData.cs deleted file mode 100644 index 52d969b..0000000 --- a/RandomizerMod/Settings/Presets/SkipPresetData.cs +++ /dev/null @@ -1,129 +0,0 @@ -namespace RandomizerMod.Settings.Presets -{ - public static class SkipPresetData - { - public static SkipSettings Casual; - public static SkipSettings Experienced; - public static SkipSettings Advanced; - public static SkipSettings Fearless; - public static SkipSettings Foolish; - public static Dictionary SkipPresets; - - static SkipPresetData() - { - Casual = new SkipSettings - { - PreciseMovement = false, - ProficientCombat = false, - BackgroundObjectPogos = false, - EnemyPogos = false, - ObscureSkips = false, - ShadeSkips = false, - InfectionSkips = false, - FireballSkips = false, - SpikeTunnels = false, - AcidSkips = false, - DamageBoosts = false, - DangerousSkips = false, - DarkRooms = false, - Slopeballs = false, - ShriekPogos = false, - ComplexSkips = false, - DifficultSkips = false, - }; - - Experienced = new SkipSettings - { - PreciseMovement = true, - ProficientCombat = true, - BackgroundObjectPogos = true, - EnemyPogos = true, - ObscureSkips = true, - ShadeSkips = false, - InfectionSkips = false, - FireballSkips = false, - SpikeTunnels = false, - AcidSkips = false, - DamageBoosts = false, - DangerousSkips = false, - DarkRooms = false, - Slopeballs = false, - ShriekPogos = false, - ComplexSkips = false, - DifficultSkips = false, - }; - - Advanced = new SkipSettings - { - PreciseMovement = true, - ProficientCombat = true, - BackgroundObjectPogos = true, - EnemyPogos = true, - ObscureSkips = true, - ShadeSkips = true, - InfectionSkips = true, - FireballSkips = true, - SpikeTunnels = true, - AcidSkips = true, - DamageBoosts = false, - DangerousSkips = false, - DarkRooms = false, - Slopeballs = false, - ShriekPogos = false, - ComplexSkips = false, - DifficultSkips = false, - }; - - Fearless = new SkipSettings - { - PreciseMovement = true, - ProficientCombat = true, - BackgroundObjectPogos = true, - EnemyPogos = true, - ObscureSkips = true, - ShadeSkips = true, - InfectionSkips = true, - FireballSkips = true, - SpikeTunnels = true, - AcidSkips = true, - DamageBoosts = true, - DangerousSkips = true, - DarkRooms = false, - Slopeballs = false, - ShriekPogos = false, - ComplexSkips = false, - DifficultSkips = false, - }; - - Foolish = new SkipSettings - { - PreciseMovement = true, - ProficientCombat = true, - BackgroundObjectPogos = true, - EnemyPogos = true, - ObscureSkips = true, - ShadeSkips = true, - InfectionSkips = true, - FireballSkips = true, - SpikeTunnels = true, - AcidSkips = true, - DamageBoosts = true, - DangerousSkips = true, - DarkRooms = true, - Slopeballs = true, - ShriekPogos = true, - ComplexSkips = true, - DifficultSkips = true, - }; - - SkipPresets = new Dictionary - { - { "Casual", Casual }, - { "Experienced", Experienced }, - { "Advanced", Advanced }, - { "Fearless", Fearless }, - { "Foolish", Foolish } - }; - } - } -} diff --git a/RandomizerMod/Settings/Presets/SplitGroupPresetData.cs b/RandomizerMod/Settings/Presets/SplitGroupPresetData.cs deleted file mode 100644 index 7ed3a21..0000000 --- a/RandomizerMod/Settings/Presets/SplitGroupPresetData.cs +++ /dev/null @@ -1,169 +0,0 @@ -namespace RandomizerMod.Settings.Presets -{ - public static class SplitGroupPresetData - { - public static SplitGroupSettings Disabled; - public static SplitGroupSettings Randomized; - public static SplitGroupSettings A; - public static SplitGroupSettings B; - public static SplitGroupSettings C; - - public static Dictionary Presets; - static SplitGroupPresetData() - { - Disabled = new SplitGroupSettings - { - RandomizeOnStart = false, - Dreamers = -1, - Skills = -1, - Charms = -1, - Keys = -1, - MaskShards = -1, - VesselFragments = -1, - CharmNotches = -1, - PaleOre = -1, - GeoChests = -1, - RancidEggs = -1, - Relics = -1, - WhisperingRoots = -1, - BossEssence = -1, - Grubs = -1, - Mimics = -1, - Maps = -1, - Stags = -1, - LifebloodCocoons = -1, - GrimmkinFlames = -1, - JournalEntries = -1, - GeoRocks = -1, - BossGeo = -1, - SoulTotems = -1, - LoreTablets = -1, - }; - - Randomized = new SplitGroupSettings - { - RandomizeOnStart = true, - Dreamers = 0, - Skills = 0, - Charms = 0, - Keys = 0, - MaskShards = 0, - VesselFragments = 0, - CharmNotches = 0, - PaleOre = 0, - GeoChests = 0, - RancidEggs = 0, - Relics = 0, - WhisperingRoots = 0, - BossEssence = 0, - Grubs = 0, - Mimics = 0, - Maps = 0, - Stags = 0, - LifebloodCocoons = 0, - GrimmkinFlames = 0, - JournalEntries = 0, - GeoRocks = 0, - BossGeo = 0, - SoulTotems = 0, - LoreTablets = 0, - }; - - A = new SplitGroupSettings - { - RandomizeOnStart = false, - Dreamers = 0, - Skills = 0, - Charms = 0, - Keys = 0, - MaskShards = 1, - VesselFragments = 1, - CharmNotches = 1, - PaleOre = 1, - GeoChests = 1, - RancidEggs = 1, - Relics = 1, - WhisperingRoots = 1, - BossEssence = 1, - Grubs = 1, - Mimics = 1, - Maps = 1, - Stags = 1, - LifebloodCocoons = 1, - GrimmkinFlames = 1, - JournalEntries = 1, - GeoRocks = 1, - BossGeo = 1, - SoulTotems = 1, - LoreTablets = 1, - }; - - B = new SplitGroupSettings - { - RandomizeOnStart = false, - Dreamers = 0, - Skills = 0, - Charms = 0, - Keys = 0, - MaskShards = 1, - VesselFragments = 1, - CharmNotches = 0, - PaleOre = 0, - GeoChests = 0, - RancidEggs = 1, - Relics = 1, - WhisperingRoots = 1, - BossEssence = 1, - Grubs = 1, - Mimics = 1, - Maps = 1, - Stags = 1, - LifebloodCocoons = 1, - GrimmkinFlames = 1, - JournalEntries = 1, - GeoRocks = 1, - BossGeo = 1, - SoulTotems = 1, - LoreTablets = 1, - }; - - C = new SplitGroupSettings - { - RandomizeOnStart = false, - Dreamers = 0, - Skills = 0, - Charms = 1, - Keys = 1, - MaskShards = 1, - VesselFragments = 1, - CharmNotches = 1, - PaleOre = 1, - GeoChests = 0, - RancidEggs = 2, - Relics = 2, - WhisperingRoots = 2, - BossEssence = 0, - Grubs = 2, - Mimics = 2, - Maps = 2, - Stags = 1, - LifebloodCocoons = 1, - GrimmkinFlames = 1, - JournalEntries = 1, - GeoRocks = 2, - BossGeo = 0, - SoulTotems = 2, - LoreTablets = 2, - }; - - Presets = new Dictionary - { - { "Disabled", Disabled }, - { "Randomized", Randomized }, - { "A", A }, - { "B", B }, - { "C", C }, - }; - } - } -} diff --git a/RandomizerMod/Settings/Presets/StartItemPresetData.cs b/RandomizerMod/Settings/Presets/StartItemPresetData.cs deleted file mode 100644 index 809797a..0000000 --- a/RandomizerMod/Settings/Presets/StartItemPresetData.cs +++ /dev/null @@ -1,47 +0,0 @@ -namespace RandomizerMod.Settings.Presets -{ - public static class StartItemPresetData - { - public static StartItemSettings EarlyGeo; - public static StartItemSettings GeoAndStartItems; - public static StartItemSettings None; - - public static Dictionary StartItemPresets; - - - - - static StartItemPresetData() - { - EarlyGeo = new StartItemSettings - { - MinimumStartGeo = 300, - MaximumStartGeo = 600, - }; - - GeoAndStartItems = new StartItemSettings - { - MinimumStartGeo = 300, - MaximumStartGeo = 600, - Stags = StartItemSettings.StartStagType.ZeroOrMoreRandomStags, - Charms = StartItemSettings.StartCharmType.ZeroOrMore, - HorizontalMovement = StartItemSettings.StartHorizontalType.ZeroOrMore, - VerticalMovement = StartItemSettings.StartVerticalType.ZeroOrMore, - MiscItems = StartItemSettings.StartMiscItems.ZeroOrMore, - }; - - None = new StartItemSettings - { - MinimumStartGeo = 0, - MaximumStartGeo = 0, - }; - - StartItemPresets = new Dictionary - { - { "Early Geo", EarlyGeo }, - { "Geo and Start Items", GeoAndStartItems }, - { "None", None }, - }; - } - } -} diff --git a/RandomizerMod/Settings/Presets/StartLocationPresetData.cs b/RandomizerMod/Settings/Presets/StartLocationPresetData.cs deleted file mode 100644 index 727864f..0000000 --- a/RandomizerMod/Settings/Presets/StartLocationPresetData.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace RandomizerMod.Settings.Presets -{ - public static class StartLocationPresetData - { - public static StartLocationSettings KingsPass; - public static StartLocationSettings RandomNoKP; - public static StartLocationSettings RandomWithKP; - - public static Dictionary StartLocationPresets; - - static StartLocationPresetData() - { - KingsPass = new StartLocationSettings - { - StartLocationType = StartLocationSettings.RandomizeStartLocationType.Fixed, - StartLocation = "King's Pass", - }; - - RandomNoKP = new StartLocationSettings - { - StartLocationType = StartLocationSettings.RandomizeStartLocationType.RandomExcludingKP, - StartLocation = null, - }; - - RandomWithKP = new StartLocationSettings - { - StartLocationType = StartLocationSettings.RandomizeStartLocationType.Random, - StartLocation = null, - }; - - StartLocationPresets = new Dictionary - { - { "King's Pass", KingsPass }, - { "Random (no King's Pass)", RandomNoKP }, - { "Random (allow King's Pass)", RandomWithKP }, - }; - } - } -} diff --git a/RandomizerMod/Settings/Presets/TransitionPresetData.cs b/RandomizerMod/Settings/Presets/TransitionPresetData.cs deleted file mode 100644 index 80b472e..0000000 --- a/RandomizerMod/Settings/Presets/TransitionPresetData.cs +++ /dev/null @@ -1,76 +0,0 @@ -using static RandomizerMod.Settings.TransitionSettings; - -namespace RandomizerMod.Settings.Presets -{ - public static class TransitionPresetData - { - public static TransitionSettings None; - public static TransitionSettings MapArea; - public static TransitionSettings Area; - public static TransitionSettings Room; - public static TransitionSettings ConnectedAreaRoom; - public static TransitionSettings Chaos; - public static Dictionary TransitionPresets; - - static TransitionPresetData() - { - None = new TransitionSettings - { - Mode = TransitionMode.None, - AreaConstraint = AreaConstraintSetting.None, - TransitionMatching = TransitionMatchingSetting.MatchingDirections, - Coupled = true, - }; - - MapArea = new TransitionSettings - { - Mode = TransitionMode.MapAreaRandomizer, - AreaConstraint = AreaConstraintSetting.None, - TransitionMatching = TransitionMatchingSetting.MatchingDirections, - Coupled = true, - }; - - Area = new TransitionSettings - { - Mode = TransitionMode.FullAreaRandomizer, - AreaConstraint = AreaConstraintSetting.None, - TransitionMatching = TransitionMatchingSetting.MatchingDirections, - Coupled = true, - }; - - ConnectedAreaRoom = new TransitionSettings - { - Mode = TransitionMode.RoomRandomizer, - AreaConstraint = AreaConstraintSetting.MoreConnectedMapAreas, - TransitionMatching = TransitionMatchingSetting.MatchingDirections, - Coupled = true, - }; - - Room = new TransitionSettings - { - Mode = TransitionMode.RoomRandomizer, - AreaConstraint = AreaConstraintSetting.None, - TransitionMatching = TransitionMatchingSetting.MatchingDirections, - Coupled = true, - }; - - Chaos = new TransitionSettings - { - Mode = TransitionMode.RoomRandomizer, - AreaConstraint = AreaConstraintSetting.None, - TransitionMatching = TransitionMatchingSetting.NonmatchingDirections, - Coupled = false, - }; - - TransitionPresets = new Dictionary - { - { "None", None }, - { "Map Area Rando", MapArea }, - { "Full Area Rando", Area }, - { "Connected-Area Room Rando", ConnectedAreaRoom }, - { "Room Rando", Room }, - { "Chaos Room Rando", Chaos }, - }; - } - } -} diff --git a/RandomizerMod/Settings/ProgressionDepthSettings.cs b/RandomizerMod/Settings/ProgressionDepthSettings.cs deleted file mode 100644 index 4754b06..0000000 --- a/RandomizerMod/Settings/ProgressionDepthSettings.cs +++ /dev/null @@ -1,29 +0,0 @@ -using RandomizerCore.Randomization; -using static RandomizerCore.Randomization.PriorityTransformUtil; - -namespace RandomizerMod.Settings -{ - public class ProgressionDepthSettings : SettingsModule - { - public bool MultiLocationPenalty = true; - public bool DuplicateItemPenalty = true; - - public TransformType LocationPriorityTransformType = TransformType.Linear; - public ItemPriorityDepthEffect ItemLocationPriorityInteraction = ItemPriorityDepthEffect.Cliff; - public float LocationPriorityTransformCoefficient = 3f; - - public TransformType TransitionPriorityTransformType = TransformType.SquareRoot; - public ItemPriorityDepthEffect TransitionTransitionPriorityInteraction = ItemPriorityDepthEffect.Cliff; - public float TransitionPriorityTransformCoefficient = 1f; - - public DefaultGroupPlacementStrategy GetItemPlacementStrategy() - { - return new(CreateTransform(LocationPriorityTransformCoefficient, LocationPriorityTransformType, ItemLocationPriorityInteraction)); - } - - public DefaultGroupPlacementStrategy GetTransitionPlacementStrategy() - { - return new(CreateTransform(TransitionPriorityTransformCoefficient, TransitionPriorityTransformType, TransitionTransitionPriorityInteraction)); - } - } -} diff --git a/RandomizerMod/Settings/RandomizerSettings.cs b/RandomizerMod/Settings/RandomizerSettings.cs deleted file mode 100644 index 60663ac..0000000 --- a/RandomizerMod/Settings/RandomizerSettings.cs +++ /dev/null @@ -1,52 +0,0 @@ -using Newtonsoft.Json; -using RandomizerCore.Json; -using RandomizerMod.RC; - -namespace RandomizerMod.Settings -{ - public class RandomizerSettings - { - public GenerationSettings GenerationSettings; - public int ProfileID = -1; // LocalSettings load before GameManager.instance.profileId or PlayerData.instance.profileId are loaded. - public TrackerData TrackerData; - public TrackerData TrackerDataWithoutSequenceBreaks; - [JsonIgnore] - public RandoModContext Context; - - public void Setup() - { - if (GenerationSettings != null && Context == null && ProfileID >= 0) - { - string rawSpoilerPath = Path.Combine(Logging.LogManager.UserDirectory, "RawSpoiler.json"); - if (!File.Exists(rawSpoilerPath)) - { - LogError($"No file found at {rawSpoilerPath}!"); - return; - } - - using FileStream fs = File.OpenRead(rawSpoilerPath); - using StreamReader sr = new(fs); - using JsonTextReader jtr = new(sr); - try - { - Context = JsonUtil.DeserializeFromReader(jtr); - } - catch (Exception e) - { - LogError($"Error deserializing raw spoiler from {rawSpoilerPath}\n:{e}"); - } - try - { - TrackerData?.Setup(GenerationSettings, Context); - TrackerDataWithoutSequenceBreaks?.Setup(GenerationSettings, Context); - } - catch (Exception e) - { - LogError($"Error setting up tracker data:\n{e}"); - } - - Logging.LogManager.UpdateRecent(ProfileID); - } - } - } -} diff --git a/RandomizerMod/Settings/SettingsModule.cs b/RandomizerMod/Settings/SettingsModule.cs deleted file mode 100644 index 84207c6..0000000 --- a/RandomizerMod/Settings/SettingsModule.cs +++ /dev/null @@ -1,74 +0,0 @@ -using MenuChanger.Attributes; -using System.Reflection; - -namespace RandomizerMod.Settings -{ - public abstract class SettingsModule : ICloneable - { - /// - /// Randomize the fields of the module. - /// - public virtual void Randomize(Random rng) - { - foreach (FieldInfo f in Util.GetOrderedFields(GetType())) - { - Type T = f.FieldType; - - if (T == typeof(bool)) - { - f.SetValue(this, rng.Next(2) == 0); - } - else if (T == typeof(int) || T.IsEnum && Enum.GetUnderlyingType(T) == typeof(int)) - { - int maxValue = int.MaxValue - 1; - int minValue = int.MinValue; - - if (f.GetCustomAttribute() is MenuRangeAttribute range) - { - maxValue = (int)range.max; - minValue = (int)range.min; - } - else - { - if (f.GetCustomAttribute() is MaxValueAttribute max) maxValue = max.Value; - else if (T.IsEnum) - { - maxValue = Enum.GetValues(T).Cast().Max(); - } - - if (f.GetCustomAttribute() is MinValueAttribute min) minValue = min.Value; - else if (T.IsEnum) - { - minValue = Enum.GetValues(T).Cast().Min(); - } - } - - f.SetValue(this, rng.Next(minValue, maxValue + 1)); - } - } - } - - /// - /// Fix all compatibility or range issues with current settings. - /// - public virtual void Clamp(GenerationSettings gs) - { - - } - - public virtual void CopyTo(SettingsModule target) - { - Type T = GetType(); - if (target.GetType() != T) throw new ArgumentException(nameof(target)); - foreach (FieldInfo f in Util.GetOrderedFields(T)) - { - f.SetValue(target, f.GetValue(this)); - } - } - - public virtual object Clone() - { - return MemberwiseClone(); - } - } -} diff --git a/RandomizerMod/Settings/SettingsPM.cs b/RandomizerMod/Settings/SettingsPM.cs deleted file mode 100644 index bb97b5e..0000000 --- a/RandomizerMod/Settings/SettingsPM.cs +++ /dev/null @@ -1,114 +0,0 @@ -using RandomizerCore.StringLogic; -using RandomizerCore.StringParsing; - -namespace RandomizerMod.Settings -{ - /// - /// ProgressionManager for interpreting logic for GenerationSettings - /// - public class SettingsPM : StringPM - { - public readonly GenerationSettings GS; - - public SettingsPM(GenerationSettings gs) => GS = gs; - - public delegate bool BoolTermResolver(string term, out bool result); - public static event BoolTermResolver OnResolveBoolTerm; - public delegate bool IntTermResolver(string term, out int result); - public static event IntTermResolver OnResolveIntTerm; - - public override bool IsDefined(string atom) - { - if (OnResolveBoolTerm != null) - { - foreach (BoolTermResolver d in OnResolveBoolTerm.GetInvocationList().Cast()) - { - if (d(atom, out _)) return true; - } - } - - if (OnResolveIntTerm != null) - { - foreach (IntTermResolver d in OnResolveIntTerm.GetInvocationList().Cast()) - { - if (d(atom, out _)) return true; - } - } - - return GetBaseField(atom).HasValue; - } - - public override int EvaluateToInt(string atom) - { - return GetInt(atom); - } - - public int GetInt(string name) - { - if (int.TryParse(name, out int num)) return num; - if (BoolLiteralExpression.IsConstAtom(name)) return new BoolLiteralExpression(new NameToken(name)).ConstValue ? 1 : 0; - - if (OnResolveBoolTerm != null) - { - foreach (BoolTermResolver d in OnResolveBoolTerm.GetInvocationList().Cast()) - { - if (d(name, out bool result)) return result ? 1 : 0; - } - } - if (OnResolveIntTerm != null) - { - foreach (IntTermResolver d in OnResolveIntTerm.GetInvocationList().Cast()) - { - if (d(name, out int result)) return result; - } - } - - return GetBaseField(name) ?? throw new ArgumentException($"Unrecognized term in SettingsPM: {name}"); - } - - public bool GetBool(string name) - { - return GetInt(name) > 0; - } - - private int? GetBaseField(string name) - { - bool? flag = name switch - { - "PRECISEMOVEMENT" => GS.SkipSettings.PreciseMovement, - "PROFICIENTCOMBAT" => GS.SkipSettings.ProficientCombat, - "BACKGROUNDPOGOS" => GS.SkipSettings.BackgroundObjectPogos, - "ENEMYPOGOS" => GS.SkipSettings.EnemyPogos, - "OBSCURESKIPS" => GS.SkipSettings.ObscureSkips, - "SHADESKIPS" => GS.SkipSettings.ShadeSkips, - "INFECTIONSKIPS" => GS.SkipSettings.InfectionSkips, - "ACIDSKIPS" => GS.SkipSettings.AcidSkips, - "FIREBALLSKIPS" => GS.SkipSettings.FireballSkips, - "SPIKETUNNELS" => GS.SkipSettings.SpikeTunnels, - "DARKROOMS" => GS.SkipSettings.DarkRooms, - - "DAMAGEBOOSTS" => GS.SkipSettings.DamageBoosts, - "DANGEROUSSKIPS" => GS.SkipSettings.DangerousSkips, - "COMPLEXSKIPS" => GS.SkipSettings.ComplexSkips, - "DIFFICULTSKIPS" => GS.SkipSettings.DifficultSkips, - - "ITEMRANDO" => GS.TransitionSettings.Mode == TransitionSettings.TransitionMode.None, - "MAPAREARANDO" => GS.TransitionSettings.Mode == TransitionSettings.TransitionMode.MapAreaRandomizer, - "FULLAREARANDO" => GS.TransitionSettings.Mode == TransitionSettings.TransitionMode.FullAreaRandomizer, - "AREARANDO" => GS.TransitionSettings.Mode == TransitionSettings.TransitionMode.FullAreaRandomizer - || GS.TransitionSettings.Mode == TransitionSettings.TransitionMode.MapAreaRandomizer, - "ROOMRANDO" => GS.TransitionSettings.Mode == TransitionSettings.TransitionMode.RoomRandomizer, - - "SWIM" => !GS.NoveltySettings.RandomizeSwim, - "ELEVATOR" => !GS.NoveltySettings.RandomizeElevatorPass, - - "2MASKS" => GS.CursedSettings.CursedMasks < 4, - - "VERTICAL" => GS.StartItemSettings.VerticalMovement != StartItemSettings.StartVerticalType.None - && GS.StartItemSettings.VerticalMovement != StartItemSettings.StartVerticalType.ZeroOrMore, - _ => null, - }; - return flag.HasValue ? flag.Value ? 1 : 0 : null; - } - } -} diff --git a/RandomizerMod/Settings/SkipSettings.cs b/RandomizerMod/Settings/SkipSettings.cs deleted file mode 100644 index a8c65c4..0000000 --- a/RandomizerMod/Settings/SkipSettings.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace RandomizerMod.Settings -{ - public class SkipSettings : SettingsModule - { - public bool PreciseMovement; - public bool ProficientCombat; - public bool BackgroundObjectPogos; - public bool EnemyPogos; - public bool ObscureSkips; - public bool ShadeSkips; - public bool InfectionSkips; - public bool FireballSkips; - public bool SpikeTunnels; - public bool AcidSkips; - public bool DamageBoosts; - public bool DangerousSkips; - public bool DarkRooms; - public bool Slopeballs; - public bool ShriekPogos; - public bool ComplexSkips; - public bool DifficultSkips; - public override void Clamp(GenerationSettings gs) - { - base.Clamp(gs); - if (gs.MiscSettings.FireballUpgrade != MiscSettings.ToggleableFireballSetting.Toggleable) Slopeballs = false; - if (gs.MiscSettings.SteelSoul) ShadeSkips = false; - } - } -} diff --git a/RandomizerMod/Settings/SplitGroupSettings.cs b/RandomizerMod/Settings/SplitGroupSettings.cs deleted file mode 100644 index 5722d19..0000000 --- a/RandomizerMod/Settings/SplitGroupSettings.cs +++ /dev/null @@ -1,91 +0,0 @@ -using MenuChanger.Attributes; -using RandomizerMod.RandomizerData; -using System.Reflection; - -namespace RandomizerMod.Settings -{ - public class SplitGroupSettings : SettingsModule - { - public bool RandomizeOnStart; - - [MenuRange(-1, 99)] - public int Dreamers; - [MenuRange(-1, 99)] - public int Skills; - [MenuRange(-1, 99)] - public int Charms; - [MenuRange(-1, 99)] - public int Keys; - [MenuRange(-1, 99)] - public int MaskShards; - [MenuRange(-1, 99)] - public int VesselFragments; - [MenuRange(-1, 99)] - public int CharmNotches; - [MenuRange(-1, 99)] - public int PaleOre; - [MenuRange(-1, 99)] - public int GeoChests; - [MenuRange(-1, 99)] - public int RancidEggs; - [MenuRange(-1, 99)] - public int Relics; - [MenuRange(-1, 99)] - public int WhisperingRoots; - [MenuRange(-1, 99)] - public int BossEssence; - [MenuRange(-1, 99)] - public int Grubs; - [MenuRange(-1, 99)] - public int Mimics; - [MenuRange(-1, 99)] - public int Maps; - [MenuRange(-1, 99)] - public int Stags; - [MenuRange(-1, 99)] - public int LifebloodCocoons; - [MenuRange(-1, 99)] - public int GrimmkinFlames; - [MenuRange(-1, 99)] - public int JournalEntries; - [MenuRange(-1, 99)] - public int GeoRocks; - [MenuRange(-1, 99)] - public int BossGeo; - [MenuRange(-1, 99)] - public int SoulTotems; - [MenuRange(-1, 99)] - public int LoreTablets; - - public override void Randomize(Random rng) - { - foreach (FieldInfo fi in IntFields.Values) - { - int e = (int)fi.GetValue(this); - if (e < 0 || e > 2) continue; - fi.SetValue(this, rng.Next(3)); - } - } - - public static readonly Dictionary IntFields = typeof(SplitGroupSettings) - .GetFields(BindingFlags.Instance | BindingFlags.Public) - .Where(fi => fi.FieldType == typeof(int)) - .ToDictionary(fi => fi.Name); - - public bool TryGetValue(PoolDef def, out int value) - { - if (def.Group != null && IntFields.TryGetValue(def.Group, out FieldInfo fi)) - { - int i = (int)fi.GetValue(this); - if (i >= 0) - { - value = i; - return true; - } - } - value = -1; - return false; - } - - } -} diff --git a/RandomizerMod/Settings/StartItemSettings.cs b/RandomizerMod/Settings/StartItemSettings.cs deleted file mode 100644 index 94227e4..0000000 --- a/RandomizerMod/Settings/StartItemSettings.cs +++ /dev/null @@ -1,67 +0,0 @@ -using MenuChanger.Attributes; - -namespace RandomizerMod.Settings -{ - [Serializable] - public class StartItemSettings : SettingsModule - { - [DynamicBound(nameof(MaximumStartGeo), true)] - [MenuRange(0, 50000)] - public int MinimumStartGeo; - - [DynamicBound(nameof(MinimumStartGeo), false)] - [MenuRange(0, 50000)] - public int MaximumStartGeo; - - public enum StartVerticalType - { - None, - ZeroOrMore, - OneRandomItem, - MantisClaw, - MonarchWings, - All, - } - public StartVerticalType VerticalMovement; - - public enum StartHorizontalType - { - None, - ZeroOrMore, - OneRandomItem, - MothwingCloak, - CrystalHeart, - All - } - public StartHorizontalType HorizontalMovement; - - public enum StartCharmType - { - None, - ZeroOrMore, - OneRandomItem, - } - public StartCharmType Charms; - - public enum StartStagType - { - None, - DirtmouthStag, - ZeroOrMoreRandomStags, - OneRandomStag, - ManyRandomStags, - AllStags - } - public StartStagType Stags; - - public enum StartMiscItems - { - None, - ZeroOrMore, - Many, - DreamNail, - DreamNailAndMore, - } - public StartMiscItems MiscItems; - } -} diff --git a/RandomizerMod/Settings/StartLocationSettings.cs b/RandomizerMod/Settings/StartLocationSettings.cs deleted file mode 100644 index 61ac373..0000000 --- a/RandomizerMod/Settings/StartLocationSettings.cs +++ /dev/null @@ -1,31 +0,0 @@ -using RandomizerMod.RandomizerData; - -namespace RandomizerMod.Settings -{ - [Serializable] - public class StartLocationSettings : SettingsModule - { - public enum RandomizeStartLocationType - { - Fixed, - RandomExcludingKP, - Random, - } - - public RandomizeStartLocationType StartLocationType; - - public string StartLocation; - - public override void Clamp(GenerationSettings gs) - { - base.Clamp(gs); - if (StartLocationType == RandomizeStartLocationType.Fixed && StartLocation == null) - { - LogWarn("Found null fixed start location during Clamp."); - StartLocation = Data.GetStartNames().First(); - } - } - - public void SetStartLocation(string start) => StartLocation = start; - } -} diff --git a/RandomizerMod/Settings/TrackerData.cs b/RandomizerMod/Settings/TrackerData.cs deleted file mode 100644 index e010637..0000000 --- a/RandomizerMod/Settings/TrackerData.cs +++ /dev/null @@ -1,369 +0,0 @@ -using Newtonsoft.Json; -using RandomizerCore; -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; -using RandomizerCore.Updater; -using RandomizerMod.Logging; -using RandomizerMod.RC; -using TrackerUpdate = RandomizerMod.IC.TrackerUpdate; -using TrackerLogModule = RandomizerMod.IC.TrackerLogModule; - -namespace RandomizerMod.Settings -{ - // class for storing data related to seed progress - // updating handled through IC.TrackerUpdate - // Note: tracking may fail if placement names do not match the corresponding RandoLocation names in the RawSpoiler. - // tracking does not depend on item names - public class TrackerData - { - /// - /// The CTX indices of the items that have been obtained. - /// - public HashSet obtainedItems = new(); - /// - /// A set which tracks the placements which have been previewed, by the Name property of the corresponding RandoLocation. - /// - public HashSet previewedLocations = new(); - /// - /// A dictionary which tracks the transitions that have been visited. Keys are sources and values are their targets. - /// - public Dictionary visitedTransitions = new(); - /// - /// A set which tracks the placements which have all items obtained, by the Name property of the corresponding RandoLocation. - /// - public HashSet clearedLocations = new(); - /// - /// A set which tracks the placements which are reachable in logic and have items remaining and have not been previewed, by the Name property of the corresponding RandoLocation. - /// - public HashSet uncheckedReachableLocations = new(); - /// - /// A set which tracks the transitions which are reachable in logic and have not been visited. - /// - public HashSet uncheckedReachableTransitions = new(); - - /// - /// Should out of logic items and transitions be immediately added to current progression when acquired, or deferred until their locations are reachable? - /// - public bool AllowSequenceBreaks; - /// - /// The subset of obtainedItems that are currently out of logic, and were obtained by sequence breaking. Entries are removed as they become in logic. - /// - public HashSet outOfLogicObtainedItems = new(); - /// - /// The subset of visited transitions that are currently out of logic, and were visited by sequence breaking. - /// - public HashSet outOfLogicVisitedTransitions = new(); - /// - /// Tracks vanilla placements which are reachable with current items. ID corresponds to ctx index. - /// Note: TD does not have access to which vanilla placements have been obtained. It assumes all reachable vanilla placements are obtained. - /// - public HashSet reachableVanillaPlacements = new(); - - /// - /// The ProgressionManager for the current state, with the information available to the player. - /// - [JsonIgnore] public ProgressionManager pm; - [JsonIgnore] public LogicManager lm; - [JsonIgnore] public RandoModContext ctx; - private MainUpdater mu; - public string logFileName; - - public void Setup(GenerationSettings gs, RandoModContext ctx) - { - this.ctx = ctx; - lm = ctx.LM; - - Reset(); - HookTrackerUpdate(); - } - - public void Reset() - { - LogManager.Write("Setting up TrackerData...", logFileName); - pm = new(lm, ctx); - - mu = pm.mu; - - // note: location costs are ignored in the tracking, to prevent providing unintended information, by using p.location.logic rather than p.location - // it is assumed that no information is divulged from the regular location logic and transition logic - - pm.AfterAddItem += (i) => - { - if (i is LogicWaypoint w && w.term.Type != TermType.State) - { - AppendWaypointToDebug(w); - } - if (i is StateTransmittingUpdateEntry.StateSetter st) - { - AppendTransmittedStateToDebug(st.term, st.value); - } - if (i is StateUpdateEntry.StateSetter su) - { - AppendImprovedStateToDebug(su.term, su.value); - } - }; - - mu.AddWaypoints(lm.Waypoints); - mu.AddTransitions(lm.TransitionLookup.Values); - - reachableVanillaPlacements.Clear(); - mu.AddEntries(ctx.Vanilla.Select((v,i) => new DelegateUpdateEntry(v.Location, pm => - { - AppendVanillaToDebug(v); - pm.Add(v.Item, v.Location); - reachableVanillaPlacements.Add(i); - if (v.Location is ILocationWaypoint ilw) - { - pm.Add(ilw.GetReachableEffect()); - } - }))); - mu.AddEntries(ctx.itemPlacements.Select((p, id) => new DelegateUpdateEntry(p.Location.logic, OnCanGetLocation(id)))); - mu.AddEntries(ctx.transitionPlacements.Select((p, id) => new DelegateUpdateEntry(p.Source, OnCanGetTransition(id)))); - mu.StartUpdating(); // automatically handle tracking reachable unobtained locations/transitions and adding vanilla progression to pm - - foreach (int i in obtainedItems) - { - if (outOfLogicObtainedItems.Contains(i)) continue; - - (RandoModItem item, RandoModLocation loc) = ctx.itemPlacements[i]; - AppendRandoItemToDebug(item, loc); - pm.Add(item, loc); - } - - foreach (KeyValuePair kvp in visitedTransitions) - { - if (outOfLogicVisitedTransitions.Contains(kvp.Key)) continue; - - LogicTransition tt = lm.GetTransitionStrict(kvp.Value); - LogicTransition st = lm.GetTransitionStrict(kvp.Key); - - if (!pm.Has(st.term)) - { - AppendProgressionTransitionToDebug(st); - pm.Add(st.GetReachableEffect()); - } - - AppendTransitionTargetToDebug(tt, st); - pm.Add(tt, st); - } - } - - private void HookTrackerUpdate() - { - TrackerUpdate.OnItemObtained += OnItemObtained; - TrackerUpdate.OnPlacementPreviewed += OnPlacementPreviewed; - TrackerUpdate.OnPlacementCleared += OnPlacementCleared; - TrackerUpdate.OnTransitionVisited += OnTransitionVisited; - TrackerUpdate.OnPreviewsCleared += OnPreviewsCleared; - TrackerUpdate.OnFoundTransitionsCleared += OnFoundTransitionsCleared; - TrackerUpdate.OnUnload += UnhookTrackerUpdate; - } - - public void UnhookTrackerUpdate() - { - TrackerUpdate.OnItemObtained -= OnItemObtained; - TrackerUpdate.OnPlacementPreviewed -= OnPlacementPreviewed; - TrackerUpdate.OnPlacementCleared -= OnPlacementCleared; - TrackerUpdate.OnTransitionVisited -= OnTransitionVisited; - TrackerUpdate.OnPreviewsCleared -= OnPreviewsCleared; - TrackerUpdate.OnFoundTransitionsCleared -= OnFoundTransitionsCleared; - TrackerUpdate.OnUnload -= UnhookTrackerUpdate; - } - - private Action OnCanGetLocation(int id) - { - return pm => - { - (RandoItem item, RandoLocation location) = ctx.itemPlacements[id]; - AppendRandoLocationToDebug(location); - if (location is ILocationWaypoint ilw) - { - pm.Add(ilw.GetReachableEffect()); - } - if (outOfLogicObtainedItems.Remove(id)) - { - ItemChanger.ItemChangerMod.Modules.Get()?.TrackItemOOLEnd(id, item.Name, location.Name); - AppendRandoItemToDebug(item, location); - pm.Add(item, location); - } - if (!clearedLocations.Contains(location.Name) && !previewedLocations.Contains(location.Name)) - { - uncheckedReachableLocations.Add(location.Name); - } - }; - } - - private Action OnCanGetTransition(int id) - { - return pm => - { - (RandoTransition target, RandoTransition source) = ctx.transitionPlacements[id]; - AppendReachableTransitionToDebug(source.lt); - - if (!pm.Has(source.lt.term)) - { - AppendProgressionTransitionToDebug(source.lt); - pm.Add(source.GetReachableEffect()); - } - - if (outOfLogicVisitedTransitions.Remove(source.Name)) - { - ItemChanger.ItemChangerMod.Modules.Get()?.TrackTransitionOOLEnd(source.Name, target.Name); - AppendTransitionTargetToDebug(target.lt, source.lt); - pm.Add(target, source); - } - - if (!visitedTransitions.ContainsKey(source.Name)) - { - uncheckedReachableTransitions.Add(source.Name); - } - }; - } - - public void OnItemObtained(int id, string itemName, string placementName) - { - (RandoItem ri, RandoLocation rl) = ctx.itemPlacements[id]; - obtainedItems.Add(id); - if (AllowSequenceBreaks || rl.logic.CanGet(pm)) - { - AppendRandoItemToDebug(ri, rl); - pm.Add(ri, rl); - } - else - { - outOfLogicObtainedItems.Add(id); - } - } - - public void OnPlacementPreviewed(string placementName) - { - previewedLocations.Add(placementName); - uncheckedReachableLocations.Remove(placementName); - } - - public void OnPlacementCleared(string placementName) - { - clearedLocations.Add(placementName); - previewedLocations.Remove(placementName); - uncheckedReachableLocations.Remove(placementName); - } - - public void OnTransitionVisited(string source, string target) - { - visitedTransitions[source] = target; - uncheckedReachableTransitions.Remove(source); - - LogicTransition st = lm.GetTransition(source); - if (AllowSequenceBreaks || st.CanGet(pm)) - { - LogicTransition tt = lm.GetTransition(target); - if (!pm.Has(st.term)) - { - AppendProgressionTransitionToDebug(st); - pm.Add(st.GetReachableEffect()); - } - - AppendTransitionTargetToDebug(tt, st); - pm.Add(tt, st); - } - else - { - outOfLogicVisitedTransitions.Add(source); - } - } - - public void OnPreviewsCleared() - { - previewedLocations.Clear(); - Reset(); - } - - public void OnFoundTransitionsCleared() - { - visitedTransitions.Clear(); - outOfLogicVisitedTransitions.Clear(); - uncheckedReachableTransitions.Clear(); - uncheckedReachableLocations.Clear(); - Reset(); - } - - private void AppendToDebug(string line) - { - LogManager.Append(line + Environment.NewLine, logFileName); - } - - private void AppendWaypointToDebug(LogicWaypoint w) - { - AppendToDebug("New reachable waypoint: " + w.Name); - } - - private void AppendVanillaToDebug(GeneralizedPlacement v) - { - AppendToDebug($"New reachable vanilla placement: {v.Item.Name} at {v.Location.Name}"); - } - - private void AppendRandoItemToDebug(RandoItem ri, RandoLocation rl) - { - AppendToDebug($"Adding randomized item obtained from {rl.Name} to progression: {ri.Name}"); - } - - private void AppendRandoLocationToDebug(RandoLocation rl) - { - AppendToDebug("New reachable randomized location: " + rl.Name); - } - - private void AppendReachableTransitionToDebug(LogicTransition lt) - { - AppendToDebug("New reachable randomized transition: " + lt.Name); - } - - private void AppendProgressionTransitionToDebug(LogicTransition lt) - { - AppendToDebug("Adding randomized transition to progression: " + lt.Name); - } - - private void AppendTransitionTargetToDebug(LogicTransition target, LogicTransition source) - { - AppendToDebug($"Adding randomized transition pair {source.Name} --> {target.Name}"); - } - - private void AppendImprovedStateToDebug(Term target, StateUnion value) - { - AppendToDebug($"Improved {target.Name} state to {lm.StateManager.PrettyPrint(value)} via evaluation."); - } - - private void AppendTransmittedStateToDebug(Term target, StateUnion value) - { - AppendToDebug($"Improved {target.Name} state to {lm.StateManager.PrettyPrint(value)} via transmission."); - } - - public bool HasVisited(string transition) => visitedTransitions.ContainsKey(transition); - - public class DelegateUpdateEntry : UpdateEntry - { - readonly Action onAdd; - readonly ILogicDef location; - - public DelegateUpdateEntry(ILogicDef location, Action onAdd) - { - this.location = location; - this.onAdd = onAdd; - } - - public override bool CanGet(ProgressionManager pm) - { - return location.CanGet(pm); - } - - public override IEnumerable GetTerms() - { - return location.GetTerms(); - } - - public override void OnAdd(ProgressionManager pm) - { - onAdd?.Invoke(pm); - } - } - } -} diff --git a/RandomizerMod/Settings/TransitionSettings.cs b/RandomizerMod/Settings/TransitionSettings.cs deleted file mode 100644 index 58dd92f..0000000 --- a/RandomizerMod/Settings/TransitionSettings.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace RandomizerMod.Settings -{ - [Serializable] - public class TransitionSettings : SettingsModule - { - public enum TransitionMode - { - None, - MapAreaRandomizer, - FullAreaRandomizer, - RoomRandomizer, - } - public TransitionMode Mode; - - public enum AreaConstraintSetting - { - None, - MoreConnectedMapAreas, - MoreConnectedTitledAreas, - } - - public AreaConstraintSetting AreaConstraint; - - /* - // This will likely be difficult to implement -- not many rooms which don't have items or npcs or events - // and then even fewer combinations which give matching transition counts - public enum RemoveRoomsSetting - { - None, - RemoveEmptyHallways, - AggressivelyRemoveRooms, - } - public RemoveRoomsSetting Remove; - */ - - public enum TransitionMatchingSetting - { - MatchingDirections, - MatchingDirectionsAndNoDoorToDoor, - NonmatchingDirections - } - public TransitionMatchingSetting TransitionMatching; - public bool Coupled = true; - } -} diff --git a/RandomizerMod/Settings/Util.cs b/RandomizerMod/Settings/Util.cs deleted file mode 100644 index fc70ed4..0000000 --- a/RandomizerMod/Settings/Util.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System.Text; -using System.Reflection; - -namespace RandomizerMod.Settings -{ - public static class Util - { - public static Dictionary> TypeSortedFields; - - static Util() - { - TypeSortedFields = new Dictionary>(); - Cache(typeof(GenerationSettings)); - Cache(typeof(PoolSettings)); - Cache(typeof(SkipSettings)); - Cache(typeof(CursedSettings)); - Cache(typeof(MiscSettings)); - } - - public static void Cache(Type T) - { - TypeSortedFields[T] = T.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static) - .ToDictionary(f => f.Name, f => f); - } - - public static IEnumerable GetOrderedFields(Type T) - { - if (!TypeSortedFields.TryGetValue(T, out Dictionary Fields)) - { - Cache(T); - Fields = TypeSortedFields[T]; - } - - return Fields.Values.OrderBy(f => f.Name); - } - - public static FieldInfo GetField(Type T, string fieldName) - { - if (!TypeSortedFields.TryGetValue(T, out Dictionary Fields)) - { - Cache(T); - Fields = TypeSortedFields[T]; - } - - if (Fields.TryGetValue(fieldName, out FieldInfo field)) - { - return field; - } - - throw new KeyNotFoundException($"Unable to find field {fieldName} of type {T.Name}."); - } - - public static object Get(this GenerationSettings GS, string path) - { - return Get((object)GS, path); - } - - public static void Set(this GenerationSettings GS, string path, object value) - { - Set((object)GS, path, value); - } - - public static IEnumerable GetFieldNames(Type T) - { - if (!TypeSortedFields.TryGetValue(T, out Dictionary Fields)) - { - Cache(T); - Fields = TypeSortedFields[T]; - } - - return Fields.Keys; - } - - public static object Get(object o, string path) - { - try - { - foreach (string piece in path.Split('.')) - { - o = GetField(o.GetType(), piece).GetValue(o); - } - return o; - } - catch (Exception e) - { - LogError($"Error retrieving field at {path}:\n{e}"); - return null; - } - } - - public static void Set(object o, string path, object value) - { - try - { - string[] pieces = path.Split('.'); - for (int i = 0; i < pieces.Length - 1; i++) - { - o = GetField(o.GetType(), pieces[i]).GetValue(o); - } - GetField(o.GetType(), pieces.Last()).SetValue(o, value); - } - catch (Exception e) - { - LogError($"Error retrieving field at {path}:\n{e}"); - } - } - - /// - /// Returns the first path to a field with the matching name, for a GenerationSettings object. - ///
e.g. GetPath("MildSkips") => "SkipSettings.MildSkips" - ///
- public static string GetPath(string fieldName) - { - StringBuilder sb = new(); - Type T = typeof(GenerationSettings); - foreach (FieldInfo settings in GetOrderedFields(T).Where(f => f.FieldType.IsSubclassOf(typeof(SettingsModule)))) - { - foreach (FieldInfo fi in GetOrderedFields(settings.FieldType)) - { - if (fi.Name == fieldName) return $"{settings.Name}.{fieldName}"; - } - } - - throw new ArgumentException("No corresponding field found.", nameof(fieldName)); - } - } -} diff --git a/RandomizerModTests/Extensions.cs b/RandomizerModTests/Extensions.cs deleted file mode 100644 index 1507fec..0000000 --- a/RandomizerModTests/Extensions.cs +++ /dev/null @@ -1,32 +0,0 @@ -namespace RandomizerModTests -{ - public static class Extensions - { - public static IEnumerable Product(this IEnumerable> eeos) - { - IEnumerator[] eos = eeos - .Select(x => x.GetEnumerator()) - .Where(x => x.MoveNext()) - .ToArray(); - - while (true) - { - object[] os = new object[eos.Length]; - for (int i = 0; i < eos.Length; i++) os[i] = eos[i].Current; - yield return os; - - for (int i = 0; i < eos.Length; i++) - { - IEnumerator eo = eos[i]; - if (!eo.MoveNext()) - { - if (i + 1 == eos.Length) { yield break; } - eo.Reset(); - eo.MoveNext(); - break; - } - } - } - } - } -} \ No newline at end of file diff --git a/RandomizerModTests/LogicFixture.cs b/RandomizerModTests/LogicFixture.cs deleted file mode 100644 index 914c208..0000000 --- a/RandomizerModTests/LogicFixture.cs +++ /dev/null @@ -1,88 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; -using RandomizerMod.RandomizerData; -using RandomizerMod.RC; -using RandomizerMod.Settings; - -namespace RandomizerModTests -{ - public class LogicFixture - { - public LogicManager LM { get; } - - private RandoModContext Default_CTX { get; } - - public LogicFixture() - { - Data.Load(); - Default_CTX = new(new(), Data.GetStartDef("King's Pass")); - Default_CTX.notchCosts.AddRange(CharmNotchCosts._vanillaCosts); - LM = Default_CTX.LM; - } - - public RandoModContext GetContext() - { - return new(Default_CTX); - } - - public RandoModContext GetContext(string startName) - { - StartDef start = Data.GetStartDef(startName) ?? throw new KeyNotFoundException($"Start {startName} does not exist."); - GenerationSettings gs = new(); - gs.StartLocationSettings.StartLocation = startName; - RandoModContext ctx = new(gs, start); - ctx.notchCosts.AddRange(CharmNotchCosts._vanillaCosts); - return ctx; - } - - public RandoModContext GetContext(GenerationSettings gs) - { - StartDef start = Data.GetStartDef(gs.StartLocationSettings.StartLocation) ?? throw new KeyNotFoundException($"Start {gs.StartLocationSettings.StartLocation} does not exist."); - RandoModContext ctx = new(gs, start); - ctx.notchCosts.AddRange(CharmNotchCosts._vanillaCosts); - return ctx; - } - - public ProgressionManager GetProgressionManager() - { - return new(LM, new RandoModContext(Default_CTX)); - } - - public ProgressionManager GetProgressionManager(Dictionary pmFieldValues) - { - ProgressionManager pm = GetProgressionManager(); - foreach (var kvp in pmFieldValues) pm.Set(kvp.Key, kvp.Value); - return pm; - } - - public void UpdateWaypointsAndVanillaTransitions(ProgressionManager pm) - { - LogicManager lm = pm.lm; - pm.mu.AddWaypoints(lm.Waypoints); - pm.mu.AddTransitions(lm.TransitionLookup.Values); - pm.mu.AddPlacements(Data.Transitions.Where(kvp => kvp.Value.VanillaTarget is not null).Select(kvp => new RandomizerCore.GeneralizedPlacement(lm.GetTransitionStrict(kvp.Value.VanillaTarget), lm.GetTransitionStrict(kvp.Key)))); - pm.mu.StartUpdating(); - } - - public LazyStateBuilder GetState(Dictionary stateFieldValues) - { - LazyStateBuilder lsb = new(LM.StateManager.DefaultState); - foreach (var kvp in stateFieldValues) - { - StateField sf = LM.StateManager.FieldLookup[kvp.Key]; - if (sf is StateBool) lsb.SetBool(sf, kvp.Value == 1); - else lsb.SetInt(sf, kvp.Value); - } - return lsb; - } - - public LazyStateBuilder GetStateP(params (string, int)[] vals) => GetState(vals.ToDictionary(p => p.Item1, p => p.Item2)); - - } - - [CollectionDefinition("Logic Collection")] - public class LMCollection : ICollectionFixture - { - - } -} \ No newline at end of file diff --git a/RandomizerModTests/LogicTests.cs b/RandomizerModTests/LogicTests.cs deleted file mode 100644 index f40731d..0000000 --- a/RandomizerModTests/LogicTests.cs +++ /dev/null @@ -1,41 +0,0 @@ -using FluentAssertions; -using RandomizerCore.Logic; -using RandomizerMod.RandomizerData; -using RandomizerMod.RC; -using RandomizerMod.Settings; -using Xunit.Abstractions; - -namespace RandomizerModTests -{ - [Collection("Logic Collection")] - public class LogicTests(LogicFixture Fix, ITestOutputHelper Output) - { - public LogicFixture Fix { get; } = Fix; - public ITestOutputHelper Output { get; } = Output; - - [Fact] - public void DashmasterFromWestWaterwaysStartTest() - { - RandoModContext ctx = Fix.GetContext("West Waterways"); - LogicManager lm = ctx.LM; - ProgressionManager pm = new(lm, ctx); - Fix.UpdateWaypointsAndVanillaTransitions(pm); - lm.GetLogicDefStrict("Dashmaster").CanGet(pm).Should().BeTrue(); - } - - [Fact] - public void CanStagFromWestWaterwaysStartTest() - { - GenerationSettings gs = new(); - gs.StartLocationSettings.StartLocation = "West Waterways"; - gs.SkipSettings.EnemyPogos = true; - gs.SkipSettings.ShadeSkips = true; - gs.SkipSettings.PreciseMovement = true; - RandoModContext ctx = Fix.GetContext(gs); - LogicManager lm = ctx.LM; - ProgressionManager pm = new(lm, ctx); - Fix.UpdateWaypointsAndVanillaTransitions(pm); - lm.GetLogicDefStrict("Can_Stag").CanGet(pm).Should().BeTrue(); - } - } -} diff --git a/RandomizerModTests/MiscTests.cs b/RandomizerModTests/MiscTests.cs deleted file mode 100644 index c94d9d2..0000000 --- a/RandomizerModTests/MiscTests.cs +++ /dev/null @@ -1,58 +0,0 @@ -using FluentAssertions; -using RandomizerCore.Logic; -using RandomizerMod.RandomizerData; -using RandomizerMod.RC; -using RandomizerMod.Settings; - -namespace RandomizerModTests -{ - public class MiscLogicTests - { - [Fact] - public void BasicSettingsPMTest() - { - GenerationSettings gs = new(); - SettingsPM pm = new(gs); - pm.Evaluate(new RandomizerCore.StringLogic.LogicClause("PRECISEMOVEMENT")).Should().BeFalse(); - pm.Evaluate(new RandomizerCore.StringLogic.LogicClause("ANY")).Should().BeTrue(); - pm.Evaluate(new RandomizerCore.StringLogic.LogicClause("0")).Should().BeFalse(); - } - - [Fact] - public void NoLocationsUnlockedWithoutState() - { - Data.Load(); - GenerationSettings gs = new(); - gs.StartLocationSettings.StartLocation = ""; - LogicManager lm = RCData.GetNewLogicManager(gs); - RandoModContext ctx = new(lm) - { - GenerationSettings = gs, - }; - ctx.notchCosts.AddRange(CharmNotchCosts._vanillaCosts); - ProgressionManager pm = new(lm, ctx); - - // set all item terms to max value, and zero out all waypoints and transitions. - foreach (Term t in lm.Terms) - { - if (t.Type == TermType.State) pm.SetState(t, null); - else pm.Set(t, int.MaxValue); - } - foreach (LogicWaypoint lw in lm.Waypoints) - { - if (lw.term.Type != TermType.State) pm.Set(lw.term, 0); - } - - HashSet allowList = new() - { - "Start", - "Start_State", - "Nightmare_Lantern_Lit", // Grimmchild - "Opened_Shaman_Pillar" // infection - }; - - Assert.DoesNotContain(lm.LogicLookup.Values, ld => ld.CanGet(pm) && !allowList.Contains(ld.Name)); - } - - } -} diff --git a/RandomizerModTests/RandomizerModTests.csproj b/RandomizerModTests/RandomizerModTests.csproj deleted file mode 100644 index 3d52105..0000000 --- a/RandomizerModTests/RandomizerModTests.csproj +++ /dev/null @@ -1,80 +0,0 @@ - - - - net472 - enable - annotations - - false - true - latest - ..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Hollow Knight\hollow_knight_Data\Managed - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - - $(HollowKnightRefs)\Assembly-CSharp.dll - - - $(HollowKnightRefs)\Mods\ItemChanger\ItemChanger.dll - - - $(HollowKnightRefs)\Mods\MenuChanger\MenuChanger.dll - - - $(HollowKnightRefs)\MMHOOK_Assembly-CSharp.dll - - - $(HollowKnightRefs)\MMHOOK_PlayMaker.dll - - - $(HollowKnightRefs)\Newtonsoft.Json.dll - - - $(HollowKnightRefs)\PlayMaker.dll - - - $(HollowKnightRefs)\Mods\RandomizerCore\RandomizerCore.dll - - - $(HollowKnightRefs)\Mods\RandomizerCore.Json\RandomizerCore.Json.dll - - - $(HollowKnightRefs)\UnityEngine.dll - - - $(HollowKnightRefs)\UnityEngine.CoreModule.dll - - - $(HollowKnightRefs)\UnityEngine.ImageConversionModule.dll - - - $(HollowKnightRefs)\UnityEngine.IMGUIModule.dll - - - $(HollowKnightRefs)\UnityEngine.TextRenderingModule.dll - - - $(HollowKnightRefs)\UnityEngine.UI.dll - - - diff --git a/RandomizerModTests/StateVariables/CastSpellVariableTests.cs b/RandomizerModTests/StateVariables/CastSpellVariableTests.cs deleted file mode 100644 index 54e4de1..0000000 --- a/RandomizerModTests/StateVariables/CastSpellVariableTests.cs +++ /dev/null @@ -1,83 +0,0 @@ -using RandomizerCore.Logic.StateLogic; -using RandomizerCore.Logic; - -namespace RandomizerModTests.StateVariables -{ - [Collection("Logic Collection")] - public class CastSpellVariableTests - { - LogicFixture Fix { get; } - - public CastSpellVariableTests(LogicFixture fix) - { - Fix = fix; - } - - public static Dictionary CharmStateBase => new() { ["NOPASSEDCHARMEQUIP"] = 0 }; - - [Fact] - public void CastSpellSucceedsWith3Casts() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$CASTSPELL[3]"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(new()); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.NotEmpty(result); - } - - [Fact] - public void CastSpellFailsWith3CastsBeforeOrAfterAShadeSkip() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHADESKIP"); - StateModifier sm2 = (StateModifier)Fix.LM.GetVariableStrict("$CASTSPELL[3]"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(new()); - - IEnumerable result = sm.ModifyState(null, pm, new(lsb)).SelectMany(s => sm2.ModifyState(null, pm, s)); - Assert.Empty(result); - result = sm2.ModifyState(null, pm, new(lsb)).SelectMany(s => sm.ModifyState(null, pm, s)); - Assert.Empty(result); - } - - [Fact] - public void CastSpellFailsWith4CastsAndASoulVessel() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$CASTSPELL[4]"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(new()); - - for (int i = 0; i < 3; i++) pm.Add(Fix.LM.GetItemStrict("Vessel_Fragment")); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.Empty(result); - } - - [Fact] - public void CastSpellSucceedsWith4CastsAndSpellTwister() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$CASTSPELL[4]"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(CharmStateBase); - - pm.Add(Fix.LM.GetItemStrict("Spell_Twister")); - pm.Set("NOTCHES", 6); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.NotEmpty(result); - } - - [Fact] - public void CastSpellSucceedsWith3to1CastsAndASoulVessel() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$CASTSPELL[3,1]"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(new()); - - for (int i = 0; i < 3; i++) pm.Add(Fix.LM.GetItemStrict("Vessel_Fragment")); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.NotEmpty(result); - } - } -} diff --git a/RandomizerModTests/StateVariables/EquipCharmVariableTests.cs b/RandomizerModTests/StateVariables/EquipCharmVariableTests.cs deleted file mode 100644 index cd07d26..0000000 --- a/RandomizerModTests/StateVariables/EquipCharmVariableTests.cs +++ /dev/null @@ -1,138 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerMod.RC; -using RandomizerMod.RC.StateVariables; -using FluentAssertions; -using RandomizerCore.Logic.StateLogic; -using EquipResult = RandomizerMod.RC.StateVariables.EquipCharmVariable.EquipResult; -using System.Security.Cryptography; - -namespace RandomizerModTests.StateVariables -{ - [Collection("Logic Collection")] - public class EquipCharmVariableTests - { - LogicFixture Fix { get; } - - public EquipCharmVariableTests(LogicFixture fix) - { - Fix = fix; - } - - public static Dictionary CharmStateBase => new() { ["NOPASSEDCHARMEQUIP"] = 0 }; - - [Fact] - public void BasicEquipRequirementsTest() - { - LogicManager lm = Fix.LM; - Term swarmTerm = lm.GetTermStrict("Gathering_Swarm"); - EquipCharmVariable swarm = (EquipCharmVariable)lm.GetVariableStrict(EquipCharmVariable.GetName(swarmTerm.Name)); - var pm = Fix.GetProgressionManager(new() { [swarmTerm.Name] = 1, ["NOTCHES"] = 1 }); - - LazyStateBuilder state = new(lm.StateManager.DefaultState); - swarm.TryEquip(null, pm, ref state).Should().BeFalse(); - swarm.IsEquipped(state).Should().BeFalse(); - state.GetInt(lm.StateManager.GetIntStrict("USEDNOTCHES")).Should().Be(0); - state.GetInt(lm.StateManager.GetIntStrict("MAXNOTCHCOST")).Should().Be(0); - - state.SetBool(lm.StateManager.GetBoolStrict("NOPASSEDCHARMEQUIP"), false); - swarm.TryEquip(null, pm, in state, out LazyStateBuilder result).Should().BeTrue(); - swarm.IsEquipped(state).Should().BeFalse(); - state.GetInt(lm.StateManager.GetIntStrict("USEDNOTCHES")).Should().Be(0); - state.GetInt(lm.StateManager.GetIntStrict("MAXNOTCHCOST")).Should().Be(0); - swarm.IsEquipped(result).Should().BeTrue(); - result.GetInt(lm.StateManager.GetIntStrict("USEDNOTCHES")).Should().Be(1); - result.GetInt(lm.StateManager.GetIntStrict("MAXNOTCHCOST")).Should().Be(1); - - result = new(state); - swarm.SetUnequippable(ref state); - swarm.TryEquip(null, pm, ref state).Should().BeFalse(); - swarm.IsEquipped(state).Should().BeFalse(); - state.GetInt(lm.StateManager.GetIntStrict("USEDNOTCHES")).Should().Be(0); - state.GetInt(lm.StateManager.GetIntStrict("MAXNOTCHCOST")).Should().Be(0); - - swarm.TryEquip(null, pm, ref result).Should().BeTrue(); - swarm.IsEquipped(result).Should().BeTrue(); - result.GetInt(lm.StateManager.GetIntStrict("USEDNOTCHES")).Should().Be(1); - result.GetInt(lm.StateManager.GetIntStrict("MAXNOTCHCOST")).Should().Be(1); - - swarm.TryEquip(null, pm, ref result).Should().BeTrue(); - swarm.IsEquipped(result).Should().BeTrue(); - result.GetInt(lm.StateManager.GetIntStrict("USEDNOTCHES")).Should().Be(1); - result.GetInt(lm.StateManager.GetIntStrict("MAXNOTCHCOST")).Should().Be(1); - } - - [Theory] - [InlineData(1, (int[])[1], (bool[])[true], false)] - [InlineData(3, (int[])[1, 2, 1], (bool[])[true, true, true], true)] - [InlineData(3, (int[])[1, 2, 2], (bool[])[true, true, false], false)] - [InlineData(3, (int[])[2, 2, 1], (bool[])[true, true, false], true)] - [InlineData(3, (int[])[2, 2, 0], (bool[])[true, true, true], true)] - [InlineData(3, (int[])[4, 1, 1], (bool[])[true, true, true], true)] - [InlineData(3, (int[])[4, 1, 1, 1], (bool[])[true, true, true, false], true)] - [InlineData(3, (int[])[1, 1, 1, 4], (bool[])[true, true, true, false], false)] - [InlineData(3, (int[])[0, 1, 0], (bool[])[true, true, true], false)] - public void EquipCharmNotchTests(int notches, int[] notchCosts, bool[] equipResults, bool endedOvercharmed) - { - LogicManager lm = Fix.LM; - - var terms = lm.Terms.GetTermList(TermType.SignedByte).Skip(lm.GetTermStrict("Gathering_Swarm").Index).Take(notchCosts.Length); - var charms = terms.Select(t => lm.GetVariableStrict(EquipCharmVariable.GetName(t.Name))).Cast().ToArray(); - - var state = Fix.GetState(CharmStateBase); - var pm = Fix.GetProgressionManager(terms.ToDictionary(t => t.Name, t => 1)); - RandoModContext ctx = (RandoModContext)pm.ctx; - for (int i = 0; i < notchCosts.Length; i++) ctx.notchCosts[i] = notchCosts[i]; - pm.Set("NOTCHES", notches); - - for (int i = 0; i < notchCosts.Length; i++) - { - charms[i].TryEquip(null, pm, ref state).Should().Be(equipResults[i], lm.StateManager.PrettyPrint(state)); - } - - state.GetBool(lm.StateManager.GetBoolStrict("OVERCHARMED")).Should().Be(endedOvercharmed, lm.StateManager.PrettyPrint(state)); - - } - - - [Fact] - public void GenerateCharmCombinationsTest() - { - LogicManager lm = Fix.LM; - EquipCharmVariable[] charms = new EquipCharmVariable[2]; - for (int i = 0; i < charms.Length; i++) charms[i] = (EquipCharmVariable)lm.GetVariableStrict(EquipCharmVariable.GetName(i + 1)); - ProgressionManager pm = Fix.GetProgressionManager([]); - pm.Set("NOTCHES", 3); - pm.Set(LogicConstUtil.GetCharmTerm(1), 1); - pm.Set(LogicConstUtil.GetCharmTerm(2), 1); - int[] notchCosts = [3, 6]; - for (int i = 0; i < charms.Length; i++) ((RandoModContext)pm.ctx).notchCosts[i] = notchCosts[i]; - - LazyStateBuilder state = Fix.GetState(new() { { "NOPASSEDCHARMEQUIP", 0 } }); - State[] states = EquipCharmVariable.GenerateCharmCombinations(pm, state, charms).Select(s => s.GetState()).ToArray(); - State[] expected = - [ - Fix.GetState(new() { { "NOPASSEDCHARMEQUIP", 0 }, { "noCHARM1", 1 }, { "noCHARM2", 1 } }).GetState(), - Fix.GetState(new() { { "NOPASSEDCHARMEQUIP", 0 }, { "CHARM1", 1 }, { "noCHARM2", 1 }, { "USEDNOTCHES", 3 }, { "MAXNOTCHCOST", 3 } }).GetState(), - Fix.GetState(new() { { "NOPASSEDCHARMEQUIP", 0 }, { "noCHARM1", 1 }, { "CHARM2", 1 }, { "OVERCHARMED", 1 }, { "USEDNOTCHES", 6 }, { "MAXNOTCHCOST", 6 } }).GetState(), - ]; - states.Should().SatisfyRespectively(expected.Select(Eq).ToArray()); - states.Should().AllSatisfy(s => charms.All(c => c.IsDetermined(s))); - - Action Eq(State other) - { - return s => - { - lm.StateManager.PrettyPrint(s).Should().Be(lm.StateManager.PrettyPrint(other)); - State.IsComparablyLE(s, other).Should().BeTrue(); - State.IsComparablyLE(other, s).Should().BeTrue(); - }; - } - } - - - - - - - } -} diff --git a/RandomizerModTests/StateVariables/HPStateManagerTests.cs b/RandomizerModTests/StateVariables/HPStateManagerTests.cs deleted file mode 100644 index 55163e2..0000000 --- a/RandomizerModTests/StateVariables/HPStateManagerTests.cs +++ /dev/null @@ -1,88 +0,0 @@ -using FluentAssertions; -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; -using RandomizerMod.RC.StateVariables; -using Xunit.Abstractions; - -namespace RandomizerModTests.StateVariables -{ - [Collection("Logic Collection")] - public class HPStateManagerTests(LogicFixture Fix, ITestOutputHelper Output) - { - public LazyStateBuilder Default => Fix.GetState([]); - public LazyStateBuilder BenchFlower => Fix.GetState(new() { { "NOPASSEDCHARMEQUIP", 0 }, { "NOFLOWER", 0 } }); - public HPStateManager HPSM => (HPStateManager)Fix.LM.GetVariableStrict(HPStateManager.Prefix); - public StateManager SM => Fix.LM.StateManager; - public StateInt LazySpentHP => SM.GetIntStrict("LAZYSPENTHP"); - public StateInt SpentHP => SM.GetIntStrict("SPENTHP"); - public StateInt SpentBlueHP => SM.GetIntStrict("SPENTBLUEHP"); - public StateBool Overcharmed => SM.GetBoolStrict("OVERCHARMED"); - public StateBool CannotOvercharm => SM.GetBoolStrict("CANNOTOVERCHARM"); - - - [Fact] - public void EarlyStrictDamage() - { - ProgressionManager pm = Fix.GetProgressionManager([]); - List states = HPSM.DetermineHP(pm, Default).ToList(); - states.Should().HaveCount(2).And.AllSatisfy(s => HPSM.IsHPDetermined(s)); - - LazyStateBuilder oc = states.First(s => s.GetBool(Overcharmed)); - LazyStateBuilder noc = states.First(s => s.GetBool(CannotOvercharm)); - oc.GetBool(CannotOvercharm).Should().BeFalse(); - noc.GetBool(Overcharmed).Should().BeFalse(); - - List oc_damage = HPSM.TakeDamage(pm, oc, 1).ToList(); - List noc_damage = HPSM.TakeDamage(pm, noc, 1).ToList(); - oc_damage.Should().ContainSingle() - .Subject.GetInt(SpentHP).Should().Be(2); - noc_damage.Should().ContainSingle() - .Subject.GetInt(SpentHP).Should().Be(1); - } - - [Fact] - public void LazyToStrictSwitchFiveMasks() - { - ProgressionManager pm = Fix.GetProgressionManager([]); - List states = [Default]; - - for (int i = 0; i < 2; i++) - { - states = states.SelectMany(s => HPSM.TakeDamage(pm, s, 1)).ToList(); - states.Should().ContainSingle($" after taking {i + 1} damage."); - states[0].GetInt(LazySpentHP).Should().Be(i + 1, $" after taking {i + 1} damage."); - states[0].GetInt(SpentHP).Should().Be(0, $" after taking {i + 1} damage."); - HPSM.IsHPDetermined(states[0]).Should().Be(false, $" after taking {i + 1} damage."); - } - for (int i = 2; i < 4; i++) - { - states = states.SelectMany(s => HPSM.TakeDamage(pm, s, 1)).ToList(); - states.Should().ContainSingle($" after taking {i + 1} damage."); - states[0].GetInt(LazySpentHP).Should().Be(int.MaxValue, $" after taking {i + 1} damage."); - states[0].GetInt(SpentHP).Should().Be(i + 1, $" after taking {i + 1} damage."); - HPSM.IsHPDetermined(states[0]).Should().Be(true, $" after taking {i + 1} damage."); - } - { - states = states.SelectMany(s => HPSM.TakeDamage(pm, s, 1)).ToList(); - states.Should().BeEmpty(" after taking 5 damage"); - } - } - - [Fact] - public void JoniHPInfo() - { - ProgressionManager pm = Fix.GetProgressionManager(); - pm.Set("Joni's_Blessing", 1); - pm.Set("NOTCHES", 4); - LazyStateBuilder state = BenchFlower; - ((EquipCharmVariable)Fix.LM.GetVariableStrict(EquipCharmVariable.GetName("Joni's_Blessing"))).TryEquip(null, pm, ref state).Should().BeTrue(); - state.SetBool(SM.GetBool("CANNOTOVERCHARM"), true); - state = HPSM.DetermineHP(pm, state).Single(); - IHPStateManager.StrictHPInfo hp = HPSM.GetHPInfo(pm, state); - hp.MaxWhiteHP.Should().Be(7); - hp.CurrentWhiteHP.Should().Be(7); - hp.CurrentBlueHP.Should().Be(0); - } - - } -} diff --git a/RandomizerModTests/StateVariables/LifebloodCountVariableTests.cs b/RandomizerModTests/StateVariables/LifebloodCountVariableTests.cs deleted file mode 100644 index 6d8ebb7..0000000 --- a/RandomizerModTests/StateVariables/LifebloodCountVariableTests.cs +++ /dev/null @@ -1,79 +0,0 @@ -using FluentAssertions; -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; -using RandomizerMod.RC.StateVariables; - -namespace RandomizerModTests.StateVariables -{ - [Collection("Logic Collection")] - public class LifebloodCountVariableTests(LogicFixture Fix) - { - public LazyStateBuilder BenchFlower => Fix.GetState(new() { { "NOPASSEDCHARMEQUIP", 0 }, { "NOFLOWER", 0 } }); - - [Fact] - public void FailsOnDefaultProgression() - { - ProgressionManager pm = Fix.GetProgressionManager(); - LifebloodCountVariable lcv = (LifebloodCountVariable)Fix.LM.GetVariableStrict(LifebloodCountVariable.Prefix); - List states = [BenchFlower]; - lcv.ModifyAll(null, pm, states); - states.Should().BeEmpty("since pm has no lifeblood charms."); - } - - [Fact] - public void SucceedsWithAnyOneLifebloodCharm() - { - string[] charmNames = ["Lifeblood_Heart", "Lifeblood_Core", "Joni's_Blessing"]; - EquipCharmVariable[] charms = charmNames.Select(s => Fix.LM.GetVariableStrict(EquipCharmVariable.GetName(s))) - .Cast().ToArray(); - for (int i = 0; i < 3; i++) - { - ProgressionManager pm = Fix.GetProgressionManager(); - pm.Set(charmNames[i], 1); - pm.Set("NOTCHES", 4); - LifebloodCountVariable lcv = (LifebloodCountVariable)Fix.LM.GetVariableStrict(LifebloodCountVariable.Prefix); - List states = [BenchFlower]; - lcv.ModifyAll(null, pm, states); - states.Should().NotBeEmpty($"pm contains {charmNames[i]}."); - } - } - - [Fact] - public void FailsWithLifebloodHeartAfter2Damage() - { - ProgressionManager pm = Fix.GetProgressionManager(); - pm.Set("Lifeblood_Heart", 1); - pm.Set("NOTCHES", 4); - LifebloodCountVariable lcv = (LifebloodCountVariable)Fix.LM.GetVariableStrict(LifebloodCountVariable.Prefix); - TakeDamageVariable tdv = (TakeDamageVariable)Fix.LM.GetVariableStrict(TakeDamageVariable.Prefix); - List states = [BenchFlower]; - tdv.ModifyAll(null, pm, states); - tdv.ModifyAll(null, pm, states); - lcv.ModifyAll(null, pm, states); - states.Should().BeEmpty($"Lifeblood Heart is exhausted by 2 damage."); - } - - [Fact] - public void SucceedsWithLifebloodCoreOrJoniAfter2Damage() - { - string[] charmNames = ["Lifeblood_Core", "Joni's_Blessing"]; - EquipCharmVariable[] charms = charmNames.Select(s => Fix.LM.GetVariableStrict(EquipCharmVariable.GetName(s))) - .Cast().ToArray(); - - for (int i = 0; i < charmNames.Length; i++) - { - ProgressionManager pm = Fix.GetProgressionManager(); - pm.Set(charmNames[i], 1); - pm.Set("NOTCHES", 4); - LifebloodCountVariable lcv = (LifebloodCountVariable)Fix.LM.GetVariableStrict(LifebloodCountVariable.Prefix); - TakeDamageVariable tdv = (TakeDamageVariable)Fix.LM.GetVariableStrict(TakeDamageVariable.Prefix); - List states = [BenchFlower]; - tdv.ModifyAll(null, pm, states); - tdv.ModifyAll(null, pm, states); - lcv.ModifyAll(null, pm, states); - states.Should().NotBeEmpty($"{charmNames[i]} is not exhausted by 2 damage."); - } - } - - } -} diff --git a/RandomizerModTests/StateVariables/ShadeSkipVariableTests.cs b/RandomizerModTests/StateVariables/ShadeSkipVariableTests.cs deleted file mode 100644 index d91bc96..0000000 --- a/RandomizerModTests/StateVariables/ShadeSkipVariableTests.cs +++ /dev/null @@ -1,149 +0,0 @@ -using RandomizerCore.Logic.StateLogic; -using RandomizerCore.Logic; - -namespace RandomizerModTests.StateVariables -{ - [Collection("Logic Collection")] - public class ShadeSkipVariableTests - { - public LogicFixture Fix { get; } - - public ShadeSkipVariableTests(LogicFixture fix) - { - Fix = fix; - } - - public static Dictionary ShadeskipPMBase => new() { ["SHADESKIPS"] = 1, }; - public static Dictionary CharmStateBase => new() { ["NOPASSEDCHARMEQUIP"] = 0 }; - - [Fact] - public void CannotShadeSkipWithoutSetting() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHADESKIP"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(new()); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.Empty(result); - } - - [Fact] - public void CannotShadeSkipWithUsedState() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHADESKIP"); - ProgressionManager pm = Fix.GetProgressionManager(ShadeskipPMBase); - LazyStateBuilder lsb = Fix.GetState(new() { ["USEDSHADE"] = 1 }); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.Empty(result); - } - - [Fact] - public void CannotShadeSkipWithVoidHeartEquipped() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHADESKIP"); - ProgressionManager pm = Fix.GetProgressionManager(ShadeskipPMBase); - LazyStateBuilder lsb = Fix.GetState(new() { ["CHARM36"] = 1 }); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.Empty(result); - } - - [Fact] - public void CannotShadeSkipWithMaxSoulRequirement() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHADESKIP"); - ProgressionManager pm = Fix.GetProgressionManager(ShadeskipPMBase); - LazyStateBuilder lsb = Fix.GetState(new() { ["REQUIREDMAXSOUL"] = 67 }); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.Empty(result); - } - - [Fact] - public void CanShadeSkipWithSetting() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHADESKIP"); - ProgressionManager pm = Fix.GetProgressionManager(ShadeskipPMBase); - LazyStateBuilder lsb = Fix.GetState(new()); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.NotEmpty(result); - } - - [Fact] - public void Cannot2HitShadeSkipWith1HP() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHADESKIP[2HITS]"); - ProgressionManager pm = Fix.GetProgressionManager(ShadeskipPMBase); - LazyStateBuilder lsb = Fix.GetState(new()); - - pm.Set("MASKSHARDS", 4); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.Empty(result); - } - - [Fact] - public void Can2HitShadeSkipWith4HP() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHADESKIP[2HITS]"); - ProgressionManager pm = Fix.GetProgressionManager(ShadeskipPMBase); - LazyStateBuilder lsb = Fix.GetState(new()); - - pm.Set("MASKSHARDS", 16); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.NotEmpty(result); - } - - [Fact] - public void Can2HitShadeSkipWith2HPFragileHeartLegEater() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHADESKIP[2HITS]"); - ProgressionManager pm = Fix.GetProgressionManager(ShadeskipPMBase); - LazyStateBuilder lsb = Fix.GetState(CharmStateBase); - - pm.Set("MASKSHARDS", 8); - pm.Set("NOTCHES", 6); - pm.Set("Can_Repair_Fragile_Charms", 1); - pm.Add(Fix.LM.GetItemStrict("Fragile_Heart")); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.NotEmpty(result); - } - - [Fact] - public void Can2HitShadeSkipWith2HPUnbreakableHeart() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHADESKIP[2HITS]"); - ProgressionManager pm = Fix.GetProgressionManager(ShadeskipPMBase); - LazyStateBuilder lsb = Fix.GetState(CharmStateBase); - - pm.Set("MASKSHARDS", 8); - pm.Set("NOTCHES", 6); - pm.Add(Fix.LM.GetItemStrict("Fragile_Heart")); - pm.Add(Fix.LM.GetItemStrict("Unbreakable_Heart")); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.NotEmpty(result); - } - - [Fact] - public void Cannot2HitShadeSkipWith2HPBrokenFragileHeart() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHADESKIP[2HITS]"); - ProgressionManager pm = Fix.GetProgressionManager(ShadeskipPMBase); - LazyStateBuilder lsb = Fix.GetState(CharmStateBase); - - pm.Set("MASKSHARDS", 8); - pm.Set("NOTCHES", 6); - pm.Set("Can_Repair_Fragile_Charms", 1); - pm.Add(Fix.LM.GetItemStrict("Fragile_Heart")); - lsb.SetBool(Fix.LM.StateManager.GetBoolStrict("BROKEHEART"), true); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.Empty(result); - } - } -} diff --git a/RandomizerModTests/StateVariables/ShriekPogoVariableTests.cs b/RandomizerModTests/StateVariables/ShriekPogoVariableTests.cs deleted file mode 100644 index efdbc64..0000000 --- a/RandomizerModTests/StateVariables/ShriekPogoVariableTests.cs +++ /dev/null @@ -1,148 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerModTests.StateVariables -{ - [Collection("Logic Collection")] - public class ShriekPogoVariableTests : IClassFixture - { - public LogicFixture Fix { get; } - - public ShriekPogoVariableTests(LogicFixture fixture) - { - Fix = fixture; - } - - - public static string[] ShriekPogoVariableNames => new string[] - { - "$SHRIEKPOGO", "$SHRIEKPOGO[3,1,NOSTALL,before:ROOMSOUL,after:ROOMSOUL]", "$SHRIEKPOGO[7]" - }; - - public static Dictionary ShriekPogoPMBase => new() { ["WINGS"] = 1, ["SCREAM"] = 2, ["SHRIEKPOGOSKIPS"] = 1, }; - public static Dictionary DifficultShriekPogoPMBase => new() { ["WINGS"] = 1, ["SCREAM"] = 2, ["SHRIEKPOGOSKIPS"] = 1, ["DIFFICULTSKIPS"] = 1, }; - - public static Dictionary CharmStateBase => new() { ["NOPASSEDCHARMEQUIP"] = 0 }; - - public static Dictionary[] MissingWingsOrShriekPMData => new Dictionary[] - { - new(), new(){["WINGS"] = 1}, new(){["SCREAM"] = 2}, new(){["SHRIEKPOGOSKIPS"] = 1}, - new(){["WINGS"] = 1, ["SCREAM"] = 2}, new(){["SCREAM"] = 2, ["SHRIEKPOGOSKIPS"] = 1}, new(){["WINGS"] = 1, ["SHRIEKPOGOSKIPS"] = 1}, - }; - - public static Dictionary[] DefaultStateData => new Dictionary[] { new() }; - - public static IEnumerable MissingWingsOrShriekData => new object[][] { ShriekPogoVariableNames, MissingWingsOrShriekPMData, DefaultStateData }.Product(); - - - - - - - [Theory] - [MemberData(nameof(MissingWingsOrShriekData))] - public void ShriekPogoFailsIfNoWingsOrNoShriek(string shriekPogoVariableName, Dictionary pmFieldValues, Dictionary stateFieldValues) - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict(shriekPogoVariableName); - ProgressionManager pm = Fix.GetProgressionManager(pmFieldValues); - LazyStateBuilder lsb = Fix.GetState(stateFieldValues); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.Empty(result); - result = sm.ProvideState(null, pm); - Assert.Null(result); - } - - [Fact] - public void ShriekPogoSucceedsWith3Casts() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHRIEKPOGO[3]"); - ProgressionManager pm = Fix.GetProgressionManager(ShriekPogoPMBase); - LazyStateBuilder lsb = Fix.GetState(new()); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.NotEmpty(result); - } - - [Fact] - public void ShriekPogoFailsWith4Casts() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHRIEKPOGO[4]"); - ProgressionManager pm = Fix.GetProgressionManager(DifficultShriekPogoPMBase); - LazyStateBuilder lsb = Fix.GetState(new()); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.Empty(result); - } - - [Fact] - public void ShriekPogoSucceedsWith4CastsAndSpellTwister() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHRIEKPOGO[4]"); - ProgressionManager pm = Fix.GetProgressionManager(DifficultShriekPogoPMBase); - LazyStateBuilder lsb = Fix.GetState(CharmStateBase); - - pm.Add(Fix.LM.GetItemStrict("Spell_Twister")); - pm.Set(Fix.LM.GetTermStrict("NOTCHES"), 6); - pm.Set("DIFFICULTSKIPS", 1); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.NotEmpty(result); - } - - [Fact] - public void ShriekPogoFailsWith4CastsAndSpellTwisterWithoutDifficultSkips() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHRIEKPOGO[4]"); - ProgressionManager pm = Fix.GetProgressionManager(ShriekPogoPMBase); - LazyStateBuilder lsb = Fix.GetState(CharmStateBase); - - pm.Add(Fix.LM.GetItemStrict("Spell_Twister")); - pm.Set("NOTCHES", 6); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.Empty(result); - } - - [Fact] - public void ShriekPogoFailsWith4CastsAndASoulVessel() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHRIEKPOGO[4]"); - ProgressionManager pm = Fix.GetProgressionManager(DifficultShriekPogoPMBase); - LazyStateBuilder lsb = Fix.GetState(new()); - - for (int i = 0; i < 3; i++) pm.Add(Fix.LM.GetItemStrict("Vessel_Fragment")); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.Empty(result); - } - - [Fact] - public void ShriekPogoSucceedsWith3to1CastsAndASoulVessel() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHRIEKPOGO[3,1]"); - ProgressionManager pm = Fix.GetProgressionManager(DifficultShriekPogoPMBase); - LazyStateBuilder lsb = Fix.GetState(new()); - - for (int i = 0; i < 3; i++) pm.Add(Fix.LM.GetItemStrict("Vessel_Fragment")); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.NotEmpty(result); - } - - [Fact] - public void ShriekPogoSucceedsWith4CastsAndASoulVesselAndADash() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SHRIEKPOGO[4]"); - ProgressionManager pm = Fix.GetProgressionManager(DifficultShriekPogoPMBase); - LazyStateBuilder lsb = Fix.GetState(new()); - - for (int i = 0; i < 3; i++) pm.Add(Fix.LM.GetItemStrict("Vessel_Fragment")); - pm.Add(Fix.LM.GetItemStrict("Mothwing_Cloak")); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.NotEmpty(result); - } - - } -} diff --git a/RandomizerModTests/StateVariables/SlopeballVariableTests.cs b/RandomizerModTests/StateVariables/SlopeballVariableTests.cs deleted file mode 100644 index d57fa25..0000000 --- a/RandomizerModTests/StateVariables/SlopeballVariableTests.cs +++ /dev/null @@ -1,57 +0,0 @@ -using RandomizerCore.Logic.StateLogic; -using RandomizerCore.Logic; - -namespace RandomizerModTests.StateVariables -{ - [Collection("Logic Collection")] - public class SlopeballVariableTests - { - public LogicFixture Fix { get; } - - public SlopeballVariableTests(LogicFixture fix) - { - Fix = fix; - } - - public static Dictionary SlopeballPMBase => new() { ["FIREBALL"] = 1, ["SLOPEBALLSKIPS"] = 1 }; - - public static object[][] InsufficientSlopeballPMBase => new Dictionary[] { new(), new() { ["FIREBALL"] = 1 }, new(){ ["SLOPEBALLSKIPS"] = 1 } }.Select(d => new object[] {d}).ToArray(); - - public static Dictionary InsufficientSoulState => new() { ["SPENTSOUL"] = 99 }; - - [Theory] - [MemberData(nameof(InsufficientSlopeballPMBase))] - public void CannotCastWithoutProgressionRequirements(Dictionary pmFields) - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SLOPEBALL"); - ProgressionManager pm = Fix.GetProgressionManager(pmFields); - LazyStateBuilder lsb = Fix.GetState(new()); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.Empty(result); - } - - [Fact] - public void CannotCastWithoutSoul() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SLOPEBALL"); - ProgressionManager pm = Fix.GetProgressionManager(SlopeballPMBase); - LazyStateBuilder lsb = Fix.GetState(InsufficientSoulState); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.Empty(result); - } - - [Fact] - public void CanCastOnceWithRequirements() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$SLOPEBALL"); - ProgressionManager pm = Fix.GetProgressionManager(SlopeballPMBase); - LazyStateBuilder lsb = Fix.GetState(new()); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.NotEmpty(result); - } - - } -} diff --git a/RandomizerModTests/StateVariables/SoulStateManagerTests.cs b/RandomizerModTests/StateVariables/SoulStateManagerTests.cs deleted file mode 100644 index e7c092d..0000000 --- a/RandomizerModTests/StateVariables/SoulStateManagerTests.cs +++ /dev/null @@ -1,142 +0,0 @@ -using FluentAssertions; -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; -using RandomizerMod.RC.StateVariables; - -namespace RandomizerModTests.StateVariables -{ - [Collection("Logic Collection")] - public class SoulStateManagerTests(LogicFixture Fix) - { - public LazyStateBuilder Default => Fix.GetState([]); - public LazyStateBuilder BenchFlower => Fix.GetState(new() { { "NOPASSEDCHARMEQUIP", 0 }, { "NOFLOWER", 0 } }); - public SoulStateManager SSM => (SoulStateManager)Fix.LM.GetVariableStrict(SoulStateManager.Prefix); - public StateManager SM => Fix.LM.StateManager; - public StateInt SpentSoul => SM.GetIntStrict("SPENTSOUL"); - public StateInt SpentReserveSoul => SM.GetIntStrict("SPENTRESERVESOUL"); - public StateInt SoulLimiter => SM.GetIntStrict("SOULLIMITER"); - public StateInt RequiredMaxSoul => SM.GetIntStrict("REQUIREDMAXSOUL"); - - private readonly record struct ExpectedSoul(int SpentSoul, int SpentReserveSoul, int RequiredMaxSoul, int SoulLimiter); - - private void Check(ExpectedSoul soul, LazyStateBuilder state) - { - state.GetInt(SpentSoul).Should().Be(soul.SpentSoul); - state.GetInt(SpentReserveSoul).Should().Be(soul.SpentReserveSoul); - state.GetInt(RequiredMaxSoul).Should().Be(soul.RequiredMaxSoul); - state.GetInt(SoulLimiter).Should().Be(soul.SoulLimiter); - } - - [Theory] - [InlineData(0)] - [InlineData(1)] - [InlineData(2)] - public void SpendSoulTheory(int testNum) - { - ProgressionManager pm = Fix.GetProgressionManager(); - List states; - ExpectedSoul[][] expectedSpend; - switch (testNum) - { - default: - case 0: - states = [Default]; - expectedSpend = [[new(33, 0, 33, 0)], [new(66, 0, 66, 0)], [new(99, 0, 99, 0)], []]; - break; - case 1: - states = [Default]; - pm.Set("VESSELFRAGMENTS", 3); - expectedSpend = [[new(0, 33, 33, 0)], [new(33, 33, 33, 0)], [new(66, 33, 66, 0)], [new(99, 33, 99, 0)], []]; - break; - case 2: - states = SSM.LimitSoul(pm, Default, 33, true).ToList(); - expectedSpend = [[new(33, 0, 33, 33)], [new(66, 0, 66, 33)], []]; - break; - } - - for (int i = 0; i < expectedSpend.Length; i++) - { - states = states.SelectMany(s => SSM.SpendSoul(pm, s, 33)).ToList(); - states.Should().HaveCount(expectedSpend[i].Length); - for (int j = 0; j < expectedSpend[i].Length; j++) - { - Check(expectedSpend[i][j], states[j]); - } - } - } - - [Theory] - [InlineData(0)] - [InlineData(1)] - [InlineData(2)] - public void FullRestoreTheory(int testNum) - { - ProgressionManager pm = Fix.GetProgressionManager(); - ExpectedSoul expected; - List states; - switch (testNum) - { - default: - case 0: - states = [Default]; - expected = new(0, 0, 66, 0); - break; - case 1: - pm.Set("VESSELFRAGMENTS", 3); - states = [Default]; - expected = new(0, 0, 66, 0); - break; - case 2: - states = SSM.LimitSoul(pm, Default, 33, true).ToList(); - expected = new(0, 0, 66, 33); - break; - } - List states2 = states.Select(s => new LazyStateBuilder(s)).ToList(); - - states = states.SelectMany(s => SSM.SpendSoul(pm, s, 66)).SelectMany(s => SSM.RestoreAllSoul(pm, s, true)).ToList(); - states.Should().ContainSingle(); - Check(expected, states[0]); - - states2 = states2.SelectMany(s => SSM.SpendAllSoul(pm, s)).SelectMany(s => SSM.RestoreAllSoul(pm, s, true)).ToList(); - states2.Should().ContainSingle(); - Check(expected with { RequiredMaxSoul = SSM.GetSoulInfo(pm, states2[0]).MaxSoul }, states2[0]); - } - - [Theory] - [InlineData(0)] - [InlineData(1)] - [InlineData(2)] - public void LimitSoulRoundtripTheory(int testNum) - { - ProgressionManager pm = Fix.GetProgressionManager(); - List states; - ExpectedSoul? expected; - switch (testNum) - { - default: - case 0: - states = [Default]; - expected = new(33, 0, 33, 0); - break; - case 1: - pm.Set("VESSELFRAGMENTS", 3); - states = [Default]; - expected = new(0, 33, 33, 0); - break; - case 2: - states = SSM.SpendSoul(pm, Default, 67).SelectMany(s => SSM.RestoreAllSoul(pm, s, true)).ToList(); - expected = null; - break; - } - - states = states.SelectMany(s => SSM.LimitSoul(pm, s, 33, true)).SelectMany(s => SSM.LimitSoul(pm, s, 0, false)).ToList(); - if (!expected.HasValue) states.Should().BeEmpty(); - else - { - states.Should().ContainSingle(); - Check(expected.Value, states[0]); - } - } - - } -} diff --git a/RandomizerModTests/StateVariables/TakeDamageVariableTests.cs b/RandomizerModTests/StateVariables/TakeDamageVariableTests.cs deleted file mode 100644 index 489a139..0000000 --- a/RandomizerModTests/StateVariables/TakeDamageVariableTests.cs +++ /dev/null @@ -1,220 +0,0 @@ -using RandomizerCore.Logic; -using RandomizerCore.Logic.StateLogic; - -namespace RandomizerModTests.StateVariables -{ - [Collection("Logic Collection")] - public class TakeDamageVariableTests(LogicFixture Fix) - { - public Dictionary CharmStateBase => new() { ["NOPASSEDCHARMEQUIP"] = 0 }; - - [Fact] - public void TakeDamageFailsOn1HP() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$TAKEDAMAGE"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(new()); - - pm.Set("MASKSHARDS", 4); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.Empty(result); - } - - [Fact] - public void TakeDamageSucceedsOn2HP() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$TAKEDAMAGE"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(new()); - - pm.Set("MASKSHARDS", 8); - - IEnumerable result = sm.ModifyState(null, pm, lsb); - Assert.NotEmpty(result); - } - - [Fact] - public void TakeDamageTwiceFailsOn2HP() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$TAKEDAMAGE"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(new()); - - pm.Set("MASKSHARDS", 8); - - IEnumerable result = sm.ModifyState(null, pm, lsb).SelectMany(s => sm.ModifyState(null, pm, s)); - Assert.Empty(result); - } - - [Fact] - public void TakeDamageTwiceSucceedsOn2HPWithFocus() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$TAKEDAMAGE"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(new()); - - pm.Set("MASKSHARDS", 8); - pm.Set("FOCUS", 1); - - IEnumerable result = sm.ModifyState(null, pm, lsb).SelectMany(s => sm.ModifyState(null, pm, s)); - Assert.NotEmpty(result); - } - - [Fact] - public void TakeDamageTwiceSucceedsWithLifebloodHeart() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$TAKEDAMAGE"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(CharmStateBase); - - pm.Set("MASKSHARDS", 4); - pm.Add(Fix.LM.GetItemStrict("Lifeblood_Heart")); - pm.Set("NOTCHES", 6); - - IEnumerable result = sm.ModifyState(null, pm, lsb).SelectMany(s => sm.ModifyState(null, pm, s)); - Assert.NotEmpty(result); - } - - [Fact] - public void TakeDamageTwiceFailsWith1HPLifebloodHeartOvercharmed() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$TAKEDAMAGE"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(CharmStateBase); - - pm.Set("MASKSHARDS", 4); - pm.Add(Fix.LM.GetItemStrict("Lifeblood_Heart")); - pm.Set("NOTCHES", 1); - - IEnumerable result = sm.ModifyState(null, pm, lsb).SelectMany(s => sm.ModifyState(null, pm, s)); - Assert.Empty(result); - } - - [Fact] - public void TakeDoubleDamageSingleDamageSucceedsWith2HPLifebloodHeart() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$TAKEDAMAGE"); - StateModifier sm2 = (StateModifier)Fix.LM.GetVariableStrict("$TAKEDAMAGE[2]"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(CharmStateBase); - - pm.Set("MASKSHARDS", 8); - pm.Add(Fix.LM.GetItemStrict("Lifeblood_Heart")); - pm.Set("NOTCHES", 6); - - IEnumerable result = sm2.ModifyState(null, pm, lsb).SelectMany(s => sm.ModifyState(null, pm, s)); - Assert.NotEmpty(result); - } - - [Fact] - public void TakeSingleDamageDoubleDamageFailsWith2HPLifebloodHeart() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$TAKEDAMAGE"); - StateModifier sm2 = (StateModifier)Fix.LM.GetVariableStrict("$TAKEDAMAGE[2]"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(CharmStateBase); - - pm.Set("MASKSHARDS", 8); - pm.Add(Fix.LM.GetItemStrict("Lifeblood_Heart")); - pm.Set("NOTCHES", 6); - - IEnumerable result = sm.ModifyState(null, pm, lsb).SelectMany(s => sm2.ModifyState(null, pm, s)); - Assert.Empty(result); - } - - [Fact] - public void TakeDamageTwiceSucceedsWith3HPLifebloodHeartOvercharmed() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$TAKEDAMAGE"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(CharmStateBase); - - pm.Set("MASKSHARDS", 12); - pm.Add(Fix.LM.GetItemStrict("Lifeblood_Heart")); - pm.Set("NOTCHES", 1); - - IEnumerable result = sm.ModifyState(null, pm, lsb).SelectMany(s => sm.ModifyState(null, pm, s)); - Assert.NotEmpty(result); - } - - [Fact] - public void TakeDamageTwiceSucceedsWithLifebloodCore() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$TAKEDAMAGE"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(CharmStateBase); - - pm.Set("MASKSHARDS", 4); - pm.Add(Fix.LM.GetItemStrict("Lifeblood_Core")); - pm.Set("NOTCHES", 6); - - IEnumerable result = sm.ModifyState(null, pm, lsb).SelectMany(s => sm.ModifyState(null, pm, s)); - Assert.NotEmpty(result); - } - - [Fact] - public void TakeDamageTwiceSucceedsWithLifebloodCoreOvercharmed() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$TAKEDAMAGE"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(CharmStateBase); - - pm.Set("MASKSHARDS", 4); - pm.Add(Fix.LM.GetItemStrict("Lifeblood_Core")); - pm.Set("NOTCHES", 1); - - IEnumerable result = sm.ModifyState(null, pm, lsb).SelectMany(s => sm.ModifyState(null, pm, s)); - Assert.NotEmpty(result); - } - - [Fact] - public void TakeDamageTwiceSucceedsWith2HPHiveblood() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$TAKEDAMAGE"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(CharmStateBase); - - pm.Set("MASKSHARDS", 8); - pm.Add(Fix.LM.GetItemStrict("Hiveblood")); - pm.Set("NOTCHES", 6); - - IEnumerable result = sm.ModifyState(null, pm, lsb).SelectMany(s => sm.ModifyState(null, pm, s)); - Assert.NotEmpty(result); - } - - [Fact] - public void TakeDoubleDamageFourTimesOn3HPSucceedsWithDeepFocus() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$TAKEDAMAGE[2]"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(CharmStateBase); - - pm.Set("MASKSHARDS", 12); - pm.Add(Fix.LM.GetItemStrict("Deep_Focus")); - pm.Set("NOTCHES", 6); - pm.Set("FOCUS", 1); - - IEnumerable result = sm.ModifyState(null, pm, lsb).SelectMany(s => sm.ModifyState(null, pm, s)).SelectMany(s => sm.ModifyState(null, pm, s)).SelectMany(s => sm.ModifyState(null, pm, s)); - Assert.NotEmpty(result); - } - - [Fact] - public void TakeDoubleDamageFiveTimesOn3HPFailsWithDeepFocus() - { - StateModifier sm = (StateModifier)Fix.LM.GetVariableStrict("$TAKEDAMAGE[2]"); - ProgressionManager pm = Fix.GetProgressionManager(new()); - LazyStateBuilder lsb = Fix.GetState(CharmStateBase); - - pm.Set("MASKSHARDS", 12); - pm.Add(Fix.LM.GetItemStrict("Deep_Focus")); - pm.Set("NOTCHES", 6); - pm.Set("FOCUS", 1); - - IEnumerable result = sm.ModifyState(null, pm, lsb) - .SelectMany(s => sm.ModifyState(null, pm, s)).SelectMany(s => sm.ModifyState(null, pm, s)) - .SelectMany(s => sm.ModifyState(null, pm, s)).SelectMany(s => sm.ModifyState(null, pm, s)); - Assert.Empty(result); - } - } -} diff --git a/RandomizerModTests/Usings.cs b/RandomizerModTests/Usings.cs deleted file mode 100644 index 8c927eb..0000000 --- a/RandomizerModTests/Usings.cs +++ /dev/null @@ -1 +0,0 @@ -global using Xunit; \ No newline at end of file diff --git a/api/.gitignore b/api/.gitignore new file mode 100644 index 0000000..e8079a3 --- /dev/null +++ b/api/.gitignore @@ -0,0 +1,5 @@ +############### +# temp file # +############### +*.yml +.manifest diff --git a/articles/connection_guide.md b/articles/connection_guide.md new file mode 100644 index 0000000..662403f --- /dev/null +++ b/articles/connection_guide.md @@ -0,0 +1,73 @@ +A connection is a mod which integrates with rando to add new features, such as logic edits, custom items and locations, or special randomization requirements. + +## The Checklist + +This section contains a checklist of steps to create a connection mod. Additional details on the options for each step are given in subsequent sections. + +* Define any added [items](#defining-custom-items) and [locations](#defining-custom-locations) in ItemChanger and Randomizer. + - Add the items and locations to the randomization request ([example](https://github.com/flibber-hk/HollowKnight.RandomizableLevers/blob/c016cfc93dc37c5f4b16dd279c16a2f6fe0d9c66/RandomizableLevers/Rando/RequestModifier.cs#L163-L167)). + In particular, this is how to inform [RandoMapMod](https://github.com/syyePhenomenol/RandoMapMod/blob/master/RandoMapMod/Pins/InteropProperties.cs) of the locations ([example](https://github.com/flibber-hk/HollowKnight.RandoPlus/blob/95305e4642bdd2535d683f33438180f701be6254/RandoPlus/GhostEssence/ICInterop.cs#L45-L49)). + - Add metadata to items to be read by [CMICore](https://github.com/BadMagic100/ConnectionMetadataInjector) and its consumers ([example](https://github.com/flibber-hk/HollowKnight.RandoPlus/blob/95305e4642bdd2535d683f33438180f701be6254/RandoPlus/MrMushroom/ICInterop.cs#L27)). + - Apply a group resolver for the randomized items and locations ([easy example](https://github.com/flibber-hk/HollowKnight.RandoPlus/blob/95305e4642bdd2535d683f33438180f701be6254/RandoPlus/MrMushroom/RequestMaker.cs#L118-L134)) ([complex example](https://github.com/flibber-hk/HollowKnight.RandomizableLevers/blob/c016cfc93dc37c5f4b16dd279c16a2f6fe0d9c66/RandomizableLevers/Rando/RequestModifier.cs#L96-L113)). + - Make added items/locations respect base rando settings ([example](https://github.com/flibber-hk/HollowKnight.RandomizableLevers/blob/c016cfc93dc37c5f4b16dd279c16a2f6fe0d9c66/RandomizableLevers/Rando/RequestModifier.cs#L27-L40)). + At time of writing, the only settings treated specially are WP rando and Deranged. + - Add important items/locations to the condensed spoiler logger ([example](https://github.com/flibber-hk/HollowKnight.RandomizableLevers/blob/c016cfc93dc37c5f4b16dd279c16a2f6fe0d9c66/RandomizableLevers/Rando/RandoInterop.cs#L26-L28)). +This is done with MonoMod.ModInterop - copy over the file from [here](https://github.com/flibber-hk/HollowKnight.RandomizableLevers/blob/main/RandomizableLevers/Rando/CondensedSpoilerLogImport.cs) to safely do this, so as to not take on a runtime dependency on condensed spoiler logger. + - Add an option to define the items/locations in logic without randomizing them, for use with mods such as the [CustomPoolInjector](https://github.com/homothetyhk/CustomPoolInjector) ([example](https://github.com/BadMagic100/TheRealJournalRando/blob/6890f9e6b5ae30777c0043139302b4f2762da9ae/TheRealJournalRando/Rando/RequestModifier.cs#L213-L214)). + - Write changes by checking for randomized items/locations rather than settings to support Custom Pools ([example](https://github.com/flibber-hk/HollowKnight.RandomizableLevers/blob/05436bc87d955acd1e5d4488d1f535628b7392dc/RandomizableLevers/Rando/MiscRandoChanges.cs#L112-L114)). + - Interop with [RandoVanillaTracker](https://github.com/syyePhenomenol/HollowKnight.RandoVanillaTracker) to allow the user to track vanilla placed items ([example](https://github.com/flibber-hk/HollowKnight.RandomizableLevers/blob/c016cfc93dc37c5f4b16dd279c16a2f6fe0d9c66/RandomizableLevers/Rando/RandoInterop.cs#L35)). + +* Change any [existing logic](#editing-existing-logic) that conflicts with your connection. + +* Create a menu page to allow the player to manage settings ([simple example](https://github.com/flibber-hk/HollowKnight.RandomizableLevers/blob/3f509d51de4758a9b21c5effa573762dc126a3a5/RandomizableLevers/Rando/RandoMenuPage.cs#L26)) ([complex example](https://github.com/BadMagic100/TheRealJournalRando/blob/6890f9e6b5ae30777c0043139302b4f2762da9ae/TheRealJournalRando/Rando/ConnectionMenu.cs)). + - For other ways to construct the menu, look at examples from [base rando](https://github.com/homothetyhk/RandomizerMod/blob/master/RandomizerMod/Menu/RandomizerMenu.cs) and the [MenuChanger documentation](https://github.com/homothetyhk/HollowKnight.MenuChanger). + - Colour the menu button according to whether the settings are active ([example](https://github.com/homothetyhk/BenchRando/blob/a5d1d9fa95aed08f1d7500e319369f21350a9ffb/BenchRando/Rando/ConnectionMenu.cs#L42)). + - Interop with [Rando Settings Manager](https://badmagic100.github.io/RandoSettingsManager/) to allow players to share and manage settings more easily ([example](https://github.com/BadMagic100/TheRealJournalRando/blob/6890f9e6b5ae30777c0043139302b4f2762da9ae/TheRealJournalRando/Rando/RandoInterop.cs#L20-L23)). + - Add settings to the settings log ([simple example](https://github.com/flibber-hk/HollowKnight.RandomizableLevers/blob/c016cfc93dc37c5f4b16dd279c16a2f6fe0d9c66/RandomizableLevers/Rando/RandoInterop.cs#L23)) ([complex example](https://github.com/dplochcoder/HollowKnight.MoreDoors/blob/582b56a6093fbaf1ad43022e5a6b4d1c2411fbb6/MoreDoors/Rando/RandoInterop.cs#L27-L28)). + - Explicitly modify the hash if making changes that should be noted but don't affect placements ([example](https://github.com/BadMagic100/MajorItemByAreaTracker/blob/994891502230c91d23cbdc78c6cc567c7a3eb0eb/SemiSpoilerLogger/MajorItemByAreaTracker.cs#L46)). +* Do any other things you need to in order to make your stuff work! + +## Defining Custom Items +Items need to be defined in logic for the randomizer to use, and in ItemChanger to be given in game. This step is **mandatory** if custom items will be used. + +### Defining Items in ItemChanger + +The easiest way to define a custom item in ItemChanger is to use `ItemChanger.Finder.DefineCustomItem` ([Example](https://github.com/flibber-hk/HollowKnight.RandoPlus/blob/main/RandoPlus/MrMushroom/ICInterop.cs)). This works as long as +- You know the names of the items you need in advance. +- The IC implementation of the item is always the same. +- The names of the items in IC are the same as the names of the items as used by the randomizer. + +If these conditions do not all hold, there are two options: +- Subscribe to `ItemChanger.Finder.GetItemOverride` with a delegate which constructs the correct item from its name. +- Edit the `realItemCreator` delegate on the `ItemRequestInfo` defined in the `RequestBuilder` for the item. + +### Defining Items in RandomizerMod + +The easiest way to define a custom item in RandomizerMod is to subscribe to `RCData.RuntimeLogicOverride`, and add the item to the LogicManagerBuilder via `lmb.AddItem`. To provide additional metadata or instance-specific information, edit the `ItemRequestInfo` defined in the `RequestBuilder` for the item. + +## Defining Custom Locations +Locations need to be defined in logic for the randomizer to use, and in ItemChanger to place items in game. This step is **mandatory** if custom locations will be used. + +### Defining Locations in ItemChanger + +The easiest way to define a custom location in ItemChanger is to use `ItemChanger.Finder.DefineCustomLocation` ([Example](https://github.com/flibber-hk/HollowKnight.RandoPlus/blob/main/RandoPlus/MrMushroom/ICInterop.cs)). This works as long as +- You know the names of the locations you need in advance. +- The IC implementation of the location and the placement constructed from the location is always the same. +- The names of the locations in IC are the same as the names of the locations as used by the randomizer. + +If these conditions do not all hold, there are two options: +- Subscribe to `ItemChanger.Finder.GetLocationOverride` with a delegate which constructs the correct location from its name. +- Edit the `customPlacementFetch`, `onPlacementFetch`, or `customAddToPlacement` delegates on the `LocationRequestInfo` defined in the `RequestBuilder` for the location. + +### Defining Locations in RandomizerMod + +The easiest way to define a custom location in RandomizerMod is to subscribe to `RCData.RuntimeLogicOverride`, and add the location to the LogicManagerBuilder via `lmb.AddLogicDef`. To provide additional metadata or instance-specific information, edit the `LocationRequestInfo` defined in the `RequestBuilder` for the item. + +If you have a json file of locations, in the same format as the RM locations.json, you can define all logic defs simultaneously through `lmb.DeserializeJson`. + +## Editing Existing Logic + +There are two easy ways to edit logic. For both, you will need to subscribe to `RandomizerMod.RC.RCData.RuntimeLogicOverride` to access the `LogicManagerBuilder` (`lmb`). +- Call `lmb.DoLogicEdit` to edit logic for locations, transitions, and waypoints. Call `lmb.DoMacroEdit` to edit logic for macros. If you have a json file containing your logic edits, you can provide the file to the `lmb` instead with `lmb.DeserializeJson`. + - For editing existing logic, you can use the `ORIG` token similarly to a macro. When the logic edit is performed, each instance of `ORIG` will be replaced with the previous logic. A very common pattern for logic edits is to take the form `ORIG | NEWOPTION` where `NEWOPTION` is replaced by an expression containing alternate ways to reach the location added by the connection. This form of edits is highly preferred, since it works well for allowing multiple connections to make edits in a compatible way. + - Sometimes, on the other hand, you may need to make logic more restrictive or to change something deeply nested within logic. For this, you can use `lmb.DoLogicSubst` or provide a json file of logic substitutions. A substitution replaces a specified token with an expression. You can substitute in constant tokens (`TRUE` and `FALSE`) to delete terms or branches of logic. diff --git a/articles/intro.md b/articles/intro.md new file mode 100644 index 0000000..300cacf --- /dev/null +++ b/articles/intro.md @@ -0,0 +1 @@ +This is the landing page for RandomizerCore articles and tutorials. \ No newline at end of file diff --git a/articles/logic_variable_ref.md b/articles/logic_variable_ref.md new file mode 100644 index 0000000..1113f68 --- /dev/null +++ b/articles/logic_variable_ref.md @@ -0,0 +1,132 @@ +This article explains the logic variables defined in the randomizer. Variables are organized by type. + +Unless otherwise indicated, all variables in this section have the syntax `PREFIX[P1,P2,...,PN]` where `PREFIX` is a fixed string and `P1` through `PN` are parameters. If there are no parameters, the square brackets can be omitted. + +## LogicInts + +- NotchCostInt, SafeNotchCostInt + - Prefix: `$NotchCost`, `$SafeNotchCost` + - Required Parameters: + - A sequence of comma-separated integers, representing 1-based charm ids. + - Optional Parameters: none + - These LogicInts return the number of notches needed to equip the corresponding combination of charms, minus 1. $NotchCost gives the number allowing for overcharming, while SafeNotchCost gives the number without overcharming. Obsoleted by EquipCharmVariable ($EQUIPCHARM), which has better interoperability. + +## StateProviders + +- StartLocationDelta + - Prefix: `$StartLocation` + - Required Parameters: + - The first parameter should be the exact name of a start def. For example, for the King's Pass start, `NAME` is `King's Pass`. + - Optional Parameters: none + - This is a `LogicInt` which is `TRUE` exactly when the current start def matches its argument, and otherwise is false. It provides the start state (the state of the `Start_State` waypoint) when it is the first state providing term or variable in an expression. + +## StateModifiers + +- BenchResetVariable + - Prefix: `$BENCHRESET` + - Required Parameters: none + - Optional Parameters: none + - This is a `StateResetter` which applies the effect of resting at a bench. + - Field-resetting is opt-out, via a "BenchResetCondition" property on the field which provides single-state infix logic that returns true when the field should be resetted. + +- CastSpellVariable + - Prefix: `$CASTSPELL` + - Required Parameters: none + - Optional Parameters: + - any integer parameters: parses to an array of ints, which represent number of spell casts, where time passes between different entries of the array (i.e. soul reserves can refill, etc). + - If missing, number of casts is new int[]{1} + - a parameter beginning with "before:": tries to convert the tail of the parameter to the NearbySoul enum (either by string or int parsing). Represents soul available before any spells are cast. + - a parameter beginning with "after:": tries to convert the tail of the parameter to the NearbySoul enum (either by string or int parsing). Represents soul available after all spells are cast. + - Represents the effect on soul of casting spells sequentially. + +- EquipCharmVariable, FragileCharmVariable, WhiteFragmentEquipVariable + - Prefix: `$EQUIPPEDCHARM` + - Required Parameters: + - First parameter MUST be either: the name of the charm term (e.g. Gathering_Swarm) or the 1-based charm ID (for Gathering Swarm, 1). + - Optional Parameters: none + - Represents the effect of equipping a charm. Uses `MAXNOTCHCOST` to efficiently overcharm if needed. Cannot overcharm if the player has already taken damage. Fragile charms cannot be equipped if the player does not have the ability to repair them, or if they are broken in the current state. Charm 36 (Kingsoul/Void Heart) checks that the player at least 2 white fragments, and uses notch cost 0 if the player has 3 white fragments. + +- FlowerProviderVariable + - Prefix: `$FLOWERGET` + - Required Parameters: none + - Optional Parameters: none + - Sets `NOFLOWER` false, representing the effect of receiving the delicate flower. Always succeeds. + +- HotSpringResetVariable + - Prefix: `$HOTSPRINGRESET` + - Required Parameters: none + - Optional Parameters: none + - This is a `StateResetter` which applies the effect of resting in a hot springs. + - Field-resetting is opt-in, via a "HotSpringResetCondition" property on the field which provides single-state infix logic that returns true when the field should be resetted. + +- RegainSoulVariable + - Prefix: `$REGAINSOUL` + - Required Parameters: + - The first parameter must be an int representing the amount of soul to be regained. + - Optional Parameters: none + - Represents the effect of regaining a certain amount of soul. Always succeeds. + +- SaveQuitResetVariable + - Prefix: `$SAVEQUITRESET` + - Required Parameters: none + - Optional Parameters: none + - This is a `StateResetter` which provides the effect of warping via Benchwarp or savequit, regardless of destination type. + - Field-resetting is opt-in, via a "SaveQuitResetCondition" property on the field which provides single-state infix logic that returns true when the field should be resetted. + +- ShadeStateVariable + - Prefix: `$SHADESKIP` + - Required Parameters: none + - Optional Parameters: + - an integer followed by "HITS" (e.g. "2HITS"), denoting the number of nail hits the shade must be able to survive. Defaults to 1. + - Represents the effect of dying to set up a shade. If the player has and can dream gate, a second path considers the result of dream gating before and after the shade skip. + - To succeed, requires: + - The `SHADESKIPS` setting enabled + - The `CANNOTSHADESKIP` state bool set to false + - The `USEDSHADE` state bool set to false + - The state must have enough max HP for the shade health requirement + - The state must not require more than 66 max soul + - Sets `NOFLOWER` true and `USEDSHADE` true. Adjusts soul relative to limiter. Fragile Heart can be equipped to reach a max HP requirement, and can be broken if its conditions are met. + +- SpendSoulVariable + - Prefix: `$SPENDSOUL` + - Required Parameters: + - The first parameter must be an int representing the amount of soul to be spent. + - Optional Parameters: none + - Represents the effect of spending a certain amount of soul. Succeeds only if enough soul can be spent. + +- StagStateVariable + - Prefix: `$STAGSTATEMODIFIER` + - Required Parameters: none + - Optional Parameters: none + - Represents the effect of riding a stag. Sets `NOFLOWER` true. Always succeeds. + +- StartRespawnResetVariable + - Prefix: `$STARTRESPAWN` + - Required Parameters: none + - Optional Parameters: none + - This is a `StateResetter` which provides the effect of the start respawn. Typically used via `$WARPTOSTART`. + - Field resetting is opt-in, via a "StartRespawnResetCondition" property on the field which provides single-state infix logic that returns true when the field should be resetted. + +- TakeDamageVariable + - Prefix: `$TAKEDAMAGE` + - Required Parameters: + - If any parameters are provided, the first should be an int representing the amount of damage. Defaults to 1. + - Optional Parameters: none + - This is a state modifier which represents the effect of taking a single hit of specified damage. Assumes that the player has time to heal before taking the hit, and time to regen with Hiveblood after taking the hit. + - On the first time damage is taken, tries to emit a second state with Hiveblood equipped. + - On the first time double damage is taken, tries to emit states with all combinations of Lifeblood Heart and Lifeblood Core equipped. + - When damage that would kill is taken, tries to emit all combinations of Lifeblood Heart, Lifeblood Core, Joni's Blessing, Fragile Heart, and Deep Focus, and attempts to heal with Focus to survive. + +- WarpToBenchResetVariable + - Prefix: `$WARPTOBENCH` + - Required Parameters: none + - Optional Parameters: none + - Provides the effect of warping to a bench via Benchwarp or savequit. Does not verify whether the player can warp to a bench. + - Implemented by applying `$SAVEQUITRESET`, then `$BENCHRESET`. + +- WarpToStartResetVariable + - Prefix: `$WARPTOSTART` + - Required Parameters: none + - Optional Parameters: none + - Provides the effect of warping to start via Benchwarp or savequit. + - Implemented by applying `$SAVEQUITRESET`, then `$STARTRESPAWN`. \ No newline at end of file diff --git a/articles/request_builder.md b/articles/request_builder.md new file mode 100644 index 0000000..30404ce --- /dev/null +++ b/articles/request_builder.md @@ -0,0 +1 @@ +TODO \ No newline at end of file diff --git a/articles/state_field_ref.md b/articles/state_field_ref.md new file mode 100644 index 0000000..d7c3039 --- /dev/null +++ b/articles/state_field_ref.md @@ -0,0 +1,53 @@ +This article explains the state fields defined in the randomizer. Unless otherwise noted, all fields default to `false` or `0`. For detail on more specific properties, see the state.json field in the randomizer resources. + +## Bool Fields +- "USEDSHADE" + - If true, the path to the current point represented by this state requires an intermediate death without any subsequent bench/dream gate. +- "OVERCHARMED" + - If true, the player is overcharmed. +- "SPENTALLSOUL" + - If true, the player should be assumed to have no soul, regardless of other state fields. For example, a savequit to a bench without Salubra's Blessing might set this `true`. +- "CANNOTREGAINSOUL" + - If true, the state should not be allowed to regain soul. +- "CANNOTSHADESKIP" + - If true, the state cannot shade skip. This is available as a separate control from USEDSHADE. +- "HASTAKENDAMAGE" + - If true, the player has taken damage. This means that damage-affecting state choices such as overcharming should now be treated as frozen. +- "HASTAKENDOUBLEDAMAGE" + - If true, the player has taken a hit which dealt 2 or more damage. This means that state choices which affect blue health such as equipping Lifeblood Heart or Lifeblood Core should now be treated as frozen. +- "HASALMOSTDIED" + - Used by $TAKEDAMAGE to track state decisions which are only made if a hit would otherwise kill. +- "BROKEHEART" + - If true, the path to the current point represented by this state requires an intermediate death with Fragile Heart equipped. Breaking fragile charms should only be required in logic if fragile charm repair is accessible. Though fragile charm repair is reachable via benchwarp in standard randomizer, it should not be assumed to be trivially reachable in general, so the fact that charms have been broken should be propagated along paths. +- "BROKEGREED" + - If true, the path to the current point represented by this state requires an intermediate death with Fragile Greed equipped. Breaking fragile charms should only be required in logic if fragile charm repair is accessible. Though fragile charm repair is reachable via benchwarp in standard randomizer, it should not be assumed to be trivially reachable in general, so the fact that charms have been broken should be propagated along paths. +- "BROKESTRENGTH" + - If true, the path to the current point represented by this state requires an intermediate death with Fragile Strength equipped. Breaking fragile charms should only be required in logic if fragile charm repair is accessible. Though fragile charm repair is reachable via benchwarp in standard randomizer, it should not be assumed to be trivially reachable in general, so the fact that charms have been broken should be propagated along paths. +- "NOFLOWER" + - Defaults to `true` + - If `false`, the path to the current point represented by this state has the unbroken Delicate Flower. +- "NOPASSEDCHARMEQUIP" + - Defaults to `true` + - If `false`, the path to the current point contains a place where charms can be equipped. +- "CHARM1", ..., "CHARM40" and "noCHARM1", ..., "noCHARM40" + - These fields correspond to the 40 charms, identified by 1-based id number. + - For example, the charm with id 1 is Gathering Swarm. If "CHARM1" is true, then Gathering Swarm is equipped. If "noCHARM1" is true, then Gathering Swarm is not equipped. Otherwise, "CHARM1" and "noCHARM1" are both false, and the equip state of Gathering Swarm is ambiguous (i.e. a subsequent state modifier can decide to require it to be equipped or unequipped). + +## Int Fields + +- "SPENTSOUL" + - Indicates the amount of soul that has been spent from the soul meter relative to the soul meter's maximum soul. +- "SPENTRESERVESOUL" + - Indicates the aount of soul that has been spent from the soul vessels relative to the soul vessel's combined maximum soul. +- "SOULLIMITER" + - Indicates an offset for the soul meter's maximum soul. For example, after dying, this is set to 33, to indicate that the maximum soul is now 99 - 33 = 66. +- "REQUIREDMAXSOUL" + - Indicates that the soul meter's maximum soul cannot drop below a certain number. For example, if the path contains a triple fireball skip, then this is set to 99, to indicate that the player must be able to cast 3 spells consecutively. Then the path cannot subsequently shade skip, since the preceding fireball skip would no longer be possible. +- "SPENTHP" + - Indicates the number of masks lost, relative to the current total. +- "SPENTBLUEHP" + - Indicates the number of blue masks lost, relative to the number given by charms. +- "USEDNOTCHES" + - Indicates the number of notches currently in use for charms. +- "MAXNOTCHCOST" + - Indicates the largest notch cost among all equipped charms. Used to determine the optimal overcharming configuration. \ No newline at end of file diff --git a/articles/toc.yml b/articles/toc.yml new file mode 100644 index 0000000..11fab64 --- /dev/null +++ b/articles/toc.yml @@ -0,0 +1,10 @@ +- name: Home + href: intro.md +- name: Connection Mod Guide + href: connection_guide.md +- name: Request Builder Guide + href: request_builder.md +- name: State Field Reference + href: state_field_ref.md +- name: Logic Variable Reference + href: logic_variable_ref.md \ No newline at end of file diff --git a/docfx.json b/docfx.json new file mode 100644 index 0000000..3f1c370 --- /dev/null +++ b/docfx.json @@ -0,0 +1,67 @@ +{ + "metadata": [ + { + "src": [ + { + "files": [ + "RandomizerMod/**.csproj" + ], + "src": ".." + } + ], + "dest": "api", + "filter": "filters.yml", + "disableGitFeatures": false, + "disableDefaultFilter": false + } + ], + "build": { + "xrefService": [ "https://xref.docs.microsoft.com/query?uid=%7Buid%7D" ], + "content": [ + { + "files": [ + "api/**.yml", + "api/index.md" + ] + }, + { + "files": [ + "articles/**.md", + "articles/**/toc.yml", + "toc.yml", + "*.md" + ] + } + ], + "resource": [ + { + "files": [ + "images/**" + ] + } + ], + "overwrite": [ + { + "files": [ + "apidoc/**.md" + ], + "exclude": [ + "obj/**", + "_site/**" + ] + } + ], + "dest": "_site", + "globalMetadataFiles": [], + "fileMetadataFiles": [], + "template": [ + "default" + ], + "postProcessors": [], + "markdownEngineName": "markdig", + "noLangKeyword": false, + "keepFileLink": false, + "cleanupCacheHistory": false, + "disableGitFeatures": false + } +} \ No newline at end of file diff --git a/filters.yml b/filters.yml new file mode 100644 index 0000000..9cc104f --- /dev/null +++ b/filters.yml @@ -0,0 +1,4 @@ +apiRules: +- exclude: + uidRegex: ^RandomizerModTests + type: Namespace \ No newline at end of file diff --git a/index.md b/index.md new file mode 100644 index 0000000..53df781 --- /dev/null +++ b/index.md @@ -0,0 +1 @@ +This is the documentation for Randomizer 4, the newest version of the Hollow Knight item and transition randomizer released for the Hollow Knight 1.5 update. \ No newline at end of file diff --git a/toc.yml b/toc.yml new file mode 100644 index 0000000..2cdc82d --- /dev/null +++ b/toc.yml @@ -0,0 +1,4 @@ +- name: Articles + href: articles/ +- name: Api Documentation + href: api/RandomizerMod.yml