diff --git a/.gitignore b/.gitignore index e7c1aeff3..85e368ff1 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,9 @@ *.userosscache *.sln.docstates +# GIMP +FF1R/.comments/ + # The Usual Suspects *.swp .DS_Store @@ -26,6 +29,9 @@ bld/ [Bb]in/ [Oo]bj/ +# Visual Studio Code +.vscode/ + # Visual Studio 2015 cache/options directory .vs/ # Uncomment if you have tasks that create the project's static files in wwwroot @@ -255,785 +261,6 @@ _Pvt_Extensions FF1/Blazorizer/output/* -FF1Blazorizer/output/wwwroot/tooltips/tooltips.json -FF1Blazorizer/output/wwwroot/styles/thinner.css -FF1Blazorizer/output/wwwroot/styles/theme.css -FF1Blazorizer/output/wwwroot/styles/mobile.css -FF1Blazorizer/output/wwwroot/styles/minimize.css -FF1Blazorizer/output/wwwroot/styles/layout.css -FF1Blazorizer/output/wwwroot/service-worker.js -FF1Blazorizer/output/wwwroot/service-worker-assets.js -FF1Blazorizer/output/wwwroot/resource-pack-reference/magic.json -FF1Blazorizer/output/wwwroot/resource-pack-reference/draculas_curse_ffr_resource_pack.zip -FF1Blazorizer/output/wwwroot/resource-pack-reference/dialogue.txt -FF1Blazorizer/output/wwwroot/presets/ST2022.json -FF1Blazorizer/output/wwwroot/presets/Shard_Hunt.json -FF1Blazorizer/output/wwwroot/presets/Procgen_Overworld.json -FF1Blazorizer/output/wwwroot/presets/Over_Randomizer.json -FF1Blazorizer/output/wwwroot/presets/Oops_All_Loose.json -FF1Blazorizer/output/wwwroot/presets/NOverworld.json -FF1Blazorizer/output/wwwroot/presets/Maximum_Troll.json -FF1Blazorizer/output/wwwroot/presets/Lichs_Revenge.json -FF1Blazorizer/output/wwwroot/presets/Improved_Vanilla.json -FF1Blazorizer/output/wwwroot/presets/Hidden_Chaos.json -FF1Blazorizer/output/wwwroot/presets/Free_Enterprise.json -FF1Blazorizer/output/wwwroot/presets/Floaterless.json -FF1Blazorizer/output/wwwroot/presets/Entrance_Floor_Shuffle.json -FF1Blazorizer/output/wwwroot/presets/default.json -FF1Blazorizer/output/wwwroot/presets/Deep_Dungeon.json -FF1Blazorizer/output/wwwroot/presets/coop2022.json -FF1Blazorizer/output/wwwroot/presets/Chaos_Rush.json -FF1Blazorizer/output/wwwroot/presets/Beginner.json -FF1Blazorizer/output/wwwroot/preferences.html -FF1Blazorizer/output/wwwroot/music/sample.txt -FF1Blazorizer/output/wwwroot/manifest.published.json -FF1Blazorizer/output/wwwroot/manifest.json -FF1Blazorizer/output/wwwroot/js/site.js -FF1Blazorizer/output/wwwroot/js/prefframe.js -FF1Blazorizer/output/wwwroot/index.redirect.html -FF1Blazorizer/output/wwwroot/index.html -FF1Blazorizer/output/wwwroot/images/warriors.png -FF1Blazorizer/output/wwwroot/images/WalkToDwarfCave.png -FF1Blazorizer/output/wwwroot/images/VolcanoMarsh.png -FF1Blazorizer/output/wwwroot/images/UnlockedToFR.png -FF1Blazorizer/output/wwwroot/images/truecheck.png -FF1Blazorizer/output/wwwroot/images/true.png -FF1Blazorizer/output/wwwroot/images/TreasureHunt.png -FF1Blazorizer/output/wwwroot/images/TreasureCount.png -FF1Blazorizer/output/wwwroot/images/TrapTiles.png -FF1Blazorizer/output/wwwroot/images/tooltips/zozoMelmondCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/wrapStatOverflowCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/wrapPriceOverflowCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/worldWealthDropDown.gif -FF1Blazorizer/output/wwwroot/images/tooltips/whiteMageHarmEveryoneCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/weaponStatsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/weaponizerNaming.png -FF1Blazorizer/output/wwwroot/images/tooltips/weaponizerCommonPower.png -FF1Blazorizer/output/wwwroot/images/tooltips/weaponizer.png -FF1Blazorizer/output/wwwroot/images/tooltips/WarMECHModeDropDown.png -FF1Blazorizer/output/wwwroot/images/tooltips/waitWhenUnrunnableCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/vampAttackIncludesConeria.png -FF1Blazorizer/output/wwwroot/images/tooltips/vampAttack.png -FF1Blazorizer/output/wwwroot/images/tooltips/unsafeAstosCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/unrunnablesStrikeFirstAndSupriseCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/treasuresCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/trappedShardsCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/trappedChestsCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/transformFinalFormationCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/townsCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/tournamentSafeCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/titansTroveCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/titanSnack.png -FF1Blazorizer/output/wwwroot/images/tooltips/thirdBattlePaletteCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/thiefHitCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/thiefAgilityBuff.png -FF1Blazorizer/output/wwwroot/images/tooltips/teamSteakCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/tcProtectIncentive.png -FF1Blazorizer/output/wwwroot/images/tooltips/TCmarkedChests.png -FF1Blazorizer/output/wwwroot/images/tooltips/tcKeyItems.png -FF1Blazorizer/output/wwwroot/images/tooltips/tcFormations.png -FF1Blazorizer/output/wwwroot/images/tooltips/tcChestsPool.png -FF1Blazorizer/output/wwwroot/images/tooltips/tcBestTreasures.png -FF1Blazorizer/output/wwwroot/images/tooltips/tavernModeReplaceOnlyNone.png -FF1Blazorizer/output/wwwroot/images/tooltips/tavernModeHireOnly.png -FF1Blazorizer/output/wwwroot/images/tooltips/tavernMode.png -FF1Blazorizer/output/wwwroot/images/tooltips/tailbahamut.png -FF1Blazorizer/output/wwwroot/images/tooltips/swolePiratesCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/startingLevelDropDown.gif -FF1Blazorizer/output/wwwroot/images/tooltips/startinginventory.png -FF1Blazorizer/output/wwwroot/images/tooltips/startingGoldCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/startingEquipmentStarterPack.png -FF1Blazorizer/output/wwwroot/images/tooltips/startingEquipmentRemoveFromPool.png -FF1Blazorizer/output/wwwroot/images/tooltips/startingEquipmentRandomTypeWeapon.png -FF1Blazorizer/output/wwwroot/images/tooltips/startingEquipmentRandomCommons.png -FF1Blazorizer/output/wwwroot/images/tooltips/startingEquipmentNoDuplicates.png -FF1Blazorizer/output/wwwroot/images/tooltips/startingEquipmentLegendKit.png -FF1Blazorizer/output/wwwroot/images/tooltips/startingEquipmentHealStaff.png -FF1Blazorizer/output/wwwroot/images/tooltips/startingEquipmentGrandpasSecretStash.png -FF1Blazorizer/output/wwwroot/images/tooltips/startingEquipmentDragonslayer.png -FF1Blazorizer/output/wwwroot/images/tooltips/spoilerBatsEarly.gif -FF1Blazorizer/output/wwwroot/images/tooltips/spoilerBats.png -FF1Blazorizer/output/wwwroot/images/tooltips/spellNameMadness.png -FF1Blazorizer/output/wwwroot/images/tooltips/spellcrafterRetainPermissions.png -FF1Blazorizer/output/wwwroot/images/tooltips/spellcrafterMixSpells.png -FF1Blazorizer/output/wwwroot/images/tooltips/spellBugsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/speedHacksCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/speedboatCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/skyCastle4FMazeModeDropDown.gif -FF1Blazorizer/output/wwwroot/images/tooltips/shufflePravokaShopsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/shuffleObjectiveNPCsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/shufflechests.png -FF1Blazorizer/output/wwwroot/images/tooltips/shuffleBossesScripts.png -FF1Blazorizer/output/wwwroot/images/tooltips/shuffleAstosCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/shortToFRCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/shopsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/shopReductionTable.png -FF1Blazorizer/output/wwwroot/images/tooltips/shopInfoIconsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/ShopInfoFlag.png -FF1Blazorizer/output/wwwroot/images/tooltips/shardHuntCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/shardCountDropDown.png -FF1Blazorizer/output/wwwroot/images/tooltips/separateEnemyHPScalingCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/separateBossHPScalingCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/saveGameWhenGameOverCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/saveGameDWModeCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/ruseItemCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/RPSpoilers.png -FF1Blazorizer/output/wwwroot/images/tooltips/RPIncludeBaseClasses.gif -FF1Blazorizer/output/wwwroot/images/tooltips/rngCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/RiverToMelmond.png -FF1Blazorizer/output/wwwroot/images/tooltips/renounceAutosortCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/removeTrapTilesCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/rememberCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/ReducedLuck.png -FF1Blazorizer/output/wwwroot/images/tooltips/RandomWeaponBonusExcludeMasa.png -FF1Blazorizer/output/wwwroot/images/tooltips/RandomWeaponBonus.png -FF1Blazorizer/output/wwwroot/images/tooltips/randomWaresIncludesCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/randomWaresCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/randomTrapFormationsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/randomLootCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/randomizeFormationEnemizer.png -FF1Blazorizer/output/wwwroot/images/tooltips/randomizeEnemizer.png -FF1Blazorizer/output/wwwroot/images/tooltips/RandomizeClassKeyItemsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/randomizeClassIncludeXpBonuxCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/randomizeClassIncludeNaturalResistCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/RandomizeClassCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/RandomizeClassChaosCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/RandomizeClassCasting.png -FF1Blazorizer/output/wwwroot/images/tooltips/randomizeAccessRequirementsUnsafe.gif -FF1Blazorizer/output/wwwroot/images/tooltips/randomizeAccessRequirementsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/RandomArmorBonus.png -FF1Blazorizer/output/wwwroot/images/tooltips/progressiveScaleModeDropDown.png -FF1Blazorizer/output/wwwroot/images/tooltips/procGenWaterfall.png -FF1Blazorizer/output/wwwroot/images/tooltips/procgenowUnsafeStart.png -FF1Blazorizer/output/wwwroot/images/tooltips/procgenowShuffledAccess.png -FF1Blazorizer/output/wwwroot/images/tooltips/procGenEarth2.png -FF1Blazorizer/output/wwwroot/images/tooltips/procGenEarth1.png -FF1Blazorizer/output/wwwroot/images/tooltips/preserveFiendRefightsCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/preserveAllFiendRefightsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/pregen256.png -FF1Blazorizer/output/wwwroot/images/tooltips/PoolSizeDropDown.gif -FF1Blazorizer/output/wwwroot/images/tooltips/partyMapmanSlot.gif -FF1Blazorizer/output/wwwroot/images/tooltips/paletteSwapCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/pacifistModeCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/owMapExchange.png -FF1Blazorizer/output/wwwroot/images/tooltips/ordealsPillarsCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/orbsRequiredSpoilersCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/orbsRequiredDropDown.png -FF1Blazorizer/output/wwwroot/images/tooltips/OptOutSpeedMessages.gif -FF1Blazorizer/output/wwwroot/images/tooltips/OptOutSpeedHackWipes.gif -FF1Blazorizer/output/wwwroot/images/tooltips/OptOutSpeedHackDash.gif -FF1Blazorizer/output/wwwroot/images/tooltips/onlyShuffleBossSkillsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/onlyShuffleBossScriptsCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/npcSwatterCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/npcItemsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/npcFetchItemsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/NoXcalberCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/NoTailCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/noPartyShuffleCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/nonesGainXPcheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/NoMasamuneCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/noFloater.png -FF1Blazorizer/output/wwwroot/images/tooltips/NoBossScriptSkillShuffle.png -FF1Blazorizer/output/wwwroot/images/tooltips/newConsumables.png -FF1Blazorizer/output/wwwroot/images/tooltips/musicDropDown.png -FF1Blazorizer/output/wwwroot/images/tooltips/moveToFBats.png -FF1Blazorizer/output/wwwroot/images/tooltips/modernBattlefieldCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/mixEntrancesCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/MenuColor.gif -FF1Blazorizer/output/wwwroot/images/tooltips/melmondClinicCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/MDefModeDropDown.gif -FF1Blazorizer/output/wwwroot/images/tooltips/MaximumLevelDoubleSilder.png -FF1Blazorizer/output/wwwroot/images/tooltips/masaGuardianCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/marshAndDesertDealDamageCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/markedTrapTile.png -FF1Blazorizer/output/wwwroot/images/tooltips/mapOpenProgressionFloaterDockCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/mapOpenProgressionDwavesNWCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/mapOpenProgressionDocksCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/mapOpenProgressionCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/MapHighwayToOrdeals.gif -FF1Blazorizer/output/wwwroot/images/tooltips/magisizeWeaponsBalancedCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/magisizeWeapons.png -FF1Blazorizer/output/wwwroot/images/tooltips/magicShopsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/magicShopLocsCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/magicShopLocationPairsCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/magicPermissionsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/magicLevelsTieredCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/magicLevelsMixed.png -FF1Blazorizer/output/wwwroot/images/tooltips/magicLevelsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/magicAutohitThresholdDropDown.gif -FF1Blazorizer/output/wwwroot/images/tooltips/loosePlacementMode.png -FF1Blazorizer/output/wwwroot/images/tooltips/looseNpcBalanceCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/LooseExcludePlacedDungeons.png -FF1Blazorizer/output/wwwroot/images/tooltips/lockRespondRateCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/Lockpicking.png -FF1Blazorizer/output/wwwroot/images/tooltips/LockMode.png -FF1Blazorizer/output/wwwroot/images/tooltips/LichRevenge.png -FF1Blazorizer/output/wwwroot/images/tooltips/legendaryShopsGroup.gif -FF1Blazorizer/output/wwwroot/images/tooltips/lefeinSuperStore.gif -FF1Blazorizer/output/wwwroot/images/tooltips/lefeinShopsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/lefeinRiverDock.png -FF1Blazorizer/output/wwwroot/images/tooltips/kiPlacementMode.png -FF1Blazorizer/output/wwwroot/images/tooltips/itemMagicPoolDropDown.png -FF1Blazorizer/output/wwwroot/images/tooltips/itemMagicModeDropDown.png -FF1Blazorizer/output/wwwroot/images/tooltips/itemMagicCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/inventoryAutosortCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/increaseWepBonusesCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/increaseDarkPenaltyCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/includeMoraleCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/includeConeriaCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeXcalCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeVolcanoCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeTitansCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeSkyPalaceCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeShipAndCanalCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeSeaShrineCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeRibbonCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeRandomChestInLocationCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeOtherCastArmorCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeOrdealsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeMarshKeyLockedCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeMarshCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeMainItemsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeIceCaveCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeFreeNPCsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeFetchNPCsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeFetchItemsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeEarthCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentivizeConeriaCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/incentiveChestItemsFanfareCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/improveTurnOrderRandomizationCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/improved-clinic.png -FF1Blazorizer/output/wwwroot/images/tooltips/importResourcePack.png -FF1Blazorizer/output/wwwroot/images/tooltips/identifyTreasuresCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/hurrayDwarfFate.png -FF1Blazorizer/output/wwwroot/images/tooltips/housesFillHpCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/houseMPRestorationCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/hintsVillage.gif -FF1Blazorizer/output/wwwroot/images/tooltips/hintsUselessCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/hintsDungeon.gif -FF1Blazorizer/output/wwwroot/images/tooltips/hiddenChaos.png -FF1Blazorizer/output/wwwroot/images/tooltips/hallOfDragons.png -FF1Blazorizer/output/wwwroot/images/tooltips/guaranteedMasamuneCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/generateNewSpellbook.png -FF1Blazorizer/output/wwwroot/images/tooltips/gaiaShortcutMoveItemShop.png -FF1Blazorizer/output/wwwroot/images/tooltips/gaiaShortcut.png -FF1Blazorizer/output/wwwroot/images/tooltips/gaiaMountainPass.png -FF1Blazorizer/output/wwwroot/images/tooltips/funEnemyNamesCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/FreeTail.png -FF1Blazorizer/output/wwwroot/images/tooltips/freeShipCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/freeCanoeCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/freeCanalCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/freeBridgeCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/freeAirshipCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/formationShuffleModeDropDown.gif -FF1Blazorizer/output/wwwroot/images/tooltips/floorsCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/flipDungeons.png -FF1Blazorizer/output/wwwroot/images/tooltips/fixMissingBattleRngEntry.gif -FF1Blazorizer/output/wwwroot/images/tooltips/fixHitChanceCapCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/fightBahamutCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/fiendShuffleCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/extStartingItemSet.png -FF1Blazorizer/output/wwwroot/images/tooltips/extConsumableTreasureStackSize.png -FF1Blazorizer/output/wwwroot/images/tooltips/extConsumableChests.png -FF1Blazorizer/output/wwwroot/images/tooltips/expChestReward.gif -FF1Blazorizer/output/wwwroot/images/tooltips/expChestConversion.png -FF1Blazorizer/output/wwwroot/images/tooltips/exitToFR.gif -FF1Blazorizer/output/wwwroot/images/tooltips/excludeGoldFromScalingCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/everythingHasDeathTouchExcludeFiendsCheckbox.png -FF1Blazorizer/output/wwwroot/images/tooltips/everythingHasDeathTouchCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/evadeCapDropDown.png -FF1Blazorizer/output/wwwroot/images/tooltips/etherizerCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/entrancesCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/enemyTrapTilesCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/enemyStatusAttacksCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/enemyStatusAttackBugCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/enemySkillsSpellsTieredCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/enemySkillsSpellsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/enemyScriptsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/enemyRandomAttacksCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/enemyObfuscation.png -FF1Blazorizer/output/wwwroot/images/tooltips/enemyFormationsUnrunnableCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/enemyFormationsSurpriseCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/enableSoftInBattleCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/EnableRandomPromotions.gif -FF1Blazorizer/output/wwwroot/images/tooltips/EnablePoolParty.gif -FF1Blazorizer/output/wwwroot/images/tooltips/enableLifeInBattleCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/enableCritNumberDisplayCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/earlySardaCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/earlySageCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/earlyOrdealsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/earlyKingCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/earlierRubyCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/EarlierHighTierMagic.png -FF1Blazorizer/output/wwwroot/images/tooltips/dragonsHoard.png -FF1Blazorizer/output/wwwroot/images/tooltips/downloadSpoilersCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/doubleWeaponCritCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/doubleBBCritCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/disableTentSaving.gif -FF1Blazorizer/output/wwwroot/images/tooltips/disableStunTouchCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/disableSpellCastFlashCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/disableMinimapCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/disableInnSaving.png -FF1Blazorizer/output/wwwroot/images/tooltips/disableDamageTileFlickerCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/deepTownsCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/deepDungeonFiendOrbsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/deepdungeon.png -FF1Blazorizer/output/wwwroot/images/tooltips/deadsGainXPcheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/deadEndsCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/ddDistributeEvenly.gif -FF1Blazorizer/output/wwwroot/images/tooltips/dashCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/damageTilesKillCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/customHeroSprites.png -FF1Blazorizer/output/wwwroot/images/tooltips/cureHealBuffCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/cropScreen.png -FF1Blazorizer/output/wwwroot/images/tooltips/consumableTreasureStackSizeDropDown.png -FF1Blazorizer/output/wwwroot/images/tooltips/consumableChestSetDropDown.png -FF1Blazorizer/output/wwwroot/images/tooltips/confusedOldMenCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/cleanBlursedEquipmentNames.png -FF1Blazorizer/output/wwwroot/images/tooltips/classXPBonus.png -FF1Blazorizer/output/wwwroot/images/tooltips/classAsNpcPromoCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/classAsNpcKeyNpcCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/classAsNpcForcedFiendsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/classAsNpcFiendsCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/classAsNpcDuplicateCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/clampMinimumPriceScaleLable.png -FF1Blazorizer/output/wwwroot/images/tooltips/chestInfoCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/cheapVendorItemCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/chaosRushCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/chaosRushCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/chaosFloorEncounters.gif -FF1Blazorizer/output/wwwroot/images/tooltips/ChangeMaxMP.png -FF1Blazorizer/output/wwwroot/images/tooltips/changeLuteCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/chanceToRunDropDown.png -FF1Blazorizer/output/wwwroot/images/tooltips/cardiaIncentive.png -FF1Blazorizer/output/wwwroot/images/tooltips/buyTenOldCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/buyTenCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/buffedBahamutCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/buffedAstosCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/bridgeToLefein.png -FF1Blazorizer/output/wwwroot/images/tooltips/blindseed.png -FF1Blazorizer/output/wwwroot/images/tooltips/blackBeltAbsorbCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/betterTrapTreasureCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/battleMagicMenuWrapAroundCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/balancedItemMagicCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/bahamutCardiaDock.png -FF1Blazorizer/output/wwwroot/images/tooltips/armorCrafter.png -FF1Blazorizer/output/wwwroot/images/tooltips/archipelagoShards.png -FF1Blazorizer/output/wwwroot/images/tooltips/archipelagoGP.png -FF1Blazorizer/output/wwwroot/images/tooltips/archipelagoEquipment.png -FF1Blazorizer/output/wwwroot/images/tooltips/archipelagoEnable.png -FF1Blazorizer/output/wwwroot/images/tooltips/archipelagoConsumables.png -FF1Blazorizer/output/wwwroot/images/tooltips/applyExpBoostToGoldCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/AlternateFiends.png -FF1Blazorizer/output/wwwroot/images/tooltips/AllSpellLevelsForKnightNinja.png -FF1Blazorizer/output/wwwroot/images/tooltips/allowUnsafeStartAreaCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/allowUnsafePiratesCheckBox.png -FF1Blazorizer/output/wwwroot/images/tooltips/allowDeepCastlesCheckBox.gif -FF1Blazorizer/output/wwwroot/images/tooltips/accessibleSpellNamesCheckBox.png -FF1Blazorizer/output/wwwroot/images/ToFRTraps.png -FF1Blazorizer/output/wwwroot/images/ToFRShort.png -FF1Blazorizer/output/wwwroot/images/ToFRBlackOrb.png -FF1Blazorizer/output/wwwroot/images/TitansTrove.png -FF1Blazorizer/output/wwwroot/images/splash_image.png -FF1Blazorizer/output/wwwroot/images/site-border-toptabs.png -FF1Blazorizer/output/wwwroot/images/site-border-tabs.png -FF1Blazorizer/output/wwwroot/images/site-border-smal.png -FF1Blazorizer/output/wwwroot/images/site-border-large.png -FF1Blazorizer/output/wwwroot/images/site-border-large-fade.png -FF1Blazorizer/output/wwwroot/images/SardaElfland.png -FF1Blazorizer/output/wwwroot/images/resource-pack-reference/weapons.png -FF1Blazorizer/output/wwwroot/images/resource-pack-reference/towntiles.png -FF1Blazorizer/output/wwwroot/images/resource-pack-reference/maptiles.png -FF1Blazorizer/output/wwwroot/images/resource-pack-reference/gear_icons.png -FF1Blazorizer/output/wwwroot/images/resource-pack-reference/fiends.png -FF1Blazorizer/output/wwwroot/images/resource-pack-reference/chaos.png -FF1Blazorizer/output/wwwroot/images/random.gif -FF1Blazorizer/output/wwwroot/images/ProcGen-Waterfall.png -FF1Blazorizer/output/wwwroot/images/ProcGen-Earth.png -FF1Blazorizer/output/wwwroot/images/Palettes2.png -FF1Blazorizer/output/wwwroot/images/Palettes.png -FF1Blazorizer/output/wwwroot/images/orbUR.png -FF1Blazorizer/output/wwwroot/images/orbUL.png -FF1Blazorizer/output/wwwroot/images/orbs-easter-egg.png -FF1Blazorizer/output/wwwroot/images/orbLR.png -FF1Blazorizer/output/wwwroot/images/orbLL.png -FF1Blazorizer/output/wwwroot/images/orb.png -FF1Blazorizer/output/wwwroot/images/orb-back.png -FF1Blazorizer/output/wwwroot/images/OpenProgressionRiver.png -FF1Blazorizer/output/wwwroot/images/OpenProgressionAirship.png -FF1Blazorizer/output/wwwroot/images/OnracDock.png -FF1Blazorizer/output/wwwroot/images/NoneSelection.png -FF1Blazorizer/output/wwwroot/images/None.png -FF1Blazorizer/output/wwwroot/images/MirageDock.png -FF1Blazorizer/output/wwwroot/images/MelmondSageGreen.png -FF1Blazorizer/output/wwwroot/images/MelmondPurple.png -FF1Blazorizer/output/wwwroot/images/MelmondPaleGreen.png -FF1Blazorizer/output/wwwroot/images/MelmondBrown.png -FF1Blazorizer/output/wwwroot/images/icons/weapon_icons.png -FF1Blazorizer/output/wwwroot/images/icons/warmech-red.ico -FF1Blazorizer/output/wwwroot/images/icons/warmech-red-512.png -FF1Blazorizer/output/wwwroot/images/icons/warmech-red-256.png -FF1Blazorizer/output/wwwroot/images/icons/warmech-red-192.png -FF1Blazorizer/output/wwwroot/images/icons/warmech-normal.ico -FF1Blazorizer/output/wwwroot/images/icons/warmech-normal-512.png -FF1Blazorizer/output/wwwroot/images/icons/warmech-normal-256.png -FF1Blazorizer/output/wwwroot/images/icons/warmech-normal-192.png -FF1Blazorizer/output/wwwroot/images/icons/warmech-cyan.ico -FF1Blazorizer/output/wwwroot/images/icons/warmech-cyan-512.png -FF1Blazorizer/output/wwwroot/images/icons/warmech-cyan-256.png -FF1Blazorizer/output/wwwroot/images/icons/warmech-cyan-192.png -FF1Blazorizer/output/wwwroot/images/icons/spell_icons.png -FF1Blazorizer/output/wwwroot/images/IceVolcanoRiver.png -FF1Blazorizer/output/wwwroot/images/IceCaveCL.png -FF1Blazorizer/output/wwwroot/images/help.png -FF1Blazorizer/output/wwwroot/images/guides/marsh_map.png -FF1Blazorizer/output/wwwroot/images/guides/magic_shop_guide.png -FF1Blazorizer/output/wwwroot/images/guides/coneria_safe_tiles.png -FF1Blazorizer/output/wwwroot/images/garland.png -FF1Blazorizer/output/wwwroot/images/footer-bg.png -FF1Blazorizer/output/wwwroot/images/ffr-logo.png -FF1Blazorizer/output/wwwroot/images/favicon.ico -FF1Blazorizer/output/wwwroot/images/false.png -FF1Blazorizer/output/wwwroot/images/evileye.png -FF1Blazorizer/output/wwwroot/images/discord.png -FF1Blazorizer/output/wwwroot/images/classes/whitewizard.png -FF1Blazorizer/output/wwwroot/images/classes/whitemage.png -FF1Blazorizer/output/wwwroot/images/classes/thief.png -FF1Blazorizer/output/wwwroot/images/classes/redwizard.png -FF1Blazorizer/output/wwwroot/images/classes/redmage.png -FF1Blazorizer/output/wwwroot/images/classes/ninja.png -FF1Blazorizer/output/wwwroot/images/classes/master.png -FF1Blazorizer/output/wwwroot/images/classes/knight.png -FF1Blazorizer/output/wwwroot/images/classes/fighter.png -FF1Blazorizer/output/wwwroot/images/classes/classes.png -FF1Blazorizer/output/wwwroot/images/classes/blackwizard.png -FF1Blazorizer/output/wwwroot/images/classes/blackmage.png -FF1Blazorizer/output/wwwroot/images/classes/blackbelt.png -FF1Blazorizer/output/wwwroot/images/chip.png -FF1Blazorizer/output/wwwroot/images/chaos.png -FF1Blazorizer/output/wwwroot/images/CardiaEarth.png -FF1Blazorizer/output/wwwroot/images/bg.png -FF1Blazorizer/output/wwwroot/images/bg.jpg -FF1Blazorizer/output/wwwroot/images/bahamut_cardia_dock.png -FF1Blazorizer/output/wwwroot/images/arrow.png -FF1Blazorizer/output/wwwroot/fonts/liberation_mono.ttf -FF1Blazorizer/output/wwwroot/fonts/chicago.ttf -FF1Blazorizer/output/wwwroot/favicon.ico -FF1Blazorizer/output/wwwroot/css_back/slider.css -FF1Blazorizer/output/wwwroot/css_back/site.css -FF1Blazorizer/output/wwwroot/css_back/open-iconic/README.md -FF1Blazorizer/output/wwwroot/css_back/open-iconic/ICON-LICENSE -FF1Blazorizer/output/wwwroot/css_back/open-iconic/font/fonts/open-iconic.woff -FF1Blazorizer/output/wwwroot/css_back/open-iconic/font/fonts/open-iconic.ttf -FF1Blazorizer/output/wwwroot/css_back/open-iconic/font/fonts/open-iconic.svg -FF1Blazorizer/output/wwwroot/css_back/open-iconic/font/fonts/open-iconic.otf -FF1Blazorizer/output/wwwroot/css_back/open-iconic/font/fonts/open-iconic.eot -FF1Blazorizer/output/wwwroot/css_back/open-iconic/font/css/open-iconic-bootstrap.min.css -FF1Blazorizer/output/wwwroot/css_back/open-iconic/FONT-LICENSE -FF1Blazorizer/output/wwwroot/css_back/nes.min.css -FF1Blazorizer/output/wwwroot/css_back/mainmenu.css -FF1Blazorizer/output/wwwroot/css_back/main.css -FF1Blazorizer/output/wwwroot/css_back/bootstrap/bootstrap.min.css -FF1Blazorizer/output/wwwroot/css_back/beta.css -FF1Blazorizer/output/wwwroot/css_back/alpha.css -FF1Blazorizer/output/wwwroot/css/slider.css -FF1Blazorizer/output/wwwroot/css/site.css -FF1Blazorizer/output/wwwroot/css/mainmenu.css -FF1Blazorizer/output/wwwroot/css/bootstrap/bootstrap.min.css -FF1Blazorizer/output/wwwroot/_redirects -FF1Blazorizer/output/wwwroot/_headers -FF1Blazorizer/output/wwwroot/_framework/System.Xml.XDocument.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Xml.XDocument.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Xml.XDocument.dll -FF1Blazorizer/output/wwwroot/_framework/System.Threading.Timer.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Threading.Timer.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Threading.Timer.dll -FF1Blazorizer/output/wwwroot/_framework/System.Threading.ThreadPool.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Threading.ThreadPool.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Threading.ThreadPool.dll -FF1Blazorizer/output/wwwroot/_framework/System.Threading.Tasks.Parallel.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Threading.Tasks.Parallel.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Threading.Tasks.Parallel.dll -FF1Blazorizer/output/wwwroot/_framework/System.Threading.Tasks.Extensions.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Threading.Tasks.Extensions.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Threading.Tasks.Extensions.dll -FF1Blazorizer/output/wwwroot/_framework/System.Threading.Tasks.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Threading.Tasks.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Threading.Tasks.dll -FF1Blazorizer/output/wwwroot/_framework/System.Threading.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Threading.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Threading.dll -FF1Blazorizer/output/wwwroot/_framework/System.Text.RegularExpressions.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Text.RegularExpressions.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Text.RegularExpressions.dll -FF1Blazorizer/output/wwwroot/_framework/System.Text.Json.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Text.Json.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Text.Json.dll -FF1Blazorizer/output/wwwroot/_framework/System.Text.Encodings.Web.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Text.Encodings.Web.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Text.Encodings.Web.dll -FF1Blazorizer/output/wwwroot/_framework/System.Text.Encoding.CodePages.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Text.Encoding.CodePages.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Text.Encoding.CodePages.dll -FF1Blazorizer/output/wwwroot/_framework/System.Security.Cryptography.Primitives.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Security.Cryptography.Primitives.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Security.Cryptography.Primitives.dll -FF1Blazorizer/output/wwwroot/_framework/System.Security.Cryptography.Algorithms.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Security.Cryptography.Algorithms.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Security.Cryptography.Algorithms.dll -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.Serialization.Primitives.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.Serialization.Primitives.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.Serialization.Primitives.dll -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.Serialization.Formatters.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.Serialization.Formatters.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.Serialization.Formatters.dll -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.Numerics.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.Numerics.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.Numerics.dll -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.Intrinsics.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.Intrinsics.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.Intrinsics.dll -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.InteropServices.RuntimeInformation.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.InteropServices.RuntimeInformation.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.InteropServices.RuntimeInformation.dll -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.InteropServices.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.InteropServices.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.InteropServices.dll -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.Extensions.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.Extensions.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.Extensions.dll -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.dll -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.CompilerServices.Unsafe.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.CompilerServices.Unsafe.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Runtime.CompilerServices.Unsafe.dll -FF1Blazorizer/output/wwwroot/_framework/System.Resources.ResourceManager.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Resources.ResourceManager.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Resources.ResourceManager.dll -FF1Blazorizer/output/wwwroot/_framework/System.Private.Xml.Linq.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Private.Xml.Linq.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Private.Xml.Linq.dll -FF1Blazorizer/output/wwwroot/_framework/System.Private.Xml.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Private.Xml.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Private.Xml.dll -FF1Blazorizer/output/wwwroot/_framework/System.Private.Uri.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Private.Uri.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Private.Uri.dll -FF1Blazorizer/output/wwwroot/_framework/System.Private.Runtime.InteropServices.JavaScript.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Private.Runtime.InteropServices.JavaScript.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Private.Runtime.InteropServices.JavaScript.dll -FF1Blazorizer/output/wwwroot/_framework/System.Private.CoreLib.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Private.CoreLib.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Private.CoreLib.dll -FF1Blazorizer/output/wwwroot/_framework/System.ObjectModel.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.ObjectModel.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.ObjectModel.dll -FF1Blazorizer/output/wwwroot/_framework/System.Numerics.Vectors.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Numerics.Vectors.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Numerics.Vectors.dll -FF1Blazorizer/output/wwwroot/_framework/System.Net.Primitives.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Net.Primitives.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Net.Primitives.dll -FF1Blazorizer/output/wwwroot/_framework/System.Net.Http.Json.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Net.Http.Json.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Net.Http.Json.dll -FF1Blazorizer/output/wwwroot/_framework/System.Net.Http.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Net.Http.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Net.Http.dll -FF1Blazorizer/output/wwwroot/_framework/System.Memory.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Memory.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Memory.dll -FF1Blazorizer/output/wwwroot/_framework/System.Linq.Expressions.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Linq.Expressions.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Linq.Expressions.dll -FF1Blazorizer/output/wwwroot/_framework/System.Linq.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Linq.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Linq.dll -FF1Blazorizer/output/wwwroot/_framework/System.IO.FileSystem.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.IO.FileSystem.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.IO.FileSystem.dll -FF1Blazorizer/output/wwwroot/_framework/System.IO.Compression.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.IO.Compression.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.IO.Compression.dll -FF1Blazorizer/output/wwwroot/_framework/System.Drawing.Primitives.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Drawing.Primitives.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Drawing.Primitives.dll -FF1Blazorizer/output/wwwroot/_framework/System.Drawing.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Drawing.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Drawing.dll -FF1Blazorizer/output/wwwroot/_framework/System.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.dll -FF1Blazorizer/output/wwwroot/_framework/System.Diagnostics.TraceSource.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Diagnostics.TraceSource.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Diagnostics.TraceSource.dll -FF1Blazorizer/output/wwwroot/_framework/System.Diagnostics.Tools.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Diagnostics.Tools.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Diagnostics.Tools.dll -FF1Blazorizer/output/wwwroot/_framework/System.Diagnostics.Debug.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Diagnostics.Debug.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Diagnostics.Debug.dll -FF1Blazorizer/output/wwwroot/_framework/System.Data.Common.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Data.Common.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Data.Common.dll -FF1Blazorizer/output/wwwroot/_framework/System.Console.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Console.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Console.dll -FF1Blazorizer/output/wwwroot/_framework/System.ComponentModel.TypeConverter.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.ComponentModel.TypeConverter.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.ComponentModel.TypeConverter.dll -FF1Blazorizer/output/wwwroot/_framework/System.ComponentModel.Primitives.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.ComponentModel.Primitives.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.ComponentModel.Primitives.dll -FF1Blazorizer/output/wwwroot/_framework/System.ComponentModel.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.ComponentModel.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.ComponentModel.dll -FF1Blazorizer/output/wwwroot/_framework/System.ComponentModel.Annotations.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.ComponentModel.Annotations.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.ComponentModel.Annotations.dll -FF1Blazorizer/output/wwwroot/_framework/System.Collections.Specialized.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Collections.Specialized.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Collections.Specialized.dll -FF1Blazorizer/output/wwwroot/_framework/System.Collections.NonGeneric.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Collections.NonGeneric.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Collections.NonGeneric.dll -FF1Blazorizer/output/wwwroot/_framework/System.Collections.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Collections.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Collections.dll -FF1Blazorizer/output/wwwroot/_framework/System.Collections.Concurrent.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Collections.Concurrent.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Collections.Concurrent.dll -FF1Blazorizer/output/wwwroot/_framework/System.Buffers.dll.gz -FF1Blazorizer/output/wwwroot/_framework/System.Buffers.dll.br -FF1Blazorizer/output/wwwroot/_framework/System.Buffers.dll -FF1Blazorizer/output/wwwroot/_framework/SixLabors.ImageSharp.dll.gz -FF1Blazorizer/output/wwwroot/_framework/SixLabors.ImageSharp.dll.br -FF1Blazorizer/output/wwwroot/_framework/SixLabors.ImageSharp.dll -FF1Blazorizer/output/wwwroot/_framework/RomUtilities.dll.gz -FF1Blazorizer/output/wwwroot/_framework/RomUtilities.dll.br -FF1Blazorizer/output/wwwroot/_framework/RomUtilities.dll -FF1Blazorizer/output/wwwroot/_framework/Patcher6502.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Patcher6502.dll.br -FF1Blazorizer/output/wwwroot/_framework/Patcher6502.dll -FF1Blazorizer/output/wwwroot/_framework/Newtonsoft.Json.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Newtonsoft.Json.dll.br -FF1Blazorizer/output/wwwroot/_framework/Newtonsoft.Json.dll -FF1Blazorizer/output/wwwroot/_framework/netstandard.dll.gz -FF1Blazorizer/output/wwwroot/_framework/netstandard.dll.br -FF1Blazorizer/output/wwwroot/_framework/netstandard.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Net.Http.Headers.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Net.Http.Headers.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Net.Http.Headers.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.JSInterop.WebAssembly.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.JSInterop.WebAssembly.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.JSInterop.WebAssembly.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.JSInterop.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.JSInterop.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.JSInterop.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Primitives.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Primitives.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Primitives.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Options.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Options.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Options.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Logging.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Logging.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Logging.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Logging.Abstractions.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Logging.Abstractions.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Logging.Abstractions.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.DependencyInjection.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.DependencyInjection.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.DependencyInjection.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.DependencyInjection.Abstractions.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.DependencyInjection.Abstractions.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.DependencyInjection.Abstractions.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Configuration.Json.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Configuration.Json.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Configuration.Json.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Configuration.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Configuration.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Configuration.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Configuration.Abstractions.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Configuration.Abstractions.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.Extensions.Configuration.Abstractions.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.CSharp.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.CSharp.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.CSharp.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.AspNetCore.WebUtilities.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.AspNetCore.WebUtilities.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.AspNetCore.WebUtilities.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.AspNetCore.Components.WebAssembly.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.AspNetCore.Components.WebAssembly.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.AspNetCore.Components.WebAssembly.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.AspNetCore.Components.Web.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.AspNetCore.Components.Web.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.AspNetCore.Components.Web.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.AspNetCore.Components.Forms.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.AspNetCore.Components.Forms.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.AspNetCore.Components.Forms.dll -FF1Blazorizer/output/wwwroot/_framework/Microsoft.AspNetCore.Components.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Microsoft.AspNetCore.Components.dll.br -FF1Blazorizer/output/wwwroot/_framework/Microsoft.AspNetCore.Components.dll -FF1Blazorizer/output/wwwroot/_framework/icudt_no_CJK.dat.gz -FF1Blazorizer/output/wwwroot/_framework/icudt_no_CJK.dat.br -FF1Blazorizer/output/wwwroot/_framework/icudt_no_CJK.dat -FF1Blazorizer/output/wwwroot/_framework/icudt_EFIGS.dat.gz -FF1Blazorizer/output/wwwroot/_framework/icudt_EFIGS.dat.br -FF1Blazorizer/output/wwwroot/_framework/icudt_EFIGS.dat -FF1Blazorizer/output/wwwroot/_framework/icudt_CJK.dat.gz -FF1Blazorizer/output/wwwroot/_framework/icudt_CJK.dat.br -FF1Blazorizer/output/wwwroot/_framework/icudt_CJK.dat -FF1Blazorizer/output/wwwroot/_framework/icudt.dat.gz -FF1Blazorizer/output/wwwroot/_framework/icudt.dat.br -FF1Blazorizer/output/wwwroot/_framework/icudt.dat -FF1Blazorizer/output/wwwroot/_framework/FF1Lib.pdb.gz -FF1Blazorizer/output/wwwroot/_framework/FF1Lib.dll.gz -FF1Blazorizer/output/wwwroot/_framework/FF1Lib.dll.br -FF1Blazorizer/output/wwwroot/_framework/FF1Lib.dll -FF1Blazorizer/output/wwwroot/_framework/FF1Blazorizer.pdb.gz -FF1Blazorizer/output/wwwroot/_framework/FF1Blazorizer.dll.gz -FF1Blazorizer/output/wwwroot/_framework/FF1Blazorizer.dll.br -FF1Blazorizer/output/wwwroot/_framework/FF1Blazorizer.dll -FF1Blazorizer/output/wwwroot/_framework/DotNetAsm.dll.gz -FF1Blazorizer/output/wwwroot/_framework/DotNetAsm.dll.br -FF1Blazorizer/output/wwwroot/_framework/DotNetAsm.dll -FF1Blazorizer/output/wwwroot/_framework/dotnet.wasm.gz -FF1Blazorizer/output/wwwroot/_framework/dotnet.wasm.br -FF1Blazorizer/output/wwwroot/_framework/dotnet.wasm -FF1Blazorizer/output/wwwroot/_framework/dotnet.timezones.blat.gz -FF1Blazorizer/output/wwwroot/_framework/dotnet.timezones.blat.br -FF1Blazorizer/output/wwwroot/_framework/dotnet.timezones.blat -FF1Blazorizer/output/wwwroot/_framework/dotnet.6.0.6.716s51rtf8.js.gz -FF1Blazorizer/output/wwwroot/_framework/dotnet.6.0.6.716s51rtf8.js.br -FF1Blazorizer/output/wwwroot/_framework/dotnet.6.0.6.716s51rtf8.js -FF1Blazorizer/output/wwwroot/_framework/BlazorStrap.dll.gz -FF1Blazorizer/output/wwwroot/_framework/BlazorStrap.dll.br -FF1Blazorizer/output/wwwroot/_framework/BlazorStrap.dll -FF1Blazorizer/output/wwwroot/_framework/Blazored.LocalStorage.dll.gz -FF1Blazorizer/output/wwwroot/_framework/Blazored.LocalStorage.dll.br -FF1Blazorizer/output/wwwroot/_framework/Blazored.LocalStorage.dll -FF1Blazorizer/output/wwwroot/_framework/BlazorComponentUtilities.dll.gz -FF1Blazorizer/output/wwwroot/_framework/BlazorComponentUtilities.dll.br -FF1Blazorizer/output/wwwroot/_framework/BlazorComponentUtilities.dll -FF1Blazorizer/output/wwwroot/_framework/blazor.webassembly.js.gz -FF1Blazorizer/output/wwwroot/_framework/blazor.webassembly.js.br -FF1Blazorizer/output/wwwroot/_framework/blazor.webassembly.js -FF1Blazorizer/output/wwwroot/_framework/blazor.boot.json.gz -FF1Blazorizer/output/wwwroot/_framework/blazor.boot.json.br -FF1Blazorizer/output/wwwroot/_framework/blazor.boot.json -FF1Blazorizer/output/wwwroot/_content/BlazorStrap/site.webmanifest -FF1Blazorizer/output/wwwroot/_content/BlazorStrap/popper.min.js.map -FF1Blazorizer/output/wwwroot/_content/BlazorStrap/popper.min.js -FF1Blazorizer/output/wwwroot/_content/BlazorStrap/css/submenu.css -FF1Blazorizer/output/wwwroot/_content/BlazorStrap/css/cromefix.css -FF1Blazorizer/output/wwwroot/_content/BlazorStrap/blazorStrap.js -FF1Blazorizer/output/web.config -FF1Blazorizer/output/presets/improved-vanilla.json -FF1Blazorizer/output/presets/full-npc.json -FF1Blazorizer/output/presets/default.json -FF1Blazorizer/output/presets/debug.json -FF1Blazorizer/output/presets/beginner.json +FF1Blazorizer/output/ + FF1Lib/FF1Lib.sln -FF1Blazorizer/output/wwwroot/images/tooltips/transmooglifier.gif diff --git a/FF1Blazorizer/FF1Blazorizer.csproj b/FF1Blazorizer/FF1Blazorizer.csproj index 0fb2dfc9f..07dd92962 100644 --- a/FF1Blazorizer/FF1Blazorizer.csproj +++ b/FF1Blazorizer/FF1Blazorizer.csproj @@ -13,6 +13,7 @@ true + diff --git a/FF1Blazorizer/Pages/WhatsNew.razor b/FF1Blazorizer/Pages/WhatsNew.razor index 49b0817cf..66fe9a197 100644 --- a/FF1Blazorizer/Pages/WhatsNew.razor +++ b/FF1Blazorizer/Pages/WhatsNew.razor @@ -1,96 +1,136 @@ -@page "/WhatsNew" -
+@page "/WhatsNew" +
-

Version 4.8.6

-

Updates

-
    -
  • Winter Tournament 2025 Presets.
  • -
  • Print Classes Blursings in generation window.
  • -
  • Show Archipelago player name box on the side window.
  • -
-

Bugfixes

-
    -
  • Fix mapgen seed not updating flags correctly.
  • -
  • Fix some Spell blursings getting applied before new Spell Permissions.
  • -
-

Version 4.8.5

-

New Features

-
    +

    Version 4.9.0

    +

    New Features

    +
      +
    • Add more Fiend tile setups for Short ToFR.
    • +
    • Added TriState Flag Output.
    • +
    • Add Adjust RedMage Hit%.
    • +
    • Lefein Shortcut added.
    • +
    • Fountain Fun% added.
    • +
    • Magic Stores Menuing QoL added.
    • +
    • Resource Packs can support new NPC sprites.
    • +
    • Treasure Chests have a different appearance once they have been opened.
    • +
    +

    Updates

    +
      +
    • Epitaphs for FFR community.
    • +
    • Free Airship + Free Ship now compatible with Airboat.
    • +
    • New Alt Fiends including Winner's Circle option.
    • +
    • Double Thief Hit% replaced with a dropdown menue.
    • +
    • Stream Safe Music now replaces intro music with a new track.
    • +
    • More options for Trap Tile Pool.
    • +
    • Improved accuracy of the Trapped Chests quantity.
    • +
    +

    Bugfixes

    +
      +
    • Fix True RNG conflict with Transmoog.
    • +
    • Fix LiftOff not getting called in logic when AIRBOAT + FREEAIRSHIP + FREESHIP.
    • +
    • Fix Custom Map domain import bug.
    • +
    • Fix Relocate Chest tile validation bug.
    • +
    • NoOverworld Fixes.
    • +
    • Fix Deep Dungeon Archipelago bugs.
    • +
    • Fix Sanity npc requirements overwriting tile requirement.
    • +
    • Fix infinite loop in shop shuffling.
    • +
    • Fix Short ToFR + No Fiends stair loop.
    • +
    • Removed dupluicate Crystal from KeyItems list.
    • +
    +

    Changes

    +
      +
    • FLOATER renamed to AIRBOAT when Airboat is on.
    • +
    • Proc Gen Waterfall removed.
    • +
    +

    Version 4.8.6

    +

    Updates

    +
      +
    • Winter Tournament 2025 Presets.
    • +
    • Print Classes Blursings in generation window.
    • +
    • Show Archipelago player name box on the side window.
    • +
    +

    Bugfixes

    +
      +
    • Fix mapgen seed not updating flags correctly.
    • +
    • Fix some Spell blursings getting applied before new Spell Permissions.
    • +
    +

    Version 4.8.5

    +

    New Features

    +
    • Add Vehicles to Player Sprite Sheets.
    • Add Encounter Tables uses True Rng.
    • Add Increased Enemy Regeneration.
    • Add New Team Steak sprites.
    • -
    • Resources packs can import enemy sprites.
    • -
    • Poison SFX and Airship SFX preferences.
    • -
    -

    Updates

    -
      +
    • Resources packs can import enemy sprites.
    • +
    • Poison SFX and Airship SFX preferences.
    • +
    +

    Updates

    +
    • Alt Fiends balance changes.
    • -
    • New Alt Fiends.
    • -
    -

    Bugfixes

    -
      +
    • New Alt Fiends.
    • +
    +

    Bugfixes

    +
    • Fix party flags being reseted when using presets.
    • Fix Alt Chaos Music flag.
    • Fix SetRng hard reset bug.
    • Fix Start With Key Item adding an extra blessing.
    • Fix Desert of Death.
    • -
    • Fix Game Overs being tracked correctly when Save on Death is enabled.
    • -
    +
  • Fix Game Overs being tracked correctly when Save on Death is enabled.
  • +

Version 4.8.4

-

New Features

-
    -
  • Stream Safe Music flag
  • -
-

Updates

-
    -
  • Add more food options to Titan's Snack.
  • -
  • Add more custom music.
  • -
-

Bugfixes

-
    -
  • Fix Extended Spoilers not showing the correct items.
  • +

    New Features

    +
      +
    • Stream Safe Music flag
    • +
    +

    Updates

    +
      +
    • Add more food options to Titan's Snack.
    • +
    • Add more custom music.
    • +
    +

    Bugfixes

    +
      +
    • Fix Extended Spoilers not showing the correct items.
    • Fix Life in Battle with Spellcrafter.
    • -
    • Fix in battle MDef blursings raising MDef permanently.
    • -
    • Fix Deep Dungeon's formations.
    • -
    -

    Version 4.8.3

    -

    Bugfixes

    -
      -
    • Fix double sliders.
    • -
    -

    Version 4.8.2

    -

    New Features

    -
      -
    • New music - replace all music with new tracks.
    • -
    -

    Changes

    -
      -
    • Shuffle lava tiles now uses the new method that 'add damage tiles' uses for more natural patterns.
    • -
    • Buy multiple from store now stops at the maximum amount you can carry.
    • -
    • Innate magic guarantees life spell
    • +
    • Fix in battle MDef blursings raising MDef permanently.
    • +
    • Fix Deep Dungeon's formations.
    • +
    +

    Version 4.8.3

    +

    Bugfixes

    +
      +
    • Fix double sliders.
    • +
    +

    Version 4.8.2

    +

    New Features

    +
      +
    • New music - replace all music with new tracks.
    • +
    +

    Changes

    +
      +
    • Shuffle lava tiles now uses the new method that 'add damage tiles' uses for more natural patterns.
    • +
    • Buy multiple from store now stops at the maximum amount you can carry.
    • +
    • Innate magic guarantees life spell
    • Resource pack weapon sprites are now more flexible.
    • -
    • Resource pack battle backdrops now give a useful error message if image is incorrect size.
    • +
    • Resource pack battle backdrops now give a useful error message if image is incorrect size.
    • Both INT and MDEF are now displayed on status screen.
    • -
    • Updated lodging use text when saving disabled.
    • +
    • Updated lodging use text when saving disabled.

    Bugfixes

      -
    • Bugfix: NOverworld freezing due to interaction with previous bug fix.
    • -
    • Bugfix: Party select all flags.
    • -
    • Bugfix: Weapon blursings using wrong flag.
    • -
    • Bugfix: Spell maluses duplicating bonuses.
    • -
    • Bugfix: Minimap music restored.
    • -
    • Bugfix: Logic crash related to Titan's Tunnel
    • -
    • Bugfix: Mapman leader palette bug when using custom sprites.
    • -
    • Bugfix: Lich's Revenge logic bug.
    • -
    • Bugfix: Importing gear icons from resource packs.
    • -
    • Bugfix: Resource pack map tiles loading incorrectly.
    • -
    • Bugfix: All Party flags not loading properly from flagstring.
    • -
    • Bugfix: Overworld validation not taking docks into account.
    • -
    • Bugfix: SetRNG interaction with 0 encounter rate.
    • -
    • Bugfix: Menu color wrong on first startup on some emulators.
    • -
    +
  • Bugfix: NOverworld freezing due to interaction with previous bug fix.
  • +
  • Bugfix: Party select all flags.
  • +
  • Bugfix: Weapon blursings using wrong flag.
  • +
  • Bugfix: Spell maluses duplicating bonuses.
  • +
  • Bugfix: Minimap music restored.
  • +
  • Bugfix: Logic crash related to Titan's Tunnel
  • +
  • Bugfix: Mapman leader palette bug when using custom sprites.
  • +
  • Bugfix: Lich's Revenge logic bug.
  • +
  • Bugfix: Importing gear icons from resource packs.
  • +
  • Bugfix: Resource pack map tiles loading incorrectly.
  • +
  • Bugfix: All Party flags not loading properly from flagstring.
  • +
  • Bugfix: Overworld validation not taking docks into account.
  • +
  • Bugfix: SetRNG interaction with 0 encounter rate.
  • +
  • Bugfix: Menu color wrong on first startup on some emulators.
  • +

Version 4.8.1

New Features

    @@ -99,8 +139,8 @@

Fixes/Changes

    -
  • Archipelago YAMLs now mark incentivized locations as priority.
  • -
  • Sprite importer will warn if image is not properly sized.
  • +
  • Archipelago YAMLs now mark incentivized locations as priority.
  • +
  • Sprite importer will warn if image is not properly sized.
  • Bugfix: occasional orb sprite corruption.
  • Bugfix: Legendary shop door misplacement on flipped map.
  • Bugfix: Vampire not attacking the correct town.
  • @@ -110,10 +150,10 @@
  • Bugfix: Rare chime shuffle + titan's tunnel softlock with entrance shuffle.
  • Bugfix: Shop class permissions sometimes displaying incorrectly.
  • Bugfix: Very rare infinite loop shuffling item shops.
  • -
+

Version 4.8.0

-

New Features

-
    +

    New Features

    +
    • Flame and Ice Armors prevent damage from ice and lava tiles.
    • Additional Alt Fiends from Final Fantasy 1, 2, 3, 4, 5 and 6.
    • Pink Mage, Black Knight and White Ninja feature (Red Mage, Knight and Ninja can learn spells from the opposite school).
    • @@ -121,888 +161,890 @@
    • Intelligence Affect Spells.
    • Reorder Spells in Magic Menu.
    • Adjust Poison Damage.
    • -
    • Classes Blursings: -
        -
      • Additional Classes Bonuses & Maluses.
      • -
      • Rebalanced distribution.
      • +
      • Classes Blursings: +
          +
        • Additional Classes Bonuses & Maluses.
        • +
        • Rebalanced distribution.
        -
      • +
      • Additional Titan Food options.
      • Repeat Heal Potions Use.
      • -
      • Alt Final Battle Music.
      • -
      -

      Misc

      -
        -
      • Various bugfixes.
      • -
      • Various backend upgrades.
      • -
      -

      Version 4.7.10

      -
        -
      • Bugfix: Shop slot update index was off by 1.
      • -
      • Archipelago: Improved location names.
      • -
      • Super secret stuff.
      • -
      -

      Version 4.7.9

      -
        -
      • Bugfix: Corrected an issue with the Shop Item that would make Deep Dungeon and Improved Vanilla flags crash at generation.
      • -
      -

      Version 4.7.8

      +
    • Alt Final Battle Music.
    • +
    +

    Misc

    +
      +
    • Various bugfixes.
    • +
    • Various backend upgrades.
    • +
    +

    Version 4.7.10

    +
      +
    • Bugfix: Shop slot update index was off by 1.
    • +
    • Archipelago: Improved location names.
    • +
    • Super secret stuff.
    • +
    +

    Version 4.7.9

    +
      +
    • Bugfix: Corrected an issue with the Shop Item that would make Deep Dungeon and Improved Vanilla flags crash at generation.
    • +
    +

    Version 4.7.8

    • Adjust Trapped Chests encounters to follow Set RNG when both features are enabled.
    • Prevent use of Open Chests in Order when Archipelago is enabled.
    • -
    • Bugfix: Corrected an issue where Relocate Chests could try and fail to place a chest in a room with no floor space.
    • +
    • Bugfix: Corrected an issue where Relocate Chests could try and fail to place a chest in a room with no floor space.
    • Archipelago: Corrected an issue where the Shop Incentive item was not being handled properly for certain AP flagsets.
    • -
    • Minor project cleanup to reduce site bandwidth.
    • +
    • Minor project cleanup to reduce site bandwidth.
    -

    Version 4.7.7

    -
      -
    • Bugfix: Corrected an issue where the Robot NPC was not being placed correctly in Generated Waterfall.
    • +

      Version 4.7.7

      +
        +
      • Bugfix: Corrected an issue where the Robot NPC was not being placed correctly in Generated Waterfall.
      -

      Version 4.7.6

      -
        +

        Version 4.7.6

        +
        • Experimental Feature: Generated Earth Cave.
        • -
        • Add "Free Rod" flag to Treasures and Freebies.
        • -
        -

        Version 4.7.5

        -
          +
        • Add "Free Rod" flag to Treasures and Freebies.
        • +
        +

        Version 4.7.5

        +
        • Bugfix: Corrected a crash caused by flagsets with NPC Recruits and Tavern Mode.
        • Update UI: Shard Hunt can be selected independent of Orbs Required slider status.
        • -
        • Update Presets: Winter Tournament 2024.
        • -
        -

        Version 4.7.4

        +
      • Update Presets: Winter Tournament 2024.
      • +
      +

      Version 4.7.4

      • Archipelago: Fix player name resetting bug.
      • -
      -

      Version 4.7.3

      +
    +

    Version 4.7.3

    • Add "Mid ToFR" option for Final Dungeon.
    • Transmooglifier: Armor blessings will always allow the recipient to equip said armor.
    • -
    • Bugfix: Corrected an issue where poisoned party members could be awarded incorrect EXP from chests.
    • -
    • Archipelago: Include permalink in YAML per community feedback.
    • +
    • Bugfix: Corrected an issue where poisoned party members could be awarded incorrect EXP from chests.
    • +
    • Archipelago: Include permalink in YAML per community feedback.
    • Archipelago: Fix Shop Item Bug.
    • Archipelago: Restrict player name to 16 characters to prevent connection issues.
    • -
    • Corrected various seed generation issues.
    • -
    -

    Version 4.7.2

    -
      -
    • Adds Spoilers file support when generating randomized ROMs via the Command Line Interface.
    • -
    • NPC Hints flag is now properly disabled in the UI when Archipelago is active.
    • -
    • Bugfix: Corrected an issue where Random Shard Names Fun% setting was changing the seed.
    • +
    • Corrected various seed generation issues.
    • +
    +

    Version 4.7.2

    +
      +
    • Adds Spoilers file support when generating randomized ROMs via the Command Line Interface.
    • +
    • NPC Hints flag is now properly disabled in the UI when Archipelago is active.
    • +
    • Bugfix: Corrected an issue where Random Shard Names Fun% setting was changing the seed.
    • Bugfix: Corrected an interaction where some Class Blessings would be applied repeatedly when reviving in Tavern Mode.
    • Bugfix: Corrected Deep Dungeon encounter rate for Floor 51; was previously no encounters.
    • Bugfix: Corrected chest weight values for "Deep Dungeon - Progressive" mode in Temple of Fiends; was previously awarding high value treasure too early.
    • -
    • Minor exceptions handling and site page adjustments.
    • -
    - -

    Version 4.7.1

    -
      -
    • Adds Lockpicking support to Transmooglifier.
    • +
    • Minor exceptions handling and site page adjustments.
    • +
    + +

    Version 4.7.1

    +
      +
    • Adds Lockpicking support to Transmooglifier.
    • Bugfix: Corrected an issue with Party Draft character selection when Class Blursings, Transmooglifier, or Chaos Mode was enabled.
    • Bugfix: Corrected Black Belt absorb and damage in Transmooglifier.
    • -
    • Update Presets: Trance is Status element is ON.
    • -
    - +
  • Update Presets: Trance is Status element is ON.
  • +
+

Version 4.7.0

-

New Features

-
    -
  • Shorter ROM filename when downloading a randomized ROM.
  • +

    New Features

    +
      +
    • Shorter ROM filename when downloading a randomized ROM.
    • Introducing "/RomInfo" - Instead of needing to provide a seed, flagstring, URL, and/or filename, simply use /RomInfo to analyze your ROM file. It will display version/seed/flag details players can then copy and paste for development when reporting bugs.
    • -
    • Transmooglifier, a new option for Class Randomization: -
        -
      • Generates six custom classes from a set of 26 possibilities, such as Geomancer and Juggler.
      • -
      • Each class will have semi-randomized spell permissions, stats, equipment, etc. appropriate for that class type.
      • -
      • Each class features a new custom sprite.
      • -
      • Sub-option for forcing a balanced set of classes (e.g. ensuring there is at least one Heavy Armor class).
      • -
      • Sub-option for rebalancing weapons to provide more viable end-game options for the various classes.
      • +
      • Transmooglifier, a new option for Class Randomization: +
          +
        • Generates six custom classes from a set of 26 possibilities, such as Geomancer and Juggler.
        • +
        • Each class will have semi-randomized spell permissions, stats, equipment, etc. appropriate for that class type.
        • +
        • Each class features a new custom sprite.
        • +
        • Sub-option for forcing a balanced set of classes (e.g. ensuring there is at least one Heavy Armor class).
        • +
        • Sub-option for rebalancing weapons to provide more viable end-game options for the various classes.
        -
      • -
      • Experimental Feature: Airboat, where the Floater allows the Ship to transform into the Airship and land in water.
      • -
      • Experimental Feature: Set RNG, which makes RNG more consistent (e.g. bosses have the same RNG) within a given seed.
      • + +
      • Experimental Feature: Airboat, where the Floater allows the Ship to transform into the Airship and land in water.
      • +
      • Experimental Feature: Set RNG, which makes RNG more consistent (e.g. bosses have the same RNG) within a given seed.
      • Improved Lock Respond Rate. The game's Respond Rate is now controlled by a UI slider, and can no longer be changed by fast inputs during quick resets.
      • Shard Hunt now defaults to SHARD naming. Randomized Shard names (WEDGE, ORBLT) is now a Fun% option.
      • -
      • "Equip Shields" Class Blessing nows grants permission to equip Buckler and ProCape.
      • +
      • "Equip Shields" Class Blessing nows grants permission to equip Buckler and ProCape.
      -

      Bugfixes

      -
        -
      • Procedurally Generated Overworld: Airship floater area now has grass in its corners, preventing an uncommon soft-lock scenario where you could take off from a region but never land there again.
      • +

        Bugfixes

        +
          +
        • Procedurally Generated Overworld: Airship floater area now has grass in its corners, preventing an uncommon soft-lock scenario where you could take off from a region but never land there again.
        • NPC Hint Givers will now correctly advise players of item locations (via the Sanity2 item placement algorithm).
        • Fixed an interaction to prevent "Sky Maze" option if Deep Dungeon is enabled.
        • Fixed a bug where "Orbs Required" could corrupt the site URL flagstring.
        • Fixed a bug where Bat Spoilers was causing a different seed hash to display for players using Fun Enemy Names.
        • -
        • Minor code cleanup and UI adjustments.
        • -
        - -

        Version 4.6.4

        -
          -
        • Winter Tournament Presets updated.
        • -
        • Fixed a bug where "hurt" class blessings could be canceled or transfered to other party members.
        • +
        • Minor code cleanup and UI adjustments.
        • +
        + +

        Version 4.6.4

        +
          +
        • Winter Tournament Presets updated.
        • +
        • Fixed a bug where "hurt" class blessings could be canceled or transfered to other party members.
        -

        Version 4.6.3

        -
          -
        • Winter Tournament Presets added.
        • -
        • Fixed a bug where recruitable NPCs were not beeing flipped correctly when Flip Dungeons Vertically is enabled.
        • +

          Version 4.6.3

          +
            +
          • Winter Tournament Presets added.
          • +
          • Fixed a bug where recruitable NPCs were not beeing flipped correctly when Flip Dungeons Vertically is enabled.
          - -

          Version 4.6.2

          -
            -
          • Fixed "Relocate Chests" not working for Sea Shrine.
          • -
          • Fixed a bug with Promo Armor maluses preventing a character from equipping Ribbons/Bracelets/ProRings.
          • -
          • Fixed bonus starting gold blursings giving you twice as much gold as intended.
          • -
          • Fixed Alt-Fiend Shiva accidentally being weak against Ice instead of Fire.
          • -
          • No Ribbon and No Masa maluses now won't appear when those items are banned.
          • -
          - -

          Version 4.6.1

          -

          General & Features

          -
            -
          • Upgraded .net to 6.0, which should noticeably increase site performance.
          • -
          • "Highway to Ordeals" Map Edit flag, connecting Lefein to Mirage to Ordeals.
          • -
          • Incentive flag to require Ship+Canal are placed before the Floater.
          • -
          • Unrunnable Formation Count has been converted into a slider, allowing for more precise adjustment and allowing for random ranges.
          • -
          • New Adjustable Tile Damage (lava) slider, letting you set tile damage 0-10 or randomized in a range.
          • -
          • "Innate Magic" blursing sub-flag provides sets of spells that are given at Tier-8 (regardless of the actual tiers of the spells, which can still be learned at their normal level), come with 2MP, and can be given to melee classes: -
              -
            • "Tele Magic" gives WARP & EXIT
            • -
            • "Buff Magic" gives TMPR, FAST, & INV2
            • -
            • "Self Magic" gives RUSE & SABR (melee only)
            • -
            • "Heal Magic" gives CUR3, HEL2, & LIFE; "Heal+ Magic" gives CUR4, HEL3, & LIFE
            • -
            • "Elem Magic" gives ICE2, FIR2, & LIT2; "Elem+ Magic" gives ICE3, FIR3, & LIT3
            • -
            • "Doom Magic" gives three random spells that cause instant death/stone
            • -
            • "Clean Magic" gives three random status ailment cures (which can include LIFE or LIF2)
            • -
            • "Nuke Magic" gives NUKE (rare & spellcasters only)
            • -
            -
          • -
          • Other New Blursings: -
              -
            • +All Shields and +All Gauntlets/All Helmets Blessings
            • -
            • -No Masamune Malus
            • -
            • +/-Gold buffed and made to scale with the flagset's Starting Gold
            • -
            • +Promo Sage and +Promo Fighter Armor Blessings
            • -
            • Starting spell bonuses are now always given at Tier-8 (regardless of the actual tiers of the spells, which can still be learned at their normal level) and come with 2MP.
            • -
            • +More starting spell possibilities: CUR3, HEL2, LOCK/LOK2
            • -
            • -More removed spell possibilities: CUR3, HEL3, INV2, WALL, LOCK/LOK2, FIR3/LIT3/ICE3
            • -
            • -No Knight Armor Malus
            • -
            • -Ninja gets Red Wizard Armor Malus
            • -
            • +Hurt Undead, +Hurt Dragon type-slaying Blessings
            • -
            -
          • -
          • "Flip Dungeons Vertically" flag.
          • -
          • "Balanced Rude" Touch Pool option for those that like things spicier (but still mostly reasonable).
          • -
          • "Shuffle Chime Access" flag.
          • -
          • "Life in Battle" can now be set to only work for LIFE1 and not LIFE2.
          • -
          • WarMECH Mode can now also be set to "Random" or "All".
          • -
          • Class-specific XP can now be adjusted down (to as low as 50%) as well as up.
          • -
          • New Shallow/Deep incentive areas for Volcano.
          • -
          • Shuffle Chime Access flag to change wich location is chime-required.
          • -
          -

          Bugfixes & Tweaks

          -
            -
          • Fixed: Death & Stone Touch effects were never generating with Randomized Status Effects.
          • -
          • Changed Tourney-safe Restrictions to allow more visual modifications.
          • -
          • Fixes & tweaks for Blursings: Addressed language-specific crashes; Thor Master & CatClaw Ace now let you equip those weapons pre-promotion; spell blursings no longer show what tier level they are; bigger Agility boosts; removed some do-nothing blursings for specific cases/classes; removed confusing starting DARK/LAMP maluses; promo-specific blursings no longer available if you cannot promote; starting INV2 instead of INVS; removed RUSE from possible starting spells; "Hunter" renamed "Hurt All"; fixed Shirts + Armor Crafter.
          • -
          • Bugfixes for Proc-gen Overworld relating to Titan's Tunnel, Bridge placement, and more.
          • -
          • Proc-gen Overworld now more likely to require early progression items: Bridge, Ruby, or Canal.
          • -
          • Adjusted equipment tiers: Opal Gauntlets/Helm Legendary->Rare; Power Guantlet Rare->Legendary; Power Rod Common->Rare.
          • -
          • Fixed E/F Shuffle not randomizing some connections properly.
          • -
          • Armor Crafter: Fixed Black Shirt using the wrong spell pool.
          • -
          • Weaponizer & Armor Crafter: Fixed WALL not being included in defensive spell pools.
          • -
          • "Gating" incentive location terminology cleanup.
          • -
          • NOverworld fixes for Archipelago & Key Item Blessings.
          • -
          • Fixed a few bugs concerning Item Magic Pools and Starting Caster Equipment.
          • -
          • Removed 4F Sky from "Swap Stair Locations" (4F Sky already has its own setting).
          • -
          • Ribbon now only included in Legendary Armor Shop pool once instead of three times.
          • -
          • Fixed rare case where a "Forced" party member could result in starting with a promoted character (without any promotions checked).
          • -
          • Archipelago moved from Experimental Tab to Goals Tab.
          • -
          • "Clinics Don't Cost Money" & "Clinics Heal All Statuses" combined into one "Improved Clinics" flag, and moved from Experimental Tab to Shop Tab.
          • -
          • Consolidated Adjustments Tab (fewer checkboxes); Misc. clarity fixes (better tooltips, graying out incompatible flags, etc.)
          • -
          - -

          Version 4.5.4

          -
            -
          • Bugfixes for Starting Gold & Lockpicking Class Blursings.
          • -
          • Bugfixes for Armor Crafter Power Gauntlet & Weaponizer Chroma/XCalber.
          • -
          • "Wood Adept" Blursing nerfed to give +120 Evasion instead of max.
          • -
          • "Cleaner Blursed Names" QoL flag (makes equipment names easier to read, primarily for Weaponizer/Armor Crafter).
          • -
          • New 7.7% Per Item Progressive Scaling option (to offer something between 5% and 10%).
          • -
          • "Fight Bahamut" now also makes their minions hostile, and they block off the treasure if "Bahamut's Hoard" is active.
          • -
          • WarMech settings now compatible with Deep Dungeon.
          • -
          • Legendary White Magic Shops will no longer have PURE or SOFT as possibilities in most cases.
          • -
          • Weaponizer tweaks: Mid-tier elemental bonuses are more common than strongest & weakest; a few new element combinations & names.
          • -
          • Various text/tooltip cleanup and additions.
          • -
          - -

          Version 4.5.2

          -

          General

          -
            -
          • Relocate Chests & Trap Tiles flag.
          • -
          • Swap Stair Locations flag.
          • -
          • Experimental: Open Chests In Order flag.
          • -
          • Bridge to Lefein & River to Melmond map flags; Bridge Incentive.
          • -
          • New Class Blursings; Moved Resist Blursings into the main Blursing set; Key Item Blursing flag.
          • -
          • Starting Gold flag.
          • -
          • Formations: Tiered Shuffle Rarity.
          • -
          • MP Charges Restore on Max MP flag.
          • -
          • Earlier High-Tier Magic Charges flag.
          • -
          • Move ToF Bats flag.
          • -
          • Experimental: Clinics Heal All Statuses & Clinics Don't Cost Money flags.
          • -
          • Randomized Treasures: Use a proportional list instead of weighted odds; include Deep Dungeon's item generation algorithm.
          • -
          • Resources Pack: Added support for spellbook import.
          • -
          • Shuffle Pravoka Shops flag.
          • -
          • 'Half' option for Script & Touch multipliers.
          • -
          • Reduced Luck flag.
          • -
          - -

          Interface

          -
            -
          • Resources section changed to Wiki section.
          • -
          • New Window when generating a ROM to make it more clear that it is still processing.
          • -
          • Tabs' layout cleanup and update.
          • -
          • ~100 Tooltip edits for more detailed explanations, clarity, and consistency.
          • -
          • Streamlined XP/Gold Scaling, so the flat bonus is now the actual amount gained. ("2.5x + 100" gives the same XP/Gold that "2.5x + 250" used to.)
          • -
          - -

          Bug Fixes & Balance

          -
            -
          • Non-incentive guaranteed Defense/Offense item no longer plays fanfare.
          • -
          • Tiered Magic Shuffle - TMPR no longer weighted higher.
          • -
          • Slightly buffed BLACK New Consumable.
          • -
          • Improved Tier-1 Spells (FIRE, ICE, LIT, HARM) now sets them to exactly the power of Tier-3 Spells but all single-target (incl. HARM1).
          • -
          • Formally added the "Tournament" Item Magic Pool as "Curated".
          • -
          - -

          Quality of Life

          -
            -
          • Uninterrupted Music tweaks the Chest SFX to keep music playing.
          • -
          • Lock Respond Rate to keep it maxed.
          • -
          • Disable Damage Tile SFX to make lava less annoying.
          • -
          • Bland Site flag.
          • -
          - -

          Version 4.4.0

          -

          General

          -
            -
          • New Presets added.
          • -
          • Power Staff can be incentivized.
          • -
          • Late Loose flag to push loose items farther in the game.
          • -
          • Mermaid Prison flag to lock all the doors on the Mermaids' floor in Sea Shrine.
          • -
          • Improve Fire/Lit/Ice Spells flag.
          • -
          • Guaranteed Defense Item flag to select what defense spell to give to the Power Staff.
          • -
          • Guaranteed Power Item flag to select what strength spell to give to the Power Gauntlet.
          • -
          • Ribbon flag to distribute Ribbons' protection to other pieces of gear.
          • -
          • TRANCE Is Status Element flag.
          • -
          - -

          Enemies

          -
            -
          • Prevent consecutive Nukes flag to stop Fiends from having two NUKE or NUCLEAR on after the other in their skill/spell lists.
          • -
          • No Empty Scripts flag to prevent enemies from rolling a script with no spells or skills.
          • -
          • Script Count flag to set the number of scripts in the game.
          • -
          • Touch Attack Count flag to set the number of enemies with touch attack.
          • -
          • Script Count flag to set the number of scripts in the game.
          • -
          • Buffed Astos flag.
          • -
          • Unsafe Astos subflag to allow/disallow Astos from disguising itself as the Princess or the King.
          • -
          - -

          Version 4.3.2

          - - -

          Version 4.3.1

          -

          This is a bugfix release.

          -
            -
          • Fix class malus "can't use bracelets" to be compatible with Armorcrafter
          • -
          • Fix ship location logic bug that could sometimes result in the canal being placed outside the inner sea.
          • -
          • Fix issues with older flag JSONs (such as presets) that contain "SanityCheckerV2: false".
          • -
          • Fix Monster in a Box to work with Deep Dungeon
          • -
          • Disable Hint NPCs when Deep Dungeon is enabled
          • -
          - -

          Version 4.3.0

          -

          Overworld

          -
            -
          • New options to procedurally generate completely new overworld maps for infinite new adventures!
          • -
          • New overworld map generator: Standard procgen generates maps in the style of the original game
          • -
          • New overworld map generator: Desert of Death creates a deadly desert
          • -
          • New overworld map generator: Lost Woods creates an endless forest
          • -
          • Procedurally generated maps can be exported and re-imported
          • -
          • Option for overworld desert and marsh tiles to deal damage
          • -
          • Option to enable damage tiles to kill (can even end the game!)
          • -
          • Option to disable minimap
          • -
          - -

          Dungeons

          -
            -
          • Deep Dungeon: now displays the current floor number on the start menu
          • -
          • Deep Dungeon: option for progressive tilesets (tilesets relate to how deep you are) instead of being totally random
          • -
          • Deep Dungeon: option to choose for where you find TAIL in relation to Bahamut
          • -
          • Deep Dungeon: option to gate access to shortcuts with fiend orbs instead of NPCs that require specific items
          • -
          • Deep Dungeon: new dungeon floor style
          • -
          • Deep Dungeon: fixed direction of stair tiles
          • -
          • Deep Dungeon: Final floor is now the final ToFR floor. If short ToFR is enabled, it will be the short ToFR floor.
          • -
          - -

          Graphics & resources

          -
            -
          • New Resource Pack feature enabling you to replace a variety of game assets.
          • -
          - -

          Other new options and changes

          -
            -
          • New option: all enemies have death touch
          • -
          • New option: Individual Class XP Scaling
          • -
          • Option for White Mage HARM spells to do damage to all monsters (extra damage to undead)
          • -
          • New class blursing: natural resistences (e.g. automatic fire resistance)
          • -
          • New option to cap the maximum level below 50
          • -
          • Option to make DARK effect much more effective.
          • -
          • Alternate new consumables: RFRSH/FLARE/BLACK/GUARD and QUICK/HIGH/WIZRD/CLOAK.
          • -
          • Quality of life option to render magic powers and weaknesses using icons instead of text
          • -
          • Make "Can't hold" message red for greater visibility
          • -
          • Additional options to control what kind of monster formations are put into trapped chests
          • -
          • Alternate Key Items placement algorithms
          • -
          • New Item Magic shuffling options
          • -
          • New option: Reduce the number of required orbs
          • -
          • Archipelago support
          • -
          - -

          Version 4.2.2

          -

          Maps and overworld

          -
            -
          • Alt Overworld Maps: 3 ProcGen Overworld Maps Preview -- Channel#125, Epic Quest, Archipelago
          • -
          • Alt Overworld Maps: Compatible with E/F Shuffle
          • -
          • Experimental Item Placement Flags: Spread Loose Placement, Forward Loose Placement and Loose Npc Balance
          • -
          • No Overworld: Compatible with E/F Shuffle
          • -
          • New Adjustements Flag: Quick Minimap Load
          • -
          -

          Gear

          -
            -
          • No Item Magic: Remove all spellcasting abilities from gear
          • -
          • Experimental: Armor Crafter
          • -
          -

          Fun% and Quality of Life

          -
            -
          • Split Fun% into Fun% and Quality of Life tabs
          • -
          • New QoL Flag: Renounce InfoChest
          • -
          - -

          Version 4.2.1

          -
            -
          • Exp Chests: Chests can give out experience points
          • -
          • New Starting Equipement Options: Random Type Weapon and Starter Pack
          • -
          • Gear Info: Include Class Permissions
          • -
          • New Alt Final Boss: The Sahagin Wagon (Kraken 1, Kraken 2, 2-4 R. Sahags and 2-4 WzSahags)
          • -
          • New Alt Final Boss: Snake Pit (Tiamat 1, Tiamat 2, 1-6 Asps and 1-6 Cobras)
          • -
          - -

          Version 4.2.0

          -

          Maps and overworld

          -
            -
          • Faster boat -- increase sailing speed of the SHIP to match the AIRSHIP
          • -
          • Map edit: Lefein dock & Gaia mountain pass -- provides access to the Lefein region and Gaia by ship
          • -
          • Map edit: Dragon's Hoard -- moves all the Cardia islands chests to the Bahamut's room
          • -
          • Map edit: Hall of Dragons -- adds encounters to the hallway leading to Bahamut's floor
          • -
          • Map edit: Enable encounters on the Chaos floor
          • -
          • Remove floater -- remove floater from the game
          • - -
          • - Sanity Checker v2 -- the sanity checker is the - component that ensures that items are placed so - that the game is can always be completed. The new "v2" - sanity checker allows for alternate maps with much - more drastic map customization than was possible - previously, such as "No Overworld". -
          • - -
          • - No Overworld -- alternate map option that removes the - overworld entirely, instead directly linking towns and - dungeons with a new system of staircases and portals. -
          • -
          - -

          Gear and Items

          -
            -
          • - Equipment and Magic info -- press select - while on the magic screen, or in EQUIP mode on the - weapon or armor screen to get extra information - about the selected item or spell. -
          • - -
          • Chestinfo -- show gear stats when opening a chest containing weapon or armor
          • - -
          • Weaponizer -- randomly generate a new set of weapons, with their own stats, special powers, and spellcasting abilities.
          • - -
          • New consumables -- add phoenix down, blast, smoke and full-cure potions to the game
          • - -
          • Start with free equipment
          • - -
          • Exclusive legendary shops -- make it so legendary gear can only be acquired from legendary shops
          • - -
          • - Opening chests containing the incentive item - plays the fanfare, even if it is equipment rather - than a key item. -
          • - -
          • Xcalber can now be incentivized, or banned
          • - -
          • Exclude gold from scaling -- don't scale treasure chest or enemy gold rewards based on prices or XP scaling.
          • - -
          • Can scale prices down to 0
          • -
          - -

          Enemies

          -
            -
          • Hidden Chaos (Chaos in a random treasure chest)
          • -
          • Mark which chests contain Monster in a Box
          • -
          • Many new options for controlling which chests are protected by Monster in a Box
          • -
          • Spoiler bats -- Sky Warrior bats in Temple of Fiends give hints about the stats of the fiend refights and Chaos.
          • -
          • Obfuscate enemies -- turn every enemy into an Imp
          • -
          • Buff Bahamut -- when "fight Bahamut" is enabled, make him more powerful
          • -
          - -

          Party and classes

          -
            -
          • Can enable dead characters to gain XP
          • -
          • Thief lockpicking -- once reaching a certain level, a party with a thief can automatically open keylocked doors.
          • -
          • Thief starting agility -- can now choose between 80, 100, 120
          • -
          • Set character maximum level lower than 50
          • -
          - -

          Other new options and changes

          -
            - -
          • - Load custom player sprites. See - the - Final - Fantasy Randomizer Sprite Compendium - for sprite - sheets you can use and information on making your - own. -
          • - -
          • - Accessible spell names -- Fun% option to rename - some spells to be easier to distinguish -
          • - -
          • Spell name obfuscation -- make spell names inaccessible instead
          • - -
          • - Tabs have been reordered and flags reorganized a - bit to be in a more logical order. -
          • - -
          • - Permalinks -- when visiting the front page, you - are automatically redirected the site for the latest - version. URLs containing seeds and flagsets will - include the version in the domain name, so they can - be safely shared, bookmarked or archived, and will - no longer become invalid when a new version of FFR - is published. -
          • - -
          • - Short ToFR now maintain the requirement to have - the LUTE and KEY to get to Chaos. These can be - removed with the Free Lute and Unlocked ToFR - flags. -
          • - -
          • - Crop friendly mode, changes the background color - of the start and party select screens so it is - easier for the restreamer to identify screen - boundaries when cropping for a race. -
          • - -
          • - Disable spell flash and disable tile flicker - Fun% flags are now enabled by default. They can be - unchecked unless "Tournament Safe ROM" is enabled. -
          • - -
          • - When "Tournament Safe ROM" is enabled, always - enables "Disable Damage Tile Flicker", "Disable - Spell Cast Flash" and "Crop Friendly" flags. -
          • - -
          • - Can opt-in to "Slow Screen Wipes", "Slow Battle - Messages" and "Slow Map Move". This enables players - who experience motion sickness from the "speed - hacks" to run seeds where "speed hacks" are enabled. -
          • - -
          • The "Blind seed" option is now called "Hide flags".
          • - -
          • - When "Generate Spoiler Log" is enabled, it will - be downloaded as a text file instead of appearing in - the browser console -
          • - -
          • - The enemizer enemy "BUM" has been renamed to the - more tasteful "CHAMP". -
          • -
          - -

          Version 4.1.6

          -
            -
          • Bugfix so that spellcasting blessings don't override spellcasting maluses.
          • -
          - -

          Version 4.1.5

          -

          Version 4.1.4

          -

          Version 4.1.3

          -

          Version 4.1.2

          - -
            -
          • Spring Tournament 2021 announcements & updates to presets
          • -
          - -

          Version 4.1.1

          -

          New Features

          -
            -
          • Gaia Shortcut
          • -
          • Add Coneria to Town Shuffle
          • -
          • Add ToFR Exit
          • -
          • Include Lute Plate in Short ToFR
          • -
          • Melmondish Hospitality
          • -
          • Vampire Attacks Random Town
          • -
          • Bahamut Cardia Dock
          • -
          • Extensive Hint Flag
          • -
          • Shop Reduction
          • -
          • Legendary Shops
          • -
          • Consumable Treasure Stack Size
          • -
          • More Consumable Chests
          • -
          • Magic Shop Locations: Paired Shuffle
          • -
          • Nones Gain XP
          • -
          • Turn Shelters into Ethers
          • -
          • Deep Dungeon
          • -
          • Alternate Fiends
          • -
          • Fight Bahamut
          • -
          • Random Incentive Location Selection
          • -
          • No Loose Items in Incentivized Dungeons
          • -
          • Chance to Run
          • -
          • Starting Levels
          • -
          • Thief Agility Buff
          • -
          • Fun%: Titan Snack
          • -
          - -

          Version 4.0.1

          -

          New Content

          -
            -
          • Change Log
          • -
          • Resources Section
          • -
          - -

          Version 4.0.0

          -

          New Features

          -
            -
          • New Site Layout Released
          • -
          • Blind Seed
          • -
          • Unrunnable Formations (Drop Down)
          • -
          • Trapped Chests
          • -
          • Trapped Chests: WarMECH, Guardian of the Masamune
          • -
          • Trapped Chests: Trapped Shards
          • -
          • Scary Imps
          • -
          • Randomly Flip Dungeons Floors
          • -
          • Incentivize Random Chest In Location
          • -
          • Incentivize Random Chest In Location: Include Mirage and TFC
          • -
          • Free Lute
          • -
          • Guaranteed Masamune
          • -
          • Send Masamune Home
          • -
          • No Masamune
          • -
          • Price Scaling (Double-Slider)
          • -
          • Starting Item Sets (Drop Down)
          • -
          - -

          Minor Upgrades and Bug-Fixes

          -
            -
          • Improved Weapon Type Bonus Values
          • -
          • Removed Everything Unrunnable
          • -
          • Removed Everything Runnable
          • -
          • Removed Enemy Formations Unrunnable
          • -
          • Removed NPC Hint Givers: Randomized in Dungeons
          • -
          • Removed Linear MP Growth
          • -
          • Removed v2 Placement
          • -
          - - -

          Version 3.3.0

          -

          New Features

          -
            -
          • Short ToFR: Preserve All Fiend Refights
          • -
          • All Weapons Cast Magic
          • -
          • All Weapons Cast Magic: Balanced Shuffle
          • -
          • Power Word Threshold
          • -
          • Everything Runnable
          • -
          • Remove Trap Tiles
          • -
          • Lich's Revenge
          • -
          • Free Canoe
          • -
          • Shop Info
          • -
          • Pacifist Bosses
          • -
          • Evade Cap Value (Drop Down)
          • -
          - -

          Version 3.2.0

          -

          New Features

          -
            -
          • Magic Levels: Tiered Shuffle
          • -
          • Magic: Mixed Spellbooks
          • -
          • Swole Pirates
          • -
          • Enemy Skills & Spells: Tiered Shuffle
          • -
          • Map Edits: Dwarves and Northwest Passage (Seperate Option)
          • -
          • Map Edits: Ryukahn Airship Dock (Option)
          • -
          • Incentivize Katana
          • -
          • Early King
          • -
          • Buy Ten (Legacy Flag)
          • -
          • Battle Magic Menu Wrap Around
          • -
          • Remove Tail
          • -
          • Characters Gated by Fiends
          • -
          • Characters Gated by NPC Key Items
          • -
          • Gated Characters: Forced Characters
          • -
          • Gated Characters: Allow Duplicates
          • -
          • Gated Characters: Allow Promoted Classes
          • -
          • Boss and Enemy Stats: Double-Sliders
          • -
          • Boss and ENemy Stats: Seperate HP from Pool
          • -
          • Party Composition: Allow Promoted Classes
          • -
          • Save Game When Game Over
          • -
          • Save Game When Game Over: Dragon Warrior Mode
          • -
          • Shuffle Astos
          • -
          • Buff Healing Spells
          • -
          • NPC Hint Givers: Villagers
          • -
          • NPC Hint Givers: In Dungeons
          • -
          • NPC Hint Givers: RNG Dungeon Placement
          • -
          • NPC Hint Givers: Useless Hints
          • -
          • Blursed Weapons: Exclude Masamune
          • -
          • Blursed Weapons and Armor: Double-Sliders
          • -
          • Balanced Item Magic Shuffle
          • -
          • Party Draft
          • -
          • Party Draft: Pool Size
          • -
          • Party Draft: Include Promoted Classes
          • -
          • Enable Random Promotions
          • -
          • Enable Random Promotions: Include Base Classes
          • -
          • Enable Random Promotions: Class Spoilers
          • -
          • Linear MP Growth
          • -
          • Blursed Classes
          • -
          • Blursed Classes: Chaos Mode
          • -
          • Magic Charges for Classes (Sliders)
          • -
          • Lock Hit Mode (Drop Down)
          • -
          • Allow Unsafe Start Area
          • -
          • Earlier Ruby
          • -
          • Guaranteed Ruse Item
          • -
          • Disable Stun Touch
          • -
          • Disable Spell Cast Flashing (Fun %)
          • -
          • Multi-Instrumentalist Sara (Fun %)
          • -
          • Hurray Dwarf Fate (Fun %)
          • -
          • Renounce Autosort (Fun %)
          • -
          - -

          Minor Upgrades and Bug-Fixes

          -
            -
          • Removed Rebalance Spells
          • -
          • Removed Enemy Scale Factor
          • -
          • Removed Boss Scale Factor
          • -
          • Removed Boss and Enemy HP Clamps
          • -
          - -

          Version 3.1.0

          -

          New Features

          -
            -
          • ShardCount ShardCount
          • -
          • Magic Shop Location Shuffle
          • -
          • Fix Missing Battle RNG Entry
          • -
          • Shuffle Enemy Scripts: Bosses Only
          • -
          • Shuffle Eenemy Skills: Bosses Only
          • -
          • Open Progression: Northern Docks
          • -
          • Incentivize Vorpal
          • -
          • Black Blet Crit Rate
          • -
          • Weapon Crit Rate
          • -
          • Weapon Bonuses
          • -
          • Inventory Autosort
          • -
          • Recruitment Mode: Replace Only Nones
          • -
          • Randomize Enemies: Enemizer
          • -
          • World Wealth WorldWealth
          • -
          • Generate New Spellbook (Spellcrafter)
          • -
          • Spellcrafter: Mix Spellbooks
          • -
          • Spellcrafter: Retain Permissions
          • -
          • All Spell Levels for Knight and Ninja
          • -
          • Free Tail
          • -
          • Random Weapon Bonus (Blursed)
          • -
          • Random Armor Bonus (Blursed)
          • -
          • Mapman Slot (Fun %)
          • -
          - -

          Version 3.0.0

          -

          New Features

          -
            -
          • New Site Layout Released
          • -
          • Spoilers Log
          • -
          • Rebalance Spells
          • -
          • Everything Unrunnable
          • -
          • Unrunnables Strike First and Surprise
          • -
          • Random Status Attacks
          • -
          • Lefeinish Hospitality
          • -
          • Entrance Shuffle: Allow Deep Towns
          • -
          • EntrancesShuffle: Includes Dead Ends
          • -
          • EntrancesShuffle: Entrances Mixed with Towns
          • -
          • Incentivize Main Items
          • -
          • Incentivize Canoe Item
          • -
          • Incentivize Floater
          • -
          • Incentivize Ship and Canal
          • -
          • Classic Item Placement (v2 Placement)
          • -
          • Incentivize Titans Trove
          • -
          • Better Trap Chests
          • -
          • Free Ship
          • -
          • Houses Fill HP
          • -
          • NPC Guillotine
          • -
          • Fix Hit Chance Cap
          • -
          • Tavern Recruitment Mode
          • -
          • Taverns: Hire Only Option
          • -
          • Generated Waterfall
          • -
          • Generated Earth 1
          • -
          • Generated Earth 2
          • -
          • Shuffle the Original Fiends
          • -
          • Disable Overworld Saving
          • -
          • Disable Inn Saving
          • -
          • Randomize Formations (Enemizer)
          • -
          • Improved Thief Hit Rate
          • -
          • Magic Defense Options (Drop Down)
          • -
          • Menu Color (Fun %)
          • -
          - -

          Version 2.6.0

          -

          New Features

          -
            -
          • Better Trap Treasure
          • -
          - -

          Version 2.5.0

          -

          New Features

          -
            -
          • None Class
          • -
          • Party Composition
          • -
          • Random Shops
          • -
          • Enemy Formations Frequency (Drop Down)
          • -
          • Randomized Treasures (Total Randomization)
          • -
          • Shuffle Objective NPCs
          • -
          • Disable Damage Tile Flicker
          • -
          • Three Battle Palettes (Fun %)
          • -
          - -

          Minor Upgrades and Bug-Fixes

          -
            -
          • Fix a bug where the Mystic Key could have been placed in the first two chests of the Temple of Fiends Revisited.
          • -
          - -

          Version 2.4.0

          -

          New Features

          -
            -
          • Entrance Shuffle
          • -
          • Encounter Rate (Sliders)
          • -
          • Trap Tile Shuffle
          • -
          • Extended Open Progression
          • -
          • Shortened Temple of Fiends Revisited (Short ToFR)
          • -
          • Zozo Melmond
          • -
          • Static EXP Distribution
          • -
          • Confused Old Men
          • -
          • Critical Hit Count
          • -
          - -

          Minor Upgrades and Bug-Fixes

          -
            -
          • The venerable Enable Buy 10 Convenience now includes the Caravan!
          • -
          • Speed Hacks now accelerates the lineup screen when shuffling party members.
          • -
          • Scale Boss Stats now operates independently of the rest of the monsters.
          • -
          • Include Morale is now explicit for enemy stat scaling. Uncheck this to force vanilla morale.
          • -
          - -

          Version 2.3.0

          -

          New Features

          -
            -
          • WarMECH Mode (Drop Down)
          • -
          • EXP/Gold Progressive Scaling
          • -
          - -

          Version 2.2.0

          -

          New Features

          -
            -
          • Treasure Hunt (Shards)
          • -
          • Surprise (Alternate) Final Boss
          • -
          • Improved Turn Order Randomization
          • -
          - -

          Minor Upgrades and Bug-Fixes

          -
            -
          • Enable Dash is now reversed. Running is the default speed now; holding B will slow to half pace.
          • -
          • Change Unrunnable RUN -> WAIT now defaults to enabled.
          • -
          - -

          Version 2.1.0

          -

          New Features

          -
            -
          • Unrunnable Formations Shuffle
          • -
          • Change Unrunnable RUN to WAIT
          • -
          • Surprise Bonus Shuffle
          • -
          • Enemy Formation Frequency Shuffle
          • -
          • Random Weapon and Armor
          • -
          • Allow Unsafe Pirates
          • -
          • Force Default Starting GP
          • -
          - -

          Minor Upgrades and Bug-Fixes

          -
            -
          • Speed Hacks are now even faster than before in battles.
          • -
          • The SHIP will now appear in the nearest Inner Sea dock (but never a river) to where it is found.
          • -
          • Chaos Rush now unlocks all doors in ToFR and provides the LUTE immediately as well.
          • -
          • Black Belt Absorb Bug Fixed. Black Belt and Master absorb will now always be equal to level if no armor is equipped.
          • -
          • Enemy AoE Spells on all enemies now also hit the caster.
          • -
          • Enemy Elemental Resistences Bug Fixed. XFER will now work, and AFIR when cast by enemies will work.
          • -
          • Ribbon Text Fixed to play nicely with modders editing the ribbon text. Though it may seem strange, ensure when modding the ribbon text to keep its length to 8 characters.
          • -
          • Start screen displays full flags and seed info (was briefly broken by 2.0 changes to flags)
          • -
          • Credits Updates
          • -
          - -

          Version 2.0.0

          -

          New Features

          -
            -
          • NPC Shuffle
          • -
          • Incentivized Locations
          • -
          • Incentivized Main NPCs
          • -
          • Incentivized Fetch Quest NPCs
          • -
          • Incentivized Items
          • -
          • Incentivized Quest Items
          • -
          • Map Edits (Keyless ToFR, Titans Trove, and Open Progression
          • -
          • Free Airship
          • -
          • Free Orbs
          • -
          • Easy Mode
          • -
          - -

          Minor Upgrades and Bug-Fixes

          -
            -
          • Castle Ordeals has moved to the Maps tab and renamed to Castle Ordeals Pillars
          • -
          • Early Bridge was renamed Free Bridge
          • -
          • Early Rod and Early Canoe have been renamed to Early Sarda Item and Early Sage Item
          • -
          - -

          Known Issues

          -
            -
          • A0 HEALs: This can happen with any consumable item but most commonly comes up with HEAL. If you have 99 HEALs from shopping and you open a chest with one inside it will increment it to 100 but the inventory can't display that so it shows A0, A1, A2, etc.
          • -
          • Bridge Scene on the Canal: This is not an error in the randomizer but actually the original game behavior if you walk over the Canal before walking over the Bridge. That just wasn't possible without the map tweaks and you had no reason to try it unless you had the Canoe.
          • -
          • Duplicate Item in Shop: In some flagsets the Caravan Item Slot isn't incentivized or the randomizer runs out of incentive items to put there and it picks a random HEAL or HOUSE instead. Since the Shop shuffle also mixes things up before the item placement, a duplicate item can remain after everything is placed.
          • -
          - -

          Version 1.0 (and Before)

          -

          The log of all changes to previous iterations of the Randomizer were lost when the 2,000 year time loop was reset.

          - -
-
+ + +

Version 4.6.2

+
    +
  • Fixed "Relocate Chests" not working for Sea Shrine.
  • +
  • Fixed a bug with Promo Armor maluses preventing a character from equipping Ribbons/Bracelets/ProRings.
  • +
  • Fixed bonus starting gold blursings giving you twice as much gold as intended.
  • +
  • Fixed Alt-Fiend Shiva accidentally being weak against Ice instead of Fire.
  • +
  • No Ribbon and No Masa maluses now won't appear when those items are banned.
  • +
+ +

Version 4.6.1

+

General & Features

+
    +
  • Upgraded .net to 6.0, which should noticeably increase site performance.
  • +
  • "Highway to Ordeals" Map Edit flag, connecting Lefein to Mirage to Ordeals.
  • +
  • Incentive flag to require Ship+Canal are placed before the Floater.
  • +
  • Unrunnable Formation Count has been converted into a slider, allowing for more precise adjustment and allowing for random ranges.
  • +
  • New Adjustable Tile Damage (lava) slider, letting you set tile damage 0-10 or randomized in a range.
  • +
  • "Innate Magic" blursing sub-flag provides sets of spells that are given at Tier-8 (regardless of the actual tiers of the spells, which can still be learned at their normal level), come with 2MP, and can be given to melee classes: +
      +
    • "Tele Magic" gives WARP & EXIT
    • +
    • "Buff Magic" gives TMPR, FAST, & INV2
    • +
    • "Self Magic" gives RUSE & SABR (melee only)
    • +
    • "Heal Magic" gives CUR3, HEL2, & LIFE; "Heal+ Magic" gives CUR4, HEL3, & LIFE
    • +
    • "Elem Magic" gives ICE2, FIR2, & LIT2; "Elem+ Magic" gives ICE3, FIR3, & LIT3
    • +
    • "Doom Magic" gives three random spells that cause instant death/stone
    • +
    • "Clean Magic" gives three random status ailment cures (which can include LIFE or LIF2)
    • +
    • "Nuke Magic" gives NUKE (rare & spellcasters only)
    • +
    +
  • +
  • Other New Blursings: +
      +
    • +All Shields and +All Gauntlets/All Helmets Blessings
    • +
    • -No Masamune Malus
    • +
    • +/-Gold buffed and made to scale with the flagset's Starting Gold
    • +
    • +Promo Sage and +Promo Fighter Armor Blessings
    • +
    • Starting spell bonuses are now always given at Tier-8 (regardless of the actual tiers of the spells, which can still be learned at their normal level) and come with 2MP.
    • +
    • +More starting spell possibilities: CUR3, HEL2, LOCK/LOK2
    • +
    • -More removed spell possibilities: CUR3, HEL3, INV2, WALL, LOCK/LOK2, FIR3/LIT3/ICE3
    • +
    • -No Knight Armor Malus
    • +
    • -Ninja gets Red Wizard Armor Malus
    • +
    • +Hurt Undead, +Hurt Dragon type-slaying Blessings
    • +
    +
  • +
  • "Flip Dungeons Vertically" flag.
  • +
  • "Balanced Rude" Touch Pool option for those that like things spicier (but still mostly reasonable).
  • +
  • "Shuffle Chime Access" flag.
  • +
  • "Life in Battle" can now be set to only work for LIFE1 and not LIFE2.
  • +
  • WarMECH Mode can now also be set to "Random" or "All".
  • +
  • Class-specific XP can now be adjusted down (to as low as 50%) as well as up.
  • +
  • New Shallow/Deep incentive areas for Volcano.
  • +
  • Shuffle Chime Access flag to change wich location is chime-required.
  • +
+

Bugfixes & Tweaks

+
    +
  • Fixed: Death & Stone Touch effects were never generating with Randomized Status Effects.
  • +
  • Changed Tourney-safe Restrictions to allow more visual modifications.
  • +
  • Fixes & tweaks for Blursings: Addressed language-specific crashes; Thor Master & CatClaw Ace now let you equip those weapons pre-promotion; spell blursings no longer show what tier level they are; bigger Agility boosts; removed some do-nothing blursings for specific cases/classes; removed confusing starting DARK/LAMP maluses; promo-specific blursings no longer available if you cannot promote; starting INV2 instead of INVS; removed RUSE from possible starting spells; "Hunter" renamed "Hurt All"; fixed Shirts + Armor Crafter.
  • +
  • Bugfixes for Proc-gen Overworld relating to Titan's Tunnel, Bridge placement, and more.
  • +
  • Proc-gen Overworld now more likely to require early progression items: Bridge, Ruby, or Canal.
  • +
  • Adjusted equipment tiers: Opal Gauntlets/Helm Legendary->Rare; Power Guantlet Rare->Legendary; Power Rod Common->Rare.
  • +
  • Fixed E/F Shuffle not randomizing some connections properly.
  • +
  • Armor Crafter: Fixed Black Shirt using the wrong spell pool.
  • +
  • Weaponizer & Armor Crafter: Fixed WALL not being included in defensive spell pools.
  • +
  • "Gating" incentive location terminology cleanup.
  • +
  • NOverworld fixes for Archipelago & Key Item Blessings.
  • +
  • Fixed a few bugs concerning Item Magic Pools and Starting Caster Equipment.
  • +
  • Removed 4F Sky from "Swap Stair Locations" (4F Sky already has its own setting).
  • +
  • Ribbon now only included in Legendary Armor Shop pool once instead of three times.
  • +
  • Fixed rare case where a "Forced" party member could result in starting with a promoted character (without any promotions checked).
  • +
  • Archipelago moved from Experimental Tab to Goals Tab.
  • +
  • "Clinics Don't Cost Money" & "Clinics Heal All Statuses" combined into one "Improved Clinics" flag, and moved from Experimental Tab to Shop Tab.
  • +
  • Consolidated Adjustments Tab (fewer checkboxes); Misc. clarity fixes (better tooltips, graying out incompatible flags, etc.)
  • +
+ +

Version 4.5.4

+
    +
  • Bugfixes for Starting Gold & Lockpicking Class Blursings.
  • +
  • Bugfixes for Armor Crafter Power Gauntlet & Weaponizer Chroma/XCalber.
  • +
  • "Wood Adept" Blursing nerfed to give +120 Evasion instead of max.
  • +
  • "Cleaner Blursed Names" QoL flag (makes equipment names easier to read, primarily for Weaponizer/Armor Crafter).
  • +
  • New 7.7% Per Item Progressive Scaling option (to offer something between 5% and 10%).
  • +
  • "Fight Bahamut" now also makes their minions hostile, and they block off the treasure if "Bahamut's Hoard" is active.
  • +
  • WarMech settings now compatible with Deep Dungeon.
  • +
  • Legendary White Magic Shops will no longer have PURE or SOFT as possibilities in most cases.
  • +
  • Weaponizer tweaks: Mid-tier elemental bonuses are more common than strongest & weakest; a few new element combinations & names.
  • +
  • Various text/tooltip cleanup and additions.
  • +
+ +

Version 4.5.2

+

General

+
    +
  • Relocate Chests & Trap Tiles flag.
  • +
  • Swap Stair Locations flag.
  • +
  • Experimental: Open Chests In Order flag.
  • +
  • Bridge to Lefein & River to Melmond map flags; Bridge Incentive.
  • +
  • New Class Blursings; Moved Resist Blursings into the main Blursing set; Key Item Blursing flag.
  • +
  • Starting Gold flag.
  • +
  • Formations: Tiered Shuffle Rarity.
  • +
  • MP Charges Restore on Max MP flag.
  • +
  • Earlier High-Tier Magic Charges flag.
  • +
  • Move ToF Bats flag.
  • +
  • Experimental: Clinics Heal All Statuses & Clinics Don't Cost Money flags.
  • +
  • Randomized Treasures: Use a proportional list instead of weighted odds; include Deep Dungeon's item generation algorithm.
  • +
  • Resources Pack: Added support for spellbook import.
  • +
  • Shuffle Pravoka Shops flag.
  • +
  • 'Half' option for Script & Touch multipliers.
  • +
  • Reduced Luck flag.
  • +
+ +

Interface

+
    +
  • Resources section changed to Wiki section.
  • +
  • New Window when generating a ROM to make it more clear that it is still processing.
  • +
  • Tabs' layout cleanup and update.
  • +
  • ~100 Tooltip edits for more detailed explanations, clarity, and consistency.
  • +
  • Streamlined XP/Gold Scaling, so the flat bonus is now the actual amount gained. ("2.5x + 100" gives the same XP/Gold that "2.5x + 250" used to.)
  • +
+ +

Bug Fixes & Balance

+
    +
  • Non-incentive guaranteed Defense/Offense item no longer plays fanfare.
  • +
  • Tiered Magic Shuffle - TMPR no longer weighted higher.
  • +
  • Slightly buffed BLACK New Consumable.
  • +
  • Improved Tier-1 Spells (FIRE, ICE, LIT, HARM) now sets them to exactly the power of Tier-3 Spells but all single-target (incl. HARM1).
  • +
  • Formally added the "Tournament" Item Magic Pool as "Curated".
  • +
+ +

Quality of Life

+
    +
  • Uninterrupted Music tweaks the Chest SFX to keep music playing.
  • +
  • Lock Respond Rate to keep it maxed.
  • +
  • Disable Damage Tile SFX to make lava less annoying.
  • +
  • Bland Site flag.
  • +
+ +

Version 4.4.0

+

General

+
    +
  • New Presets added.
  • +
  • Power Staff can be incentivized.
  • +
  • Late Loose flag to push loose items farther in the game.
  • +
  • Mermaid Prison flag to lock all the doors on the Mermaids' floor in Sea Shrine.
  • +
  • Improve Fire/Lit/Ice Spells flag.
  • +
  • Guaranteed Defense Item flag to select what defense spell to give to the Power Staff.
  • +
  • Guaranteed Power Item flag to select what strength spell to give to the Power Gauntlet.
  • +
  • Ribbon flag to distribute Ribbons' protection to other pieces of gear.
  • +
  • TRANCE Is Status Element flag.
  • +
+ +

Enemies

+
    +
  • Prevent consecutive Nukes flag to stop Fiends from having two NUKE or NUCLEAR on after the other in their skill/spell lists.
  • +
  • No Empty Scripts flag to prevent enemies from rolling a script with no spells or skills.
  • +
  • Script Count flag to set the number of scripts in the game.
  • +
  • Touch Attack Count flag to set the number of enemies with touch attack.
  • +
  • Script Count flag to set the number of scripts in the game.
  • +
  • Buffed Astos flag.
  • +
  • Unsafe Astos subflag to allow/disallow Astos from disguising itself as the Princess or the King.
  • +
+ +

Version 4.3.2

+ + +

Version 4.3.1

+

This is a bugfix release.

+
    +
  • Fix class malus "can't use bracelets" to be compatible with Armorcrafter
  • +
  • Fix ship location logic bug that could sometimes result in the canal being placed outside the inner sea.
  • +
  • Fix issues with older flag JSONs (such as presets) that contain "SanityCheckerV2: false".
  • +
  • Fix Monster in a Box to work with Deep Dungeon
  • +
  • Disable Hint NPCs when Deep Dungeon is enabled
  • +
+ +

Version 4.3.0

+

Overworld

+
    +
  • New options to procedurally generate completely new overworld maps for infinite new adventures!
  • +
  • New overworld map generator: Standard procgen generates maps in the style of the original game
  • +
  • New overworld map generator: Desert of Death creates a deadly desert
  • +
  • New overworld map generator: Lost Woods creates an endless forest
  • +
  • Procedurally generated maps can be exported and re-imported
  • +
  • Option for overworld desert and marsh tiles to deal damage
  • +
  • Option to enable damage tiles to kill (can even end the game!)
  • +
  • Option to disable minimap
  • +
+ +

Dungeons

+
    +
  • Deep Dungeon: now displays the current floor number on the start menu
  • +
  • Deep Dungeon: option for progressive tilesets (tilesets relate to how deep you are) instead of being totally random
  • +
  • Deep Dungeon: option to choose for where you find TAIL in relation to Bahamut
  • +
  • Deep Dungeon: option to gate access to shortcuts with fiend orbs instead of NPCs that require specific items
  • +
  • Deep Dungeon: new dungeon floor style
  • +
  • Deep Dungeon: fixed direction of stair tiles
  • +
  • Deep Dungeon: Final floor is now the final ToFR floor. If short ToFR is enabled, it will be the short ToFR floor.
  • +
+ +

Graphics & resources

+
    +
  • New Resource Pack feature enabling you to replace a variety of game assets.
  • +
+ +

Other new options and changes

+
    +
  • New option: all enemies have death touch
  • +
  • New option: Individual Class XP Scaling
  • +
  • Option for White Mage HARM spells to do damage to all monsters (extra damage to undead)
  • +
  • New class blursing: natural resistences (e.g. automatic fire resistance)
  • +
  • New option to cap the maximum level below 50
  • +
  • Option to make DARK effect much more effective.
  • +
  • Alternate new consumables: RFRSH/FLARE/BLACK/GUARD and QUICK/HIGH/WIZRD/CLOAK.
  • +
  • Quality of life option to render magic powers and weaknesses using icons instead of text
  • +
  • Make "Can't hold" message red for greater visibility
  • +
  • Additional options to control what kind of monster formations are put into trapped chests
  • +
  • Alternate Key Items placement algorithms
  • +
  • New Item Magic shuffling options
  • +
  • New option: Reduce the number of required orbs
  • +
  • Archipelago support
  • +
+ +

Version 4.2.2

+

Maps and overworld

+
    +
  • Alt Overworld Maps: 3 ProcGen Overworld Maps Preview -- Channel#125, Epic Quest, Archipelago
  • +
  • Alt Overworld Maps: Compatible with E/F Shuffle
  • +
  • Experimental Item Placement Flags: Spread Loose Placement, Forward Loose Placement and Loose Npc Balance
  • +
  • No Overworld: Compatible with E/F Shuffle
  • +
  • New Adjustements Flag: Quick Minimap Load
  • +
+

Gear

+
    +
  • No Item Magic: Remove all spellcasting abilities from gear
  • +
  • Experimental: Armor Crafter
  • +
+

Fun% and Quality of Life

+
    +
  • Split Fun% into Fun% and Quality of Life tabs
  • +
  • New QoL Flag: Renounce InfoChest
  • +
+ +

Version 4.2.1

+
    +
  • Exp Chests: Chests can give out experience points
  • +
  • New Starting Equipement Options: Random Type Weapon and Starter Pack
  • +
  • Gear Info: Include Class Permissions
  • +
  • New Alt Final Boss: The Sahagin Wagon (Kraken 1, Kraken 2, 2-4 R. Sahags and 2-4 WzSahags)
  • +
  • New Alt Final Boss: Snake Pit (Tiamat 1, Tiamat 2, 1-6 Asps and 1-6 Cobras)
  • +
+ +

Version 4.2.0

+

Maps and overworld

+
    +
  • Faster boat -- increase sailing speed of the SHIP to match the AIRSHIP
  • +
  • Map edit: Lefein dock & Gaia mountain pass -- provides access to the Lefein region and Gaia by ship
  • +
  • Map edit: Dragon's Hoard -- moves all the Cardia islands chests to the Bahamut's room
  • +
  • Map edit: Hall of Dragons -- adds encounters to the hallway leading to Bahamut's floor
  • +
  • Map edit: Enable encounters on the Chaos floor
  • +
  • Remove floater -- remove floater from the game
  • + +
  • + Sanity Checker v2 -- the sanity checker is the + component that ensures that items are placed so + that the game is can always be completed. The new "v2" + sanity checker allows for alternate maps with much + more drastic map customization than was possible + previously, such as "No Overworld". +
  • + +
  • + No Overworld -- alternate map option that removes the + overworld entirely, instead directly linking towns and + dungeons with a new system of staircases and portals. +
  • +
+ +

Gear and Items

+
    +
  • + Equipment and Magic info -- press select + while on the magic screen, or in EQUIP mode on the + weapon or armor screen to get extra information + about the selected item or spell. +
  • + +
  • Chestinfo -- show gear stats when opening a chest containing weapon or armor
  • + +
  • Weaponizer -- randomly generate a new set of weapons, with their own stats, special powers, and spellcasting abilities.
  • + +
  • New consumables -- add phoenix down, blast, smoke and full-cure potions to the game
  • + +
  • Start with free equipment
  • + +
  • Exclusive legendary shops -- make it so legendary gear can only be acquired from legendary shops
  • + +
  • + Opening chests containing the incentive item + plays the fanfare, even if it is equipment rather + than a key item. +
  • + +
  • Xcalber can now be incentivized, or banned
  • + +
  • Exclude gold from scaling -- don't scale treasure chest or enemy gold rewards based on prices or XP scaling.
  • + +
  • Can scale prices down to 0
  • +
+ +

Enemies

+
    +
  • Hidden Chaos (Chaos in a random treasure chest)
  • +
  • Mark which chests contain Monster in a Box
  • +
  • Many new options for controlling which chests are protected by Monster in a Box
  • +
  • Spoiler bats -- Sky Warrior bats in Temple of Fiends give hints about the stats of the fiend refights and Chaos.
  • +
  • Obfuscate enemies -- turn every enemy into an Imp
  • +
  • Buff Bahamut -- when "fight Bahamut" is enabled, make him more powerful
  • +
+ +

Party and classes

+
    +
  • Can enable dead characters to gain XP
  • +
  • Thief lockpicking -- once reaching a certain level, a party with a thief can automatically open keylocked doors.
  • +
  • Thief starting agility -- can now choose between 80, 100, 120
  • +
  • Set character maximum level lower than 50
  • +
+ +

Other new options and changes

+
    + +
  • + Load custom player sprites. See + the + Final + Fantasy Randomizer Sprite Compendium + for sprite + sheets you can use and information on making your + own. +
  • + +
  • + Accessible spell names -- Fun% option to rename + some spells to be easier to distinguish +
  • + +
  • Spell name obfuscation -- make spell names inaccessible instead
  • + +
  • + Tabs have been reordered and flags reorganized a + bit to be in a more logical order. +
  • + +
  • + Permalinks -- when visiting the front page, you + are automatically redirected the site for the latest + version. URLs containing seeds and flagsets will + include the version in the domain name, so they can + be safely shared, bookmarked or archived, and will + no longer become invalid when a new version of FFR + is published. +
  • + +
  • + Short ToFR now maintain the requirement to have + the LUTE and KEY to get to Chaos. These can be + removed with the Free Lute and Unlocked ToFR + flags. +
  • + +
  • + Crop friendly mode, changes the background color + of the start and party select screens so it is + easier for the restreamer to identify screen + boundaries when cropping for a race. +
  • + +
  • + Disable spell flash and disable tile flicker + Fun% flags are now enabled by default. They can be + unchecked unless "Tournament Safe ROM" is enabled. +
  • + +
  • + When "Tournament Safe ROM" is enabled, always + enables "Disable Damage Tile Flicker", "Disable + Spell Cast Flash" and "Crop Friendly" flags. +
  • + +
  • + Can opt-in to "Slow Screen Wipes", "Slow Battle + Messages" and "Slow Map Move". This enables players + who experience motion sickness from the "speed + hacks" to run seeds where "speed hacks" are enabled. +
  • + +
  • The "Blind seed" option is now called "Hide flags".
  • + +
  • + When "Generate Spoiler Log" is enabled, it will + be downloaded as a text file instead of appearing in + the browser console +
  • + +
  • + The enemizer enemy "BUM" has been renamed to the + more tasteful "CHAMP". +
  • +
+ +

Version 4.1.6

+
    +
  • Bugfix so that spellcasting blessings don't override spellcasting maluses.
  • +
+ +

Version 4.1.5

+

Version 4.1.4

+

Version 4.1.3

+

Version 4.1.2

+ +
    +
  • Spring Tournament 2021 announcements & updates to presets
  • +
+ +

Version 4.1.1

+

New Features

+
    +
  • Gaia Shortcut
  • +
  • Add Coneria to Town Shuffle
  • +
  • Add ToFR Exit
  • +
  • Include Lute Plate in Short ToFR
  • +
  • Melmondish Hospitality
  • +
  • Vampire Attacks Random Town
  • +
  • Bahamut Cardia Dock
  • +
  • Extensive Hint Flag
  • +
  • Shop Reduction
  • +
  • Legendary Shops
  • +
  • Consumable Treasure Stack Size
  • +
  • More Consumable Chests
  • +
  • Magic Shop Locations: Paired Shuffle
  • +
  • Nones Gain XP
  • +
  • Turn Shelters into Ethers
  • +
  • Deep Dungeon
  • +
  • Alternate Fiends
  • +
  • Fight Bahamut
  • +
  • Random Incentive Location Selection
  • +
  • No Loose Items in Incentivized Dungeons
  • +
  • Chance to Run
  • +
  • Starting Levels
  • +
  • Thief Agility Buff
  • +
  • Fun%: Titan Snack
  • +
+ +

Version 4.0.1

+

New Content

+
    +
  • Change Log
  • +
  • Resources Section
  • +
+ +

Version 4.0.0

+

New Features

+
    +
  • New Site Layout Released
  • +
  • Blind Seed
  • +
  • Unrunnable Formations (Drop Down)
  • +
  • Trapped Chests
  • +
  • Trapped Chests: WarMECH, Guardian of the Masamune
  • +
  • Trapped Chests: Trapped Shards
  • +
  • Scary Imps
  • +
  • Randomly Flip Dungeons Floors
  • +
  • Incentivize Random Chest In Location
  • +
  • Incentivize Random Chest In Location: Include Mirage and TFC
  • +
  • Free Lute
  • +
  • Guaranteed Masamune
  • +
  • Send Masamune Home
  • +
  • No Masamune
  • +
  • Price Scaling (Double-Slider)
  • +
  • Starting Item Sets (Drop Down)
  • +
+ +

Minor Upgrades and Bug-Fixes

+
    +
  • Improved Weapon Type Bonus Values
  • +
  • Removed Everything Unrunnable
  • +
  • Removed Everything Runnable
  • +
  • Removed Enemy Formations Unrunnable
  • +
  • Removed NPC Hint Givers: Randomized in Dungeons
  • +
  • Removed Linear MP Growth
  • +
  • Removed v2 Placement
  • +
+ + +

Version 3.3.0

+

New Features

+
    +
  • Short ToFR: Preserve All Fiend Refights
  • +
  • All Weapons Cast Magic
  • +
  • All Weapons Cast Magic: Balanced Shuffle
  • +
  • Power Word Threshold
  • +
  • Everything Runnable
  • +
  • Remove Trap Tiles
  • +
  • Lich's Revenge
  • +
  • Free Canoe
  • +
  • Shop Info
  • +
  • Pacifist Bosses
  • +
  • Evade Cap Value (Drop Down)
  • +
+ +

Version 3.2.0

+

New Features

+
    +
  • Magic Levels: Tiered Shuffle
  • +
  • Magic: Mixed Spellbooks
  • +
  • Swole Pirates
  • +
  • Enemy Skills & Spells: Tiered Shuffle
  • +
  • Map Edits: Dwarves and Northwest Passage (Seperate Option)
  • +
  • Map Edits: Ryukahn Airship Dock (Option)
  • +
  • Incentivize Katana
  • +
  • Early King
  • +
  • Buy Ten (Legacy Flag)
  • +
  • Battle Magic Menu Wrap Around
  • +
  • Remove Tail
  • +
  • Characters Gated by Fiends
  • +
  • Characters Gated by NPC Key Items
  • +
  • Gated Characters: Forced Characters
  • +
  • Gated Characters: Allow Duplicates
  • +
  • Gated Characters: Allow Promoted Classes
  • +
  • Boss and Enemy Stats: Double-Sliders
  • +
  • Boss and ENemy Stats: Seperate HP from Pool
  • +
  • Party Composition: Allow Promoted Classes
  • +
  • Save Game When Game Over
  • +
  • Save Game When Game Over: Dragon Warrior Mode
  • +
  • Shuffle Astos
  • +
  • Buff Healing Spells
  • +
  • NPC Hint Givers: Villagers
  • +
  • NPC Hint Givers: In Dungeons
  • +
  • NPC Hint Givers: RNG Dungeon Placement
  • +
  • NPC Hint Givers: Useless Hints
  • +
  • Blursed Weapons: Exclude Masamune
  • +
  • Blursed Weapons and Armor: Double-Sliders
  • +
  • Balanced Item Magic Shuffle
  • +
  • Party Draft
  • +
  • Party Draft: Pool Size
  • +
  • Party Draft: Include Promoted Classes
  • +
  • Enable Random Promotions
  • +
  • Enable Random Promotions: Include Base Classes
  • +
  • Enable Random Promotions: Class Spoilers
  • +
  • Linear MP Growth
  • +
  • Blursed Classes
  • +
  • Blursed Classes: Chaos Mode
  • +
  • Magic Charges for Classes (Sliders)
  • +
  • Lock Hit Mode (Drop Down)
  • +
  • Allow Unsafe Start Area
  • +
  • Earlier Ruby
  • +
  • Guaranteed Ruse Item
  • +
  • Disable Stun Touch
  • +
  • Disable Spell Cast Flashing (Fun %)
  • +
  • Multi-Instrumentalist Sara (Fun %)
  • +
  • Hurray Dwarf Fate (Fun %)
  • +
  • Renounce Autosort (Fun %)
  • +
+ +

Minor Upgrades and Bug-Fixes

+
    +
  • Removed Rebalance Spells
  • +
  • Removed Enemy Scale Factor
  • +
  • Removed Boss Scale Factor
  • +
  • Removed Boss and Enemy HP Clamps
  • +
+ +

Version 3.1.0

+

New Features

+
    +
  • ShardCount ShardCount
  • +
  • Magic Shop Location Shuffle
  • +
  • Fix Missing Battle RNG Entry
  • +
  • Shuffle Enemy Scripts: Bosses Only
  • +
  • Shuffle Eenemy Skills: Bosses Only
  • +
  • Open Progression: Northern Docks
  • +
  • Incentivize Vorpal
  • +
  • Black Blet Crit Rate
  • +
  • Weapon Crit Rate
  • +
  • Weapon Bonuses
  • +
  • Inventory Autosort
  • +
  • Recruitment Mode: Replace Only Nones
  • +
  • Randomize Enemies: Enemizer
  • +
  • World Wealth WorldWealth
  • +
  • Generate New Spellbook (Spellcrafter)
  • +
  • Spellcrafter: Mix Spellbooks
  • +
  • Spellcrafter: Retain Permissions
  • +
  • All Spell Levels for Knight and Ninja
  • +
  • Free Tail
  • +
  • Random Weapon Bonus (Blursed)
  • +
  • Random Armor Bonus (Blursed)
  • +
  • Mapman Slot (Fun %)
  • +
+ +

Version 3.0.0

+

New Features

+
    +
  • New Site Layout Released
  • +
  • Spoilers Log
  • +
  • Rebalance Spells
  • +
  • Everything Unrunnable
  • +
  • Unrunnables Strike First and Surprise
  • +
  • Random Status Attacks
  • +
  • Lefeinish Hospitality
  • +
  • Entrance Shuffle: Allow Deep Towns
  • +
  • EntrancesShuffle: Includes Dead Ends
  • +
  • EntrancesShuffle: Entrances Mixed with Towns
  • +
  • Incentivize Main Items
  • +
  • Incentivize Canoe Item
  • +
  • Incentivize Floater
  • +
  • Incentivize Ship and Canal
  • +
  • Classic Item Placement (v2 Placement)
  • +
  • Incentivize Titans Trove
  • +
  • Better Trap Chests
  • +
  • Free Ship
  • +
  • Houses Fill HP
  • +
  • NPC Guillotine
  • +
  • Fix Hit Chance Cap
  • +
  • Tavern Recruitment Mode
  • +
  • Taverns: Hire Only Option
  • +
  • Generated Waterfall
  • +
  • Generated Earth 1
  • +
  • Generated Earth 2
  • +
  • Shuffle the Original Fiends
  • +
  • Disable Overworld Saving
  • +
  • Disable Inn Saving
  • +
  • Randomize Formations (Enemizer)
  • +
  • Improved Thief Hit Rate
  • +
  • Magic Defense Options (Drop Down)
  • +
  • Menu Color (Fun %)
  • +
+ +

Version 2.6.0

+

New Features

+
    +
  • Better Trap Treasure
  • +
+ +

Version 2.5.0

+

New Features

+
    +
  • None Class
  • +
  • Party Composition
  • +
  • Random Shops
  • +
  • Enemy Formations Frequency (Drop Down)
  • +
  • Randomized Treasures (Total Randomization)
  • +
  • Shuffle Objective NPCs
  • +
  • Disable Damage Tile Flicker
  • +
  • Three Battle Palettes (Fun %)
  • +
+ +

Minor Upgrades and Bug-Fixes

+
    +
  • Fix a bug where the Mystic Key could have been placed in the first two chests of the Temple of Fiends Revisited.
  • +
+ +

Version 2.4.0

+

New Features

+
    +
  • Entrance Shuffle
  • +
  • Encounter Rate (Sliders)
  • +
  • Trap Tile Shuffle
  • +
  • Extended Open Progression
  • +
  • Shortened Temple of Fiends Revisited (Short ToFR)
  • +
  • Zozo Melmond
  • +
  • Static EXP Distribution
  • +
  • Confused Old Men
  • +
  • Critical Hit Count
  • +
+ +

Minor Upgrades and Bug-Fixes

+
    +
  • The venerable Enable Buy 10 Convenience now includes the Caravan!
  • +
  • Speed Hacks now accelerates the lineup screen when shuffling party members.
  • +
  • Scale Boss Stats now operates independently of the rest of the monsters.
  • +
  • Include Morale is now explicit for enemy stat scaling. Uncheck this to force vanilla morale.
  • +
+ +

Version 2.3.0

+

New Features

+
    +
  • WarMECH Mode (Drop Down)
  • +
  • EXP/Gold Progressive Scaling
  • +
+ +

Version 2.2.0

+

New Features

+
    +
  • Treasure Hunt (Shards)
  • +
  • Surprise (Alternate) Final Boss
  • +
  • Improved Turn Order Randomization
  • +
+ +

Minor Upgrades and Bug-Fixes

+
    +
  • Enable Dash is now reversed. Running is the default speed now; holding B will slow to half pace.
  • +
  • Change Unrunnable RUN -> WAIT now defaults to enabled.
  • +
+ +

Version 2.1.0

+

New Features

+
    +
  • Unrunnable Formations Shuffle
  • +
  • Change Unrunnable RUN to WAIT
  • +
  • Surprise Bonus Shuffle
  • +
  • Enemy Formation Frequency Shuffle
  • +
  • Random Weapon and Armor
  • +
  • Allow Unsafe Pirates
  • +
  • Force Default Starting GP
  • +
+ +

Minor Upgrades and Bug-Fixes

+
    +
  • Speed Hacks are now even faster than before in battles.
  • +
  • The SHIP will now appear in the nearest Inner Sea dock (but never a river) to where it is found.
  • +
  • Chaos Rush now unlocks all doors in ToFR and provides the LUTE immediately as well.
  • +
  • Black Belt Absorb Bug Fixed. Black Belt and Master absorb will now always be equal to level if no armor is equipped.
  • +
  • Enemy AoE Spells on all enemies now also hit the caster.
  • +
  • Enemy Elemental Resistences Bug Fixed. XFER will now work, and AFIR when cast by enemies will work.
  • +
  • Ribbon Text Fixed to play nicely with modders editing the ribbon text. Though it may seem strange, ensure when modding the ribbon text to keep its length to 8 characters.
  • +
  • Start screen displays full flags and seed info (was briefly broken by 2.0 changes to flags)
  • +
  • Credits Updates
  • +
+ +

Version 2.0.0

+

New Features

+
    +
  • NPC Shuffle
  • +
  • Incentivized Locations
  • +
  • Incentivized Main NPCs
  • +
  • Incentivized Fetch Quest NPCs
  • +
  • Incentivized Items
  • +
  • Incentivized Quest Items
  • +
  • Map Edits (Keyless ToFR, Titans Trove, and Open Progression
  • +
  • Free Airship
  • +
  • Free Orbs
  • +
  • Easy Mode
  • +
+ +

Minor Upgrades and Bug-Fixes

+
    +
  • Castle Ordeals has moved to the Maps tab and renamed to Castle Ordeals Pillars
  • +
  • Early Bridge was renamed Free Bridge
  • +
  • Early Rod and Early Canoe have been renamed to Early Sarda Item and Early Sage Item
  • +
+ +

Known Issues

+
    +
  • A0 HEALs: This can happen with any consumable item but most commonly comes up with HEAL. If you have 99 HEALs from shopping and you open a chest with one inside it will increment it to 100 but the inventory can't display that so it shows A0, A1, A2, etc.
  • +
  • Bridge Scene on the Canal: This is not an error in the randomizer but actually the original game behavior if you walk over the Canal before walking over the Bridge. That just wasn't possible without the map tweaks and you had no reason to try it unless you had the Canoe.
  • +
  • Duplicate Item in Shop: In some flagsets the Caravan Item Slot isn't incentivized or the randomizer runs out of incentive items to put there and it picks a random HEAL or HOUSE instead. Since the Shop shuffle also mixes things up before the item placement, a duplicate item can remain after everything is placed.
  • +
+ +

Version 1.0 (and Before)

+

The log of all changes to previous iterations of the Randomizer were lost when the 2,000 year time loop was reset.

+ +
+ + diff --git a/FF1Blazorizer/Tabs/AdjustmentsTab.razor b/FF1Blazorizer/Tabs/AdjustmentsTab.razor index ddce798a3..7df75d1cf 100644 --- a/FF1Blazorizer/Tabs/AdjustmentsTab.razor +++ b/FF1Blazorizer/Tabs/AdjustmentsTab.razor @@ -44,7 +44,8 @@ Faster Walking Speed Faster Ship Identify Treasures - Buy Quantity + Chests Appear Opened + Buy Quantity Change Unrunnable RUN to WAIT Critical Hit Count Battle Magic Menu Wrap Around diff --git a/FF1Blazorizer/Tabs/ClassesTab.razor b/FF1Blazorizer/Tabs/ClassesTab.razor index a296e0a3a..c3c495d44 100644 --- a/FF1Blazorizer/Tabs/ClassesTab.razor +++ b/FF1Blazorizer/Tabs/ClassesTab.razor @@ -8,9 +8,9 @@

Class Balance

Halve BB Crit Rate - Double Thief & Ninja Hit% Growth + Adjust Thief & Ninja Hit% Growth + Adjust Red Mage & Red Wizard Hit% Growth Better Thief & Ninja Agility - Raise Hit % Cap MDEF Growth: Improved HARM for White Mage Thief Lockpicking diff --git a/FF1Blazorizer/Tabs/DungeonsTab.razor b/FF1Blazorizer/Tabs/DungeonsTab.razor index 84484b627..2cf082a14 100644 --- a/FF1Blazorizer/Tabs/DungeonsTab.razor +++ b/FF1Blazorizer/Tabs/DungeonsTab.razor @@ -25,11 +25,10 @@ Bahamut's Hoard Hall of Dragons Mermaid Prison - Generated Waterfall Cave
Flip Dungeons Horizontally Flip Dungeons Vertically - Swap Stair Locations + Swap Stair Locations
Relocate Chests and Trap Tiles Relocated Trap Tiles Are Marked @@ -48,6 +47,7 @@ Confused Old Men Add Gaia Shortcut Move Gaia Item Shop + Add Lefien Shortcut Lefeinish Hospitality Add Lefein SuperStore Shuffle Pravoka's Shops diff --git a/FF1Blazorizer/Tabs/EnemiesTab.razor b/FF1Blazorizer/Tabs/EnemiesTab.razor index 15a645c06..46dc7d68a 100644 --- a/FF1Blazorizer/Tabs/EnemiesTab.razor +++ b/FF1Blazorizer/Tabs/EnemiesTab.razor @@ -20,7 +20,9 @@ Remove Boss Scripts Shuffle Scripts Shuffle Skills & Spells - No Consecutive NUKE or NUCLEAR + Temple Of Fiends Only + Overworld Fiends Only + No Consecutive NUKE or NUCLEAR
@@ -68,7 +70,8 @@ Final Fantasy 4 Final Fantasy 5 Final Fantasy 6 - Black Orb Rising + Winners Circle + Black Orb Rising

Bahamut

diff --git a/FF1Blazorizer/Tabs/FileTab.razor b/FF1Blazorizer/Tabs/FileTab.razor index fcf945b6b..f84232261 100644 --- a/FF1Blazorizer/Tabs/FileTab.razor +++ b/FF1Blazorizer/Tabs/FileTab.razor @@ -31,6 +31,7 @@ Tournament Safe ROM Generate Spoiler Log! Print Class Blursings + Show Reveal Randomized State Flags Button Hide Flags

Seed: @@ -57,6 +58,7 @@

@((MarkupString)StatusMessage)

 
+ Generate ROM
@@ -242,6 +244,30 @@ UpdateAction?.Invoke("UpdateFlagstring",""); } + public void CollapseTriStates() { + if (_fileData == null) + { + SetStatusMessage("Reveal Failed: No ROM File Selected!"); + StateHasChanged(); + return; + } + + //All of this is needed to convert the tristate flags. + //A better way would probably be to pull the rng initialization out of the rom class. + //Update it as flags/seed change then give it back to rom during seed gen. + using (var stream = new MemoryStream(_fileData)) + { + _rom = new FF1Rom(stream); + } + Flags flagsForRng = Flags.ShallowCopy(); + _rom.GenerateRng(flagsForRng, Blob.FromHex(_seed)); + Flags = FF1Lib.Flags.ConvertAllTriState(flagsForRng, FF1Lib.FF1Rom.rng); + + //Reloads page with new flags + //Surely there's a better way to do this + NavigationManager.NavigateTo(NavigationManager.BaseUri + "?s=" + _seed + "&f=" + Flags.Encoded, true); + } + async Task OnRandomize(MouseEventArgs e) { if (_fileData == null) @@ -321,6 +347,7 @@ try { Utilities.SpoilerCache = string.Empty; + Utilities.FlagCache = string.Empty; _rom.ProgressCallback = this.Progress; @@ -328,7 +355,14 @@ SetModalContent(""); ShowModal(true); SetGenerating(true); - await _rom.Randomize(seed, Flags, Preferences); + + Flags tempFlags = await _rom.Randomize(seed, Flags, Preferences); + + if (Flags.TriState){ + Flags = tempFlags; + Flagstring = Flags.Encoded; + } + string BlursingsText = "
Class Blursings:

" + ("\n\n" + _rom.SpoilBlursings()) .Replace("\n\nFighter", "

Fighter") .Replace("\n\nThief", "

Thief") @@ -368,7 +402,6 @@ await JSRuntime.InvokeAsync("downloadFile", $"FFR_{_seed}_{_rom.GetHash()}.nes", encoded); - if(Flags.Spoilers && Utilities.SpoilerCache.Length > 0) { var encodedSpoiler = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(Utilities.SpoilerCache)); @@ -393,6 +426,7 @@ SetModalContent(modalContent + "
" + StatusMessage); SetGenerating(false); } + StateHasChanged(); } } diff --git a/FF1Blazorizer/Tabs/FunTab.razor b/FF1Blazorizer/Tabs/FunTab.razor index fc192bb71..7d4b59e70 100644 --- a/FF1Blazorizer/Tabs/FunTab.razor +++ b/FF1Blazorizer/Tabs/FunTab.razor @@ -13,6 +13,7 @@ Multi-instrumentalist Sara Titan's Favorite Snack: Hurray Dwarf's Fate: + Fun Fountain Text Random Shard Names Palette Swap Modern Battlefield diff --git a/FF1Blazorizer/Tabs/GoalTab.razor b/FF1Blazorizer/Tabs/GoalTab.razor index 53dc43c63..e10dd0825 100644 --- a/FF1Blazorizer/Tabs/GoalTab.razor +++ b/FF1Blazorizer/Tabs/GoalTab.razor @@ -14,7 +14,12 @@

Temple of Fiends

Mode - Fiends Refights + @if (Flags.ToFRMode == ToFRMode.Short) + { + Fiends Refights + } else { + Fiends Refights + } Unlocked ToFR Add ToFR Exit Add Chaos Floor Encounters diff --git a/FF1Blazorizer/Tabs/QoLTab.razor b/FF1Blazorizer/Tabs/QoLTab.razor index 906ba1291..0e3843943 100644 --- a/FF1Blazorizer/Tabs/QoLTab.razor +++ b/FF1Blazorizer/Tabs/QoLTab.razor @@ -19,6 +19,7 @@ Accessible Spell Names Cleaner Blursed Names Shop Information Icons + Magic Shop Menus Match Equipment Shops Menus Crop Friendly Quick Controller 2 Reset
diff --git a/FF1Blazorizer/Tabs/ShopsTab.razor b/FF1Blazorizer/Tabs/ShopsTab.razor index ecda872b2..5ec864350 100644 --- a/FF1Blazorizer/Tabs/ShopsTab.razor +++ b/FF1Blazorizer/Tabs/ShopsTab.razor @@ -54,6 +54,9 @@ Power Word Threshold: Enable Soft in Battle Life in Battle: +
Sleep
+ Player Wake HP RNG Range: + @* Enemy Wake HP RNG Range: *@

Spell Crafter

diff --git a/FF1Blazorizer/Tabs/TreasuresTab.razor b/FF1Blazorizer/Tabs/TreasuresTab.razor index 5792ac336..a7fd11a2e 100644 --- a/FF1Blazorizer/Tabs/TreasuresTab.razor +++ b/FF1Blazorizer/Tabs/TreasuresTab.razor @@ -36,7 +36,7 @@ Exclude Common Treasures Exclude Incentivized Items Trapped Chests are Marked -
+

Freebies

diff --git a/FF1Blazorizer/output/wwwroot/_framework/System.Xml.Linq.dll b/FF1Blazorizer/output/wwwroot/_framework/System.Xml.Linq.dll deleted file mode 100644 index 5bfebabd1..000000000 Binary files a/FF1Blazorizer/output/wwwroot/_framework/System.Xml.Linq.dll and /dev/null differ diff --git a/FF1Blazorizer/output/wwwroot/_framework/System.Xml.Linq.dll.br b/FF1Blazorizer/output/wwwroot/_framework/System.Xml.Linq.dll.br deleted file mode 100644 index 00f93c585..000000000 Binary files a/FF1Blazorizer/output/wwwroot/_framework/System.Xml.Linq.dll.br and /dev/null differ diff --git a/FF1Blazorizer/output/wwwroot/_framework/System.Xml.Linq.dll.gz b/FF1Blazorizer/output/wwwroot/_framework/System.Xml.Linq.dll.gz deleted file mode 100644 index 4ac5ddbe6..000000000 Binary files a/FF1Blazorizer/output/wwwroot/_framework/System.Xml.Linq.dll.gz and /dev/null differ diff --git a/FF1Blazorizer/output/wwwroot/_framework/dotnet.6.0.27.23owh3yvu8.js b/FF1Blazorizer/output/wwwroot/_framework/dotnet.6.0.27.23owh3yvu8.js deleted file mode 100644 index d07c4854f..000000000 --- a/FF1Blazorizer/output/wwwroot/_framework/dotnet.6.0.27.23owh3yvu8.js +++ /dev/null @@ -1,320 +0,0 @@ -var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;var nodeFS;var nodePath;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);return nodeFS["readFileSync"](filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var STACK_ALIGN=16;function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;return Math.ceil(size/factor)*factor}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}function convertJsFunctionToWasm(func,sig){if(typeof WebAssembly.Function==="function"){var typeNames={"i":"i32","j":"i64","f":"f32","d":"f64"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for getValue: "+type)}return null}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();TTY.init();SOCKFS.root=FS.mount(SOCKFS,{},null);callRuntimeCallbacks(__ATINIT__)}function exitRuntime(){runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile="dotnet.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"env":asmLibraryArg,"wasi_snapshot_preview1":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["memory"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["__indirect_function_table"];addOnInit(Module["asm"]["__wasm_call_ctors"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){var result=WebAssembly.instantiate(binary,info);return result}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;var ASM_CONSTS={577172:function($0,$1){MONO.string_decoder.decode($0,$0+$1,true)},577223:function($0,$1,$2){var js_str=MONO.string_decoder.copy($0);try{var res=eval(js_str);setValue($2,0,"i32");if(res===null||res===undefined)return 0;else res=res.toString()}catch(e){res=e.toString();setValue($2,1,"i32");if(res===null||res===undefined)res="unknown exception";var stack=e.stack;if(stack){if(stack.startsWith(res))res=stack;else res+="\n"+stack}}var buff=Module._malloc((res.length+1)*2);stringToUTF16(res,buff,(res.length+1)*2);setValue($1,res.length,"i32");return buff},577778:function($0,$1,$2,$3,$4){var log_level=$0;var message=Module.UTF8ToString($1);var isFatal=$2;var domain=Module.UTF8ToString($3);var dataPtr=$4;if(MONO["logging"]&&MONO.logging["trace"]){MONO.logging.trace(domain,log_level,message,isFatal,dataPtr);return}if(isFatal)console.trace(message);switch(Module.UTF8ToString($0)){case"critical":case"error":console.error(message);break;case"warning":console.warn(message);break;case"message":console.log(message);break;case"info":console.info(message);break;case"debug":console.debug(message);break;default:console.log(message);break}},578402:function($0,$1){var level=$0;var message=Module.UTF8ToString($1);var namespace="Debugger.Debug";if(MONO["logging"]&&MONO.logging["debugger"]){MONO.logging.debugger(level,message);return}console.debug("%s: %s",namespace,message)},578642:function($0,$1,$2,$3){MONO.mono_wasm_add_dbg_command_received($0,$1,$2,$3)},578704:function($0,$1,$2,$3){MONO.mono_wasm_add_dbg_command_received($0,$1,$2,$3)},578766:function($0,$1,$2,$3){MONO.mono_wasm_add_dbg_command_received($0,$1,$2,$3)},578828:function($0,$1,$2,$3){MONO.mono_wasm_add_dbg_command_received($0,$1,$2,$3)},578890:function($0,$1){MONO.mono_wasm_add_dbg_command_received(1,0,$0,$1)}};function compile_function(snippet_ptr,len,is_exception){try{var data=MONO.string_decoder.decode(snippet_ptr,snippet_ptr+len);var wrapper="(function () { "+data+" })";var funcFactory=eval(wrapper);var func=funcFactory();if(typeof func!=="function"){throw new Error("Code must return an instance of a JavaScript function. "+"Please use `return` statement to return a function.")}setValue(is_exception,0,"i32");return BINDING.js_to_mono_obj(func,true)}catch(e){res=e.toString();setValue(is_exception,1,"i32");if(res===null||res===undefined)res="unknown exception";return BINDING.js_to_mono_obj(res,true)}}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){wasmTable.get(func)()}else{wasmTable.get(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function demangle(func){return func}function demangleAll(text){var regex=/\b_Z[\w\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"})}function jsStackTrace(){var error=new Error;if(!error.stack){try{throw new Error}catch(e){error=e}if(!error.stack){return"(no stack trace available)"}}return error.stack.toString()}var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+UTF8ToString(condition)+", at: "+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else _emscripten_get_now=function(){return performance.now()};var _emscripten_get_now_is_monotonic=true;function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if((clk_id===1||clk_id===4)&&_emscripten_get_now_is_monotonic){now=_emscripten_get_now()}else{setErrNo(28);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function ___clock_gettime(a0,a1){return _clock_gettime(a0,a1)}var ExceptionInfoAttrs={DESTRUCTOR_OFFSET:0,REFCOUNT_OFFSET:4,TYPE_OFFSET:8,CAUGHT_OFFSET:12,RETHROWN_OFFSET:13,SIZE:16};function ___cxa_allocate_exception(size){return _malloc(size+ExceptionInfoAttrs.SIZE)+ExceptionInfoAttrs.SIZE}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-ExceptionInfoAttrs.SIZE;this.set_type=function(type){HEAP32[this.ptr+ExceptionInfoAttrs.TYPE_OFFSET>>2]=type};this.get_type=function(){return HEAP32[this.ptr+ExceptionInfoAttrs.TYPE_OFFSET>>2]};this.set_destructor=function(destructor){HEAP32[this.ptr+ExceptionInfoAttrs.DESTRUCTOR_OFFSET>>2]=destructor};this.get_destructor=function(){return HEAP32[this.ptr+ExceptionInfoAttrs.DESTRUCTOR_OFFSET>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr+ExceptionInfoAttrs.REFCOUNT_OFFSET>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+ExceptionInfoAttrs.CAUGHT_OFFSET>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+ExceptionInfoAttrs.CAUGHT_OFFSET>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+ExceptionInfoAttrs.RETHROWN_OFFSET>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+ExceptionInfoAttrs.RETHROWN_OFFSET>>0]!=0};this.init=function(type,destructor){this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){var value=HEAP32[this.ptr+ExceptionInfoAttrs.REFCOUNT_OFFSET>>2];HEAP32[this.ptr+ExceptionInfoAttrs.REFCOUNT_OFFSET>>2]=value+1};this.release_ref=function(){var prev=HEAP32[this.ptr+ExceptionInfoAttrs.REFCOUNT_OFFSET>>2];HEAP32[this.ptr+ExceptionInfoAttrs.REFCOUNT_OFFSET>>2]=prev-1;return prev===1}}function CatchInfo(ptr){this.free=function(){_free(this.ptr);this.ptr=0};this.set_base_ptr=function(basePtr){HEAP32[this.ptr>>2]=basePtr};this.get_base_ptr=function(){return HEAP32[this.ptr>>2]};this.set_adjusted_ptr=function(adjustedPtr){var ptrSize=4;HEAP32[this.ptr+ptrSize>>2]=adjustedPtr};this.get_adjusted_ptr=function(){var ptrSize=4;return HEAP32[this.ptr+ptrSize>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_exception_info().get_type());if(isPointer){return HEAP32[this.get_base_ptr()>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.get_base_ptr()};this.get_exception_info=function(){return new ExceptionInfo(this.get_base_ptr())};if(ptr===undefined){this.ptr=_malloc(8);this.set_adjusted_ptr(0)}else{this.ptr=ptr}}var exceptionCaught=[];function exception_addRef(info){info.add_ref()}var uncaughtExceptionCount=0;function ___cxa_begin_catch(ptr){var catchInfo=new CatchInfo(ptr);var info=catchInfo.get_exception_info();if(!info.get_caught()){info.set_caught(true);uncaughtExceptionCount--}info.set_rethrown(false);exceptionCaught.push(catchInfo);exception_addRef(info);return catchInfo.get_exception_ptr()}var exceptionLast=0;function ___cxa_free_exception(ptr){return _free(new ExceptionInfo(ptr).ptr)}function exception_decRef(info){if(info.release_ref()&&!info.get_rethrown()){var destructor=info.get_destructor();if(destructor){wasmTable.get(destructor)(info.excPtr)}___cxa_free_exception(info.excPtr)}}function ___cxa_end_catch(){_setThrew(0);var catchInfo=exceptionCaught.pop();exception_decRef(catchInfo.get_exception_info());catchInfo.free();exceptionLast=0}function ___resumeException(catchInfoPtr){var catchInfo=new CatchInfo(catchInfoPtr);var ptr=catchInfo.get_base_ptr();if(!exceptionLast){exceptionLast=ptr}catchInfo.free();throw ptr}function ___cxa_find_matching_catch_3(){var thrown=exceptionLast;if(!thrown){setTempRet0(0);return 0|0}var info=new ExceptionInfo(thrown);var thrownType=info.get_type();var catchInfo=new CatchInfo;catchInfo.set_base_ptr(thrown);if(!thrownType){setTempRet0(0);return catchInfo.ptr|0}var typeArray=Array.prototype.slice.call(arguments);var stackTop=stackSave();var exceptionThrowBuf=stackAlloc(4);HEAP32[exceptionThrowBuf>>2]=thrown;for(var i=0;i>2];if(thrown!==adjusted){catchInfo.set_adjusted_ptr(adjusted)}setTempRet0(caughtType);return catchInfo.ptr|0}}stackRestore(stackTop);setTempRet0(thrownType);return catchInfo.ptr|0}function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto==="object"&&typeof crypto["getRandomValues"]==="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return function(){return crypto_module["randomBytes"](1)[0]}}catch(e){}}return function(){abort("randomDevice")}}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:function(from,to){from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){var alignedSize=alignMemory(size,65536);var ptr=_malloc(alignedSize);while(size=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:function(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:function(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:function(node){FS.hashRemoveNode(node)},isRoot:function(node){return node===node.parent},isMountpoint:function(node){return!!node.mounted},isFile:function(mode){return(mode&61440)===32768},isDir:function(mode){return(mode&61440)===16384},isLink:function(mode){return(mode&61440)===40960},isChrdev:function(mode){return(mode&61440)===8192},isBlkdev:function(mode){return(mode&61440)===24576},isFIFO:function(mode){return(mode&61440)===4096},isSocket:function(mode){return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:function(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:function(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:function(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:function(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:function(fd){return FS.streams[fd]},createStream:function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=function(){};FS.FSStream.prototype={object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}}}}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:function(fd){FS.streams[fd]=null},chrdev_stream_ops:{open:function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:function(){throw new FS.ErrnoError(70)}},major:function(dev){return dev>>8},minor:function(dev){return dev&255},makedev:function(ma,mi){return ma<<8|mi},registerDevice:function(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:function(dev){return FS.devices[dev]},getMounts:function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:function(parent,name){return parent.node_ops.lookup(parent,name)},mknod:function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){FS.forceLoadFile(node);var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},doMkdir:function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0},doMknod:function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}FS.mknod(path,mode,dev);return 0},doReadlink:function(path,buf,bufsize){if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len},doAccess:function(path,amode){if(amode&~7){return-28}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0},doDup:function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd},doReadv:function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream},get64:function(low,high){return low}};function ___sys_access(path,amode){try{path=SYSCALLS.getStr(path);return SYSCALLS.doAccess(path,amode)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_chdir(path){try{path=SYSCALLS.getStr(path);FS.chdir(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_chmod(path,mode){try{path=SYSCALLS.getStr(path);FS.chmod(path,mode);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var ERRNO_CODES={EPERM:63,ENOENT:44,ESRCH:71,EINTR:27,EIO:29,ENXIO:60,E2BIG:1,ENOEXEC:45,EBADF:8,ECHILD:12,EAGAIN:6,EWOULDBLOCK:6,ENOMEM:48,EACCES:2,EFAULT:21,ENOTBLK:105,EBUSY:10,EEXIST:20,EXDEV:75,ENODEV:43,ENOTDIR:54,EISDIR:31,EINVAL:28,ENFILE:41,EMFILE:33,ENOTTY:59,ETXTBSY:74,EFBIG:22,ENOSPC:51,ESPIPE:70,EROFS:69,EMLINK:34,EPIPE:64,EDOM:18,ERANGE:68,ENOMSG:49,EIDRM:24,ECHRNG:106,EL2NSYNC:156,EL3HLT:107,EL3RST:108,ELNRNG:109,EUNATCH:110,ENOCSI:111,EL2HLT:112,EDEADLK:16,ENOLCK:46,EBADE:113,EBADR:114,EXFULL:115,ENOANO:104,EBADRQC:103,EBADSLT:102,EDEADLOCK:16,EBFONT:101,ENOSTR:100,ENODATA:116,ETIME:117,ENOSR:118,ENONET:119,ENOPKG:120,EREMOTE:121,ENOLINK:47,EADV:122,ESRMNT:123,ECOMM:124,EPROTO:65,EMULTIHOP:36,EDOTDOT:125,EBADMSG:9,ENOTUNIQ:126,EBADFD:127,EREMCHG:128,ELIBACC:129,ELIBBAD:130,ELIBSCN:131,ELIBMAX:132,ELIBEXEC:133,ENOSYS:52,ENOTEMPTY:55,ENAMETOOLONG:37,ELOOP:32,EOPNOTSUPP:138,EPFNOSUPPORT:139,ECONNRESET:15,ENOBUFS:42,EAFNOSUPPORT:5,EPROTOTYPE:67,ENOTSOCK:57,ENOPROTOOPT:50,ESHUTDOWN:140,ECONNREFUSED:14,EADDRINUSE:3,ECONNABORTED:13,ENETUNREACH:40,ENETDOWN:38,ETIMEDOUT:73,EHOSTDOWN:142,EHOSTUNREACH:23,EINPROGRESS:26,EALREADY:7,EDESTADDRREQ:17,EMSGSIZE:35,EPROTONOSUPPORT:66,ESOCKTNOSUPPORT:137,EADDRNOTAVAIL:4,ENETRESET:39,EISCONN:30,ENOTCONN:53,ETOOMANYREFS:141,EUSERS:136,EDQUOT:19,ESTALE:72,ENOTSUP:138,ENOMEDIUM:148,EILSEQ:25,EOVERFLOW:61,ECANCELED:11,ENOTRECOVERABLE:56,EOWNERDEAD:62,ESTRPIPE:135};var SOCKFS={mount:function(mount){Module["websocket"]=Module["websocket"]&&"object"===typeof Module["websocket"]?Module["websocket"]:{};Module["websocket"]._callbacks={};Module["websocket"]["on"]=function(event,callback){if("function"===typeof callback){this._callbacks[event]=callback}return this};Module["websocket"].emit=function(event,param){if("function"===typeof this._callbacks[event]){this._callbacks[event].call(this,param)}};return FS.createNode(null,"/",16384|511,0)},createSocket:function(family,type,protocol){type&=~526336;var streaming=type==1;if(protocol){assert(streaming==(protocol==6))}var sock={family:family,type:type,protocol:protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node:node,flags:2,seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock},getSocket:function(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock},stream_ops:{poll:function(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)},ioctl:function(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)},read:function(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length},write:function(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)},close:function(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)}},nextname:function(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return"socket["+SOCKFS.nextname.current+++"]"},websocket_sock_ops:{createPeer:function(sock,addr,port){var ws;if(typeof addr==="object"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);if(!result){throw new Error("WebSocket URL must be in the format ws(s)://address:port")}addr=result[1];port=parseInt(result[2],10)}}else{try{var runtimeConfig=Module["websocket"]&&"object"===typeof Module["websocket"];var url="ws:#".replace("#","//");if(runtimeConfig){if("string"===typeof Module["websocket"]["url"]){url=Module["websocket"]["url"]}}if(url==="ws://"||url==="wss://"){var parts=addr.split("/");url=url+parts[0]+":"+port+"/"+parts.slice(1).join("/")}var subProtocols="binary";if(runtimeConfig){if("string"===typeof Module["websocket"]["subprotocol"]){subProtocols=Module["websocket"]["subprotocol"]}}var opts=undefined;if(subProtocols!=="null"){subProtocols=subProtocols.replace(/^ +| +$/g,"").split(/ *, */);opts=ENVIRONMENT_IS_NODE?{"protocol":subProtocols.toString()}:subProtocols}if(runtimeConfig&&null===Module["websocket"]["subprotocol"]){subProtocols="null";opts=undefined}var WebSocketConstructor;if(ENVIRONMENT_IS_NODE){WebSocketConstructor=require("ws")}else{WebSocketConstructor=WebSocket}ws=new WebSocketConstructor(url,opts);ws.binaryType="arraybuffer"}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH)}}var peer={addr:addr,port:port,socket:ws,dgram_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!=="undefined"){peer.dgram_send_queue.push(new Uint8Array([255,255,255,255,"p".charCodeAt(0),"o".charCodeAt(0),"r".charCodeAt(0),"t".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer},getPeer:function(sock,addr,port){return sock.peers[addr+":"+port]},addPeer:function(sock,peer){sock.peers[peer.addr+":"+peer.port]=peer},removePeer:function(sock,peer){delete sock.peers[peer.addr+":"+peer.port]},handlePeerEvents:function(sock,peer){var first=true;var handleOpen=function(){Module["websocket"].emit("open",sock.stream.fd);try{var queued=peer.dgram_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.dgram_send_queue.shift()}}catch(e){peer.socket.close()}};function handleMessage(data){if(typeof data==="string"){var encoder=new TextEncoder;data=encoder.encode(data)}else{assert(data.byteLength!==undefined);if(data.byteLength==0){return}else{data=new Uint8Array(data)}}var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]==="p".charCodeAt(0)&&data[5]==="o".charCodeAt(0)&&data[6]==="r".charCodeAt(0)&&data[7]==="t".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data:data});Module["websocket"].emit("message",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on("open",handleOpen);peer.socket.on("message",function(data,flags){if(!flags.binary){return}handleMessage(new Uint8Array(data).buffer)});peer.socket.on("close",function(){Module["websocket"].emit("close",sock.stream.fd)});peer.socket.on("error",function(error){sock.error=ERRNO_CODES.ECONNREFUSED;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])})}else{peer.socket.onopen=handleOpen;peer.socket.onclose=function(){Module["websocket"].emit("close",sock.stream.fd)};peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=function(error){sock.error=ERRNO_CODES.ECONNREFUSED;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])}}},poll:function(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=16}return mask},ioctl:function(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}HEAP32[arg>>2]=bytes;return 0;default:return ERRNO_CODES.EINVAL}},close:function(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255)}function inetNtop6(ints){var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=inetNtop4(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word>1];var port=_ntohs(HEAPU16[sa+2>>1]);var addr;switch(family){case 2:if(salen!==16){return{errno:28}}addr=HEAP32[sa+4>>2];addr=inetNtop4(addr);break;case 10:if(salen!==28){return{errno:28}}addr=[HEAP32[sa+8>>2],HEAP32[sa+12>>2],HEAP32[sa+16>>2],HEAP32[sa+20>>2]];addr=inetNtop6(addr);break;default:return{errno:5}}return{family:family,addr:addr,port:port}}function getSocketAddress(addrp,addrlen,allowNull){if(allowNull&&addrp===0)return null;var info=readSockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}function ___sys_connect(fd,addr,addrlen){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.connect(sock,info.addr,info.port);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_fadvise64_64(fd,offset,len,advice){return 0}function ___sys_fchmod(fd,mode){try{FS.fchmod(fd,mode);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_fstat64(fd,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_fstatfs64(fd,size,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return ___sys_statfs64(0,size,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_ftruncate64(fd,zero,low,high){try{var length=SYSCALLS.get64(low,high);FS.ftruncate(fd,length);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd);if(size>>0,(tempDouble=id,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos>>2]=tempI64[0],HEAP32[dirp+pos+4>>2]=tempI64[1];tempI64=[(idx+1)*struct_size>>>0,(tempDouble=(idx+1)*struct_size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos+8>>2]=tempI64[0],HEAP32[dirp+pos+12>>2]=tempI64[1];HEAP16[dirp+pos+16>>1]=280;HEAP8[dirp+pos+18>>0]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size;idx+=1}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_getpid(){return 42}function ___sys_getrusage(who,usage){try{_memset(usage,0,136);HEAP32[usage>>2]=1;HEAP32[usage+4>>2]=2;HEAP32[usage+8>>2]=3;HEAP32[usage+12>>2]=4;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_link(oldpath,newpath){return-34}function ___sys_lstat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_madvise1(addr,length,advice){return 0}function ___sys_mkdir(path,mode){try{path=SYSCALLS.getStr(path);return SYSCALLS.doMkdir(path,mode)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function syscallMmap2(addr,len,prot,flags,fd,off){off<<=12;var ptr;var allocated=false;if((flags&16)!==0&&addr%65536!==0){return-28}if((flags&32)!==0){ptr=_memalign(65536,len);if(!ptr)return-48;_memset(ptr,0,len);allocated=true}else{var info=FS.getStream(fd);if(!info)return-8;var res=FS.mmap(info,addr,len,off,prot,flags);ptr=res.ptr;allocated=res.allocated}SYSCALLS.mappings[ptr]={malloc:ptr,len:len,allocated:allocated,fd:fd,prot:prot,flags:flags,offset:off};return ptr}function ___sys_mmap2(addr,len,prot,flags,fd,off){try{return syscallMmap2(addr,len,prot,flags,fd,off)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_msync(addr,len,flags){try{var info=SYSCALLS.mappings[addr];if(!info)return 0;SYSCALLS.doMsync(addr,FS.getStream(info.fd),len,info.flags,0);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function syscallMunmap(addr,len){if((addr|0)===-1||len===0){return-28}var info=SYSCALLS.mappings[addr];if(!info)return 0;if(len===info.len){var stream=FS.getStream(info.fd);if(stream){if(info.prot&2){SYSCALLS.doMsync(addr,stream,len,info.flags,info.offset)}FS.munmap(stream)}SYSCALLS.mappings[addr]=null;if(info.allocated){_free(info.malloc)}}return 0}function ___sys_munmap(addr,len){try{return syscallMunmap(addr,len)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_open(path,flags,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(path);var mode=varargs?SYSCALLS.get():0;var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_readlink(path,buf,bufsize){try{path=SYSCALLS.getStr(path);return SYSCALLS.doReadlink(path,buf,bufsize)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function inetPton4(str){var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0}function jstoi_q(str){return parseInt(str)}function inetPton6(str){var words;var w,offset,z;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.startsWith("::")){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=jstoi_q(words[words.length-4])+jstoi_q(words[words.length-3])*256;words[words.length-3]=jstoi_q(words[words.length-2])+jstoi_q(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w>2]=16}HEAP16[sa>>1]=family;HEAP32[sa+4>>2]=addr;HEAP16[sa+2>>1]=_htons(port);tempI64=[0>>>0,(tempDouble=0,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[sa+8>>2]=tempI64[0],HEAP32[sa+12>>2]=tempI64[1];break;case 10:addr=inetPton6(addr);if(addrlen){HEAP32[addrlen>>2]=28}HEAP32[sa>>2]=family;HEAP32[sa+8>>2]=addr[0];HEAP32[sa+12>>2]=addr[1];HEAP32[sa+16>>2]=addr[2];HEAP32[sa+20>>2]=addr[3];HEAP16[sa+2>>1]=_htons(port);HEAP32[sa+4>>2]=0;HEAP32[sa+24>>2]=0;break;default:return 5}return 0}var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name:function(name){var res=inetPton4(name);if(res!==null){return name}res=inetPton6(name);if(res!==null){return name}var addr;if(DNS.address_map.addrs[name]){addr=DNS.address_map.addrs[name]}else{var id=DNS.address_map.id++;assert(id<65535,"exceeded max address mappings of 65535");addr="172.29."+(id&255)+"."+(id&65280);DNS.address_map.names[addr]=name;DNS.address_map.addrs[name]=addr}return addr},lookup_addr:function(addr){if(DNS.address_map.names[addr]){return DNS.address_map.names[addr]}return null}};function ___sys_recvfrom(fd,buf,len,flags,addr,addrlen){try{var sock=getSocketFromFD(fd);var msg=sock.sock_ops.recvmsg(sock,len);if(!msg)return 0;if(addr){var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(msg.addr),msg.port,addrlen)}HEAPU8.set(msg.buffer,buf);return msg.buffer.byteLength}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_rename(old_path,new_path){try{old_path=SYSCALLS.getStr(old_path);new_path=SYSCALLS.getStr(new_path);FS.rename(old_path,new_path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_sendto(fd,message,length,flags,addr,addr_len){try{var sock=getSocketFromFD(fd);var dest=getSocketAddress(addr,addr_len,true);if(!dest){return FS.write(sock.stream,HEAP8,message,length)}else{return sock.sock_ops.sendmsg(sock,HEAP8,message,length,dest.addr,dest.port)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_setsockopt(fd){try{return-50}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_shutdown(fd,how){try{getSocketFromFD(fd);return-52}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_socket(domain,type,protocol){try{var sock=SOCKFS.createSocket(domain,type,protocol);return sock.stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_symlink(target,linkpath){try{target=SYSCALLS.getStr(target);linkpath=SYSCALLS.getStr(linkpath);FS.symlink(target,linkpath);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_unlink(path){try{path=SYSCALLS.getStr(path);FS.unlink(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_utimensat(dirfd,path,times,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path,true);var seconds=HEAP32[times>>2];var nanoseconds=HEAP32[times+4>>2];var atime=seconds*1e3+nanoseconds/(1e3*1e3);times+=8;seconds=HEAP32[times>>2];nanoseconds=HEAP32[times+4>>2];var mtime=seconds*1e3+nanoseconds/(1e3*1e3);FS.utime(path,atime,mtime);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _abort(){abort()}function _emscripten_get_now_res(){if(ENVIRONMENT_IS_NODE){return 1}else if(typeof dateNow!=="undefined"){return 1e3}else return 1e3}function _clock_getres(clk_id,res){var nsec;if(clk_id===0){nsec=1e3*1e3}else if(clk_id===1&&_emscripten_get_now_is_monotonic){nsec=_emscripten_get_now_res()}else{setErrNo(28);return-1}HEAP32[res>>2]=nsec/1e9|0;HEAP32[res+4>>2]=nsec;return 0}function _difftime(time1,time0){return time1-time0}var DOTNETENTROPY={batchedQuotaMax:65536,getBatchedRandomValues:function(buffer,bufferLength){for(var i=0;i>=2;while(ch=HEAPU8[sigPtr++]){var double=ch<105;if(double&&buf&1)buf++;readAsmConstArgsArray.push(double?HEAPF64[buf++>>1]:HEAP32[buf]);++buf}return readAsmConstArgsArray}function _emscripten_asm_const_int(code,sigPtr,argbuf){var args=readAsmConstArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)}function _emscripten_get_heap_max(){return 2147483648}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=2147483648;if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}function _emscripten_thread_sleep(msecs){var start=_emscripten_get_now();while(_emscripten_get_now()-start>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAP32[penviron_buf_size>>2]=bufSize;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _exit(status){exit(status)}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_fdstat_get(fd,pbuf){try{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4;HEAP8[pbuf>>0]=type;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_pread(fd,iov,iovcnt,offset_low,offset_high,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doReadv(stream,iov,iovcnt,offset_low);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_pwrite(fd,iov,iovcnt,offset_low,offset_high,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doWritev(stream,iov,iovcnt,offset_low);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doReadv(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var stream=SYSCALLS.getStreamFromFD(fd);var HIGH_OFFSET=4294967296;var offset=offset_high*HIGH_OFFSET+(offset_low>>>0);var DOUBLE_LIMIT=9007199254740992;if(offset<=-DOUBLE_LIMIT||offset>=DOUBLE_LIMIT){return-61}FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_sync(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);if(stream.stream_ops&&stream.stream_ops.fsync){return-stream.stream_ops.fsync(stream)}return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doWritev(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _flock(fd,operation){return 0}var GAI_ERRNO_MESSAGES={};function _gai_strerror(val){var buflen=256;if(!_gai_strerror.buffer){_gai_strerror.buffer=_malloc(buflen);GAI_ERRNO_MESSAGES["0"]="Success";GAI_ERRNO_MESSAGES[""+-1]="Invalid value for 'ai_flags' field";GAI_ERRNO_MESSAGES[""+-2]="NAME or SERVICE is unknown";GAI_ERRNO_MESSAGES[""+-3]="Temporary failure in name resolution";GAI_ERRNO_MESSAGES[""+-4]="Non-recoverable failure in name res";GAI_ERRNO_MESSAGES[""+-6]="'ai_family' not supported";GAI_ERRNO_MESSAGES[""+-7]="'ai_socktype' not supported";GAI_ERRNO_MESSAGES[""+-8]="SERVICE not supported for 'ai_socktype'";GAI_ERRNO_MESSAGES[""+-10]="Memory allocation failure";GAI_ERRNO_MESSAGES[""+-11]="System error returned in 'errno'";GAI_ERRNO_MESSAGES[""+-12]="Argument buffer overflow"}var msg="Unknown error";if(val in GAI_ERRNO_MESSAGES){if(GAI_ERRNO_MESSAGES[val].length>buflen-1){msg="Message too long"}else{msg=GAI_ERRNO_MESSAGES[val]}}writeAsciiToMemory(msg,_gai_strerror.buffer);return _gai_strerror.buffer}function _getTempRet0(){return getTempRet0()}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}function _gmtime_r(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();HEAP32[tmPtr+36>>2]=0;HEAP32[tmPtr+32>>2]=0;var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;if(!_gmtime_r.GMTString)_gmtime_r.GMTString=allocateUTF8("GMT");HEAP32[tmPtr+40>>2]=_gmtime_r.GMTString;return tmPtr}function _llvm_eh_typeid_for(type){return type}function _tzset(){if(_tzset.called)return;_tzset.called=true;var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAP32[__get_timezone()>>2]=stdTimezoneOffset*60;HEAP32[__get_daylight()>>2]=Number(winterOffset!=summerOffset);function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocateUTF8(winterName);var summerNamePtr=allocateUTF8(summerName);if(summerOffset>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}var MONO={pump_count:0,timeout_queue:[],spread_timers_maximum:0,_vt_stack:[],mono_wasm_runtime_is_ready:false,mono_wasm_ignore_pdb_load_errors:true,_id_table:{},pump_message:function(){if(!this.mono_background_exec)this.mono_background_exec=Module.cwrap("mono_background_exec",null);while(MONO.timeout_queue.length>0){--MONO.pump_count;MONO.timeout_queue.shift()()}while(MONO.pump_count>0){--MONO.pump_count;this.mono_background_exec()}},export_functions:function(module){module["pump_message"]=MONO.pump_message.bind(MONO);module["prevent_timer_throttling"]=MONO.prevent_timer_throttling.bind(MONO);module["mono_wasm_set_timeout_exec"]=MONO.mono_wasm_set_timeout_exec.bind(MONO);module["mono_load_runtime_and_bcl"]=MONO.mono_load_runtime_and_bcl.bind(MONO);module["mono_load_runtime_and_bcl_args"]=MONO.mono_load_runtime_and_bcl_args.bind(MONO);module["mono_wasm_load_bytes_into_heap"]=MONO.mono_wasm_load_bytes_into_heap.bind(MONO);module["mono_wasm_load_icu_data"]=MONO.mono_wasm_load_icu_data.bind(MONO);module["mono_wasm_get_icudt_name"]=MONO.mono_wasm_get_icudt_name.bind(MONO);module["mono_wasm_globalization_init"]=MONO.mono_wasm_globalization_init.bind(MONO);module["mono_wasm_get_loaded_files"]=MONO.mono_wasm_get_loaded_files.bind(MONO);module["mono_wasm_new_root_buffer"]=MONO.mono_wasm_new_root_buffer.bind(MONO);module["mono_wasm_new_root_buffer_from_pointer"]=MONO.mono_wasm_new_root_buffer_from_pointer.bind(MONO);module["mono_wasm_new_root"]=MONO.mono_wasm_new_root.bind(MONO);module["mono_wasm_new_roots"]=MONO.mono_wasm_new_roots.bind(MONO);module["mono_wasm_release_roots"]=MONO.mono_wasm_release_roots.bind(MONO);module["mono_wasm_load_config"]=MONO.mono_wasm_load_config.bind(MONO)},_base64Converter:{_base64Table:["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","+","/"],_makeByteReader:function(bytes,index,count){var position=typeof index==="number"?index:0;var endpoint;if(typeof count==="number")endpoint=position+count;else endpoint=bytes.length-position;var result={read:function(){if(position>=endpoint)return false;var nextByte=bytes[position];position+=1;return nextByte}};Object.defineProperty(result,"eof",{get:function(){return position>=endpoint},configurable:true,enumerable:true});return result},toBase64StringImpl:function(inArray,offset,length){var reader=this._makeByteReader(inArray,offset,length);var result="";var ch1=0,ch2=0,ch3=0,bits=0,equalsCount=0,sum=0;var mask1=(1<<24)-1,mask2=(1<<18)-1,mask3=(1<<12)-1,mask4=(1<<6)-1;var shift1=18,shift2=12,shift3=6,shift4=0;while(true){ch1=reader.read();ch2=reader.read();ch3=reader.read();if(ch1===false)break;if(ch2===false){ch2=0;equalsCount+=1}if(ch3===false){ch3=0;equalsCount+=1}sum=ch1<<16|ch2<<8|ch3<<0;bits=(sum&mask1)>>shift1;result+=this._base64Table[bits];bits=(sum&mask2)>>shift2;result+=this._base64Table[bits];if(equalsCount<2){bits=(sum&mask3)>>shift3;result+=this._base64Table[bits]}if(equalsCount===2){result+="=="}else if(equalsCount===1){result+="="}else{bits=(sum&mask4)>>shift4;result+=this._base64Table[bits]}}return result}},_mono_wasm_root_buffer_prototype:{_throw_index_out_of_range:function(){throw new Error("index out of range")},_check_in_range:function(index){if(index>=this.__count||index<0)this._throw_index_out_of_range()},get_address:function(index){this._check_in_range(index);return this.__offset+index*4},get_address_32:function(index){this._check_in_range(index);return this.__offset32+index},get:function(index){this._check_in_range(index);return Module.HEAP32[this.get_address_32(index)]},set:function(index,value){Module.HEAP32[this.get_address_32(index)]=value;return value},_unsafe_get:function(index){return Module.HEAP32[this.__offset32+index]},_unsafe_set:function(index,value){Module.HEAP32[this.__offset32+index]=value},clear:function(){if(this.__offset)MONO._zero_region(this.__offset,this.__count*4)},release:function(){if(this.__offset&&this.__ownsAllocation){MONO.mono_wasm_deregister_root(this.__offset);MONO._zero_region(this.__offset,this.__count*4);Module._free(this.__offset)}this.__handle=this.__offset=this.__count=this.__offset32=0},toString:function(){return"[root buffer @"+this.get_address(0)+", size "+this.__count+"]"}},_scratch_root_buffer:null,_scratch_root_free_indices:null,_scratch_root_free_indices_count:0,_scratch_root_free_instances:[],_mono_wasm_root_prototype:{get_address:function(){return this.__buffer.get_address(this.__index)},get_address_32:function(){return this.__buffer.get_address_32(this.__index)},get:function(){var result=this.__buffer._unsafe_get(this.__index);return result},set:function(value){this.__buffer._unsafe_set(this.__index,value);return value},valueOf:function(){return this.get()},clear:function(){this.set(0)},release:function(){const maxPooledInstances=128;if(MONO._scratch_root_free_instances.length>maxPooledInstances){MONO._mono_wasm_release_scratch_index(this.__index);this.__buffer=0;this.__index=0}else{this.set(0);MONO._scratch_root_free_instances.push(this)}},toString:function(){return"[root @"+this.get_address()+"]"}},_mono_wasm_release_scratch_index:function(index){if(index===undefined)return;this._scratch_root_buffer.set(index,0);this._scratch_root_free_indices[this._scratch_root_free_indices_count]=index;this._scratch_root_free_indices_count++},_mono_wasm_claim_scratch_index:function(){if(!this._scratch_root_buffer){const maxScratchRoots=8192;this._scratch_root_buffer=this.mono_wasm_new_root_buffer(maxScratchRoots,"js roots");this._scratch_root_free_indices=new Int32Array(maxScratchRoots);this._scratch_root_free_indices_count=maxScratchRoots;for(var i=0;i= 1");capacity=capacity|0;var capacityBytes=capacity*4;var offset=Module._malloc(capacityBytes);if(offset%4!==0)throw new Error("Malloc returned an unaligned offset");this._zero_region(offset,capacityBytes);var result=Object.create(this._mono_wasm_root_buffer_prototype);result.__offset=offset;result.__offset32=offset/4|0;result.__count=capacity;result.length=capacity;result.__handle=this.mono_wasm_register_root(offset,capacityBytes,msg||0);result.__ownsAllocation=true;return result},mono_wasm_new_root_buffer_from_pointer:function(offset,capacity,msg){if(!this.mono_wasm_register_root||!this.mono_wasm_deregister_root){this.mono_wasm_register_root=Module.cwrap("mono_wasm_register_root","number",["number","number","string"]);this.mono_wasm_deregister_root=Module.cwrap("mono_wasm_deregister_root",null,["number"])}if(capacity<=0)throw new Error("capacity >= 1");capacity=capacity|0;var capacityBytes=capacity*4;if(offset%4!==0)throw new Error("Unaligned offset");this._zero_region(offset,capacityBytes);var result=Object.create(this._mono_wasm_root_buffer_prototype);result.__offset=offset;result.__offset32=offset/4|0;result.__count=capacity;result.length=capacity;result.__handle=this.mono_wasm_register_root(offset,capacityBytes,msg||0);result.__ownsAllocation=false;return result},mono_wasm_new_root:function(value){var result;if(this._scratch_root_free_instances.length>0){result=this._scratch_root_free_instances.pop()}else{var index=this._mono_wasm_claim_scratch_index();var buffer=this._scratch_root_buffer;result=Object.create(this._mono_wasm_root_prototype);result.__buffer=buffer;result.__index=index}if(value!==undefined){if(typeof value!=="number")throw new Error("value must be an address in the managed heap");result.set(value)}else{result.set(0)}return result},mono_wasm_new_roots:function(count_or_values){var result;if(Array.isArray(count_or_values)){result=new Array(count_or_values.length);for(var i=0;i0){result=new Array(count_or_values);for(var i=0;ithis._debugger_buffer_len){if(this._debugger_buffer)Module._free(this._debugger_buffer);this._debugger_buffer_len=Math.max(command_parameters.length,this._debugger_buffer_len,256);this._debugger_buffer=Module._malloc(this._debugger_buffer_len)}this._debugger_heap_bytes=new Uint8Array(Module.HEAPU8.buffer,this._debugger_buffer,this._debugger_buffer_len);this._debugger_heap_bytes.set(this._base64_to_uint8(command_parameters))},mono_wasm_send_dbg_command_with_parms:function(id,command_set,command,command_parameters,length,valtype,newvalue){this.mono_wasm_malloc_and_set_debug_buffer(command_parameters);this._c_fn_table.mono_wasm_send_dbg_command_with_parms_wrapper(id,command_set,command,this._debugger_buffer,length,valtype,newvalue.toString());let{res_ok:res_ok,res:res}=MONO.commands_received.remove(id);if(!res_ok)throw new Error(`Failed on mono_wasm_invoke_method_debugger_agent_with_parms`);return res},mono_wasm_send_dbg_command:function(id,command_set,command,command_parameters){this.mono_wasm_malloc_and_set_debug_buffer(command_parameters);this._c_fn_table.mono_wasm_send_dbg_command_wrapper(id,command_set,command,this._debugger_buffer,command_parameters.length);let{res_ok:res_ok,res:res}=MONO.commands_received.remove(id);if(!res_ok)throw new Error(`Failed on mono_wasm_send_dbg_command`);return res},mono_wasm_get_dbg_command_info:function(){let{res_ok:res_ok,res:res}=MONO.commands_received.remove(0);if(!res_ok)throw new Error(`Failed on mono_wasm_get_dbg_command_info`);return res},_get_cfo_res_details:function(objectId,args){if(!(objectId in this._call_function_res_cache))throw new Error(`Could not find any object with id ${objectId}`);const real_obj=this._call_function_res_cache[objectId];const descriptors=Object.getOwnPropertyDescriptors(real_obj);if(args.accessorPropertiesOnly){Object.keys(descriptors).forEach(k=>{if(descriptors[k].get===undefined)Reflect.deleteProperty(descriptors,k)})}let res_details=[];Object.keys(descriptors).forEach(k=>{let new_obj;let prop_desc=descriptors[k];if(typeof prop_desc.value=="object"){new_obj=Object.assign({name:k},prop_desc)}else if(prop_desc.value!==undefined){new_obj={name:k,value:Object.assign({type:typeof prop_desc.value,description:""+prop_desc.value},prop_desc)}}else if(prop_desc.get!==undefined){new_obj={name:k,get:{className:"Function",description:`get ${k} () {}`,type:"function"}}}else{new_obj={name:k,value:{type:"symbol",value:"",description:""}}}res_details.push(new_obj)});return{__value_as_json_string__:JSON.stringify(res_details)}},mono_wasm_get_details:function(objectId,args={}){return this._get_cfo_res_details(`dotnet:cfo_res:${objectId}`,args)},_cache_call_function_res:function(obj){const id=`dotnet:cfo_res:${this._next_call_function_res_id++}`;this._call_function_res_cache[id]=obj;return id},mono_wasm_release_object:function(objectId){if(objectId in this._cache_call_function_res)delete this._cache_call_function_res[objectId]},_create_proxy_from_object_id:function(objectId,details){if(objectId.startsWith("dotnet:array:")){if(details.items===undefined){const ret=details.map(p=>p.value);return ret}if(details.dimensionsDetails==undefined||details.dimensionsDetails.length==1){const ret=details.items.map(p=>p.value);return ret}}let proxy={};Object.keys(details).forEach(p=>{var prop=details[p];if(prop.get!==undefined){Object.defineProperty(proxy,prop.name,{get(){return MONO.mono_wasm_send_dbg_command(prop.get.id,prop.get.commandSet,prop.get.command,prop.get.buffer,prop.get.length)},set:function(newValue){MONO.mono_wasm_send_dbg_command_with_parms(prop.set.id,prop.set.commandSet,prop.set.command,prop.set.buffer,prop.set.length,prop.set.valtype,newValue);return true}})}else if(prop.set!==undefined){Object.defineProperty(proxy,prop.name,{get(){return prop.value},set:function(newValue){MONO.mono_wasm_send_dbg_command_with_parms(prop.set.id,prop.set.commandSet,prop.set.command,prop.set.buffer,prop.set.length,prop.set.valtype,newValue);return true}})}else{proxy[prop.name]=prop.value}});return proxy},mono_wasm_call_function_on:function(request){if(request.arguments!=undefined&&!Array.isArray(request.arguments))throw new Error(`"arguments" should be an array, but was ${request.arguments}`);const objId=request.objectId;const details=request.details;let proxy;if(objId.startsWith("dotnet:cfo_res:")){if(objId in this._call_function_res_cache)proxy=this._call_function_res_cache[objId];else throw new Error(`Unknown object id ${objId}`)}else{proxy=this._create_proxy_from_object_id(objId,details)}const fn_args=request.arguments!=undefined?request.arguments.map(a=>JSON.stringify(a.value)):[];const fn_eval_str=`var fn = ${request.functionDeclaration}; fn.call (proxy, ...[${fn_args}]);`;const fn_res=eval(fn_eval_str);if(fn_res===undefined)return{type:"undefined"};if(Object(fn_res)!==fn_res){if(typeof fn_res=="object"&&fn_res==null)return{type:typeof fn_res,subtype:`${fn_res}`,value:null};return{type:typeof fn_res,description:`${fn_res}`,value:`${fn_res}`}}if(request.returnByValue&&fn_res.subtype==undefined)return{type:"object",value:fn_res};if(Object.getPrototypeOf(fn_res)==Array.prototype){const fn_res_id=this._cache_call_function_res(fn_res);return{type:"object",subtype:"array",className:"Array",description:`Array(${fn_res.length})`,objectId:fn_res_id}}if(fn_res.value!==undefined||fn_res.subtype!==undefined){return fn_res}if(fn_res==proxy)return{type:"object",className:"Object",description:"Object",objectId:objId};const fn_res_id=this._cache_call_function_res(fn_res);return{type:"object",className:"Object",description:"Object",objectId:fn_res_id}},_clear_per_step_state:function(){this._next_id_var=0;this._id_table={}},mono_wasm_debugger_resume:function(){this._clear_per_step_state()},mono_wasm_detach_debugger:function(){if(!this.mono_wasm_set_is_debugger_attached)this.mono_wasm_set_is_debugger_attached=Module.cwrap("mono_wasm_set_is_debugger_attached","void",["bool"]);this.mono_wasm_set_is_debugger_attached(false)},_register_c_fn:function(name,...args){Object.defineProperty(this._c_fn_table,name+"_wrapper",{value:Module.cwrap(name,...args)})},_register_c_var_fn:function(name,ret_type,params){if(ret_type!=="bool")throw new Error(`Bug: Expected a C function signature that returns bool`);this._register_c_fn(name,ret_type,params);Object.defineProperty(this,name+"_info",{value:function(...args){MONO.var_info=[];const res_ok=MONO._c_fn_table[name+"_wrapper"](...args);let res=MONO.var_info;MONO.var_info=[];if(res_ok){res=this._fixup_name_value_objects(res);return{res_ok:res_ok,res:res}}return{res_ok:res_ok,res:undefined}}})},mono_wasm_runtime_ready:function(){MONO.commands_received=new Map;MONO.commands_received.remove=function(key){const value=this.get(key);this.delete(key);return value};this.mono_wasm_runtime_is_ready=true;this._clear_per_step_state();this._next_call_function_res_id=0;this._call_function_res_cache={};this._c_fn_table={};this._register_c_fn("mono_wasm_send_dbg_command","bool",["number","number","number","number","number"]);this._register_c_fn("mono_wasm_send_dbg_command_with_parms","bool",["number","number","number","number","number","number","string"]);this._debugger_buffer_len=-1;if(globalThis.dotnetDebugger)debugger;else console.debug("mono_wasm_runtime_ready","fe00e07a-5519-4dfe-b35a-f867dbaf2e28")},mono_wasm_setenv:function(name,value){if(!this.wasm_setenv)this.wasm_setenv=Module.cwrap("mono_wasm_setenv",null,["string","string"]);this.wasm_setenv(name,value)},mono_wasm_set_runtime_options:function(options){if(!this.wasm_parse_runtime_options)this.wasm_parse_runtime_options=Module.cwrap("mono_wasm_parse_runtime_options",null,["number","number"]);var argv=Module._malloc(options.length*4);var wasm_strdup=Module.cwrap("mono_wasm_strdup","number",["string"]);let aindex=0;for(var i=0;i0?virtualName.substr(0,lastSlash):null;var fileName=lastSlash>0?virtualName.substr(lastSlash+1):virtualName;if(fileName.startsWith("/"))fileName=fileName.substr(1);if(parentDirectory){if(ctx.tracing)console.log("MONO_WASM: Creating directory '"+parentDirectory+"'");var pathRet=ctx.createPath("/",parentDirectory,true,true)}else{parentDirectory="/"}if(ctx.tracing)console.log("MONO_WASM: Creating file '"+fileName+"' in directory '"+parentDirectory+"'");if(!this.mono_wasm_load_data_archive(bytes,parentDirectory)){var fileRet=ctx.createDataFile(parentDirectory,fileName,bytes,true,true,true)}break;default:throw new Error("Unrecognized asset behavior:",asset.behavior,"for asset",asset.name)}if(asset.behavior==="assembly"){var hasPpdb=ctx.mono_wasm_add_assembly(virtualName,offset,bytes.length);if(!hasPpdb){var index=ctx.loaded_files.findIndex(element=>element.file==virtualName);ctx.loaded_files.splice(index,1)}}else if(asset.behavior==="icu"){if(this.mono_wasm_load_icu_data(offset))ctx.num_icu_assets_loaded_successfully+=1;else console.error("Error loading ICU asset",asset.name)}else if(asset.behavior==="resource"){ctx.mono_wasm_add_satellite_assembly(virtualName,asset.culture,offset,bytes.length)}},mono_load_runtime_and_bcl:function(unused_vfs_prefix,deploy_prefix,debug_level,file_list,loaded_cb,fetch_file_cb){var args={fetch_file_cb:fetch_file_cb,loaded_cb:loaded_cb,debug_level:debug_level,assembly_root:deploy_prefix,assets:[]};for(var i=0;iloaded_files_with_debug_info.push(value.url));MONO.loaded_files=loaded_files_with_debug_info;if(ctx.tracing){console.log("MONO_WASM: loaded_assets: "+JSON.stringify(ctx.loaded_assets));console.log("MONO_WASM: loaded_files: "+JSON.stringify(ctx.loaded_files))}var load_runtime=Module.cwrap("mono_wasm_load_runtime",null,["string","number"]);console.debug("MONO_WASM: Initializing mono runtime");this.mono_wasm_globalization_init(args.globalization_mode);if(ENVIRONMENT_IS_SHELL||ENVIRONMENT_IS_NODE){try{load_runtime("unused",args.debug_level)}catch(ex){print("MONO_WASM: load_runtime () failed: "+ex);print("MONO_WASM: Stacktrace: \n");print(ex.stack);var wasm_exit=Module.cwrap("mono_wasm_exit",null,["number"]);wasm_exit(1)}}else{load_runtime("unused",args.debug_level)}let tz;try{tz=Intl.DateTimeFormat().resolvedOptions().timeZone}catch{}MONO.mono_wasm_setenv("TZ",tz||"UTC");MONO.mono_wasm_runtime_ready();args.loaded_cb()},_load_assets_and_runtime:function(args){if(args.enable_debugging)args.debug_level=args.enable_debugging;if(args.assembly_list)throw new Error("Invalid args (assembly_list was replaced by assets)");if(args.runtime_assets)throw new Error("Invalid args (runtime_assets was replaced by assets)");if(args.runtime_asset_sources)throw new Error("Invalid args (runtime_asset_sources was replaced by remote_sources)");if(!args.loaded_cb)throw new Error("loaded_cb not provided");var ctx={tracing:args.diagnostic_tracing||false,pending_count:args.assets.length,mono_wasm_add_assembly:Module.cwrap("mono_wasm_add_assembly","number",["string","number","number"]),mono_wasm_add_satellite_assembly:Module.cwrap("mono_wasm_add_satellite_assembly","void",["string","string","number","number"]),loaded_assets:Object.create(null),loaded_files:[],createPath:Module["FS_createPath"],createDataFile:Module["FS_createDataFile"]};if(ctx.tracing)console.log("mono_wasm_load_runtime_with_args",JSON.stringify(args));this._apply_configuration_from_args(args);var fetch_file_cb=this._get_fetch_file_cb_from_args(args);var onPendingRequestComplete=function(){--ctx.pending_count;if(ctx.pending_count===0){try{MONO._finalize_startup(args,ctx)}catch(exc){console.error("Unhandled exception in _finalize_startup",exc);throw exc}}};var processFetchResponseBuffer=function(asset,url,blob){try{MONO._handle_loaded_asset(ctx,asset,url,blob)}catch(exc){console.error("Unhandled exception in processFetchResponseBuffer",exc);throw exc}finally{onPendingRequestComplete()}};args.assets.forEach(function(asset){var attemptNextSource;var sourceIndex=0;var sourcesList=asset.load_remote?args.remote_sources:[""];var handleFetchResponse=function(response){if(!response.ok){try{attemptNextSource();return}catch(exc){console.error("MONO_WASM: Unhandled exception in handleFetchResponse attemptNextSource for asset",asset.name,exc);throw exc}}try{var bufferPromise=response["arrayBuffer"]();bufferPromise.then(processFetchResponseBuffer.bind(this,asset,response.url))}catch(exc){console.error("MONO_WASM: Unhandled exception in handleFetchResponse for asset",asset.name,exc);attemptNextSource()}};attemptNextSource=function(){if(sourceIndex>=sourcesList.length){var msg="MONO_WASM: Failed to load "+asset.name;try{var isOk=asset.is_optional||asset.name.match(/\.pdb$/)&&MONO.mono_wasm_ignore_pdb_load_errors;if(isOk)console.debug(msg);else{console.error(msg);throw new Error(msg)}}finally{onPendingRequestComplete()}}var sourcePrefix=sourcesList[sourceIndex];sourceIndex++;if(sourcePrefix==="./")sourcePrefix="";var attemptUrl;if(sourcePrefix.trim()===""){if(asset.behavior==="assembly")attemptUrl=locateFile(args.assembly_root+"/"+asset.name);else if(asset.behavior==="resource"){var path=asset.culture!==""?`${asset.culture}/${asset.name}`:asset.name;attemptUrl=locateFile(args.assembly_root+"/"+path)}else attemptUrl=asset.name}else{attemptUrl=sourcePrefix+asset.name}try{if(asset.name===attemptUrl){if(ctx.tracing)console.log("Attempting to fetch '%s'",attemptUrl)}else{if(ctx.tracing)console.log("Attempting to fetch '%s' for '%s'",attemptUrl,asset.name)}var fetch_promise=fetch_file_cb(attemptUrl);fetch_promise.then(handleFetchResponse)}catch(exc){console.error("MONO_WASM: Error fetching '%s'\n%s",attemptUrl,exc);attemptNextSource()}};attemptNextSource()})},mono_wasm_globalization_init:function(globalization_mode){var invariantMode=false;if(globalization_mode==="invariant")invariantMode=true;if(!invariantMode){if(this.num_icu_assets_loaded_successfully>0){console.debug("MONO_WASM: ICU data archive(s) loaded, disabling invariant mode")}else if(globalization_mode!=="icu"){console.debug("MONO_WASM: ICU data archive(s) not loaded, using invariant globalization mode");invariantMode=true}else{var msg="invariant globalization mode is inactive and no ICU data archives were loaded";console.error("MONO_WASM: ERROR: "+msg);throw new Error(msg)}}if(invariantMode)this.mono_wasm_setenv("DOTNET_SYSTEM_GLOBALIZATION_INVARIANT","1");this.mono_wasm_setenv("DOTNET_SYSTEM_GLOBALIZATION_PREDEFINED_CULTURES_ONLY","1")},mono_wasm_get_loaded_files:function(){if(!this.mono_wasm_set_is_debugger_attached)this.mono_wasm_set_is_debugger_attached=Module.cwrap("mono_wasm_set_is_debugger_attached","void",["bool"]);this.mono_wasm_set_is_debugger_attached(true);return MONO.loaded_files},mono_wasm_get_loaded_asset_table:function(){return MONO.loaded_assets},_base64_to_uint8:function(base64String){const byteCharacters=atob(base64String);const byteNumbers=new Array(byteCharacters.length);for(let i=0;i{var file=m[0];var last=file.lastIndexOf("/");var directory=file.slice(0,last+1);folders.add(directory)});folders.forEach(folder=>{Module["FS_createPath"](prefix,folder,true,true)});for(row of manifest){var name=row[0];var length=row[1];var bytes=data.slice(0,length);Module["FS_createDataFile"](prefix,name,bytes,true,true);data=data.slice(length)}return true},mono_wasm_raise_debug_event:function(event,args={}){if(typeof event!=="object")throw new Error(`event must be an object, but got ${JSON.stringify(event)}`);if(event.eventName===undefined)throw new Error(`event.eventName is a required parameter, in event: ${JSON.stringify(event)}`);if(typeof args!=="object")throw new Error(`args must be an object, but got ${JSON.stringify(args)}`);console.debug("mono_wasm_debug_event_raised:aef14bca-5519-4dfe-b35a-f867abc123ae",JSON.stringify(event),JSON.stringify(args))},mono_wasm_load_config:async function(configFilePath){Module.addRunDependency(configFilePath);try{let config=null;if(ENVIRONMENT_IS_WEB){const configRaw=await fetch(configFilePath);config=await configRaw.json()}else if(ENVIRONMENT_IS_NODE){config=require(configFilePath)}else{config=JSON.parse(read(configFilePath))}Module.config=config}catch(e){Module.config={message:"failed to load config file",error:e}}finally{Module.removeRunDependency(configFilePath)}},mono_wasm_set_timeout_exec:function(id){if(!this.mono_set_timeout_exec)this.mono_set_timeout_exec=Module.cwrap("mono_set_timeout_exec",null,["number"]);this.mono_set_timeout_exec(id)},prevent_timer_throttling:function(){let now=(new Date).valueOf();const desired_reach_time=now+1e3*60*6;const next_reach_time=Math.max(now+1e3,this.spread_timers_maximum);const light_throttling_frequency=1e3;for(var schedule=next_reach_time;schedule{this.mono_wasm_set_timeout_exec(0);MONO.pump_count++;MONO.pump_message()},delay)}this.spread_timers_maximum=desired_reach_time}};function _mono_set_timeout(timeout,id){if(typeof globalThis.setTimeout==="function"){if(MONO.lastScheduleTimeoutId){globalThis.clearTimeout(MONO.lastScheduleTimeoutId);MONO.lastScheduleTimeoutId=undefined}MONO.lastScheduleTimeoutId=globalThis.setTimeout(function mono_wasm_set_timeout_exec(){MONO.mono_wasm_set_timeout_exec(id)},timeout)}else{++MONO.pump_count;MONO.timeout_queue.push(function(){MONO.mono_wasm_set_timeout_exec(id)})}}var BINDING={BINDING_ASM:"[System.Private.Runtime.InteropServices.JavaScript]System.Runtime.InteropServices.JavaScript.Runtime",_cs_owned_objects_by_js_handle:[],_js_handle_free_list:[],_next_js_handle:1,mono_wasm_marshal_enum_as_int:true,mono_bindings_init:function(binding_asm){this.BINDING_ASM=binding_asm},export_functions:function(module){module["mono_bindings_init"]=BINDING.mono_bindings_init.bind(BINDING);module["mono_bind_method"]=BINDING.bind_method.bind(BINDING);module["mono_method_invoke"]=BINDING.call_method.bind(BINDING);module["mono_method_get_call_signature"]=BINDING.mono_method_get_call_signature.bind(BINDING);module["mono_method_resolve"]=BINDING.resolve_method_fqn.bind(BINDING);module["mono_bind_static_method"]=BINDING.bind_static_method.bind(BINDING);module["mono_call_static_method"]=BINDING.call_static_method.bind(BINDING);module["mono_bind_assembly_entry_point"]=BINDING.bind_assembly_entry_point.bind(BINDING);module["mono_call_assembly_entry_point"]=BINDING.call_assembly_entry_point.bind(BINDING);module["mono_intern_string"]=BINDING.mono_intern_string.bind(BINDING)},bindings_lazy_init:function(){if(this.init)return;this.init=true;this.wasm_type_symbol=Symbol.for("wasm type");this.js_owned_gc_handle_symbol=Symbol.for("wasm js_owned_gc_handle");this.cs_owned_js_handle_symbol=Symbol.for("wasm cs_owned_js_handle");this.delegate_invoke_symbol=Symbol.for("wasm delegate_invoke");this.delegate_invoke_signature_symbol=Symbol.for("wasm delegate_invoke_signature");this.listener_registration_count_symbol=Symbol.for("wasm listener_registration_count");Object.prototype[this.wasm_type_symbol]=0;Array.prototype[this.wasm_type_symbol]=1;ArrayBuffer.prototype[this.wasm_type_symbol]=2;DataView.prototype[this.wasm_type_symbol]=3;Function.prototype[this.wasm_type_symbol]=4;Map.prototype[this.wasm_type_symbol]=5;if(typeof SharedArrayBuffer!=="undefined")SharedArrayBuffer.prototype[this.wasm_type_symbol]=6;Int8Array.prototype[this.wasm_type_symbol]=10;Uint8Array.prototype[this.wasm_type_symbol]=11;Uint8ClampedArray.prototype[this.wasm_type_symbol]=12;Int16Array.prototype[this.wasm_type_symbol]=13;Uint16Array.prototype[this.wasm_type_symbol]=14;Int32Array.prototype[this.wasm_type_symbol]=15;Uint32Array.prototype[this.wasm_type_symbol]=16;Float32Array.prototype[this.wasm_type_symbol]=17;Float64Array.prototype[this.wasm_type_symbol]=18;this.assembly_load=Module.cwrap("mono_wasm_assembly_load","number",["string"]);this.find_corlib_class=Module.cwrap("mono_wasm_find_corlib_class","number",["string","string"]);this.find_class=Module.cwrap("mono_wasm_assembly_find_class","number",["number","string","string"]);this._find_method=Module.cwrap("mono_wasm_assembly_find_method","number",["number","string","number"]);this.invoke_method=Module.cwrap("mono_wasm_invoke_method","number",["number","number","number","number"]);this.mono_string_get_utf8=Module.cwrap("mono_wasm_string_get_utf8","number",["number"]);this.mono_wasm_string_from_utf16=Module.cwrap("mono_wasm_string_from_utf16","number",["number","number"]);this.mono_get_obj_type=Module.cwrap("mono_wasm_get_obj_type","number",["number"]);this.mono_array_length=Module.cwrap("mono_wasm_array_length","number",["number"]);this.mono_array_get=Module.cwrap("mono_wasm_array_get","number",["number","number"]);this.mono_obj_array_new=Module.cwrap("mono_wasm_obj_array_new","number",["number"]);this.mono_obj_array_set=Module.cwrap("mono_wasm_obj_array_set","void",["number","number","number"]);this.mono_wasm_register_bundled_satellite_assemblies=Module.cwrap("mono_wasm_register_bundled_satellite_assemblies","void",[]);this.mono_wasm_try_unbox_primitive_and_get_type=Module.cwrap("mono_wasm_try_unbox_primitive_and_get_type","number",["number","number"]);this.mono_wasm_box_primitive=Module.cwrap("mono_wasm_box_primitive","number",["number","number","number"]);this.mono_wasm_intern_string=Module.cwrap("mono_wasm_intern_string","number",["number"]);this.assembly_get_entry_point=Module.cwrap("mono_wasm_assembly_get_entry_point","number",["number"]);this.mono_wasm_get_delegate_invoke=Module.cwrap("mono_wasm_get_delegate_invoke","number",["number"]);this.mono_wasm_string_array_new=Module.cwrap("mono_wasm_string_array_new","number",["number"]);this._box_buffer=Module._malloc(16);this._unbox_buffer=Module._malloc(16);this._class_int32=this.find_corlib_class("System","Int32");this._class_uint32=this.find_corlib_class("System","UInt32");this._class_double=this.find_corlib_class("System","Double");this._class_boolean=this.find_corlib_class("System","Boolean");this.mono_typed_array_new=Module.cwrap("mono_wasm_typed_array_new","number",["number","number","number","number"]);var binding_fqn_asm=this.BINDING_ASM.substring(this.BINDING_ASM.indexOf("[")+1,this.BINDING_ASM.indexOf("]")).trim();var binding_fqn_class=this.BINDING_ASM.substring(this.BINDING_ASM.indexOf("]")+1).trim();this.binding_module=this.assembly_load(binding_fqn_asm);if(!this.binding_module)throw"Can't find bindings module assembly: "+binding_fqn_asm;var namespace=null,classname=null;if(binding_fqn_class!==null&&typeof binding_fqn_class!=="undefined"){namespace="System.Runtime.InteropServices.JavaScript";classname=binding_fqn_class.length>0?binding_fqn_class:"Runtime";if(binding_fqn_class.indexOf(".")!=-1){var idx=binding_fqn_class.lastIndexOf(".");namespace=binding_fqn_class.substring(0,idx);classname=binding_fqn_class.substring(idx+1)}}var wasm_runtime_class=this.find_class(this.binding_module,namespace,classname);if(!wasm_runtime_class)throw"Can't find "+binding_fqn_class+" class";var get_method=function(method_name){var res=BINDING.find_method(wasm_runtime_class,method_name,-1);if(!res)throw"Can't find method "+namespace+"."+classname+":"+method_name;return res};var bind_runtime_method=function(method_name,signature){var method=get_method(method_name);return BINDING.bind_method(method,0,signature,"BINDINGS_"+method_name)};this.get_call_sig=get_method("GetCallSignature");this._get_cs_owned_object_by_js_handle=bind_runtime_method("GetCSOwnedObjectByJSHandle","ii!");this._get_cs_owned_object_js_handle=bind_runtime_method("GetCSOwnedObjectJSHandle","mi");this._try_get_cs_owned_object_js_handle=bind_runtime_method("TryGetCSOwnedObjectJSHandle","mi");this._create_cs_owned_proxy=bind_runtime_method("CreateCSOwnedProxy","iii!");this._get_js_owned_object_by_gc_handle=bind_runtime_method("GetJSOwnedObjectByGCHandle","i!");this._get_js_owned_object_gc_handle=bind_runtime_method("GetJSOwnedObjectGCHandle","m");this._release_js_owned_object_by_gc_handle=bind_runtime_method("ReleaseJSOwnedObjectByGCHandle","i");this._create_tcs=bind_runtime_method("CreateTaskSource","");this._set_tcs_result=bind_runtime_method("SetTaskSourceResult","io");this._set_tcs_failure=bind_runtime_method("SetTaskSourceFailure","is");this._get_tcs_task=bind_runtime_method("GetTaskSourceTask","i!");this._setup_js_cont=bind_runtime_method("SetupJSContinuation","mo");this._object_to_string=bind_runtime_method("ObjectToString","m");this._get_date_value=bind_runtime_method("GetDateValue","m");this._create_date_time=bind_runtime_method("CreateDateTime","d!");this._create_uri=bind_runtime_method("CreateUri","s!");this._is_simple_array=bind_runtime_method("IsSimpleArray","m");this._are_promises_supported=(typeof Promise==="object"||typeof Promise==="function")&&typeof Promise.resolve==="function";this.isThenable=(js_obj=>{return Promise.resolve(js_obj)===js_obj||(typeof js_obj==="object"||typeof js_obj==="function")&&typeof js_obj.then==="function"});this.isChromium=false;if(globalThis.navigator){var nav=globalThis.navigator;if(nav.userAgentData&&nav.userAgentData.brands){this.isChromium=nav.userAgentData.brands.some(i=>i.brand=="Chromium")}else if(globalThis.navigator.userAgent){this.isChromium=nav.userAgent.includes("Chrome")}}this._empty_string="";this._empty_string_ptr=0;this._interned_string_full_root_buffers=[];this._interned_string_current_root_buffer=null;this._interned_string_current_root_buffer_count=0;this._interned_js_string_table=new Map;this._js_owned_object_table=new Map;this._use_finalization_registry=typeof globalThis.FinalizationRegistry==="function";this._use_weak_ref=typeof globalThis.WeakRef==="function";if(this._use_finalization_registry){this._js_owned_object_registry=new globalThis.FinalizationRegistry(this._js_owned_object_finalized.bind(this))}},_js_owned_object_finalized:function(gc_handle){this._js_owned_object_table.delete(gc_handle);this._release_js_owned_object_by_gc_handle(gc_handle)},_lookup_js_owned_object:function(gc_handle){if(!gc_handle)return null;var wr=this._js_owned_object_table.get(gc_handle);if(wr){return wr.deref()}return null},_register_js_owned_object:function(gc_handle,js_obj){var wr;if(this._use_weak_ref){wr=new WeakRef(js_obj)}else{wr={deref:()=>{return js_obj}}}this._js_owned_object_table.set(gc_handle,wr)},_wrap_js_thenable_as_task:function(thenable){this.bindings_lazy_init();if(!thenable)return null;var thenable_js_handle=BINDING.mono_wasm_get_js_handle(thenable);const tcs_gc_handle=this._create_tcs();thenable.then(result=>{this._set_tcs_result(tcs_gc_handle,result);this._mono_wasm_release_js_handle(thenable_js_handle);if(!this._use_finalization_registry){this._release_js_owned_object_by_gc_handle(tcs_gc_handle)}},reason=>{this._set_tcs_failure(tcs_gc_handle,reason?reason.toString():"");this._mono_wasm_release_js_handle(thenable_js_handle);if(!this._use_finalization_registry){this._release_js_owned_object_by_gc_handle(tcs_gc_handle)}});if(this._use_finalization_registry){this._js_owned_object_registry.register(thenable,tcs_gc_handle)}return this._get_tcs_task(tcs_gc_handle)},_unbox_task_root_as_promise:function(root){this.bindings_lazy_init();const self=this;if(root.value===0)return null;if(!this._are_promises_supported)throw new Error("Promises are not supported thus 'System.Threading.Tasks.Task' can not work in this context.");const gc_handle=this._get_js_owned_object_gc_handle(root.value);var result=this._lookup_js_owned_object(gc_handle);if(!result){var cont_obj=null;var result=new Promise(function(resolve,reject){if(self._use_finalization_registry){cont_obj={resolve:resolve,reject:reject}}else{cont_obj={resolve:function(){const res=resolve.apply(null,arguments);self._js_owned_object_table.delete(gc_handle);self._release_js_owned_object_by_gc_handle(gc_handle);return res},reject:function(){const res=reject.apply(null,arguments);self._js_owned_object_table.delete(gc_handle);self._release_js_owned_object_by_gc_handle(gc_handle);return res}}}});this._setup_js_cont(root.value,cont_obj);if(this._use_finalization_registry){this._js_owned_object_registry.register(result,gc_handle)}this._register_js_owned_object(gc_handle,result)}return result},_unbox_ref_type_root_as_js_object:function(root){this.bindings_lazy_init();if(root.value===0)return null;var js_handle=this._try_get_cs_owned_object_js_handle(root.value,false);if(js_handle){if(js_handle===-1){throw new Error("Cannot access a disposed JSObject at "+root.value)}return this.mono_wasm_get_jsobj_from_js_handle(js_handle)}const gc_handle=this._get_js_owned_object_gc_handle(root.value);var result=this._lookup_js_owned_object(gc_handle);if(!result){result={};result[BINDING.js_owned_gc_handle_symbol]=gc_handle;if(this._use_finalization_registry){this._js_owned_object_registry.register(result,gc_handle)}this._register_js_owned_object(gc_handle,result)}return result},_wrap_delegate_root_as_function:function(root){this.bindings_lazy_init();if(root.value===0)return null;const gc_handle=this._get_js_owned_object_gc_handle(root.value);return this._wrap_delegate_gc_handle_as_function(gc_handle)},_wrap_delegate_gc_handle_as_function:function(gc_handle,after_listener_callback){this.bindings_lazy_init();var result=this._lookup_js_owned_object(gc_handle);if(!result){result=function(){const delegateRoot=MONO.mono_wasm_new_root(BINDING.get_js_owned_object_by_gc_handle(gc_handle));try{const res=BINDING.call_method(result[BINDING.delegate_invoke_symbol],delegateRoot.value,result[BINDING.delegate_invoke_signature_symbol],arguments);if(after_listener_callback){after_listener_callback()}return res}finally{delegateRoot.release()}};const delegateRoot=MONO.mono_wasm_new_root(BINDING.get_js_owned_object_by_gc_handle(gc_handle));try{if(typeof result[BINDING.delegate_invoke_symbol]==="undefined"){result[BINDING.delegate_invoke_symbol]=BINDING.mono_wasm_get_delegate_invoke(delegateRoot.value);if(!result[BINDING.delegate_invoke_symbol]){throw new Error("System.Delegate Invoke method can not be resolved.")}}if(typeof result[BINDING.delegate_invoke_signature_symbol]==="undefined"){result[BINDING.delegate_invoke_signature_symbol]=Module.mono_method_get_call_signature(result[BINDING.delegate_invoke_symbol],delegateRoot.value)}}finally{delegateRoot.release()}if(this._use_finalization_registry){this._js_owned_object_registry.register(result,gc_handle)}this._register_js_owned_object(gc_handle,result)}return result},mono_intern_string:function(string){if(string.length===0)return this._empty_string;var ptr=this.js_string_to_mono_string_interned(string);var result=MONO.interned_string_table.get(ptr);return result},_store_string_in_intern_table:function(string,ptr,internIt){if(!ptr)throw new Error("null pointer passed to _store_string_in_intern_table");else if(typeof ptr!=="number")throw new Error(`non-pointer passed to _store_string_in_intern_table: ${typeof ptr}`);const internBufferSize=8192;if(this._interned_string_current_root_buffer_count>=internBufferSize){this._interned_string_full_root_buffers.push(this._interned_string_current_root_buffer);this._interned_string_current_root_buffer=null}if(!this._interned_string_current_root_buffer){this._interned_string_current_root_buffer=MONO.mono_wasm_new_root_buffer(internBufferSize,"interned strings");this._interned_string_current_root_buffer_count=0}var rootBuffer=this._interned_string_current_root_buffer;var index=this._interned_string_current_root_buffer_count++;rootBuffer.set(index,ptr);if(internIt)rootBuffer.set(index,ptr=this.mono_wasm_intern_string(ptr));if(!ptr)throw new Error("mono_wasm_intern_string produced a null pointer");this._interned_js_string_table.set(string,ptr);if(!MONO.interned_string_table)MONO.interned_string_table=new Map;MONO.interned_string_table.set(ptr,string);if(string.length===0&&!this._empty_string_ptr)this._empty_string_ptr=ptr;return ptr},js_string_to_mono_string_interned:function(string){var text=typeof string==="symbol"?string.description||Symbol.keyFor(string)||"":string;if(text.length===0&&this._empty_string_ptr)return this._empty_string_ptr;var ptr=this._interned_js_string_table.get(string);if(ptr)return ptr;ptr=this.js_string_to_mono_string_new(text);ptr=this._store_string_in_intern_table(string,ptr,true);return ptr},js_string_to_mono_string:function(string){if(string===null)return null;else if(typeof string==="symbol")return this.js_string_to_mono_string_interned(string);else if(typeof string!=="string")throw new Error("Expected string argument, got "+typeof string);if(string.length===0)return this.js_string_to_mono_string_interned(string);if(string.length<=256){var interned=this._interned_js_string_table.get(string);if(interned)return interned}return this.js_string_to_mono_string_new(string)},js_string_to_mono_string_new:function(string){var buffer=Module._malloc((string.length+1)*2);var buffer16=buffer/2|0;for(var i=0;i0)return this.mono_wasm_get_jsobj_from_js_handle(js_handle);return null},_get_string_from_intern_table:function(mono_obj){if(!MONO.interned_string_table)return undefined;return MONO.interned_string_table.get(mono_obj)},conv_string:function(mono_obj){return MONO.string_decoder.copy(mono_obj)},is_nested_array:function(ele){return this._is_simple_array(ele)},mono_array_to_js_array:function(mono_array){if(mono_array===0)return null;var arrayRoot=MONO.mono_wasm_new_root(mono_array);try{return this._mono_array_root_to_js_array(arrayRoot)}finally{arrayRoot.release()}},_mono_array_root_to_js_array:function(arrayRoot){if(arrayRoot.value===0)return null;let elemRoot=MONO.mono_wasm_new_root();try{var len=this.mono_array_length(arrayRoot.value);var res=new Array(len);for(var i=0;i>>0===js_obj)result=this._box_js_uint(js_obj);else result=this._box_js_double(js_obj);if(!result)throw new Error(`Boxing failed for ${js_obj}`);return result}case typeof js_obj==="string":return this.js_string_to_mono_string(js_obj);case typeof js_obj==="symbol":return this.js_string_to_mono_string_interned(js_obj);case typeof js_obj==="boolean":return this._box_js_bool(js_obj);case this.isThenable(js_obj)===true:return this._wrap_js_thenable_as_task(js_obj);case js_obj.constructor.name==="Date":return this._create_date_time(js_obj.getTime());default:return this._extract_mono_obj(should_add_in_flight,js_obj)}},_extract_mono_obj:function(should_add_in_flight,js_obj){if(js_obj===null||typeof js_obj==="undefined")return 0;var result=null;if(js_obj[BINDING.js_owned_gc_handle_symbol]){result=this.get_js_owned_object_by_gc_handle(js_obj[BINDING.js_owned_gc_handle_symbol]);return result}if(js_obj[BINDING.cs_owned_js_handle_symbol]){result=this.get_cs_owned_object_by_js_handle(js_obj[BINDING.cs_owned_js_handle_symbol],should_add_in_flight);if(!result){delete js_obj[BINDING.cs_owned_js_handle_symbol]}}if(!result){const wasm_type=js_obj[this.wasm_type_symbol];const wasm_type_id=typeof wasm_type==="undefined"?0:wasm_type;var js_handle=BINDING.mono_wasm_get_js_handle(js_obj);result=this._create_cs_owned_proxy(js_handle,wasm_type_id,should_add_in_flight)}return result},has_backing_array_buffer:function(js_obj){return typeof SharedArrayBuffer!=="undefined"?js_obj.buffer instanceof ArrayBuffer||js_obj.buffer instanceof SharedArrayBuffer:js_obj.buffer instanceof ArrayBuffer},js_typed_array_to_array:function(js_obj){if(!!(this.has_backing_array_buffer(js_obj)&&js_obj.BYTES_PER_ELEMENT)){var arrayType=js_obj[this.wasm_type_symbol];var heapBytes=this.js_typedarray_to_heap(js_obj);var bufferArray=this.mono_typed_array_new(heapBytes.byteOffset,js_obj.length,js_obj.BYTES_PER_ELEMENT,arrayType);Module._free(heapBytes.byteOffset);return bufferArray}else{throw new Error("Object '"+js_obj+"' is not a typed array")}},typedarray_copy_to:function(typed_array,pinned_array,begin,end,bytes_per_element){if(!!(this.has_backing_array_buffer(typed_array)&&typed_array.BYTES_PER_ELEMENT)){if(bytes_per_element!==typed_array.BYTES_PER_ELEMENT)throw new Error("Inconsistent element sizes: TypedArray.BYTES_PER_ELEMENT '"+typed_array.BYTES_PER_ELEMENT+"' sizeof managed element: '"+bytes_per_element+"'");var num_of_bytes=(end-begin)*bytes_per_element;var view_bytes=typed_array.length*typed_array.BYTES_PER_ELEMENT;if(num_of_bytes>view_bytes)num_of_bytes=view_bytes;var offset=begin*bytes_per_element;var heapBytes=new Uint8Array(Module.HEAPU8.buffer,pinned_array+offset,num_of_bytes);heapBytes.set(new Uint8Array(typed_array.buffer,typed_array.byteOffset,num_of_bytes));return num_of_bytes}else{throw new Error("Object '"+typed_array+"' is not a typed array")}},typedarray_copy_from:function(typed_array,pinned_array,begin,end,bytes_per_element){if(!!(this.has_backing_array_buffer(typed_array)&&typed_array.BYTES_PER_ELEMENT)){if(bytes_per_element!==typed_array.BYTES_PER_ELEMENT)throw new Error("Inconsistent element sizes: TypedArray.BYTES_PER_ELEMENT '"+typed_array.BYTES_PER_ELEMENT+"' sizeof managed element: '"+bytes_per_element+"'");var num_of_bytes=(end-begin)*bytes_per_element;var view_bytes=typed_array.length*typed_array.BYTES_PER_ELEMENT;if(num_of_bytes>view_bytes)num_of_bytes=view_bytes;var typedarrayBytes=new Uint8Array(typed_array.buffer,0,num_of_bytes);var offset=begin*bytes_per_element;typedarrayBytes.set(Module.HEAPU8.subarray(pinned_array+offset,pinned_array+offset+num_of_bytes));return num_of_bytes}else{throw new Error("Object '"+typed_array+"' is not a typed array")}},typed_array_from:function(pinned_array,begin,end,bytes_per_element,type){var newTypedArray=0;switch(type){case 5:newTypedArray=new Int8Array(end-begin);break;case 6:newTypedArray=new Uint8Array(end-begin);break;case 7:newTypedArray=new Int16Array(end-begin);break;case 8:newTypedArray=new Uint16Array(end-begin);break;case 9:newTypedArray=new Int32Array(end-begin);break;case 10:newTypedArray=new Uint32Array(end-begin);break;case 13:newTypedArray=new Float32Array(end-begin);break;case 14:newTypedArray=new Float64Array(end-begin);break;case 15:newTypedArray=new Uint8ClampedArray(end-begin);break}this.typedarray_copy_from(newTypedArray,pinned_array,begin,end,bytes_per_element);return newTypedArray},js_to_mono_enum:function(js_obj,method,parmIdx){this.bindings_lazy_init();if(typeof js_obj!=="number")throw new Error(`Expected numeric value for enum argument, got '${js_obj}'`);return js_obj|0},get_js_owned_object_by_gc_handle:function(gc_handle){if(!gc_handle){return 0}return this._get_js_owned_object_by_gc_handle(gc_handle)},get_cs_owned_object_by_js_handle:function(js_handle,should_add_in_flight){if(!js_handle){return 0}return this._get_cs_owned_object_by_js_handle(js_handle,should_add_in_flight)},mono_method_get_call_signature:function(method,mono_obj){let instanceRoot=MONO.mono_wasm_new_root(mono_obj);try{this.bindings_lazy_init();return this.call_method(this.get_call_sig,null,"im",[method,instanceRoot.value])}finally{instanceRoot.release()}},_create_named_function:function(name,argumentNames,body,closure){var result=null,closureArgumentList=null,closureArgumentNames=null;if(closure){closureArgumentNames=Object.keys(closure);closureArgumentList=new Array(closureArgumentNames.length);for(var i=0,l=closureArgumentNames.length;i0;var has_args_marshal=typeof args_marshal==="string";if(has_args){if(!has_args_marshal)throw new Error("No signature provided for method call.");else if(args.length>args_marshal.length)throw new Error("Too many parameter values. Expected at most "+args_marshal.length+" value(s) for signature "+args_marshal)}return has_args_marshal&&has_args},_get_buffer_for_method_call:function(converter){if(!converter)return 0;var result=converter.scratchBuffer;converter.scratchBuffer=0;return result},_get_args_root_buffer_for_method_call:function(converter){if(!converter)return null;if(!converter.needs_root_buffer)return null;var result;if(converter.scratchRootBuffer){result=converter.scratchRootBuffer;converter.scratchRootBuffer=null}else{result=MONO.mono_wasm_new_root_buffer(converter.steps.length);result.converter=converter}return result},_release_args_root_buffer_from_method_call:function(converter,argsRootBuffer){if(!argsRootBuffer||!converter)return;if(!converter.scratchRootBuffer){argsRootBuffer.clear();converter.scratchRootBuffer=argsRootBuffer}else{argsRootBuffer.release()}},_release_buffer_from_method_call:function(converter,buffer){if(!converter||!buffer)return;if(!converter.scratchBuffer)converter.scratchBuffer=buffer|0;else Module._free(buffer|0)},_convert_exception_for_method_call:function(result,exception){if(exception===0)return null;var msg=this.conv_string(result);var err=new Error(msg);return err},_maybe_produce_signature_warning:function(converter){if(converter.has_warned_about_signature)return;console.warn("MONO_WASM: Deprecated raw return value signature: '"+converter.args_marshal+"'. End the signature with '!' instead of 'm'.");converter.has_warned_about_signature=true},_decide_if_result_is_marshaled:function(converter,argc){if(!converter)return true;if(converter.is_result_possibly_unmarshaled&&argc===converter.result_unmarshaled_if_argc){if(argc= ",converter.result_unmarshaled_if_argc,"argument(s) but got",argc,"for signature "+converter.args_marshal].join(" "));this._maybe_produce_signature_warning(converter);return false}else{if(argc0&&Array.isArray(args[0]))args[0]=BINDING.js_array_to_mono_array(args[0],true,false);let result=BINDING.call_method(method,null,signature,args);return Promise.resolve(result)}catch(error){return Promise.reject(error)}}},call_assembly_entry_point:function(assembly,args,signature){return this.bind_assembly_entry_point(assembly,signature)(...args)},mono_wasm_get_jsobj_from_js_handle:function(js_handle){if(js_handle>0)return this._cs_owned_objects_by_js_handle[js_handle];return null},mono_wasm_get_js_handle:function(js_obj){if(js_obj[BINDING.cs_owned_js_handle_symbol]){return js_obj[BINDING.cs_owned_js_handle_symbol]}var js_handle=this._js_handle_free_list.length?this._js_handle_free_list.pop():this._next_js_handle++;this._cs_owned_objects_by_js_handle[js_handle]=js_obj;js_obj[BINDING.cs_owned_js_handle_symbol]=js_handle;return js_handle},_mono_wasm_release_js_handle:function(js_handle){var obj=BINDING._cs_owned_objects_by_js_handle[js_handle];if(typeof obj!=="undefined"&&obj!==null){if(globalThis===obj)return obj;if(typeof obj[BINDING.cs_owned_js_handle_symbol]!=="undefined"){obj[BINDING.cs_owned_js_handle_symbol]=undefined}BINDING._cs_owned_objects_by_js_handle[js_handle]=undefined;BINDING._js_handle_free_list.push(js_handle)}return obj}};function _mono_wasm_add_event_listener(objHandle,name,listener_gc_handle,optionsHandle){var nameRoot=MONO.mono_wasm_new_root(name);try{BINDING.bindings_lazy_init();var sName=BINDING.conv_string(nameRoot.value);var obj=BINDING.mono_wasm_get_jsobj_from_js_handle(objHandle);if(!obj)throw new Error("ERR09: Invalid JS object handle for '"+sName+"'");const prevent_timer_throttling=!BINDING.isChromium||obj.constructor.name!=="WebSocket"?null:()=>MONO.prevent_timer_throttling(0);var listener=BINDING._wrap_delegate_gc_handle_as_function(listener_gc_handle,prevent_timer_throttling);if(!listener)throw new Error("ERR10: Invalid listener gc_handle");var options=optionsHandle?BINDING.mono_wasm_get_jsobj_from_js_handle(optionsHandle):null;if(!BINDING._use_finalization_registry){listener[BINDING.listener_registration_count_symbol]=listener[BINDING.listener_registration_count_symbol]?listener[BINDING.listener_registration_count_symbol]+1:1}if(options)obj.addEventListener(sName,listener,options);else obj.addEventListener(sName,listener);return 0}catch(exc){return BINDING.js_string_to_mono_string(exc.message)}finally{nameRoot.release()}}function _mono_wasm_asm_loaded(assembly_name,assembly_ptr,assembly_len,pdb_ptr,pdb_len){if(MONO.mono_wasm_runtime_is_ready!==true)return;const assembly_name_str=assembly_name!==0?Module.UTF8ToString(assembly_name).concat(".dll"):"";const assembly_data=new Uint8Array(Module.HEAPU8.buffer,assembly_ptr,assembly_len);const assembly_b64=MONO._base64Converter.toBase64StringImpl(assembly_data);let pdb_b64;if(pdb_ptr){const pdb_data=new Uint8Array(Module.HEAPU8.buffer,pdb_ptr,pdb_len);pdb_b64=MONO._base64Converter.toBase64StringImpl(pdb_data)}MONO.mono_wasm_raise_debug_event({eventName:"AssemblyLoaded",assembly_name:assembly_name_str,assembly_b64:assembly_b64,pdb_b64:pdb_b64})}function _mono_wasm_create_cs_owned_object(core_name,args,is_exception){var argsRoot=MONO.mono_wasm_new_root(args),nameRoot=MONO.mono_wasm_new_root(core_name);try{BINDING.bindings_lazy_init();var js_name=BINDING.conv_string(nameRoot.value);if(!js_name){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("Invalid name @"+nameRoot.value)}var coreObj=globalThis[js_name];if(coreObj===null||typeof coreObj==="undefined"){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("JavaScript host object '"+js_name+"' not found.")}var js_args=BINDING._mono_array_root_to_js_array(argsRoot);try{var allocator=function(constructor,js_args){var argsList=new Array;argsList[0]=constructor;if(js_args)argsList=argsList.concat(js_args);var tempCtor=constructor.bind.apply(constructor,argsList);var js_obj=new tempCtor;return js_obj};var js_obj=allocator(coreObj,js_args);var js_handle=BINDING.mono_wasm_get_js_handle(js_obj);return BINDING._js_to_mono_obj(false,js_handle)}catch(e){var res=e.toString();setValue(is_exception,1,"i32");if(res===null||res===undefined)res="Error allocating object.";return BINDING.js_string_to_mono_string(res)}}finally{argsRoot.release();nameRoot.release()}}function _mono_wasm_fire_debugger_agent_message(){debugger}function _mono_wasm_get_by_index(js_handle,property_index,is_exception){BINDING.bindings_lazy_init();var obj=BINDING.mono_wasm_get_jsobj_from_js_handle(js_handle);if(!obj){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("ERR03: Invalid JS object handle '"+js_handle+"' while getting ["+property_index+"]")}try{var m=obj[property_index];return BINDING._js_to_mono_obj(true,m)}catch(e){var res=e.toString();setValue(is_exception,1,"i32");if(res===null||typeof res==="undefined")res="unknown exception";return BINDING.js_string_to_mono_string(res)}}function _mono_wasm_get_global_object(global_name,is_exception){var nameRoot=MONO.mono_wasm_new_root(global_name);try{BINDING.bindings_lazy_init();var js_name=BINDING.conv_string(nameRoot.value);var globalObj;if(!js_name){globalObj=globalThis}else{globalObj=globalThis[js_name]}if(globalObj===null||typeof globalObj===undefined){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("Global object '"+js_name+"' not found.")}return BINDING._js_to_mono_obj(true,globalObj)}finally{nameRoot.release()}}function _mono_wasm_get_object_property(js_handle,property_name,is_exception){BINDING.bindings_lazy_init();var nameRoot=MONO.mono_wasm_new_root(property_name);try{var js_name=BINDING.conv_string(nameRoot.value);if(!js_name){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("Invalid property name object '"+nameRoot.value+"'")}var obj=BINDING.mono_wasm_get_jsobj_from_js_handle(js_handle);if(!obj){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("ERR01: Invalid JS object handle '"+js_handle+"' while geting '"+js_name+"'")}var res;try{var m=obj[js_name];return BINDING._js_to_mono_obj(true,m)}catch(e){var res=e.toString();setValue(is_exception,1,"i32");if(res===null||typeof res==="undefined")res="unknown exception";return BINDING.js_string_to_mono_string(res)}}finally{nameRoot.release()}}var DOTNET={conv_string:function(mono_obj){return MONO.string_decoder.copy(mono_obj)}};function _mono_wasm_invoke_js_blazor(exceptionMessage,callInfo,arg0,arg1,arg2){var mono_string=globalThis._mono_string_cached||(globalThis._mono_string_cached=Module.cwrap("mono_wasm_string_from_js","number",["string"]));try{var blazorExports=globalThis.Blazor;if(!blazorExports){throw new Error("The blazor.webassembly.js library is not loaded.")}return blazorExports._internal.invokeJSFromDotNet(callInfo,arg0,arg1,arg2)}catch(ex){var exceptionJsString=ex.message+"\n"+ex.stack;var exceptionSystemString=mono_string(exceptionJsString);setValue(exceptionMessage,exceptionSystemString,"i32");return 0}}function _mono_wasm_invoke_js_marshalled(exceptionMessage,asyncHandleLongPtr,functionName,argsJson,treatResultAsVoid){var mono_string=globalThis._mono_string_cached||(globalThis._mono_string_cached=Module.cwrap("mono_wasm_string_from_js","number",["string"]));try{var u32Index=asyncHandleLongPtr>>2;var asyncHandleJsNumber=Module.HEAPU32[u32Index+1]*4294967296+Module.HEAPU32[u32Index];var funcNameJsString=DOTNET.conv_string(functionName);var argsJsonJsString=argsJson&&DOTNET.conv_string(argsJson);var dotNetExports=globaThis.DotNet;if(!dotNetExports){throw new Error("The Microsoft.JSInterop.js library is not loaded.")}if(asyncHandleJsNumber){dotNetExports.jsCallDispatcher.beginInvokeJSFromDotNet(asyncHandleJsNumber,funcNameJsString,argsJsonJsString,treatResultAsVoid);return 0}else{var resultJson=dotNetExports.jsCallDispatcher.invokeJSFromDotNet(funcNameJsString,argsJsonJsString,treatResultAsVoid);return resultJson===null?0:mono_string(resultJson)}}catch(ex){var exceptionJsString=ex.message+"\n"+ex.stack;var exceptionSystemString=mono_string(exceptionJsString);setValue(exceptionMessage,exceptionSystemString,"i32");return 0}}function _mono_wasm_invoke_js_unmarshalled(exceptionMessage,funcName,arg0,arg1,arg2){try{var funcNameJsString=DOTNET.conv_string(funcName);var dotNetExports=globalThis.DotNet;if(!dotNetExports){throw new Error("The Microsoft.JSInterop.js library is not loaded.")}var funcInstance=dotNetExports.jsCallDispatcher.findJSFunction(funcNameJsString);return funcInstance.call(null,arg0,arg1,arg2)}catch(ex){var exceptionJsString=ex.message+"\n"+ex.stack;var mono_string=Module.cwrap("mono_wasm_string_from_js","number",["string"]);var exceptionSystemString=mono_string(exceptionJsString);setValue(exceptionMessage,exceptionSystemString,"i32");return 0}}function _mono_wasm_invoke_js_with_args(js_handle,method_name,args,is_exception){let argsRoot=MONO.mono_wasm_new_root(args),nameRoot=MONO.mono_wasm_new_root(method_name);try{BINDING.bindings_lazy_init();var js_name=BINDING.conv_string(nameRoot.value);if(!js_name||typeof js_name!=="string"){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("ERR12: Invalid method name object '"+nameRoot.value+"'")}var obj=BINDING.get_js_obj(js_handle);if(!obj){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("ERR13: Invalid JS object handle '"+js_handle+"' while invoking '"+js_name+"'")}var js_args=BINDING._mono_array_root_to_js_array(argsRoot);var res;try{var m=obj[js_name];if(typeof m==="undefined")throw new Error("Method: '"+js_name+"' not found for: '"+Object.prototype.toString.call(obj)+"'");var res=m.apply(obj,js_args);return BINDING._js_to_mono_obj(true,res)}catch(e){var res=e.toString();setValue(is_exception,1,"i32");if(res===null||res===undefined)res="unknown exception";return BINDING.js_string_to_mono_string(res)}}finally{argsRoot.release();nameRoot.release()}}function _mono_wasm_release_cs_owned_object(js_handle){BINDING.bindings_lazy_init();BINDING._mono_wasm_release_js_handle(js_handle)}function _mono_wasm_remove_event_listener(objHandle,name,listener_gc_handle,capture){var nameRoot=MONO.mono_wasm_new_root(name);try{BINDING.bindings_lazy_init();var obj=BINDING.mono_wasm_get_jsobj_from_js_handle(objHandle);if(!obj)throw new Error("ERR11: Invalid JS object handle");var listener=BINDING._lookup_js_owned_object(listener_gc_handle);if(!listener)return;var sName=BINDING.conv_string(nameRoot.value);obj.removeEventListener(sName,listener,!!capture);if(!BINDING._use_finalization_registry){listener[BINDING.listener_registration_count_symbol]--;if(listener[BINDING.listener_registration_count_symbol]===0){BINDING._js_owned_object_table.delete(listener_gc_handle);BINDING._release_js_owned_object_by_gc_handle(listener_gc_handle)}}return 0}catch(exc){return BINDING.js_string_to_mono_string(exc.message)}finally{nameRoot.release()}}function _mono_wasm_set_by_index(js_handle,property_index,value,is_exception){var valueRoot=MONO.mono_wasm_new_root(value);try{BINDING.bindings_lazy_init();var obj=BINDING.mono_wasm_get_jsobj_from_js_handle(js_handle);if(!obj){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("ERR04: Invalid JS object handle '"+js_handle+"' while setting ["+property_index+"]")}var js_value=BINDING._unbox_mono_obj_root(valueRoot);try{obj[property_index]=js_value;return true}catch(e){var res=e.toString();setValue(is_exception,1,"i32");if(res===null||typeof res==="undefined")res="unknown exception";return BINDING.js_string_to_mono_string(res)}}finally{valueRoot.release()}}function _mono_wasm_set_object_property(js_handle,property_name,value,createIfNotExist,hasOwnProperty,is_exception){var valueRoot=MONO.mono_wasm_new_root(value),nameRoot=MONO.mono_wasm_new_root(property_name);try{BINDING.bindings_lazy_init();var property=BINDING.conv_string(nameRoot.value);if(!property){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("Invalid property name object '"+property_name+"'")}var js_obj=BINDING.mono_wasm_get_jsobj_from_js_handle(js_handle);if(!js_obj){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("ERR02: Invalid JS object handle '"+js_handle+"' while setting '"+property+"'")}var result=false;var js_value=BINDING._unbox_mono_obj_root(valueRoot);if(createIfNotExist){js_obj[property]=js_value;result=true}else{result=false;if(!createIfNotExist){if(!js_obj.hasOwnProperty(property))return false}if(hasOwnProperty===true){if(js_obj.hasOwnProperty(property)){js_obj[property]=js_value;result=true}}else{js_obj[property]=js_value;result=true}}return BINDING._box_js_bool(result)}finally{nameRoot.release();valueRoot.release()}}function _mono_wasm_typed_array_copy_from(js_handle,pinned_array,begin,end,bytes_per_element,is_exception){BINDING.bindings_lazy_init();var js_obj=BINDING.mono_wasm_get_jsobj_from_js_handle(js_handle);if(!js_obj){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("ERR08: Invalid JS object handle '"+js_handle+"'")}var res=BINDING.typedarray_copy_from(js_obj,pinned_array,begin,end,bytes_per_element);return BINDING._js_to_mono_obj(false,res)}function _mono_wasm_typed_array_copy_to(js_handle,pinned_array,begin,end,bytes_per_element,is_exception){BINDING.bindings_lazy_init();var js_obj=BINDING.mono_wasm_get_jsobj_from_js_handle(js_handle);if(!js_obj){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("ERR07: Invalid JS object handle '"+js_handle+"'")}var res=BINDING.typedarray_copy_to(js_obj,pinned_array,begin,end,bytes_per_element);return BINDING._js_to_mono_obj(false,res)}function _mono_wasm_typed_array_from(pinned_array,begin,end,bytes_per_element,type,is_exception){BINDING.bindings_lazy_init();var res=BINDING.typed_array_from(pinned_array,begin,end,bytes_per_element,type);return BINDING._js_to_mono_obj(true,res)}function _mono_wasm_typed_array_to_array(js_handle,is_exception){BINDING.bindings_lazy_init();var js_obj=BINDING.mono_wasm_get_jsobj_from_js_handle(js_handle);if(!js_obj){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("ERR06: Invalid JS object handle '"+js_handle+"'")}return BINDING.js_typed_array_to_array(js_obj,false)}function _schedule_background_exec(){++MONO.pump_count;if(typeof globalThis.setTimeout==="function"){globalThis.setTimeout(MONO.pump_message,0)}}function _setTempRet0(val){setTempRet0(val)}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value==="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var janFirst=new Date(date.tm_year+1900,0,1);var firstSunday=janFirst.getDay()===0?janFirst:__addDays(janFirst,7-janFirst.getDay());var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstSunday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstSundayUntilEndJanuary=31-firstSunday.getDate();var days=firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstSunday,janFirst)===0?"01":"00"},"%V":function(date){var janFourthThisYear=new Date(date.tm_year+1900,0,4);var janFourthNextYear=new Date(date.tm_year+1901,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);var endDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);if(compareByDay(endDate,firstWeekStartThisYear)<0){return"53"}if(compareByDay(firstWeekStartNextYear,endDate)<=0){return"01"}var daysDifference;if(firstWeekStartThisYear.getFullYear()=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;MONO.export_functions(Module);BINDING.export_functions(Module);var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var asmLibraryArg={"__assert_fail":___assert_fail,"__clock_gettime":___clock_gettime,"__cxa_allocate_exception":___cxa_allocate_exception,"__cxa_begin_catch":___cxa_begin_catch,"__cxa_end_catch":___cxa_end_catch,"__cxa_find_matching_catch_3":___cxa_find_matching_catch_3,"__cxa_throw":___cxa_throw,"__resumeException":___resumeException,"__sys_access":___sys_access,"__sys_chdir":___sys_chdir,"__sys_chmod":___sys_chmod,"__sys_connect":___sys_connect,"__sys_fadvise64_64":___sys_fadvise64_64,"__sys_fchmod":___sys_fchmod,"__sys_fcntl64":___sys_fcntl64,"__sys_fstat64":___sys_fstat64,"__sys_fstatfs64":___sys_fstatfs64,"__sys_ftruncate64":___sys_ftruncate64,"__sys_getcwd":___sys_getcwd,"__sys_getdents64":___sys_getdents64,"__sys_getpid":___sys_getpid,"__sys_getrusage":___sys_getrusage,"__sys_ioctl":___sys_ioctl,"__sys_link":___sys_link,"__sys_lstat64":___sys_lstat64,"__sys_madvise1":___sys_madvise1,"__sys_mkdir":___sys_mkdir,"__sys_mmap2":___sys_mmap2,"__sys_msync":___sys_msync,"__sys_munmap":___sys_munmap,"__sys_open":___sys_open,"__sys_readlink":___sys_readlink,"__sys_recvfrom":___sys_recvfrom,"__sys_rename":___sys_rename,"__sys_rmdir":___sys_rmdir,"__sys_sendto":___sys_sendto,"__sys_setsockopt":___sys_setsockopt,"__sys_shutdown":___sys_shutdown,"__sys_socket":___sys_socket,"__sys_stat64":___sys_stat64,"__sys_symlink":___sys_symlink,"__sys_unlink":___sys_unlink,"__sys_utimensat":___sys_utimensat,"abort":_abort,"clock_getres":_clock_getres,"clock_gettime":_clock_gettime,"compile_function":compile_function,"difftime":_difftime,"dotnet_browser_entropy":_dotnet_browser_entropy,"emscripten_asm_const_int":_emscripten_asm_const_int,"emscripten_get_heap_max":_emscripten_get_heap_max,"emscripten_memcpy_big":_emscripten_memcpy_big,"emscripten_resize_heap":_emscripten_resize_heap,"emscripten_thread_sleep":_emscripten_thread_sleep,"environ_get":_environ_get,"environ_sizes_get":_environ_sizes_get,"exit":_exit,"fd_close":_fd_close,"fd_fdstat_get":_fd_fdstat_get,"fd_pread":_fd_pread,"fd_pwrite":_fd_pwrite,"fd_read":_fd_read,"fd_seek":_fd_seek,"fd_sync":_fd_sync,"fd_write":_fd_write,"flock":_flock,"gai_strerror":_gai_strerror,"getTempRet0":_getTempRet0,"gettimeofday":_gettimeofday,"gmtime_r":_gmtime_r,"invoke_vi":invoke_vi,"llvm_eh_typeid_for":_llvm_eh_typeid_for,"localtime_r":_localtime_r,"mono_set_timeout":_mono_set_timeout,"mono_wasm_add_event_listener":_mono_wasm_add_event_listener,"mono_wasm_asm_loaded":_mono_wasm_asm_loaded,"mono_wasm_create_cs_owned_object":_mono_wasm_create_cs_owned_object,"mono_wasm_fire_debugger_agent_message":_mono_wasm_fire_debugger_agent_message,"mono_wasm_get_by_index":_mono_wasm_get_by_index,"mono_wasm_get_global_object":_mono_wasm_get_global_object,"mono_wasm_get_object_property":_mono_wasm_get_object_property,"mono_wasm_invoke_js_blazor":_mono_wasm_invoke_js_blazor,"mono_wasm_invoke_js_marshalled":_mono_wasm_invoke_js_marshalled,"mono_wasm_invoke_js_unmarshalled":_mono_wasm_invoke_js_unmarshalled,"mono_wasm_invoke_js_with_args":_mono_wasm_invoke_js_with_args,"mono_wasm_release_cs_owned_object":_mono_wasm_release_cs_owned_object,"mono_wasm_remove_event_listener":_mono_wasm_remove_event_listener,"mono_wasm_set_by_index":_mono_wasm_set_by_index,"mono_wasm_set_object_property":_mono_wasm_set_object_property,"mono_wasm_typed_array_copy_from":_mono_wasm_typed_array_copy_from,"mono_wasm_typed_array_copy_to":_mono_wasm_typed_array_copy_to,"mono_wasm_typed_array_from":_mono_wasm_typed_array_from,"mono_wasm_typed_array_to_array":_mono_wasm_typed_array_to_array,"schedule_background_exec":_schedule_background_exec,"setTempRet0":_setTempRet0,"strftime":_strftime,"time":_time,"tzset":_tzset};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["__wasm_call_ctors"]).apply(null,arguments)};var _mono_wasm_register_root=Module["_mono_wasm_register_root"]=function(){return(_mono_wasm_register_root=Module["_mono_wasm_register_root"]=Module["asm"]["mono_wasm_register_root"]).apply(null,arguments)};var _mono_wasm_deregister_root=Module["_mono_wasm_deregister_root"]=function(){return(_mono_wasm_deregister_root=Module["_mono_wasm_deregister_root"]=Module["asm"]["mono_wasm_deregister_root"]).apply(null,arguments)};var _mono_wasm_add_assembly=Module["_mono_wasm_add_assembly"]=function(){return(_mono_wasm_add_assembly=Module["_mono_wasm_add_assembly"]=Module["asm"]["mono_wasm_add_assembly"]).apply(null,arguments)};var _mono_wasm_add_satellite_assembly=Module["_mono_wasm_add_satellite_assembly"]=function(){return(_mono_wasm_add_satellite_assembly=Module["_mono_wasm_add_satellite_assembly"]=Module["asm"]["mono_wasm_add_satellite_assembly"]).apply(null,arguments)};var _mono_wasm_setenv=Module["_mono_wasm_setenv"]=function(){return(_mono_wasm_setenv=Module["_mono_wasm_setenv"]=Module["asm"]["mono_wasm_setenv"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["free"]).apply(null,arguments)};var _mono_wasm_register_bundled_satellite_assemblies=Module["_mono_wasm_register_bundled_satellite_assemblies"]=function(){return(_mono_wasm_register_bundled_satellite_assemblies=Module["_mono_wasm_register_bundled_satellite_assemblies"]=Module["asm"]["mono_wasm_register_bundled_satellite_assemblies"]).apply(null,arguments)};var _mono_wasm_load_runtime=Module["_mono_wasm_load_runtime"]=function(){return(_mono_wasm_load_runtime=Module["_mono_wasm_load_runtime"]=Module["asm"]["mono_wasm_load_runtime"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["malloc"]).apply(null,arguments)};var _mono_wasm_assembly_load=Module["_mono_wasm_assembly_load"]=function(){return(_mono_wasm_assembly_load=Module["_mono_wasm_assembly_load"]=Module["asm"]["mono_wasm_assembly_load"]).apply(null,arguments)};var _mono_wasm_find_corlib_class=Module["_mono_wasm_find_corlib_class"]=function(){return(_mono_wasm_find_corlib_class=Module["_mono_wasm_find_corlib_class"]=Module["asm"]["mono_wasm_find_corlib_class"]).apply(null,arguments)};var _mono_wasm_assembly_find_class=Module["_mono_wasm_assembly_find_class"]=function(){return(_mono_wasm_assembly_find_class=Module["_mono_wasm_assembly_find_class"]=Module["asm"]["mono_wasm_assembly_find_class"]).apply(null,arguments)};var _mono_wasm_assembly_find_method=Module["_mono_wasm_assembly_find_method"]=function(){return(_mono_wasm_assembly_find_method=Module["_mono_wasm_assembly_find_method"]=Module["asm"]["mono_wasm_assembly_find_method"]).apply(null,arguments)};var _mono_wasm_get_delegate_invoke=Module["_mono_wasm_get_delegate_invoke"]=function(){return(_mono_wasm_get_delegate_invoke=Module["_mono_wasm_get_delegate_invoke"]=Module["asm"]["mono_wasm_get_delegate_invoke"]).apply(null,arguments)};var _mono_wasm_box_primitive=Module["_mono_wasm_box_primitive"]=function(){return(_mono_wasm_box_primitive=Module["_mono_wasm_box_primitive"]=Module["asm"]["mono_wasm_box_primitive"]).apply(null,arguments)};var _mono_wasm_invoke_method=Module["_mono_wasm_invoke_method"]=function(){return(_mono_wasm_invoke_method=Module["_mono_wasm_invoke_method"]=Module["asm"]["mono_wasm_invoke_method"]).apply(null,arguments)};var _mono_wasm_assembly_get_entry_point=Module["_mono_wasm_assembly_get_entry_point"]=function(){return(_mono_wasm_assembly_get_entry_point=Module["_mono_wasm_assembly_get_entry_point"]=Module["asm"]["mono_wasm_assembly_get_entry_point"]).apply(null,arguments)};var _mono_wasm_string_get_utf8=Module["_mono_wasm_string_get_utf8"]=function(){return(_mono_wasm_string_get_utf8=Module["_mono_wasm_string_get_utf8"]=Module["asm"]["mono_wasm_string_get_utf8"]).apply(null,arguments)};var _mono_wasm_string_convert=Module["_mono_wasm_string_convert"]=function(){return(_mono_wasm_string_convert=Module["_mono_wasm_string_convert"]=Module["asm"]["mono_wasm_string_convert"]).apply(null,arguments)};var _mono_wasm_string_from_js=Module["_mono_wasm_string_from_js"]=function(){return(_mono_wasm_string_from_js=Module["_mono_wasm_string_from_js"]=Module["asm"]["mono_wasm_string_from_js"]).apply(null,arguments)};var _mono_wasm_string_from_utf16=Module["_mono_wasm_string_from_utf16"]=function(){return(_mono_wasm_string_from_utf16=Module["_mono_wasm_string_from_utf16"]=Module["asm"]["mono_wasm_string_from_utf16"]).apply(null,arguments)};var _mono_wasm_get_obj_type=Module["_mono_wasm_get_obj_type"]=function(){return(_mono_wasm_get_obj_type=Module["_mono_wasm_get_obj_type"]=Module["asm"]["mono_wasm_get_obj_type"]).apply(null,arguments)};var _mono_wasm_try_unbox_primitive_and_get_type=Module["_mono_wasm_try_unbox_primitive_and_get_type"]=function(){return(_mono_wasm_try_unbox_primitive_and_get_type=Module["_mono_wasm_try_unbox_primitive_and_get_type"]=Module["asm"]["mono_wasm_try_unbox_primitive_and_get_type"]).apply(null,arguments)};var _mono_unbox_int=Module["_mono_unbox_int"]=function(){return(_mono_unbox_int=Module["_mono_unbox_int"]=Module["asm"]["mono_unbox_int"]).apply(null,arguments)};var _mono_wasm_array_length=Module["_mono_wasm_array_length"]=function(){return(_mono_wasm_array_length=Module["_mono_wasm_array_length"]=Module["asm"]["mono_wasm_array_length"]).apply(null,arguments)};var _mono_wasm_array_get=Module["_mono_wasm_array_get"]=function(){return(_mono_wasm_array_get=Module["_mono_wasm_array_get"]=Module["asm"]["mono_wasm_array_get"]).apply(null,arguments)};var _mono_wasm_obj_array_new=Module["_mono_wasm_obj_array_new"]=function(){return(_mono_wasm_obj_array_new=Module["_mono_wasm_obj_array_new"]=Module["asm"]["mono_wasm_obj_array_new"]).apply(null,arguments)};var _mono_wasm_obj_array_set=Module["_mono_wasm_obj_array_set"]=function(){return(_mono_wasm_obj_array_set=Module["_mono_wasm_obj_array_set"]=Module["asm"]["mono_wasm_obj_array_set"]).apply(null,arguments)};var _mono_wasm_string_array_new=Module["_mono_wasm_string_array_new"]=function(){return(_mono_wasm_string_array_new=Module["_mono_wasm_string_array_new"]=Module["asm"]["mono_wasm_string_array_new"]).apply(null,arguments)};var _mono_wasm_exec_regression=Module["_mono_wasm_exec_regression"]=function(){return(_mono_wasm_exec_regression=Module["_mono_wasm_exec_regression"]=Module["asm"]["mono_wasm_exec_regression"]).apply(null,arguments)};var _mono_wasm_exit=Module["_mono_wasm_exit"]=function(){return(_mono_wasm_exit=Module["_mono_wasm_exit"]=Module["asm"]["mono_wasm_exit"]).apply(null,arguments)};var _mono_wasm_set_main_args=Module["_mono_wasm_set_main_args"]=function(){return(_mono_wasm_set_main_args=Module["_mono_wasm_set_main_args"]=Module["asm"]["mono_wasm_set_main_args"]).apply(null,arguments)};var _mono_wasm_strdup=Module["_mono_wasm_strdup"]=function(){return(_mono_wasm_strdup=Module["_mono_wasm_strdup"]=Module["asm"]["mono_wasm_strdup"]).apply(null,arguments)};var _mono_wasm_parse_runtime_options=Module["_mono_wasm_parse_runtime_options"]=function(){return(_mono_wasm_parse_runtime_options=Module["_mono_wasm_parse_runtime_options"]=Module["asm"]["mono_wasm_parse_runtime_options"]).apply(null,arguments)};var _mono_wasm_enable_on_demand_gc=Module["_mono_wasm_enable_on_demand_gc"]=function(){return(_mono_wasm_enable_on_demand_gc=Module["_mono_wasm_enable_on_demand_gc"]=Module["asm"]["mono_wasm_enable_on_demand_gc"]).apply(null,arguments)};var _mono_wasm_intern_string=Module["_mono_wasm_intern_string"]=function(){return(_mono_wasm_intern_string=Module["_mono_wasm_intern_string"]=Module["asm"]["mono_wasm_intern_string"]).apply(null,arguments)};var _mono_wasm_string_get_data=Module["_mono_wasm_string_get_data"]=function(){return(_mono_wasm_string_get_data=Module["_mono_wasm_string_get_data"]=Module["asm"]["mono_wasm_string_get_data"]).apply(null,arguments)};var _mono_wasm_typed_array_new=Module["_mono_wasm_typed_array_new"]=function(){return(_mono_wasm_typed_array_new=Module["_mono_wasm_typed_array_new"]=Module["asm"]["mono_wasm_typed_array_new"]).apply(null,arguments)};var _mono_wasm_unbox_enum=Module["_mono_wasm_unbox_enum"]=function(){return(_mono_wasm_unbox_enum=Module["_mono_wasm_unbox_enum"]=Module["asm"]["mono_wasm_unbox_enum"]).apply(null,arguments)};var _memset=Module["_memset"]=function(){return(_memset=Module["_memset"]=Module["asm"]["memset"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["__errno_location"]).apply(null,arguments)};var _putchar=Module["_putchar"]=function(){return(_putchar=Module["_putchar"]=Module["asm"]["putchar"]).apply(null,arguments)};var _mono_background_exec=Module["_mono_background_exec"]=function(){return(_mono_background_exec=Module["_mono_background_exec"]=Module["asm"]["mono_background_exec"]).apply(null,arguments)};var _mono_wasm_get_icudt_name=Module["_mono_wasm_get_icudt_name"]=function(){return(_mono_wasm_get_icudt_name=Module["_mono_wasm_get_icudt_name"]=Module["asm"]["mono_wasm_get_icudt_name"]).apply(null,arguments)};var _mono_wasm_load_icu_data=Module["_mono_wasm_load_icu_data"]=function(){return(_mono_wasm_load_icu_data=Module["_mono_wasm_load_icu_data"]=Module["asm"]["mono_wasm_load_icu_data"]).apply(null,arguments)};var _mono_print_method_from_ip=Module["_mono_print_method_from_ip"]=function(){return(_mono_print_method_from_ip=Module["_mono_print_method_from_ip"]=Module["asm"]["mono_print_method_from_ip"]).apply(null,arguments)};var _mono_set_timeout_exec=Module["_mono_set_timeout_exec"]=function(){return(_mono_set_timeout_exec=Module["_mono_set_timeout_exec"]=Module["asm"]["mono_set_timeout_exec"]).apply(null,arguments)};var _htons=Module["_htons"]=function(){return(_htons=Module["_htons"]=Module["asm"]["htons"]).apply(null,arguments)};var _mono_wasm_set_is_debugger_attached=Module["_mono_wasm_set_is_debugger_attached"]=function(){return(_mono_wasm_set_is_debugger_attached=Module["_mono_wasm_set_is_debugger_attached"]=Module["asm"]["mono_wasm_set_is_debugger_attached"]).apply(null,arguments)};var _mono_wasm_send_dbg_command_with_parms=Module["_mono_wasm_send_dbg_command_with_parms"]=function(){return(_mono_wasm_send_dbg_command_with_parms=Module["_mono_wasm_send_dbg_command_with_parms"]=Module["asm"]["mono_wasm_send_dbg_command_with_parms"]).apply(null,arguments)};var _mono_wasm_send_dbg_command=Module["_mono_wasm_send_dbg_command"]=function(){return(_mono_wasm_send_dbg_command=Module["_mono_wasm_send_dbg_command"]=Module["asm"]["mono_wasm_send_dbg_command"]).apply(null,arguments)};var _ntohs=Module["_ntohs"]=function(){return(_ntohs=Module["_ntohs"]=Module["asm"]["ntohs"]).apply(null,arguments)};var _emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=function(){return(_emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=Module["asm"]["emscripten_main_thread_process_queued_calls"]).apply(null,arguments)};var _htonl=Module["_htonl"]=function(){return(_htonl=Module["_htonl"]=Module["asm"]["htonl"]).apply(null,arguments)};var __get_tzname=Module["__get_tzname"]=function(){return(__get_tzname=Module["__get_tzname"]=Module["asm"]["_get_tzname"]).apply(null,arguments)};var __get_daylight=Module["__get_daylight"]=function(){return(__get_daylight=Module["__get_daylight"]=Module["asm"]["_get_daylight"]).apply(null,arguments)};var __get_timezone=Module["__get_timezone"]=function(){return(__get_timezone=Module["__get_timezone"]=Module["asm"]["_get_timezone"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["stackSave"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["stackRestore"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["stackAlloc"]).apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return(_setThrew=Module["_setThrew"]=Module["asm"]["setThrew"]).apply(null,arguments)};var ___cxa_can_catch=Module["___cxa_can_catch"]=function(){return(___cxa_can_catch=Module["___cxa_can_catch"]=Module["asm"]["__cxa_can_catch"]).apply(null,arguments)};var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=function(){return(___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=Module["asm"]["__cxa_is_pointer_type"]).apply(null,arguments)};var _memalign=Module["_memalign"]=function(){return(_memalign=Module["_memalign"]=Module["asm"]["memalign"]).apply(null,arguments)};var dynCall_iijj=Module["dynCall_iijj"]=function(){return(dynCall_iijj=Module["dynCall_iijj"]=Module["asm"]["dynCall_iijj"]).apply(null,arguments)};var dynCall_iij=Module["dynCall_iij"]=function(){return(dynCall_iij=Module["dynCall_iij"]=Module["asm"]["dynCall_iij"]).apply(null,arguments)};var dynCall_ji=Module["dynCall_ji"]=function(){return(dynCall_ji=Module["dynCall_ji"]=Module["asm"]["dynCall_ji"]).apply(null,arguments)};var dynCall_j=Module["dynCall_j"]=function(){return(dynCall_j=Module["dynCall_j"]=Module["asm"]["dynCall_j"]).apply(null,arguments)};var dynCall_iijji=Module["dynCall_iijji"]=function(){return(dynCall_iijji=Module["dynCall_iijji"]=Module["asm"]["dynCall_iijji"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["dynCall_jiji"]).apply(null,arguments)};var dynCall_iiji=Module["dynCall_iiji"]=function(){return(dynCall_iiji=Module["dynCall_iiji"]=Module["asm"]["dynCall_iiji"]).apply(null,arguments)};var dynCall_iijiiij=Module["dynCall_iijiiij"]=function(){return(dynCall_iijiiij=Module["dynCall_iijiiij"]=Module["asm"]["dynCall_iijiiij"]).apply(null,arguments)};var dynCall_iiiij=Module["dynCall_iiiij"]=function(){return(dynCall_iiiij=Module["dynCall_iiiij"]=Module["asm"]["dynCall_iiiij"]).apply(null,arguments)};var dynCall_jiiij=Module["dynCall_jiiij"]=function(){return(dynCall_jiiij=Module["dynCall_jiiij"]=Module["asm"]["dynCall_jiiij"]).apply(null,arguments)};var dynCall_viiijjii=Module["dynCall_viiijjii"]=function(){return(dynCall_viiijjii=Module["dynCall_viiijjii"]=Module["asm"]["dynCall_viiijjii"]).apply(null,arguments)};var dynCall_jd=Module["dynCall_jd"]=function(){return(dynCall_jd=Module["dynCall_jd"]=Module["asm"]["dynCall_jd"]).apply(null,arguments)};var dynCall_jf=Module["dynCall_jf"]=function(){return(dynCall_jf=Module["dynCall_jf"]=Module["asm"]["dynCall_jf"]).apply(null,arguments)};var dynCall_jiiiiiiiii=Module["dynCall_jiiiiiiiii"]=function(){return(dynCall_jiiiiiiiii=Module["dynCall_jiiiiiiiii"]=Module["asm"]["dynCall_jiiiiiiiii"]).apply(null,arguments)};var dynCall_vj=Module["dynCall_vj"]=function(){return(dynCall_vj=Module["dynCall_vj"]=Module["asm"]["dynCall_vj"]).apply(null,arguments)};var dynCall_iji=Module["dynCall_iji"]=function(){return(dynCall_iji=Module["dynCall_iji"]=Module["asm"]["dynCall_iji"]).apply(null,arguments)};var dynCall_ij=Module["dynCall_ij"]=function(){return(dynCall_ij=Module["dynCall_ij"]=Module["asm"]["dynCall_ij"]).apply(null,arguments)};var dynCall_jj=Module["dynCall_jj"]=function(){return(dynCall_jj=Module["dynCall_jj"]=Module["asm"]["dynCall_jj"]).apply(null,arguments)};var dynCall_iiijiiiii=Module["dynCall_iiijiiiii"]=function(){return(dynCall_iiijiiiii=Module["dynCall_iiijiiiii"]=Module["asm"]["dynCall_iiijiiiii"]).apply(null,arguments)};var dynCall_vijj=Module["dynCall_vijj"]=function(){return(dynCall_vijj=Module["dynCall_vijj"]=Module["asm"]["dynCall_vijj"]).apply(null,arguments)};var dynCall_iiijiiii=Module["dynCall_iiijiiii"]=function(){return(dynCall_iiijiiii=Module["dynCall_iiijiiii"]=Module["asm"]["dynCall_iiijiiii"]).apply(null,arguments)};var dynCall_jiiiii=Module["dynCall_jiiiii"]=function(){return(dynCall_jiiiii=Module["dynCall_jiiiii"]=Module["asm"]["dynCall_jiiiii"]).apply(null,arguments)};var dynCall_jij=Module["dynCall_jij"]=function(){return(dynCall_jij=Module["dynCall_jij"]=Module["asm"]["dynCall_jij"]).apply(null,arguments)};var dynCall_jijj=Module["dynCall_jijj"]=function(){return(dynCall_jijj=Module["dynCall_jijj"]=Module["asm"]["dynCall_jijj"]).apply(null,arguments)};var dynCall_iijjiii=Module["dynCall_iijjiii"]=function(){return(dynCall_iijjiii=Module["dynCall_iijjiii"]=Module["asm"]["dynCall_iijjiii"]).apply(null,arguments)};var dynCall_vijjjii=Module["dynCall_vijjjii"]=function(){return(dynCall_vijjjii=Module["dynCall_vijjjii"]=Module["asm"]["dynCall_vijjjii"]).apply(null,arguments)};var dynCall_iijii=Module["dynCall_iijii"]=function(){return(dynCall_iijii=Module["dynCall_iijii"]=Module["asm"]["dynCall_iijii"]).apply(null,arguments)};var dynCall_iijiii=Module["dynCall_iijiii"]=function(){return(dynCall_iijiii=Module["dynCall_iijiii"]=Module["asm"]["dynCall_iijiii"]).apply(null,arguments)};var dynCall_vijiiii=Module["dynCall_vijiiii"]=function(){return(dynCall_vijiiii=Module["dynCall_vijiiii"]=Module["asm"]["dynCall_vijiiii"]).apply(null,arguments)};var dynCall_iijiiii=Module["dynCall_iijiiii"]=function(){return(dynCall_iijiiii=Module["dynCall_iijiiii"]=Module["asm"]["dynCall_iijiiii"]).apply(null,arguments)};var dynCall_vij=Module["dynCall_vij"]=function(){return(dynCall_vij=Module["dynCall_vij"]=Module["asm"]["dynCall_vij"]).apply(null,arguments)};var dynCall_jii=Module["dynCall_jii"]=function(){return(dynCall_jii=Module["dynCall_jii"]=Module["asm"]["dynCall_jii"]).apply(null,arguments)};function invoke_vi(index,a1){var sp=stackSave();try{wasmTable.get(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["setValue"]=setValue;Module["getValue"]=getValue;Module["UTF8ArrayToString"]=UTF8ArrayToString;Module["UTF8ToString"]=UTF8ToString;Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;Module["addFunction"]=addFunction;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;if(implicit&&keepRuntimeAlive()&&status===0){return}if(keepRuntimeAlive()){}else{exitRuntime();if(Module["onExit"])Module["onExit"](status);ABORT=true}quit_(status,new ExitStatus(status))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); - -// SIG // Begin signature block -// SIG // MIIorAYJKoZIhvcNAQcCoIIonTCCKJkCAQExDzANBglg -// SIG // hkgBZQMEAgEFADB3BgorBgEEAYI3AgEEoGkwZzAyBgor -// SIG // BgEEAYI3AgEeMCQCAQEEEBDgyQbOONQRoqMAEEvTUJAC -// SIG // AQACAQACAQACAQACAQAwMTANBglghkgBZQMEAgEFAAQg -// SIG // TQePqAWSw1A+4UE8oHLkRl4VTuaq7N4OVFD3928S/POg -// SIG // gg3lMIIGYzCCBEugAwIBAgITMwAAA3zJ9rztB1muCAAA -// SIG // AAADfDANBgkqhkiG9w0BAQwFADB+MQswCQYDVQQGEwJV -// SIG // UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH -// SIG // UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv -// SIG // cmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBT -// SIG // aWduaW5nIFBDQSAyMDExMB4XDTIzMDUxMTE5MDMzMloX -// SIG // DTI0MDUwODE5MDMzMlowYzELMAkGA1UEBhMCVVMxEzAR -// SIG // BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v -// SIG // bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv -// SIG // bjENMAsGA1UEAxMELk5FVDCCAaIwDQYJKoZIhvcNAQEB -// SIG // BQADggGPADCCAYoCggGBAM7wia8MfPwd4mtILpj8qoFF -// SIG // 2NU9AGUh6KMxjoH5wsKo/CNMznlw6z6QDoXMd1SjRH/n -// SIG // mWLJ9UwKsIHC4wjcIIQA2oTK9wiBP2C4JADckr1ib5QF -// SIG // VIdjt1rgvt7QVuVcu3i+7vIlThcWBQFDCipaAmlQG5WS -// SIG // Lf3DbJZuL5FNO5hxjw5mqtZg/RifUhMu6gw/ZandJNcC -// SIG // 3TW3ZkLpWhjKdJIJh6omc+RYTQByB3XUt4P1wTh4Ah2w -// SIG // ImmwDnQMiHYgLiKTaP1TQBTbmB1o4ims4knVLsfrXKhR -// SIG // UumxtoBIN/YyvhwpJuXqJWTgUq13YyqxNEyNC1QWtGpc -// SIG // Ww+jSkX2sX6yNkxKexr1D+2lyu5C4nNHEox0huDXcn4C -// SIG // eEpERgkVAnxhPLB68NLqqzBa7kLv5V8cNl9rG2FE64AG -// SIG // QA9WxNNUiIt+ItJUgq1IF2t7tdJGvmsJDj07yV0TToU6 -// SIG // 5kqUexgpLaDoZizsV4ZhPYjWHpv0D6juvnBPTt4ionDc -// SIG // nFsv9wIDAQABo4IBczCCAW8wHwYDVR0lBBgwFgYKKwYB -// SIG // BAGCN0wIAQYIKwYBBQUHAwMwHQYDVR0OBBYEFFKpamFH -// SIG // SEZcQyIedxp5ANsBMD5JMEUGA1UdEQQ+MDykOjA4MR4w -// SIG // HAYDVQQLExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xFjAU -// SIG // BgNVBAUTDTQ2NDIyMys1MDEwMTUwHwYDVR0jBBgwFoAU -// SIG // SG5k5VAF04KqFzc3IrVtqMp1ApUwVAYDVR0fBE0wSzBJ -// SIG // oEegRYZDaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br -// SIG // aW9wcy9jcmwvTWljQ29kU2lnUENBMjAxMV8yMDExLTA3 -// SIG // LTA4LmNybDBhBggrBgEFBQcBAQRVMFMwUQYIKwYBBQUH -// SIG // MAKGRWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lv -// SIG // cHMvY2VydHMvTWljQ29kU2lnUENBMjAxMV8yMDExLTA3 -// SIG // LTA4LmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEB -// SIG // DAUAA4ICAQAOSEYc1GtkOHuaEONN2ZhGwBfVVOls91pV -// SIG // 9txVvKdJwl8XjM3UD80N0c4mvoVT6K1a8VgJom58eg7c -// SIG // 6HuwPsdvhNlaslOhXnFTHGUqJ++gXPDgH5a2w5j0IHTm -// SIG // yYkSv4NDSi9u2FtgWRjlfyag9r8kvBRUv/M8ISO2dqne -// SIG // LiQhJcTL95mFcpt7Jf2m+b25wM6S5BPvV4sgepZMQwGJ -// SIG // HBANg+w2YUfgQ430mnZHg70iI6V+rMEcPW6jFaf9B/5+ -// SIG // vvXlw4yabr32W3ofks4OxTX8HVfRLO8uK/jdCODX2vAa -// SIG // Zeh7YNdtTGqMsOhI6KOW+IAQrUnvEbiRPmPqvgFjAH0e -// SIG // NUr/zy/Xt8gxBranFQdM1gVv57aU/HMtK8L8tpAT0Zjc -// SIG // h/4xE2oHpVdcIPxjISlHQJIL7NtEI0/WPNA7afEiUj8C -// SIG // Ztxg9ivyy/hLd+i4COfhFeraWsxkwM+oKKYpWJJFQTgJ -// SIG // Z8kHhoOTVxoxMseEfUalzoL0C+MHsDdsMn5VQw3LCuoq -// SIG // pnhG6vnN0TMNsbNydBflcBlACOPz+S6QNfp62r0JYWXw -// SIG // BbtRM+3A9dHtD4nqr/ZjtCAG8GdxU220D240BmU5/TZR -// SIG // OHHwPLl4Afmki/uogGvnFyd19wFHHG80gB5N9rsdKUsx -// SIG // hO+CqUzuQeurTLKzf6lKyjOfwYQ2IMpN1zCCB3owggVi -// SIG // oAMCAQICCmEOkNIAAAAAAAMwDQYJKoZIhvcNAQELBQAw -// SIG // gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n -// SIG // dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN -// SIG // aWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1p -// SIG // Y3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 -// SIG // eSAyMDExMB4XDTExMDcwODIwNTkwOVoXDTI2MDcwODIx -// SIG // MDkwOVowfjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh -// SIG // c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV -// SIG // BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UE -// SIG // AxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAx -// SIG // MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -// SIG // AKvw+nIQHC6t2G6qghBNNLrytlghn0IbKmvpWlCquAY4 -// SIG // GgRJun/DDB7dN2vGEtgL8DjCmQawyDnVARQxQtOJDXlk -// SIG // h36UYCRsr55JnOloXtLfm1OyCizDr9mpK656Ca/XllnK -// SIG // YBoF6WZ26DJSJhIv56sIUM+zRLdd2MQuA3WraPPLbfM6 -// SIG // XKEW9Ea64DhkrG5kNXimoGMPLdNAk/jj3gcN1Vx5pUkp -// SIG // 5w2+oBN3vpQ97/vjK1oQH01WKKJ6cuASOrdJXtjt7UOR -// SIG // g9l7snuGG9k+sYxd6IlPhBryoS9Z5JA7La4zWMW3Pv4y -// SIG // 07MDPbGyr5I4ftKdgCz1TlaRITUlwzluZH9TupwPrRkj -// SIG // hMv0ugOGjfdf8NBSv4yUh7zAIXQlXxgotswnKDglmDlK -// SIG // Ns98sZKuHCOnqWbsYR9q4ShJnV+I4iVd0yFLPlLEtVc/ -// SIG // JAPw0XpbL9Uj43BdD1FGd7P4AOG8rAKCX9vAFbO9G9RV -// SIG // S+c5oQ/pI0m8GLhEfEXkwcNyeuBy5yTfv0aZxe/CHFfb -// SIG // g43sTUkwp6uO3+xbn6/83bBm4sGXgXvt1u1L50kppxMo -// SIG // pqd9Z4DmimJ4X7IvhNdXnFy/dygo8e1twyiPLI9AN0/B -// SIG // 4YVEicQJTMXUpUMvdJX3bvh4IFgsE11glZo+TzOE2rCI -// SIG // F96eTvSWsLxGoGyY0uDWiIwLAgMBAAGjggHtMIIB6TAQ -// SIG // BgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQUSG5k5VAF -// SIG // 04KqFzc3IrVtqMp1ApUwGQYJKwYBBAGCNxQCBAweCgBT -// SIG // AHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -// SIG // MAMBAf8wHwYDVR0jBBgwFoAUci06AjGQQ7kUBU7h6qfH -// SIG // MdEjiTQwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDovL2Ny -// SIG // bC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMv -// SIG // TWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNybDBe -// SIG // BggrBgEFBQcBAQRSMFAwTgYIKwYBBQUHMAKGQmh0dHA6 -// SIG // Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWlj -// SIG // Um9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNydDCBnwYD -// SIG // VR0gBIGXMIGUMIGRBgkrBgEEAYI3LgMwgYMwPwYIKwYB -// SIG // BQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w -// SIG // a2lvcHMvZG9jcy9wcmltYXJ5Y3BzLmh0bTBABggrBgEF -// SIG // BQcCAjA0HjIgHQBMAGUAZwBhAGwAXwBwAG8AbABpAGMA -// SIG // eQBfAHMAdABhAHQAZQBtAGUAbgB0AC4gHTANBgkqhkiG -// SIG // 9w0BAQsFAAOCAgEAZ/KGpZjgVHkaLtPYdGcimwuWEeFj -// SIG // kplCln3SeQyQwWVfLiw++MNy0W2D/r4/6ArKO79HqaPz -// SIG // adtjvyI1pZddZYSQfYtGUFXYDJJ80hpLHPM8QotS0LD9 -// SIG // a+M+By4pm+Y9G6XUtR13lDni6WTJRD14eiPzE32mkHSD -// SIG // jfTLJgJGKsKKELukqQUMm+1o+mgulaAqPyprWEljHwlp -// SIG // blqYluSD9MCP80Yr3vw70L01724lruWvJ+3Q3fMOr5ko -// SIG // l5hNDj0L8giJ1h/DMhji8MUtzluetEk5CsYKwsatruWy -// SIG // 2dsViFFFWDgycScaf7H0J/jeLDogaZiyWYlobm+nt3TD -// SIG // QAUGpgEqKD6CPxNNZgvAs0314Y9/HG8VfUWnduVAKmWj -// SIG // w11SYobDHWM2l4bf2vP48hahmifhzaWX0O5dY0HjWwec -// SIG // hz4GdwbRBrF1HxS+YWG18NzGGwS+30HHDiju3mUv7Jf2 -// SIG // oVyW2ADWoUa9WfOXpQlLSBCZgB/QACnFsZulP0V3HjXG -// SIG // 0qKin3p6IvpIlR+r+0cjgPWe+L9rt0uX4ut1eBrs6jeZ -// SIG // eRhL/9azI2h15q/6/IvrC4DqaTuv/DDtBEyO3991bWOR -// SIG // PdGdVk5Pv4BXIqF4ETIheu9BCrE/+6jMpF3BoYibV3FW -// SIG // TkhFwELJm3ZbCoBIa/15n8G9bW1qyVJzEw16UM0xghof -// SIG // MIIaGwIBATCBlTB+MQswCQYDVQQGEwJVUzETMBEGA1UE -// SIG // CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe -// SIG // MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgw -// SIG // JgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBD -// SIG // QSAyMDExAhMzAAADfMn2vO0HWa4IAAAAAAN8MA0GCWCG -// SIG // SAFlAwQCAQUAoIGuMBkGCSqGSIb3DQEJAzEMBgorBgEE -// SIG // AYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3 -// SIG // AgEVMC8GCSqGSIb3DQEJBDEiBCBnmN2X2UE1Rv4UCq+D -// SIG // DqGYze7Fi/IG3Xosu2XETQlTYDBCBgorBgEEAYI3AgEM -// SIG // MTQwMqAUgBIATQBpAGMAcgBvAHMAbwBmAHShGoAYaHR0 -// SIG // cDovL3d3dy5taWNyb3NvZnQuY29tMA0GCSqGSIb3DQEB -// SIG // AQUABIIBgEoJ+Eqx1p5b0Ggifcs4n5PbOq18NHA4fwGb -// SIG // sbqxiB65FkCx3/dYqSg61vB5gpwWk5SMcXI8SdN4x9Ii -// SIG // 3zAeELVhWDPn1aPdAg0swzi1WYkKqSCqhp5APLQialb7 -// SIG // PpGD3ugXenntUBHnbUPZJas0dI0u/VIIW8x6FJMB8+y0 -// SIG // jPR/TlaTn1UV0QVYHjt/orRzSGMUpPHAEmtZnp+rwKqR -// SIG // 5So+iA2em5NJitGNaxr+bZIgc1Ws+7/o1KeHvI4wbZhq -// SIG // PMXjrit1118cMpbMsk5qh7dFlJgg4cW39Olj8xGAtiX6 -// SIG // weAjf3zSf9DM5q3fq4nZgGikDm3idL2nM5LHHVrKj1tt -// SIG // 70fms3YNKQow9RkdBr2kDPMcVvDksLFazjN4TsqqIY1p -// SIG // EjYScgAovxcNdPXlZ+1adHE8m+vU+KWrwcyvrD4B4Eqo -// SIG // o/R7fp2QtuWxZbTkDMEMxQSx44Hd+azFfby4Qr6+Znnv -// SIG // ZE5HiDJBhDlhTFZH6ezUcEg0AUiMEoeHjpHoQKGCFykw -// SIG // ghclBgorBgEEAYI3AwMBMYIXFTCCFxEGCSqGSIb3DQEH -// SIG // AqCCFwIwghb+AgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFZ -// SIG // BgsqhkiG9w0BCRABBKCCAUgEggFEMIIBQAIBAQYKKwYB -// SIG // BAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCBinnEK7d9j -// SIG // 77Ck/kJ56EwzVrc4sxshS7NmqRGHTC6pogIGZYM1N1M1 -// SIG // GBMyMDI0MDEyMTIyNTUwMi4xNzlaMASAAgH0oIHYpIHV -// SIG // MIHSMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu -// SIG // Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV -// SIG // TWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRN -// SIG // aWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0 -// SIG // ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOkZDNDEt -// SIG // NEJENC1EMjIwMSUwIwYDVQQDExxNaWNyb3NvZnQgVGlt -// SIG // ZS1TdGFtcCBTZXJ2aWNloIIReDCCBycwggUPoAMCAQIC -// SIG // EzMAAAHimZmV8dzjIOsAAQAAAeIwDQYJKoZIhvcNAQEL -// SIG // BQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp -// SIG // bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT -// SIG // FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd -// SIG // TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcN -// SIG // MjMxMDEyMTkwNzI1WhcNMjUwMTEwMTkwNzI1WjCB0jEL -// SIG // MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x -// SIG // EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv -// SIG // c29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9z -// SIG // b2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMSYw -// SIG // JAYDVQQLEx1UaGFsZXMgVFNTIEVTTjpGQzQxLTRCRDQt -// SIG // RDIyMDElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3Rh -// SIG // bXAgU2VydmljZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -// SIG // ADCCAgoCggIBALVjtZhV+kFmb8cKQpg2mzisDlRI978G -// SIG // b2amGvbAmCd04JVGeTe/QGzM8KbQrMDol7DC7jS03Jkc -// SIG // rPsWi9WpVwsIckRQ8AkX1idBG9HhyCspAavfuvz55khl -// SIG // 7brPQx7H99UJbsE3wMmpmJasPWpgF05zZlvpWQDULDcI -// SIG // Yyl5lXI4HVZ5N6MSxWO8zwWr4r9xkMmUXs7ICxDJr5a3 -// SIG // 9SSePAJRIyznaIc0WzZ6MFcTRzLLNyPBE4KrVv1LFd96 -// SIG // FNxAzwnetSePg88EmRezr2T3HTFElneJXyQYd6YQ7eCI -// SIG // c7yllWoY03CEg9ghorp9qUKcBUfFcS4XElf3GSERnlzJ -// SIG // sK7s/ZGPU4daHT2jWGoYha2QCOmkgjOmBFCqQFFwFmsP -// SIG // rZj4eQszYxq4c4HqPnUu4hT4aqpvUZ3qIOXbdyU42pNL -// SIG // 93cn0rPTTleOUsOQbgvlRdthFCBepxfb6nbsp3fcZaPB -// SIG // fTbtXVa8nLQuMCBqyfsebuqnbwj+lHQfqKpivpyd7KCW -// SIG // ACoj78XUwYqy1HyYnStTme4T9vK6u2O/KThfROeJHiSg -// SIG // 44ymFj+34IcFEhPogaKvNNsTVm4QbqphCyknrwByqorB -// SIG // CLH6bllRtJMJwmu7GRdTQsIx2HMKqphEtpSm1z3ufASd -// SIG // PrgPhsQIRFkHZGuihL1Jjj4Lu3CbAmha0lOrAgMBAAGj -// SIG // ggFJMIIBRTAdBgNVHQ4EFgQURIQOEdq+7QdslptJiCRN -// SIG // pXgJ2gUwHwYDVR0jBBgwFoAUn6cVXQBeYl2D9OXSZacb -// SIG // UzUZ6XIwXwYDVR0fBFgwVjBUoFKgUIZOaHR0cDovL3d3 -// SIG // dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9z -// SIG // b2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSku -// SIG // Y3JsMGwGCCsGAQUFBwEBBGAwXjBcBggrBgEFBQcwAoZQ -// SIG // aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j -// SIG // ZXJ0cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENB -// SIG // JTIwMjAxMCgxKS5jcnQwDAYDVR0TAQH/BAIwADAWBgNV -// SIG // HSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMC -// SIG // B4AwDQYJKoZIhvcNAQELBQADggIBAORURDGrVRTbnulf -// SIG // sg2cTsyyh7YXvhVU7NZMkITAQYsFEPVgvSviCylr5ap3 -// SIG // ka76Yz0t/6lxuczI6w7tXq8n4WxUUgcj5wAhnNorhnD8 -// SIG // ljYqbck37fggYK3+wEwLhP1PGC5tvXK0xYomU1nU+lXO -// SIG // y9ZRnShI/HZdFrw2srgtsbWow9OMuADS5lg7okrXa2da -// SIG // COGnxuaD1IO+65E7qv2O0W0sGj7AWdOjNdpexPrspL2K -// SIG // EcOMeJVmkk/O0ganhFzzHAnWjtNWneU11WQ6Bxv8OpN1 -// SIG // fY9wzQoiycgvOOJM93od55EGeXxfF8bofLVlUE3zIiko -// SIG // Sed+8s61NDP+x9RMya2mwK/Ys1xdvDlZTHndIKssfmu3 -// SIG // vu/a+BFf2uIoycVTvBQpv/drRJD68eo401mkCRFkmy/+ -// SIG // BmQlRrx2rapqAu5k0Nev+iUdBUKmX/iOaKZ75vuQg7hC -// SIG // iBA5xIm5ZIXDSlX47wwFar3/BgTwntMq9ra6QRAeS/o/ -// SIG // uYWkmvqvE8Aq38QmKgTiBnWSS/uVPcaHEyArnyFh5G+q -// SIG // eCGmL44MfEnFEhxc3saPmXhe6MhSgCIGJUZDA7336nQD -// SIG // 8fn4y6534Lel+LuT5F5bFt0mLwd+H5GxGzObZmm/c3pE -// SIG // WtHv1ug7dS/Dfrcd1sn2E4gk4W1L1jdRBbK9xwkMmwY+ -// SIG // CHZeMSvBMIIHcTCCBVmgAwIBAgITMwAAABXF52ueAptJ -// SIG // mQAAAAAAFTANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UE -// SIG // BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV -// SIG // BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD -// SIG // b3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJv -// SIG // b3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcN -// SIG // MjEwOTMwMTgyMjI1WhcNMzAwOTMwMTgzMjI1WjB8MQsw -// SIG // CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ -// SIG // MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z -// SIG // b2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3Nv -// SIG // ZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDCCAiIwDQYJKoZI -// SIG // hvcNAQEBBQADggIPADCCAgoCggIBAOThpkzntHIhC3mi -// SIG // y9ckeb0O1YLT/e6cBwfSqWxOdcjKNVf2AX9sSuDivbk+ -// SIG // F2Az/1xPx2b3lVNxWuJ+Slr+uDZnhUYjDLWNE893MsAQ -// SIG // GOhgfWpSg0S3po5GawcU88V29YZQ3MFEyHFcUTE3oAo4 -// SIG // bo3t1w/YJlN8OWECesSq/XJprx2rrPY2vjUmZNqYO7oa -// SIG // ezOtgFt+jBAcnVL+tuhiJdxqD89d9P6OU8/W7IVWTe/d -// SIG // vI2k45GPsjksUZzpcGkNyjYtcI4xyDUoveO0hyTD4MmP -// SIG // frVUj9z6BVWYbWg7mka97aSueik3rMvrg0XnRm7KMtXA -// SIG // hjBcTyziYrLNueKNiOSWrAFKu75xqRdbZ2De+JKRHh09 -// SIG // /SDPc31BmkZ1zcRfNN0Sidb9pSB9fvzZnkXftnIv231f -// SIG // gLrbqn427DZM9ituqBJR6L8FA6PRc6ZNN3SUHDSCD/AQ -// SIG // 8rdHGO2n6Jl8P0zbr17C89XYcz1DTsEzOUyOArxCaC4Q -// SIG // 6oRRRuLRvWoYWmEBc8pnol7XKHYC4jMYctenIPDC+hIK -// SIG // 12NvDMk2ZItboKaDIV1fMHSRlJTYuVD5C4lh8zYGNRiE -// SIG // R9vcG9H9stQcxWv2XFJRXRLbJbqvUAV6bMURHXLvjflS -// SIG // xIUXk8A8FdsaN8cIFRg/eKtFtvUeh17aj54WcmnGrnu3 -// SIG // tz5q4i6tAgMBAAGjggHdMIIB2TASBgkrBgEEAYI3FQEE -// SIG // BQIDAQABMCMGCSsGAQQBgjcVAgQWBBQqp1L+ZMSavoKR -// SIG // PEY1Kc8Q/y8E7jAdBgNVHQ4EFgQUn6cVXQBeYl2D9OXS -// SIG // ZacbUzUZ6XIwXAYDVR0gBFUwUzBRBgwrBgEEAYI3TIN9 -// SIG // AQEwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNy -// SIG // b3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnku -// SIG // aHRtMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkGCSsGAQQB -// SIG // gjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjAP -// SIG // BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP -// SIG // 6KJcYmjRPZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJoEeG -// SIG // RWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3Js -// SIG // L3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIz -// SIG // LmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKG -// SIG // Pmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2Vy -// SIG // dHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MA0G -// SIG // CSqGSIb3DQEBCwUAA4ICAQCdVX38Kq3hLB9nATEkW+Ge -// SIG // ckv8qW/qXBS2Pk5HZHixBpOXPTEztTnXwnE2P9pkbHzQ -// SIG // dTltuw8x5MKP+2zRoZQYIu7pZmc6U03dmLq2HnjYNi6c -// SIG // qYJWAAOwBb6J6Gngugnue99qb74py27YP0h1AdkY3m2C -// SIG // DPVtI1TkeFN1JFe53Z/zjj3G82jfZfakVqr3lbYoVSfQ -// SIG // JL1AoL8ZthISEV09J+BAljis9/kpicO8F7BUhUKz/Aye -// SIG // ixmJ5/ALaoHCgRlCGVJ1ijbCHcNhcy4sa3tuPywJeBTp -// SIG // kbKpW99Jo3QMvOyRgNI95ko+ZjtPu4b6MhrZlvSP9pEB -// SIG // 9s7GdP32THJvEKt1MMU0sHrYUP4KWN1APMdUbZ1jdEgs -// SIG // sU5HLcEUBHG/ZPkkvnNtyo4JvbMBV0lUZNlz138eW0QB -// SIG // jloZkWsNn6Qo3GcZKCS6OEuabvshVGtqRRFHqfG3rsjo -// SIG // iV5PndLQTHa1V1QJsWkBRH58oWFsc/4Ku+xBZj1p/cvB -// SIG // QUl+fpO+y/g75LcVv7TOPqUxUYS8vwLBgqJ7Fx0ViY1w -// SIG // /ue10CgaiQuPNtq6TPmb/wrpNPgkNWcr4A245oyZ1uEi -// SIG // 6vAnQj0llOZ0dFtq0Z4+7X6gMTN9vMvpe784cETRkPHI -// SIG // qzqKOghif9lwY1NNje6CbaUFEMFxBmoQtB1VM1izoXBm -// SIG // 8qGCAtQwggI9AgEBMIIBAKGB2KSB1TCB0jELMAkGA1UE -// SIG // BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV -// SIG // BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD -// SIG // b3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IEly -// SIG // ZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMSYwJAYDVQQL -// SIG // Ex1UaGFsZXMgVFNTIEVTTjpGQzQxLTRCRDQtRDIyMDEl -// SIG // MCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vy -// SIG // dmljZaIjCgEBMAcGBSsOAwIaAxUAFpuZafp0bnpJdIhf -// SIG // iB1d8pTohm+ggYMwgYCkfjB8MQswCQYDVQQGEwJVUzET -// SIG // MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk -// SIG // bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 -// SIG // aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFt -// SIG // cCBQQ0EgMjAxMDANBgkqhkiG9w0BAQUFAAIFAOlX4IEw -// SIG // IhgPMjAyNDAxMjIwMjI3MTNaGA8yMDI0MDEyMzAyMjcx -// SIG // M1owdDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA6VfggQIB -// SIG // ADAHAgEAAgIDHTAHAgEAAgISmzAKAgUA6VkyAQIBADA2 -// SIG // BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAow -// SIG // CAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEB -// SIG // BQUAA4GBADDGFKMf5CvdbQHJ4SVeburl2yRonb1BDDdb -// SIG // kAyQgxp4bJk1Kvg//HJYEVq6/fdRYxUEnbxs+wz4kBLU -// SIG // FddogpJ6Zre9QNA7iT23+JF8pPlIau7+cE0RHrhJjmZH -// SIG // 2k10DNBRTgddkr628rmChBoSHaemX4223xAu5fASMhYL -// SIG // pw7vMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMCVVMx -// SIG // EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl -// SIG // ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh -// SIG // dGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3Rh -// SIG // bXAgUENBIDIwMTACEzMAAAHimZmV8dzjIOsAAQAAAeIw -// SIG // DQYJYIZIAWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzEN -// SIG // BgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgZbaz -// SIG // BcQ4HT8rYFz0Gfypjp0HIJRmI2JO/8gNXlP6Ab0wgfoG -// SIG // CyqGSIb3DQEJEAIvMYHqMIHnMIHkMIG9BCAriSpKEP0m -// SIG // uMbBUETODoL4d5LU6I/bjucIZkOJCI9//zCBmDCBgKR+ -// SIG // MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n -// SIG // dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN -// SIG // aWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p -// SIG // Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB -// SIG // 4pmZlfHc4yDrAAEAAAHiMCIEIIx6jRoGesJV6zmgtmHQ -// SIG // Iu63pN4CG7099+7BU4o4rLasMA0GCSqGSIb3DQEBCwUA -// SIG // BIICACd8c/TDizp57iB9XeIWQ83/TN/GfUpltNHgD6W7 -// SIG // 9aOX4ptFSi4tgI8lA92v/OjjDSWQ75fZbyXqPs0X4f4a -// SIG // AXA7sLCAbuUeY7p/MDI0BaocXlwNe20t2aaa3f4OP4mq -// SIG // bb37XpIwuZAXI4cQhZyfXRjdMoajSe18gKSeNLnAKFbg -// SIG // 3xWa4jWG640+SikOvJJGkx1yk/9cJQispZrXPAAPE9WS -// SIG // pKrXo1wW0SsTW01ONnArdZ/D1HddM/4U5xREI2fLO0wR -// SIG // ySBcCte85/4G/YQFJKYmkMLUxwbOaMJdU9IXaDEDwF3w -// SIG // wv7+Y0EWBzAMJHYI9kfTcIMSj4rqcOHjdcc5VRBKAcCN -// SIG // 9G2G2B4DyoLGaVYQ73Yb52VB9D/awCkwPeD/SF08yeFk -// SIG // QcUf0d9aenYupkXyjKXGwteYjzddTS5kPPUCXzbbnKTH -// SIG // 4fAwFDLLdqsbZmc5WjPWmLwDwikHkxD2Ox+bDFw4nAGB -// SIG // 1qMZ+mx3wdNetTcz57hzR+dC041AQQRGyTU+Hvzjw+fH -// SIG // 6e/i1JHHa0Es7FK/8uDMbR/s5+2kRXcb0i9K7aJGl3FY -// SIG // ssUeuaV0KzXisz5J6MEZaTdfYhrl0Eoz263+PCM8FsWa -// SIG // OazP5eF7m7ndjz+heHbNK1ZxINPaX27ZiQV7rxsG8VMs -// SIG // JiB1ZJZnwfAhtTu2czAGHqUxwQv+ -// SIG // End signature block diff --git a/FF1Blazorizer/output/wwwroot/_framework/dotnet.6.0.27.23owh3yvu8.js.br b/FF1Blazorizer/output/wwwroot/_framework/dotnet.6.0.27.23owh3yvu8.js.br deleted file mode 100644 index b2f3bc0be..000000000 Binary files a/FF1Blazorizer/output/wwwroot/_framework/dotnet.6.0.27.23owh3yvu8.js.br and /dev/null differ diff --git a/FF1Blazorizer/output/wwwroot/_framework/dotnet.6.0.27.23owh3yvu8.js.gz b/FF1Blazorizer/output/wwwroot/_framework/dotnet.6.0.27.23owh3yvu8.js.gz deleted file mode 100644 index 1b8fbd9ac..000000000 Binary files a/FF1Blazorizer/output/wwwroot/_framework/dotnet.6.0.27.23owh3yvu8.js.gz and /dev/null differ diff --git a/FF1Blazorizer/output/wwwroot/images/tooltips/RandomizeClassInnateMagicCheckBox.png b/FF1Blazorizer/output/wwwroot/images/tooltips/RandomizeClassInnateMagicCheckBox.png deleted file mode 100644 index 036edf2b4..000000000 Binary files a/FF1Blazorizer/output/wwwroot/images/tooltips/RandomizeClassInnateMagicCheckBox.png and /dev/null differ diff --git a/FF1Blazorizer/output/wwwroot/images/tooltips/airboat.gif b/FF1Blazorizer/output/wwwroot/images/tooltips/airboat.gif deleted file mode 100644 index 67ba92087..000000000 Binary files a/FF1Blazorizer/output/wwwroot/images/tooltips/airboat.gif and /dev/null differ diff --git a/FF1Blazorizer/output/wwwroot/images/tooltips/procgenEarth.png b/FF1Blazorizer/output/wwwroot/images/tooltips/procgenEarth.png deleted file mode 100644 index 573ede3ca..000000000 Binary files a/FF1Blazorizer/output/wwwroot/images/tooltips/procgenEarth.png and /dev/null differ diff --git a/FF1Blazorizer/output/wwwroot/images/tooltips/randomShardName.png b/FF1Blazorizer/output/wwwroot/images/tooltips/randomShardName.png deleted file mode 100644 index c0bd48c81..000000000 Binary files a/FF1Blazorizer/output/wwwroot/images/tooltips/randomShardName.png and /dev/null differ diff --git a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_0_Loose_3_Orbs.json b/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_0_Loose_3_Orbs.json deleted file mode 100644 index c28c87b9e..000000000 --- a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_0_Loose_3_Orbs.json +++ /dev/null @@ -1,498 +0,0 @@ -{ - "Name": "Fall League - 0 Loose 3 Orbs", - "Flags": { - "StartingEquipmentMasamune": false, - "StartingEquipmentKatana": false, - "StartingEquipmentHealStaff": false, - "StartingEquipmentZeusGauntlet": false, - "StartingEquipmentWhiteShirt": false, - "StartingEquipmentRibbon": false, - "StartingEquipmentDragonslayer": false, - "StartingEquipmentLegendKit": false, - "StartingEquipmentRandomEndgameWeapon": false, - "StartingEquipmentRandomAoe": true, - "StartingEquipmentRandomCasterItem": false, - "StartingEquipmentGrandpasSecretStash": false, - "StartingEquipmentOneItem": false, - "StartingEquipmentRandomCrap": false, - "StartingEquipmentStarterPack": false, - "StartingEquipmentRandomTypeWeapon": false, - "StartingEquipmentRemoveFromPool": false, - "StartingEquipmentNoDuplicates": false, - "ReversedFloors": false, - "BuffTier1DamageSpells": false, - "NoEmptyScripts": false, - "LaterLoose": false, - "MermaidPrison": false, - "GuaranteedDefenseItem": 3, - "GuaranteedPowerItem": 0, - "ScriptMultiplier": 2, - "TouchMultiplier": 2, - "TouchPool": 1, - "TouchMode": 2, - "RibbonMode": 0, - "Archipelago": false, - "ArchipelagoGold": false, - "ArchipelagoConsumables": false, - "ArchipelagoShards": false, - "ArchipelagoEquipment": 0, - "ItemMagicMode": 0, - "ItemMagicPool": 0, - "MagisizeWeapons": false, - "DisableMinimap": false, - "LooseItemsForwardPlacement": false, - "LooseItemsSpreadPlacement": false, - "LooseItemsNpcBalance": false, - "PredictivePlacement": false, - "AllowUnsafePlacement": false, - "ShipCanalBeforeFloater": false, - "ExpChestConversionMin": 0, - "ExpChestConversionMax": 0, - "ExpChestMinReward": 4000, - "ExpChestMaxReward": 7000, - "SpellNameMadness": 0, - "ExtConsumableSet": 0, - "EnableSoftInBattle": false, - "EnableLifeInBattle": 2, - "NormalShopsHaveExtConsumables": false, - "LegendaryShopHasExtConsumables": false, - "ExtConsumableTreasureStackSize": 0, - "ExtStartingItemSet": 0, - "ExtConsumableChests": 0, - "SanityCheckerV2": true, - "OwMapExchange": 0, - "OwShuffledAccess": false, - "OwUnsafeStart": false, - "OwRandomPregen": false, - "RelocateChests": false, - "RelocateChestsTrapIndicator": false, - "ShuffleChimeAccess": false, - "ShuffleChimeIncludeTowns": false, - "GameMode": 0, - "MapGenSeed": 0, - "ReplacementMap": null, - "ResourcePack": null, - "ShopKillMode_Weapons": 0, - "ShopKillMode_Armor": 0, - "ShopKillMode_Item": 0, - "ShopKillMode_Black": 0, - "ShopKillMode_White": 0, - "ShopKillFactor_Weapons": 0, - "ShopKillFactor_Armor": 0, - "ShopKillFactor_Item": 0, - "ShopKillFactor_Black": 0, - "ShopKillFactor_White": 0, - "ShopKillExcludeConeria_Weapons": false, - "ShopKillExcludeConeria_Armor": false, - "ShopKillExcludeConeria_Item": false, - "ShopKillExcludeConeria_Black": false, - "ShopKillExcludeConeria_White": false, - "ExcludeGoldFromScaling": false, - "CheapVendorItem": false, - "StartingLevel": 0, - "MaxLevelLow": 50, - "MaxLevelHigh": 50, - "Spoilers": false, - "TournamentSafe": true, - "BlindSeed": false, - "Shops": true, - "Treasures": true, - "NPCItems": true, - "NPCFetchItems": true, - "RandomWares": false, - "RandomWaresIncludesSpecialGear": false, - "RandomLoot": false, - "ShardHunt": false, - "ShardCount": 0, - "OrbsRequiredCount": 3, - "OrbsRequiredMode": 0, - "OrbsRequiredSpoilers": false, - "TransformFinalFormation": 0, - "ChaosRush": false, - "ToFRMode": 0, - "ExitToFR": true, - "ChaosFloorEncounters": false, - "FiendsRefights": 0, - "MagicShops": false, - "MagicShopLocs": false, - "MagicShopLocationPairs": false, - "MagicLevels": true, - "MagicPermissions": false, - "Weaponizer": false, - "WeaponizerNamesUseQualityOnly": false, - "WeaponizerCommonWeaponsHavePowers": false, - "ArmorCrafter": false, - "MagicLevelsTiered": false, - "MagicLevelsMixed": false, - "MagicAutohitThreshold": 0, - "Rng": true, - "FixMissingBattleRngEntry": false, - "UnrunnableShuffle": true, - "UnrunnablesLow": 0, - "UnrunnablesHigh": 0, - "EnemyFormationsSurprise": true, - "UnrunnablesStrikeFirstAndSurprise": false, - "EnemyTrapTiles": 1, - "TCFormations": 0, - "TCBetterTreasure": 0, - "TCKeyItems": 0, - "TCShards": 0, - "TCExcludeCommons": false, - "TCChestCount": 0, - "TCProtectIncentives": false, - "TCMasaGuardian": false, - "TrappedChaos": false, - "TCIndicator": false, - "SwolePirates": false, - "ShuffleScriptsEnemies": true, - "ShuffleScriptsBosses": true, - "ShuffleSkillsSpellsEnemies": true, - "ShuffleSkillsSpellsBosses": true, - "NoConsecutiveNukes": true, - "TranceHasStatusElement": false, - "EnemySkillsSpellsTiered": false, - "AllowUnsafePirates": false, - "AllowUnsafeMelmond": false, - "WarMECHMode": 0, - "OrdealsPillars": true, - "SkyCastle4FMazeMode": 0, - "TitansTrove": true, - "LefeinSuperStore": true, - "LefeinShops": true, - "RandomVampAttack": false, - "RandomVampAttackIncludesConeria": false, - "FightBahamut": false, - "SwoleBahamut": false, - "SwoleAstos": false, - "ConfusedOldMen": false, - "GaiaShortcut": true, - "DamageTileLow": 1, - "DamageTileHigh": 1, - "OWDamageTiles": false, - "DamageTilesKill": false, - "MoveGaiaItemShop": true, - "ShufflePravokaShops": false, - "FlipDungeons": false, - "VerticallyFlipDungeons": false, - "SpookyFlag": false, - "DraculasFlag": false, - "MapOpenProgression": true, - "MapOpenProgressionDocks": true, - "Entrances": false, - "Towns": false, - "IncludeConeria": false, - "Floors": false, - "AllowDeepCastles": false, - "AllowDeepTowns": false, - "MapOpenProgressionExtended": false, - "MapDwarvesNorthwest": false, - "MapAirshipDock": false, - "MapBahamutCardiaDock": true, - "MapLefeinRiver": false, - "MapBridgeLefein": false, - "MapRiverToMelmond": false, - "MapGaiaMountainPass": false, - "MapHighwayToOrdeals": false, - "MapDragonsHoard": true, - "MapHallOfDragons": false, - "EntrancesIncludesDeadEnds": false, - "EntrancesMixedWithTowns": false, - "IncentivizeFreeNPCs": true, - "IncentivizeFetchNPCs": true, - "IncentivizeTail": true, - "IncentivizeMainItems": true, - "IncentivizeFetchItems": true, - "IncentivizeCanoeItem": false, - "IncentivizeAirship": true, - "IncentivizeShipAndCanal": true, - "IncentivizeBridgeItem": false, - "IncentivizeMarsh": true, - "IncentivizeEarth": false, - "IncentivizeVolcano": false, - "IncentivizeIceCave": true, - "IncentivizeOrdeals": true, - "IncentivizeSeaShrine": false, - "IncentivizeConeria": false, - "IncentivizeMarshKeyLocked": false, - "IncentivizeSkyPalace": false, - "IncentivizeTitansTrove": true, - "IncentivizeCardia": true, - "IceCaveIncentivePlacementType": 0, - "OrdealsIncentivePlacementType": 0, - "MarshIncentivePlacementType": 0, - "TitansIncentivePlacementType": 0, - "EarthIncentivePlacementType": 0, - "VolcanoIncentivePlacementType": 0, - "SeaShrineIncentivePlacementType": 0, - "SkyPalaceIncentivePlacementType": 0, - "CorneriaIncentivePlacementType": 0, - "MarshLockedIncentivePlacementType": 0, - "CardiaIncentivePlacementType": 0, - "BetterTrapChests": true, - "IncentivizeMasamune": false, - "IncentivizeKatana": false, - "IncentivizeXcalber": false, - "IncentivizeVorpal": false, - "IncentivizeOpal": false, - "IncentivizeRibbon": true, - "IncentivizeDefCastArmor": false, - "IncentivizeOffCastArmor": false, - "IncentivizeOtherCastArmor": false, - "IncentivizePowerRod": false, - "IncentivizeDefCastWeapon": false, - "IncentivizeOffCastWeapon": false, - "IncentivizeOtherCastWeapon": false, - "LooseExcludePlacedDungeons": false, - "EarlyKing": true, - "EarlySarda": true, - "EarlySage": true, - "EarlyOrdeals": true, - "ShuffleObjectiveNPCs": false, - "OnlyRequireGameIsBeatable": false, - "FreeBridge": true, - "FreeShip": false, - "FreeAirship": false, - "FreeLute": false, - "EnableCritNumberDisplay": true, - "FreeCanal": false, - "FreeCanoe": true, - "EasyMode": false, - "HousesFillHp": true, - "SpeedHacks": true, - "NoPartyShuffle": true, - "Dash": true, - "SpeedBoat": true, - "BuyTen": true, - "IdentifyTreasures": true, - "ShopInfo": true, - "ChestInfo": true, - "IncentiveChestItemsFanfare": true, - "WaitWhenUnrunnable": true, - "ImprovedClinic": false, - "Etherizer": false, - "HouseMPRestoration": true, - "WeaponStats": true, - "BBCritRate": true, - "WeaponCritRate": true, - "WeaponBonuses": true, - "ThiefAgilityBuff": 1, - "SkyWarriorSpoilerBats": 1, - "SpoilerBatsDontCheckOrbs": true, - "MoveToFBats": false, - "WeaponTypeBonusValue": 30, - "ChanceToRun": 1, - "SpellBugs": true, - "BlackBeltAbsorb": true, - "NPCSwatter": true, - "BattleMagicMenuWrapAround": true, - "InventoryAutosort": true, - "AutoRetargeting": false, - "EnemyStatusAttackBug": true, - "ImproveTurnOrderRandomization": true, - "FixHitChanceCap": true, - "MelmondClinic": true, - "DDProgressiveTilesets": false, - "DDFiendOrbs": false, - "TailBahamutMode": 0, - "StartingGold": 3, - "IncludeMorale": false, - "DeadsGainXP": false, - "NonesGainXP": false, - "NoTail": false, - "NoFloater": false, - "GuaranteedMasamune": false, - "SendMasamuneHome": false, - "MoreConsumableChests": 0, - "NoMasamune": true, - "NoXcalber": false, - "ClassAsNpcFiends": true, - "ClassAsNpcKeyNPC": false, - "ClassAsNpcCount": 6, - "ClassAsNpcDuplicate": false, - "ClassAsNpcForcedFiends": false, - "ClassAsNpcPromotion": false, - "BossScaleStatsLow": 100, - "BossScaleStatsHigh": 200, - "BossScaleHpLow": 100, - "BossScaleHpHigh": 200, - "EnemyScaleStatsLow": 60, - "EnemyScaleStatsHigh": 190, - "EnemyScaleHpLow": 60, - "EnemyScaleHpHigh": 190, - "PriceScaleFactorLow": 30, - "PriceScaleFactorHigh": 250, - "ExpMultiplier": 2.5, - "ExpBonus": 100, - "ExpMultiplierFighter": 1, - "ExpMultiplierThief": 1, - "ExpMultiplierBlackBelt": 1, - "ExpMultiplierRedMage": 1, - "ExpMultiplierWhiteMage": 1, - "ExpMultiplierBlackMage": 1, - "EncounterRate": 12, - "DungeonEncounterRate": 18, - "ProgressiveScaleMode": 7, - "StartingItemSet": 2, - "ConsumableTreasureStackSize": 2, - "FIGHTER1": true, - "THIEF1": true, - "BLACK_BELT1": true, - "RED_MAGE1": false, - "WHITE_MAGE1": false, - "BLACK_MAGE1": false, - "FIGHTER2": true, - "THIEF2": true, - "BLACK_BELT2": false, - "RED_MAGE2": true, - "WHITE_MAGE2": true, - "BLACK_MAGE2": true, - "FIGHTER3": false, - "THIEF3": false, - "BLACK_BELT3": false, - "RED_MAGE3": false, - "WHITE_MAGE3": false, - "BLACK_MAGE3": false, - "FIGHTER4": false, - "THIEF4": false, - "BLACK_BELT4": false, - "RED_MAGE4": true, - "WHITE_MAGE4": true, - "BLACK_MAGE4": true, - "KNIGHT1": false, - "KNIGHT2": false, - "KNIGHT3": false, - "KNIGHT4": false, - "NINJA1": false, - "NINJA2": false, - "NINJA3": false, - "NINJA4": false, - "MASTER1": false, - "MASTER2": false, - "MASTER3": false, - "MASTER4": false, - "RED_WIZ1": false, - "RED_WIZ2": false, - "RED_WIZ3": false, - "RED_WIZ4": false, - "WHITE_WIZ1": false, - "WHITE_WIZ2": false, - "WHITE_WIZ3": false, - "WHITE_WIZ4": false, - "BLACK_WIZ1": false, - "BLACK_WIZ2": false, - "BLACK_WIZ3": false, - "BLACK_WIZ4": false, - "NONE_CLASS2": true, - "NONE_CLASS3": true, - "NONE_CLASS4": false, - "FORCED1": true, - "FORCED2": false, - "FORCED3": false, - "FORCED4": true, - "DraftFighter": false, - "DraftThief": false, - "DraftBlackBelt": false, - "DraftRedMage": false, - "DraftWhiteMage": false, - "DraftBlackMage": false, - "DraftKnight": false, - "DraftNinja": false, - "DraftMaster": false, - "DraftRedWiz": false, - "DraftWhiteWiz": false, - "DraftBlackWiz": false, - "TAVERN1": true, - "TAVERN2": true, - "TAVERN3": true, - "TAVERN4": true, - "TAVERN5": true, - "TAVERN6": true, - "WeaponPermissions": false, - "ArmorPermissions": false, - "RecruitmentMode": false, - "RecruitmentModeHireOnly": false, - "RecruitmentModeReplaceOnlyNone": false, - "ClampMinimumStatScale": false, - "ClampMinimumBossStatScale": false, - "ClampMinimumPriceScale": false, - "EFGWaterfall": false, - "FiendShuffle": false, - "DisableTentSaving": false, - "DisableInnSaving": false, - "SaveGameWhenGameOver": false, - "SaveGameDWMode": false, - "ShuffleAstos": false, - "UnsafeAstos": false, - "RandomizeEnemizer": false, - "RandomizeFormationEnemizer": false, - "GenerateNewSpellbook": false, - "SpellcrafterMixSpells": false, - "ThiefHitRate": true, - "AllSpellLevelsForKnightNinja": false, - "BuffHealingSpells": true, - "FreeTail": false, - "HintsVillage": false, - "SpellcrafterRetainPermissions": false, - "RandomWeaponBonus": true, - "RandomArmorBonus": true, - "RandomWeaponBonusExcludeMasa": false, - "RandomWeaponBonusLow": -3, - "RandomWeaponBonusHigh": 5, - "RandomArmorBonusLow": -3, - "RandomArmorBonusHigh": 5, - "SeparateBossHPScaling": false, - "SeparateEnemyHPScaling": false, - "ClampBossHPScaling": false, - "ClampEnemyHpScaling": false, - "PoolSize": 2, - "EnablePoolParty": false, - "SafePoolParty": false, - "IncludePromClasses": false, - "EnableRandomPromotions": false, - "IncludeBaseClasses": false, - "RandomPromotionsSpoilers": false, - "RandomizeClassMode": 1, - "RandomizeClassCasting": false, - "RandomizeClassKeyItems": false, - "RandomizeClassChaos": false, - "RandomizeClassIncludeXpBonus": false, - "AlternateFiends": false, - "NoBossSkillScriptShuffle": false, - "LegendaryWeaponShop": false, - "LegendaryArmorShop": false, - "LegendaryBlackShop": false, - "LegendaryWhiteShop": false, - "LegendaryItemShop": false, - "ExclusiveLegendaryWeaponShop": false, - "ExclusiveLegendaryArmorShop": false, - "ExclusiveLegendaryBlackShop": false, - "ExclusiveLegendaryWhiteShop": false, - "ExclusiveLegendaryItemShop": false, - "RandomizeClassMaxBonus": 2, - "RandomizeClassMaxMalus": 1, - "EarlierHighTierMagic": false, - "ChangeMaxMP": false, - "RedMageMaxMP": 9, - "WhiteMageMaxMP": 9, - "BlackMageMaxMP": 9, - "KnightMaxMP": 4, - "NinjaMaxMP": 4, - "MpGainOnMaxGainMode": 0, - "LockMode": 3, - "MDefMode": 0, - "FormationShuffleMode": 1, - "RandomizeTreasure": 0, - "OpenChestsInOrder": false, - "WorldWealth": 1, - "DeepDungeonGenerator": 0, - "EvadeCap": 3, - "AllowUnsafeStartArea": false, - "IncreaseDarkPenalty": false, - "TouchIncludeBosses": true, - "Lockpicking": true, - "ReducedLuck": false, - "LockpickingLevelRequirement": 15, - "WhiteMageHarmEveryone": true, - "EarlierRuby": true - } -} diff --git a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_E-F_Shuffle.json b/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_E-F_Shuffle.json deleted file mode 100644 index 5b0ab36b9..000000000 --- a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_E-F_Shuffle.json +++ /dev/null @@ -1,497 +0,0 @@ -{ - "Name": "Fall League - E-F Shuffle", - "Flags": { - "StartingEquipmentMasamune": false, - "StartingEquipmentKatana": false, - "StartingEquipmentHealStaff": false, - "StartingEquipmentZeusGauntlet": false, - "StartingEquipmentWhiteShirt": false, - "StartingEquipmentRibbon": false, - "StartingEquipmentDragonslayer": false, - "StartingEquipmentLegendKit": false, - "StartingEquipmentRandomEndgameWeapon": false, - "StartingEquipmentRandomAoe": true, - "StartingEquipmentRandomCasterItem": false, - "StartingEquipmentGrandpasSecretStash": false, - "StartingEquipmentOneItem": false, - "StartingEquipmentRandomCrap": false, - "StartingEquipmentStarterPack": false, - "StartingEquipmentRandomTypeWeapon": false, - "StartingEquipmentRemoveFromPool": false, - "StartingEquipmentNoDuplicates": false, - "ReversedFloors": false, - "BuffTier1DamageSpells": false, - "NoEmptyScripts": false, - "LaterLoose": false, - "MermaidPrison": false, - "GuaranteedDefenseItem": 3, - "GuaranteedPowerItem": 2, - "ScriptMultiplier": 2, - "TouchMultiplier": 2, - "TouchPool": 0, - "TouchMode": 2, - "RibbonMode": 0, - "Archipelago": false, - "ArchipelagoGold": false, - "ArchipelagoConsumables": false, - "ArchipelagoShards": false, - "ArchipelagoEquipment": 0, - "ItemMagicMode": 0, - "ItemMagicPool": 0, - "MagisizeWeapons": false, - "DisableMinimap": false, - "LooseItemsForwardPlacement": false, - "LooseItemsSpreadPlacement": false, - "LooseItemsNpcBalance": false, - "AllowUnsafePlacement": false, - "ShipCanalBeforeFloater": false, - "ExpChestConversionMin": 10, - "ExpChestConversionMax": 10, - "ExpChestMinReward": 2500, - "ExpChestMaxReward": 8000, - "SpellNameMadness": 0, - "ExtConsumableSet": 0, - "EnableSoftInBattle": false, - "EnableLifeInBattle": 2, - "NormalShopsHaveExtConsumables": false, - "LegendaryShopHasExtConsumables": false, - "ExtConsumableTreasureStackSize": 0, - "ExtStartingItemSet": 0, - "ExtConsumableChests": 0, - "SanityCheckerV2": true, - "OwMapExchange": 0, - "OwShuffledAccess": false, - "OwUnsafeStart": false, - "OwRandomPregen": false, - "RelocateChests": false, - "RelocateChestsTrapIndicator": false, - "ShuffleChimeAccess": false, - "ShuffleChimeIncludeTowns": false, - "GameMode": 0, - "MapGenSeed": 0, - "ReplacementMap": null, - "ResourcePack": null, - "ShopKillMode_Weapons": 0, - "ShopKillMode_Armor": 0, - "ShopKillMode_Item": 0, - "ShopKillMode_Black": 0, - "ShopKillMode_White": 0, - "ShopKillFactor_Weapons": 0, - "ShopKillFactor_Armor": 0, - "ShopKillFactor_Item": 0, - "ShopKillFactor_Black": 0, - "ShopKillFactor_White": 0, - "ShopKillExcludeConeria_Weapons": false, - "ShopKillExcludeConeria_Armor": false, - "ShopKillExcludeConeria_Item": false, - "ShopKillExcludeConeria_Black": false, - "ShopKillExcludeConeria_White": false, - "ExcludeGoldFromScaling": false, - "CheapVendorItem": false, - "StartingLevel": 0, - "MaxLevelLow": 50, - "MaxLevelHigh": 50, - "Spoilers": false, - "TournamentSafe": true, - "BlindSeed": false, - "Shops": true, - "Treasures": true, - "NPCItems": true, - "NPCFetchItems": true, - "RandomWares": true, - "RandomWaresIncludesSpecialGear": false, - "RandomLoot": false, - "ShardHunt": true, - "ShardCount": 4, - "OrbsRequiredCount": 4, - "OrbsRequiredMode": 0, - "OrbsRequiredSpoilers": false, - "TransformFinalFormation": 0, - "ChaosRush": false, - "ToFRMode": 2, - "ExitToFR": true, - "ChaosFloorEncounters": false, - "FiendsRefights": 0, - "MagicShops": false, - "MagicShopLocs": false, - "MagicShopLocationPairs": false, - "MagicLevels": true, - "MagicPermissions": false, - "Weaponizer": false, - "WeaponizerNamesUseQualityOnly": false, - "WeaponizerCommonWeaponsHavePowers": false, - "ArmorCrafter": false, - "MagicLevelsTiered": false, - "MagicLevelsMixed": false, - "MagicAutohitThreshold": 0, - "Rng": true, - "FixMissingBattleRngEntry": false, - "UnrunnableShuffle": true, - "UnrunnablesLow": 0, - "UnrunnablesHigh": 0, - "EnemyFormationsSurprise": true, - "UnrunnablesStrikeFirstAndSurprise": false, - "EnemyTrapTiles": 3, - "TCFormations": 0, - "TCBetterTreasure": 0, - "TCKeyItems": 0, - "TCShards": 2, - "TCExcludeCommons": false, - "TCChestCount": 0, - "TCProtectIncentives": false, - "TCMasaGuardian": false, - "TrappedChaos": false, - "TCIndicator": true, - "SwolePirates": false, - "ShuffleScriptsEnemies": true, - "ShuffleScriptsBosses": true, - "ShuffleSkillsSpellsEnemies": true, - "ShuffleSkillsSpellsBosses": true, - "NoConsecutiveNukes": true, - "TranceHasStatusElement": false, - "EnemySkillsSpellsTiered": false, - "AllowUnsafePirates": false, - "AllowUnsafeMelmond": false, - "WarMECHMode": 0, - "OrdealsPillars": true, - "SkyCastle4FMazeMode": 0, - "TitansTrove": true, - "LefeinSuperStore": true, - "LefeinShops": true, - "RandomVampAttack": true, - "RandomVampAttackIncludesConeria": false, - "FightBahamut": true, - "SwoleBahamut": false, - "SwoleAstos": false, - "ConfusedOldMen": false, - "GaiaShortcut": true, - "DamageTileLow": 1, - "DamageTileHigh": 1, - "OWDamageTiles": false, - "DamageTilesKill": false, - "MoveGaiaItemShop": true, - "ShufflePravokaShops": false, - "FlipDungeons": false, - "VerticallyFlipDungeons": false, - "SpookyFlag": false, - "DraculasFlag": false, - "MapOpenProgression": true, - "MapOpenProgressionDocks": true, - "Entrances": true, - "Towns": true, - "IncludeConeria": false, - "Floors": true, - "AllowDeepCastles": true, - "AllowDeepTowns": true, - "MapOpenProgressionExtended": false, - "MapDwarvesNorthwest": true, - "MapAirshipDock": false, - "MapBahamutCardiaDock": true, - "MapLefeinRiver": false, - "MapBridgeLefein": false, - "MapRiverToMelmond": false, - "MapGaiaMountainPass": false, - "MapHighwayToOrdeals": false, - "MapDragonsHoard": false, - "MapHallOfDragons": false, - "EntrancesIncludesDeadEnds": true, - "EntrancesMixedWithTowns": true, - "IncentivizeFreeNPCs": true, - "IncentivizeFetchNPCs": true, - "IncentivizeTail": true, - "IncentivizeMainItems": true, - "IncentivizeFetchItems": true, - "IncentivizeCanoeItem": true, - "IncentivizeAirship": true, - "IncentivizeShipAndCanal": true, - "IncentivizeBridgeItem": false, - "IncentivizeMarsh": true, - "IncentivizeEarth": false, - "IncentivizeVolcano": true, - "IncentivizeIceCave": true, - "IncentivizeOrdeals": true, - "IncentivizeSeaShrine": true, - "IncentivizeConeria": true, - "IncentivizeMarshKeyLocked": false, - "IncentivizeSkyPalace": true, - "IncentivizeTitansTrove": true, - "IncentivizeCardia": true, - "IceCaveIncentivePlacementType": 0, - "OrdealsIncentivePlacementType": 0, - "MarshIncentivePlacementType": 0, - "TitansIncentivePlacementType": 0, - "EarthIncentivePlacementType": 0, - "VolcanoIncentivePlacementType": 0, - "SeaShrineIncentivePlacementType": 0, - "SkyPalaceIncentivePlacementType": 0, - "CorneriaIncentivePlacementType": 0, - "MarshLockedIncentivePlacementType": 0, - "CardiaIncentivePlacementType": 0, - "BetterTrapChests": false, - "IncentivizeMasamune": true, - "IncentivizeKatana": false, - "IncentivizeXcalber": false, - "IncentivizeVorpal": false, - "IncentivizeOpal": false, - "IncentivizeRibbon": true, - "IncentivizeDefCastArmor": false, - "IncentivizeOffCastArmor": false, - "IncentivizeOtherCastArmor": true, - "IncentivizePowerRod": true, - "IncentivizeDefCastWeapon": false, - "IncentivizeOffCastWeapon": false, - "IncentivizeOtherCastWeapon": false, - "LooseExcludePlacedDungeons": false, - "EarlyKing": true, - "EarlySarda": true, - "EarlySage": true, - "EarlyOrdeals": true, - "ShuffleObjectiveNPCs": false, - "OnlyRequireGameIsBeatable": false, - "FreeBridge": true, - "FreeShip": false, - "FreeAirship": false, - "FreeLute": false, - "EnableCritNumberDisplay": true, - "FreeCanal": false, - "FreeCanoe": false, - "EasyMode": false, - "HousesFillHp": true, - "SpeedHacks": true, - "NoPartyShuffle": true, - "Dash": true, - "SpeedBoat": true, - "BuyTen": true, - "IdentifyTreasures": true, - "ShopInfo": true, - "ChestInfo": true, - "IncentiveChestItemsFanfare": false, - "WaitWhenUnrunnable": true, - "ImprovedClinic": false, - "Etherizer": false, - "HouseMPRestoration": true, - "WeaponStats": true, - "BBCritRate": false, - "WeaponCritRate": true, - "WeaponBonuses": true, - "ThiefAgilityBuff": 1, - "SkyWarriorSpoilerBats": 1, - "SpoilerBatsDontCheckOrbs": false, - "MoveToFBats": false, - "WeaponTypeBonusValue": 30, - "ChanceToRun": 1, - "SpellBugs": true, - "BlackBeltAbsorb": true, - "NPCSwatter": true, - "BattleMagicMenuWrapAround": true, - "InventoryAutosort": true, - "AutoRetargeting": false, - "EnemyStatusAttackBug": true, - "ImproveTurnOrderRandomization": true, - "FixHitChanceCap": true, - "MelmondClinic": false, - "DDProgressiveTilesets": false, - "DDFiendOrbs": false, - "TailBahamutMode": 0, - "StartingGold": 3, - "IncludeMorale": false, - "DeadsGainXP": false, - "NonesGainXP": false, - "NoTail": false, - "NoFloater": false, - "GuaranteedMasamune": false, - "SendMasamuneHome": false, - "MoreConsumableChests": 0, - "NoMasamune": false, - "NoXcalber": false, - "ClassAsNpcFiends": false, - "ClassAsNpcKeyNPC": false, - "ClassAsNpcCount": 6, - "ClassAsNpcDuplicate": false, - "ClassAsNpcForcedFiends": false, - "ClassAsNpcPromotion": false, - "BossScaleStatsLow": 100, - "BossScaleStatsHigh": 300, - "BossScaleHpLow": 250, - "BossScaleHpHigh": 400, - "EnemyScaleStatsLow": 50, - "EnemyScaleStatsHigh": 150, - "EnemyScaleHpLow": 100, - "EnemyScaleHpHigh": 100, - "PriceScaleFactorLow": 30, - "PriceScaleFactorHigh": 300, - "ExpMultiplier": 3, - "ExpBonus": 250, - "ExpMultiplierFighter": 1, - "ExpMultiplierThief": 1, - "ExpMultiplierBlackBelt": 1, - "ExpMultiplierRedMage": 1, - "ExpMultiplierWhiteMage": 1, - "ExpMultiplierBlackMage": 1, - "EncounterRate": 6, - "DungeonEncounterRate": 15, - "ProgressiveScaleMode": 11, - "StartingItemSet": 6, - "ConsumableTreasureStackSize": 0, - "FIGHTER1": true, - "THIEF1": true, - "BLACK_BELT1": false, - "RED_MAGE1": false, - "WHITE_MAGE1": false, - "BLACK_MAGE1": false, - "FIGHTER2": true, - "THIEF2": true, - "BLACK_BELT2": false, - "RED_MAGE2": true, - "WHITE_MAGE2": true, - "BLACK_MAGE2": true, - "FIGHTER3": true, - "THIEF3": true, - "BLACK_BELT3": false, - "RED_MAGE3": true, - "WHITE_MAGE3": true, - "BLACK_MAGE3": true, - "FIGHTER4": false, - "THIEF4": false, - "BLACK_BELT4": false, - "RED_MAGE4": true, - "WHITE_MAGE4": true, - "BLACK_MAGE4": true, - "KNIGHT1": false, - "KNIGHT2": false, - "KNIGHT3": false, - "KNIGHT4": false, - "NINJA1": false, - "NINJA2": false, - "NINJA3": false, - "NINJA4": false, - "MASTER1": false, - "MASTER2": false, - "MASTER3": false, - "MASTER4": false, - "RED_WIZ1": false, - "RED_WIZ2": false, - "RED_WIZ3": false, - "RED_WIZ4": false, - "WHITE_WIZ1": false, - "WHITE_WIZ2": false, - "WHITE_WIZ3": false, - "WHITE_WIZ4": false, - "BLACK_WIZ1": false, - "BLACK_WIZ2": false, - "BLACK_WIZ3": false, - "BLACK_WIZ4": false, - "NONE_CLASS2": true, - "NONE_CLASS3": true, - "NONE_CLASS4": false, - "FORCED1": true, - "FORCED2": false, - "FORCED3": false, - "FORCED4": true, - "DraftFighter": false, - "DraftThief": false, - "DraftBlackBelt": false, - "DraftRedMage": false, - "DraftWhiteMage": false, - "DraftBlackMage": false, - "DraftKnight": false, - "DraftNinja": false, - "DraftMaster": false, - "DraftRedWiz": false, - "DraftWhiteWiz": false, - "DraftBlackWiz": false, - "TAVERN1": true, - "TAVERN2": true, - "TAVERN3": true, - "TAVERN4": true, - "TAVERN5": true, - "TAVERN6": true, - "WeaponPermissions": false, - "ArmorPermissions": false, - "RecruitmentMode": false, - "RecruitmentModeHireOnly": false, - "RecruitmentModeReplaceOnlyNone": false, - "ClampMinimumStatScale": false, - "ClampMinimumBossStatScale": false, - "ClampMinimumPriceScale": false, - "EFGWaterfall": false, - "FiendShuffle": false, - "DisableTentSaving": false, - "DisableInnSaving": false, - "SaveGameWhenGameOver": true, - "SaveGameDWMode": false, - "ShuffleAstos": false, - "UnsafeAstos": false, - "RandomizeEnemizer": false, - "RandomizeFormationEnemizer": false, - "GenerateNewSpellbook": false, - "SpellcrafterMixSpells": false, - "ThiefHitRate": true, - "AllSpellLevelsForKnightNinja": false, - "BuffHealingSpells": true, - "FreeTail": false, - "HintsVillage": false, - "SpellcrafterRetainPermissions": false, - "RandomWeaponBonus": true, - "RandomArmorBonus": true, - "RandomWeaponBonusExcludeMasa": false, - "RandomWeaponBonusLow": 0, - "RandomWeaponBonusHigh": 7, - "RandomArmorBonusLow": 0, - "RandomArmorBonusHigh": 7, - "SeparateBossHPScaling": false, - "SeparateEnemyHPScaling": false, - "ClampBossHPScaling": false, - "ClampEnemyHpScaling": false, - "PoolSize": 2, - "EnablePoolParty": false, - "SafePoolParty": false, - "IncludePromClasses": false, - "EnableRandomPromotions": false, - "IncludeBaseClasses": false, - "RandomPromotionsSpoilers": false, - "RandomizeClassMode": 1, - "RandomizeClassCasting": false, - "RandomizeClassKeyItems": false, - "RandomizeClassChaos": false, - "RandomizeClassIncludeXpBonus": false, - "AlternateFiends": true, - "NoBossSkillScriptShuffle": false, - "LegendaryWeaponShop": false, - "LegendaryArmorShop": false, - "LegendaryBlackShop": false, - "LegendaryWhiteShop": false, - "LegendaryItemShop": false, - "ExclusiveLegendaryWeaponShop": false, - "ExclusiveLegendaryArmorShop": false, - "ExclusiveLegendaryBlackShop": false, - "ExclusiveLegendaryWhiteShop": false, - "ExclusiveLegendaryItemShop": false, - "RandomizeClassMaxBonus": 3, - "RandomizeClassMaxMalus": 1, - "EarlierHighTierMagic": false, - "ChangeMaxMP": false, - "RedMageMaxMP": 9, - "WhiteMageMaxMP": 9, - "BlackMageMaxMP": 9, - "KnightMaxMP": 4, - "NinjaMaxMP": 4, - "MpGainOnMaxGainMode": 0, - "LockMode": 3, - "MDefMode": 0, - "FormationShuffleMode": 1, - "RandomizeTreasure": 1, - "OpenChestsInOrder": false, - "WorldWealth": 1, - "DeepDungeonGenerator": 0, - "EvadeCap": 1, - "AllowUnsafeStartArea": true, - "IncreaseDarkPenalty": false, - "TouchIncludeBosses": true, - "Lockpicking": false, - "ReducedLuck": false, - "LockpickingLevelRequirement": 15, - "WhiteMageHarmEveryone": true, - "EarlierRuby": false - } -} diff --git a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Noverworld.json b/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Noverworld.json deleted file mode 100644 index e573fd5f0..000000000 --- a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Noverworld.json +++ /dev/null @@ -1,498 +0,0 @@ -{ - "Name": "Fall League - Noverworld", - "Flags": { - "StartingEquipmentMasamune": false, - "StartingEquipmentKatana": false, - "StartingEquipmentHealStaff": false, - "StartingEquipmentZeusGauntlet": false, - "StartingEquipmentWhiteShirt": false, - "StartingEquipmentRibbon": false, - "StartingEquipmentDragonslayer": false, - "StartingEquipmentLegendKit": false, - "StartingEquipmentRandomEndgameWeapon": false, - "StartingEquipmentRandomAoe": false, - "StartingEquipmentRandomCasterItem": false, - "StartingEquipmentGrandpasSecretStash": false, - "StartingEquipmentOneItem": false, - "StartingEquipmentRandomCrap": true, - "StartingEquipmentStarterPack": false, - "StartingEquipmentRandomTypeWeapon": false, - "StartingEquipmentRemoveFromPool": false, - "StartingEquipmentNoDuplicates": true, - "ReversedFloors": false, - "BuffTier1DamageSpells": true, - "NoEmptyScripts": false, - "LaterLoose": false, - "MermaidPrison": false, - "GuaranteedDefenseItem": 4, - "GuaranteedPowerItem": 4, - "ScriptMultiplier": 1, - "TouchMultiplier": 1, - "TouchPool": 1, - "TouchMode": 2, - "RibbonMode": 0, - "Archipelago": false, - "ArchipelagoGold": false, - "ArchipelagoConsumables": false, - "ArchipelagoShards": false, - "ArchipelagoEquipment": 1, - "ItemMagicMode": 1, - "ItemMagicPool": 4, - "MagisizeWeapons": false, - "DisableMinimap": false, - "LooseItemsForwardPlacement": false, - "LooseItemsSpreadPlacement": true, - "LooseItemsNpcBalance": false, - "PredictivePlacement": false, - "AllowUnsafePlacement": false, - "ShipCanalBeforeFloater": false, - "ExpChestConversionMin": 50, - "ExpChestConversionMax": 70, - "ExpChestMinReward": 500, - "ExpChestMaxReward": 2500, - "SpellNameMadness": 0, - "ExtConsumableSet": 0, - "EnableSoftInBattle": true, - "EnableLifeInBattle": 2, - "NormalShopsHaveExtConsumables": false, - "LegendaryShopHasExtConsumables": false, - "ExtConsumableTreasureStackSize": 0, - "ExtStartingItemSet": 0, - "ExtConsumableChests": 0, - "SanityCheckerV2": true, - "OwMapExchange": 2, - "OwShuffledAccess": false, - "OwUnsafeStart": false, - "OwRandomPregen": false, - "RelocateChests": false, - "RelocateChestsTrapIndicator": false, - "ShuffleChimeAccess": false, - "ShuffleChimeIncludeTowns": false, - "GameMode": 2, - "MapGenSeed": 1157497865, - "ReplacementMap": null, - "ResourcePack": null, - "ShopKillMode_Weapons": 0, - "ShopKillMode_Armor": 0, - "ShopKillMode_Item": 0, - "ShopKillMode_Black": 0, - "ShopKillMode_White": 0, - "ShopKillFactor_Weapons": 0, - "ShopKillFactor_Armor": 0, - "ShopKillFactor_Item": 0, - "ShopKillFactor_Black": 0, - "ShopKillFactor_White": 0, - "ShopKillExcludeConeria_Weapons": false, - "ShopKillExcludeConeria_Armor": false, - "ShopKillExcludeConeria_Item": false, - "ShopKillExcludeConeria_Black": false, - "ShopKillExcludeConeria_White": false, - "ExcludeGoldFromScaling": false, - "CheapVendorItem": false, - "StartingLevel": 3, - "MaxLevelLow": 50, - "MaxLevelHigh": 50, - "Spoilers": false, - "TournamentSafe": true, - "BlindSeed": false, - "Shops": true, - "Treasures": true, - "NPCItems": true, - "NPCFetchItems": true, - "RandomWares": true, - "RandomWaresIncludesSpecialGear": false, - "RandomLoot": false, - "ShardHunt": false, - "ShardCount": 3, - "OrbsRequiredCount": 3, - "OrbsRequiredMode": 1, - "OrbsRequiredSpoilers": true, - "TransformFinalFormation": 0, - "ChaosRush": false, - "ToFRMode": 0, - "ExitToFR": true, - "ChaosFloorEncounters": false, - "FiendsRefights": 0, - "MagicShops": false, - "MagicShopLocs": false, - "MagicShopLocationPairs": false, - "MagicLevels": true, - "MagicPermissions": false, - "Weaponizer": false, - "WeaponizerNamesUseQualityOnly": false, - "WeaponizerCommonWeaponsHavePowers": false, - "ArmorCrafter": false, - "MagicLevelsTiered": false, - "MagicLevelsMixed": true, - "MagicAutohitThreshold": 0, - "Rng": true, - "FixMissingBattleRngEntry": true, - "UnrunnableShuffle": true, - "UnrunnablesLow": 0, - "UnrunnablesHigh": 0, - "EnemyFormationsSurprise": true, - "UnrunnablesStrikeFirstAndSurprise": false, - "EnemyTrapTiles": 6, - "TCFormations": 0, - "TCBetterTreasure": 0, - "TCKeyItems": 0, - "TCShards": 1, - "TCExcludeCommons": false, - "TCChestCount": 0, - "TCProtectIncentives": false, - "TCMasaGuardian": false, - "TrappedChaos": false, - "TCIndicator": false, - "SwolePirates": false, - "ShuffleScriptsEnemies": true, - "ShuffleScriptsBosses": true, - "ShuffleSkillsSpellsEnemies": true, - "ShuffleSkillsSpellsBosses": true, - "NoConsecutiveNukes": true, - "TranceHasStatusElement": true, - "EnemySkillsSpellsTiered": false, - "AllowUnsafePirates": false, - "AllowUnsafeMelmond": false, - "WarMECHMode": 0, - "OrdealsPillars": true, - "SkyCastle4FMazeMode": 0, - "TitansTrove": true, - "LefeinSuperStore": true, - "LefeinShops": true, - "RandomVampAttack": true, - "RandomVampAttackIncludesConeria": false, - "FightBahamut": false, - "SwoleBahamut": false, - "SwoleAstos": true, - "ConfusedOldMen": false, - "GaiaShortcut": true, - "DamageTileLow": 1, - "DamageTileHigh": 1, - "OWDamageTiles": false, - "DamageTilesKill": false, - "MoveGaiaItemShop": true, - "ShufflePravokaShops": true, - "FlipDungeons": null, - "VerticallyFlipDungeons": false, - "SpookyFlag": false, - "DraculasFlag": false, - "MapOpenProgression": true, - "MapOpenProgressionDocks": false, - "Entrances": true, - "Towns": true, - "IncludeConeria": false, - "Floors": true, - "AllowDeepCastles": false, - "AllowDeepTowns": false, - "MapOpenProgressionExtended": false, - "MapDwarvesNorthwest": true, - "MapAirshipDock": false, - "MapBahamutCardiaDock": false, - "MapLefeinRiver": false, - "MapBridgeLefein": false, - "MapRiverToMelmond": false, - "MapGaiaMountainPass": false, - "MapHighwayToOrdeals": false, - "MapDragonsHoard": true, - "MapHallOfDragons": false, - "EntrancesIncludesDeadEnds": true, - "EntrancesMixedWithTowns": true, - "IncentivizeFreeNPCs": true, - "IncentivizeFetchNPCs": true, - "IncentivizeTail": false, - "IncentivizeMainItems": true, - "IncentivizeFetchItems": true, - "IncentivizeCanoeItem": false, - "IncentivizeAirship": false, - "IncentivizeShipAndCanal": false, - "IncentivizeBridgeItem": false, - "IncentivizeMarsh": true, - "IncentivizeEarth": true, - "IncentivizeVolcano": true, - "IncentivizeIceCave": true, - "IncentivizeOrdeals": true, - "IncentivizeSeaShrine": true, - "IncentivizeConeria": true, - "IncentivizeMarshKeyLocked": true, - "IncentivizeSkyPalace": true, - "IncentivizeTitansTrove": true, - "IncentivizeCardia": true, - "IceCaveIncentivePlacementType": 1, - "OrdealsIncentivePlacementType": 1, - "MarshIncentivePlacementType": 1, - "TitansIncentivePlacementType": 1, - "EarthIncentivePlacementType": 1, - "VolcanoIncentivePlacementType": 1, - "SeaShrineIncentivePlacementType": 1, - "SkyPalaceIncentivePlacementType": 1, - "CorneriaIncentivePlacementType": 1, - "MarshLockedIncentivePlacementType": 1, - "CardiaIncentivePlacementType": 1, - "BetterTrapChests": false, - "IncentivizeMasamune": false, - "IncentivizeKatana": false, - "IncentivizeXcalber": false, - "IncentivizeVorpal": false, - "IncentivizeOpal": false, - "IncentivizeRibbon": false, - "IncentivizeDefCastArmor": false, - "IncentivizeOffCastArmor": false, - "IncentivizeOtherCastArmor": false, - "IncentivizePowerRod": false, - "IncentivizeDefCastWeapon": false, - "IncentivizeOffCastWeapon": false, - "IncentivizeOtherCastWeapon": false, - "LooseExcludePlacedDungeons": true, - "EarlyKing": true, - "EarlySarda": true, - "EarlySage": true, - "EarlyOrdeals": true, - "ShuffleObjectiveNPCs": false, - "OnlyRequireGameIsBeatable": false, - "FreeBridge": false, - "FreeShip": false, - "FreeAirship": false, - "FreeLute": false, - "EnableCritNumberDisplay": true, - "FreeCanal": false, - "FreeCanoe": false, - "EasyMode": false, - "HousesFillHp": false, - "SpeedHacks": true, - "NoPartyShuffle": true, - "Dash": true, - "SpeedBoat": false, - "BuyTen": true, - "IdentifyTreasures": true, - "ShopInfo": true, - "ChestInfo": true, - "IncentiveChestItemsFanfare": true, - "WaitWhenUnrunnable": true, - "ImprovedClinic": false, - "Etherizer": false, - "HouseMPRestoration": false, - "WeaponStats": true, - "BBCritRate": true, - "WeaponCritRate": true, - "WeaponBonuses": true, - "ThiefAgilityBuff": 2, - "SkyWarriorSpoilerBats": 1, - "SpoilerBatsDontCheckOrbs": true, - "MoveToFBats": true, - "WeaponTypeBonusValue": 25, - "ChanceToRun": 1, - "SpellBugs": true, - "BlackBeltAbsorb": true, - "NPCSwatter": true, - "BattleMagicMenuWrapAround": true, - "InventoryAutosort": true, - "AutoRetargeting": false, - "EnemyStatusAttackBug": true, - "ImproveTurnOrderRandomization": true, - "FixHitChanceCap": true, - "MelmondClinic": true, - "DDProgressiveTilesets": false, - "DDFiendOrbs": false, - "TailBahamutMode": 0, - "StartingGold": 5, - "IncludeMorale": true, - "DeadsGainXP": false, - "NonesGainXP": true, - "NoTail": false, - "NoFloater": false, - "GuaranteedMasamune": true, - "SendMasamuneHome": false, - "MoreConsumableChests": 0, - "NoMasamune": false, - "NoXcalber": false, - "ClassAsNpcFiends": false, - "ClassAsNpcKeyNPC": true, - "ClassAsNpcCount": 5, - "ClassAsNpcDuplicate": false, - "ClassAsNpcForcedFiends": false, - "ClassAsNpcPromotion": false, - "BossScaleStatsLow": 70, - "BossScaleStatsHigh": 200, - "BossScaleHpLow": 150, - "BossScaleHpHigh": 250, - "EnemyScaleStatsLow": 40, - "EnemyScaleStatsHigh": 80, - "EnemyScaleHpLow": 70, - "EnemyScaleHpHigh": 120, - "PriceScaleFactorLow": 30, - "PriceScaleFactorHigh": 150, - "ExpMultiplier": 2, - "ExpBonus": 200, - "ExpMultiplierFighter": 1, - "ExpMultiplierThief": 1, - "ExpMultiplierBlackBelt": 1, - "ExpMultiplierRedMage": 1, - "ExpMultiplierWhiteMage": 1.3, - "ExpMultiplierBlackMage": 1.5, - "EncounterRate": 0, - "DungeonEncounterRate": 9, - "ProgressiveScaleMode": 6, - "StartingItemSet": 6, - "ConsumableTreasureStackSize": 2, - "FIGHTER1": true, - "THIEF1": true, - "BLACK_BELT1": true, - "RED_MAGE1": true, - "WHITE_MAGE1": true, - "BLACK_MAGE1": true, - "FIGHTER2": true, - "THIEF2": true, - "BLACK_BELT2": true, - "RED_MAGE2": true, - "WHITE_MAGE2": true, - "BLACK_MAGE2": true, - "FIGHTER3": false, - "THIEF3": false, - "BLACK_BELT3": false, - "RED_MAGE3": false, - "WHITE_MAGE3": false, - "BLACK_MAGE3": false, - "FIGHTER4": false, - "THIEF4": false, - "BLACK_BELT4": false, - "RED_MAGE4": false, - "WHITE_MAGE4": false, - "BLACK_MAGE4": false, - "KNIGHT1": false, - "KNIGHT2": false, - "KNIGHT3": false, - "KNIGHT4": false, - "NINJA1": false, - "NINJA2": false, - "NINJA3": false, - "NINJA4": false, - "MASTER1": false, - "MASTER2": false, - "MASTER3": false, - "MASTER4": false, - "RED_WIZ1": false, - "RED_WIZ2": false, - "RED_WIZ3": false, - "RED_WIZ4": false, - "WHITE_WIZ1": false, - "WHITE_WIZ2": false, - "WHITE_WIZ3": false, - "WHITE_WIZ4": false, - "BLACK_WIZ1": false, - "BLACK_WIZ2": false, - "BLACK_WIZ3": false, - "BLACK_WIZ4": false, - "NONE_CLASS2": true, - "NONE_CLASS3": true, - "NONE_CLASS4": true, - "FORCED1": false, - "FORCED2": false, - "FORCED3": true, - "FORCED4": true, - "DraftFighter": false, - "DraftThief": false, - "DraftBlackBelt": false, - "DraftRedMage": false, - "DraftWhiteMage": false, - "DraftBlackMage": false, - "DraftKnight": false, - "DraftNinja": false, - "DraftMaster": false, - "DraftRedWiz": false, - "DraftWhiteWiz": false, - "DraftBlackWiz": false, - "TAVERN1": true, - "TAVERN2": true, - "TAVERN3": true, - "TAVERN4": true, - "TAVERN5": true, - "TAVERN6": true, - "WeaponPermissions": false, - "ArmorPermissions": false, - "RecruitmentMode": false, - "RecruitmentModeHireOnly": false, - "RecruitmentModeReplaceOnlyNone": false, - "ClampMinimumStatScale": false, - "ClampMinimumBossStatScale": false, - "ClampMinimumPriceScale": false, - "EFGWaterfall": true, - "FiendShuffle": false, - "DisableTentSaving": false, - "DisableInnSaving": false, - "SaveGameWhenGameOver": true, - "SaveGameDWMode": false, - "ShuffleAstos": false, - "UnsafeAstos": false, - "RandomizeEnemizer": false, - "RandomizeFormationEnemizer": false, - "GenerateNewSpellbook": false, - "SpellcrafterMixSpells": false, - "ThiefHitRate": true, - "AllSpellLevelsForKnightNinja": false, - "BuffHealingSpells": true, - "FreeTail": false, - "HintsVillage": true, - "SpellcrafterRetainPermissions": false, - "RandomWeaponBonus": true, - "RandomArmorBonus": true, - "RandomWeaponBonusExcludeMasa": false, - "RandomWeaponBonusLow": -3, - "RandomWeaponBonusHigh": 3, - "RandomArmorBonusLow": -2, - "RandomArmorBonusHigh": 2, - "SeparateBossHPScaling": true, - "SeparateEnemyHPScaling": true, - "ClampBossHPScaling": false, - "ClampEnemyHpScaling": false, - "PoolSize": 2, - "EnablePoolParty": false, - "SafePoolParty": false, - "IncludePromClasses": false, - "EnableRandomPromotions": false, - "IncludeBaseClasses": false, - "RandomPromotionsSpoilers": false, - "RandomizeClassMode": 1, - "RandomizeClassCasting": false, - "RandomizeClassKeyItems": true, - "RandomizeClassChaos": false, - "RandomizeClassIncludeXpBonus": true, - "AlternateFiends": false, - "NoBossSkillScriptShuffle": false, - "LegendaryWeaponShop": false, - "LegendaryArmorShop": false, - "LegendaryBlackShop": false, - "LegendaryWhiteShop": false, - "LegendaryItemShop": false, - "ExclusiveLegendaryWeaponShop": false, - "ExclusiveLegendaryArmorShop": false, - "ExclusiveLegendaryBlackShop": false, - "ExclusiveLegendaryWhiteShop": false, - "ExclusiveLegendaryItemShop": false, - "RandomizeClassMaxBonus": 1, - "RandomizeClassMaxMalus": 1, - "EarlierHighTierMagic": true, - "ChangeMaxMP": true, - "RedMageMaxMP": 4, - "WhiteMageMaxMP": 9, - "BlackMageMaxMP": 9, - "KnightMaxMP": 4, - "NinjaMaxMP": 4, - "MpGainOnMaxGainMode": 0, - "LockMode": 3, - "MDefMode": 1, - "FormationShuffleMode": 1, - "RandomizeTreasure": 1, - "OpenChestsInOrder": false, - "WorldWealth": 0, - "DeepDungeonGenerator": 0, - "EvadeCap": 2, - "AllowUnsafeStartArea": false, - "IncreaseDarkPenalty": false, - "TouchIncludeBosses": true, - "Lockpicking": true, - "ReducedLuck": false, - "LockpickingLevelRequirement": 18, - "WhiteMageHarmEveryone": true, - "EarlierRuby": true - } -} diff --git a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Procgen_OW_Oops_All_Loose.json b/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Procgen_OW_Oops_All_Loose.json deleted file mode 100644 index 99a99369a..000000000 --- a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Procgen_OW_Oops_All_Loose.json +++ /dev/null @@ -1,497 +0,0 @@ -{ - "Name": "Fall League - Procgen OW Oops All Loose", - "Flags": { - "StartingEquipmentMasamune": false, - "StartingEquipmentKatana": false, - "StartingEquipmentHealStaff": false, - "StartingEquipmentZeusGauntlet": false, - "StartingEquipmentWhiteShirt": false, - "StartingEquipmentRibbon": false, - "StartingEquipmentDragonslayer": false, - "StartingEquipmentLegendKit": false, - "StartingEquipmentRandomEndgameWeapon": false, - "StartingEquipmentRandomAoe": false, - "StartingEquipmentRandomCasterItem": false, - "StartingEquipmentGrandpasSecretStash": false, - "StartingEquipmentOneItem": false, - "StartingEquipmentRandomCrap": false, - "StartingEquipmentStarterPack": false, - "StartingEquipmentRandomTypeWeapon": false, - "StartingEquipmentRemoveFromPool": false, - "StartingEquipmentNoDuplicates": false, - "ReversedFloors": false, - "BuffTier1DamageSpells": false, - "NoEmptyScripts": false, - "LaterLoose": true, - "MermaidPrison": false, - "GuaranteedDefenseItem": 3, - "GuaranteedPowerItem": 0, - "ScriptMultiplier": 2, - "TouchMultiplier": 2, - "TouchPool": 1, - "TouchMode": 2, - "RibbonMode": 0, - "Archipelago": false, - "ArchipelagoGold": false, - "ArchipelagoConsumables": false, - "ArchipelagoShards": false, - "ArchipelagoEquipment": 0, - "ItemMagicMode": 0, - "ItemMagicPool": 0, - "MagisizeWeapons": false, - "DisableMinimap": false, - "LooseItemsForwardPlacement": false, - "LooseItemsSpreadPlacement": true, - "LooseItemsNpcBalance": false, - "AllowUnsafePlacement": false, - "ShipCanalBeforeFloater": false, - "ExpChestConversionMin": 10, - "ExpChestConversionMax": 10, - "ExpChestMinReward": 7000, - "ExpChestMaxReward": 7000, - "SpellNameMadness": 0, - "ExtConsumableSet": 0, - "EnableSoftInBattle": false, - "EnableLifeInBattle": 2, - "NormalShopsHaveExtConsumables": false, - "LegendaryShopHasExtConsumables": false, - "ExtConsumableTreasureStackSize": 0, - "ExtStartingItemSet": 0, - "ExtConsumableChests": 0, - "SanityCheckerV2": true, - "OwMapExchange": 1, - "OwShuffledAccess": true, - "OwUnsafeStart": false, - "OwRandomPregen": true, - "RelocateChests": true, - "RelocateChestsTrapIndicator": false, - "ShuffleChimeAccess": false, - "ShuffleChimeIncludeTowns": false, - "GameMode": 0, - "MapGenSeed": 450698476, - "ReplacementMap": null, - "ResourcePack": null, - "ShopKillMode_Weapons": 0, - "ShopKillMode_Armor": 0, - "ShopKillMode_Item": 0, - "ShopKillMode_Black": 0, - "ShopKillMode_White": 0, - "ShopKillFactor_Weapons": 0, - "ShopKillFactor_Armor": 0, - "ShopKillFactor_Item": 0, - "ShopKillFactor_Black": 0, - "ShopKillFactor_White": 0, - "ShopKillExcludeConeria_Weapons": false, - "ShopKillExcludeConeria_Armor": false, - "ShopKillExcludeConeria_Item": false, - "ShopKillExcludeConeria_Black": false, - "ShopKillExcludeConeria_White": false, - "ExcludeGoldFromScaling": false, - "CheapVendorItem": false, - "StartingLevel": 0, - "MaxLevelLow": 50, - "MaxLevelHigh": 50, - "Spoilers": false, - "TournamentSafe": true, - "BlindSeed": false, - "Shops": true, - "Treasures": true, - "NPCItems": true, - "NPCFetchItems": true, - "RandomWares": false, - "RandomWaresIncludesSpecialGear": false, - "RandomLoot": false, - "ShardHunt": false, - "ShardCount": 0, - "OrbsRequiredCount": 4, - "OrbsRequiredMode": 0, - "OrbsRequiredSpoilers": false, - "TransformFinalFormation": 0, - "ChaosRush": false, - "ToFRMode": 2, - "ExitToFR": true, - "ChaosFloorEncounters": false, - "FiendsRefights": 0, - "MagicShops": false, - "MagicShopLocs": false, - "MagicShopLocationPairs": false, - "MagicLevels": true, - "MagicPermissions": false, - "Weaponizer": false, - "WeaponizerNamesUseQualityOnly": false, - "WeaponizerCommonWeaponsHavePowers": false, - "ArmorCrafter": false, - "MagicLevelsTiered": false, - "MagicLevelsMixed": false, - "MagicAutohitThreshold": 0, - "Rng": true, - "FixMissingBattleRngEntry": false, - "UnrunnableShuffle": true, - "UnrunnablesLow": 0, - "UnrunnablesHigh": 0, - "EnemyFormationsSurprise": true, - "UnrunnablesStrikeFirstAndSurprise": false, - "EnemyTrapTiles": 6, - "TCFormations": 2, - "TCBetterTreasure": 2, - "TCKeyItems": 0, - "TCShards": 0, - "TCExcludeCommons": false, - "TCChestCount": 0, - "TCProtectIncentives": false, - "TCMasaGuardian": false, - "TrappedChaos": false, - "TCIndicator": true, - "SwolePirates": false, - "ShuffleScriptsEnemies": true, - "ShuffleScriptsBosses": true, - "ShuffleSkillsSpellsEnemies": true, - "ShuffleSkillsSpellsBosses": true, - "NoConsecutiveNukes": true, - "TranceHasStatusElement": false, - "EnemySkillsSpellsTiered": false, - "AllowUnsafePirates": false, - "AllowUnsafeMelmond": false, - "WarMECHMode": 0, - "OrdealsPillars": true, - "SkyCastle4FMazeMode": 0, - "TitansTrove": true, - "LefeinSuperStore": true, - "LefeinShops": true, - "RandomVampAttack": false, - "RandomVampAttackIncludesConeria": false, - "FightBahamut": false, - "SwoleBahamut": false, - "SwoleAstos": false, - "ConfusedOldMen": false, - "GaiaShortcut": true, - "DamageTileLow": 1, - "DamageTileHigh": 1, - "OWDamageTiles": false, - "DamageTilesKill": false, - "MoveGaiaItemShop": true, - "ShufflePravokaShops": false, - "FlipDungeons": false, - "VerticallyFlipDungeons": false, - "SpookyFlag": false, - "DraculasFlag": false, - "MapOpenProgression": false, - "MapOpenProgressionDocks": false, - "Entrances": false, - "Towns": false, - "IncludeConeria": false, - "Floors": false, - "AllowDeepCastles": false, - "AllowDeepTowns": false, - "MapOpenProgressionExtended": false, - "MapDwarvesNorthwest": false, - "MapAirshipDock": false, - "MapBahamutCardiaDock": false, - "MapLefeinRiver": false, - "MapBridgeLefein": false, - "MapRiverToMelmond": false, - "MapGaiaMountainPass": false, - "MapHighwayToOrdeals": false, - "MapDragonsHoard": true, - "MapHallOfDragons": false, - "EntrancesIncludesDeadEnds": false, - "EntrancesMixedWithTowns": false, - "IncentivizeFreeNPCs": false, - "IncentivizeFetchNPCs": false, - "IncentivizeTail": true, - "IncentivizeMainItems": true, - "IncentivizeFetchItems": true, - "IncentivizeCanoeItem": true, - "IncentivizeAirship": true, - "IncentivizeShipAndCanal": true, - "IncentivizeBridgeItem": true, - "IncentivizeMarsh": false, - "IncentivizeEarth": false, - "IncentivizeVolcano": false, - "IncentivizeIceCave": false, - "IncentivizeOrdeals": false, - "IncentivizeSeaShrine": false, - "IncentivizeConeria": false, - "IncentivizeMarshKeyLocked": false, - "IncentivizeSkyPalace": false, - "IncentivizeTitansTrove": false, - "IncentivizeCardia": false, - "IceCaveIncentivePlacementType": 0, - "OrdealsIncentivePlacementType": 0, - "MarshIncentivePlacementType": 0, - "TitansIncentivePlacementType": 0, - "EarthIncentivePlacementType": 0, - "VolcanoIncentivePlacementType": 0, - "SeaShrineIncentivePlacementType": 0, - "SkyPalaceIncentivePlacementType": 0, - "CorneriaIncentivePlacementType": 0, - "MarshLockedIncentivePlacementType": 0, - "CardiaIncentivePlacementType": 0, - "BetterTrapChests": false, - "IncentivizeMasamune": true, - "IncentivizeKatana": true, - "IncentivizeXcalber": true, - "IncentivizeVorpal": true, - "IncentivizeOpal": true, - "IncentivizeRibbon": true, - "IncentivizeDefCastArmor": true, - "IncentivizeOffCastArmor": true, - "IncentivizeOtherCastArmor": true, - "IncentivizePowerRod": true, - "IncentivizeDefCastWeapon": true, - "IncentivizeOffCastWeapon": true, - "IncentivizeOtherCastWeapon": false, - "LooseExcludePlacedDungeons": false, - "EarlyKing": true, - "EarlySarda": true, - "EarlySage": true, - "EarlyOrdeals": true, - "ShuffleObjectiveNPCs": false, - "OnlyRequireGameIsBeatable": false, - "FreeBridge": true, - "FreeShip": false, - "FreeAirship": false, - "FreeLute": false, - "EnableCritNumberDisplay": true, - "FreeCanal": true, - "FreeCanoe": false, - "EasyMode": false, - "HousesFillHp": true, - "SpeedHacks": true, - "NoPartyShuffle": true, - "Dash": true, - "SpeedBoat": true, - "BuyTen": true, - "IdentifyTreasures": true, - "ShopInfo": true, - "ChestInfo": true, - "IncentiveChestItemsFanfare": true, - "WaitWhenUnrunnable": true, - "ImprovedClinic": false, - "Etherizer": false, - "HouseMPRestoration": true, - "WeaponStats": true, - "BBCritRate": false, - "WeaponCritRate": true, - "WeaponBonuses": true, - "ThiefAgilityBuff": 1, - "SkyWarriorSpoilerBats": 1, - "SpoilerBatsDontCheckOrbs": true, - "MoveToFBats": true, - "WeaponTypeBonusValue": 30, - "ChanceToRun": 1, - "SpellBugs": true, - "BlackBeltAbsorb": true, - "NPCSwatter": true, - "BattleMagicMenuWrapAround": true, - "InventoryAutosort": true, - "AutoRetargeting": false, - "EnemyStatusAttackBug": true, - "ImproveTurnOrderRandomization": true, - "FixHitChanceCap": true, - "MelmondClinic": false, - "DDProgressiveTilesets": false, - "DDFiendOrbs": false, - "TailBahamutMode": 0, - "StartingGold": 4, - "IncludeMorale": false, - "DeadsGainXP": false, - "NonesGainXP": false, - "NoTail": false, - "NoFloater": false, - "GuaranteedMasamune": false, - "SendMasamuneHome": false, - "MoreConsumableChests": 0, - "NoMasamune": false, - "NoXcalber": false, - "ClassAsNpcFiends": false, - "ClassAsNpcKeyNPC": false, - "ClassAsNpcCount": 6, - "ClassAsNpcDuplicate": false, - "ClassAsNpcForcedFiends": false, - "ClassAsNpcPromotion": false, - "BossScaleStatsLow": 70, - "BossScaleStatsHigh": 150, - "BossScaleHpLow": 50, - "BossScaleHpHigh": 150, - "EnemyScaleStatsLow": 70, - "EnemyScaleStatsHigh": 150, - "EnemyScaleHpLow": 50, - "EnemyScaleHpHigh": 150, - "PriceScaleFactorLow": 30, - "PriceScaleFactorHigh": 250, - "ExpMultiplier": 2.5, - "ExpBonus": 250, - "ExpMultiplierFighter": 1, - "ExpMultiplierThief": 1, - "ExpMultiplierBlackBelt": 1, - "ExpMultiplierRedMage": 1, - "ExpMultiplierWhiteMage": 1, - "ExpMultiplierBlackMage": 1, - "EncounterRate": 15, - "DungeonEncounterRate": 15, - "ProgressiveScaleMode": 7, - "StartingItemSet": 4, - "ConsumableTreasureStackSize": 2, - "FIGHTER1": true, - "THIEF1": true, - "BLACK_BELT1": true, - "RED_MAGE1": true, - "WHITE_MAGE1": true, - "BLACK_MAGE1": true, - "FIGHTER2": true, - "THIEF2": true, - "BLACK_BELT2": true, - "RED_MAGE2": true, - "WHITE_MAGE2": true, - "BLACK_MAGE2": true, - "FIGHTER3": true, - "THIEF3": true, - "BLACK_BELT3": true, - "RED_MAGE3": true, - "WHITE_MAGE3": true, - "BLACK_MAGE3": true, - "FIGHTER4": true, - "THIEF4": true, - "BLACK_BELT4": true, - "RED_MAGE4": true, - "WHITE_MAGE4": true, - "BLACK_MAGE4": true, - "KNIGHT1": false, - "KNIGHT2": false, - "KNIGHT3": false, - "KNIGHT4": false, - "NINJA1": false, - "NINJA2": false, - "NINJA3": false, - "NINJA4": false, - "MASTER1": false, - "MASTER2": false, - "MASTER3": false, - "MASTER4": false, - "RED_WIZ1": false, - "RED_WIZ2": false, - "RED_WIZ3": false, - "RED_WIZ4": false, - "WHITE_WIZ1": false, - "WHITE_WIZ2": false, - "WHITE_WIZ3": false, - "WHITE_WIZ4": false, - "BLACK_WIZ1": false, - "BLACK_WIZ2": false, - "BLACK_WIZ3": false, - "BLACK_WIZ4": false, - "NONE_CLASS2": false, - "NONE_CLASS3": false, - "NONE_CLASS4": false, - "FORCED1": true, - "FORCED2": true, - "FORCED3": true, - "FORCED4": true, - "DraftFighter": false, - "DraftThief": false, - "DraftBlackBelt": false, - "DraftRedMage": false, - "DraftWhiteMage": false, - "DraftBlackMage": false, - "DraftKnight": false, - "DraftNinja": false, - "DraftMaster": false, - "DraftRedWiz": false, - "DraftWhiteWiz": false, - "DraftBlackWiz": false, - "TAVERN1": true, - "TAVERN2": true, - "TAVERN3": true, - "TAVERN4": true, - "TAVERN5": true, - "TAVERN6": true, - "WeaponPermissions": false, - "ArmorPermissions": false, - "RecruitmentMode": false, - "RecruitmentModeHireOnly": false, - "RecruitmentModeReplaceOnlyNone": false, - "ClampMinimumStatScale": false, - "ClampMinimumBossStatScale": false, - "ClampMinimumPriceScale": false, - "EFGWaterfall": false, - "FiendShuffle": false, - "DisableTentSaving": false, - "DisableInnSaving": false, - "SaveGameWhenGameOver": false, - "SaveGameDWMode": false, - "ShuffleAstos": true, - "UnsafeAstos": false, - "RandomizeEnemizer": false, - "RandomizeFormationEnemizer": false, - "GenerateNewSpellbook": false, - "SpellcrafterMixSpells": false, - "ThiefHitRate": true, - "AllSpellLevelsForKnightNinja": false, - "BuffHealingSpells": true, - "FreeTail": false, - "HintsVillage": true, - "SpellcrafterRetainPermissions": false, - "RandomWeaponBonus": true, - "RandomArmorBonus": true, - "RandomWeaponBonusExcludeMasa": false, - "RandomWeaponBonusLow": -3, - "RandomWeaponBonusHigh": 5, - "RandomArmorBonusLow": -3, - "RandomArmorBonusHigh": 5, - "SeparateBossHPScaling": false, - "SeparateEnemyHPScaling": false, - "ClampBossHPScaling": false, - "ClampEnemyHpScaling": false, - "PoolSize": 3, - "EnablePoolParty": true, - "SafePoolParty": true, - "IncludePromClasses": false, - "EnableRandomPromotions": false, - "IncludeBaseClasses": false, - "RandomPromotionsSpoilers": false, - "RandomizeClassMode": 1, - "RandomizeClassCasting": false, - "RandomizeClassKeyItems": false, - "RandomizeClassChaos": false, - "RandomizeClassIncludeXpBonus": false, - "AlternateFiends": false, - "NoBossSkillScriptShuffle": false, - "LegendaryWeaponShop": false, - "LegendaryArmorShop": false, - "LegendaryBlackShop": false, - "LegendaryWhiteShop": false, - "LegendaryItemShop": false, - "ExclusiveLegendaryWeaponShop": false, - "ExclusiveLegendaryArmorShop": false, - "ExclusiveLegendaryBlackShop": false, - "ExclusiveLegendaryWhiteShop": false, - "ExclusiveLegendaryItemShop": false, - "RandomizeClassMaxBonus": 2, - "RandomizeClassMaxMalus": 0, - "EarlierHighTierMagic": false, - "ChangeMaxMP": false, - "RedMageMaxMP": 9, - "WhiteMageMaxMP": 9, - "BlackMageMaxMP": 9, - "KnightMaxMP": 4, - "NinjaMaxMP": 4, - "MpGainOnMaxGainMode": 0, - "LockMode": 3, - "MDefMode": 0, - "FormationShuffleMode": 1, - "RandomizeTreasure": 0, - "OpenChestsInOrder": false, - "WorldWealth": 1, - "DeepDungeonGenerator": 0, - "EvadeCap": 3, - "AllowUnsafeStartArea": false, - "IncreaseDarkPenalty": false, - "TouchIncludeBosses": true, - "Lockpicking": false, - "ReducedLuck": false, - "LockpickingLevelRequirement": 15, - "WhiteMageHarmEveryone": true, - "EarlierRuby": false - } -} diff --git a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Relay_Race.json b/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Relay_Race.json deleted file mode 100644 index ad9e6b70b..000000000 --- a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Relay_Race.json +++ /dev/null @@ -1,497 +0,0 @@ -{ - "Name": "Fall League - Relay Race", - "Flags": { - "StartingEquipmentMasamune": false, - "StartingEquipmentKatana": false, - "StartingEquipmentHealStaff": true, - "StartingEquipmentZeusGauntlet": false, - "StartingEquipmentWhiteShirt": false, - "StartingEquipmentRibbon": false, - "StartingEquipmentDragonslayer": false, - "StartingEquipmentLegendKit": false, - "StartingEquipmentRandomEndgameWeapon": false, - "StartingEquipmentRandomAoe": true, - "StartingEquipmentRandomCasterItem": false, - "StartingEquipmentGrandpasSecretStash": false, - "StartingEquipmentOneItem": false, - "StartingEquipmentRandomCrap": false, - "StartingEquipmentStarterPack": false, - "StartingEquipmentRandomTypeWeapon": false, - "StartingEquipmentRemoveFromPool": false, - "StartingEquipmentNoDuplicates": false, - "ReversedFloors": false, - "BuffTier1DamageSpells": false, - "NoEmptyScripts": false, - "LaterLoose": false, - "MermaidPrison": false, - "GuaranteedDefenseItem": 3, - "GuaranteedPowerItem": 0, - "ScriptMultiplier": 2, - "TouchMultiplier": 2, - "TouchPool": 1, - "TouchMode": 1, - "RibbonMode": 0, - "Archipelago": false, - "ArchipelagoGold": false, - "ArchipelagoConsumables": false, - "ArchipelagoShards": false, - "ArchipelagoEquipment": 0, - "ItemMagicMode": 1, - "ItemMagicPool": 4, - "MagisizeWeapons": false, - "DisableMinimap": false, - "LooseItemsForwardPlacement": false, - "LooseItemsSpreadPlacement": false, - "LooseItemsNpcBalance": false, - "AllowUnsafePlacement": false, - "ShipCanalBeforeFloater": false, - "ExpChestConversionMin": 0, - "ExpChestConversionMax": 0, - "ExpChestMinReward": 4000, - "ExpChestMaxReward": 7000, - "SpellNameMadness": 0, - "ExtConsumableSet": 0, - "EnableSoftInBattle": true, - "EnableLifeInBattle": 2, - "NormalShopsHaveExtConsumables": false, - "LegendaryShopHasExtConsumables": false, - "ExtConsumableTreasureStackSize": 0, - "ExtStartingItemSet": 0, - "ExtConsumableChests": 0, - "SanityCheckerV2": true, - "OwMapExchange": 0, - "OwShuffledAccess": false, - "OwUnsafeStart": false, - "OwRandomPregen": false, - "RelocateChests": false, - "RelocateChestsTrapIndicator": false, - "ShuffleChimeAccess": false, - "ShuffleChimeIncludeTowns": false, - "GameMode": 0, - "MapGenSeed": 0, - "ReplacementMap": null, - "ResourcePack": null, - "ShopKillMode_Weapons": 0, - "ShopKillMode_Armor": 0, - "ShopKillMode_Item": 0, - "ShopKillMode_Black": 0, - "ShopKillMode_White": 0, - "ShopKillFactor_Weapons": 0, - "ShopKillFactor_Armor": 0, - "ShopKillFactor_Item": 0, - "ShopKillFactor_Black": 0, - "ShopKillFactor_White": 0, - "ShopKillExcludeConeria_Weapons": false, - "ShopKillExcludeConeria_Armor": false, - "ShopKillExcludeConeria_Item": false, - "ShopKillExcludeConeria_Black": false, - "ShopKillExcludeConeria_White": false, - "ExcludeGoldFromScaling": false, - "CheapVendorItem": false, - "StartingLevel": 0, - "MaxLevelLow": 50, - "MaxLevelHigh": 50, - "Spoilers": false, - "TournamentSafe": true, - "BlindSeed": false, - "Shops": true, - "Treasures": true, - "NPCItems": true, - "NPCFetchItems": true, - "RandomWares": true, - "RandomWaresIncludesSpecialGear": true, - "RandomLoot": false, - "ShardHunt": false, - "ShardCount": 0, - "OrbsRequiredCount": 4, - "OrbsRequiredMode": 0, - "OrbsRequiredSpoilers": false, - "TransformFinalFormation": 1, - "ChaosRush": false, - "ToFRMode": 0, - "ExitToFR": true, - "ChaosFloorEncounters": false, - "FiendsRefights": 0, - "MagicShops": false, - "MagicShopLocs": false, - "MagicShopLocationPairs": false, - "MagicLevels": true, - "MagicPermissions": false, - "Weaponizer": false, - "WeaponizerNamesUseQualityOnly": false, - "WeaponizerCommonWeaponsHavePowers": false, - "ArmorCrafter": false, - "MagicLevelsTiered": false, - "MagicLevelsMixed": false, - "MagicAutohitThreshold": 0, - "Rng": true, - "FixMissingBattleRngEntry": false, - "UnrunnableShuffle": true, - "UnrunnablesLow": 12, - "UnrunnablesHigh": 12, - "EnemyFormationsSurprise": false, - "UnrunnablesStrikeFirstAndSurprise": false, - "EnemyTrapTiles": 3, - "TCFormations": 0, - "TCBetterTreasure": 0, - "TCKeyItems": 0, - "TCShards": 0, - "TCExcludeCommons": false, - "TCChestCount": 0, - "TCProtectIncentives": false, - "TCMasaGuardian": false, - "TrappedChaos": false, - "TCIndicator": false, - "SwolePirates": false, - "ShuffleScriptsEnemies": true, - "ShuffleScriptsBosses": true, - "ShuffleSkillsSpellsEnemies": true, - "ShuffleSkillsSpellsBosses": true, - "NoConsecutiveNukes": true, - "TranceHasStatusElement": false, - "EnemySkillsSpellsTiered": false, - "AllowUnsafePirates": true, - "AllowUnsafeMelmond": false, - "WarMECHMode": 1, - "OrdealsPillars": true, - "SkyCastle4FMazeMode": 0, - "TitansTrove": false, - "LefeinSuperStore": false, - "LefeinShops": true, - "RandomVampAttack": true, - "RandomVampAttackIncludesConeria": false, - "FightBahamut": true, - "SwoleBahamut": true, - "SwoleAstos": false, - "ConfusedOldMen": false, - "GaiaShortcut": false, - "DamageTileLow": 1, - "DamageTileHigh": 1, - "OWDamageTiles": false, - "DamageTilesKill": false, - "MoveGaiaItemShop": false, - "ShufflePravokaShops": false, - "FlipDungeons": true, - "VerticallyFlipDungeons": false, - "SpookyFlag": false, - "DraculasFlag": false, - "MapOpenProgression": true, - "MapOpenProgressionDocks": true, - "Entrances": true, - "Towns": true, - "IncludeConeria": false, - "Floors": true, - "AllowDeepCastles": false, - "AllowDeepTowns": true, - "MapOpenProgressionExtended": false, - "MapDwarvesNorthwest": false, - "MapAirshipDock": false, - "MapBahamutCardiaDock": true, - "MapLefeinRiver": true, - "MapBridgeLefein": false, - "MapRiverToMelmond": false, - "MapGaiaMountainPass": true, - "MapHighwayToOrdeals": false, - "MapDragonsHoard": false, - "MapHallOfDragons": false, - "EntrancesIncludesDeadEnds": true, - "EntrancesMixedWithTowns": true, - "IncentivizeFreeNPCs": true, - "IncentivizeFetchNPCs": true, - "IncentivizeTail": true, - "IncentivizeMainItems": true, - "IncentivizeFetchItems": true, - "IncentivizeCanoeItem": true, - "IncentivizeAirship": false, - "IncentivizeShipAndCanal": false, - "IncentivizeBridgeItem": false, - "IncentivizeMarsh": false, - "IncentivizeEarth": false, - "IncentivizeVolcano": false, - "IncentivizeIceCave": true, - "IncentivizeOrdeals": true, - "IncentivizeSeaShrine": false, - "IncentivizeConeria": false, - "IncentivizeMarshKeyLocked": false, - "IncentivizeSkyPalace": true, - "IncentivizeTitansTrove": false, - "IncentivizeCardia": false, - "IceCaveIncentivePlacementType": 1, - "OrdealsIncentivePlacementType": 1, - "MarshIncentivePlacementType": 0, - "TitansIncentivePlacementType": 0, - "EarthIncentivePlacementType": 0, - "VolcanoIncentivePlacementType": 0, - "SeaShrineIncentivePlacementType": 0, - "SkyPalaceIncentivePlacementType": 1, - "CorneriaIncentivePlacementType": 0, - "MarshLockedIncentivePlacementType": 0, - "CardiaIncentivePlacementType": 0, - "BetterTrapChests": false, - "IncentivizeMasamune": false, - "IncentivizeKatana": true, - "IncentivizeXcalber": true, - "IncentivizeVorpal": false, - "IncentivizeOpal": false, - "IncentivizeRibbon": false, - "IncentivizeDefCastArmor": false, - "IncentivizeOffCastArmor": false, - "IncentivizeOtherCastArmor": false, - "IncentivizePowerRod": false, - "IncentivizeDefCastWeapon": false, - "IncentivizeOffCastWeapon": false, - "IncentivizeOtherCastWeapon": false, - "LooseExcludePlacedDungeons": false, - "EarlyKing": true, - "EarlySarda": true, - "EarlySage": true, - "EarlyOrdeals": true, - "ShuffleObjectiveNPCs": false, - "OnlyRequireGameIsBeatable": false, - "FreeBridge": false, - "FreeShip": true, - "FreeAirship": true, - "FreeLute": false, - "EnableCritNumberDisplay": true, - "FreeCanal": true, - "FreeCanoe": false, - "EasyMode": false, - "HousesFillHp": true, - "SpeedHacks": true, - "NoPartyShuffle": true, - "Dash": true, - "SpeedBoat": true, - "BuyTen": true, - "IdentifyTreasures": true, - "ShopInfo": true, - "ChestInfo": true, - "IncentiveChestItemsFanfare": true, - "WaitWhenUnrunnable": true, - "ImprovedClinic": false, - "Etherizer": false, - "HouseMPRestoration": true, - "WeaponStats": true, - "BBCritRate": true, - "WeaponCritRate": true, - "WeaponBonuses": true, - "ThiefAgilityBuff": 2, - "SkyWarriorSpoilerBats": 1, - "SpoilerBatsDontCheckOrbs": true, - "MoveToFBats": false, - "WeaponTypeBonusValue": 30, - "ChanceToRun": 1, - "SpellBugs": true, - "BlackBeltAbsorb": true, - "NPCSwatter": true, - "BattleMagicMenuWrapAround": true, - "InventoryAutosort": true, - "AutoRetargeting": false, - "EnemyStatusAttackBug": true, - "ImproveTurnOrderRandomization": true, - "FixHitChanceCap": true, - "MelmondClinic": true, - "DDProgressiveTilesets": false, - "DDFiendOrbs": false, - "TailBahamutMode": 0, - "StartingGold": 3, - "IncludeMorale": false, - "DeadsGainXP": false, - "NonesGainXP": false, - "NoTail": false, - "NoFloater": false, - "GuaranteedMasamune": true, - "SendMasamuneHome": false, - "MoreConsumableChests": 0, - "NoMasamune": false, - "NoXcalber": false, - "ClassAsNpcFiends": false, - "ClassAsNpcKeyNPC": false, - "ClassAsNpcCount": 6, - "ClassAsNpcDuplicate": false, - "ClassAsNpcForcedFiends": false, - "ClassAsNpcPromotion": false, - "BossScaleStatsLow": 100, - "BossScaleStatsHigh": 250, - "BossScaleHpLow": 250, - "BossScaleHpHigh": 350, - "EnemyScaleStatsLow": 100, - "EnemyScaleStatsHigh": 230, - "EnemyScaleHpLow": 100, - "EnemyScaleHpHigh": 200, - "PriceScaleFactorLow": 50, - "PriceScaleFactorHigh": 200, - "ExpMultiplier": 4, - "ExpBonus": 250, - "ExpMultiplierFighter": 1, - "ExpMultiplierThief": 1, - "ExpMultiplierBlackBelt": 1, - "ExpMultiplierRedMage": 1, - "ExpMultiplierWhiteMage": 1, - "ExpMultiplierBlackMage": 1, - "EncounterRate": 18, - "DungeonEncounterRate": 21, - "ProgressiveScaleMode": 12, - "StartingItemSet": 2, - "ConsumableTreasureStackSize": 0, - "FIGHTER1": true, - "THIEF1": true, - "BLACK_BELT1": true, - "RED_MAGE1": true, - "WHITE_MAGE1": true, - "BLACK_MAGE1": true, - "FIGHTER2": true, - "THIEF2": true, - "BLACK_BELT2": true, - "RED_MAGE2": true, - "WHITE_MAGE2": true, - "BLACK_MAGE2": true, - "FIGHTER3": true, - "THIEF3": true, - "BLACK_BELT3": true, - "RED_MAGE3": true, - "WHITE_MAGE3": true, - "BLACK_MAGE3": true, - "FIGHTER4": true, - "THIEF4": true, - "BLACK_BELT4": true, - "RED_MAGE4": true, - "WHITE_MAGE4": true, - "BLACK_MAGE4": true, - "KNIGHT1": false, - "KNIGHT2": false, - "KNIGHT3": false, - "KNIGHT4": false, - "NINJA1": false, - "NINJA2": false, - "NINJA3": false, - "NINJA4": false, - "MASTER1": false, - "MASTER2": false, - "MASTER3": false, - "MASTER4": false, - "RED_WIZ1": false, - "RED_WIZ2": false, - "RED_WIZ3": false, - "RED_WIZ4": false, - "WHITE_WIZ1": false, - "WHITE_WIZ2": false, - "WHITE_WIZ3": false, - "WHITE_WIZ4": false, - "BLACK_WIZ1": false, - "BLACK_WIZ2": false, - "BLACK_WIZ3": false, - "BLACK_WIZ4": false, - "NONE_CLASS2": true, - "NONE_CLASS3": true, - "NONE_CLASS4": true, - "FORCED1": false, - "FORCED2": false, - "FORCED3": false, - "FORCED4": false, - "DraftFighter": false, - "DraftThief": false, - "DraftBlackBelt": false, - "DraftRedMage": false, - "DraftWhiteMage": false, - "DraftBlackMage": false, - "DraftKnight": false, - "DraftNinja": false, - "DraftMaster": false, - "DraftRedWiz": false, - "DraftWhiteWiz": false, - "DraftBlackWiz": false, - "TAVERN1": true, - "TAVERN2": true, - "TAVERN3": true, - "TAVERN4": true, - "TAVERN5": true, - "TAVERN6": true, - "WeaponPermissions": false, - "ArmorPermissions": false, - "RecruitmentMode": false, - "RecruitmentModeHireOnly": false, - "RecruitmentModeReplaceOnlyNone": false, - "ClampMinimumStatScale": false, - "ClampMinimumBossStatScale": false, - "ClampMinimumPriceScale": false, - "EFGWaterfall": false, - "FiendShuffle": false, - "DisableTentSaving": false, - "DisableInnSaving": false, - "SaveGameWhenGameOver": false, - "SaveGameDWMode": false, - "ShuffleAstos": false, - "UnsafeAstos": false, - "RandomizeEnemizer": false, - "RandomizeFormationEnemizer": false, - "GenerateNewSpellbook": false, - "SpellcrafterMixSpells": false, - "ThiefHitRate": true, - "AllSpellLevelsForKnightNinja": false, - "BuffHealingSpells": true, - "FreeTail": false, - "HintsVillage": false, - "SpellcrafterRetainPermissions": false, - "RandomWeaponBonus": true, - "RandomArmorBonus": true, - "RandomWeaponBonusExcludeMasa": true, - "RandomWeaponBonusLow": -3, - "RandomWeaponBonusHigh": 3, - "RandomArmorBonusLow": -2, - "RandomArmorBonusHigh": 3, - "SeparateBossHPScaling": true, - "SeparateEnemyHPScaling": true, - "ClampBossHPScaling": false, - "ClampEnemyHpScaling": false, - "PoolSize": 2, - "EnablePoolParty": false, - "SafePoolParty": false, - "IncludePromClasses": false, - "EnableRandomPromotions": false, - "IncludeBaseClasses": false, - "RandomPromotionsSpoilers": false, - "RandomizeClassMode": 1, - "RandomizeClassCasting": false, - "RandomizeClassKeyItems": false, - "RandomizeClassChaos": false, - "RandomizeClassIncludeXpBonus": false, - "AlternateFiends": false, - "NoBossSkillScriptShuffle": false, - "LegendaryWeaponShop": false, - "LegendaryArmorShop": false, - "LegendaryBlackShop": false, - "LegendaryWhiteShop": false, - "LegendaryItemShop": false, - "ExclusiveLegendaryWeaponShop": false, - "ExclusiveLegendaryArmorShop": false, - "ExclusiveLegendaryBlackShop": false, - "ExclusiveLegendaryWhiteShop": false, - "ExclusiveLegendaryItemShop": false, - "RandomizeClassMaxBonus": 2, - "RandomizeClassMaxMalus": 1, - "EarlierHighTierMagic": false, - "ChangeMaxMP": false, - "RedMageMaxMP": 9, - "WhiteMageMaxMP": 9, - "BlackMageMaxMP": 9, - "KnightMaxMP": 4, - "NinjaMaxMP": 4, - "MpGainOnMaxGainMode": 0, - "LockMode": 3, - "MDefMode": 1, - "FormationShuffleMode": 1, - "RandomizeTreasure": 1, - "OpenChestsInOrder": false, - "WorldWealth": 1, - "DeepDungeonGenerator": 0, - "EvadeCap": 0, - "AllowUnsafeStartArea": false, - "IncreaseDarkPenalty": false, - "TouchIncludeBosses": true, - "Lockpicking": false, - "ReducedLuck": false, - "LockpickingLevelRequirement": 15, - "WhiteMageHarmEveryone": true, - "EarlierRuby": false - } -} diff --git a/FF1Blazorizer/output/wwwroot/presets/Winter_Tournament_2024.json b/FF1Blazorizer/output/wwwroot/presets/Winter_Tournament_2024.json deleted file mode 100644 index 1448322c7..000000000 --- a/FF1Blazorizer/output/wwwroot/presets/Winter_Tournament_2024.json +++ /dev/null @@ -1,505 +0,0 @@ -{ - "Name": "Winter_Tournament_2024", - "Flags": { - "StartingEquipmentMasamune": false, - "StartingEquipmentKatana": false, - "StartingEquipmentHealStaff": false, - "StartingEquipmentZeusGauntlet": false, - "StartingEquipmentWhiteShirt": false, - "StartingEquipmentRibbon": false, - "StartingEquipmentDragonslayer": false, - "StartingEquipmentLegendKit": false, - "StartingEquipmentRandomEndgameWeapon": false, - "StartingEquipmentRandomAoe": false, - "StartingEquipmentRandomCasterItem": false, - "StartingEquipmentGrandpasSecretStash": false, - "StartingEquipmentOneItem": false, - "StartingEquipmentRandomCrap": false, - "StartingEquipmentStarterPack": false, - "StartingEquipmentRandomTypeWeapon": false, - "StartingEquipmentRemoveFromPool": false, - "StartingEquipmentNoDuplicates": false, - "ReversedFloors": false, - "BuffTier1DamageSpells": true, - "NoEmptyScripts": false, - "LaterLoose": false, - "MermaidPrison": false, - "GuaranteedDefenseItem": 3, - "GuaranteedPowerItem": 0, - "ScriptMultiplier": 1, - "TouchMultiplier": 2, - "TouchPool": 1, - "TouchMode": 2, - "RibbonMode": 0, - "Archipelago": false, - "ArchipelagoGold": false, - "ArchipelagoConsumables": false, - "ArchipelagoShards": false, - "ArchipelagoEquipment": 0, - "ItemMagicMode": 0, - "ItemMagicPool": 0, - "MagisizeWeapons": false, - "DisableMinimap": false, - "LooseItemsForwardPlacement": true, - "LooseItemsSpreadPlacement": true, - "LooseItemsNpcBalance": false, - "AllowUnsafePlacement": false, - "ShipCanalBeforeFloater": false, - "ExpChestConversionMin": 0, - "ExpChestConversionMax": 10, - "ExpChestMinReward": 500, - "ExpChestMaxReward": 2000, - "SpellNameMadness": 0, - "ExtConsumableSet": 0, - "EnableSoftInBattle": true, - "EnableLifeInBattle": 1, - "NormalShopsHaveExtConsumables": false, - "LegendaryShopHasExtConsumables": false, - "ExtConsumableTreasureStackSize": 0, - "ExtStartingItemSet": 0, - "ExtConsumableChests": 0, - "SanityCheckerV2": true, - "OwMapExchange": 0, - "OwShuffledAccess": false, - "OwUnsafeStart": false, - "OwRandomPregen": false, - "RelocateChests": false, - "RelocateChestsTrapIndicator": false, - "ShuffleChimeAccess": false, - "ShuffleChimeIncludeTowns": false, - "GameMode": 0, - "MapGenSeed": 0, - "ReplacementMap": null, - "ResourcePack": null, - "ShopKillMode_Weapons": 0, - "ShopKillMode_Armor": 0, - "ShopKillMode_Item": 0, - "ShopKillMode_Black": 0, - "ShopKillMode_White": 0, - "ShopKillFactor_Weapons": 0, - "ShopKillFactor_Armor": 0, - "ShopKillFactor_Item": 0, - "ShopKillFactor_Black": 0, - "ShopKillFactor_White": 0, - "ShopKillExcludeConeria_Weapons": false, - "ShopKillExcludeConeria_Armor": false, - "ShopKillExcludeConeria_Item": false, - "ShopKillExcludeConeria_Black": false, - "ShopKillExcludeConeria_White": false, - "ExcludeGoldFromScaling": false, - "CheapVendorItem": false, - "StartingLevel": 0, - "TransmooglifierVariance": 0, - "MaxLevelLow": 50, - "MaxLevelHigh": 50, - "Spoilers": false, - "TournamentSafe": true, - "BlindSeed": false, - "Shops": true, - "Treasures": true, - "NPCItems": true, - "NPCFetchItems": true, - "RandomWares": false, - "RandomWaresIncludesSpecialGear": false, - "RandomLoot": false, - "ShardHunt": true, - "ShardCount": 3, - "OrbsRequiredCount": 4, - "OrbsRequiredMode": 0, - "OrbsRequiredSpoilers": false, - "TransformFinalFormation": 0, - "ChaosRush": false, - "ToFRMode": 0, - "FiendsRefights": 0, - "ExitToFR": true, - "ChaosFloorEncounters": false, - "MagicShops": false, - "MagicShopLocs": false, - "MagicShopLocationPairs": false, - "MagicLevels": true, - "MagicPermissions": false, - "Weaponizer": false, - "WeaponizerNamesUseQualityOnly": false, - "WeaponizerCommonWeaponsHavePowers": false, - "ArmorCrafter": false, - "MagicLevelsTiered": false, - "MagicLevelsMixed": false, - "MagicAutohitThreshold": 1, - "Rng": true, - "FixMissingBattleRngEntry": false, - "UnrunnableShuffle": true, - "UnrunnablesLow": 16, - "UnrunnablesHigh": 16, - "EnemyFormationsSurprise": true, - "UnrunnablesStrikeFirstAndSurprise": false, - "EnemyTrapTiles": 0, - "TCFormations": 0, - "TCBetterTreasure": 0, - "TCKeyItems": 0, - "TCShards": 0, - "TCExcludeCommons": false, - "TCChestCount": 0, - "TCProtectIncentives": false, - "TCMasaGuardian": true, - "TrappedChaos": false, - "TCIndicator": true, - "SwolePirates": false, - "ShuffleScriptsEnemies": true, - "ShuffleScriptsBosses": true, - "ShuffleSkillsSpellsEnemies": true, - "ShuffleSkillsSpellsBosses": true, - "NoConsecutiveNukes": true, - "TranceHasStatusElement": true, - "EnemySkillsSpellsTiered": false, - "AllowUnsafePirates": false, - "AllowUnsafeMelmond": false, - "WarMECHMode": 1, - "OrdealsPillars": true, - "SkyCastle4FMazeMode": 0, - "TitansTrove": true, - "LefeinSuperStore": false, - "LefeinShops": true, - "RandomVampAttack": false, - "RandomVampAttackIncludesConeria": false, - "FightBahamut": false, - "SwoleBahamut": false, - "SwoleAstos": false, - "ConfusedOldMen": false, - "GaiaShortcut": true, - "DamageTileLow": 1, - "DamageTileHigh": 1, - "OWDamageTiles": false, - "DamageTilesKill": false, - "MoveGaiaItemShop": true, - "ShufflePravokaShops": false, - "FlipDungeons": false, - "VerticallyFlipDungeons": false, - "SpookyFlag": false, - "DraculasFlag": false, - "MapOpenProgression": true, - "MapOpenProgressionDocks": true, - "Entrances": false, - "Towns": false, - "IncludeConeria": false, - "Floors": false, - "AllowDeepCastles": false, - "AllowDeepTowns": false, - "MapOpenProgressionExtended": false, - "MapDwarvesNorthwest": false, - "MapAirshipDock": false, - "MapBahamutCardiaDock": true, - "MapLefeinRiver": false, - "MapBridgeLefein": false, - "MapRiverToMelmond": false, - "MapGaiaMountainPass": false, - "MapHighwayToOrdeals": false, - "MapDragonsHoard": false, - "MapHallOfDragons": false, - "EntrancesIncludesDeadEnds": false, - "EntrancesMixedWithTowns": false, - "IncentivizeFreeNPCs": false, - "IncentivizeFetchNPCs": true, - "IncentivizeTail": true, - "IncentivizeMainItems": false, - "IncentivizeFetchItems": false, - "IncentivizeCanoeItem": false, - "IncentivizeAirship": false, - "IncentivizeShipAndCanal": false, - "IncentivizeBridgeItem": false, - "IncentivizeMarsh": false, - "IncentivizeEarth": false, - "IncentivizeVolcano": false, - "IncentivizeIceCave": false, - "IncentivizeOrdeals": false, - "IncentivizeSeaShrine": false, - "IncentivizeConeria": false, - "IncentivizeMarshKeyLocked": false, - "IncentivizeSkyPalace": false, - "IncentivizeTitansTrove": false, - "IncentivizeCardia": false, - "IceCaveIncentivePlacementType": 0, - "OrdealsIncentivePlacementType": 0, - "MarshIncentivePlacementType": 0, - "TitansIncentivePlacementType": 0, - "EarthIncentivePlacementType": 0, - "VolcanoIncentivePlacementType": 0, - "SeaShrineIncentivePlacementType": 0, - "SkyPalaceIncentivePlacementType": 0, - "CorneriaIncentivePlacementType": 0, - "MarshLockedIncentivePlacementType": 0, - "CardiaIncentivePlacementType": 0, - "BetterTrapChests": true, - "IncentivizeMasamune": false, - "IncentivizeKatana": false, - "IncentivizeXcalber": true, - "IncentivizeVorpal": true, - "IncentivizeOpal": true, - "IncentivizeRibbon": true, - "IncentivizeDefCastArmor": false, - "IncentivizeOffCastArmor": false, - "IncentivizeOtherCastArmor": true, - "IncentivizePowerRod": true, - "IncentivizeDefCastWeapon": false, - "IncentivizeOffCastWeapon": false, - "IncentivizeOtherCastWeapon": false, - "LooseExcludePlacedDungeons": false, - "EarlyKing": true, - "EarlySarda": true, - "EarlySage": true, - "EarlyOrdeals": true, - "ShuffleObjectiveNPCs": false, - "OnlyRequireGameIsBeatable": false, - "FreeBridge": false, - "FreeShip": false, - "FreeAirship": false, - "FreeLute": false, - "FreeRod": false, - "EnableCritNumberDisplay": true, - "FreeCanal": false, - "FreeCanoe": false, - "EasyMode": false, - "HousesFillHp": true, - "SpeedHacks": true, - "NoPartyShuffle": true, - "Dash": true, - "SpeedBoat": true, - "AirBoat": false, - "BuyTen": true, - "IdentifyTreasures": true, - "ShopInfo": true, - "ChestInfo": true, - "IncentiveChestItemsFanfare": true, - "WaitWhenUnrunnable": true, - "ImprovedClinic": true, - "Etherizer": false, - "HouseMPRestoration": true, - "WeaponStats": true, - "BBCritRate": false, - "WeaponCritRate": true, - "WeaponBonuses": true, - "ThiefAgilityBuff": 2, - "SkyWarriorSpoilerBats": 1, - "SpoilerBatsDontCheckOrbs": true, - "MoveToFBats": false, - "WeaponTypeBonusValue": 35, - "ChanceToRun": 1, - "SpellBugs": true, - "BlackBeltAbsorb": true, - "NPCSwatter": true, - "BattleMagicMenuWrapAround": true, - "InventoryAutosort": true, - "AutoRetargeting": false, - "EnemyStatusAttackBug": true, - "ImproveTurnOrderRandomization": true, - "FixHitChanceCap": true, - "MelmondClinic": false, - "DDProgressiveTilesets": false, - "DDFiendOrbs": false, - "TailBahamutMode": 0, - "StartingGold": 3, - "IncludeMorale": false, - "DeadsGainXP": false, - "NonesGainXP": false, - "NoTail": false, - "NoFloater": false, - "GuaranteedMasamune": false, - "SendMasamuneHome": false, - "MoreConsumableChests": 0, - "NoMasamune": false, - "NoXcalber": false, - "ClassAsNpcFiends": false, - "ClassAsNpcKeyNPC": false, - "ClassAsNpcCount": 6, - "ClassAsNpcDuplicate": false, - "ClassAsNpcForcedFiends": false, - "ClassAsNpcPromotion": false, - "BossScaleStatsLow": 90, - "BossScaleStatsHigh": 180, - "BossScaleHpLow": 110, - "BossScaleHpHigh": 200, - "EnemyScaleStatsLow": 110, - "EnemyScaleStatsHigh": 160, - "EnemyScaleHpLow": 50, - "EnemyScaleHpHigh": 150, - "PriceScaleFactorLow": 30, - "PriceScaleFactorHigh": 250, - "ExpMultiplier": 1.5, - "ExpBonus": 75, - "ExpMultiplierFighter": 1, - "ExpMultiplierThief": 1, - "ExpMultiplierBlackBelt": 1, - "ExpMultiplierRedMage": 1, - "ExpMultiplierWhiteMage": 1, - "ExpMultiplierBlackMage": 1, - "EncounterRate": 15, - "DungeonEncounterRate": 16, - "ProgressiveScaleMode": 12, - "StartingItemSet": 4, - "ConsumableTreasureStackSize": 2, - "FIGHTER1": true, - "THIEF1": true, - "BLACK_BELT1": true, - "RED_MAGE1": true, - "WHITE_MAGE1": true, - "BLACK_MAGE1": true, - "FIGHTER2": true, - "THIEF2": true, - "BLACK_BELT2": true, - "RED_MAGE2": true, - "WHITE_MAGE2": true, - "BLACK_MAGE2": true, - "FIGHTER3": true, - "THIEF3": true, - "BLACK_BELT3": true, - "RED_MAGE3": true, - "WHITE_MAGE3": true, - "BLACK_MAGE3": true, - "FIGHTER4": true, - "THIEF4": true, - "BLACK_BELT4": true, - "RED_MAGE4": true, - "WHITE_MAGE4": true, - "BLACK_MAGE4": true, - "KNIGHT1": false, - "KNIGHT2": false, - "KNIGHT3": false, - "KNIGHT4": false, - "NINJA1": false, - "NINJA2": false, - "NINJA3": false, - "NINJA4": false, - "MASTER1": false, - "MASTER2": false, - "MASTER3": false, - "MASTER4": false, - "RED_WIZ1": false, - "RED_WIZ2": false, - "RED_WIZ3": false, - "RED_WIZ4": false, - "WHITE_WIZ1": false, - "WHITE_WIZ2": false, - "WHITE_WIZ3": false, - "WHITE_WIZ4": false, - "BLACK_WIZ1": false, - "BLACK_WIZ2": false, - "BLACK_WIZ3": false, - "BLACK_WIZ4": false, - "NONE_CLASS2": true, - "NONE_CLASS3": true, - "NONE_CLASS4": true, - "FORCED1": false, - "FORCED2": false, - "FORCED3": false, - "FORCED4": false, - "DraftFighter": false, - "DraftThief": false, - "DraftBlackBelt": false, - "DraftRedMage": false, - "DraftWhiteMage": false, - "DraftBlackMage": false, - "DraftKnight": false, - "DraftNinja": false, - "DraftMaster": false, - "DraftRedWiz": false, - "DraftWhiteWiz": false, - "DraftBlackWiz": false, - "TAVERN1": true, - "TAVERN2": true, - "TAVERN3": true, - "TAVERN4": true, - "TAVERN5": true, - "TAVERN6": true, - "WeaponPermissions": false, - "ArmorPermissions": false, - "RecruitmentMode": false, - "RecruitmentModeHireOnly": false, - "RecruitmentModeReplaceOnlyNone": false, - "ClampMinimumStatScale": false, - "ClampMinimumBossStatScale": false, - "ClampMinimumPriceScale": false, - "EFGWaterfall": false, - "FiendShuffle": false, - "DisableTentSaving": false, - "DisableInnSaving": false, - "SaveGameWhenGameOver": false, - "SaveGameDWMode": false, - "ShuffleAstos": false, - "UnsafeAstos": false, - "RandomizeEnemizer": false, - "RandomizeFormationEnemizer": false, - "GenerateNewSpellbook": false, - "SpellcrafterMixSpells": false, - "ThiefHitRate": true, - "AllSpellLevelsForKnightNinja": false, - "BuffHealingSpells": true, - "FreeTail": false, - "HintsVillage": false, - "SpellcrafterRetainPermissions": false, - "RandomWeaponBonus": true, - "RandomArmorBonus": true, - "RandomWeaponBonusExcludeMasa": false, - "RandomWeaponBonusLow": -1, - "RandomWeaponBonusHigh": 5, - "RandomArmorBonusLow": -1, - "RandomArmorBonusHigh": 6, - "SeparateBossHPScaling": true, - "SeparateEnemyHPScaling": false, - "ClampBossHPScaling": false, - "ClampEnemyHpScaling": false, - "PoolSize": 2, - "EnablePoolParty": false, - "SafePoolParty": false, - "IncludePromClasses": false, - "EnableRandomPromotions": false, - "IncludeBaseClasses": false, - "RandomPromotionsSpoilers": false, - "RandomizeClassMode": 1, - "RandomizeClassCasting": true, - "RandomizeClassKeyItems": false, - "RandomizeClassChaos": false, - "RandomizeClassIncludeXpBonus": false, - "AlternateFiends": false, - "NoBossSkillScriptShuffle": false, - "Transmooglifier": false, - "MooglieWeaponBalance": false, - "GuaranteeCustomClassComposition": false, - "LegendaryWeaponShop": false, - "LegendaryArmorShop": false, - "LegendaryBlackShop": false, - "LegendaryWhiteShop": false, - "LegendaryItemShop": false, - "ExclusiveLegendaryWeaponShop": false, - "ExclusiveLegendaryArmorShop": false, - "ExclusiveLegendaryBlackShop": false, - "ExclusiveLegendaryWhiteShop": false, - "ExclusiveLegendaryItemShop": false, - "RandomizeClassMaxBonus": 2, - "RandomizeClassMaxMalus": 0, - "EarlierHighTierMagic": false, - "ChangeMaxMP": false, - "RedMageMaxMP": 9, - "WhiteMageMaxMP": 9, - "BlackMageMaxMP": 9, - "KnightMaxMP": 4, - "NinjaMaxMP": 4, - "MpGainOnMaxGainMode": 0, - "LockMode": 3, - "MDefMode": 0, - "FormationShuffleMode": 1, - "RandomizeTreasure": 0, - "OpenChestsInOrder": false, - "SetRNG": false, - "WorldWealth": 1, - "DeepDungeonGenerator": 0, - "EvadeCap": 3, - "AllowUnsafeStartArea": false, - "IncreaseDarkPenalty": true, - "TouchIncludeBosses": true, - "Lockpicking": false, - "ReducedLuck": false, - "LockpickingLevelRequirement": 33, - "WhiteMageHarmEveryone": true, - "ProcgenEarth": false, - "EarlierRuby": false - } -} diff --git a/FF1Blazorizer/wwwroot/images/tooltips/FountainText.png b/FF1Blazorizer/wwwroot/images/tooltips/FountainText.png new file mode 100644 index 000000000..854c37936 Binary files /dev/null and b/FF1Blazorizer/wwwroot/images/tooltips/FountainText.png differ diff --git a/FF1Blazorizer/wwwroot/images/tooltips/LefienShortcut.png b/FF1Blazorizer/wwwroot/images/tooltips/LefienShortcut.png new file mode 100644 index 000000000..445aff7d7 Binary files /dev/null and b/FF1Blazorizer/wwwroot/images/tooltips/LefienShortcut.png differ diff --git a/FF1Blazorizer/wwwroot/images/tooltips/MagicShopMenuChangeCheckBox.png b/FF1Blazorizer/wwwroot/images/tooltips/MagicShopMenuChangeCheckBox.png new file mode 100644 index 000000000..f0a360cc7 Binary files /dev/null and b/FF1Blazorizer/wwwroot/images/tooltips/MagicShopMenuChangeCheckBox.png differ diff --git a/FF1Blazorizer/wwwroot/images/tooltips/chestsAppearOpened.png b/FF1Blazorizer/wwwroot/images/tooltips/chestsAppearOpened.png new file mode 100644 index 000000000..c633efe4b Binary files /dev/null and b/FF1Blazorizer/wwwroot/images/tooltips/chestsAppearOpened.png differ diff --git a/FF1Blazorizer/wwwroot/images/tooltips/preserveFiendRefightsCheckBox.gif b/FF1Blazorizer/wwwroot/images/tooltips/preserveFiendRefightsCheckBox.gif deleted file mode 100644 index 942461adc..000000000 Binary files a/FF1Blazorizer/wwwroot/images/tooltips/preserveFiendRefightsCheckBox.gif and /dev/null differ diff --git a/FF1Blazorizer/wwwroot/images/tooltips/redMageHitDropDown.png b/FF1Blazorizer/wwwroot/images/tooltips/redMageHitDropDown.png new file mode 100644 index 000000000..611505b04 Binary files /dev/null and b/FF1Blazorizer/wwwroot/images/tooltips/redMageHitDropDown.png differ diff --git a/FF1Blazorizer/wwwroot/images/tooltips/thiefHitCheckBox.gif b/FF1Blazorizer/wwwroot/images/tooltips/thiefHitDropDown.gif similarity index 100% rename from FF1Blazorizer/wwwroot/images/tooltips/thiefHitCheckBox.gif rename to FF1Blazorizer/wwwroot/images/tooltips/thiefHitDropDown.gif diff --git a/FF1Blazorizer/wwwroot/presets/Beginner.json b/FF1Blazorizer/wwwroot/presets/Beginner.json index 201e883fc..5a2461bef 100644 --- a/FF1Blazorizer/wwwroot/presets/Beginner.json +++ b/FF1Blazorizer/wwwroot/presets/Beginner.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": true, @@ -157,6 +158,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, @@ -265,6 +267,7 @@ "AirBoat": false, "BuyTen": true, "IdentifyTreasures": true, + "ChestsAppearOpened": true, "ShopInfo": true, "ChestInfo": true, "IncentiveChestItemsFanfare": true, @@ -287,7 +290,7 @@ "NPCSwatter": true, "BattleMagicMenuWrapAround": true, "InventoryAutosort": true, - "AutoRetargeting": false, + "AutoRetargeting": false, "EnemyStatusAttackBug": true, "ImproveTurnOrderRandomization": true, "FixHitChanceCap": true, @@ -416,7 +419,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, @@ -428,7 +430,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/wwwroot/presets/Chaos_Rush.json b/FF1Blazorizer/wwwroot/presets/Chaos_Rush.json index 74a8ceb3c..0454380c6 100644 --- a/FF1Blazorizer/wwwroot/presets/Chaos_Rush.json +++ b/FF1Blazorizer/wwwroot/presets/Chaos_Rush.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": true, @@ -157,6 +158,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, @@ -416,7 +418,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, @@ -428,7 +429,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 3, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": true, diff --git a/FF1Blazorizer/wwwroot/presets/Deep_Dungeon.json b/FF1Blazorizer/wwwroot/presets/Deep_Dungeon.json index b6bf3b2e1..0a9b8fbf5 100644 --- a/FF1Blazorizer/wwwroot/presets/Deep_Dungeon.json +++ b/FF1Blazorizer/wwwroot/presets/Deep_Dungeon.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": true, @@ -157,6 +158,7 @@ "OrdealsPillars": false, "SkyCastle4FMazeMode": 0, "TitansTrove": false, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, @@ -416,7 +418,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, @@ -428,7 +429,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/wwwroot/presets/Entrance_Floor_Shuffle.json b/FF1Blazorizer/wwwroot/presets/Entrance_Floor_Shuffle.json index a86df5748..2042da2ca 100644 --- a/FF1Blazorizer/wwwroot/presets/Entrance_Floor_Shuffle.json +++ b/FF1Blazorizer/wwwroot/presets/Entrance_Floor_Shuffle.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": true, @@ -157,6 +158,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, @@ -416,7 +418,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, @@ -428,7 +429,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/wwwroot/presets/Floaterless.json b/FF1Blazorizer/wwwroot/presets/Floaterless.json index 8d1abebda..497f75259 100644 --- a/FF1Blazorizer/wwwroot/presets/Floaterless.json +++ b/FF1Blazorizer/wwwroot/presets/Floaterless.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": true, @@ -157,6 +158,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, @@ -416,7 +418,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, @@ -428,7 +429,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/wwwroot/presets/Free_Enterprise.json b/FF1Blazorizer/wwwroot/presets/Free_Enterprise.json index c0136a4ee..9b95e4ea4 100644 --- a/FF1Blazorizer/wwwroot/presets/Free_Enterprise.json +++ b/FF1Blazorizer/wwwroot/presets/Free_Enterprise.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": true, @@ -157,6 +158,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, @@ -416,7 +418,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, @@ -428,7 +429,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": true, diff --git a/FF1Blazorizer/wwwroot/presets/Hidden_Chaos.json b/FF1Blazorizer/wwwroot/presets/Hidden_Chaos.json index 712007cdc..15185486c 100644 --- a/FF1Blazorizer/wwwroot/presets/Hidden_Chaos.json +++ b/FF1Blazorizer/wwwroot/presets/Hidden_Chaos.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": true, @@ -157,6 +158,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": false, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, @@ -416,7 +418,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, @@ -428,7 +429,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json b/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json index 08a5c70b3..ce03434ee 100644 --- a/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json +++ b/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": false, @@ -157,6 +158,7 @@ "OrdealsPillars": false, "SkyCastle4FMazeMode": 0, "TitansTrove": false, + "LefeinShortcut": false, "LefeinSuperStore": false, "LefeinShops": false, "RandomVampAttack": false, @@ -257,14 +259,15 @@ "FreeCanal": false, "FreeCanoe": false, "EasyMode": false, - "HousesFillHp": false, + "HousesFillHp": true, "SpeedHacks": true, "NoPartyShuffle": true, "Dash": true, - "SpeedBoat": false, + "SpeedBoat": true, "AirBoat": false, "BuyTen": true, "IdentifyTreasures": true, + "ChestsAppearOpened": true, "ShopInfo": true, "ChestInfo": true, "IncentiveChestItemsFanfare": false, @@ -287,7 +290,7 @@ "NPCSwatter": true, "BattleMagicMenuWrapAround": true, "InventoryAutosort": true, - "AutoRetargeting": false, + "AutoRetargeting": true, "EnemyStatusAttackBug": true, "ImproveTurnOrderRandomization": true, "FixHitChanceCap": false, @@ -416,7 +419,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, @@ -428,7 +430,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": false, + "ThiefHitBuff": 3, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": false, "FreeTail": false, @@ -480,7 +483,7 @@ "KnightMaxMP": 4, "NinjaMaxMP": 4, "MpGainOnMaxGainMode": 0, - "LockMode": 3, + "LockMode": 2, "MDefMode": 0, "FormationShuffleMode": 0, "RandomizeTreasure": 0, diff --git a/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json b/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json index 976fa6928..f6b9a1dfc 100644 --- a/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json +++ b/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": true, @@ -157,6 +158,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": false, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, @@ -416,7 +418,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, @@ -428,7 +429,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/wwwroot/presets/Maximum_Troll.json b/FF1Blazorizer/wwwroot/presets/Maximum_Troll.json index 887443323..bd383e4bb 100644 --- a/FF1Blazorizer/wwwroot/presets/Maximum_Troll.json +++ b/FF1Blazorizer/wwwroot/presets/Maximum_Troll.json @@ -81,6 +81,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": true, @@ -146,6 +147,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": false, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": true, @@ -156,7 +158,7 @@ "GaiaShortcut": true, "OWDamageTiles": false, "DamageTilesKill": false, - "MoveGaiaItemShop": true, + "MoveGaiaItemShop": false, "FlipDungeons": true, "SpookyFlag": false, "DraculasFlag": false, @@ -385,7 +387,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": true, "EFGEarth1": false, "EFGEarth2": false, "FiendShuffle": true, @@ -399,7 +400,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/wwwroot/presets/NOverworld.json b/FF1Blazorizer/wwwroot/presets/NOverworld.json index 1deffee6c..0a1d6044d 100644 --- a/FF1Blazorizer/wwwroot/presets/NOverworld.json +++ b/FF1Blazorizer/wwwroot/presets/NOverworld.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": true, @@ -157,6 +158,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, @@ -416,7 +418,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, @@ -428,7 +429,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/wwwroot/presets/Oops_All_Loose.json b/FF1Blazorizer/wwwroot/presets/Oops_All_Loose.json index 63f4d1363..0558480fb 100644 --- a/FF1Blazorizer/wwwroot/presets/Oops_All_Loose.json +++ b/FF1Blazorizer/wwwroot/presets/Oops_All_Loose.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": true, @@ -157,6 +158,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, @@ -416,7 +418,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, @@ -428,7 +429,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/wwwroot/presets/Over_Randomizer.json b/FF1Blazorizer/wwwroot/presets/Over_Randomizer.json index 0680d7675..eb56e6800 100644 --- a/FF1Blazorizer/wwwroot/presets/Over_Randomizer.json +++ b/FF1Blazorizer/wwwroot/presets/Over_Randomizer.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": true, @@ -157,6 +158,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": true, @@ -416,7 +418,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": true, "FiendShuffle": true, "DisableTentSaving": false, "DisableInnSaving": false, @@ -428,7 +429,8 @@ "RandomizeFormationEnemizer": true, "GenerateNewSpellbook": true, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/wwwroot/presets/Procgen_Overworld.json b/FF1Blazorizer/wwwroot/presets/Procgen_Overworld.json index 4243f890f..eb896aed5 100644 --- a/FF1Blazorizer/wwwroot/presets/Procgen_Overworld.json +++ b/FF1Blazorizer/wwwroot/presets/Procgen_Overworld.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": true, @@ -157,6 +158,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, @@ -416,7 +418,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, @@ -428,7 +429,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/wwwroot/presets/Shard_Hunt.json b/FF1Blazorizer/wwwroot/presets/Shard_Hunt.json index 4a689999a..ed5502e00 100644 --- a/FF1Blazorizer/wwwroot/presets/Shard_Hunt.json +++ b/FF1Blazorizer/wwwroot/presets/Shard_Hunt.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": true, @@ -157,6 +158,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, @@ -416,7 +418,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, @@ -428,7 +429,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/wwwroot/presets/Winter_Tournament_2024.json b/FF1Blazorizer/wwwroot/presets/Winter_Tournament_2024.json index b2b850bba..2f2abeff7 100644 --- a/FF1Blazorizer/wwwroot/presets/Winter_Tournament_2024.json +++ b/FF1Blazorizer/wwwroot/presets/Winter_Tournament_2024.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": true, "BlindSeed": false, "Shops": true, @@ -157,6 +158,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": false, "LefeinSuperStore": false, "LefeinShops": true, "RandomVampAttack": false, @@ -416,7 +418,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, @@ -428,7 +429,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/wwwroot/presets/default.json b/FF1Blazorizer/wwwroot/presets/default.json index e0bed3091..5a2461bef 100644 --- a/FF1Blazorizer/wwwroot/presets/default.json +++ b/FF1Blazorizer/wwwroot/presets/default.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": true, @@ -157,6 +158,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, @@ -265,6 +267,7 @@ "AirBoat": false, "BuyTen": true, "IdentifyTreasures": true, + "ChestsAppearOpened": true, "ShopInfo": true, "ChestInfo": true, "IncentiveChestItemsFanfare": true, @@ -416,7 +419,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, @@ -428,7 +430,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025finals.json b/FF1Blazorizer/wwwroot/presets/wt2025finals.json index 1085d4f7d..f397f8827 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025finals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025finals.json @@ -1,532 +1,534 @@ { "Name": "Winter Tournament 2025 Finals", - "Flags": { - "StartingEquipmentMasamune": false, - "StartingEquipmentKatana": false, - "StartingEquipmentHealStaff": false, - "StartingEquipmentZeusGauntlet": false, - "StartingEquipmentWhiteShirt": false, - "StartingEquipmentRibbon": false, - "StartingEquipmentDragonslayer": false, - "StartingEquipmentLegendKit": false, - "StartingEquipmentRandomEndgameWeapon": false, - "StartingEquipmentRandomAoe": false, - "StartingEquipmentRandomCasterItem": false, - "StartingEquipmentGrandpasSecretStash": false, - "StartingEquipmentOneItem": false, - "StartingEquipmentRandomCrap": false, - "StartingEquipmentStarterPack": false, - "StartingEquipmentRandomTypeWeapon": false, - "StartingEquipmentRemoveFromPool": false, - "StartingEquipmentNoDuplicates": false, - "ReversedFloors": false, - "BuffTier1DamageSpells": true, - "NoEmptyScripts": false, - "LaterLoose": false, - "MermaidPrison": true, - "GuaranteedDefenseItem": 3, - "GuaranteedPowerItem": 0, - "ScriptMultiplier": 1, - "TouchMultiplier": 2, - "TouchPool": 1, - "TouchMode": 0, - "RibbonMode": 0, - "Archipelago": false, - "ArchipelagoGold": false, - "ArchipelagoConsumables": false, - "ArchipelagoShards": false, - "ArchipelagoEquipment": 0, - "ItemMagicMode": 0, - "ItemMagicPool": 0, - "MagisizeWeapons": false, - "DisableMinimap": false, - "LooseItemsForwardPlacement": false, - "LooseItemsSpreadPlacement": false, - "LooseItemsNpcBalance": false, - "AllowUnsafePlacement": true, - "ShipCanalBeforeFloater": false, - "ExpChestConversionMin": 10, - "ExpChestConversionMax": 10, - "ExpChestMinReward": 3000, - "ExpChestMaxReward": 3000, - "SpellNameMadness": 0, - "ExtConsumableSet": 0, - "EnableSoftInBattle": true, - "EnableLifeInBattle": 0, - "NormalShopsHaveExtConsumables": false, - "LegendaryShopHasExtConsumables": false, - "ExtConsumableTreasureStackSize": 0, - "ExtStartingItemSet": 0, - "ExtConsumableChests": 0, - "OwMapExchange": 0, - "OwShuffledAccess": false, - "OwUnsafeStart": false, - "OwRandomPregen": false, - "RelocateChests": false, - "RelocateChestsTrapIndicator": false, - "ShuffleChimeAccess": true, - "ShuffleChimeIncludeTowns": false, - "GameMode": 0, - "MapGenSeed": 0, - "ReplacementMap": null, - "ResourcePack": null, - "ShopKillMode_Weapons": 0, - "ShopKillMode_Armor": 0, - "ShopKillMode_Item": 0, - "ShopKillMode_Black": 0, - "ShopKillMode_White": 0, - "ShopKillFactor_Weapons": 0, - "ShopKillFactor_Armor": 0, - "ShopKillFactor_Item": 0, - "ShopKillFactor_Black": 0, - "ShopKillFactor_White": 0, - "ShopKillExcludeConeria_Weapons": false, - "ShopKillExcludeConeria_Armor": false, - "ShopKillExcludeConeria_Item": false, - "ShopKillExcludeConeria_Black": false, - "ShopKillExcludeConeria_White": false, - "ExcludeGoldFromScaling": false, - "CheapVendorItem": false, - "StartingLevel": 0, - "TransmooglifierVariance": 0, - "MaxLevelLow": 50, - "MaxLevelHigh": 50, - "Spoilers": false, - "TournamentSafe": true, - "BlindSeed": false, - "Shops": true, - "Treasures": true, - "ChestsKeyItems": true, - "NPCItems": true, - "NPCFetchItems": true, - "RandomWares": false, - "RandomWaresIncludesSpecialGear": false, - "RandomLoot": false, - "ShardHunt": true, - "ShardCount": 4, - "OrbsRequiredCount": 4, - "OrbsRequiredMode": 0, - "OrbsRequiredSpoilers": false, - "TransformFinalFormation": 0, - "ChaosRush": false, - "ToFRMode": 1, - "FiendsRefights": 0, - "ExitToFR": true, - "ChaosFloorEncounters": false, - "MagicShops": false, - "MagicShopLocs": false, - "MagicShopLocationPairs": false, - "MagicLevels": true, - "MagicPermissions": false, - "Weaponizer": false, - "WeaponizerNamesUseQualityOnly": false, - "WeaponizerCommonWeaponsHavePowers": false, - "ArmorCrafter": false, - "MagicLevelsTiered": false, - "MagicLevelsMixed": false, - "MagicAutohitThreshold": 0, - "Rng": true, - "FixMissingBattleRngEntry": false, - "EncounterPrng": false, - "UnrunnableShuffle": true, - "UnrunnablesLow": 0, - "UnrunnablesHigh": 0, - "EnemyFormationsSurprise": true, - "UnrunnablesStrikeFirstAndSurprise": false, - "EnemyTrapTiles": 3, - "TCFormations": 2, - "TCBetterTreasure": 0, - "TCKeyItems": 2, - "TCShards": 2, - "TCExcludeCommons": false, - "TCChestCount": 0, - "TCProtectIncentives": false, - "TCMasaGuardian": false, - "TrappedChaos": false, - "TCIndicator": true, - "SwolePirates": false, - "ShuffleScriptsEnemies": true, - "RemoveBossScripts": false, - "ShuffleScriptsBosses": false, - "ShuffleSkillsSpellsEnemies": true, - "ShuffleSkillsSpellsBosses": false, - "NoConsecutiveNukes": false, - "TranceHasStatusElement": true, - "EnemySkillsSpellsTiered": false, - "AllowUnsafePirates": false, - "AllowUnsafeMelmond": false, - "WarMECHMode": 1, - "OrdealsPillars": true, - "ShuffleLavaTiles": false, - "SkyCastle4FMazeMode": 0, - "TitansTrove": true, - "LefeinSuperStore": true, - "LefeinShops": true, - "RandomVampAttack": false, - "RandomVampAttackIncludesConeria": false, - "FightBahamut": false, - "SwoleBahamut": false, - "SwoleAstos": false, - "ConfusedOldMen": false, - "GaiaShortcut": true, - "DamageTileLow": 1, - "DamageTileHigh": 1, - "OWDamageTiles": false, - "DamageTilesKill": false, - "ArmorResistsDamageTileDamage": false, - "MoveGaiaItemShop": true, - "ShufflePravokaShops": false, - "FlipDungeons": false, - "VerticallyFlipDungeons": false, - "SpookyFlag": false, - "DraculasFlag": false, - "MapOpenProgression": true, - "MapOpenProgressionDocks": true, - "Entrances": false, - "Towns": false, - "IncludeConeria": false, - "Floors": false, - "AllowDeepCastles": false, - "AllowDeepTowns": false, - "MapOpenProgressionExtended": true, - "MapAirshipDock": true, - "MapBahamutCardiaDock": true, - "MapLefeinRiver": true, - "MapBridgeLefein": true, - "MapRiverToMelmond": true, - "MapGaiaMountainPass": true, - "MapHighwayToOrdeals": true, - "MapDragonsHoard": false, - "MapHallOfDragons": false, - "EntrancesIncludesDeadEnds": false, - "EntrancesMixedWithTowns": false, - "IncentivizeFreeNPCs": true, - "IncentivizeFetchNPCs": true, - "IncentivizeTail": true, - "IncentivizeMainItems": true, - "IncentivizeFetchItems": true, - "IncentivizeCanoeItem": true, - "IncentivizeAirship": true, - "IncentivizeShipAndCanal": true, - "IncentivizeBridgeItem": false, - "IncentivizeMarsh": false, - "IncentivizeEarth": true, - "IncentivizeVolcano": true, - "IncentivizeIceCave": false, - "IncentivizeOrdeals": true, - "IncentivizeSeaShrine": true, - "IncentivizeConeria": true, - "IncentivizeMarshKeyLocked": false, - "IncentivizeSkyPalace": true, - "IncentivizeTitansTrove": true, - "IncentivizeCardia": true, - "IceCaveIncentivePlacementType": 0, - "OrdealsIncentivePlacementType": 1, - "MarshIncentivePlacementType": 0, - "TitansIncentivePlacementType": 1, - "EarthIncentivePlacementType": 3, - "VolcanoIncentivePlacementType": 2, - "SeaShrineIncentivePlacementType": 3, - "SkyPalaceIncentivePlacementType": 3, - "CorneriaIncentivePlacementType": 0, - "MarshLockedIncentivePlacementType": 0, - "CardiaIncentivePlacementType": 1, - "BetterTrapChests": false, - "IncentivizeMasamune": false, - "IncentivizeKatana": false, - "IncentivizeXcalber": true, - "IncentivizeVorpal": false, - "IncentivizeOpal": false, - "IncentivizeRibbon": false, - "IncentivizeDefCastArmor": false, - "IncentivizeOffCastArmor": false, - "IncentivizeOtherCastArmor": true, - "IncentivizePowerRod": false, - "IncentivizeDefCastWeapon": true, - "IncentivizeOffCastWeapon": false, - "IncentivizeOtherCastWeapon": false, - "LooseExcludePlacedDungeons": false, - "EarlyKing": true, - "EarlySarda": true, - "EarlySage": true, - "EarlyOrdeals": true, - "ShuffleObjectiveNPCs": false, - "OnlyRequireGameIsBeatable": false, - "FreeBridge": true, - "FreeShip": false, - "FreeAirship": false, - "FreeLute": false, - "FreeRod": false, - "EnableCritNumberDisplay": true, - "FreeCanal": false, - "FreeCanoe": false, - "EasyMode": false, - "HousesFillHp": true, - "SpeedHacks": true, - "NoPartyShuffle": true, - "Dash": true, - "SpeedBoat": true, - "AirBoat": true, - "BuyTen": true, - "IdentifyTreasures": true, - "ShopInfo": true, - "ChestInfo": true, - "IncentiveChestItemsFanfare": true, - "WaitWhenUnrunnable": true, - "ImprovedClinic": false, - "Etherizer": false, - "HouseMPRestoration": true, - "WeaponStats": true, - "BBCritRate": false, - "WeaponCritRate": true, - "WeaponBonuses": true, - "ThiefAgilityBuff": 1, - "SkyWarriorSpoilerBats": 1, - "SpoilerBatsDontCheckOrbs": true, - "MoveToFBats": false, - "WeaponTypeBonusValue": 42, - "ChanceToRun": 1, - "SpellBugs": true, - "BlackBeltAbsorb": true, - "NPCSwatter": true, - "BattleMagicMenuWrapAround": true, - "MagicMenuSpellReordering": true, - "InventoryAutosort": true, - "RepeatedHealPotionUse": false, - "AutoRetargeting": true, - "EnemyStatusAttackBug": true, - "ImproveTurnOrderRandomization": true, - "FixHitChanceCap": true, - "MelmondClinic": false, - "DDProgressiveTilesets": false, - "DDFiendOrbs": false, - "TailBahamutMode": 0, - "StartingGold": 3, - "IncludeMorale": false, - "DeadsGainXP": false, - "NonesGainXP": false, - "NoTail": false, - "NoFloater": false, - "GuaranteedMasamune": false, - "SendMasamuneHome": false, - "MoreConsumableChests": 0, - "NoMasamune": false, - "NoXcalber": false, - "ClassAsNpcFiends": false, - "ClassAsNpcKeyNPC": false, - "ClassAsNpcCount": 6, - "ClassAsNpcDuplicate": false, - "ClassAsNpcForcedFiends": false, - "ClassAsNpcPromotion": false, - "BossScaleStatsLow": 140, - "BossScaleStatsHigh": 200, - "BossScaleHpLow": 170, - "BossScaleHpHigh": 200, - "EnemyScaleStatsLow": 100, - "EnemyScaleStatsHigh": 160, - "EnemyScaleHpLow": 50, - "EnemyScaleHpHigh": 150, - "PriceScaleFactorLow": 50, - "PriceScaleFactorHigh": 200, - "ExpMultiplier": 2.5, - "ExpBonus": 150, - "ExpMultiplierFighter": 1.1, - "ExpMultiplierThief": 1.1, - "ExpMultiplierBlackBelt": 1, - "ExpMultiplierRedMage": 1, - "ExpMultiplierWhiteMage": 1, - "ExpMultiplierBlackMage": 1, - "EncounterRate": 12, - "DungeonEncounterRate": 15, - "ProgressiveScaleMode": 11, - "StartingItemSet": 4, - "ConsumableTreasureStackSize": 2, - "FIGHTER1": true, - "THIEF1": true, - "BLACK_BELT1": true, - "RED_MAGE1": false, - "WHITE_MAGE1": false, - "BLACK_MAGE1": false, - "FIGHTER2": true, - "THIEF2": true, - "BLACK_BELT2": false, - "RED_MAGE2": true, - "WHITE_MAGE2": true, - "BLACK_MAGE2": true, - "FIGHTER3": false, - "THIEF3": false, - "BLACK_BELT3": false, - "RED_MAGE3": false, - "WHITE_MAGE3": false, - "BLACK_MAGE3": false, - "FIGHTER4": false, - "THIEF4": false, - "BLACK_BELT4": false, - "RED_MAGE4": true, - "WHITE_MAGE4": true, - "BLACK_MAGE4": true, - "KNIGHT1": false, - "KNIGHT2": false, - "KNIGHT3": false, - "KNIGHT4": false, - "NINJA1": false, - "NINJA2": false, - "NINJA3": false, - "NINJA4": false, - "MASTER1": false, - "MASTER2": false, - "MASTER3": false, - "MASTER4": false, - "RED_WIZ1": false, - "RED_WIZ2": false, - "RED_WIZ3": false, - "RED_WIZ4": false, - "WHITE_WIZ1": false, - "WHITE_WIZ2": false, - "WHITE_WIZ3": false, - "WHITE_WIZ4": false, - "BLACK_WIZ1": false, - "BLACK_WIZ2": false, - "BLACK_WIZ3": false, - "BLACK_WIZ4": false, - "NONE_CLASS2": true, - "NONE_CLASS3": true, - "NONE_CLASS4": true, - "FORCED1": true, - "FORCED2": true, - "FORCED3": true, - "FORCED4": false, - "DraftFighter": false, - "DraftThief": false, - "DraftBlackBelt": false, - "DraftRedMage": false, - "DraftWhiteMage": false, - "DraftBlackMage": false, - "DraftKnight": false, - "DraftNinja": false, - "DraftMaster": false, - "DraftRedWiz": false, - "DraftWhiteWiz": false, - "DraftBlackWiz": false, - "TAVERN1": true, - "TAVERN2": true, - "TAVERN3": false, - "TAVERN4": true, - "TAVERN5": true, - "TAVERN6": true, - "WeaponPermissions": false, - "ArmorPermissions": false, - "RecruitmentMode": true, - "RecruitmentModeHireOnly": false, - "RecruitmentModeReplaceOnlyNone": true, - "ClampMinimumStatScale": false, - "ClampMinimumBossStatScale": false, - "ClampMinimumPriceScale": false, - "EFGWaterfall": false, - "FiendShuffle": false, - "DisableTentSaving": false, - "DisableInnSaving": false, - "SaveGameWhenGameOver": false, - "SaveGameDWMode": false, - "ShuffleAstos": false, - "UnsafeAstos": false, - "RandomizeEnemizer": false, - "RandomizeFormationEnemizer": false, - "GenerateNewSpellbook": false, - "SpellcrafterMixSpells": false, - "ThiefHitRate": true, - "AllSpellLevelsForKnightNinja": false, - "BuffHealingSpells": true, - "IntAffectsSpells": false, - "AddDamageTiles": false, - "DamageTilesCastles": false, - "DamageTilesDungeons": false, - "DamageTilesCaves": false, - "DamageTilesTowns": false, - "DamageTilesTof": false, - "DamageTilesQuantity": 1, - "FreeTail": false, - "HintsVillage": false, - "SpellcrafterRetainPermissions": false, - "RandomWeaponBonus": true, - "RandomArmorBonus": true, - "RandomWeaponBonusExcludeMasa": false, - "RandomWeaponBonusLow": 0, - "RandomWeaponBonusHigh": 5, - "RandomArmorBonusLow": 0, - "RandomArmorBonusHigh": 5, - "SeparateBossHPScaling": true, - "SeparateEnemyHPScaling": false, - "ClampBossHPScaling": false, - "ClampEnemyHpScaling": false, - "PoolSize": 2, - "EnablePoolParty": false, - "SafePoolParty": false, - "IncludePromClasses": false, - "EnableRandomPromotions": false, - "IncludeBaseClasses": false, - "RandomPromotionsSpoilers": false, - "RandomizeClassCasting": true, - "RandomizeClassKeyItems": false, - "RandomizeClassIncludeXpBonus": false, - "AlternateFiends": false, - "FinalFantasy2Fiends": false, - "FinalFantasy3Fiends": false, - "FinalFantasy4Fiends": false, - "FinalFantasy5Fiends": false, - "FinalFantasy6Fiends": false, - "FinalFantasy1BonusFiends": false, - "BlackOrbFiends": false, - "NoBossSkillScriptShuffle": false, - "MooglieWeaponBalance": false, - "GuaranteeCustomClassComposition": false, - "LegendaryWeaponShop": false, - "LegendaryArmorShop": false, - "LegendaryBlackShop": false, - "LegendaryWhiteShop": false, - "LegendaryItemShop": false, - "ExclusiveLegendaryWeaponShop": false, - "ExclusiveLegendaryArmorShop": false, - "ExclusiveLegendaryBlackShop": false, - "ExclusiveLegendaryWhiteShop": false, - "ExclusiveLegendaryItemShop": false, - "RandomizeClassMode": 1, - "RandomizeClassMaxBonus": 1, - "RandomizeClassMaxMalus": 0, - "EarlierHighTierMagic": false, - "ChangeMaxMP": false, - "RedMageMaxMP": 9, - "WhiteMageMaxMP": 9, - "BlackMageMaxMP": 9, - "KnightMaxMP": 4, - "NinjaMaxMP": 4, - "Knightlvl4": true, - "PinkMage": false, - "BlackKnight": true, - "BlackKnightKeep": false, - "WhiteNinja": true, - "WhiteNinjaKeep": true, - "MpGainOnMaxGainMode": 0, - "LockMode": 3, - "MDefMode": 0, - "FormationShuffleMode": 1, - "RandomizeTreasure": 0, - "OpenChestsInOrder": false, - "SetRNG": false, - "WorldWealth": 1, - "DeepDungeonGenerator": 0, - "EvadeCap": 3, - "AllowUnsafeStartArea": false, - "IncreaseDarkPenalty": true, - "IncreaseRegeneration": false, - "PoisonMode": 6, - "PoisonSetDamageValue": 3, - "TouchIncludeBosses": true, - "Lockpicking": true, - "ReducedLuck": false, - "LockpickingLevelRequirement": 22, - "WhiteMageHarmEveryone": true, - "ProcgenEarth": false, - "LoosePlacementMode": 0 - } + "Flags": { + "StartingEquipmentMasamune": false, + "StartingEquipmentKatana": false, + "StartingEquipmentHealStaff": false, + "StartingEquipmentZeusGauntlet": false, + "StartingEquipmentWhiteShirt": false, + "StartingEquipmentRibbon": false, + "StartingEquipmentDragonslayer": false, + "StartingEquipmentLegendKit": false, + "StartingEquipmentRandomEndgameWeapon": false, + "StartingEquipmentRandomAoe": false, + "StartingEquipmentRandomCasterItem": false, + "StartingEquipmentGrandpasSecretStash": false, + "StartingEquipmentOneItem": false, + "StartingEquipmentRandomCrap": false, + "StartingEquipmentStarterPack": false, + "StartingEquipmentRandomTypeWeapon": false, + "StartingEquipmentRemoveFromPool": false, + "StartingEquipmentNoDuplicates": false, + "ReversedFloors": false, + "BuffTier1DamageSpells": true, + "NoEmptyScripts": false, + "LaterLoose": false, + "MermaidPrison": true, + "GuaranteedDefenseItem": 3, + "GuaranteedPowerItem": 0, + "ScriptMultiplier": 1, + "TouchMultiplier": 2, + "TouchPool": 1, + "TouchMode": 0, + "RibbonMode": 0, + "Archipelago": false, + "ArchipelagoGold": false, + "ArchipelagoConsumables": false, + "ArchipelagoShards": false, + "ArchipelagoEquipment": 0, + "ItemMagicMode": 0, + "ItemMagicPool": 0, + "MagisizeWeapons": false, + "DisableMinimap": false, + "LooseItemsForwardPlacement": false, + "LooseItemsSpreadPlacement": false, + "LooseItemsNpcBalance": false, + "AllowUnsafePlacement": true, + "ShipCanalBeforeFloater": false, + "ExpChestConversionMin": 10, + "ExpChestConversionMax": 10, + "ExpChestMinReward": 3000, + "ExpChestMaxReward": 3000, + "SpellNameMadness": 0, + "ExtConsumableSet": 0, + "EnableSoftInBattle": true, + "EnableLifeInBattle": 0, + "NormalShopsHaveExtConsumables": false, + "LegendaryShopHasExtConsumables": false, + "ExtConsumableTreasureStackSize": 0, + "ExtStartingItemSet": 0, + "ExtConsumableChests": 0, + "OwMapExchange": 0, + "OwShuffledAccess": false, + "OwUnsafeStart": false, + "OwRandomPregen": false, + "RelocateChests": false, + "RelocateChestsTrapIndicator": false, + "ShuffleChimeAccess": true, + "ShuffleChimeIncludeTowns": false, + "GameMode": 0, + "MapGenSeed": 0, + "ReplacementMap": null, + "ResourcePack": null, + "ShopKillMode_Weapons": 0, + "ShopKillMode_Armor": 0, + "ShopKillMode_Item": 0, + "ShopKillMode_Black": 0, + "ShopKillMode_White": 0, + "ShopKillFactor_Weapons": 0, + "ShopKillFactor_Armor": 0, + "ShopKillFactor_Item": 0, + "ShopKillFactor_Black": 0, + "ShopKillFactor_White": 0, + "ShopKillExcludeConeria_Weapons": false, + "ShopKillExcludeConeria_Armor": false, + "ShopKillExcludeConeria_Item": false, + "ShopKillExcludeConeria_Black": false, + "ShopKillExcludeConeria_White": false, + "ExcludeGoldFromScaling": false, + "CheapVendorItem": false, + "StartingLevel": 0, + "TransmooglifierVariance": 0, + "MaxLevelLow": 50, + "MaxLevelHigh": 50, + "Spoilers": false, + "TriState": false, + "TournamentSafe": true, + "BlindSeed": false, + "Shops": true, + "Treasures": true, + "ChestsKeyItems": true, + "NPCItems": true, + "NPCFetchItems": true, + "RandomWares": false, + "RandomWaresIncludesSpecialGear": false, + "RandomLoot": false, + "ShardHunt": true, + "ShardCount": 4, + "OrbsRequiredCount": 4, + "OrbsRequiredMode": 0, + "OrbsRequiredSpoilers": false, + "TransformFinalFormation": 0, + "ChaosRush": false, + "ToFRMode": 1, + "FiendsRefights": 0, + "ExitToFR": true, + "ChaosFloorEncounters": false, + "MagicShops": false, + "MagicShopLocs": false, + "MagicShopLocationPairs": false, + "MagicLevels": true, + "MagicPermissions": false, + "Weaponizer": false, + "WeaponizerNamesUseQualityOnly": false, + "WeaponizerCommonWeaponsHavePowers": false, + "ArmorCrafter": false, + "MagicLevelsTiered": false, + "MagicLevelsMixed": false, + "MagicAutohitThreshold": 0, + "Rng": true, + "FixMissingBattleRngEntry": false, + "EncounterPrng": false, + "UnrunnableShuffle": true, + "UnrunnablesLow": 0, + "UnrunnablesHigh": 0, + "EnemyFormationsSurprise": true, + "UnrunnablesStrikeFirstAndSurprise": false, + "EnemyTrapTiles": 3, + "TCFormations": 2, + "TCBetterTreasure": 0, + "TCKeyItems": 2, + "TCShards": 2, + "TCExcludeCommons": false, + "TCChestCount": 0, + "TCProtectIncentives": false, + "TCMasaGuardian": false, + "TrappedChaos": false, + "TCIndicator": true, + "SwolePirates": false, + "ShuffleScriptsEnemies": true, + "RemoveBossScripts": false, + "ShuffleScriptsBosses": false, + "ShuffleSkillsSpellsEnemies": true, + "ShuffleSkillsSpellsBosses": false, + "NoConsecutiveNukes": false, + "TranceHasStatusElement": true, + "EnemySkillsSpellsTiered": false, + "AllowUnsafePirates": false, + "AllowUnsafeMelmond": false, + "WarMECHMode": 1, + "OrdealsPillars": true, + "ShuffleLavaTiles": false, + "SkyCastle4FMazeMode": 0, + "TitansTrove": true, + "LefeinShortcut": false, + "LefeinSuperStore": true, + "LefeinShops": true, + "RandomVampAttack": false, + "RandomVampAttackIncludesConeria": false, + "FightBahamut": false, + "SwoleBahamut": false, + "SwoleAstos": false, + "ConfusedOldMen": false, + "GaiaShortcut": true, + "DamageTileLow": 1, + "DamageTileHigh": 1, + "OWDamageTiles": false, + "DamageTilesKill": false, + "ArmorResistsDamageTileDamage": false, + "MoveGaiaItemShop": true, + "ShufflePravokaShops": false, + "FlipDungeons": false, + "VerticallyFlipDungeons": false, + "SpookyFlag": false, + "DraculasFlag": false, + "MapOpenProgression": true, + "MapOpenProgressionDocks": true, + "Entrances": false, + "Towns": false, + "IncludeConeria": false, + "Floors": false, + "AllowDeepCastles": false, + "AllowDeepTowns": false, + "MapOpenProgressionExtended": true, + "MapAirshipDock": true, + "MapBahamutCardiaDock": true, + "MapLefeinRiver": true, + "MapBridgeLefein": true, + "MapRiverToMelmond": true, + "MapGaiaMountainPass": true, + "MapHighwayToOrdeals": true, + "MapDragonsHoard": false, + "MapHallOfDragons": false, + "EntrancesIncludesDeadEnds": false, + "EntrancesMixedWithTowns": false, + "IncentivizeFreeNPCs": true, + "IncentivizeFetchNPCs": true, + "IncentivizeTail": true, + "IncentivizeMainItems": true, + "IncentivizeFetchItems": true, + "IncentivizeCanoeItem": true, + "IncentivizeAirship": true, + "IncentivizeShipAndCanal": true, + "IncentivizeBridgeItem": false, + "IncentivizeMarsh": false, + "IncentivizeEarth": true, + "IncentivizeVolcano": true, + "IncentivizeIceCave": false, + "IncentivizeOrdeals": true, + "IncentivizeSeaShrine": true, + "IncentivizeConeria": true, + "IncentivizeMarshKeyLocked": false, + "IncentivizeSkyPalace": true, + "IncentivizeTitansTrove": true, + "IncentivizeCardia": true, + "IceCaveIncentivePlacementType": 0, + "OrdealsIncentivePlacementType": 1, + "MarshIncentivePlacementType": 0, + "TitansIncentivePlacementType": 1, + "EarthIncentivePlacementType": 3, + "VolcanoIncentivePlacementType": 2, + "SeaShrineIncentivePlacementType": 3, + "SkyPalaceIncentivePlacementType": 3, + "CorneriaIncentivePlacementType": 0, + "MarshLockedIncentivePlacementType": 0, + "CardiaIncentivePlacementType": 1, + "BetterTrapChests": false, + "IncentivizeMasamune": false, + "IncentivizeKatana": false, + "IncentivizeXcalber": true, + "IncentivizeVorpal": false, + "IncentivizeOpal": false, + "IncentivizeRibbon": false, + "IncentivizeDefCastArmor": false, + "IncentivizeOffCastArmor": false, + "IncentivizeOtherCastArmor": true, + "IncentivizePowerRod": false, + "IncentivizeDefCastWeapon": true, + "IncentivizeOffCastWeapon": false, + "IncentivizeOtherCastWeapon": false, + "LooseExcludePlacedDungeons": false, + "EarlyKing": true, + "EarlySarda": true, + "EarlySage": true, + "EarlyOrdeals": true, + "ShuffleObjectiveNPCs": false, + "OnlyRequireGameIsBeatable": false, + "FreeBridge": true, + "FreeShip": false, + "FreeAirship": false, + "FreeLute": false, + "FreeRod": false, + "EnableCritNumberDisplay": true, + "FreeCanal": false, + "FreeCanoe": false, + "EasyMode": false, + "HousesFillHp": true, + "SpeedHacks": true, + "NoPartyShuffle": true, + "Dash": true, + "SpeedBoat": true, + "AirBoat": true, + "BuyTen": true, + "IdentifyTreasures": true, + "ShopInfo": true, + "ChestInfo": true, + "IncentiveChestItemsFanfare": true, + "WaitWhenUnrunnable": true, + "ImprovedClinic": false, + "Etherizer": false, + "HouseMPRestoration": true, + "WeaponStats": true, + "BBCritRate": false, + "WeaponCritRate": true, + "WeaponBonuses": true, + "ThiefAgilityBuff": 1, + "SkyWarriorSpoilerBats": 1, + "SpoilerBatsDontCheckOrbs": true, + "MoveToFBats": false, + "WeaponTypeBonusValue": 42, + "ChanceToRun": 1, + "SpellBugs": true, + "BlackBeltAbsorb": true, + "NPCSwatter": true, + "BattleMagicMenuWrapAround": true, + "MagicMenuSpellReordering": true, + "InventoryAutosort": true, + "RepeatedHealPotionUse": false, + "AutoRetargeting": true, + "EnemyStatusAttackBug": true, + "ImproveTurnOrderRandomization": true, + "FixHitChanceCap": true, + "MelmondClinic": false, + "DDProgressiveTilesets": false, + "DDFiendOrbs": false, + "TailBahamutMode": 0, + "StartingGold": 3, + "IncludeMorale": false, + "DeadsGainXP": false, + "NonesGainXP": false, + "NoTail": false, + "NoFloater": false, + "GuaranteedMasamune": false, + "SendMasamuneHome": false, + "MoreConsumableChests": 0, + "NoMasamune": false, + "NoXcalber": false, + "ClassAsNpcFiends": false, + "ClassAsNpcKeyNPC": false, + "ClassAsNpcCount": 6, + "ClassAsNpcDuplicate": false, + "ClassAsNpcForcedFiends": false, + "ClassAsNpcPromotion": false, + "BossScaleStatsLow": 140, + "BossScaleStatsHigh": 200, + "BossScaleHpLow": 170, + "BossScaleHpHigh": 200, + "EnemyScaleStatsLow": 100, + "EnemyScaleStatsHigh": 160, + "EnemyScaleHpLow": 50, + "EnemyScaleHpHigh": 150, + "PriceScaleFactorLow": 50, + "PriceScaleFactorHigh": 200, + "ExpMultiplier": 2.5, + "ExpBonus": 150, + "ExpMultiplierFighter": 1.1, + "ExpMultiplierThief": 1.1, + "ExpMultiplierBlackBelt": 1, + "ExpMultiplierRedMage": 1, + "ExpMultiplierWhiteMage": 1, + "ExpMultiplierBlackMage": 1, + "EncounterRate": 12, + "DungeonEncounterRate": 15, + "ProgressiveScaleMode": 11, + "StartingItemSet": 4, + "ConsumableTreasureStackSize": 2, + "FIGHTER1": true, + "THIEF1": true, + "BLACK_BELT1": true, + "RED_MAGE1": false, + "WHITE_MAGE1": false, + "BLACK_MAGE1": false, + "FIGHTER2": true, + "THIEF2": true, + "BLACK_BELT2": false, + "RED_MAGE2": true, + "WHITE_MAGE2": true, + "BLACK_MAGE2": true, + "FIGHTER3": false, + "THIEF3": false, + "BLACK_BELT3": false, + "RED_MAGE3": false, + "WHITE_MAGE3": false, + "BLACK_MAGE3": false, + "FIGHTER4": false, + "THIEF4": false, + "BLACK_BELT4": false, + "RED_MAGE4": true, + "WHITE_MAGE4": true, + "BLACK_MAGE4": true, + "KNIGHT1": false, + "KNIGHT2": false, + "KNIGHT3": false, + "KNIGHT4": false, + "NINJA1": false, + "NINJA2": false, + "NINJA3": false, + "NINJA4": false, + "MASTER1": false, + "MASTER2": false, + "MASTER3": false, + "MASTER4": false, + "RED_WIZ1": false, + "RED_WIZ2": false, + "RED_WIZ3": false, + "RED_WIZ4": false, + "WHITE_WIZ1": false, + "WHITE_WIZ2": false, + "WHITE_WIZ3": false, + "WHITE_WIZ4": false, + "BLACK_WIZ1": false, + "BLACK_WIZ2": false, + "BLACK_WIZ3": false, + "BLACK_WIZ4": false, + "NONE_CLASS2": true, + "NONE_CLASS3": true, + "NONE_CLASS4": true, + "FORCED1": true, + "FORCED2": true, + "FORCED3": true, + "FORCED4": false, + "DraftFighter": false, + "DraftThief": false, + "DraftBlackBelt": false, + "DraftRedMage": false, + "DraftWhiteMage": false, + "DraftBlackMage": false, + "DraftKnight": false, + "DraftNinja": false, + "DraftMaster": false, + "DraftRedWiz": false, + "DraftWhiteWiz": false, + "DraftBlackWiz": false, + "TAVERN1": true, + "TAVERN2": true, + "TAVERN3": false, + "TAVERN4": true, + "TAVERN5": true, + "TAVERN6": true, + "WeaponPermissions": false, + "ArmorPermissions": false, + "RecruitmentMode": true, + "RecruitmentModeHireOnly": false, + "RecruitmentModeReplaceOnlyNone": true, + "ClampMinimumStatScale": false, + "ClampMinimumBossStatScale": false, + "ClampMinimumPriceScale": false, + "FiendShuffle": false, + "DisableTentSaving": false, + "DisableInnSaving": false, + "SaveGameWhenGameOver": false, + "SaveGameDWMode": false, + "ShuffleAstos": false, + "UnsafeAstos": false, + "RandomizeEnemizer": false, + "RandomizeFormationEnemizer": false, + "GenerateNewSpellbook": false, + "SpellcrafterMixSpells": false, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, + "AllSpellLevelsForKnightNinja": false, + "BuffHealingSpells": true, + "IntAffectsSpells": false, + "AddDamageTiles": false, + "DamageTilesCastles": false, + "DamageTilesDungeons": false, + "DamageTilesCaves": false, + "DamageTilesTowns": false, + "DamageTilesTof": false, + "DamageTilesQuantity": 1, + "FreeTail": false, + "HintsVillage": false, + "SpellcrafterRetainPermissions": false, + "RandomWeaponBonus": true, + "RandomArmorBonus": true, + "RandomWeaponBonusExcludeMasa": false, + "RandomWeaponBonusLow": 0, + "RandomWeaponBonusHigh": 5, + "RandomArmorBonusLow": 0, + "RandomArmorBonusHigh": 5, + "SeparateBossHPScaling": true, + "SeparateEnemyHPScaling": false, + "ClampBossHPScaling": false, + "ClampEnemyHpScaling": false, + "PoolSize": 2, + "EnablePoolParty": false, + "SafePoolParty": false, + "IncludePromClasses": false, + "EnableRandomPromotions": false, + "IncludeBaseClasses": false, + "RandomPromotionsSpoilers": false, + "RandomizeClassCasting": true, + "RandomizeClassKeyItems": false, + "RandomizeClassIncludeXpBonus": false, + "AlternateFiends": false, + "FinalFantasy2Fiends": false, + "FinalFantasy3Fiends": false, + "FinalFantasy4Fiends": false, + "FinalFantasy5Fiends": false, + "FinalFantasy6Fiends": false, + "FinalFantasy1BonusFiends": false, + "BlackOrbFiends": false, + "NoBossSkillScriptShuffle": false, + "MooglieWeaponBalance": false, + "GuaranteeCustomClassComposition": false, + "LegendaryWeaponShop": false, + "LegendaryArmorShop": false, + "LegendaryBlackShop": false, + "LegendaryWhiteShop": false, + "LegendaryItemShop": false, + "ExclusiveLegendaryWeaponShop": false, + "ExclusiveLegendaryArmorShop": false, + "ExclusiveLegendaryBlackShop": false, + "ExclusiveLegendaryWhiteShop": false, + "ExclusiveLegendaryItemShop": false, + "RandomizeClassMode": 1, + "RandomizeClassMaxBonus": 1, + "RandomizeClassMaxMalus": 0, + "EarlierHighTierMagic": false, + "ChangeMaxMP": false, + "RedMageMaxMP": 9, + "WhiteMageMaxMP": 9, + "BlackMageMaxMP": 9, + "KnightMaxMP": 4, + "NinjaMaxMP": 4, + "Knightlvl4": true, + "PinkMage": false, + "BlackKnight": true, + "BlackKnightKeep": false, + "WhiteNinja": true, + "WhiteNinjaKeep": true, + "MpGainOnMaxGainMode": 0, + "LockMode": 3, + "MDefMode": 0, + "FormationShuffleMode": 1, + "RandomizeTreasure": 0, + "OpenChestsInOrder": false, + "SetRNG": false, + "WorldWealth": 1, + "DeepDungeonGenerator": 0, + "EvadeCap": 3, + "AllowUnsafeStartArea": false, + "IncreaseDarkPenalty": true, + "IncreaseRegeneration": false, + "PoisonMode": 6, + "PoisonSetDamageValue": 3, + "TouchIncludeBosses": true, + "Lockpicking": true, + "ReducedLuck": false, + "LockpickingLevelRequirement": 22, + "WhiteMageHarmEveryone": true, + "ProcgenEarth": false, + "LoosePlacementMode": 0 + } } diff --git a/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json b/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json index 787145318..b34ce4d46 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json @@ -1,532 +1,534 @@ { "Name": "Winter Tournament 2025 Quarterfinals", - "Flags": { - "StartingEquipmentMasamune": false, - "StartingEquipmentKatana": false, - "StartingEquipmentHealStaff": false, - "StartingEquipmentZeusGauntlet": false, - "StartingEquipmentWhiteShirt": false, - "StartingEquipmentRibbon": false, - "StartingEquipmentDragonslayer": false, - "StartingEquipmentLegendKit": false, - "StartingEquipmentRandomEndgameWeapon": false, - "StartingEquipmentRandomAoe": false, - "StartingEquipmentRandomCasterItem": false, - "StartingEquipmentGrandpasSecretStash": false, - "StartingEquipmentOneItem": false, - "StartingEquipmentRandomCrap": false, - "StartingEquipmentStarterPack": false, - "StartingEquipmentRandomTypeWeapon": false, - "StartingEquipmentRemoveFromPool": false, - "StartingEquipmentNoDuplicates": false, - "ReversedFloors": false, - "BuffTier1DamageSpells": true, - "NoEmptyScripts": false, - "LaterLoose": false, - "MermaidPrison": true, - "GuaranteedDefenseItem": 3, - "GuaranteedPowerItem": 0, - "ScriptMultiplier": 1, - "TouchMultiplier": 2, - "TouchPool": 1, - "TouchMode": 0, - "RibbonMode": 0, - "Archipelago": false, - "ArchipelagoGold": false, - "ArchipelagoConsumables": false, - "ArchipelagoShards": false, - "ArchipelagoEquipment": 0, - "ItemMagicMode": 0, - "ItemMagicPool": 0, - "MagisizeWeapons": false, - "DisableMinimap": false, - "LooseItemsForwardPlacement": false, - "LooseItemsSpreadPlacement": false, - "LooseItemsNpcBalance": false, - "AllowUnsafePlacement": true, - "ShipCanalBeforeFloater": false, - "ExpChestConversionMin": 10, - "ExpChestConversionMax": 10, - "ExpChestMinReward": 3000, - "ExpChestMaxReward": 3000, - "SpellNameMadness": 0, - "ExtConsumableSet": 0, - "EnableSoftInBattle": true, - "EnableLifeInBattle": 0, - "NormalShopsHaveExtConsumables": false, - "LegendaryShopHasExtConsumables": false, - "ExtConsumableTreasureStackSize": 0, - "ExtStartingItemSet": 0, - "ExtConsumableChests": 0, - "OwMapExchange": 0, - "OwShuffledAccess": false, - "OwUnsafeStart": false, - "OwRandomPregen": false, - "RelocateChests": false, - "RelocateChestsTrapIndicator": false, - "ShuffleChimeAccess": true, - "ShuffleChimeIncludeTowns": false, - "GameMode": 0, - "MapGenSeed": 0, - "ReplacementMap": null, - "ResourcePack": null, - "ShopKillMode_Weapons": 0, - "ShopKillMode_Armor": 0, - "ShopKillMode_Item": 0, - "ShopKillMode_Black": 0, - "ShopKillMode_White": 0, - "ShopKillFactor_Weapons": 0, - "ShopKillFactor_Armor": 0, - "ShopKillFactor_Item": 0, - "ShopKillFactor_Black": 0, - "ShopKillFactor_White": 0, - "ShopKillExcludeConeria_Weapons": false, - "ShopKillExcludeConeria_Armor": false, - "ShopKillExcludeConeria_Item": false, - "ShopKillExcludeConeria_Black": false, - "ShopKillExcludeConeria_White": false, - "ExcludeGoldFromScaling": false, - "CheapVendorItem": false, - "StartingLevel": 0, - "TransmooglifierVariance": 0, - "MaxLevelLow": 50, - "MaxLevelHigh": 50, - "Spoilers": false, - "TournamentSafe": true, - "BlindSeed": false, - "Shops": true, - "Treasures": true, - "ChestsKeyItems": true, - "NPCItems": true, - "NPCFetchItems": true, - "RandomWares": false, - "RandomWaresIncludesSpecialGear": false, - "RandomLoot": false, - "ShardHunt": true, - "ShardCount": 7, - "OrbsRequiredCount": 4, - "OrbsRequiredMode": 0, - "OrbsRequiredSpoilers": false, - "TransformFinalFormation": 0, - "ChaosRush": false, - "ToFRMode": 1, - "FiendsRefights": 0, - "ExitToFR": true, - "ChaosFloorEncounters": false, - "MagicShops": false, - "MagicShopLocs": false, - "MagicShopLocationPairs": false, - "MagicLevels": true, - "MagicPermissions": false, - "Weaponizer": false, - "WeaponizerNamesUseQualityOnly": false, - "WeaponizerCommonWeaponsHavePowers": false, - "ArmorCrafter": false, - "MagicLevelsTiered": false, - "MagicLevelsMixed": false, - "MagicAutohitThreshold": 0, - "Rng": true, - "FixMissingBattleRngEntry": false, - "EncounterPrng": false, - "UnrunnableShuffle": true, - "UnrunnablesLow": 0, - "UnrunnablesHigh": 0, - "EnemyFormationsSurprise": true, - "UnrunnablesStrikeFirstAndSurprise": false, - "EnemyTrapTiles": 3, - "TCFormations": 2, - "TCBetterTreasure": 0, - "TCKeyItems": 2, - "TCShards": 2, - "TCExcludeCommons": false, - "TCChestCount": 0, - "TCProtectIncentives": false, - "TCMasaGuardian": false, - "TrappedChaos": false, - "TCIndicator": true, - "SwolePirates": false, - "ShuffleScriptsEnemies": true, - "RemoveBossScripts": false, - "ShuffleScriptsBosses": false, - "ShuffleSkillsSpellsEnemies": true, - "ShuffleSkillsSpellsBosses": false, - "NoConsecutiveNukes": false, - "TranceHasStatusElement": true, - "EnemySkillsSpellsTiered": false, - "AllowUnsafePirates": false, - "AllowUnsafeMelmond": false, - "WarMECHMode": 1, - "OrdealsPillars": true, - "ShuffleLavaTiles": false, - "SkyCastle4FMazeMode": 0, - "TitansTrove": true, - "LefeinSuperStore": true, - "LefeinShops": true, - "RandomVampAttack": false, - "RandomVampAttackIncludesConeria": false, - "FightBahamut": false, - "SwoleBahamut": false, - "SwoleAstos": false, - "ConfusedOldMen": false, - "GaiaShortcut": true, - "DamageTileLow": 1, - "DamageTileHigh": 1, - "OWDamageTiles": false, - "DamageTilesKill": false, - "ArmorResistsDamageTileDamage": false, - "MoveGaiaItemShop": true, - "ShufflePravokaShops": false, - "FlipDungeons": false, - "VerticallyFlipDungeons": false, - "SpookyFlag": false, - "DraculasFlag": false, - "MapOpenProgression": true, - "MapOpenProgressionDocks": true, - "Entrances": false, - "Towns": false, - "IncludeConeria": false, - "Floors": false, - "AllowDeepCastles": false, - "AllowDeepTowns": false, - "MapOpenProgressionExtended": true, - "MapAirshipDock": true, - "MapBahamutCardiaDock": true, - "MapLefeinRiver": true, - "MapBridgeLefein": true, - "MapRiverToMelmond": true, - "MapGaiaMountainPass": true, - "MapHighwayToOrdeals": true, - "MapDragonsHoard": false, - "MapHallOfDragons": false, - "EntrancesIncludesDeadEnds": false, - "EntrancesMixedWithTowns": false, - "IncentivizeFreeNPCs": true, - "IncentivizeFetchNPCs": true, - "IncentivizeTail": true, - "IncentivizeMainItems": true, - "IncentivizeFetchItems": true, - "IncentivizeCanoeItem": true, - "IncentivizeAirship": true, - "IncentivizeShipAndCanal": true, - "IncentivizeBridgeItem": false, - "IncentivizeMarsh": false, - "IncentivizeEarth": true, - "IncentivizeVolcano": true, - "IncentivizeIceCave": false, - "IncentivizeOrdeals": true, - "IncentivizeSeaShrine": true, - "IncentivizeConeria": true, - "IncentivizeMarshKeyLocked": false, - "IncentivizeSkyPalace": true, - "IncentivizeTitansTrove": true, - "IncentivizeCardia": true, - "IceCaveIncentivePlacementType": 0, - "OrdealsIncentivePlacementType": 1, - "MarshIncentivePlacementType": 0, - "TitansIncentivePlacementType": 1, - "EarthIncentivePlacementType": 3, - "VolcanoIncentivePlacementType": 2, - "SeaShrineIncentivePlacementType": 3, - "SkyPalaceIncentivePlacementType": 3, - "CorneriaIncentivePlacementType": 0, - "MarshLockedIncentivePlacementType": 0, - "CardiaIncentivePlacementType": 1, - "BetterTrapChests": false, - "IncentivizeMasamune": false, - "IncentivizeKatana": false, - "IncentivizeXcalber": true, - "IncentivizeVorpal": false, - "IncentivizeOpal": false, - "IncentivizeRibbon": false, - "IncentivizeDefCastArmor": false, - "IncentivizeOffCastArmor": false, - "IncentivizeOtherCastArmor": true, - "IncentivizePowerRod": false, - "IncentivizeDefCastWeapon": true, - "IncentivizeOffCastWeapon": false, - "IncentivizeOtherCastWeapon": false, - "LooseExcludePlacedDungeons": false, - "EarlyKing": true, - "EarlySarda": true, - "EarlySage": true, - "EarlyOrdeals": true, - "ShuffleObjectiveNPCs": false, - "OnlyRequireGameIsBeatable": false, - "FreeBridge": true, - "FreeShip": false, - "FreeAirship": false, - "FreeLute": false, - "FreeRod": false, - "EnableCritNumberDisplay": true, - "FreeCanal": false, - "FreeCanoe": false, - "EasyMode": false, - "HousesFillHp": true, - "SpeedHacks": true, - "NoPartyShuffle": true, - "Dash": true, - "SpeedBoat": true, - "AirBoat": true, - "BuyTen": true, - "IdentifyTreasures": true, - "ShopInfo": true, - "ChestInfo": true, - "IncentiveChestItemsFanfare": true, - "WaitWhenUnrunnable": true, - "ImprovedClinic": false, - "Etherizer": false, - "HouseMPRestoration": true, - "WeaponStats": true, - "BBCritRate": false, - "WeaponCritRate": true, - "WeaponBonuses": true, - "ThiefAgilityBuff": 1, - "SkyWarriorSpoilerBats": 1, - "SpoilerBatsDontCheckOrbs": true, - "MoveToFBats": false, - "WeaponTypeBonusValue": 42, - "ChanceToRun": 1, - "SpellBugs": true, - "BlackBeltAbsorb": true, - "NPCSwatter": true, - "BattleMagicMenuWrapAround": true, - "MagicMenuSpellReordering": true, - "InventoryAutosort": true, - "RepeatedHealPotionUse": false, - "AutoRetargeting": true, - "EnemyStatusAttackBug": true, - "ImproveTurnOrderRandomization": true, - "FixHitChanceCap": true, - "MelmondClinic": false, - "DDProgressiveTilesets": false, - "DDFiendOrbs": false, - "TailBahamutMode": 0, - "StartingGold": 3, - "IncludeMorale": false, - "DeadsGainXP": false, - "NonesGainXP": false, - "NoTail": false, - "NoFloater": false, - "GuaranteedMasamune": false, - "SendMasamuneHome": false, - "MoreConsumableChests": 0, - "NoMasamune": false, - "NoXcalber": false, - "ClassAsNpcFiends": false, - "ClassAsNpcKeyNPC": false, - "ClassAsNpcCount": 6, - "ClassAsNpcDuplicate": false, - "ClassAsNpcForcedFiends": false, - "ClassAsNpcPromotion": false, - "BossScaleStatsLow": 130, - "BossScaleStatsHigh": 200, - "BossScaleHpLow": 160, - "BossScaleHpHigh": 200, - "EnemyScaleStatsLow": 90, - "EnemyScaleStatsHigh": 160, - "EnemyScaleHpLow": 50, - "EnemyScaleHpHigh": 150, - "PriceScaleFactorLow": 50, - "PriceScaleFactorHigh": 200, - "ExpMultiplier": 2.5, - "ExpBonus": 150, - "ExpMultiplierFighter": 1.1, - "ExpMultiplierThief": 1.1, - "ExpMultiplierBlackBelt": 1, - "ExpMultiplierRedMage": 1, - "ExpMultiplierWhiteMage": 1, - "ExpMultiplierBlackMage": 1, - "EncounterRate": 12, - "DungeonEncounterRate": 15, - "ProgressiveScaleMode": 11, - "StartingItemSet": 4, - "ConsumableTreasureStackSize": 2, - "FIGHTER1": true, - "THIEF1": true, - "BLACK_BELT1": true, - "RED_MAGE1": false, - "WHITE_MAGE1": false, - "BLACK_MAGE1": false, - "FIGHTER2": true, - "THIEF2": true, - "BLACK_BELT2": false, - "RED_MAGE2": true, - "WHITE_MAGE2": true, - "BLACK_MAGE2": true, - "FIGHTER3": false, - "THIEF3": false, - "BLACK_BELT3": false, - "RED_MAGE3": false, - "WHITE_MAGE3": false, - "BLACK_MAGE3": false, - "FIGHTER4": false, - "THIEF4": false, - "BLACK_BELT4": false, - "RED_MAGE4": true, - "WHITE_MAGE4": true, - "BLACK_MAGE4": true, - "KNIGHT1": false, - "KNIGHT2": false, - "KNIGHT3": false, - "KNIGHT4": false, - "NINJA1": false, - "NINJA2": false, - "NINJA3": false, - "NINJA4": false, - "MASTER1": false, - "MASTER2": false, - "MASTER3": false, - "MASTER4": false, - "RED_WIZ1": false, - "RED_WIZ2": false, - "RED_WIZ3": false, - "RED_WIZ4": false, - "WHITE_WIZ1": false, - "WHITE_WIZ2": false, - "WHITE_WIZ3": false, - "WHITE_WIZ4": false, - "BLACK_WIZ1": false, - "BLACK_WIZ2": false, - "BLACK_WIZ3": false, - "BLACK_WIZ4": false, - "NONE_CLASS2": true, - "NONE_CLASS3": true, - "NONE_CLASS4": true, - "FORCED1": true, - "FORCED2": true, - "FORCED3": true, - "FORCED4": false, - "DraftFighter": false, - "DraftThief": false, - "DraftBlackBelt": false, - "DraftRedMage": false, - "DraftWhiteMage": false, - "DraftBlackMage": false, - "DraftKnight": false, - "DraftNinja": false, - "DraftMaster": false, - "DraftRedWiz": false, - "DraftWhiteWiz": false, - "DraftBlackWiz": false, - "TAVERN1": true, - "TAVERN2": true, - "TAVERN3": false, - "TAVERN4": true, - "TAVERN5": true, - "TAVERN6": true, - "WeaponPermissions": false, - "ArmorPermissions": false, - "RecruitmentMode": true, - "RecruitmentModeHireOnly": false, - "RecruitmentModeReplaceOnlyNone": true, - "ClampMinimumStatScale": false, - "ClampMinimumBossStatScale": false, - "ClampMinimumPriceScale": false, - "EFGWaterfall": false, - "FiendShuffle": false, - "DisableTentSaving": false, - "DisableInnSaving": false, - "SaveGameWhenGameOver": false, - "SaveGameDWMode": false, - "ShuffleAstos": false, - "UnsafeAstos": false, - "RandomizeEnemizer": false, - "RandomizeFormationEnemizer": false, - "GenerateNewSpellbook": false, - "SpellcrafterMixSpells": false, - "ThiefHitRate": true, - "AllSpellLevelsForKnightNinja": false, - "BuffHealingSpells": true, - "IntAffectsSpells": false, - "AddDamageTiles": false, - "DamageTilesCastles": false, - "DamageTilesDungeons": false, - "DamageTilesCaves": false, - "DamageTilesTowns": false, - "DamageTilesTof": false, - "DamageTilesQuantity": 1, - "FreeTail": false, - "HintsVillage": false, - "SpellcrafterRetainPermissions": false, - "RandomWeaponBonus": true, - "RandomArmorBonus": true, - "RandomWeaponBonusExcludeMasa": false, - "RandomWeaponBonusLow": 0, - "RandomWeaponBonusHigh": 5, - "RandomArmorBonusLow": 0, - "RandomArmorBonusHigh": 5, - "SeparateBossHPScaling": true, - "SeparateEnemyHPScaling": false, - "ClampBossHPScaling": false, - "ClampEnemyHpScaling": false, - "PoolSize": 2, - "EnablePoolParty": false, - "SafePoolParty": false, - "IncludePromClasses": false, - "EnableRandomPromotions": false, - "IncludeBaseClasses": false, - "RandomPromotionsSpoilers": false, - "RandomizeClassCasting": true, - "RandomizeClassKeyItems": false, - "RandomizeClassIncludeXpBonus": false, - "AlternateFiends": false, - "FinalFantasy2Fiends": false, - "FinalFantasy3Fiends": false, - "FinalFantasy4Fiends": false, - "FinalFantasy5Fiends": false, - "FinalFantasy6Fiends": false, - "FinalFantasy1BonusFiends": false, - "BlackOrbFiends": false, - "NoBossSkillScriptShuffle": false, - "MooglieWeaponBalance": false, - "GuaranteeCustomClassComposition": false, - "LegendaryWeaponShop": false, - "LegendaryArmorShop": false, - "LegendaryBlackShop": false, - "LegendaryWhiteShop": false, - "LegendaryItemShop": false, - "ExclusiveLegendaryWeaponShop": false, - "ExclusiveLegendaryArmorShop": false, - "ExclusiveLegendaryBlackShop": false, - "ExclusiveLegendaryWhiteShop": false, - "ExclusiveLegendaryItemShop": false, - "RandomizeClassMode": 1, - "RandomizeClassMaxBonus": 1, - "RandomizeClassMaxMalus": 0, - "EarlierHighTierMagic": false, - "ChangeMaxMP": false, - "RedMageMaxMP": 9, - "WhiteMageMaxMP": 9, - "BlackMageMaxMP": 9, - "KnightMaxMP": 4, - "NinjaMaxMP": 4, - "Knightlvl4": true, - "PinkMage": false, - "BlackKnight": true, - "BlackKnightKeep": false, - "WhiteNinja": true, - "WhiteNinjaKeep": true, - "MpGainOnMaxGainMode": 0, - "LockMode": 3, - "MDefMode": 0, - "FormationShuffleMode": 1, - "RandomizeTreasure": 0, - "OpenChestsInOrder": false, - "SetRNG": false, - "WorldWealth": 1, - "DeepDungeonGenerator": 0, - "EvadeCap": 3, - "AllowUnsafeStartArea": false, - "IncreaseDarkPenalty": true, - "IncreaseRegeneration": false, - "PoisonMode": 6, - "PoisonSetDamageValue": 3, - "TouchIncludeBosses": true, - "Lockpicking": true, - "ReducedLuck": false, - "LockpickingLevelRequirement": 22, - "WhiteMageHarmEveryone": true, - "ProcgenEarth": false, - "LoosePlacementMode": 0 - } + "Flags": { + "StartingEquipmentMasamune": false, + "StartingEquipmentKatana": false, + "StartingEquipmentHealStaff": false, + "StartingEquipmentZeusGauntlet": false, + "StartingEquipmentWhiteShirt": false, + "StartingEquipmentRibbon": false, + "StartingEquipmentDragonslayer": false, + "StartingEquipmentLegendKit": false, + "StartingEquipmentRandomEndgameWeapon": false, + "StartingEquipmentRandomAoe": false, + "StartingEquipmentRandomCasterItem": false, + "StartingEquipmentGrandpasSecretStash": false, + "StartingEquipmentOneItem": false, + "StartingEquipmentRandomCrap": false, + "StartingEquipmentStarterPack": false, + "StartingEquipmentRandomTypeWeapon": false, + "StartingEquipmentRemoveFromPool": false, + "StartingEquipmentNoDuplicates": false, + "ReversedFloors": false, + "BuffTier1DamageSpells": true, + "NoEmptyScripts": false, + "LaterLoose": false, + "MermaidPrison": true, + "GuaranteedDefenseItem": 3, + "GuaranteedPowerItem": 0, + "ScriptMultiplier": 1, + "TouchMultiplier": 2, + "TouchPool": 1, + "TouchMode": 0, + "RibbonMode": 0, + "Archipelago": false, + "ArchipelagoGold": false, + "ArchipelagoConsumables": false, + "ArchipelagoShards": false, + "ArchipelagoEquipment": 0, + "ItemMagicMode": 0, + "ItemMagicPool": 0, + "MagisizeWeapons": false, + "DisableMinimap": false, + "LooseItemsForwardPlacement": false, + "LooseItemsSpreadPlacement": false, + "LooseItemsNpcBalance": false, + "AllowUnsafePlacement": true, + "ShipCanalBeforeFloater": false, + "ExpChestConversionMin": 10, + "ExpChestConversionMax": 10, + "ExpChestMinReward": 3000, + "ExpChestMaxReward": 3000, + "SpellNameMadness": 0, + "ExtConsumableSet": 0, + "EnableSoftInBattle": true, + "EnableLifeInBattle": 0, + "NormalShopsHaveExtConsumables": false, + "LegendaryShopHasExtConsumables": false, + "ExtConsumableTreasureStackSize": 0, + "ExtStartingItemSet": 0, + "ExtConsumableChests": 0, + "OwMapExchange": 0, + "OwShuffledAccess": false, + "OwUnsafeStart": false, + "OwRandomPregen": false, + "RelocateChests": false, + "RelocateChestsTrapIndicator": false, + "ShuffleChimeAccess": true, + "ShuffleChimeIncludeTowns": false, + "GameMode": 0, + "MapGenSeed": 0, + "ReplacementMap": null, + "ResourcePack": null, + "ShopKillMode_Weapons": 0, + "ShopKillMode_Armor": 0, + "ShopKillMode_Item": 0, + "ShopKillMode_Black": 0, + "ShopKillMode_White": 0, + "ShopKillFactor_Weapons": 0, + "ShopKillFactor_Armor": 0, + "ShopKillFactor_Item": 0, + "ShopKillFactor_Black": 0, + "ShopKillFactor_White": 0, + "ShopKillExcludeConeria_Weapons": false, + "ShopKillExcludeConeria_Armor": false, + "ShopKillExcludeConeria_Item": false, + "ShopKillExcludeConeria_Black": false, + "ShopKillExcludeConeria_White": false, + "ExcludeGoldFromScaling": false, + "CheapVendorItem": false, + "StartingLevel": 0, + "TransmooglifierVariance": 0, + "MaxLevelLow": 50, + "MaxLevelHigh": 50, + "Spoilers": false, + "TriState": false, + "TournamentSafe": true, + "BlindSeed": false, + "Shops": true, + "Treasures": true, + "ChestsKeyItems": true, + "NPCItems": true, + "NPCFetchItems": true, + "RandomWares": false, + "RandomWaresIncludesSpecialGear": false, + "RandomLoot": false, + "ShardHunt": true, + "ShardCount": 7, + "OrbsRequiredCount": 4, + "OrbsRequiredMode": 0, + "OrbsRequiredSpoilers": false, + "TransformFinalFormation": 0, + "ChaosRush": false, + "ToFRMode": 1, + "FiendsRefights": 0, + "ExitToFR": true, + "ChaosFloorEncounters": false, + "MagicShops": false, + "MagicShopLocs": false, + "MagicShopLocationPairs": false, + "MagicLevels": true, + "MagicPermissions": false, + "Weaponizer": false, + "WeaponizerNamesUseQualityOnly": false, + "WeaponizerCommonWeaponsHavePowers": false, + "ArmorCrafter": false, + "MagicLevelsTiered": false, + "MagicLevelsMixed": false, + "MagicAutohitThreshold": 0, + "Rng": true, + "FixMissingBattleRngEntry": false, + "EncounterPrng": false, + "UnrunnableShuffle": true, + "UnrunnablesLow": 0, + "UnrunnablesHigh": 0, + "EnemyFormationsSurprise": true, + "UnrunnablesStrikeFirstAndSurprise": false, + "EnemyTrapTiles": 3, + "TCFormations": 2, + "TCBetterTreasure": 0, + "TCKeyItems": 2, + "TCShards": 2, + "TCExcludeCommons": false, + "TCChestCount": 0, + "TCProtectIncentives": false, + "TCMasaGuardian": false, + "TrappedChaos": false, + "TCIndicator": true, + "SwolePirates": false, + "ShuffleScriptsEnemies": true, + "RemoveBossScripts": false, + "ShuffleScriptsBosses": false, + "ShuffleSkillsSpellsEnemies": true, + "ShuffleSkillsSpellsBosses": false, + "NoConsecutiveNukes": false, + "TranceHasStatusElement": true, + "EnemySkillsSpellsTiered": false, + "AllowUnsafePirates": false, + "AllowUnsafeMelmond": false, + "WarMECHMode": 1, + "OrdealsPillars": true, + "ShuffleLavaTiles": false, + "SkyCastle4FMazeMode": 0, + "TitansTrove": true, + "LefeinShortcut": false, + "LefeinSuperStore": true, + "LefeinShops": true, + "RandomVampAttack": false, + "RandomVampAttackIncludesConeria": false, + "FightBahamut": false, + "SwoleBahamut": false, + "SwoleAstos": false, + "ConfusedOldMen": false, + "GaiaShortcut": true, + "DamageTileLow": 1, + "DamageTileHigh": 1, + "OWDamageTiles": false, + "DamageTilesKill": false, + "ArmorResistsDamageTileDamage": false, + "MoveGaiaItemShop": true, + "ShufflePravokaShops": false, + "FlipDungeons": false, + "VerticallyFlipDungeons": false, + "SpookyFlag": false, + "DraculasFlag": false, + "MapOpenProgression": true, + "MapOpenProgressionDocks": true, + "Entrances": false, + "Towns": false, + "IncludeConeria": false, + "Floors": false, + "AllowDeepCastles": false, + "AllowDeepTowns": false, + "MapOpenProgressionExtended": true, + "MapAirshipDock": true, + "MapBahamutCardiaDock": true, + "MapLefeinRiver": true, + "MapBridgeLefein": true, + "MapRiverToMelmond": true, + "MapGaiaMountainPass": true, + "MapHighwayToOrdeals": true, + "MapDragonsHoard": false, + "MapHallOfDragons": false, + "EntrancesIncludesDeadEnds": false, + "EntrancesMixedWithTowns": false, + "IncentivizeFreeNPCs": true, + "IncentivizeFetchNPCs": true, + "IncentivizeTail": true, + "IncentivizeMainItems": true, + "IncentivizeFetchItems": true, + "IncentivizeCanoeItem": true, + "IncentivizeAirship": true, + "IncentivizeShipAndCanal": true, + "IncentivizeBridgeItem": false, + "IncentivizeMarsh": false, + "IncentivizeEarth": true, + "IncentivizeVolcano": true, + "IncentivizeIceCave": false, + "IncentivizeOrdeals": true, + "IncentivizeSeaShrine": true, + "IncentivizeConeria": true, + "IncentivizeMarshKeyLocked": false, + "IncentivizeSkyPalace": true, + "IncentivizeTitansTrove": true, + "IncentivizeCardia": true, + "IceCaveIncentivePlacementType": 0, + "OrdealsIncentivePlacementType": 1, + "MarshIncentivePlacementType": 0, + "TitansIncentivePlacementType": 1, + "EarthIncentivePlacementType": 3, + "VolcanoIncentivePlacementType": 2, + "SeaShrineIncentivePlacementType": 3, + "SkyPalaceIncentivePlacementType": 3, + "CorneriaIncentivePlacementType": 0, + "MarshLockedIncentivePlacementType": 0, + "CardiaIncentivePlacementType": 1, + "BetterTrapChests": false, + "IncentivizeMasamune": false, + "IncentivizeKatana": false, + "IncentivizeXcalber": true, + "IncentivizeVorpal": false, + "IncentivizeOpal": false, + "IncentivizeRibbon": false, + "IncentivizeDefCastArmor": false, + "IncentivizeOffCastArmor": false, + "IncentivizeOtherCastArmor": true, + "IncentivizePowerRod": false, + "IncentivizeDefCastWeapon": true, + "IncentivizeOffCastWeapon": false, + "IncentivizeOtherCastWeapon": false, + "LooseExcludePlacedDungeons": false, + "EarlyKing": true, + "EarlySarda": true, + "EarlySage": true, + "EarlyOrdeals": true, + "ShuffleObjectiveNPCs": false, + "OnlyRequireGameIsBeatable": false, + "FreeBridge": true, + "FreeShip": false, + "FreeAirship": false, + "FreeLute": false, + "FreeRod": false, + "EnableCritNumberDisplay": true, + "FreeCanal": false, + "FreeCanoe": false, + "EasyMode": false, + "HousesFillHp": true, + "SpeedHacks": true, + "NoPartyShuffle": true, + "Dash": true, + "SpeedBoat": true, + "AirBoat": true, + "BuyTen": true, + "IdentifyTreasures": true, + "ShopInfo": true, + "ChestInfo": true, + "IncentiveChestItemsFanfare": true, + "WaitWhenUnrunnable": true, + "ImprovedClinic": false, + "Etherizer": false, + "HouseMPRestoration": true, + "WeaponStats": true, + "BBCritRate": false, + "WeaponCritRate": true, + "WeaponBonuses": true, + "ThiefAgilityBuff": 1, + "SkyWarriorSpoilerBats": 1, + "SpoilerBatsDontCheckOrbs": true, + "MoveToFBats": false, + "WeaponTypeBonusValue": 42, + "ChanceToRun": 1, + "SpellBugs": true, + "BlackBeltAbsorb": true, + "NPCSwatter": true, + "BattleMagicMenuWrapAround": true, + "MagicMenuSpellReordering": true, + "InventoryAutosort": true, + "RepeatedHealPotionUse": false, + "AutoRetargeting": true, + "EnemyStatusAttackBug": true, + "ImproveTurnOrderRandomization": true, + "FixHitChanceCap": true, + "MelmondClinic": false, + "DDProgressiveTilesets": false, + "DDFiendOrbs": false, + "TailBahamutMode": 0, + "StartingGold": 3, + "IncludeMorale": false, + "DeadsGainXP": false, + "NonesGainXP": false, + "NoTail": false, + "NoFloater": false, + "GuaranteedMasamune": false, + "SendMasamuneHome": false, + "MoreConsumableChests": 0, + "NoMasamune": false, + "NoXcalber": false, + "ClassAsNpcFiends": false, + "ClassAsNpcKeyNPC": false, + "ClassAsNpcCount": 6, + "ClassAsNpcDuplicate": false, + "ClassAsNpcForcedFiends": false, + "ClassAsNpcPromotion": false, + "BossScaleStatsLow": 130, + "BossScaleStatsHigh": 200, + "BossScaleHpLow": 160, + "BossScaleHpHigh": 200, + "EnemyScaleStatsLow": 90, + "EnemyScaleStatsHigh": 160, + "EnemyScaleHpLow": 50, + "EnemyScaleHpHigh": 150, + "PriceScaleFactorLow": 50, + "PriceScaleFactorHigh": 200, + "ExpMultiplier": 2.5, + "ExpBonus": 150, + "ExpMultiplierFighter": 1.1, + "ExpMultiplierThief": 1.1, + "ExpMultiplierBlackBelt": 1, + "ExpMultiplierRedMage": 1, + "ExpMultiplierWhiteMage": 1, + "ExpMultiplierBlackMage": 1, + "EncounterRate": 12, + "DungeonEncounterRate": 15, + "ProgressiveScaleMode": 11, + "StartingItemSet": 4, + "ConsumableTreasureStackSize": 2, + "FIGHTER1": true, + "THIEF1": true, + "BLACK_BELT1": true, + "RED_MAGE1": false, + "WHITE_MAGE1": false, + "BLACK_MAGE1": false, + "FIGHTER2": true, + "THIEF2": true, + "BLACK_BELT2": false, + "RED_MAGE2": true, + "WHITE_MAGE2": true, + "BLACK_MAGE2": true, + "FIGHTER3": false, + "THIEF3": false, + "BLACK_BELT3": false, + "RED_MAGE3": false, + "WHITE_MAGE3": false, + "BLACK_MAGE3": false, + "FIGHTER4": false, + "THIEF4": false, + "BLACK_BELT4": false, + "RED_MAGE4": true, + "WHITE_MAGE4": true, + "BLACK_MAGE4": true, + "KNIGHT1": false, + "KNIGHT2": false, + "KNIGHT3": false, + "KNIGHT4": false, + "NINJA1": false, + "NINJA2": false, + "NINJA3": false, + "NINJA4": false, + "MASTER1": false, + "MASTER2": false, + "MASTER3": false, + "MASTER4": false, + "RED_WIZ1": false, + "RED_WIZ2": false, + "RED_WIZ3": false, + "RED_WIZ4": false, + "WHITE_WIZ1": false, + "WHITE_WIZ2": false, + "WHITE_WIZ3": false, + "WHITE_WIZ4": false, + "BLACK_WIZ1": false, + "BLACK_WIZ2": false, + "BLACK_WIZ3": false, + "BLACK_WIZ4": false, + "NONE_CLASS2": true, + "NONE_CLASS3": true, + "NONE_CLASS4": true, + "FORCED1": true, + "FORCED2": true, + "FORCED3": true, + "FORCED4": false, + "DraftFighter": false, + "DraftThief": false, + "DraftBlackBelt": false, + "DraftRedMage": false, + "DraftWhiteMage": false, + "DraftBlackMage": false, + "DraftKnight": false, + "DraftNinja": false, + "DraftMaster": false, + "DraftRedWiz": false, + "DraftWhiteWiz": false, + "DraftBlackWiz": false, + "TAVERN1": true, + "TAVERN2": true, + "TAVERN3": false, + "TAVERN4": true, + "TAVERN5": true, + "TAVERN6": true, + "WeaponPermissions": false, + "ArmorPermissions": false, + "RecruitmentMode": true, + "RecruitmentModeHireOnly": false, + "RecruitmentModeReplaceOnlyNone": true, + "ClampMinimumStatScale": false, + "ClampMinimumBossStatScale": false, + "ClampMinimumPriceScale": false, + "FiendShuffle": false, + "DisableTentSaving": false, + "DisableInnSaving": false, + "SaveGameWhenGameOver": false, + "SaveGameDWMode": false, + "ShuffleAstos": false, + "UnsafeAstos": false, + "RandomizeEnemizer": false, + "RandomizeFormationEnemizer": false, + "GenerateNewSpellbook": false, + "SpellcrafterMixSpells": false, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, + "AllSpellLevelsForKnightNinja": false, + "BuffHealingSpells": true, + "IntAffectsSpells": false, + "AddDamageTiles": false, + "DamageTilesCastles": false, + "DamageTilesDungeons": false, + "DamageTilesCaves": false, + "DamageTilesTowns": false, + "DamageTilesTof": false, + "DamageTilesQuantity": 1, + "FreeTail": false, + "HintsVillage": false, + "SpellcrafterRetainPermissions": false, + "RandomWeaponBonus": true, + "RandomArmorBonus": true, + "RandomWeaponBonusExcludeMasa": false, + "RandomWeaponBonusLow": 0, + "RandomWeaponBonusHigh": 5, + "RandomArmorBonusLow": 0, + "RandomArmorBonusHigh": 5, + "SeparateBossHPScaling": true, + "SeparateEnemyHPScaling": false, + "ClampBossHPScaling": false, + "ClampEnemyHpScaling": false, + "PoolSize": 2, + "EnablePoolParty": false, + "SafePoolParty": false, + "IncludePromClasses": false, + "EnableRandomPromotions": false, + "IncludeBaseClasses": false, + "RandomPromotionsSpoilers": false, + "RandomizeClassCasting": true, + "RandomizeClassKeyItems": false, + "RandomizeClassIncludeXpBonus": false, + "AlternateFiends": false, + "FinalFantasy2Fiends": false, + "FinalFantasy3Fiends": false, + "FinalFantasy4Fiends": false, + "FinalFantasy5Fiends": false, + "FinalFantasy6Fiends": false, + "FinalFantasy1BonusFiends": false, + "BlackOrbFiends": false, + "NoBossSkillScriptShuffle": false, + "MooglieWeaponBalance": false, + "GuaranteeCustomClassComposition": false, + "LegendaryWeaponShop": false, + "LegendaryArmorShop": false, + "LegendaryBlackShop": false, + "LegendaryWhiteShop": false, + "LegendaryItemShop": false, + "ExclusiveLegendaryWeaponShop": false, + "ExclusiveLegendaryArmorShop": false, + "ExclusiveLegendaryBlackShop": false, + "ExclusiveLegendaryWhiteShop": false, + "ExclusiveLegendaryItemShop": false, + "RandomizeClassMode": 1, + "RandomizeClassMaxBonus": 1, + "RandomizeClassMaxMalus": 0, + "EarlierHighTierMagic": false, + "ChangeMaxMP": false, + "RedMageMaxMP": 9, + "WhiteMageMaxMP": 9, + "BlackMageMaxMP": 9, + "KnightMaxMP": 4, + "NinjaMaxMP": 4, + "Knightlvl4": true, + "PinkMage": false, + "BlackKnight": true, + "BlackKnightKeep": false, + "WhiteNinja": true, + "WhiteNinjaKeep": true, + "MpGainOnMaxGainMode": 0, + "LockMode": 3, + "MDefMode": 0, + "FormationShuffleMode": 1, + "RandomizeTreasure": 0, + "OpenChestsInOrder": false, + "SetRNG": false, + "WorldWealth": 1, + "DeepDungeonGenerator": 0, + "EvadeCap": 3, + "AllowUnsafeStartArea": false, + "IncreaseDarkPenalty": true, + "IncreaseRegeneration": false, + "PoisonMode": 6, + "PoisonSetDamageValue": 3, + "TouchIncludeBosses": true, + "Lockpicking": true, + "ReducedLuck": false, + "LockpickingLevelRequirement": 22, + "WhiteMageHarmEveryone": true, + "ProcgenEarth": false, + "LoosePlacementMode": 0 + } } diff --git a/FF1Blazorizer/wwwroot/presets/wt2025quals.json b/FF1Blazorizer/wwwroot/presets/wt2025quals.json index a3989d4ef..937484467 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025quals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025quals.json @@ -1,532 +1,534 @@ { "Name": "Winter Tournament 2025 Qualifiers", - "Flags": { - "StartingEquipmentMasamune": false, - "StartingEquipmentKatana": false, - "StartingEquipmentHealStaff": false, - "StartingEquipmentZeusGauntlet": false, - "StartingEquipmentWhiteShirt": false, - "StartingEquipmentRibbon": false, - "StartingEquipmentDragonslayer": false, - "StartingEquipmentLegendKit": false, - "StartingEquipmentRandomEndgameWeapon": false, - "StartingEquipmentRandomAoe": false, - "StartingEquipmentRandomCasterItem": false, - "StartingEquipmentGrandpasSecretStash": false, - "StartingEquipmentOneItem": false, - "StartingEquipmentRandomCrap": false, - "StartingEquipmentStarterPack": false, - "StartingEquipmentRandomTypeWeapon": false, - "StartingEquipmentRemoveFromPool": false, - "StartingEquipmentNoDuplicates": false, - "ReversedFloors": false, - "BuffTier1DamageSpells": true, - "NoEmptyScripts": false, - "LaterLoose": false, - "MermaidPrison": true, - "GuaranteedDefenseItem": 3, - "GuaranteedPowerItem": 0, - "ScriptMultiplier": 1, - "TouchMultiplier": 2, - "TouchPool": 1, - "TouchMode": 0, - "RibbonMode": 0, - "Archipelago": false, - "ArchipelagoGold": false, - "ArchipelagoConsumables": false, - "ArchipelagoShards": false, - "ArchipelagoEquipment": 0, - "ItemMagicMode": 0, - "ItemMagicPool": 0, - "MagisizeWeapons": false, - "DisableMinimap": false, - "LooseItemsForwardPlacement": false, - "LooseItemsSpreadPlacement": false, - "LooseItemsNpcBalance": false, - "AllowUnsafePlacement": true, - "ShipCanalBeforeFloater": false, - "ExpChestConversionMin": 10, - "ExpChestConversionMax": 10, - "ExpChestMinReward": 3000, - "ExpChestMaxReward": 3000, - "SpellNameMadness": 0, - "ExtConsumableSet": 0, - "EnableSoftInBattle": true, - "EnableLifeInBattle": 0, - "NormalShopsHaveExtConsumables": false, - "LegendaryShopHasExtConsumables": false, - "ExtConsumableTreasureStackSize": 0, - "ExtStartingItemSet": 0, - "ExtConsumableChests": 0, - "OwMapExchange": 0, - "OwShuffledAccess": false, - "OwUnsafeStart": false, - "OwRandomPregen": false, - "RelocateChests": false, - "RelocateChestsTrapIndicator": false, - "ShuffleChimeAccess": true, - "ShuffleChimeIncludeTowns": false, - "GameMode": 0, - "MapGenSeed": 0, - "ReplacementMap": null, - "ResourcePack": null, - "ShopKillMode_Weapons": 0, - "ShopKillMode_Armor": 0, - "ShopKillMode_Item": 0, - "ShopKillMode_Black": 0, - "ShopKillMode_White": 0, - "ShopKillFactor_Weapons": 0, - "ShopKillFactor_Armor": 0, - "ShopKillFactor_Item": 0, - "ShopKillFactor_Black": 0, - "ShopKillFactor_White": 0, - "ShopKillExcludeConeria_Weapons": false, - "ShopKillExcludeConeria_Armor": false, - "ShopKillExcludeConeria_Item": false, - "ShopKillExcludeConeria_Black": false, - "ShopKillExcludeConeria_White": false, - "ExcludeGoldFromScaling": false, - "CheapVendorItem": false, - "StartingLevel": 0, - "TransmooglifierVariance": 0, - "MaxLevelLow": 50, - "MaxLevelHigh": 50, - "Spoilers": false, - "TournamentSafe": true, - "BlindSeed": false, - "Shops": true, - "Treasures": true, - "ChestsKeyItems": true, - "NPCItems": true, - "NPCFetchItems": true, - "RandomWares": false, - "RandomWaresIncludesSpecialGear": false, - "RandomLoot": false, - "ShardHunt": true, - "ShardCount": 2, - "OrbsRequiredCount": 4, - "OrbsRequiredMode": 0, - "OrbsRequiredSpoilers": false, - "TransformFinalFormation": 0, - "ChaosRush": false, - "ToFRMode": 1, - "FiendsRefights": 0, - "ExitToFR": true, - "ChaosFloorEncounters": false, - "MagicShops": false, - "MagicShopLocs": false, - "MagicShopLocationPairs": false, - "MagicLevels": true, - "MagicPermissions": false, - "Weaponizer": false, - "WeaponizerNamesUseQualityOnly": false, - "WeaponizerCommonWeaponsHavePowers": false, - "ArmorCrafter": false, - "MagicLevelsTiered": false, - "MagicLevelsMixed": false, - "MagicAutohitThreshold": 0, - "Rng": true, - "FixMissingBattleRngEntry": false, - "EncounterPrng": false, - "UnrunnableShuffle": true, - "UnrunnablesLow": 0, - "UnrunnablesHigh": 0, - "EnemyFormationsSurprise": true, - "UnrunnablesStrikeFirstAndSurprise": false, - "EnemyTrapTiles": 3, - "TCFormations": 2, - "TCBetterTreasure": 0, - "TCKeyItems": 2, - "TCShards": 2, - "TCExcludeCommons": false, - "TCChestCount": 0, - "TCProtectIncentives": false, - "TCMasaGuardian": false, - "TrappedChaos": false, - "TCIndicator": true, - "SwolePirates": false, - "ShuffleScriptsEnemies": true, - "RemoveBossScripts": false, - "ShuffleScriptsBosses": false, - "ShuffleSkillsSpellsEnemies": true, - "ShuffleSkillsSpellsBosses": false, - "NoConsecutiveNukes": false, - "TranceHasStatusElement": true, - "EnemySkillsSpellsTiered": false, - "AllowUnsafePirates": false, - "AllowUnsafeMelmond": false, - "WarMECHMode": 1, - "OrdealsPillars": true, - "ShuffleLavaTiles": false, - "SkyCastle4FMazeMode": 0, - "TitansTrove": true, - "LefeinSuperStore": true, - "LefeinShops": true, - "RandomVampAttack": false, - "RandomVampAttackIncludesConeria": false, - "FightBahamut": false, - "SwoleBahamut": false, - "SwoleAstos": false, - "ConfusedOldMen": false, - "GaiaShortcut": true, - "DamageTileLow": 1, - "DamageTileHigh": 1, - "OWDamageTiles": false, - "DamageTilesKill": false, - "ArmorResistsDamageTileDamage": false, - "MoveGaiaItemShop": true, - "ShufflePravokaShops": false, - "FlipDungeons": false, - "VerticallyFlipDungeons": false, - "SpookyFlag": false, - "DraculasFlag": false, - "MapOpenProgression": true, - "MapOpenProgressionDocks": false, - "Entrances": false, - "Towns": false, - "IncludeConeria": false, - "Floors": false, - "AllowDeepCastles": false, - "AllowDeepTowns": false, - "MapOpenProgressionExtended": true, - "MapAirshipDock": false, - "MapBahamutCardiaDock": false, - "MapLefeinRiver": false, - "MapBridgeLefein": false, - "MapRiverToMelmond": false, - "MapGaiaMountainPass": false, - "MapHighwayToOrdeals": false, - "MapDragonsHoard": false, - "MapHallOfDragons": false, - "EntrancesIncludesDeadEnds": false, - "EntrancesMixedWithTowns": false, - "IncentivizeFreeNPCs": true, - "IncentivizeFetchNPCs": true, - "IncentivizeTail": true, - "IncentivizeMainItems": true, - "IncentivizeFetchItems": true, - "IncentivizeCanoeItem": true, - "IncentivizeAirship": true, - "IncentivizeShipAndCanal": true, - "IncentivizeBridgeItem": false, - "IncentivizeMarsh": false, - "IncentivizeEarth": true, - "IncentivizeVolcano": true, - "IncentivizeIceCave": false, - "IncentivizeOrdeals": true, - "IncentivizeSeaShrine": true, - "IncentivizeConeria": true, - "IncentivizeMarshKeyLocked": false, - "IncentivizeSkyPalace": true, - "IncentivizeTitansTrove": true, - "IncentivizeCardia": true, - "IceCaveIncentivePlacementType": 0, - "OrdealsIncentivePlacementType": 1, - "MarshIncentivePlacementType": 0, - "TitansIncentivePlacementType": 1, - "EarthIncentivePlacementType": 3, - "VolcanoIncentivePlacementType": 2, - "SeaShrineIncentivePlacementType": 3, - "SkyPalaceIncentivePlacementType": 3, - "CorneriaIncentivePlacementType": 0, - "MarshLockedIncentivePlacementType": 0, - "CardiaIncentivePlacementType": 1, - "BetterTrapChests": false, - "IncentivizeMasamune": false, - "IncentivizeKatana": false, - "IncentivizeXcalber": true, - "IncentivizeVorpal": false, - "IncentivizeOpal": false, - "IncentivizeRibbon": false, - "IncentivizeDefCastArmor": false, - "IncentivizeOffCastArmor": false, - "IncentivizeOtherCastArmor": true, - "IncentivizePowerRod": false, - "IncentivizeDefCastWeapon": true, - "IncentivizeOffCastWeapon": false, - "IncentivizeOtherCastWeapon": false, - "LooseExcludePlacedDungeons": false, - "EarlyKing": true, - "EarlySarda": true, - "EarlySage": true, - "EarlyOrdeals": true, - "ShuffleObjectiveNPCs": false, - "OnlyRequireGameIsBeatable": false, - "FreeBridge": true, - "FreeShip": false, - "FreeAirship": false, - "FreeLute": false, - "FreeRod": false, - "EnableCritNumberDisplay": true, - "FreeCanal": false, - "FreeCanoe": false, - "EasyMode": false, - "HousesFillHp": true, - "SpeedHacks": true, - "NoPartyShuffle": true, - "Dash": true, - "SpeedBoat": true, - "AirBoat": true, - "BuyTen": true, - "IdentifyTreasures": true, - "ShopInfo": true, - "ChestInfo": true, - "IncentiveChestItemsFanfare": true, - "WaitWhenUnrunnable": true, - "ImprovedClinic": false, - "Etherizer": false, - "HouseMPRestoration": true, - "WeaponStats": true, - "BBCritRate": false, - "WeaponCritRate": true, - "WeaponBonuses": true, - "ThiefAgilityBuff": 1, - "SkyWarriorSpoilerBats": 1, - "SpoilerBatsDontCheckOrbs": true, - "MoveToFBats": false, - "WeaponTypeBonusValue": 42, - "ChanceToRun": 1, - "SpellBugs": true, - "BlackBeltAbsorb": true, - "NPCSwatter": true, - "BattleMagicMenuWrapAround": true, - "MagicMenuSpellReordering": true, - "InventoryAutosort": true, - "RepeatedHealPotionUse": false, - "AutoRetargeting": true, - "EnemyStatusAttackBug": true, - "ImproveTurnOrderRandomization": true, - "FixHitChanceCap": true, - "MelmondClinic": false, - "DDProgressiveTilesets": false, - "DDFiendOrbs": false, - "TailBahamutMode": 0, - "StartingGold": 3, - "IncludeMorale": false, - "DeadsGainXP": false, - "NonesGainXP": false, - "NoTail": false, - "NoFloater": false, - "GuaranteedMasamune": false, - "SendMasamuneHome": false, - "MoreConsumableChests": 0, - "NoMasamune": false, - "NoXcalber": false, - "ClassAsNpcFiends": false, - "ClassAsNpcKeyNPC": false, - "ClassAsNpcCount": 6, - "ClassAsNpcDuplicate": false, - "ClassAsNpcForcedFiends": false, - "ClassAsNpcPromotion": false, - "BossScaleStatsLow": 120, - "BossScaleStatsHigh": 160, - "BossScaleHpLow": 150, - "BossScaleHpHigh": 150, - "EnemyScaleStatsLow": 80, - "EnemyScaleStatsHigh": 120, - "EnemyScaleHpLow": 50, - "EnemyScaleHpHigh": 150, - "PriceScaleFactorLow": 50, - "PriceScaleFactorHigh": 200, - "ExpMultiplier": 2.5, - "ExpBonus": 150, - "ExpMultiplierFighter": 1.1, - "ExpMultiplierThief": 1.1, - "ExpMultiplierBlackBelt": 1, - "ExpMultiplierRedMage": 1, - "ExpMultiplierWhiteMage": 1, - "ExpMultiplierBlackMage": 1, - "EncounterRate": 12, - "DungeonEncounterRate": 15, - "ProgressiveScaleMode": 11, - "StartingItemSet": 4, - "ConsumableTreasureStackSize": 2, - "FIGHTER1": true, - "THIEF1": true, - "BLACK_BELT1": true, - "RED_MAGE1": false, - "WHITE_MAGE1": false, - "BLACK_MAGE1": false, - "FIGHTER2": true, - "THIEF2": true, - "BLACK_BELT2": false, - "RED_MAGE2": true, - "WHITE_MAGE2": true, - "BLACK_MAGE2": true, - "FIGHTER3": false, - "THIEF3": false, - "BLACK_BELT3": false, - "RED_MAGE3": false, - "WHITE_MAGE3": false, - "BLACK_MAGE3": false, - "FIGHTER4": false, - "THIEF4": false, - "BLACK_BELT4": false, - "RED_MAGE4": true, - "WHITE_MAGE4": true, - "BLACK_MAGE4": true, - "KNIGHT1": false, - "KNIGHT2": false, - "KNIGHT3": false, - "KNIGHT4": false, - "NINJA1": false, - "NINJA2": false, - "NINJA3": false, - "NINJA4": false, - "MASTER1": false, - "MASTER2": false, - "MASTER3": false, - "MASTER4": false, - "RED_WIZ1": false, - "RED_WIZ2": false, - "RED_WIZ3": false, - "RED_WIZ4": false, - "WHITE_WIZ1": false, - "WHITE_WIZ2": false, - "WHITE_WIZ3": false, - "WHITE_WIZ4": false, - "BLACK_WIZ1": false, - "BLACK_WIZ2": false, - "BLACK_WIZ3": false, - "BLACK_WIZ4": false, - "NONE_CLASS2": true, - "NONE_CLASS3": true, - "NONE_CLASS4": true, - "FORCED1": true, - "FORCED2": true, - "FORCED3": true, - "FORCED4": false, - "DraftFighter": false, - "DraftThief": false, - "DraftBlackBelt": false, - "DraftRedMage": false, - "DraftWhiteMage": false, - "DraftBlackMage": false, - "DraftKnight": false, - "DraftNinja": false, - "DraftMaster": false, - "DraftRedWiz": false, - "DraftWhiteWiz": false, - "DraftBlackWiz": false, - "TAVERN1": true, - "TAVERN2": true, - "TAVERN3": false, - "TAVERN4": true, - "TAVERN5": true, - "TAVERN6": true, - "WeaponPermissions": false, - "ArmorPermissions": false, - "RecruitmentMode": true, - "RecruitmentModeHireOnly": false, - "RecruitmentModeReplaceOnlyNone": true, - "ClampMinimumStatScale": false, - "ClampMinimumBossStatScale": false, - "ClampMinimumPriceScale": false, - "EFGWaterfall": false, - "FiendShuffle": false, - "DisableTentSaving": false, - "DisableInnSaving": false, - "SaveGameWhenGameOver": false, - "SaveGameDWMode": false, - "ShuffleAstos": false, - "UnsafeAstos": false, - "RandomizeEnemizer": false, - "RandomizeFormationEnemizer": false, - "GenerateNewSpellbook": false, - "SpellcrafterMixSpells": false, - "ThiefHitRate": true, - "AllSpellLevelsForKnightNinja": false, - "BuffHealingSpells": true, - "IntAffectsSpells": false, - "AddDamageTiles": false, - "DamageTilesCastles": false, - "DamageTilesDungeons": false, - "DamageTilesCaves": false, - "DamageTilesTowns": false, - "DamageTilesTof": false, - "DamageTilesQuantity": 1, - "FreeTail": false, - "HintsVillage": false, - "SpellcrafterRetainPermissions": false, - "RandomWeaponBonus": true, - "RandomArmorBonus": true, - "RandomWeaponBonusExcludeMasa": false, - "RandomWeaponBonusLow": 4, - "RandomWeaponBonusHigh": 5, - "RandomArmorBonusLow": 4, - "RandomArmorBonusHigh": 5, - "SeparateBossHPScaling": true, - "SeparateEnemyHPScaling": false, - "ClampBossHPScaling": false, - "ClampEnemyHpScaling": false, - "PoolSize": 2, - "EnablePoolParty": false, - "SafePoolParty": false, - "IncludePromClasses": false, - "EnableRandomPromotions": false, - "IncludeBaseClasses": false, - "RandomPromotionsSpoilers": false, - "RandomizeClassCasting": true, - "RandomizeClassKeyItems": false, - "RandomizeClassIncludeXpBonus": false, - "AlternateFiends": false, - "FinalFantasy2Fiends": false, - "FinalFantasy3Fiends": false, - "FinalFantasy4Fiends": false, - "FinalFantasy5Fiends": false, - "FinalFantasy6Fiends": false, - "FinalFantasy1BonusFiends": false, - "BlackOrbFiends": false, - "NoBossSkillScriptShuffle": false, - "MooglieWeaponBalance": false, - "GuaranteeCustomClassComposition": false, - "LegendaryWeaponShop": false, - "LegendaryArmorShop": false, - "LegendaryBlackShop": false, - "LegendaryWhiteShop": false, - "LegendaryItemShop": false, - "ExclusiveLegendaryWeaponShop": false, - "ExclusiveLegendaryArmorShop": false, - "ExclusiveLegendaryBlackShop": false, - "ExclusiveLegendaryWhiteShop": false, - "ExclusiveLegendaryItemShop": false, - "RandomizeClassMode": 1, - "RandomizeClassMaxBonus": 1, - "RandomizeClassMaxMalus": 0, - "EarlierHighTierMagic": false, - "ChangeMaxMP": false, - "RedMageMaxMP": 9, - "WhiteMageMaxMP": 9, - "BlackMageMaxMP": 9, - "KnightMaxMP": 4, - "NinjaMaxMP": 4, - "Knightlvl4": true, - "PinkMage": false, - "BlackKnight": true, - "BlackKnightKeep": false, - "WhiteNinja": true, - "WhiteNinjaKeep": true, - "MpGainOnMaxGainMode": 0, - "LockMode": 3, - "MDefMode": 0, - "FormationShuffleMode": 1, - "RandomizeTreasure": 0, - "OpenChestsInOrder": false, - "SetRNG": false, - "WorldWealth": 1, - "DeepDungeonGenerator": 0, - "EvadeCap": 3, - "AllowUnsafeStartArea": false, - "IncreaseDarkPenalty": true, - "IncreaseRegeneration": false, - "PoisonMode": 6, - "PoisonSetDamageValue": 3, - "TouchIncludeBosses": true, - "Lockpicking": true, - "ReducedLuck": false, - "LockpickingLevelRequirement": 22, - "WhiteMageHarmEveryone": true, - "ProcgenEarth": false, - "LoosePlacementMode": 0 - } + "Flags": { + "StartingEquipmentMasamune": false, + "StartingEquipmentKatana": false, + "StartingEquipmentHealStaff": false, + "StartingEquipmentZeusGauntlet": false, + "StartingEquipmentWhiteShirt": false, + "StartingEquipmentRibbon": false, + "StartingEquipmentDragonslayer": false, + "StartingEquipmentLegendKit": false, + "StartingEquipmentRandomEndgameWeapon": false, + "StartingEquipmentRandomAoe": false, + "StartingEquipmentRandomCasterItem": false, + "StartingEquipmentGrandpasSecretStash": false, + "StartingEquipmentOneItem": false, + "StartingEquipmentRandomCrap": false, + "StartingEquipmentStarterPack": false, + "StartingEquipmentRandomTypeWeapon": false, + "StartingEquipmentRemoveFromPool": false, + "StartingEquipmentNoDuplicates": false, + "ReversedFloors": false, + "BuffTier1DamageSpells": true, + "NoEmptyScripts": false, + "LaterLoose": false, + "MermaidPrison": true, + "GuaranteedDefenseItem": 3, + "GuaranteedPowerItem": 0, + "ScriptMultiplier": 1, + "TouchMultiplier": 2, + "TouchPool": 1, + "TouchMode": 0, + "RibbonMode": 0, + "Archipelago": false, + "ArchipelagoGold": false, + "ArchipelagoConsumables": false, + "ArchipelagoShards": false, + "ArchipelagoEquipment": 0, + "ItemMagicMode": 0, + "ItemMagicPool": 0, + "MagisizeWeapons": false, + "DisableMinimap": false, + "LooseItemsForwardPlacement": false, + "LooseItemsSpreadPlacement": false, + "LooseItemsNpcBalance": false, + "AllowUnsafePlacement": true, + "ShipCanalBeforeFloater": false, + "ExpChestConversionMin": 10, + "ExpChestConversionMax": 10, + "ExpChestMinReward": 3000, + "ExpChestMaxReward": 3000, + "SpellNameMadness": 0, + "ExtConsumableSet": 0, + "EnableSoftInBattle": true, + "EnableLifeInBattle": 0, + "NormalShopsHaveExtConsumables": false, + "LegendaryShopHasExtConsumables": false, + "ExtConsumableTreasureStackSize": 0, + "ExtStartingItemSet": 0, + "ExtConsumableChests": 0, + "OwMapExchange": 0, + "OwShuffledAccess": false, + "OwUnsafeStart": false, + "OwRandomPregen": false, + "RelocateChests": false, + "RelocateChestsTrapIndicator": false, + "ShuffleChimeAccess": true, + "ShuffleChimeIncludeTowns": false, + "GameMode": 0, + "MapGenSeed": 0, + "ReplacementMap": null, + "ResourcePack": null, + "ShopKillMode_Weapons": 0, + "ShopKillMode_Armor": 0, + "ShopKillMode_Item": 0, + "ShopKillMode_Black": 0, + "ShopKillMode_White": 0, + "ShopKillFactor_Weapons": 0, + "ShopKillFactor_Armor": 0, + "ShopKillFactor_Item": 0, + "ShopKillFactor_Black": 0, + "ShopKillFactor_White": 0, + "ShopKillExcludeConeria_Weapons": false, + "ShopKillExcludeConeria_Armor": false, + "ShopKillExcludeConeria_Item": false, + "ShopKillExcludeConeria_Black": false, + "ShopKillExcludeConeria_White": false, + "ExcludeGoldFromScaling": false, + "CheapVendorItem": false, + "StartingLevel": 0, + "TransmooglifierVariance": 0, + "MaxLevelLow": 50, + "MaxLevelHigh": 50, + "Spoilers": false, + "TriState": false, + "TournamentSafe": true, + "BlindSeed": false, + "Shops": true, + "Treasures": true, + "ChestsKeyItems": true, + "NPCItems": true, + "NPCFetchItems": true, + "RandomWares": false, + "RandomWaresIncludesSpecialGear": false, + "RandomLoot": false, + "ShardHunt": true, + "ShardCount": 2, + "OrbsRequiredCount": 4, + "OrbsRequiredMode": 0, + "OrbsRequiredSpoilers": false, + "TransformFinalFormation": 0, + "ChaosRush": false, + "ToFRMode": 1, + "FiendsRefights": 0, + "ExitToFR": true, + "ChaosFloorEncounters": false, + "MagicShops": false, + "MagicShopLocs": false, + "MagicShopLocationPairs": false, + "MagicLevels": true, + "MagicPermissions": false, + "Weaponizer": false, + "WeaponizerNamesUseQualityOnly": false, + "WeaponizerCommonWeaponsHavePowers": false, + "ArmorCrafter": false, + "MagicLevelsTiered": false, + "MagicLevelsMixed": false, + "MagicAutohitThreshold": 0, + "Rng": true, + "FixMissingBattleRngEntry": false, + "EncounterPrng": false, + "UnrunnableShuffle": true, + "UnrunnablesLow": 0, + "UnrunnablesHigh": 0, + "EnemyFormationsSurprise": true, + "UnrunnablesStrikeFirstAndSurprise": false, + "EnemyTrapTiles": 3, + "TCFormations": 2, + "TCBetterTreasure": 0, + "TCKeyItems": 2, + "TCShards": 2, + "TCExcludeCommons": false, + "TCChestCount": 0, + "TCProtectIncentives": false, + "TCMasaGuardian": false, + "TrappedChaos": false, + "TCIndicator": true, + "SwolePirates": false, + "ShuffleScriptsEnemies": true, + "RemoveBossScripts": false, + "ShuffleScriptsBosses": false, + "ShuffleSkillsSpellsEnemies": true, + "ShuffleSkillsSpellsBosses": false, + "NoConsecutiveNukes": false, + "TranceHasStatusElement": true, + "EnemySkillsSpellsTiered": false, + "AllowUnsafePirates": false, + "AllowUnsafeMelmond": false, + "WarMECHMode": 1, + "OrdealsPillars": true, + "ShuffleLavaTiles": false, + "SkyCastle4FMazeMode": 0, + "TitansTrove": true, + "LefeinShortcut": false, + "LefeinSuperStore": true, + "LefeinShops": true, + "RandomVampAttack": false, + "RandomVampAttackIncludesConeria": false, + "FightBahamut": false, + "SwoleBahamut": false, + "SwoleAstos": false, + "ConfusedOldMen": false, + "GaiaShortcut": true, + "DamageTileLow": 1, + "DamageTileHigh": 1, + "OWDamageTiles": false, + "DamageTilesKill": false, + "ArmorResistsDamageTileDamage": false, + "MoveGaiaItemShop": true, + "ShufflePravokaShops": false, + "FlipDungeons": false, + "VerticallyFlipDungeons": false, + "SpookyFlag": false, + "DraculasFlag": false, + "MapOpenProgression": true, + "MapOpenProgressionDocks": false, + "Entrances": false, + "Towns": false, + "IncludeConeria": false, + "Floors": false, + "AllowDeepCastles": false, + "AllowDeepTowns": false, + "MapOpenProgressionExtended": true, + "MapAirshipDock": false, + "MapBahamutCardiaDock": false, + "MapLefeinRiver": false, + "MapBridgeLefein": false, + "MapRiverToMelmond": false, + "MapGaiaMountainPass": false, + "MapHighwayToOrdeals": false, + "MapDragonsHoard": false, + "MapHallOfDragons": false, + "EntrancesIncludesDeadEnds": false, + "EntrancesMixedWithTowns": false, + "IncentivizeFreeNPCs": true, + "IncentivizeFetchNPCs": true, + "IncentivizeTail": true, + "IncentivizeMainItems": true, + "IncentivizeFetchItems": true, + "IncentivizeCanoeItem": true, + "IncentivizeAirship": true, + "IncentivizeShipAndCanal": true, + "IncentivizeBridgeItem": false, + "IncentivizeMarsh": false, + "IncentivizeEarth": true, + "IncentivizeVolcano": true, + "IncentivizeIceCave": false, + "IncentivizeOrdeals": true, + "IncentivizeSeaShrine": true, + "IncentivizeConeria": true, + "IncentivizeMarshKeyLocked": false, + "IncentivizeSkyPalace": true, + "IncentivizeTitansTrove": true, + "IncentivizeCardia": true, + "IceCaveIncentivePlacementType": 0, + "OrdealsIncentivePlacementType": 1, + "MarshIncentivePlacementType": 0, + "TitansIncentivePlacementType": 1, + "EarthIncentivePlacementType": 3, + "VolcanoIncentivePlacementType": 2, + "SeaShrineIncentivePlacementType": 3, + "SkyPalaceIncentivePlacementType": 3, + "CorneriaIncentivePlacementType": 0, + "MarshLockedIncentivePlacementType": 0, + "CardiaIncentivePlacementType": 1, + "BetterTrapChests": false, + "IncentivizeMasamune": false, + "IncentivizeKatana": false, + "IncentivizeXcalber": true, + "IncentivizeVorpal": false, + "IncentivizeOpal": false, + "IncentivizeRibbon": false, + "IncentivizeDefCastArmor": false, + "IncentivizeOffCastArmor": false, + "IncentivizeOtherCastArmor": true, + "IncentivizePowerRod": false, + "IncentivizeDefCastWeapon": true, + "IncentivizeOffCastWeapon": false, + "IncentivizeOtherCastWeapon": false, + "LooseExcludePlacedDungeons": false, + "EarlyKing": true, + "EarlySarda": true, + "EarlySage": true, + "EarlyOrdeals": true, + "ShuffleObjectiveNPCs": false, + "OnlyRequireGameIsBeatable": false, + "FreeBridge": true, + "FreeShip": false, + "FreeAirship": false, + "FreeLute": false, + "FreeRod": false, + "EnableCritNumberDisplay": true, + "FreeCanal": false, + "FreeCanoe": false, + "EasyMode": false, + "HousesFillHp": true, + "SpeedHacks": true, + "NoPartyShuffle": true, + "Dash": true, + "SpeedBoat": true, + "AirBoat": true, + "BuyTen": true, + "IdentifyTreasures": true, + "ShopInfo": true, + "ChestInfo": true, + "IncentiveChestItemsFanfare": true, + "WaitWhenUnrunnable": true, + "ImprovedClinic": false, + "Etherizer": false, + "HouseMPRestoration": true, + "WeaponStats": true, + "BBCritRate": false, + "WeaponCritRate": true, + "WeaponBonuses": true, + "ThiefAgilityBuff": 1, + "SkyWarriorSpoilerBats": 1, + "SpoilerBatsDontCheckOrbs": true, + "MoveToFBats": false, + "WeaponTypeBonusValue": 42, + "ChanceToRun": 1, + "SpellBugs": true, + "BlackBeltAbsorb": true, + "NPCSwatter": true, + "BattleMagicMenuWrapAround": true, + "MagicMenuSpellReordering": true, + "InventoryAutosort": true, + "RepeatedHealPotionUse": false, + "AutoRetargeting": true, + "EnemyStatusAttackBug": true, + "ImproveTurnOrderRandomization": true, + "FixHitChanceCap": true, + "MelmondClinic": false, + "DDProgressiveTilesets": false, + "DDFiendOrbs": false, + "TailBahamutMode": 0, + "StartingGold": 3, + "IncludeMorale": false, + "DeadsGainXP": false, + "NonesGainXP": false, + "NoTail": false, + "NoFloater": false, + "GuaranteedMasamune": false, + "SendMasamuneHome": false, + "MoreConsumableChests": 0, + "NoMasamune": false, + "NoXcalber": false, + "ClassAsNpcFiends": false, + "ClassAsNpcKeyNPC": false, + "ClassAsNpcCount": 6, + "ClassAsNpcDuplicate": false, + "ClassAsNpcForcedFiends": false, + "ClassAsNpcPromotion": false, + "BossScaleStatsLow": 120, + "BossScaleStatsHigh": 160, + "BossScaleHpLow": 150, + "BossScaleHpHigh": 150, + "EnemyScaleStatsLow": 80, + "EnemyScaleStatsHigh": 120, + "EnemyScaleHpLow": 50, + "EnemyScaleHpHigh": 150, + "PriceScaleFactorLow": 50, + "PriceScaleFactorHigh": 200, + "ExpMultiplier": 2.5, + "ExpBonus": 150, + "ExpMultiplierFighter": 1.1, + "ExpMultiplierThief": 1.1, + "ExpMultiplierBlackBelt": 1, + "ExpMultiplierRedMage": 1, + "ExpMultiplierWhiteMage": 1, + "ExpMultiplierBlackMage": 1, + "EncounterRate": 12, + "DungeonEncounterRate": 15, + "ProgressiveScaleMode": 11, + "StartingItemSet": 4, + "ConsumableTreasureStackSize": 2, + "FIGHTER1": true, + "THIEF1": true, + "BLACK_BELT1": true, + "RED_MAGE1": false, + "WHITE_MAGE1": false, + "BLACK_MAGE1": false, + "FIGHTER2": true, + "THIEF2": true, + "BLACK_BELT2": false, + "RED_MAGE2": true, + "WHITE_MAGE2": true, + "BLACK_MAGE2": true, + "FIGHTER3": false, + "THIEF3": false, + "BLACK_BELT3": false, + "RED_MAGE3": false, + "WHITE_MAGE3": false, + "BLACK_MAGE3": false, + "FIGHTER4": false, + "THIEF4": false, + "BLACK_BELT4": false, + "RED_MAGE4": true, + "WHITE_MAGE4": true, + "BLACK_MAGE4": true, + "KNIGHT1": false, + "KNIGHT2": false, + "KNIGHT3": false, + "KNIGHT4": false, + "NINJA1": false, + "NINJA2": false, + "NINJA3": false, + "NINJA4": false, + "MASTER1": false, + "MASTER2": false, + "MASTER3": false, + "MASTER4": false, + "RED_WIZ1": false, + "RED_WIZ2": false, + "RED_WIZ3": false, + "RED_WIZ4": false, + "WHITE_WIZ1": false, + "WHITE_WIZ2": false, + "WHITE_WIZ3": false, + "WHITE_WIZ4": false, + "BLACK_WIZ1": false, + "BLACK_WIZ2": false, + "BLACK_WIZ3": false, + "BLACK_WIZ4": false, + "NONE_CLASS2": true, + "NONE_CLASS3": true, + "NONE_CLASS4": true, + "FORCED1": true, + "FORCED2": true, + "FORCED3": true, + "FORCED4": false, + "DraftFighter": false, + "DraftThief": false, + "DraftBlackBelt": false, + "DraftRedMage": false, + "DraftWhiteMage": false, + "DraftBlackMage": false, + "DraftKnight": false, + "DraftNinja": false, + "DraftMaster": false, + "DraftRedWiz": false, + "DraftWhiteWiz": false, + "DraftBlackWiz": false, + "TAVERN1": true, + "TAVERN2": true, + "TAVERN3": false, + "TAVERN4": true, + "TAVERN5": true, + "TAVERN6": true, + "WeaponPermissions": false, + "ArmorPermissions": false, + "RecruitmentMode": true, + "RecruitmentModeHireOnly": false, + "RecruitmentModeReplaceOnlyNone": true, + "ClampMinimumStatScale": false, + "ClampMinimumBossStatScale": false, + "ClampMinimumPriceScale": false, + "FiendShuffle": false, + "DisableTentSaving": false, + "DisableInnSaving": false, + "SaveGameWhenGameOver": false, + "SaveGameDWMode": false, + "ShuffleAstos": false, + "UnsafeAstos": false, + "RandomizeEnemizer": false, + "RandomizeFormationEnemizer": false, + "GenerateNewSpellbook": false, + "SpellcrafterMixSpells": false, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, + "AllSpellLevelsForKnightNinja": false, + "BuffHealingSpells": true, + "IntAffectsSpells": false, + "AddDamageTiles": false, + "DamageTilesCastles": false, + "DamageTilesDungeons": false, + "DamageTilesCaves": false, + "DamageTilesTowns": false, + "DamageTilesTof": false, + "DamageTilesQuantity": 1, + "FreeTail": false, + "HintsVillage": false, + "SpellcrafterRetainPermissions": false, + "RandomWeaponBonus": true, + "RandomArmorBonus": true, + "RandomWeaponBonusExcludeMasa": false, + "RandomWeaponBonusLow": 4, + "RandomWeaponBonusHigh": 5, + "RandomArmorBonusLow": 4, + "RandomArmorBonusHigh": 5, + "SeparateBossHPScaling": true, + "SeparateEnemyHPScaling": false, + "ClampBossHPScaling": false, + "ClampEnemyHpScaling": false, + "PoolSize": 2, + "EnablePoolParty": false, + "SafePoolParty": false, + "IncludePromClasses": false, + "EnableRandomPromotions": false, + "IncludeBaseClasses": false, + "RandomPromotionsSpoilers": false, + "RandomizeClassCasting": true, + "RandomizeClassKeyItems": false, + "RandomizeClassIncludeXpBonus": false, + "AlternateFiends": false, + "FinalFantasy2Fiends": false, + "FinalFantasy3Fiends": false, + "FinalFantasy4Fiends": false, + "FinalFantasy5Fiends": false, + "FinalFantasy6Fiends": false, + "FinalFantasy1BonusFiends": false, + "BlackOrbFiends": false, + "NoBossSkillScriptShuffle": false, + "MooglieWeaponBalance": false, + "GuaranteeCustomClassComposition": false, + "LegendaryWeaponShop": false, + "LegendaryArmorShop": false, + "LegendaryBlackShop": false, + "LegendaryWhiteShop": false, + "LegendaryItemShop": false, + "ExclusiveLegendaryWeaponShop": false, + "ExclusiveLegendaryArmorShop": false, + "ExclusiveLegendaryBlackShop": false, + "ExclusiveLegendaryWhiteShop": false, + "ExclusiveLegendaryItemShop": false, + "RandomizeClassMode": 1, + "RandomizeClassMaxBonus": 1, + "RandomizeClassMaxMalus": 0, + "EarlierHighTierMagic": false, + "ChangeMaxMP": false, + "RedMageMaxMP": 9, + "WhiteMageMaxMP": 9, + "BlackMageMaxMP": 9, + "KnightMaxMP": 4, + "NinjaMaxMP": 4, + "Knightlvl4": true, + "PinkMage": false, + "BlackKnight": true, + "BlackKnightKeep": false, + "WhiteNinja": true, + "WhiteNinjaKeep": true, + "MpGainOnMaxGainMode": 0, + "LockMode": 3, + "MDefMode": 0, + "FormationShuffleMode": 1, + "RandomizeTreasure": 0, + "OpenChestsInOrder": false, + "SetRNG": false, + "WorldWealth": 1, + "DeepDungeonGenerator": 0, + "EvadeCap": 3, + "AllowUnsafeStartArea": false, + "IncreaseDarkPenalty": true, + "IncreaseRegeneration": false, + "PoisonMode": 6, + "PoisonSetDamageValue": 3, + "TouchIncludeBosses": true, + "Lockpicking": true, + "ReducedLuck": false, + "LockpickingLevelRequirement": 22, + "WhiteMageHarmEveryone": true, + "ProcgenEarth": false, + "LoosePlacementMode": 0 + } } diff --git a/FF1Blazorizer/wwwroot/presets/wt2025r16.json b/FF1Blazorizer/wwwroot/presets/wt2025r16.json index 798a0f4b8..50beb5b6f 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r16.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r16.json @@ -1,532 +1,534 @@ { "Name": "Winter Tournament 2025 Round of 16", - "Flags": { - "StartingEquipmentMasamune": false, - "StartingEquipmentKatana": false, - "StartingEquipmentHealStaff": false, - "StartingEquipmentZeusGauntlet": false, - "StartingEquipmentWhiteShirt": false, - "StartingEquipmentRibbon": false, - "StartingEquipmentDragonslayer": false, - "StartingEquipmentLegendKit": false, - "StartingEquipmentRandomEndgameWeapon": false, - "StartingEquipmentRandomAoe": false, - "StartingEquipmentRandomCasterItem": false, - "StartingEquipmentGrandpasSecretStash": false, - "StartingEquipmentOneItem": false, - "StartingEquipmentRandomCrap": false, - "StartingEquipmentStarterPack": false, - "StartingEquipmentRandomTypeWeapon": false, - "StartingEquipmentRemoveFromPool": false, - "StartingEquipmentNoDuplicates": false, - "ReversedFloors": false, - "BuffTier1DamageSpells": true, - "NoEmptyScripts": false, - "LaterLoose": false, - "MermaidPrison": true, - "GuaranteedDefenseItem": 3, - "GuaranteedPowerItem": 0, - "ScriptMultiplier": 1, - "TouchMultiplier": 2, - "TouchPool": 1, - "TouchMode": 0, - "RibbonMode": 0, - "Archipelago": false, - "ArchipelagoGold": false, - "ArchipelagoConsumables": false, - "ArchipelagoShards": false, - "ArchipelagoEquipment": 0, - "ItemMagicMode": 0, - "ItemMagicPool": 0, - "MagisizeWeapons": false, - "DisableMinimap": false, - "LooseItemsForwardPlacement": false, - "LooseItemsSpreadPlacement": false, - "LooseItemsNpcBalance": false, - "AllowUnsafePlacement": true, - "ShipCanalBeforeFloater": false, - "ExpChestConversionMin": 10, - "ExpChestConversionMax": 10, - "ExpChestMinReward": 3000, - "ExpChestMaxReward": 3000, - "SpellNameMadness": 0, - "ExtConsumableSet": 0, - "EnableSoftInBattle": true, - "EnableLifeInBattle": 0, - "NormalShopsHaveExtConsumables": false, - "LegendaryShopHasExtConsumables": false, - "ExtConsumableTreasureStackSize": 0, - "ExtStartingItemSet": 0, - "ExtConsumableChests": 0, - "OwMapExchange": 0, - "OwShuffledAccess": false, - "OwUnsafeStart": false, - "OwRandomPregen": false, - "RelocateChests": false, - "RelocateChestsTrapIndicator": false, - "ShuffleChimeAccess": true, - "ShuffleChimeIncludeTowns": false, - "GameMode": 0, - "MapGenSeed": 0, - "ReplacementMap": null, - "ResourcePack": null, - "ShopKillMode_Weapons": 0, - "ShopKillMode_Armor": 0, - "ShopKillMode_Item": 0, - "ShopKillMode_Black": 0, - "ShopKillMode_White": 0, - "ShopKillFactor_Weapons": 0, - "ShopKillFactor_Armor": 0, - "ShopKillFactor_Item": 0, - "ShopKillFactor_Black": 0, - "ShopKillFactor_White": 0, - "ShopKillExcludeConeria_Weapons": false, - "ShopKillExcludeConeria_Armor": false, - "ShopKillExcludeConeria_Item": false, - "ShopKillExcludeConeria_Black": false, - "ShopKillExcludeConeria_White": false, - "ExcludeGoldFromScaling": false, - "CheapVendorItem": false, - "StartingLevel": 0, - "TransmooglifierVariance": 0, - "MaxLevelLow": 50, - "MaxLevelHigh": 50, - "Spoilers": false, - "TournamentSafe": true, - "BlindSeed": false, - "Shops": true, - "Treasures": true, - "ChestsKeyItems": true, - "NPCItems": true, - "NPCFetchItems": true, - "RandomWares": false, - "RandomWaresIncludesSpecialGear": false, - "RandomLoot": false, - "ShardHunt": true, - "ShardCount": 3, - "OrbsRequiredCount": 4, - "OrbsRequiredMode": 0, - "OrbsRequiredSpoilers": false, - "TransformFinalFormation": 0, - "ChaosRush": false, - "ToFRMode": 1, - "FiendsRefights": 0, - "ExitToFR": true, - "ChaosFloorEncounters": false, - "MagicShops": false, - "MagicShopLocs": false, - "MagicShopLocationPairs": false, - "MagicLevels": true, - "MagicPermissions": false, - "Weaponizer": false, - "WeaponizerNamesUseQualityOnly": false, - "WeaponizerCommonWeaponsHavePowers": false, - "ArmorCrafter": false, - "MagicLevelsTiered": false, - "MagicLevelsMixed": false, - "MagicAutohitThreshold": 0, - "Rng": true, - "FixMissingBattleRngEntry": false, - "EncounterPrng": false, - "UnrunnableShuffle": true, - "UnrunnablesLow": 0, - "UnrunnablesHigh": 0, - "EnemyFormationsSurprise": true, - "UnrunnablesStrikeFirstAndSurprise": false, - "EnemyTrapTiles": 3, - "TCFormations": 2, - "TCBetterTreasure": 0, - "TCKeyItems": 2, - "TCShards": 2, - "TCExcludeCommons": false, - "TCChestCount": 0, - "TCProtectIncentives": false, - "TCMasaGuardian": false, - "TrappedChaos": false, - "TCIndicator": true, - "SwolePirates": false, - "ShuffleScriptsEnemies": true, - "RemoveBossScripts": false, - "ShuffleScriptsBosses": false, - "ShuffleSkillsSpellsEnemies": true, - "ShuffleSkillsSpellsBosses": false, - "NoConsecutiveNukes": false, - "TranceHasStatusElement": true, - "EnemySkillsSpellsTiered": false, - "AllowUnsafePirates": false, - "AllowUnsafeMelmond": false, - "WarMECHMode": 1, - "OrdealsPillars": true, - "ShuffleLavaTiles": false, - "SkyCastle4FMazeMode": 0, - "TitansTrove": true, - "LefeinSuperStore": true, - "LefeinShops": true, - "RandomVampAttack": false, - "RandomVampAttackIncludesConeria": false, - "FightBahamut": false, - "SwoleBahamut": false, - "SwoleAstos": false, - "ConfusedOldMen": false, - "GaiaShortcut": true, - "DamageTileLow": 1, - "DamageTileHigh": 1, - "OWDamageTiles": false, - "DamageTilesKill": false, - "ArmorResistsDamageTileDamage": false, - "MoveGaiaItemShop": true, - "ShufflePravokaShops": false, - "FlipDungeons": false, - "VerticallyFlipDungeons": false, - "SpookyFlag": false, - "DraculasFlag": false, - "MapOpenProgression": true, - "MapOpenProgressionDocks": false, - "Entrances": false, - "Towns": false, - "IncludeConeria": false, - "Floors": false, - "AllowDeepCastles": false, - "AllowDeepTowns": false, - "MapOpenProgressionExtended": true, - "MapAirshipDock": false, - "MapBahamutCardiaDock": false, - "MapLefeinRiver": false, - "MapBridgeLefein": false, - "MapRiverToMelmond": true, - "MapGaiaMountainPass": false, - "MapHighwayToOrdeals": false, - "MapDragonsHoard": false, - "MapHallOfDragons": false, - "EntrancesIncludesDeadEnds": false, - "EntrancesMixedWithTowns": false, - "IncentivizeFreeNPCs": true, - "IncentivizeFetchNPCs": true, - "IncentivizeTail": true, - "IncentivizeMainItems": true, - "IncentivizeFetchItems": true, - "IncentivizeCanoeItem": true, - "IncentivizeAirship": true, - "IncentivizeShipAndCanal": true, - "IncentivizeBridgeItem": false, - "IncentivizeMarsh": false, - "IncentivizeEarth": true, - "IncentivizeVolcano": true, - "IncentivizeIceCave": false, - "IncentivizeOrdeals": true, - "IncentivizeSeaShrine": true, - "IncentivizeConeria": true, - "IncentivizeMarshKeyLocked": false, - "IncentivizeSkyPalace": true, - "IncentivizeTitansTrove": true, - "IncentivizeCardia": true, - "IceCaveIncentivePlacementType": 0, - "OrdealsIncentivePlacementType": 1, - "MarshIncentivePlacementType": 0, - "TitansIncentivePlacementType": 1, - "EarthIncentivePlacementType": 3, - "VolcanoIncentivePlacementType": 2, - "SeaShrineIncentivePlacementType": 3, - "SkyPalaceIncentivePlacementType": 3, - "CorneriaIncentivePlacementType": 0, - "MarshLockedIncentivePlacementType": 0, - "CardiaIncentivePlacementType": 1, - "BetterTrapChests": false, - "IncentivizeMasamune": false, - "IncentivizeKatana": false, - "IncentivizeXcalber": true, - "IncentivizeVorpal": false, - "IncentivizeOpal": false, - "IncentivizeRibbon": false, - "IncentivizeDefCastArmor": false, - "IncentivizeOffCastArmor": false, - "IncentivizeOtherCastArmor": true, - "IncentivizePowerRod": false, - "IncentivizeDefCastWeapon": true, - "IncentivizeOffCastWeapon": false, - "IncentivizeOtherCastWeapon": false, - "LooseExcludePlacedDungeons": false, - "EarlyKing": true, - "EarlySarda": true, - "EarlySage": true, - "EarlyOrdeals": true, - "ShuffleObjectiveNPCs": false, - "OnlyRequireGameIsBeatable": false, - "FreeBridge": true, - "FreeShip": false, - "FreeAirship": false, - "FreeLute": false, - "FreeRod": false, - "EnableCritNumberDisplay": true, - "FreeCanal": false, - "FreeCanoe": false, - "EasyMode": false, - "HousesFillHp": true, - "SpeedHacks": true, - "NoPartyShuffle": true, - "Dash": true, - "SpeedBoat": true, - "AirBoat": true, - "BuyTen": true, - "IdentifyTreasures": true, - "ShopInfo": true, - "ChestInfo": true, - "IncentiveChestItemsFanfare": true, - "WaitWhenUnrunnable": true, - "ImprovedClinic": false, - "Etherizer": false, - "HouseMPRestoration": true, - "WeaponStats": true, - "BBCritRate": false, - "WeaponCritRate": true, - "WeaponBonuses": true, - "ThiefAgilityBuff": 1, - "SkyWarriorSpoilerBats": 1, - "SpoilerBatsDontCheckOrbs": true, - "MoveToFBats": false, - "WeaponTypeBonusValue": 42, - "ChanceToRun": 1, - "SpellBugs": true, - "BlackBeltAbsorb": true, - "NPCSwatter": true, - "BattleMagicMenuWrapAround": true, - "MagicMenuSpellReordering": true, - "InventoryAutosort": true, - "RepeatedHealPotionUse": false, - "AutoRetargeting": true, - "EnemyStatusAttackBug": true, - "ImproveTurnOrderRandomization": true, - "FixHitChanceCap": true, - "MelmondClinic": false, - "DDProgressiveTilesets": false, - "DDFiendOrbs": false, - "TailBahamutMode": 0, - "StartingGold": 3, - "IncludeMorale": false, - "DeadsGainXP": false, - "NonesGainXP": false, - "NoTail": false, - "NoFloater": false, - "GuaranteedMasamune": false, - "SendMasamuneHome": false, - "MoreConsumableChests": 0, - "NoMasamune": false, - "NoXcalber": false, - "ClassAsNpcFiends": false, - "ClassAsNpcKeyNPC": false, - "ClassAsNpcCount": 6, - "ClassAsNpcDuplicate": false, - "ClassAsNpcForcedFiends": false, - "ClassAsNpcPromotion": false, - "BossScaleStatsLow": 130, - "BossScaleStatsHigh": 180, - "BossScaleHpLow": 160, - "BossScaleHpHigh": 180, - "EnemyScaleStatsLow": 90, - "EnemyScaleStatsHigh": 140, - "EnemyScaleHpLow": 50, - "EnemyScaleHpHigh": 150, - "PriceScaleFactorLow": 50, - "PriceScaleFactorHigh": 200, - "ExpMultiplier": 2.5, - "ExpBonus": 150, - "ExpMultiplierFighter": 1.1, - "ExpMultiplierThief": 1.1, - "ExpMultiplierBlackBelt": 1, - "ExpMultiplierRedMage": 1, - "ExpMultiplierWhiteMage": 1, - "ExpMultiplierBlackMage": 1, - "EncounterRate": 12, - "DungeonEncounterRate": 15, - "ProgressiveScaleMode": 11, - "StartingItemSet": 4, - "ConsumableTreasureStackSize": 2, - "FIGHTER1": true, - "THIEF1": true, - "BLACK_BELT1": true, - "RED_MAGE1": false, - "WHITE_MAGE1": false, - "BLACK_MAGE1": false, - "FIGHTER2": true, - "THIEF2": true, - "BLACK_BELT2": false, - "RED_MAGE2": true, - "WHITE_MAGE2": true, - "BLACK_MAGE2": true, - "FIGHTER3": false, - "THIEF3": false, - "BLACK_BELT3": false, - "RED_MAGE3": false, - "WHITE_MAGE3": false, - "BLACK_MAGE3": false, - "FIGHTER4": false, - "THIEF4": false, - "BLACK_BELT4": false, - "RED_MAGE4": true, - "WHITE_MAGE4": true, - "BLACK_MAGE4": true, - "KNIGHT1": false, - "KNIGHT2": false, - "KNIGHT3": false, - "KNIGHT4": false, - "NINJA1": false, - "NINJA2": false, - "NINJA3": false, - "NINJA4": false, - "MASTER1": false, - "MASTER2": false, - "MASTER3": false, - "MASTER4": false, - "RED_WIZ1": false, - "RED_WIZ2": false, - "RED_WIZ3": false, - "RED_WIZ4": false, - "WHITE_WIZ1": false, - "WHITE_WIZ2": false, - "WHITE_WIZ3": false, - "WHITE_WIZ4": false, - "BLACK_WIZ1": false, - "BLACK_WIZ2": false, - "BLACK_WIZ3": false, - "BLACK_WIZ4": false, - "NONE_CLASS2": true, - "NONE_CLASS3": true, - "NONE_CLASS4": true, - "FORCED1": true, - "FORCED2": true, - "FORCED3": true, - "FORCED4": false, - "DraftFighter": false, - "DraftThief": false, - "DraftBlackBelt": false, - "DraftRedMage": false, - "DraftWhiteMage": false, - "DraftBlackMage": false, - "DraftKnight": false, - "DraftNinja": false, - "DraftMaster": false, - "DraftRedWiz": false, - "DraftWhiteWiz": false, - "DraftBlackWiz": false, - "TAVERN1": true, - "TAVERN2": true, - "TAVERN3": false, - "TAVERN4": true, - "TAVERN5": true, - "TAVERN6": true, - "WeaponPermissions": false, - "ArmorPermissions": false, - "RecruitmentMode": true, - "RecruitmentModeHireOnly": false, - "RecruitmentModeReplaceOnlyNone": true, - "ClampMinimumStatScale": false, - "ClampMinimumBossStatScale": false, - "ClampMinimumPriceScale": false, - "EFGWaterfall": false, - "FiendShuffle": false, - "DisableTentSaving": false, - "DisableInnSaving": false, - "SaveGameWhenGameOver": false, - "SaveGameDWMode": false, - "ShuffleAstos": false, - "UnsafeAstos": false, - "RandomizeEnemizer": false, - "RandomizeFormationEnemizer": false, - "GenerateNewSpellbook": false, - "SpellcrafterMixSpells": false, - "ThiefHitRate": true, - "AllSpellLevelsForKnightNinja": false, - "BuffHealingSpells": true, - "IntAffectsSpells": false, - "AddDamageTiles": false, - "DamageTilesCastles": false, - "DamageTilesDungeons": false, - "DamageTilesCaves": false, - "DamageTilesTowns": false, - "DamageTilesTof": false, - "DamageTilesQuantity": 1, - "FreeTail": false, - "HintsVillage": false, - "SpellcrafterRetainPermissions": false, - "RandomWeaponBonus": true, - "RandomArmorBonus": true, - "RandomWeaponBonusExcludeMasa": false, - "RandomWeaponBonusLow": 1, - "RandomWeaponBonusHigh": 5, - "RandomArmorBonusLow": 1, - "RandomArmorBonusHigh": 5, - "SeparateBossHPScaling": true, - "SeparateEnemyHPScaling": false, - "ClampBossHPScaling": false, - "ClampEnemyHpScaling": false, - "PoolSize": 2, - "EnablePoolParty": false, - "SafePoolParty": false, - "IncludePromClasses": false, - "EnableRandomPromotions": false, - "IncludeBaseClasses": false, - "RandomPromotionsSpoilers": false, - "RandomizeClassCasting": true, - "RandomizeClassKeyItems": false, - "RandomizeClassIncludeXpBonus": false, - "AlternateFiends": false, - "FinalFantasy2Fiends": false, - "FinalFantasy3Fiends": false, - "FinalFantasy4Fiends": false, - "FinalFantasy5Fiends": false, - "FinalFantasy6Fiends": false, - "FinalFantasy1BonusFiends": false, - "BlackOrbFiends": false, - "NoBossSkillScriptShuffle": false, - "MooglieWeaponBalance": false, - "GuaranteeCustomClassComposition": false, - "LegendaryWeaponShop": false, - "LegendaryArmorShop": false, - "LegendaryBlackShop": false, - "LegendaryWhiteShop": false, - "LegendaryItemShop": false, - "ExclusiveLegendaryWeaponShop": false, - "ExclusiveLegendaryArmorShop": false, - "ExclusiveLegendaryBlackShop": false, - "ExclusiveLegendaryWhiteShop": false, - "ExclusiveLegendaryItemShop": false, - "RandomizeClassMode": 1, - "RandomizeClassMaxBonus": 1, - "RandomizeClassMaxMalus": 0, - "EarlierHighTierMagic": false, - "ChangeMaxMP": false, - "RedMageMaxMP": 9, - "WhiteMageMaxMP": 9, - "BlackMageMaxMP": 9, - "KnightMaxMP": 4, - "NinjaMaxMP": 4, - "Knightlvl4": true, - "PinkMage": false, - "BlackKnight": true, - "BlackKnightKeep": false, - "WhiteNinja": true, - "WhiteNinjaKeep": true, - "MpGainOnMaxGainMode": 0, - "LockMode": 3, - "MDefMode": 0, - "FormationShuffleMode": 1, - "RandomizeTreasure": 0, - "OpenChestsInOrder": false, - "SetRNG": false, - "WorldWealth": 1, - "DeepDungeonGenerator": 0, - "EvadeCap": 3, - "AllowUnsafeStartArea": false, - "IncreaseDarkPenalty": true, - "IncreaseRegeneration": false, - "PoisonMode": 6, - "PoisonSetDamageValue": 3, - "TouchIncludeBosses": true, - "Lockpicking": true, - "ReducedLuck": false, - "LockpickingLevelRequirement": 22, - "WhiteMageHarmEveryone": true, - "ProcgenEarth": false, - "LoosePlacementMode": 0 - } + "Flags": { + "StartingEquipmentMasamune": false, + "StartingEquipmentKatana": false, + "StartingEquipmentHealStaff": false, + "StartingEquipmentZeusGauntlet": false, + "StartingEquipmentWhiteShirt": false, + "StartingEquipmentRibbon": false, + "StartingEquipmentDragonslayer": false, + "StartingEquipmentLegendKit": false, + "StartingEquipmentRandomEndgameWeapon": false, + "StartingEquipmentRandomAoe": false, + "StartingEquipmentRandomCasterItem": false, + "StartingEquipmentGrandpasSecretStash": false, + "StartingEquipmentOneItem": false, + "StartingEquipmentRandomCrap": false, + "StartingEquipmentStarterPack": false, + "StartingEquipmentRandomTypeWeapon": false, + "StartingEquipmentRemoveFromPool": false, + "StartingEquipmentNoDuplicates": false, + "ReversedFloors": false, + "BuffTier1DamageSpells": true, + "NoEmptyScripts": false, + "LaterLoose": false, + "MermaidPrison": true, + "GuaranteedDefenseItem": 3, + "GuaranteedPowerItem": 0, + "ScriptMultiplier": 1, + "TouchMultiplier": 2, + "TouchPool": 1, + "TouchMode": 0, + "RibbonMode": 0, + "Archipelago": false, + "ArchipelagoGold": false, + "ArchipelagoConsumables": false, + "ArchipelagoShards": false, + "ArchipelagoEquipment": 0, + "ItemMagicMode": 0, + "ItemMagicPool": 0, + "MagisizeWeapons": false, + "DisableMinimap": false, + "LooseItemsForwardPlacement": false, + "LooseItemsSpreadPlacement": false, + "LooseItemsNpcBalance": false, + "AllowUnsafePlacement": true, + "ShipCanalBeforeFloater": false, + "ExpChestConversionMin": 10, + "ExpChestConversionMax": 10, + "ExpChestMinReward": 3000, + "ExpChestMaxReward": 3000, + "SpellNameMadness": 0, + "ExtConsumableSet": 0, + "EnableSoftInBattle": true, + "EnableLifeInBattle": 0, + "NormalShopsHaveExtConsumables": false, + "LegendaryShopHasExtConsumables": false, + "ExtConsumableTreasureStackSize": 0, + "ExtStartingItemSet": 0, + "ExtConsumableChests": 0, + "OwMapExchange": 0, + "OwShuffledAccess": false, + "OwUnsafeStart": false, + "OwRandomPregen": false, + "RelocateChests": false, + "RelocateChestsTrapIndicator": false, + "ShuffleChimeAccess": true, + "ShuffleChimeIncludeTowns": false, + "GameMode": 0, + "MapGenSeed": 0, + "ReplacementMap": null, + "ResourcePack": null, + "ShopKillMode_Weapons": 0, + "ShopKillMode_Armor": 0, + "ShopKillMode_Item": 0, + "ShopKillMode_Black": 0, + "ShopKillMode_White": 0, + "ShopKillFactor_Weapons": 0, + "ShopKillFactor_Armor": 0, + "ShopKillFactor_Item": 0, + "ShopKillFactor_Black": 0, + "ShopKillFactor_White": 0, + "ShopKillExcludeConeria_Weapons": false, + "ShopKillExcludeConeria_Armor": false, + "ShopKillExcludeConeria_Item": false, + "ShopKillExcludeConeria_Black": false, + "ShopKillExcludeConeria_White": false, + "ExcludeGoldFromScaling": false, + "CheapVendorItem": false, + "StartingLevel": 0, + "TransmooglifierVariance": 0, + "MaxLevelLow": 50, + "MaxLevelHigh": 50, + "Spoilers": false, + "TriState": false, + "TournamentSafe": true, + "BlindSeed": false, + "Shops": true, + "Treasures": true, + "ChestsKeyItems": true, + "NPCItems": true, + "NPCFetchItems": true, + "RandomWares": false, + "RandomWaresIncludesSpecialGear": false, + "RandomLoot": false, + "ShardHunt": true, + "ShardCount": 3, + "OrbsRequiredCount": 4, + "OrbsRequiredMode": 0, + "OrbsRequiredSpoilers": false, + "TransformFinalFormation": 0, + "ChaosRush": false, + "ToFRMode": 1, + "FiendsRefights": 0, + "ExitToFR": true, + "ChaosFloorEncounters": false, + "MagicShops": false, + "MagicShopLocs": false, + "MagicShopLocationPairs": false, + "MagicLevels": true, + "MagicPermissions": false, + "Weaponizer": false, + "WeaponizerNamesUseQualityOnly": false, + "WeaponizerCommonWeaponsHavePowers": false, + "ArmorCrafter": false, + "MagicLevelsTiered": false, + "MagicLevelsMixed": false, + "MagicAutohitThreshold": 0, + "Rng": true, + "FixMissingBattleRngEntry": false, + "EncounterPrng": false, + "UnrunnableShuffle": true, + "UnrunnablesLow": 0, + "UnrunnablesHigh": 0, + "EnemyFormationsSurprise": true, + "UnrunnablesStrikeFirstAndSurprise": false, + "EnemyTrapTiles": 3, + "TCFormations": 2, + "TCBetterTreasure": 0, + "TCKeyItems": 2, + "TCShards": 2, + "TCExcludeCommons": false, + "TCChestCount": 0, + "TCProtectIncentives": false, + "TCMasaGuardian": false, + "TrappedChaos": false, + "TCIndicator": true, + "SwolePirates": false, + "ShuffleScriptsEnemies": true, + "RemoveBossScripts": false, + "ShuffleScriptsBosses": false, + "ShuffleSkillsSpellsEnemies": true, + "ShuffleSkillsSpellsBosses": false, + "NoConsecutiveNukes": false, + "TranceHasStatusElement": true, + "EnemySkillsSpellsTiered": false, + "AllowUnsafePirates": false, + "AllowUnsafeMelmond": false, + "WarMECHMode": 1, + "OrdealsPillars": true, + "ShuffleLavaTiles": false, + "SkyCastle4FMazeMode": 0, + "TitansTrove": true, + "LefeinShortcut": false, + "LefeinSuperStore": true, + "LefeinShops": true, + "RandomVampAttack": false, + "RandomVampAttackIncludesConeria": false, + "FightBahamut": false, + "SwoleBahamut": false, + "SwoleAstos": false, + "ConfusedOldMen": false, + "GaiaShortcut": true, + "DamageTileLow": 1, + "DamageTileHigh": 1, + "OWDamageTiles": false, + "DamageTilesKill": false, + "ArmorResistsDamageTileDamage": false, + "MoveGaiaItemShop": true, + "ShufflePravokaShops": false, + "FlipDungeons": false, + "VerticallyFlipDungeons": false, + "SpookyFlag": false, + "DraculasFlag": false, + "MapOpenProgression": true, + "MapOpenProgressionDocks": false, + "Entrances": false, + "Towns": false, + "IncludeConeria": false, + "Floors": false, + "AllowDeepCastles": false, + "AllowDeepTowns": false, + "MapOpenProgressionExtended": true, + "MapAirshipDock": false, + "MapBahamutCardiaDock": false, + "MapLefeinRiver": false, + "MapBridgeLefein": false, + "MapRiverToMelmond": true, + "MapGaiaMountainPass": false, + "MapHighwayToOrdeals": false, + "MapDragonsHoard": false, + "MapHallOfDragons": false, + "EntrancesIncludesDeadEnds": false, + "EntrancesMixedWithTowns": false, + "IncentivizeFreeNPCs": true, + "IncentivizeFetchNPCs": true, + "IncentivizeTail": true, + "IncentivizeMainItems": true, + "IncentivizeFetchItems": true, + "IncentivizeCanoeItem": true, + "IncentivizeAirship": true, + "IncentivizeShipAndCanal": true, + "IncentivizeBridgeItem": false, + "IncentivizeMarsh": false, + "IncentivizeEarth": true, + "IncentivizeVolcano": true, + "IncentivizeIceCave": false, + "IncentivizeOrdeals": true, + "IncentivizeSeaShrine": true, + "IncentivizeConeria": true, + "IncentivizeMarshKeyLocked": false, + "IncentivizeSkyPalace": true, + "IncentivizeTitansTrove": true, + "IncentivizeCardia": true, + "IceCaveIncentivePlacementType": 0, + "OrdealsIncentivePlacementType": 1, + "MarshIncentivePlacementType": 0, + "TitansIncentivePlacementType": 1, + "EarthIncentivePlacementType": 3, + "VolcanoIncentivePlacementType": 2, + "SeaShrineIncentivePlacementType": 3, + "SkyPalaceIncentivePlacementType": 3, + "CorneriaIncentivePlacementType": 0, + "MarshLockedIncentivePlacementType": 0, + "CardiaIncentivePlacementType": 1, + "BetterTrapChests": false, + "IncentivizeMasamune": false, + "IncentivizeKatana": false, + "IncentivizeXcalber": true, + "IncentivizeVorpal": false, + "IncentivizeOpal": false, + "IncentivizeRibbon": false, + "IncentivizeDefCastArmor": false, + "IncentivizeOffCastArmor": false, + "IncentivizeOtherCastArmor": true, + "IncentivizePowerRod": false, + "IncentivizeDefCastWeapon": true, + "IncentivizeOffCastWeapon": false, + "IncentivizeOtherCastWeapon": false, + "LooseExcludePlacedDungeons": false, + "EarlyKing": true, + "EarlySarda": true, + "EarlySage": true, + "EarlyOrdeals": true, + "ShuffleObjectiveNPCs": false, + "OnlyRequireGameIsBeatable": false, + "FreeBridge": true, + "FreeShip": false, + "FreeAirship": false, + "FreeLute": false, + "FreeRod": false, + "EnableCritNumberDisplay": true, + "FreeCanal": false, + "FreeCanoe": false, + "EasyMode": false, + "HousesFillHp": true, + "SpeedHacks": true, + "NoPartyShuffle": true, + "Dash": true, + "SpeedBoat": true, + "AirBoat": true, + "BuyTen": true, + "IdentifyTreasures": true, + "ShopInfo": true, + "ChestInfo": true, + "IncentiveChestItemsFanfare": true, + "WaitWhenUnrunnable": true, + "ImprovedClinic": false, + "Etherizer": false, + "HouseMPRestoration": true, + "WeaponStats": true, + "BBCritRate": false, + "WeaponCritRate": true, + "WeaponBonuses": true, + "ThiefAgilityBuff": 1, + "SkyWarriorSpoilerBats": 1, + "SpoilerBatsDontCheckOrbs": true, + "MoveToFBats": false, + "WeaponTypeBonusValue": 42, + "ChanceToRun": 1, + "SpellBugs": true, + "BlackBeltAbsorb": true, + "NPCSwatter": true, + "BattleMagicMenuWrapAround": true, + "MagicMenuSpellReordering": true, + "InventoryAutosort": true, + "RepeatedHealPotionUse": false, + "AutoRetargeting": true, + "EnemyStatusAttackBug": true, + "ImproveTurnOrderRandomization": true, + "FixHitChanceCap": true, + "MelmondClinic": false, + "DDProgressiveTilesets": false, + "DDFiendOrbs": false, + "TailBahamutMode": 0, + "StartingGold": 3, + "IncludeMorale": false, + "DeadsGainXP": false, + "NonesGainXP": false, + "NoTail": false, + "NoFloater": false, + "GuaranteedMasamune": false, + "SendMasamuneHome": false, + "MoreConsumableChests": 0, + "NoMasamune": false, + "NoXcalber": false, + "ClassAsNpcFiends": false, + "ClassAsNpcKeyNPC": false, + "ClassAsNpcCount": 6, + "ClassAsNpcDuplicate": false, + "ClassAsNpcForcedFiends": false, + "ClassAsNpcPromotion": false, + "BossScaleStatsLow": 130, + "BossScaleStatsHigh": 180, + "BossScaleHpLow": 160, + "BossScaleHpHigh": 180, + "EnemyScaleStatsLow": 90, + "EnemyScaleStatsHigh": 140, + "EnemyScaleHpLow": 50, + "EnemyScaleHpHigh": 150, + "PriceScaleFactorLow": 50, + "PriceScaleFactorHigh": 200, + "ExpMultiplier": 2.5, + "ExpBonus": 150, + "ExpMultiplierFighter": 1.1, + "ExpMultiplierThief": 1.1, + "ExpMultiplierBlackBelt": 1, + "ExpMultiplierRedMage": 1, + "ExpMultiplierWhiteMage": 1, + "ExpMultiplierBlackMage": 1, + "EncounterRate": 12, + "DungeonEncounterRate": 15, + "ProgressiveScaleMode": 11, + "StartingItemSet": 4, + "ConsumableTreasureStackSize": 2, + "FIGHTER1": true, + "THIEF1": true, + "BLACK_BELT1": true, + "RED_MAGE1": false, + "WHITE_MAGE1": false, + "BLACK_MAGE1": false, + "FIGHTER2": true, + "THIEF2": true, + "BLACK_BELT2": false, + "RED_MAGE2": true, + "WHITE_MAGE2": true, + "BLACK_MAGE2": true, + "FIGHTER3": false, + "THIEF3": false, + "BLACK_BELT3": false, + "RED_MAGE3": false, + "WHITE_MAGE3": false, + "BLACK_MAGE3": false, + "FIGHTER4": false, + "THIEF4": false, + "BLACK_BELT4": false, + "RED_MAGE4": true, + "WHITE_MAGE4": true, + "BLACK_MAGE4": true, + "KNIGHT1": false, + "KNIGHT2": false, + "KNIGHT3": false, + "KNIGHT4": false, + "NINJA1": false, + "NINJA2": false, + "NINJA3": false, + "NINJA4": false, + "MASTER1": false, + "MASTER2": false, + "MASTER3": false, + "MASTER4": false, + "RED_WIZ1": false, + "RED_WIZ2": false, + "RED_WIZ3": false, + "RED_WIZ4": false, + "WHITE_WIZ1": false, + "WHITE_WIZ2": false, + "WHITE_WIZ3": false, + "WHITE_WIZ4": false, + "BLACK_WIZ1": false, + "BLACK_WIZ2": false, + "BLACK_WIZ3": false, + "BLACK_WIZ4": false, + "NONE_CLASS2": true, + "NONE_CLASS3": true, + "NONE_CLASS4": true, + "FORCED1": true, + "FORCED2": true, + "FORCED3": true, + "FORCED4": false, + "DraftFighter": false, + "DraftThief": false, + "DraftBlackBelt": false, + "DraftRedMage": false, + "DraftWhiteMage": false, + "DraftBlackMage": false, + "DraftKnight": false, + "DraftNinja": false, + "DraftMaster": false, + "DraftRedWiz": false, + "DraftWhiteWiz": false, + "DraftBlackWiz": false, + "TAVERN1": true, + "TAVERN2": true, + "TAVERN3": false, + "TAVERN4": true, + "TAVERN5": true, + "TAVERN6": true, + "WeaponPermissions": false, + "ArmorPermissions": false, + "RecruitmentMode": true, + "RecruitmentModeHireOnly": false, + "RecruitmentModeReplaceOnlyNone": true, + "ClampMinimumStatScale": false, + "ClampMinimumBossStatScale": false, + "ClampMinimumPriceScale": false, + "FiendShuffle": false, + "DisableTentSaving": false, + "DisableInnSaving": false, + "SaveGameWhenGameOver": false, + "SaveGameDWMode": false, + "ShuffleAstos": false, + "UnsafeAstos": false, + "RandomizeEnemizer": false, + "RandomizeFormationEnemizer": false, + "GenerateNewSpellbook": false, + "SpellcrafterMixSpells": false, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, + "AllSpellLevelsForKnightNinja": false, + "BuffHealingSpells": true, + "IntAffectsSpells": false, + "AddDamageTiles": false, + "DamageTilesCastles": false, + "DamageTilesDungeons": false, + "DamageTilesCaves": false, + "DamageTilesTowns": false, + "DamageTilesTof": false, + "DamageTilesQuantity": 1, + "FreeTail": false, + "HintsVillage": false, + "SpellcrafterRetainPermissions": false, + "RandomWeaponBonus": true, + "RandomArmorBonus": true, + "RandomWeaponBonusExcludeMasa": false, + "RandomWeaponBonusLow": 1, + "RandomWeaponBonusHigh": 5, + "RandomArmorBonusLow": 1, + "RandomArmorBonusHigh": 5, + "SeparateBossHPScaling": true, + "SeparateEnemyHPScaling": false, + "ClampBossHPScaling": false, + "ClampEnemyHpScaling": false, + "PoolSize": 2, + "EnablePoolParty": false, + "SafePoolParty": false, + "IncludePromClasses": false, + "EnableRandomPromotions": false, + "IncludeBaseClasses": false, + "RandomPromotionsSpoilers": false, + "RandomizeClassCasting": true, + "RandomizeClassKeyItems": false, + "RandomizeClassIncludeXpBonus": false, + "AlternateFiends": false, + "FinalFantasy2Fiends": false, + "FinalFantasy3Fiends": false, + "FinalFantasy4Fiends": false, + "FinalFantasy5Fiends": false, + "FinalFantasy6Fiends": false, + "FinalFantasy1BonusFiends": false, + "BlackOrbFiends": false, + "NoBossSkillScriptShuffle": false, + "MooglieWeaponBalance": false, + "GuaranteeCustomClassComposition": false, + "LegendaryWeaponShop": false, + "LegendaryArmorShop": false, + "LegendaryBlackShop": false, + "LegendaryWhiteShop": false, + "LegendaryItemShop": false, + "ExclusiveLegendaryWeaponShop": false, + "ExclusiveLegendaryArmorShop": false, + "ExclusiveLegendaryBlackShop": false, + "ExclusiveLegendaryWhiteShop": false, + "ExclusiveLegendaryItemShop": false, + "RandomizeClassMode": 1, + "RandomizeClassMaxBonus": 1, + "RandomizeClassMaxMalus": 0, + "EarlierHighTierMagic": false, + "ChangeMaxMP": false, + "RedMageMaxMP": 9, + "WhiteMageMaxMP": 9, + "BlackMageMaxMP": 9, + "KnightMaxMP": 4, + "NinjaMaxMP": 4, + "Knightlvl4": true, + "PinkMage": false, + "BlackKnight": true, + "BlackKnightKeep": false, + "WhiteNinja": true, + "WhiteNinjaKeep": true, + "MpGainOnMaxGainMode": 0, + "LockMode": 3, + "MDefMode": 0, + "FormationShuffleMode": 1, + "RandomizeTreasure": 0, + "OpenChestsInOrder": false, + "SetRNG": false, + "WorldWealth": 1, + "DeepDungeonGenerator": 0, + "EvadeCap": 3, + "AllowUnsafeStartArea": false, + "IncreaseDarkPenalty": true, + "IncreaseRegeneration": false, + "PoisonMode": 6, + "PoisonSetDamageValue": 3, + "TouchIncludeBosses": true, + "Lockpicking": true, + "ReducedLuck": false, + "LockpickingLevelRequirement": 22, + "WhiteMageHarmEveryone": true, + "ProcgenEarth": false, + "LoosePlacementMode": 0 + } } diff --git a/FF1Blazorizer/wwwroot/presets/wt2025r32.json b/FF1Blazorizer/wwwroot/presets/wt2025r32.json index 2caa1f6be..232b20ef6 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r32.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r32.json @@ -1,532 +1,534 @@ { "Name": "Winter Tournament 2025 Round of 32", - "Flags": { - "StartingEquipmentMasamune": false, - "StartingEquipmentKatana": false, - "StartingEquipmentHealStaff": false, - "StartingEquipmentZeusGauntlet": false, - "StartingEquipmentWhiteShirt": false, - "StartingEquipmentRibbon": false, - "StartingEquipmentDragonslayer": false, - "StartingEquipmentLegendKit": false, - "StartingEquipmentRandomEndgameWeapon": false, - "StartingEquipmentRandomAoe": false, - "StartingEquipmentRandomCasterItem": false, - "StartingEquipmentGrandpasSecretStash": false, - "StartingEquipmentOneItem": false, - "StartingEquipmentRandomCrap": false, - "StartingEquipmentStarterPack": false, - "StartingEquipmentRandomTypeWeapon": false, - "StartingEquipmentRemoveFromPool": false, - "StartingEquipmentNoDuplicates": false, - "ReversedFloors": false, - "BuffTier1DamageSpells": true, - "NoEmptyScripts": false, - "LaterLoose": false, - "MermaidPrison": true, - "GuaranteedDefenseItem": 3, - "GuaranteedPowerItem": 0, - "ScriptMultiplier": 1, - "TouchMultiplier": 2, - "TouchPool": 1, - "TouchMode": 0, - "RibbonMode": 0, - "Archipelago": false, - "ArchipelagoGold": false, - "ArchipelagoConsumables": false, - "ArchipelagoShards": false, - "ArchipelagoEquipment": 0, - "ItemMagicMode": 0, - "ItemMagicPool": 0, - "MagisizeWeapons": false, - "DisableMinimap": false, - "LooseItemsForwardPlacement": false, - "LooseItemsSpreadPlacement": false, - "LooseItemsNpcBalance": false, - "AllowUnsafePlacement": true, - "ShipCanalBeforeFloater": false, - "ExpChestConversionMin": 10, - "ExpChestConversionMax": 10, - "ExpChestMinReward": 3000, - "ExpChestMaxReward": 3000, - "SpellNameMadness": 0, - "ExtConsumableSet": 0, - "EnableSoftInBattle": true, - "EnableLifeInBattle": 0, - "NormalShopsHaveExtConsumables": false, - "LegendaryShopHasExtConsumables": false, - "ExtConsumableTreasureStackSize": 0, - "ExtStartingItemSet": 0, - "ExtConsumableChests": 0, - "OwMapExchange": 0, - "OwShuffledAccess": false, - "OwUnsafeStart": false, - "OwRandomPregen": false, - "RelocateChests": false, - "RelocateChestsTrapIndicator": false, - "ShuffleChimeAccess": true, - "ShuffleChimeIncludeTowns": false, - "GameMode": 0, - "MapGenSeed": 0, - "ReplacementMap": null, - "ResourcePack": null, - "ShopKillMode_Weapons": 0, - "ShopKillMode_Armor": 0, - "ShopKillMode_Item": 0, - "ShopKillMode_Black": 0, - "ShopKillMode_White": 0, - "ShopKillFactor_Weapons": 0, - "ShopKillFactor_Armor": 0, - "ShopKillFactor_Item": 0, - "ShopKillFactor_Black": 0, - "ShopKillFactor_White": 0, - "ShopKillExcludeConeria_Weapons": false, - "ShopKillExcludeConeria_Armor": false, - "ShopKillExcludeConeria_Item": false, - "ShopKillExcludeConeria_Black": false, - "ShopKillExcludeConeria_White": false, - "ExcludeGoldFromScaling": false, - "CheapVendorItem": false, - "StartingLevel": 0, - "TransmooglifierVariance": 0, - "MaxLevelLow": 50, - "MaxLevelHigh": 50, - "Spoilers": false, - "TournamentSafe": true, - "BlindSeed": false, - "Shops": true, - "Treasures": true, - "ChestsKeyItems": true, - "NPCItems": true, - "NPCFetchItems": true, - "RandomWares": false, - "RandomWaresIncludesSpecialGear": false, - "RandomLoot": false, - "ShardHunt": true, - "ShardCount": 3, - "OrbsRequiredCount": 4, - "OrbsRequiredMode": 0, - "OrbsRequiredSpoilers": false, - "TransformFinalFormation": 0, - "ChaosRush": false, - "ToFRMode": 1, - "FiendsRefights": 0, - "ExitToFR": true, - "ChaosFloorEncounters": false, - "MagicShops": false, - "MagicShopLocs": false, - "MagicShopLocationPairs": false, - "MagicLevels": true, - "MagicPermissions": false, - "Weaponizer": false, - "WeaponizerNamesUseQualityOnly": false, - "WeaponizerCommonWeaponsHavePowers": false, - "ArmorCrafter": false, - "MagicLevelsTiered": false, - "MagicLevelsMixed": false, - "MagicAutohitThreshold": 0, - "Rng": true, - "FixMissingBattleRngEntry": false, - "EncounterPrng": false, - "UnrunnableShuffle": true, - "UnrunnablesLow": 0, - "UnrunnablesHigh": 0, - "EnemyFormationsSurprise": true, - "UnrunnablesStrikeFirstAndSurprise": false, - "EnemyTrapTiles": 3, - "TCFormations": 2, - "TCBetterTreasure": 0, - "TCKeyItems": 2, - "TCShards": 2, - "TCExcludeCommons": false, - "TCChestCount": 0, - "TCProtectIncentives": false, - "TCMasaGuardian": false, - "TrappedChaos": false, - "TCIndicator": true, - "SwolePirates": false, - "ShuffleScriptsEnemies": true, - "RemoveBossScripts": false, - "ShuffleScriptsBosses": false, - "ShuffleSkillsSpellsEnemies": true, - "ShuffleSkillsSpellsBosses": false, - "NoConsecutiveNukes": false, - "TranceHasStatusElement": true, - "EnemySkillsSpellsTiered": false, - "AllowUnsafePirates": false, - "AllowUnsafeMelmond": false, - "WarMECHMode": 1, - "OrdealsPillars": true, - "ShuffleLavaTiles": false, - "SkyCastle4FMazeMode": 0, - "TitansTrove": true, - "LefeinSuperStore": true, - "LefeinShops": true, - "RandomVampAttack": false, - "RandomVampAttackIncludesConeria": false, - "FightBahamut": false, - "SwoleBahamut": false, - "SwoleAstos": false, - "ConfusedOldMen": false, - "GaiaShortcut": true, - "DamageTileLow": 1, - "DamageTileHigh": 1, - "OWDamageTiles": false, - "DamageTilesKill": false, - "ArmorResistsDamageTileDamage": false, - "MoveGaiaItemShop": true, - "ShufflePravokaShops": false, - "FlipDungeons": false, - "VerticallyFlipDungeons": false, - "SpookyFlag": false, - "DraculasFlag": false, - "MapOpenProgression": true, - "MapOpenProgressionDocks": false, - "Entrances": false, - "Towns": false, - "IncludeConeria": false, - "Floors": false, - "AllowDeepCastles": false, - "AllowDeepTowns": false, - "MapOpenProgressionExtended": true, - "MapAirshipDock": false, - "MapBahamutCardiaDock": false, - "MapLefeinRiver": false, - "MapBridgeLefein": false, - "MapRiverToMelmond": true, - "MapGaiaMountainPass": false, - "MapHighwayToOrdeals": false, - "MapDragonsHoard": false, - "MapHallOfDragons": false, - "EntrancesIncludesDeadEnds": false, - "EntrancesMixedWithTowns": false, - "IncentivizeFreeNPCs": true, - "IncentivizeFetchNPCs": true, - "IncentivizeTail": true, - "IncentivizeMainItems": true, - "IncentivizeFetchItems": true, - "IncentivizeCanoeItem": true, - "IncentivizeAirship": true, - "IncentivizeShipAndCanal": true, - "IncentivizeBridgeItem": false, - "IncentivizeMarsh": false, - "IncentivizeEarth": true, - "IncentivizeVolcano": true, - "IncentivizeIceCave": false, - "IncentivizeOrdeals": true, - "IncentivizeSeaShrine": true, - "IncentivizeConeria": true, - "IncentivizeMarshKeyLocked": false, - "IncentivizeSkyPalace": true, - "IncentivizeTitansTrove": true, - "IncentivizeCardia": true, - "IceCaveIncentivePlacementType": 0, - "OrdealsIncentivePlacementType": 1, - "MarshIncentivePlacementType": 0, - "TitansIncentivePlacementType": 1, - "EarthIncentivePlacementType": 3, - "VolcanoIncentivePlacementType": 2, - "SeaShrineIncentivePlacementType": 3, - "SkyPalaceIncentivePlacementType": 3, - "CorneriaIncentivePlacementType": 0, - "MarshLockedIncentivePlacementType": 0, - "CardiaIncentivePlacementType": 1, - "BetterTrapChests": false, - "IncentivizeMasamune": false, - "IncentivizeKatana": false, - "IncentivizeXcalber": true, - "IncentivizeVorpal": false, - "IncentivizeOpal": false, - "IncentivizeRibbon": false, - "IncentivizeDefCastArmor": false, - "IncentivizeOffCastArmor": false, - "IncentivizeOtherCastArmor": true, - "IncentivizePowerRod": false, - "IncentivizeDefCastWeapon": true, - "IncentivizeOffCastWeapon": false, - "IncentivizeOtherCastWeapon": false, - "LooseExcludePlacedDungeons": false, - "EarlyKing": true, - "EarlySarda": true, - "EarlySage": true, - "EarlyOrdeals": true, - "ShuffleObjectiveNPCs": false, - "OnlyRequireGameIsBeatable": false, - "FreeBridge": true, - "FreeShip": false, - "FreeAirship": false, - "FreeLute": false, - "FreeRod": false, - "EnableCritNumberDisplay": true, - "FreeCanal": false, - "FreeCanoe": false, - "EasyMode": false, - "HousesFillHp": true, - "SpeedHacks": true, - "NoPartyShuffle": true, - "Dash": true, - "SpeedBoat": true, - "AirBoat": true, - "BuyTen": true, - "IdentifyTreasures": true, - "ShopInfo": true, - "ChestInfo": true, - "IncentiveChestItemsFanfare": true, - "WaitWhenUnrunnable": true, - "ImprovedClinic": false, - "Etherizer": false, - "HouseMPRestoration": true, - "WeaponStats": true, - "BBCritRate": false, - "WeaponCritRate": true, - "WeaponBonuses": true, - "ThiefAgilityBuff": 1, - "SkyWarriorSpoilerBats": 1, - "SpoilerBatsDontCheckOrbs": true, - "MoveToFBats": false, - "WeaponTypeBonusValue": 42, - "ChanceToRun": 1, - "SpellBugs": true, - "BlackBeltAbsorb": true, - "NPCSwatter": true, - "BattleMagicMenuWrapAround": true, - "MagicMenuSpellReordering": true, - "InventoryAutosort": true, - "RepeatedHealPotionUse": false, - "AutoRetargeting": true, - "EnemyStatusAttackBug": true, - "ImproveTurnOrderRandomization": true, - "FixHitChanceCap": true, - "MelmondClinic": false, - "DDProgressiveTilesets": false, - "DDFiendOrbs": false, - "TailBahamutMode": 0, - "StartingGold": 3, - "IncludeMorale": false, - "DeadsGainXP": false, - "NonesGainXP": false, - "NoTail": false, - "NoFloater": false, - "GuaranteedMasamune": false, - "SendMasamuneHome": false, - "MoreConsumableChests": 0, - "NoMasamune": false, - "NoXcalber": false, - "ClassAsNpcFiends": false, - "ClassAsNpcKeyNPC": false, - "ClassAsNpcCount": 6, - "ClassAsNpcDuplicate": false, - "ClassAsNpcForcedFiends": false, - "ClassAsNpcPromotion": false, - "BossScaleStatsLow": 130, - "BossScaleStatsHigh": 170, - "BossScaleHpLow": 160, - "BossScaleHpHigh": 170, - "EnemyScaleStatsLow": 90, - "EnemyScaleStatsHigh": 130, - "EnemyScaleHpLow": 50, - "EnemyScaleHpHigh": 150, - "PriceScaleFactorLow": 50, - "PriceScaleFactorHigh": 200, - "ExpMultiplier": 2.5, - "ExpBonus": 150, - "ExpMultiplierFighter": 1.1, - "ExpMultiplierThief": 1.1, - "ExpMultiplierBlackBelt": 1, - "ExpMultiplierRedMage": 1, - "ExpMultiplierWhiteMage": 1, - "ExpMultiplierBlackMage": 1, - "EncounterRate": 12, - "DungeonEncounterRate": 15, - "ProgressiveScaleMode": 11, - "StartingItemSet": 4, - "ConsumableTreasureStackSize": 2, - "FIGHTER1": true, - "THIEF1": true, - "BLACK_BELT1": true, - "RED_MAGE1": false, - "WHITE_MAGE1": false, - "BLACK_MAGE1": false, - "FIGHTER2": true, - "THIEF2": true, - "BLACK_BELT2": false, - "RED_MAGE2": true, - "WHITE_MAGE2": true, - "BLACK_MAGE2": true, - "FIGHTER3": false, - "THIEF3": false, - "BLACK_BELT3": false, - "RED_MAGE3": false, - "WHITE_MAGE3": false, - "BLACK_MAGE3": false, - "FIGHTER4": false, - "THIEF4": false, - "BLACK_BELT4": false, - "RED_MAGE4": true, - "WHITE_MAGE4": true, - "BLACK_MAGE4": true, - "KNIGHT1": false, - "KNIGHT2": false, - "KNIGHT3": false, - "KNIGHT4": false, - "NINJA1": false, - "NINJA2": false, - "NINJA3": false, - "NINJA4": false, - "MASTER1": false, - "MASTER2": false, - "MASTER3": false, - "MASTER4": false, - "RED_WIZ1": false, - "RED_WIZ2": false, - "RED_WIZ3": false, - "RED_WIZ4": false, - "WHITE_WIZ1": false, - "WHITE_WIZ2": false, - "WHITE_WIZ3": false, - "WHITE_WIZ4": false, - "BLACK_WIZ1": false, - "BLACK_WIZ2": false, - "BLACK_WIZ3": false, - "BLACK_WIZ4": false, - "NONE_CLASS2": true, - "NONE_CLASS3": true, - "NONE_CLASS4": true, - "FORCED1": true, - "FORCED2": true, - "FORCED3": true, - "FORCED4": false, - "DraftFighter": false, - "DraftThief": false, - "DraftBlackBelt": false, - "DraftRedMage": false, - "DraftWhiteMage": false, - "DraftBlackMage": false, - "DraftKnight": false, - "DraftNinja": false, - "DraftMaster": false, - "DraftRedWiz": false, - "DraftWhiteWiz": false, - "DraftBlackWiz": false, - "TAVERN1": true, - "TAVERN2": true, - "TAVERN3": false, - "TAVERN4": true, - "TAVERN5": true, - "TAVERN6": true, - "WeaponPermissions": false, - "ArmorPermissions": false, - "RecruitmentMode": true, - "RecruitmentModeHireOnly": false, - "RecruitmentModeReplaceOnlyNone": true, - "ClampMinimumStatScale": false, - "ClampMinimumBossStatScale": false, - "ClampMinimumPriceScale": false, - "EFGWaterfall": false, - "FiendShuffle": false, - "DisableTentSaving": false, - "DisableInnSaving": false, - "SaveGameWhenGameOver": false, - "SaveGameDWMode": false, - "ShuffleAstos": false, - "UnsafeAstos": false, - "RandomizeEnemizer": false, - "RandomizeFormationEnemizer": false, - "GenerateNewSpellbook": false, - "SpellcrafterMixSpells": false, - "ThiefHitRate": true, - "AllSpellLevelsForKnightNinja": false, - "BuffHealingSpells": true, - "IntAffectsSpells": false, - "AddDamageTiles": false, - "DamageTilesCastles": false, - "DamageTilesDungeons": false, - "DamageTilesCaves": false, - "DamageTilesTowns": false, - "DamageTilesTof": false, - "DamageTilesQuantity": 1, - "FreeTail": false, - "HintsVillage": false, - "SpellcrafterRetainPermissions": false, - "RandomWeaponBonus": true, - "RandomArmorBonus": true, - "RandomWeaponBonusExcludeMasa": false, - "RandomWeaponBonusLow": 2, - "RandomWeaponBonusHigh": 5, - "RandomArmorBonusLow": 2, - "RandomArmorBonusHigh": 5, - "SeparateBossHPScaling": true, - "SeparateEnemyHPScaling": false, - "ClampBossHPScaling": false, - "ClampEnemyHpScaling": false, - "PoolSize": 2, - "EnablePoolParty": false, - "SafePoolParty": false, - "IncludePromClasses": false, - "EnableRandomPromotions": false, - "IncludeBaseClasses": false, - "RandomPromotionsSpoilers": false, - "RandomizeClassCasting": true, - "RandomizeClassKeyItems": false, - "RandomizeClassIncludeXpBonus": false, - "AlternateFiends": false, - "FinalFantasy2Fiends": false, - "FinalFantasy3Fiends": false, - "FinalFantasy4Fiends": false, - "FinalFantasy5Fiends": false, - "FinalFantasy6Fiends": false, - "FinalFantasy1BonusFiends": false, - "BlackOrbFiends": false, - "NoBossSkillScriptShuffle": false, - "MooglieWeaponBalance": false, - "GuaranteeCustomClassComposition": false, - "LegendaryWeaponShop": false, - "LegendaryArmorShop": false, - "LegendaryBlackShop": false, - "LegendaryWhiteShop": false, - "LegendaryItemShop": false, - "ExclusiveLegendaryWeaponShop": false, - "ExclusiveLegendaryArmorShop": false, - "ExclusiveLegendaryBlackShop": false, - "ExclusiveLegendaryWhiteShop": false, - "ExclusiveLegendaryItemShop": false, - "RandomizeClassMode": 1, - "RandomizeClassMaxBonus": 1, - "RandomizeClassMaxMalus": 0, - "EarlierHighTierMagic": false, - "ChangeMaxMP": false, - "RedMageMaxMP": 9, - "WhiteMageMaxMP": 9, - "BlackMageMaxMP": 9, - "KnightMaxMP": 4, - "NinjaMaxMP": 4, - "Knightlvl4": true, - "PinkMage": false, - "BlackKnight": true, - "BlackKnightKeep": false, - "WhiteNinja": true, - "WhiteNinjaKeep": true, - "MpGainOnMaxGainMode": 0, - "LockMode": 3, - "MDefMode": 0, - "FormationShuffleMode": 1, - "RandomizeTreasure": 0, - "OpenChestsInOrder": false, - "SetRNG": false, - "WorldWealth": 1, - "DeepDungeonGenerator": 0, - "EvadeCap": 3, - "AllowUnsafeStartArea": false, - "IncreaseDarkPenalty": true, - "IncreaseRegeneration": false, - "PoisonMode": 6, - "PoisonSetDamageValue": 3, - "TouchIncludeBosses": true, - "Lockpicking": true, - "ReducedLuck": false, - "LockpickingLevelRequirement": 22, - "WhiteMageHarmEveryone": true, - "ProcgenEarth": false, - "LoosePlacementMode": 0 - } + "Flags": { + "StartingEquipmentMasamune": false, + "StartingEquipmentKatana": false, + "StartingEquipmentHealStaff": false, + "StartingEquipmentZeusGauntlet": false, + "StartingEquipmentWhiteShirt": false, + "StartingEquipmentRibbon": false, + "StartingEquipmentDragonslayer": false, + "StartingEquipmentLegendKit": false, + "StartingEquipmentRandomEndgameWeapon": false, + "StartingEquipmentRandomAoe": false, + "StartingEquipmentRandomCasterItem": false, + "StartingEquipmentGrandpasSecretStash": false, + "StartingEquipmentOneItem": false, + "StartingEquipmentRandomCrap": false, + "StartingEquipmentStarterPack": false, + "StartingEquipmentRandomTypeWeapon": false, + "StartingEquipmentRemoveFromPool": false, + "StartingEquipmentNoDuplicates": false, + "ReversedFloors": false, + "BuffTier1DamageSpells": true, + "NoEmptyScripts": false, + "LaterLoose": false, + "MermaidPrison": true, + "GuaranteedDefenseItem": 3, + "GuaranteedPowerItem": 0, + "ScriptMultiplier": 1, + "TouchMultiplier": 2, + "TouchPool": 1, + "TouchMode": 0, + "RibbonMode": 0, + "Archipelago": false, + "ArchipelagoGold": false, + "ArchipelagoConsumables": false, + "ArchipelagoShards": false, + "ArchipelagoEquipment": 0, + "ItemMagicMode": 0, + "ItemMagicPool": 0, + "MagisizeWeapons": false, + "DisableMinimap": false, + "LooseItemsForwardPlacement": false, + "LooseItemsSpreadPlacement": false, + "LooseItemsNpcBalance": false, + "AllowUnsafePlacement": true, + "ShipCanalBeforeFloater": false, + "ExpChestConversionMin": 10, + "ExpChestConversionMax": 10, + "ExpChestMinReward": 3000, + "ExpChestMaxReward": 3000, + "SpellNameMadness": 0, + "ExtConsumableSet": 0, + "EnableSoftInBattle": true, + "EnableLifeInBattle": 0, + "NormalShopsHaveExtConsumables": false, + "LegendaryShopHasExtConsumables": false, + "ExtConsumableTreasureStackSize": 0, + "ExtStartingItemSet": 0, + "ExtConsumableChests": 0, + "OwMapExchange": 0, + "OwShuffledAccess": false, + "OwUnsafeStart": false, + "OwRandomPregen": false, + "RelocateChests": false, + "RelocateChestsTrapIndicator": false, + "ShuffleChimeAccess": true, + "ShuffleChimeIncludeTowns": false, + "GameMode": 0, + "MapGenSeed": 0, + "ReplacementMap": null, + "ResourcePack": null, + "ShopKillMode_Weapons": 0, + "ShopKillMode_Armor": 0, + "ShopKillMode_Item": 0, + "ShopKillMode_Black": 0, + "ShopKillMode_White": 0, + "ShopKillFactor_Weapons": 0, + "ShopKillFactor_Armor": 0, + "ShopKillFactor_Item": 0, + "ShopKillFactor_Black": 0, + "ShopKillFactor_White": 0, + "ShopKillExcludeConeria_Weapons": false, + "ShopKillExcludeConeria_Armor": false, + "ShopKillExcludeConeria_Item": false, + "ShopKillExcludeConeria_Black": false, + "ShopKillExcludeConeria_White": false, + "ExcludeGoldFromScaling": false, + "CheapVendorItem": false, + "StartingLevel": 0, + "TransmooglifierVariance": 0, + "MaxLevelLow": 50, + "MaxLevelHigh": 50, + "Spoilers": false, + "TriState": false, + "TournamentSafe": true, + "BlindSeed": false, + "Shops": true, + "Treasures": true, + "ChestsKeyItems": true, + "NPCItems": true, + "NPCFetchItems": true, + "RandomWares": false, + "RandomWaresIncludesSpecialGear": false, + "RandomLoot": false, + "ShardHunt": true, + "ShardCount": 3, + "OrbsRequiredCount": 4, + "OrbsRequiredMode": 0, + "OrbsRequiredSpoilers": false, + "TransformFinalFormation": 0, + "ChaosRush": false, + "ToFRMode": 1, + "FiendsRefights": 0, + "ExitToFR": true, + "ChaosFloorEncounters": false, + "MagicShops": false, + "MagicShopLocs": false, + "MagicShopLocationPairs": false, + "MagicLevels": true, + "MagicPermissions": false, + "Weaponizer": false, + "WeaponizerNamesUseQualityOnly": false, + "WeaponizerCommonWeaponsHavePowers": false, + "ArmorCrafter": false, + "MagicLevelsTiered": false, + "MagicLevelsMixed": false, + "MagicAutohitThreshold": 0, + "Rng": true, + "FixMissingBattleRngEntry": false, + "EncounterPrng": false, + "UnrunnableShuffle": true, + "UnrunnablesLow": 0, + "UnrunnablesHigh": 0, + "EnemyFormationsSurprise": true, + "UnrunnablesStrikeFirstAndSurprise": false, + "EnemyTrapTiles": 3, + "TCFormations": 2, + "TCBetterTreasure": 0, + "TCKeyItems": 2, + "TCShards": 2, + "TCExcludeCommons": false, + "TCChestCount": 0, + "TCProtectIncentives": false, + "TCMasaGuardian": false, + "TrappedChaos": false, + "TCIndicator": true, + "SwolePirates": false, + "ShuffleScriptsEnemies": true, + "RemoveBossScripts": false, + "ShuffleScriptsBosses": false, + "ShuffleSkillsSpellsEnemies": true, + "ShuffleSkillsSpellsBosses": false, + "NoConsecutiveNukes": false, + "TranceHasStatusElement": true, + "EnemySkillsSpellsTiered": false, + "AllowUnsafePirates": false, + "AllowUnsafeMelmond": false, + "WarMECHMode": 1, + "OrdealsPillars": true, + "ShuffleLavaTiles": false, + "SkyCastle4FMazeMode": 0, + "TitansTrove": true, + "LefeinShortcut": false, + "LefeinSuperStore": true, + "LefeinShops": true, + "RandomVampAttack": false, + "RandomVampAttackIncludesConeria": false, + "FightBahamut": false, + "SwoleBahamut": false, + "SwoleAstos": false, + "ConfusedOldMen": false, + "GaiaShortcut": true, + "DamageTileLow": 1, + "DamageTileHigh": 1, + "OWDamageTiles": false, + "DamageTilesKill": false, + "ArmorResistsDamageTileDamage": false, + "MoveGaiaItemShop": true, + "ShufflePravokaShops": false, + "FlipDungeons": false, + "VerticallyFlipDungeons": false, + "SpookyFlag": false, + "DraculasFlag": false, + "MapOpenProgression": true, + "MapOpenProgressionDocks": false, + "Entrances": false, + "Towns": false, + "IncludeConeria": false, + "Floors": false, + "AllowDeepCastles": false, + "AllowDeepTowns": false, + "MapOpenProgressionExtended": true, + "MapAirshipDock": false, + "MapBahamutCardiaDock": false, + "MapLefeinRiver": false, + "MapBridgeLefein": false, + "MapRiverToMelmond": true, + "MapGaiaMountainPass": false, + "MapHighwayToOrdeals": false, + "MapDragonsHoard": false, + "MapHallOfDragons": false, + "EntrancesIncludesDeadEnds": false, + "EntrancesMixedWithTowns": false, + "IncentivizeFreeNPCs": true, + "IncentivizeFetchNPCs": true, + "IncentivizeTail": true, + "IncentivizeMainItems": true, + "IncentivizeFetchItems": true, + "IncentivizeCanoeItem": true, + "IncentivizeAirship": true, + "IncentivizeShipAndCanal": true, + "IncentivizeBridgeItem": false, + "IncentivizeMarsh": false, + "IncentivizeEarth": true, + "IncentivizeVolcano": true, + "IncentivizeIceCave": false, + "IncentivizeOrdeals": true, + "IncentivizeSeaShrine": true, + "IncentivizeConeria": true, + "IncentivizeMarshKeyLocked": false, + "IncentivizeSkyPalace": true, + "IncentivizeTitansTrove": true, + "IncentivizeCardia": true, + "IceCaveIncentivePlacementType": 0, + "OrdealsIncentivePlacementType": 1, + "MarshIncentivePlacementType": 0, + "TitansIncentivePlacementType": 1, + "EarthIncentivePlacementType": 3, + "VolcanoIncentivePlacementType": 2, + "SeaShrineIncentivePlacementType": 3, + "SkyPalaceIncentivePlacementType": 3, + "CorneriaIncentivePlacementType": 0, + "MarshLockedIncentivePlacementType": 0, + "CardiaIncentivePlacementType": 1, + "BetterTrapChests": false, + "IncentivizeMasamune": false, + "IncentivizeKatana": false, + "IncentivizeXcalber": true, + "IncentivizeVorpal": false, + "IncentivizeOpal": false, + "IncentivizeRibbon": false, + "IncentivizeDefCastArmor": false, + "IncentivizeOffCastArmor": false, + "IncentivizeOtherCastArmor": true, + "IncentivizePowerRod": false, + "IncentivizeDefCastWeapon": true, + "IncentivizeOffCastWeapon": false, + "IncentivizeOtherCastWeapon": false, + "LooseExcludePlacedDungeons": false, + "EarlyKing": true, + "EarlySarda": true, + "EarlySage": true, + "EarlyOrdeals": true, + "ShuffleObjectiveNPCs": false, + "OnlyRequireGameIsBeatable": false, + "FreeBridge": true, + "FreeShip": false, + "FreeAirship": false, + "FreeLute": false, + "FreeRod": false, + "EnableCritNumberDisplay": true, + "FreeCanal": false, + "FreeCanoe": false, + "EasyMode": false, + "HousesFillHp": true, + "SpeedHacks": true, + "NoPartyShuffle": true, + "Dash": true, + "SpeedBoat": true, + "AirBoat": true, + "BuyTen": true, + "IdentifyTreasures": true, + "ShopInfo": true, + "ChestInfo": true, + "IncentiveChestItemsFanfare": true, + "WaitWhenUnrunnable": true, + "ImprovedClinic": false, + "Etherizer": false, + "HouseMPRestoration": true, + "WeaponStats": true, + "BBCritRate": false, + "WeaponCritRate": true, + "WeaponBonuses": true, + "ThiefAgilityBuff": 1, + "SkyWarriorSpoilerBats": 1, + "SpoilerBatsDontCheckOrbs": true, + "MoveToFBats": false, + "WeaponTypeBonusValue": 42, + "ChanceToRun": 1, + "SpellBugs": true, + "BlackBeltAbsorb": true, + "NPCSwatter": true, + "BattleMagicMenuWrapAround": true, + "MagicMenuSpellReordering": true, + "InventoryAutosort": true, + "RepeatedHealPotionUse": false, + "AutoRetargeting": true, + "EnemyStatusAttackBug": true, + "ImproveTurnOrderRandomization": true, + "FixHitChanceCap": true, + "MelmondClinic": false, + "DDProgressiveTilesets": false, + "DDFiendOrbs": false, + "TailBahamutMode": 0, + "StartingGold": 3, + "IncludeMorale": false, + "DeadsGainXP": false, + "NonesGainXP": false, + "NoTail": false, + "NoFloater": false, + "GuaranteedMasamune": false, + "SendMasamuneHome": false, + "MoreConsumableChests": 0, + "NoMasamune": false, + "NoXcalber": false, + "ClassAsNpcFiends": false, + "ClassAsNpcKeyNPC": false, + "ClassAsNpcCount": 6, + "ClassAsNpcDuplicate": false, + "ClassAsNpcForcedFiends": false, + "ClassAsNpcPromotion": false, + "BossScaleStatsLow": 130, + "BossScaleStatsHigh": 170, + "BossScaleHpLow": 160, + "BossScaleHpHigh": 170, + "EnemyScaleStatsLow": 90, + "EnemyScaleStatsHigh": 130, + "EnemyScaleHpLow": 50, + "EnemyScaleHpHigh": 150, + "PriceScaleFactorLow": 50, + "PriceScaleFactorHigh": 200, + "ExpMultiplier": 2.5, + "ExpBonus": 150, + "ExpMultiplierFighter": 1.1, + "ExpMultiplierThief": 1.1, + "ExpMultiplierBlackBelt": 1, + "ExpMultiplierRedMage": 1, + "ExpMultiplierWhiteMage": 1, + "ExpMultiplierBlackMage": 1, + "EncounterRate": 12, + "DungeonEncounterRate": 15, + "ProgressiveScaleMode": 11, + "StartingItemSet": 4, + "ConsumableTreasureStackSize": 2, + "FIGHTER1": true, + "THIEF1": true, + "BLACK_BELT1": true, + "RED_MAGE1": false, + "WHITE_MAGE1": false, + "BLACK_MAGE1": false, + "FIGHTER2": true, + "THIEF2": true, + "BLACK_BELT2": false, + "RED_MAGE2": true, + "WHITE_MAGE2": true, + "BLACK_MAGE2": true, + "FIGHTER3": false, + "THIEF3": false, + "BLACK_BELT3": false, + "RED_MAGE3": false, + "WHITE_MAGE3": false, + "BLACK_MAGE3": false, + "FIGHTER4": false, + "THIEF4": false, + "BLACK_BELT4": false, + "RED_MAGE4": true, + "WHITE_MAGE4": true, + "BLACK_MAGE4": true, + "KNIGHT1": false, + "KNIGHT2": false, + "KNIGHT3": false, + "KNIGHT4": false, + "NINJA1": false, + "NINJA2": false, + "NINJA3": false, + "NINJA4": false, + "MASTER1": false, + "MASTER2": false, + "MASTER3": false, + "MASTER4": false, + "RED_WIZ1": false, + "RED_WIZ2": false, + "RED_WIZ3": false, + "RED_WIZ4": false, + "WHITE_WIZ1": false, + "WHITE_WIZ2": false, + "WHITE_WIZ3": false, + "WHITE_WIZ4": false, + "BLACK_WIZ1": false, + "BLACK_WIZ2": false, + "BLACK_WIZ3": false, + "BLACK_WIZ4": false, + "NONE_CLASS2": true, + "NONE_CLASS3": true, + "NONE_CLASS4": true, + "FORCED1": true, + "FORCED2": true, + "FORCED3": true, + "FORCED4": false, + "DraftFighter": false, + "DraftThief": false, + "DraftBlackBelt": false, + "DraftRedMage": false, + "DraftWhiteMage": false, + "DraftBlackMage": false, + "DraftKnight": false, + "DraftNinja": false, + "DraftMaster": false, + "DraftRedWiz": false, + "DraftWhiteWiz": false, + "DraftBlackWiz": false, + "TAVERN1": true, + "TAVERN2": true, + "TAVERN3": false, + "TAVERN4": true, + "TAVERN5": true, + "TAVERN6": true, + "WeaponPermissions": false, + "ArmorPermissions": false, + "RecruitmentMode": true, + "RecruitmentModeHireOnly": false, + "RecruitmentModeReplaceOnlyNone": true, + "ClampMinimumStatScale": false, + "ClampMinimumBossStatScale": false, + "ClampMinimumPriceScale": false, + "FiendShuffle": false, + "DisableTentSaving": false, + "DisableInnSaving": false, + "SaveGameWhenGameOver": false, + "SaveGameDWMode": false, + "ShuffleAstos": false, + "UnsafeAstos": false, + "RandomizeEnemizer": false, + "RandomizeFormationEnemizer": false, + "GenerateNewSpellbook": false, + "SpellcrafterMixSpells": false, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, + "AllSpellLevelsForKnightNinja": false, + "BuffHealingSpells": true, + "IntAffectsSpells": false, + "AddDamageTiles": false, + "DamageTilesCastles": false, + "DamageTilesDungeons": false, + "DamageTilesCaves": false, + "DamageTilesTowns": false, + "DamageTilesTof": false, + "DamageTilesQuantity": 1, + "FreeTail": false, + "HintsVillage": false, + "SpellcrafterRetainPermissions": false, + "RandomWeaponBonus": true, + "RandomArmorBonus": true, + "RandomWeaponBonusExcludeMasa": false, + "RandomWeaponBonusLow": 2, + "RandomWeaponBonusHigh": 5, + "RandomArmorBonusLow": 2, + "RandomArmorBonusHigh": 5, + "SeparateBossHPScaling": true, + "SeparateEnemyHPScaling": false, + "ClampBossHPScaling": false, + "ClampEnemyHpScaling": false, + "PoolSize": 2, + "EnablePoolParty": false, + "SafePoolParty": false, + "IncludePromClasses": false, + "EnableRandomPromotions": false, + "IncludeBaseClasses": false, + "RandomPromotionsSpoilers": false, + "RandomizeClassCasting": true, + "RandomizeClassKeyItems": false, + "RandomizeClassIncludeXpBonus": false, + "AlternateFiends": false, + "FinalFantasy2Fiends": false, + "FinalFantasy3Fiends": false, + "FinalFantasy4Fiends": false, + "FinalFantasy5Fiends": false, + "FinalFantasy6Fiends": false, + "FinalFantasy1BonusFiends": false, + "BlackOrbFiends": false, + "NoBossSkillScriptShuffle": false, + "MooglieWeaponBalance": false, + "GuaranteeCustomClassComposition": false, + "LegendaryWeaponShop": false, + "LegendaryArmorShop": false, + "LegendaryBlackShop": false, + "LegendaryWhiteShop": false, + "LegendaryItemShop": false, + "ExclusiveLegendaryWeaponShop": false, + "ExclusiveLegendaryArmorShop": false, + "ExclusiveLegendaryBlackShop": false, + "ExclusiveLegendaryWhiteShop": false, + "ExclusiveLegendaryItemShop": false, + "RandomizeClassMode": 1, + "RandomizeClassMaxBonus": 1, + "RandomizeClassMaxMalus": 0, + "EarlierHighTierMagic": false, + "ChangeMaxMP": false, + "RedMageMaxMP": 9, + "WhiteMageMaxMP": 9, + "BlackMageMaxMP": 9, + "KnightMaxMP": 4, + "NinjaMaxMP": 4, + "Knightlvl4": true, + "PinkMage": false, + "BlackKnight": true, + "BlackKnightKeep": false, + "WhiteNinja": true, + "WhiteNinjaKeep": true, + "MpGainOnMaxGainMode": 0, + "LockMode": 3, + "MDefMode": 0, + "FormationShuffleMode": 1, + "RandomizeTreasure": 0, + "OpenChestsInOrder": false, + "SetRNG": false, + "WorldWealth": 1, + "DeepDungeonGenerator": 0, + "EvadeCap": 3, + "AllowUnsafeStartArea": false, + "IncreaseDarkPenalty": true, + "IncreaseRegeneration": false, + "PoisonMode": 6, + "PoisonSetDamageValue": 3, + "TouchIncludeBosses": true, + "Lockpicking": true, + "ReducedLuck": false, + "LockpickingLevelRequirement": 22, + "WhiteMageHarmEveryone": true, + "ProcgenEarth": false, + "LoosePlacementMode": 0 + } } diff --git a/FF1Blazorizer/wwwroot/presets/wt2025r64.json b/FF1Blazorizer/wwwroot/presets/wt2025r64.json index eb79561ee..4e1ffeb4d 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r64.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r64.json @@ -1,532 +1,534 @@ { "Name": "Winter Tournament 2025 Round of 64", - "Flags": { - "StartingEquipmentMasamune": false, - "StartingEquipmentKatana": false, - "StartingEquipmentHealStaff": false, - "StartingEquipmentZeusGauntlet": false, - "StartingEquipmentWhiteShirt": false, - "StartingEquipmentRibbon": false, - "StartingEquipmentDragonslayer": false, - "StartingEquipmentLegendKit": false, - "StartingEquipmentRandomEndgameWeapon": false, - "StartingEquipmentRandomAoe": false, - "StartingEquipmentRandomCasterItem": false, - "StartingEquipmentGrandpasSecretStash": false, - "StartingEquipmentOneItem": false, - "StartingEquipmentRandomCrap": false, - "StartingEquipmentStarterPack": false, - "StartingEquipmentRandomTypeWeapon": false, - "StartingEquipmentRemoveFromPool": false, - "StartingEquipmentNoDuplicates": false, - "ReversedFloors": false, - "BuffTier1DamageSpells": true, - "NoEmptyScripts": false, - "LaterLoose": false, - "MermaidPrison": true, - "GuaranteedDefenseItem": 3, - "GuaranteedPowerItem": 0, - "ScriptMultiplier": 1, - "TouchMultiplier": 2, - "TouchPool": 1, - "TouchMode": 0, - "RibbonMode": 0, - "Archipelago": false, - "ArchipelagoGold": false, - "ArchipelagoConsumables": false, - "ArchipelagoShards": false, - "ArchipelagoEquipment": 0, - "ItemMagicMode": 0, - "ItemMagicPool": 0, - "MagisizeWeapons": false, - "DisableMinimap": false, - "LooseItemsForwardPlacement": false, - "LooseItemsSpreadPlacement": false, - "LooseItemsNpcBalance": false, - "AllowUnsafePlacement": true, - "ShipCanalBeforeFloater": false, - "ExpChestConversionMin": 10, - "ExpChestConversionMax": 10, - "ExpChestMinReward": 3000, - "ExpChestMaxReward": 3000, - "SpellNameMadness": 0, - "ExtConsumableSet": 0, - "EnableSoftInBattle": true, - "EnableLifeInBattle": 0, - "NormalShopsHaveExtConsumables": false, - "LegendaryShopHasExtConsumables": false, - "ExtConsumableTreasureStackSize": 0, - "ExtStartingItemSet": 0, - "ExtConsumableChests": 0, - "OwMapExchange": 0, - "OwShuffledAccess": false, - "OwUnsafeStart": false, - "OwRandomPregen": false, - "RelocateChests": false, - "RelocateChestsTrapIndicator": false, - "ShuffleChimeAccess": true, - "ShuffleChimeIncludeTowns": false, - "GameMode": 0, - "MapGenSeed": 0, - "ReplacementMap": null, - "ResourcePack": null, - "ShopKillMode_Weapons": 0, - "ShopKillMode_Armor": 0, - "ShopKillMode_Item": 0, - "ShopKillMode_Black": 0, - "ShopKillMode_White": 0, - "ShopKillFactor_Weapons": 0, - "ShopKillFactor_Armor": 0, - "ShopKillFactor_Item": 0, - "ShopKillFactor_Black": 0, - "ShopKillFactor_White": 0, - "ShopKillExcludeConeria_Weapons": false, - "ShopKillExcludeConeria_Armor": false, - "ShopKillExcludeConeria_Item": false, - "ShopKillExcludeConeria_Black": false, - "ShopKillExcludeConeria_White": false, - "ExcludeGoldFromScaling": false, - "CheapVendorItem": false, - "StartingLevel": 0, - "TransmooglifierVariance": 0, - "MaxLevelLow": 50, - "MaxLevelHigh": 50, - "Spoilers": false, - "TournamentSafe": true, - "BlindSeed": false, - "Shops": true, - "Treasures": true, - "ChestsKeyItems": true, - "NPCItems": true, - "NPCFetchItems": true, - "RandomWares": false, - "RandomWaresIncludesSpecialGear": false, - "RandomLoot": false, - "ShardHunt": true, - "ShardCount": 2, - "OrbsRequiredCount": 4, - "OrbsRequiredMode": 0, - "OrbsRequiredSpoilers": false, - "TransformFinalFormation": 0, - "ChaosRush": false, - "ToFRMode": 1, - "FiendsRefights": 0, - "ExitToFR": true, - "ChaosFloorEncounters": false, - "MagicShops": false, - "MagicShopLocs": false, - "MagicShopLocationPairs": false, - "MagicLevels": true, - "MagicPermissions": false, - "Weaponizer": false, - "WeaponizerNamesUseQualityOnly": false, - "WeaponizerCommonWeaponsHavePowers": false, - "ArmorCrafter": false, - "MagicLevelsTiered": false, - "MagicLevelsMixed": false, - "MagicAutohitThreshold": 0, - "Rng": true, - "FixMissingBattleRngEntry": false, - "EncounterPrng": false, - "UnrunnableShuffle": true, - "UnrunnablesLow": 0, - "UnrunnablesHigh": 0, - "EnemyFormationsSurprise": true, - "UnrunnablesStrikeFirstAndSurprise": false, - "EnemyTrapTiles": 3, - "TCFormations": 2, - "TCBetterTreasure": 0, - "TCKeyItems": 2, - "TCShards": 2, - "TCExcludeCommons": false, - "TCChestCount": 0, - "TCProtectIncentives": false, - "TCMasaGuardian": false, - "TrappedChaos": false, - "TCIndicator": true, - "SwolePirates": false, - "ShuffleScriptsEnemies": true, - "RemoveBossScripts": false, - "ShuffleScriptsBosses": false, - "ShuffleSkillsSpellsEnemies": true, - "ShuffleSkillsSpellsBosses": false, - "NoConsecutiveNukes": false, - "TranceHasStatusElement": true, - "EnemySkillsSpellsTiered": false, - "AllowUnsafePirates": false, - "AllowUnsafeMelmond": false, - "WarMECHMode": 1, - "OrdealsPillars": true, - "ShuffleLavaTiles": false, - "SkyCastle4FMazeMode": 0, - "TitansTrove": true, - "LefeinSuperStore": true, - "LefeinShops": true, - "RandomVampAttack": false, - "RandomVampAttackIncludesConeria": false, - "FightBahamut": false, - "SwoleBahamut": false, - "SwoleAstos": false, - "ConfusedOldMen": false, - "GaiaShortcut": true, - "DamageTileLow": 1, - "DamageTileHigh": 1, - "OWDamageTiles": false, - "DamageTilesKill": false, - "ArmorResistsDamageTileDamage": false, - "MoveGaiaItemShop": true, - "ShufflePravokaShops": false, - "FlipDungeons": false, - "VerticallyFlipDungeons": false, - "SpookyFlag": false, - "DraculasFlag": false, - "MapOpenProgression": true, - "MapOpenProgressionDocks": false, - "Entrances": false, - "Towns": false, - "IncludeConeria": false, - "Floors": false, - "AllowDeepCastles": false, - "AllowDeepTowns": false, - "MapOpenProgressionExtended": true, - "MapAirshipDock": false, - "MapBahamutCardiaDock": false, - "MapLefeinRiver": false, - "MapBridgeLefein": false, - "MapRiverToMelmond": false, - "MapGaiaMountainPass": false, - "MapHighwayToOrdeals": false, - "MapDragonsHoard": false, - "MapHallOfDragons": false, - "EntrancesIncludesDeadEnds": false, - "EntrancesMixedWithTowns": false, - "IncentivizeFreeNPCs": true, - "IncentivizeFetchNPCs": true, - "IncentivizeTail": true, - "IncentivizeMainItems": true, - "IncentivizeFetchItems": true, - "IncentivizeCanoeItem": true, - "IncentivizeAirship": true, - "IncentivizeShipAndCanal": true, - "IncentivizeBridgeItem": false, - "IncentivizeMarsh": false, - "IncentivizeEarth": true, - "IncentivizeVolcano": true, - "IncentivizeIceCave": false, - "IncentivizeOrdeals": true, - "IncentivizeSeaShrine": true, - "IncentivizeConeria": true, - "IncentivizeMarshKeyLocked": false, - "IncentivizeSkyPalace": true, - "IncentivizeTitansTrove": true, - "IncentivizeCardia": true, - "IceCaveIncentivePlacementType": 0, - "OrdealsIncentivePlacementType": 1, - "MarshIncentivePlacementType": 0, - "TitansIncentivePlacementType": 1, - "EarthIncentivePlacementType": 3, - "VolcanoIncentivePlacementType": 2, - "SeaShrineIncentivePlacementType": 3, - "SkyPalaceIncentivePlacementType": 3, - "CorneriaIncentivePlacementType": 0, - "MarshLockedIncentivePlacementType": 0, - "CardiaIncentivePlacementType": 1, - "BetterTrapChests": false, - "IncentivizeMasamune": false, - "IncentivizeKatana": false, - "IncentivizeXcalber": true, - "IncentivizeVorpal": false, - "IncentivizeOpal": false, - "IncentivizeRibbon": false, - "IncentivizeDefCastArmor": false, - "IncentivizeOffCastArmor": false, - "IncentivizeOtherCastArmor": true, - "IncentivizePowerRod": false, - "IncentivizeDefCastWeapon": true, - "IncentivizeOffCastWeapon": false, - "IncentivizeOtherCastWeapon": false, - "LooseExcludePlacedDungeons": false, - "EarlyKing": true, - "EarlySarda": true, - "EarlySage": true, - "EarlyOrdeals": true, - "ShuffleObjectiveNPCs": false, - "OnlyRequireGameIsBeatable": false, - "FreeBridge": true, - "FreeShip": false, - "FreeAirship": false, - "FreeLute": false, - "FreeRod": false, - "EnableCritNumberDisplay": true, - "FreeCanal": false, - "FreeCanoe": false, - "EasyMode": false, - "HousesFillHp": true, - "SpeedHacks": true, - "NoPartyShuffle": true, - "Dash": true, - "SpeedBoat": true, - "AirBoat": true, - "BuyTen": true, - "IdentifyTreasures": true, - "ShopInfo": true, - "ChestInfo": true, - "IncentiveChestItemsFanfare": true, - "WaitWhenUnrunnable": true, - "ImprovedClinic": false, - "Etherizer": false, - "HouseMPRestoration": true, - "WeaponStats": true, - "BBCritRate": false, - "WeaponCritRate": true, - "WeaponBonuses": true, - "ThiefAgilityBuff": 1, - "SkyWarriorSpoilerBats": 1, - "SpoilerBatsDontCheckOrbs": true, - "MoveToFBats": false, - "WeaponTypeBonusValue": 42, - "ChanceToRun": 1, - "SpellBugs": true, - "BlackBeltAbsorb": true, - "NPCSwatter": true, - "BattleMagicMenuWrapAround": true, - "MagicMenuSpellReordering": true, - "InventoryAutosort": true, - "RepeatedHealPotionUse": false, - "AutoRetargeting": true, - "EnemyStatusAttackBug": true, - "ImproveTurnOrderRandomization": true, - "FixHitChanceCap": true, - "MelmondClinic": false, - "DDProgressiveTilesets": false, - "DDFiendOrbs": false, - "TailBahamutMode": 0, - "StartingGold": 3, - "IncludeMorale": false, - "DeadsGainXP": false, - "NonesGainXP": false, - "NoTail": false, - "NoFloater": false, - "GuaranteedMasamune": false, - "SendMasamuneHome": false, - "MoreConsumableChests": 0, - "NoMasamune": false, - "NoXcalber": false, - "ClassAsNpcFiends": false, - "ClassAsNpcKeyNPC": false, - "ClassAsNpcCount": 6, - "ClassAsNpcDuplicate": false, - "ClassAsNpcForcedFiends": false, - "ClassAsNpcPromotion": false, - "BossScaleStatsLow": 130, - "BossScaleStatsHigh": 160, - "BossScaleHpLow": 160, - "BossScaleHpHigh": 160, - "EnemyScaleStatsLow": 90, - "EnemyScaleStatsHigh": 120, - "EnemyScaleHpLow": 50, - "EnemyScaleHpHigh": 150, - "PriceScaleFactorLow": 50, - "PriceScaleFactorHigh": 200, - "ExpMultiplier": 2.5, - "ExpBonus": 150, - "ExpMultiplierFighter": 1.1, - "ExpMultiplierThief": 1.1, - "ExpMultiplierBlackBelt": 1, - "ExpMultiplierRedMage": 1, - "ExpMultiplierWhiteMage": 1, - "ExpMultiplierBlackMage": 1, - "EncounterRate": 12, - "DungeonEncounterRate": 15, - "ProgressiveScaleMode": 11, - "StartingItemSet": 4, - "ConsumableTreasureStackSize": 2, - "FIGHTER1": true, - "THIEF1": true, - "BLACK_BELT1": true, - "RED_MAGE1": false, - "WHITE_MAGE1": false, - "BLACK_MAGE1": false, - "FIGHTER2": true, - "THIEF2": true, - "BLACK_BELT2": false, - "RED_MAGE2": true, - "WHITE_MAGE2": true, - "BLACK_MAGE2": true, - "FIGHTER3": false, - "THIEF3": false, - "BLACK_BELT3": false, - "RED_MAGE3": false, - "WHITE_MAGE3": false, - "BLACK_MAGE3": false, - "FIGHTER4": false, - "THIEF4": false, - "BLACK_BELT4": false, - "RED_MAGE4": true, - "WHITE_MAGE4": true, - "BLACK_MAGE4": true, - "KNIGHT1": false, - "KNIGHT2": false, - "KNIGHT3": false, - "KNIGHT4": false, - "NINJA1": false, - "NINJA2": false, - "NINJA3": false, - "NINJA4": false, - "MASTER1": false, - "MASTER2": false, - "MASTER3": false, - "MASTER4": false, - "RED_WIZ1": false, - "RED_WIZ2": false, - "RED_WIZ3": false, - "RED_WIZ4": false, - "WHITE_WIZ1": false, - "WHITE_WIZ2": false, - "WHITE_WIZ3": false, - "WHITE_WIZ4": false, - "BLACK_WIZ1": false, - "BLACK_WIZ2": false, - "BLACK_WIZ3": false, - "BLACK_WIZ4": false, - "NONE_CLASS2": true, - "NONE_CLASS3": true, - "NONE_CLASS4": true, - "FORCED1": true, - "FORCED2": true, - "FORCED3": true, - "FORCED4": false, - "DraftFighter": false, - "DraftThief": false, - "DraftBlackBelt": false, - "DraftRedMage": false, - "DraftWhiteMage": false, - "DraftBlackMage": false, - "DraftKnight": false, - "DraftNinja": false, - "DraftMaster": false, - "DraftRedWiz": false, - "DraftWhiteWiz": false, - "DraftBlackWiz": false, - "TAVERN1": true, - "TAVERN2": true, - "TAVERN3": false, - "TAVERN4": true, - "TAVERN5": true, - "TAVERN6": true, - "WeaponPermissions": false, - "ArmorPermissions": false, - "RecruitmentMode": true, - "RecruitmentModeHireOnly": false, - "RecruitmentModeReplaceOnlyNone": true, - "ClampMinimumStatScale": false, - "ClampMinimumBossStatScale": false, - "ClampMinimumPriceScale": false, - "EFGWaterfall": false, - "FiendShuffle": false, - "DisableTentSaving": false, - "DisableInnSaving": false, - "SaveGameWhenGameOver": false, - "SaveGameDWMode": false, - "ShuffleAstos": false, - "UnsafeAstos": false, - "RandomizeEnemizer": false, - "RandomizeFormationEnemizer": false, - "GenerateNewSpellbook": false, - "SpellcrafterMixSpells": false, - "ThiefHitRate": true, - "AllSpellLevelsForKnightNinja": false, - "BuffHealingSpells": true, - "IntAffectsSpells": false, - "AddDamageTiles": false, - "DamageTilesCastles": false, - "DamageTilesDungeons": false, - "DamageTilesCaves": false, - "DamageTilesTowns": false, - "DamageTilesTof": false, - "DamageTilesQuantity": 1, - "FreeTail": false, - "HintsVillage": false, - "SpellcrafterRetainPermissions": false, - "RandomWeaponBonus": true, - "RandomArmorBonus": true, - "RandomWeaponBonusExcludeMasa": false, - "RandomWeaponBonusLow": 3, - "RandomWeaponBonusHigh": 5, - "RandomArmorBonusLow": 3, - "RandomArmorBonusHigh": 5, - "SeparateBossHPScaling": true, - "SeparateEnemyHPScaling": false, - "ClampBossHPScaling": false, - "ClampEnemyHpScaling": false, - "PoolSize": 2, - "EnablePoolParty": false, - "SafePoolParty": false, - "IncludePromClasses": false, - "EnableRandomPromotions": false, - "IncludeBaseClasses": false, - "RandomPromotionsSpoilers": false, - "RandomizeClassCasting": true, - "RandomizeClassKeyItems": false, - "RandomizeClassIncludeXpBonus": false, - "AlternateFiends": false, - "FinalFantasy2Fiends": false, - "FinalFantasy3Fiends": false, - "FinalFantasy4Fiends": false, - "FinalFantasy5Fiends": false, - "FinalFantasy6Fiends": false, - "FinalFantasy1BonusFiends": false, - "BlackOrbFiends": false, - "NoBossSkillScriptShuffle": false, - "MooglieWeaponBalance": false, - "GuaranteeCustomClassComposition": false, - "LegendaryWeaponShop": false, - "LegendaryArmorShop": false, - "LegendaryBlackShop": false, - "LegendaryWhiteShop": false, - "LegendaryItemShop": false, - "ExclusiveLegendaryWeaponShop": false, - "ExclusiveLegendaryArmorShop": false, - "ExclusiveLegendaryBlackShop": false, - "ExclusiveLegendaryWhiteShop": false, - "ExclusiveLegendaryItemShop": false, - "RandomizeClassMode": 1, - "RandomizeClassMaxBonus": 1, - "RandomizeClassMaxMalus": 0, - "EarlierHighTierMagic": false, - "ChangeMaxMP": false, - "RedMageMaxMP": 9, - "WhiteMageMaxMP": 9, - "BlackMageMaxMP": 9, - "KnightMaxMP": 4, - "NinjaMaxMP": 4, - "Knightlvl4": true, - "PinkMage": false, - "BlackKnight": true, - "BlackKnightKeep": false, - "WhiteNinja": true, - "WhiteNinjaKeep": true, - "MpGainOnMaxGainMode": 0, - "LockMode": 3, - "MDefMode": 0, - "FormationShuffleMode": 1, - "RandomizeTreasure": 0, - "OpenChestsInOrder": false, - "SetRNG": false, - "WorldWealth": 1, - "DeepDungeonGenerator": 0, - "EvadeCap": 3, - "AllowUnsafeStartArea": false, - "IncreaseDarkPenalty": true, - "IncreaseRegeneration": false, - "PoisonMode": 6, - "PoisonSetDamageValue": 3, - "TouchIncludeBosses": true, - "Lockpicking": true, - "ReducedLuck": false, - "LockpickingLevelRequirement": 22, - "WhiteMageHarmEveryone": true, - "ProcgenEarth": false, - "LoosePlacementMode": 0 - } + "Flags": { + "StartingEquipmentMasamune": false, + "StartingEquipmentKatana": false, + "StartingEquipmentHealStaff": false, + "StartingEquipmentZeusGauntlet": false, + "StartingEquipmentWhiteShirt": false, + "StartingEquipmentRibbon": false, + "StartingEquipmentDragonslayer": false, + "StartingEquipmentLegendKit": false, + "StartingEquipmentRandomEndgameWeapon": false, + "StartingEquipmentRandomAoe": false, + "StartingEquipmentRandomCasterItem": false, + "StartingEquipmentGrandpasSecretStash": false, + "StartingEquipmentOneItem": false, + "StartingEquipmentRandomCrap": false, + "StartingEquipmentStarterPack": false, + "StartingEquipmentRandomTypeWeapon": false, + "StartingEquipmentRemoveFromPool": false, + "StartingEquipmentNoDuplicates": false, + "ReversedFloors": false, + "BuffTier1DamageSpells": true, + "NoEmptyScripts": false, + "LaterLoose": false, + "MermaidPrison": true, + "GuaranteedDefenseItem": 3, + "GuaranteedPowerItem": 0, + "ScriptMultiplier": 1, + "TouchMultiplier": 2, + "TouchPool": 1, + "TouchMode": 0, + "RibbonMode": 0, + "Archipelago": false, + "ArchipelagoGold": false, + "ArchipelagoConsumables": false, + "ArchipelagoShards": false, + "ArchipelagoEquipment": 0, + "ItemMagicMode": 0, + "ItemMagicPool": 0, + "MagisizeWeapons": false, + "DisableMinimap": false, + "LooseItemsForwardPlacement": false, + "LooseItemsSpreadPlacement": false, + "LooseItemsNpcBalance": false, + "AllowUnsafePlacement": true, + "ShipCanalBeforeFloater": false, + "ExpChestConversionMin": 10, + "ExpChestConversionMax": 10, + "ExpChestMinReward": 3000, + "ExpChestMaxReward": 3000, + "SpellNameMadness": 0, + "ExtConsumableSet": 0, + "EnableSoftInBattle": true, + "EnableLifeInBattle": 0, + "NormalShopsHaveExtConsumables": false, + "LegendaryShopHasExtConsumables": false, + "ExtConsumableTreasureStackSize": 0, + "ExtStartingItemSet": 0, + "ExtConsumableChests": 0, + "OwMapExchange": 0, + "OwShuffledAccess": false, + "OwUnsafeStart": false, + "OwRandomPregen": false, + "RelocateChests": false, + "RelocateChestsTrapIndicator": false, + "ShuffleChimeAccess": true, + "ShuffleChimeIncludeTowns": false, + "GameMode": 0, + "MapGenSeed": 0, + "ReplacementMap": null, + "ResourcePack": null, + "ShopKillMode_Weapons": 0, + "ShopKillMode_Armor": 0, + "ShopKillMode_Item": 0, + "ShopKillMode_Black": 0, + "ShopKillMode_White": 0, + "ShopKillFactor_Weapons": 0, + "ShopKillFactor_Armor": 0, + "ShopKillFactor_Item": 0, + "ShopKillFactor_Black": 0, + "ShopKillFactor_White": 0, + "ShopKillExcludeConeria_Weapons": false, + "ShopKillExcludeConeria_Armor": false, + "ShopKillExcludeConeria_Item": false, + "ShopKillExcludeConeria_Black": false, + "ShopKillExcludeConeria_White": false, + "ExcludeGoldFromScaling": false, + "CheapVendorItem": false, + "StartingLevel": 0, + "TransmooglifierVariance": 0, + "MaxLevelLow": 50, + "MaxLevelHigh": 50, + "Spoilers": false, + "TriState": false, + "TournamentSafe": true, + "BlindSeed": false, + "Shops": true, + "Treasures": true, + "ChestsKeyItems": true, + "NPCItems": true, + "NPCFetchItems": true, + "RandomWares": false, + "RandomWaresIncludesSpecialGear": false, + "RandomLoot": false, + "ShardHunt": true, + "ShardCount": 2, + "OrbsRequiredCount": 4, + "OrbsRequiredMode": 0, + "OrbsRequiredSpoilers": false, + "TransformFinalFormation": 0, + "ChaosRush": false, + "ToFRMode": 1, + "FiendsRefights": 0, + "ExitToFR": true, + "ChaosFloorEncounters": false, + "MagicShops": false, + "MagicShopLocs": false, + "MagicShopLocationPairs": false, + "MagicLevels": true, + "MagicPermissions": false, + "Weaponizer": false, + "WeaponizerNamesUseQualityOnly": false, + "WeaponizerCommonWeaponsHavePowers": false, + "ArmorCrafter": false, + "MagicLevelsTiered": false, + "MagicLevelsMixed": false, + "MagicAutohitThreshold": 0, + "Rng": true, + "FixMissingBattleRngEntry": false, + "EncounterPrng": false, + "UnrunnableShuffle": true, + "UnrunnablesLow": 0, + "UnrunnablesHigh": 0, + "EnemyFormationsSurprise": true, + "UnrunnablesStrikeFirstAndSurprise": false, + "EnemyTrapTiles": 3, + "TCFormations": 2, + "TCBetterTreasure": 0, + "TCKeyItems": 2, + "TCShards": 2, + "TCExcludeCommons": false, + "TCChestCount": 0, + "TCProtectIncentives": false, + "TCMasaGuardian": false, + "TrappedChaos": false, + "TCIndicator": true, + "SwolePirates": false, + "ShuffleScriptsEnemies": true, + "RemoveBossScripts": false, + "ShuffleScriptsBosses": false, + "ShuffleSkillsSpellsEnemies": true, + "ShuffleSkillsSpellsBosses": false, + "NoConsecutiveNukes": false, + "TranceHasStatusElement": true, + "EnemySkillsSpellsTiered": false, + "AllowUnsafePirates": false, + "AllowUnsafeMelmond": false, + "WarMECHMode": 1, + "OrdealsPillars": true, + "ShuffleLavaTiles": false, + "SkyCastle4FMazeMode": 0, + "TitansTrove": true, + "LefeinShortcut": false, + "LefeinSuperStore": true, + "LefeinShops": true, + "RandomVampAttack": false, + "RandomVampAttackIncludesConeria": false, + "FightBahamut": false, + "SwoleBahamut": false, + "SwoleAstos": false, + "ConfusedOldMen": false, + "GaiaShortcut": true, + "DamageTileLow": 1, + "DamageTileHigh": 1, + "OWDamageTiles": false, + "DamageTilesKill": false, + "ArmorResistsDamageTileDamage": false, + "MoveGaiaItemShop": true, + "ShufflePravokaShops": false, + "FlipDungeons": false, + "VerticallyFlipDungeons": false, + "SpookyFlag": false, + "DraculasFlag": false, + "MapOpenProgression": true, + "MapOpenProgressionDocks": false, + "Entrances": false, + "Towns": false, + "IncludeConeria": false, + "Floors": false, + "AllowDeepCastles": false, + "AllowDeepTowns": false, + "MapOpenProgressionExtended": true, + "MapAirshipDock": false, + "MapBahamutCardiaDock": false, + "MapLefeinRiver": false, + "MapBridgeLefein": false, + "MapRiverToMelmond": false, + "MapGaiaMountainPass": false, + "MapHighwayToOrdeals": false, + "MapDragonsHoard": false, + "MapHallOfDragons": false, + "EntrancesIncludesDeadEnds": false, + "EntrancesMixedWithTowns": false, + "IncentivizeFreeNPCs": true, + "IncentivizeFetchNPCs": true, + "IncentivizeTail": true, + "IncentivizeMainItems": true, + "IncentivizeFetchItems": true, + "IncentivizeCanoeItem": true, + "IncentivizeAirship": true, + "IncentivizeShipAndCanal": true, + "IncentivizeBridgeItem": false, + "IncentivizeMarsh": false, + "IncentivizeEarth": true, + "IncentivizeVolcano": true, + "IncentivizeIceCave": false, + "IncentivizeOrdeals": true, + "IncentivizeSeaShrine": true, + "IncentivizeConeria": true, + "IncentivizeMarshKeyLocked": false, + "IncentivizeSkyPalace": true, + "IncentivizeTitansTrove": true, + "IncentivizeCardia": true, + "IceCaveIncentivePlacementType": 0, + "OrdealsIncentivePlacementType": 1, + "MarshIncentivePlacementType": 0, + "TitansIncentivePlacementType": 1, + "EarthIncentivePlacementType": 3, + "VolcanoIncentivePlacementType": 2, + "SeaShrineIncentivePlacementType": 3, + "SkyPalaceIncentivePlacementType": 3, + "CorneriaIncentivePlacementType": 0, + "MarshLockedIncentivePlacementType": 0, + "CardiaIncentivePlacementType": 1, + "BetterTrapChests": false, + "IncentivizeMasamune": false, + "IncentivizeKatana": false, + "IncentivizeXcalber": true, + "IncentivizeVorpal": false, + "IncentivizeOpal": false, + "IncentivizeRibbon": false, + "IncentivizeDefCastArmor": false, + "IncentivizeOffCastArmor": false, + "IncentivizeOtherCastArmor": true, + "IncentivizePowerRod": false, + "IncentivizeDefCastWeapon": true, + "IncentivizeOffCastWeapon": false, + "IncentivizeOtherCastWeapon": false, + "LooseExcludePlacedDungeons": false, + "EarlyKing": true, + "EarlySarda": true, + "EarlySage": true, + "EarlyOrdeals": true, + "ShuffleObjectiveNPCs": false, + "OnlyRequireGameIsBeatable": false, + "FreeBridge": true, + "FreeShip": false, + "FreeAirship": false, + "FreeLute": false, + "FreeRod": false, + "EnableCritNumberDisplay": true, + "FreeCanal": false, + "FreeCanoe": false, + "EasyMode": false, + "HousesFillHp": true, + "SpeedHacks": true, + "NoPartyShuffle": true, + "Dash": true, + "SpeedBoat": true, + "AirBoat": true, + "BuyTen": true, + "IdentifyTreasures": true, + "ShopInfo": true, + "ChestInfo": true, + "IncentiveChestItemsFanfare": true, + "WaitWhenUnrunnable": true, + "ImprovedClinic": false, + "Etherizer": false, + "HouseMPRestoration": true, + "WeaponStats": true, + "BBCritRate": false, + "WeaponCritRate": true, + "WeaponBonuses": true, + "ThiefAgilityBuff": 1, + "SkyWarriorSpoilerBats": 1, + "SpoilerBatsDontCheckOrbs": true, + "MoveToFBats": false, + "WeaponTypeBonusValue": 42, + "ChanceToRun": 1, + "SpellBugs": true, + "BlackBeltAbsorb": true, + "NPCSwatter": true, + "BattleMagicMenuWrapAround": true, + "MagicMenuSpellReordering": true, + "InventoryAutosort": true, + "RepeatedHealPotionUse": false, + "AutoRetargeting": true, + "EnemyStatusAttackBug": true, + "ImproveTurnOrderRandomization": true, + "FixHitChanceCap": true, + "MelmondClinic": false, + "DDProgressiveTilesets": false, + "DDFiendOrbs": false, + "TailBahamutMode": 0, + "StartingGold": 3, + "IncludeMorale": false, + "DeadsGainXP": false, + "NonesGainXP": false, + "NoTail": false, + "NoFloater": false, + "GuaranteedMasamune": false, + "SendMasamuneHome": false, + "MoreConsumableChests": 0, + "NoMasamune": false, + "NoXcalber": false, + "ClassAsNpcFiends": false, + "ClassAsNpcKeyNPC": false, + "ClassAsNpcCount": 6, + "ClassAsNpcDuplicate": false, + "ClassAsNpcForcedFiends": false, + "ClassAsNpcPromotion": false, + "BossScaleStatsLow": 130, + "BossScaleStatsHigh": 160, + "BossScaleHpLow": 160, + "BossScaleHpHigh": 160, + "EnemyScaleStatsLow": 90, + "EnemyScaleStatsHigh": 120, + "EnemyScaleHpLow": 50, + "EnemyScaleHpHigh": 150, + "PriceScaleFactorLow": 50, + "PriceScaleFactorHigh": 200, + "ExpMultiplier": 2.5, + "ExpBonus": 150, + "ExpMultiplierFighter": 1.1, + "ExpMultiplierThief": 1.1, + "ExpMultiplierBlackBelt": 1, + "ExpMultiplierRedMage": 1, + "ExpMultiplierWhiteMage": 1, + "ExpMultiplierBlackMage": 1, + "EncounterRate": 12, + "DungeonEncounterRate": 15, + "ProgressiveScaleMode": 11, + "StartingItemSet": 4, + "ConsumableTreasureStackSize": 2, + "FIGHTER1": true, + "THIEF1": true, + "BLACK_BELT1": true, + "RED_MAGE1": false, + "WHITE_MAGE1": false, + "BLACK_MAGE1": false, + "FIGHTER2": true, + "THIEF2": true, + "BLACK_BELT2": false, + "RED_MAGE2": true, + "WHITE_MAGE2": true, + "BLACK_MAGE2": true, + "FIGHTER3": false, + "THIEF3": false, + "BLACK_BELT3": false, + "RED_MAGE3": false, + "WHITE_MAGE3": false, + "BLACK_MAGE3": false, + "FIGHTER4": false, + "THIEF4": false, + "BLACK_BELT4": false, + "RED_MAGE4": true, + "WHITE_MAGE4": true, + "BLACK_MAGE4": true, + "KNIGHT1": false, + "KNIGHT2": false, + "KNIGHT3": false, + "KNIGHT4": false, + "NINJA1": false, + "NINJA2": false, + "NINJA3": false, + "NINJA4": false, + "MASTER1": false, + "MASTER2": false, + "MASTER3": false, + "MASTER4": false, + "RED_WIZ1": false, + "RED_WIZ2": false, + "RED_WIZ3": false, + "RED_WIZ4": false, + "WHITE_WIZ1": false, + "WHITE_WIZ2": false, + "WHITE_WIZ3": false, + "WHITE_WIZ4": false, + "BLACK_WIZ1": false, + "BLACK_WIZ2": false, + "BLACK_WIZ3": false, + "BLACK_WIZ4": false, + "NONE_CLASS2": true, + "NONE_CLASS3": true, + "NONE_CLASS4": true, + "FORCED1": true, + "FORCED2": true, + "FORCED3": true, + "FORCED4": false, + "DraftFighter": false, + "DraftThief": false, + "DraftBlackBelt": false, + "DraftRedMage": false, + "DraftWhiteMage": false, + "DraftBlackMage": false, + "DraftKnight": false, + "DraftNinja": false, + "DraftMaster": false, + "DraftRedWiz": false, + "DraftWhiteWiz": false, + "DraftBlackWiz": false, + "TAVERN1": true, + "TAVERN2": true, + "TAVERN3": false, + "TAVERN4": true, + "TAVERN5": true, + "TAVERN6": true, + "WeaponPermissions": false, + "ArmorPermissions": false, + "RecruitmentMode": true, + "RecruitmentModeHireOnly": false, + "RecruitmentModeReplaceOnlyNone": true, + "ClampMinimumStatScale": false, + "ClampMinimumBossStatScale": false, + "ClampMinimumPriceScale": false, + "FiendShuffle": false, + "DisableTentSaving": false, + "DisableInnSaving": false, + "SaveGameWhenGameOver": false, + "SaveGameDWMode": false, + "ShuffleAstos": false, + "UnsafeAstos": false, + "RandomizeEnemizer": false, + "RandomizeFormationEnemizer": false, + "GenerateNewSpellbook": false, + "SpellcrafterMixSpells": false, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, + "AllSpellLevelsForKnightNinja": false, + "BuffHealingSpells": true, + "IntAffectsSpells": false, + "AddDamageTiles": false, + "DamageTilesCastles": false, + "DamageTilesDungeons": false, + "DamageTilesCaves": false, + "DamageTilesTowns": false, + "DamageTilesTof": false, + "DamageTilesQuantity": 1, + "FreeTail": false, + "HintsVillage": false, + "SpellcrafterRetainPermissions": false, + "RandomWeaponBonus": true, + "RandomArmorBonus": true, + "RandomWeaponBonusExcludeMasa": false, + "RandomWeaponBonusLow": 3, + "RandomWeaponBonusHigh": 5, + "RandomArmorBonusLow": 3, + "RandomArmorBonusHigh": 5, + "SeparateBossHPScaling": true, + "SeparateEnemyHPScaling": false, + "ClampBossHPScaling": false, + "ClampEnemyHpScaling": false, + "PoolSize": 2, + "EnablePoolParty": false, + "SafePoolParty": false, + "IncludePromClasses": false, + "EnableRandomPromotions": false, + "IncludeBaseClasses": false, + "RandomPromotionsSpoilers": false, + "RandomizeClassCasting": true, + "RandomizeClassKeyItems": false, + "RandomizeClassIncludeXpBonus": false, + "AlternateFiends": false, + "FinalFantasy2Fiends": false, + "FinalFantasy3Fiends": false, + "FinalFantasy4Fiends": false, + "FinalFantasy5Fiends": false, + "FinalFantasy6Fiends": false, + "FinalFantasy1BonusFiends": false, + "BlackOrbFiends": false, + "NoBossSkillScriptShuffle": false, + "MooglieWeaponBalance": false, + "GuaranteeCustomClassComposition": false, + "LegendaryWeaponShop": false, + "LegendaryArmorShop": false, + "LegendaryBlackShop": false, + "LegendaryWhiteShop": false, + "LegendaryItemShop": false, + "ExclusiveLegendaryWeaponShop": false, + "ExclusiveLegendaryArmorShop": false, + "ExclusiveLegendaryBlackShop": false, + "ExclusiveLegendaryWhiteShop": false, + "ExclusiveLegendaryItemShop": false, + "RandomizeClassMode": 1, + "RandomizeClassMaxBonus": 1, + "RandomizeClassMaxMalus": 0, + "EarlierHighTierMagic": false, + "ChangeMaxMP": false, + "RedMageMaxMP": 9, + "WhiteMageMaxMP": 9, + "BlackMageMaxMP": 9, + "KnightMaxMP": 4, + "NinjaMaxMP": 4, + "Knightlvl4": true, + "PinkMage": false, + "BlackKnight": true, + "BlackKnightKeep": false, + "WhiteNinja": true, + "WhiteNinjaKeep": true, + "MpGainOnMaxGainMode": 0, + "LockMode": 3, + "MDefMode": 0, + "FormationShuffleMode": 1, + "RandomizeTreasure": 0, + "OpenChestsInOrder": false, + "SetRNG": false, + "WorldWealth": 1, + "DeepDungeonGenerator": 0, + "EvadeCap": 3, + "AllowUnsafeStartArea": false, + "IncreaseDarkPenalty": true, + "IncreaseRegeneration": false, + "PoisonMode": 6, + "PoisonSetDamageValue": 3, + "TouchIncludeBosses": true, + "Lockpicking": true, + "ReducedLuck": false, + "LockpickingLevelRequirement": 22, + "WhiteMageHarmEveryone": true, + "ProcgenEarth": false, + "LoosePlacementMode": 0 + } } diff --git a/FF1Blazorizer/wwwroot/presets/wt2025r8.json b/FF1Blazorizer/wwwroot/presets/wt2025r8.json index ea3498ef5..31f6141c6 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r8.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r8.json @@ -1,532 +1,534 @@ { "Name": "Winter Tournament 2025 Round of 8", - "Flags": { - "StartingEquipmentMasamune": false, - "StartingEquipmentKatana": false, - "StartingEquipmentHealStaff": false, - "StartingEquipmentZeusGauntlet": false, - "StartingEquipmentWhiteShirt": false, - "StartingEquipmentRibbon": false, - "StartingEquipmentDragonslayer": false, - "StartingEquipmentLegendKit": false, - "StartingEquipmentRandomEndgameWeapon": false, - "StartingEquipmentRandomAoe": false, - "StartingEquipmentRandomCasterItem": false, - "StartingEquipmentGrandpasSecretStash": false, - "StartingEquipmentOneItem": false, - "StartingEquipmentRandomCrap": false, - "StartingEquipmentStarterPack": false, - "StartingEquipmentRandomTypeWeapon": false, - "StartingEquipmentRemoveFromPool": false, - "StartingEquipmentNoDuplicates": false, - "ReversedFloors": false, - "BuffTier1DamageSpells": true, - "NoEmptyScripts": false, - "LaterLoose": false, - "MermaidPrison": true, - "GuaranteedDefenseItem": 3, - "GuaranteedPowerItem": 0, - "ScriptMultiplier": 1, - "TouchMultiplier": 2, - "TouchPool": 1, - "TouchMode": 0, - "RibbonMode": 0, - "Archipelago": false, - "ArchipelagoGold": false, - "ArchipelagoConsumables": false, - "ArchipelagoShards": false, - "ArchipelagoEquipment": 0, - "ItemMagicMode": 0, - "ItemMagicPool": 0, - "MagisizeWeapons": false, - "DisableMinimap": false, - "LooseItemsForwardPlacement": false, - "LooseItemsSpreadPlacement": false, - "LooseItemsNpcBalance": false, - "AllowUnsafePlacement": true, - "ShipCanalBeforeFloater": false, - "ExpChestConversionMin": 10, - "ExpChestConversionMax": 10, - "ExpChestMinReward": 3000, - "ExpChestMaxReward": 3000, - "SpellNameMadness": 0, - "ExtConsumableSet": 0, - "EnableSoftInBattle": true, - "EnableLifeInBattle": 0, - "NormalShopsHaveExtConsumables": false, - "LegendaryShopHasExtConsumables": false, - "ExtConsumableTreasureStackSize": 0, - "ExtStartingItemSet": 0, - "ExtConsumableChests": 0, - "OwMapExchange": 0, - "OwShuffledAccess": false, - "OwUnsafeStart": false, - "OwRandomPregen": false, - "RelocateChests": false, - "RelocateChestsTrapIndicator": false, - "ShuffleChimeAccess": true, - "ShuffleChimeIncludeTowns": false, - "GameMode": 0, - "MapGenSeed": 0, - "ReplacementMap": null, - "ResourcePack": null, - "ShopKillMode_Weapons": 0, - "ShopKillMode_Armor": 0, - "ShopKillMode_Item": 0, - "ShopKillMode_Black": 0, - "ShopKillMode_White": 0, - "ShopKillFactor_Weapons": 0, - "ShopKillFactor_Armor": 0, - "ShopKillFactor_Item": 0, - "ShopKillFactor_Black": 0, - "ShopKillFactor_White": 0, - "ShopKillExcludeConeria_Weapons": false, - "ShopKillExcludeConeria_Armor": false, - "ShopKillExcludeConeria_Item": false, - "ShopKillExcludeConeria_Black": false, - "ShopKillExcludeConeria_White": false, - "ExcludeGoldFromScaling": false, - "CheapVendorItem": false, - "StartingLevel": 0, - "TransmooglifierVariance": 0, - "MaxLevelLow": 50, - "MaxLevelHigh": 50, - "Spoilers": false, - "TournamentSafe": true, - "BlindSeed": false, - "Shops": true, - "Treasures": true, - "ChestsKeyItems": true, - "NPCItems": true, - "NPCFetchItems": true, - "RandomWares": false, - "RandomWaresIncludesSpecialGear": false, - "RandomLoot": false, - "ShardHunt": true, - "ShardCount": 3, - "OrbsRequiredCount": 4, - "OrbsRequiredMode": 0, - "OrbsRequiredSpoilers": false, - "TransformFinalFormation": 0, - "ChaosRush": false, - "ToFRMode": 1, - "FiendsRefights": 0, - "ExitToFR": true, - "ChaosFloorEncounters": false, - "MagicShops": false, - "MagicShopLocs": false, - "MagicShopLocationPairs": false, - "MagicLevels": true, - "MagicPermissions": false, - "Weaponizer": false, - "WeaponizerNamesUseQualityOnly": false, - "WeaponizerCommonWeaponsHavePowers": false, - "ArmorCrafter": false, - "MagicLevelsTiered": false, - "MagicLevelsMixed": false, - "MagicAutohitThreshold": 0, - "Rng": true, - "FixMissingBattleRngEntry": false, - "EncounterPrng": false, - "UnrunnableShuffle": true, - "UnrunnablesLow": 0, - "UnrunnablesHigh": 0, - "EnemyFormationsSurprise": true, - "UnrunnablesStrikeFirstAndSurprise": false, - "EnemyTrapTiles": 3, - "TCFormations": 2, - "TCBetterTreasure": 0, - "TCKeyItems": 2, - "TCShards": 2, - "TCExcludeCommons": false, - "TCChestCount": 0, - "TCProtectIncentives": false, - "TCMasaGuardian": false, - "TrappedChaos": false, - "TCIndicator": true, - "SwolePirates": false, - "ShuffleScriptsEnemies": true, - "RemoveBossScripts": false, - "ShuffleScriptsBosses": false, - "ShuffleSkillsSpellsEnemies": true, - "ShuffleSkillsSpellsBosses": false, - "NoConsecutiveNukes": false, - "TranceHasStatusElement": true, - "EnemySkillsSpellsTiered": false, - "AllowUnsafePirates": false, - "AllowUnsafeMelmond": false, - "WarMECHMode": 1, - "OrdealsPillars": true, - "ShuffleLavaTiles": false, - "SkyCastle4FMazeMode": 0, - "TitansTrove": true, - "LefeinSuperStore": true, - "LefeinShops": true, - "RandomVampAttack": false, - "RandomVampAttackIncludesConeria": false, - "FightBahamut": false, - "SwoleBahamut": false, - "SwoleAstos": false, - "ConfusedOldMen": false, - "GaiaShortcut": true, - "DamageTileLow": 1, - "DamageTileHigh": 1, - "OWDamageTiles": false, - "DamageTilesKill": false, - "ArmorResistsDamageTileDamage": false, - "MoveGaiaItemShop": true, - "ShufflePravokaShops": false, - "FlipDungeons": false, - "VerticallyFlipDungeons": false, - "SpookyFlag": false, - "DraculasFlag": false, - "MapOpenProgression": true, - "MapOpenProgressionDocks": true, - "Entrances": false, - "Towns": false, - "IncludeConeria": false, - "Floors": false, - "AllowDeepCastles": false, - "AllowDeepTowns": false, - "MapOpenProgressionExtended": true, - "MapAirshipDock": true, - "MapBahamutCardiaDock": true, - "MapLefeinRiver": true, - "MapBridgeLefein": false, - "MapRiverToMelmond": true, - "MapGaiaMountainPass": false, - "MapHighwayToOrdeals": false, - "MapDragonsHoard": false, - "MapHallOfDragons": false, - "EntrancesIncludesDeadEnds": false, - "EntrancesMixedWithTowns": false, - "IncentivizeFreeNPCs": true, - "IncentivizeFetchNPCs": true, - "IncentivizeTail": true, - "IncentivizeMainItems": true, - "IncentivizeFetchItems": true, - "IncentivizeCanoeItem": true, - "IncentivizeAirship": true, - "IncentivizeShipAndCanal": true, - "IncentivizeBridgeItem": false, - "IncentivizeMarsh": false, - "IncentivizeEarth": true, - "IncentivizeVolcano": true, - "IncentivizeIceCave": false, - "IncentivizeOrdeals": true, - "IncentivizeSeaShrine": true, - "IncentivizeConeria": true, - "IncentivizeMarshKeyLocked": false, - "IncentivizeSkyPalace": true, - "IncentivizeTitansTrove": true, - "IncentivizeCardia": true, - "IceCaveIncentivePlacementType": 0, - "OrdealsIncentivePlacementType": 1, - "MarshIncentivePlacementType": 0, - "TitansIncentivePlacementType": 1, - "EarthIncentivePlacementType": 3, - "VolcanoIncentivePlacementType": 2, - "SeaShrineIncentivePlacementType": 3, - "SkyPalaceIncentivePlacementType": 3, - "CorneriaIncentivePlacementType": 0, - "MarshLockedIncentivePlacementType": 0, - "CardiaIncentivePlacementType": 1, - "BetterTrapChests": false, - "IncentivizeMasamune": false, - "IncentivizeKatana": false, - "IncentivizeXcalber": true, - "IncentivizeVorpal": false, - "IncentivizeOpal": false, - "IncentivizeRibbon": false, - "IncentivizeDefCastArmor": false, - "IncentivizeOffCastArmor": false, - "IncentivizeOtherCastArmor": true, - "IncentivizePowerRod": false, - "IncentivizeDefCastWeapon": true, - "IncentivizeOffCastWeapon": false, - "IncentivizeOtherCastWeapon": false, - "LooseExcludePlacedDungeons": false, - "EarlyKing": true, - "EarlySarda": true, - "EarlySage": true, - "EarlyOrdeals": true, - "ShuffleObjectiveNPCs": false, - "OnlyRequireGameIsBeatable": false, - "FreeBridge": true, - "FreeShip": false, - "FreeAirship": false, - "FreeLute": false, - "FreeRod": false, - "EnableCritNumberDisplay": true, - "FreeCanal": false, - "FreeCanoe": false, - "EasyMode": false, - "HousesFillHp": true, - "SpeedHacks": true, - "NoPartyShuffle": true, - "Dash": true, - "SpeedBoat": true, - "AirBoat": true, - "BuyTen": true, - "IdentifyTreasures": true, - "ShopInfo": true, - "ChestInfo": true, - "IncentiveChestItemsFanfare": true, - "WaitWhenUnrunnable": true, - "ImprovedClinic": false, - "Etherizer": false, - "HouseMPRestoration": true, - "WeaponStats": true, - "BBCritRate": false, - "WeaponCritRate": true, - "WeaponBonuses": true, - "ThiefAgilityBuff": 1, - "SkyWarriorSpoilerBats": 1, - "SpoilerBatsDontCheckOrbs": true, - "MoveToFBats": false, - "WeaponTypeBonusValue": 42, - "ChanceToRun": 1, - "SpellBugs": true, - "BlackBeltAbsorb": true, - "NPCSwatter": true, - "BattleMagicMenuWrapAround": true, - "MagicMenuSpellReordering": true, - "InventoryAutosort": true, - "RepeatedHealPotionUse": false, - "AutoRetargeting": true, - "EnemyStatusAttackBug": true, - "ImproveTurnOrderRandomization": true, - "FixHitChanceCap": true, - "MelmondClinic": false, - "DDProgressiveTilesets": false, - "DDFiendOrbs": false, - "TailBahamutMode": 0, - "StartingGold": 3, - "IncludeMorale": false, - "DeadsGainXP": false, - "NonesGainXP": false, - "NoTail": false, - "NoFloater": false, - "GuaranteedMasamune": false, - "SendMasamuneHome": false, - "MoreConsumableChests": 0, - "NoMasamune": false, - "NoXcalber": false, - "ClassAsNpcFiends": false, - "ClassAsNpcKeyNPC": false, - "ClassAsNpcCount": 6, - "ClassAsNpcDuplicate": false, - "ClassAsNpcForcedFiends": false, - "ClassAsNpcPromotion": false, - "BossScaleStatsLow": 130, - "BossScaleStatsHigh": 190, - "BossScaleHpLow": 160, - "BossScaleHpHigh": 190, - "EnemyScaleStatsLow": 90, - "EnemyScaleStatsHigh": 150, - "EnemyScaleHpLow": 50, - "EnemyScaleHpHigh": 150, - "PriceScaleFactorLow": 50, - "PriceScaleFactorHigh": 200, - "ExpMultiplier": 2.5, - "ExpBonus": 150, - "ExpMultiplierFighter": 1.1, - "ExpMultiplierThief": 1.1, - "ExpMultiplierBlackBelt": 1, - "ExpMultiplierRedMage": 1, - "ExpMultiplierWhiteMage": 1, - "ExpMultiplierBlackMage": 1, - "EncounterRate": 12, - "DungeonEncounterRate": 15, - "ProgressiveScaleMode": 11, - "StartingItemSet": 4, - "ConsumableTreasureStackSize": 2, - "FIGHTER1": true, - "THIEF1": true, - "BLACK_BELT1": true, - "RED_MAGE1": false, - "WHITE_MAGE1": false, - "BLACK_MAGE1": false, - "FIGHTER2": true, - "THIEF2": true, - "BLACK_BELT2": false, - "RED_MAGE2": true, - "WHITE_MAGE2": true, - "BLACK_MAGE2": true, - "FIGHTER3": false, - "THIEF3": false, - "BLACK_BELT3": false, - "RED_MAGE3": false, - "WHITE_MAGE3": false, - "BLACK_MAGE3": false, - "FIGHTER4": false, - "THIEF4": false, - "BLACK_BELT4": false, - "RED_MAGE4": true, - "WHITE_MAGE4": true, - "BLACK_MAGE4": true, - "KNIGHT1": false, - "KNIGHT2": false, - "KNIGHT3": false, - "KNIGHT4": false, - "NINJA1": false, - "NINJA2": false, - "NINJA3": false, - "NINJA4": false, - "MASTER1": false, - "MASTER2": false, - "MASTER3": false, - "MASTER4": false, - "RED_WIZ1": false, - "RED_WIZ2": false, - "RED_WIZ3": false, - "RED_WIZ4": false, - "WHITE_WIZ1": false, - "WHITE_WIZ2": false, - "WHITE_WIZ3": false, - "WHITE_WIZ4": false, - "BLACK_WIZ1": false, - "BLACK_WIZ2": false, - "BLACK_WIZ3": false, - "BLACK_WIZ4": false, - "NONE_CLASS2": true, - "NONE_CLASS3": true, - "NONE_CLASS4": true, - "FORCED1": true, - "FORCED2": true, - "FORCED3": true, - "FORCED4": false, - "DraftFighter": false, - "DraftThief": false, - "DraftBlackBelt": false, - "DraftRedMage": false, - "DraftWhiteMage": false, - "DraftBlackMage": false, - "DraftKnight": false, - "DraftNinja": false, - "DraftMaster": false, - "DraftRedWiz": false, - "DraftWhiteWiz": false, - "DraftBlackWiz": false, - "TAVERN1": true, - "TAVERN2": true, - "TAVERN3": false, - "TAVERN4": true, - "TAVERN5": true, - "TAVERN6": true, - "WeaponPermissions": false, - "ArmorPermissions": false, - "RecruitmentMode": true, - "RecruitmentModeHireOnly": false, - "RecruitmentModeReplaceOnlyNone": true, - "ClampMinimumStatScale": false, - "ClampMinimumBossStatScale": false, - "ClampMinimumPriceScale": false, - "EFGWaterfall": false, - "FiendShuffle": false, - "DisableTentSaving": false, - "DisableInnSaving": false, - "SaveGameWhenGameOver": false, - "SaveGameDWMode": false, - "ShuffleAstos": false, - "UnsafeAstos": false, - "RandomizeEnemizer": false, - "RandomizeFormationEnemizer": false, - "GenerateNewSpellbook": false, - "SpellcrafterMixSpells": false, - "ThiefHitRate": true, - "AllSpellLevelsForKnightNinja": false, - "BuffHealingSpells": true, - "IntAffectsSpells": false, - "AddDamageTiles": false, - "DamageTilesCastles": false, - "DamageTilesDungeons": false, - "DamageTilesCaves": false, - "DamageTilesTowns": false, - "DamageTilesTof": false, - "DamageTilesQuantity": 1, - "FreeTail": false, - "HintsVillage": false, - "SpellcrafterRetainPermissions": false, - "RandomWeaponBonus": true, - "RandomArmorBonus": true, - "RandomWeaponBonusExcludeMasa": false, - "RandomWeaponBonusLow": 0, - "RandomWeaponBonusHigh": 5, - "RandomArmorBonusLow": 0, - "RandomArmorBonusHigh": 5, - "SeparateBossHPScaling": true, - "SeparateEnemyHPScaling": false, - "ClampBossHPScaling": false, - "ClampEnemyHpScaling": false, - "PoolSize": 2, - "EnablePoolParty": false, - "SafePoolParty": false, - "IncludePromClasses": false, - "EnableRandomPromotions": false, - "IncludeBaseClasses": false, - "RandomPromotionsSpoilers": false, - "RandomizeClassCasting": true, - "RandomizeClassKeyItems": false, - "RandomizeClassIncludeXpBonus": false, - "AlternateFiends": false, - "FinalFantasy2Fiends": false, - "FinalFantasy3Fiends": false, - "FinalFantasy4Fiends": false, - "FinalFantasy5Fiends": false, - "FinalFantasy6Fiends": false, - "FinalFantasy1BonusFiends": false, - "BlackOrbFiends": false, - "NoBossSkillScriptShuffle": false, - "MooglieWeaponBalance": false, - "GuaranteeCustomClassComposition": false, - "LegendaryWeaponShop": false, - "LegendaryArmorShop": false, - "LegendaryBlackShop": false, - "LegendaryWhiteShop": false, - "LegendaryItemShop": false, - "ExclusiveLegendaryWeaponShop": false, - "ExclusiveLegendaryArmorShop": false, - "ExclusiveLegendaryBlackShop": false, - "ExclusiveLegendaryWhiteShop": false, - "ExclusiveLegendaryItemShop": false, - "RandomizeClassMode": 1, - "RandomizeClassMaxBonus": 1, - "RandomizeClassMaxMalus": 0, - "EarlierHighTierMagic": false, - "ChangeMaxMP": false, - "RedMageMaxMP": 9, - "WhiteMageMaxMP": 9, - "BlackMageMaxMP": 9, - "KnightMaxMP": 4, - "NinjaMaxMP": 4, - "Knightlvl4": true, - "PinkMage": false, - "BlackKnight": true, - "BlackKnightKeep": false, - "WhiteNinja": true, - "WhiteNinjaKeep": true, - "MpGainOnMaxGainMode": 0, - "LockMode": 3, - "MDefMode": 0, - "FormationShuffleMode": 1, - "RandomizeTreasure": 0, - "OpenChestsInOrder": false, - "SetRNG": false, - "WorldWealth": 1, - "DeepDungeonGenerator": 0, - "EvadeCap": 3, - "AllowUnsafeStartArea": false, - "IncreaseDarkPenalty": true, - "IncreaseRegeneration": false, - "PoisonMode": 6, - "PoisonSetDamageValue": 3, - "TouchIncludeBosses": true, - "Lockpicking": true, - "ReducedLuck": false, - "LockpickingLevelRequirement": 22, - "WhiteMageHarmEveryone": true, - "ProcgenEarth": false, - "LoosePlacementMode": 0 - } + "Flags": { + "StartingEquipmentMasamune": false, + "StartingEquipmentKatana": false, + "StartingEquipmentHealStaff": false, + "StartingEquipmentZeusGauntlet": false, + "StartingEquipmentWhiteShirt": false, + "StartingEquipmentRibbon": false, + "StartingEquipmentDragonslayer": false, + "StartingEquipmentLegendKit": false, + "StartingEquipmentRandomEndgameWeapon": false, + "StartingEquipmentRandomAoe": false, + "StartingEquipmentRandomCasterItem": false, + "StartingEquipmentGrandpasSecretStash": false, + "StartingEquipmentOneItem": false, + "StartingEquipmentRandomCrap": false, + "StartingEquipmentStarterPack": false, + "StartingEquipmentRandomTypeWeapon": false, + "StartingEquipmentRemoveFromPool": false, + "StartingEquipmentNoDuplicates": false, + "ReversedFloors": false, + "BuffTier1DamageSpells": true, + "NoEmptyScripts": false, + "LaterLoose": false, + "MermaidPrison": true, + "GuaranteedDefenseItem": 3, + "GuaranteedPowerItem": 0, + "ScriptMultiplier": 1, + "TouchMultiplier": 2, + "TouchPool": 1, + "TouchMode": 0, + "RibbonMode": 0, + "Archipelago": false, + "ArchipelagoGold": false, + "ArchipelagoConsumables": false, + "ArchipelagoShards": false, + "ArchipelagoEquipment": 0, + "ItemMagicMode": 0, + "ItemMagicPool": 0, + "MagisizeWeapons": false, + "DisableMinimap": false, + "LooseItemsForwardPlacement": false, + "LooseItemsSpreadPlacement": false, + "LooseItemsNpcBalance": false, + "AllowUnsafePlacement": true, + "ShipCanalBeforeFloater": false, + "ExpChestConversionMin": 10, + "ExpChestConversionMax": 10, + "ExpChestMinReward": 3000, + "ExpChestMaxReward": 3000, + "SpellNameMadness": 0, + "ExtConsumableSet": 0, + "EnableSoftInBattle": true, + "EnableLifeInBattle": 0, + "NormalShopsHaveExtConsumables": false, + "LegendaryShopHasExtConsumables": false, + "ExtConsumableTreasureStackSize": 0, + "ExtStartingItemSet": 0, + "ExtConsumableChests": 0, + "OwMapExchange": 0, + "OwShuffledAccess": false, + "OwUnsafeStart": false, + "OwRandomPregen": false, + "RelocateChests": false, + "RelocateChestsTrapIndicator": false, + "ShuffleChimeAccess": true, + "ShuffleChimeIncludeTowns": false, + "GameMode": 0, + "MapGenSeed": 0, + "ReplacementMap": null, + "ResourcePack": null, + "ShopKillMode_Weapons": 0, + "ShopKillMode_Armor": 0, + "ShopKillMode_Item": 0, + "ShopKillMode_Black": 0, + "ShopKillMode_White": 0, + "ShopKillFactor_Weapons": 0, + "ShopKillFactor_Armor": 0, + "ShopKillFactor_Item": 0, + "ShopKillFactor_Black": 0, + "ShopKillFactor_White": 0, + "ShopKillExcludeConeria_Weapons": false, + "ShopKillExcludeConeria_Armor": false, + "ShopKillExcludeConeria_Item": false, + "ShopKillExcludeConeria_Black": false, + "ShopKillExcludeConeria_White": false, + "ExcludeGoldFromScaling": false, + "CheapVendorItem": false, + "StartingLevel": 0, + "TransmooglifierVariance": 0, + "MaxLevelLow": 50, + "MaxLevelHigh": 50, + "Spoilers": false, + "TriState": false, + "TournamentSafe": true, + "BlindSeed": false, + "Shops": true, + "Treasures": true, + "ChestsKeyItems": true, + "NPCItems": true, + "NPCFetchItems": true, + "RandomWares": false, + "RandomWaresIncludesSpecialGear": false, + "RandomLoot": false, + "ShardHunt": true, + "ShardCount": 3, + "OrbsRequiredCount": 4, + "OrbsRequiredMode": 0, + "OrbsRequiredSpoilers": false, + "TransformFinalFormation": 0, + "ChaosRush": false, + "ToFRMode": 1, + "FiendsRefights": 0, + "ExitToFR": true, + "ChaosFloorEncounters": false, + "MagicShops": false, + "MagicShopLocs": false, + "MagicShopLocationPairs": false, + "MagicLevels": true, + "MagicPermissions": false, + "Weaponizer": false, + "WeaponizerNamesUseQualityOnly": false, + "WeaponizerCommonWeaponsHavePowers": false, + "ArmorCrafter": false, + "MagicLevelsTiered": false, + "MagicLevelsMixed": false, + "MagicAutohitThreshold": 0, + "Rng": true, + "FixMissingBattleRngEntry": false, + "EncounterPrng": false, + "UnrunnableShuffle": true, + "UnrunnablesLow": 0, + "UnrunnablesHigh": 0, + "EnemyFormationsSurprise": true, + "UnrunnablesStrikeFirstAndSurprise": false, + "EnemyTrapTiles": 3, + "TCFormations": 2, + "TCBetterTreasure": 0, + "TCKeyItems": 2, + "TCShards": 2, + "TCExcludeCommons": false, + "TCChestCount": 0, + "TCProtectIncentives": false, + "TCMasaGuardian": false, + "TrappedChaos": false, + "TCIndicator": true, + "SwolePirates": false, + "ShuffleScriptsEnemies": true, + "RemoveBossScripts": false, + "ShuffleScriptsBosses": false, + "ShuffleSkillsSpellsEnemies": true, + "ShuffleSkillsSpellsBosses": false, + "NoConsecutiveNukes": false, + "TranceHasStatusElement": true, + "EnemySkillsSpellsTiered": false, + "AllowUnsafePirates": false, + "AllowUnsafeMelmond": false, + "WarMECHMode": 1, + "OrdealsPillars": true, + "ShuffleLavaTiles": false, + "SkyCastle4FMazeMode": 0, + "TitansTrove": true, + "LefeinShortcut": false, + "LefeinSuperStore": true, + "LefeinShops": true, + "RandomVampAttack": false, + "RandomVampAttackIncludesConeria": false, + "FightBahamut": false, + "SwoleBahamut": false, + "SwoleAstos": false, + "ConfusedOldMen": false, + "GaiaShortcut": true, + "DamageTileLow": 1, + "DamageTileHigh": 1, + "OWDamageTiles": false, + "DamageTilesKill": false, + "ArmorResistsDamageTileDamage": false, + "MoveGaiaItemShop": true, + "ShufflePravokaShops": false, + "FlipDungeons": false, + "VerticallyFlipDungeons": false, + "SpookyFlag": false, + "DraculasFlag": false, + "MapOpenProgression": true, + "MapOpenProgressionDocks": true, + "Entrances": false, + "Towns": false, + "IncludeConeria": false, + "Floors": false, + "AllowDeepCastles": false, + "AllowDeepTowns": false, + "MapOpenProgressionExtended": true, + "MapAirshipDock": true, + "MapBahamutCardiaDock": true, + "MapLefeinRiver": true, + "MapBridgeLefein": false, + "MapRiverToMelmond": true, + "MapGaiaMountainPass": false, + "MapHighwayToOrdeals": false, + "MapDragonsHoard": false, + "MapHallOfDragons": false, + "EntrancesIncludesDeadEnds": false, + "EntrancesMixedWithTowns": false, + "IncentivizeFreeNPCs": true, + "IncentivizeFetchNPCs": true, + "IncentivizeTail": true, + "IncentivizeMainItems": true, + "IncentivizeFetchItems": true, + "IncentivizeCanoeItem": true, + "IncentivizeAirship": true, + "IncentivizeShipAndCanal": true, + "IncentivizeBridgeItem": false, + "IncentivizeMarsh": false, + "IncentivizeEarth": true, + "IncentivizeVolcano": true, + "IncentivizeIceCave": false, + "IncentivizeOrdeals": true, + "IncentivizeSeaShrine": true, + "IncentivizeConeria": true, + "IncentivizeMarshKeyLocked": false, + "IncentivizeSkyPalace": true, + "IncentivizeTitansTrove": true, + "IncentivizeCardia": true, + "IceCaveIncentivePlacementType": 0, + "OrdealsIncentivePlacementType": 1, + "MarshIncentivePlacementType": 0, + "TitansIncentivePlacementType": 1, + "EarthIncentivePlacementType": 3, + "VolcanoIncentivePlacementType": 2, + "SeaShrineIncentivePlacementType": 3, + "SkyPalaceIncentivePlacementType": 3, + "CorneriaIncentivePlacementType": 0, + "MarshLockedIncentivePlacementType": 0, + "CardiaIncentivePlacementType": 1, + "BetterTrapChests": false, + "IncentivizeMasamune": false, + "IncentivizeKatana": false, + "IncentivizeXcalber": true, + "IncentivizeVorpal": false, + "IncentivizeOpal": false, + "IncentivizeRibbon": false, + "IncentivizeDefCastArmor": false, + "IncentivizeOffCastArmor": false, + "IncentivizeOtherCastArmor": true, + "IncentivizePowerRod": false, + "IncentivizeDefCastWeapon": true, + "IncentivizeOffCastWeapon": false, + "IncentivizeOtherCastWeapon": false, + "LooseExcludePlacedDungeons": false, + "EarlyKing": true, + "EarlySarda": true, + "EarlySage": true, + "EarlyOrdeals": true, + "ShuffleObjectiveNPCs": false, + "OnlyRequireGameIsBeatable": false, + "FreeBridge": true, + "FreeShip": false, + "FreeAirship": false, + "FreeLute": false, + "FreeRod": false, + "EnableCritNumberDisplay": true, + "FreeCanal": false, + "FreeCanoe": false, + "EasyMode": false, + "HousesFillHp": true, + "SpeedHacks": true, + "NoPartyShuffle": true, + "Dash": true, + "SpeedBoat": true, + "AirBoat": true, + "BuyTen": true, + "IdentifyTreasures": true, + "ShopInfo": true, + "ChestInfo": true, + "IncentiveChestItemsFanfare": true, + "WaitWhenUnrunnable": true, + "ImprovedClinic": false, + "Etherizer": false, + "HouseMPRestoration": true, + "WeaponStats": true, + "BBCritRate": false, + "WeaponCritRate": true, + "WeaponBonuses": true, + "ThiefAgilityBuff": 1, + "SkyWarriorSpoilerBats": 1, + "SpoilerBatsDontCheckOrbs": true, + "MoveToFBats": false, + "WeaponTypeBonusValue": 42, + "ChanceToRun": 1, + "SpellBugs": true, + "BlackBeltAbsorb": true, + "NPCSwatter": true, + "BattleMagicMenuWrapAround": true, + "MagicMenuSpellReordering": true, + "InventoryAutosort": true, + "RepeatedHealPotionUse": false, + "AutoRetargeting": true, + "EnemyStatusAttackBug": true, + "ImproveTurnOrderRandomization": true, + "FixHitChanceCap": true, + "MelmondClinic": false, + "DDProgressiveTilesets": false, + "DDFiendOrbs": false, + "TailBahamutMode": 0, + "StartingGold": 3, + "IncludeMorale": false, + "DeadsGainXP": false, + "NonesGainXP": false, + "NoTail": false, + "NoFloater": false, + "GuaranteedMasamune": false, + "SendMasamuneHome": false, + "MoreConsumableChests": 0, + "NoMasamune": false, + "NoXcalber": false, + "ClassAsNpcFiends": false, + "ClassAsNpcKeyNPC": false, + "ClassAsNpcCount": 6, + "ClassAsNpcDuplicate": false, + "ClassAsNpcForcedFiends": false, + "ClassAsNpcPromotion": false, + "BossScaleStatsLow": 130, + "BossScaleStatsHigh": 190, + "BossScaleHpLow": 160, + "BossScaleHpHigh": 190, + "EnemyScaleStatsLow": 90, + "EnemyScaleStatsHigh": 150, + "EnemyScaleHpLow": 50, + "EnemyScaleHpHigh": 150, + "PriceScaleFactorLow": 50, + "PriceScaleFactorHigh": 200, + "ExpMultiplier": 2.5, + "ExpBonus": 150, + "ExpMultiplierFighter": 1.1, + "ExpMultiplierThief": 1.1, + "ExpMultiplierBlackBelt": 1, + "ExpMultiplierRedMage": 1, + "ExpMultiplierWhiteMage": 1, + "ExpMultiplierBlackMage": 1, + "EncounterRate": 12, + "DungeonEncounterRate": 15, + "ProgressiveScaleMode": 11, + "StartingItemSet": 4, + "ConsumableTreasureStackSize": 2, + "FIGHTER1": true, + "THIEF1": true, + "BLACK_BELT1": true, + "RED_MAGE1": false, + "WHITE_MAGE1": false, + "BLACK_MAGE1": false, + "FIGHTER2": true, + "THIEF2": true, + "BLACK_BELT2": false, + "RED_MAGE2": true, + "WHITE_MAGE2": true, + "BLACK_MAGE2": true, + "FIGHTER3": false, + "THIEF3": false, + "BLACK_BELT3": false, + "RED_MAGE3": false, + "WHITE_MAGE3": false, + "BLACK_MAGE3": false, + "FIGHTER4": false, + "THIEF4": false, + "BLACK_BELT4": false, + "RED_MAGE4": true, + "WHITE_MAGE4": true, + "BLACK_MAGE4": true, + "KNIGHT1": false, + "KNIGHT2": false, + "KNIGHT3": false, + "KNIGHT4": false, + "NINJA1": false, + "NINJA2": false, + "NINJA3": false, + "NINJA4": false, + "MASTER1": false, + "MASTER2": false, + "MASTER3": false, + "MASTER4": false, + "RED_WIZ1": false, + "RED_WIZ2": false, + "RED_WIZ3": false, + "RED_WIZ4": false, + "WHITE_WIZ1": false, + "WHITE_WIZ2": false, + "WHITE_WIZ3": false, + "WHITE_WIZ4": false, + "BLACK_WIZ1": false, + "BLACK_WIZ2": false, + "BLACK_WIZ3": false, + "BLACK_WIZ4": false, + "NONE_CLASS2": true, + "NONE_CLASS3": true, + "NONE_CLASS4": true, + "FORCED1": true, + "FORCED2": true, + "FORCED3": true, + "FORCED4": false, + "DraftFighter": false, + "DraftThief": false, + "DraftBlackBelt": false, + "DraftRedMage": false, + "DraftWhiteMage": false, + "DraftBlackMage": false, + "DraftKnight": false, + "DraftNinja": false, + "DraftMaster": false, + "DraftRedWiz": false, + "DraftWhiteWiz": false, + "DraftBlackWiz": false, + "TAVERN1": true, + "TAVERN2": true, + "TAVERN3": false, + "TAVERN4": true, + "TAVERN5": true, + "TAVERN6": true, + "WeaponPermissions": false, + "ArmorPermissions": false, + "RecruitmentMode": true, + "RecruitmentModeHireOnly": false, + "RecruitmentModeReplaceOnlyNone": true, + "ClampMinimumStatScale": false, + "ClampMinimumBossStatScale": false, + "ClampMinimumPriceScale": false, + "FiendShuffle": false, + "DisableTentSaving": false, + "DisableInnSaving": false, + "SaveGameWhenGameOver": false, + "SaveGameDWMode": false, + "ShuffleAstos": false, + "UnsafeAstos": false, + "RandomizeEnemizer": false, + "RandomizeFormationEnemizer": false, + "GenerateNewSpellbook": false, + "SpellcrafterMixSpells": false, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, + "AllSpellLevelsForKnightNinja": false, + "BuffHealingSpells": true, + "IntAffectsSpells": false, + "AddDamageTiles": false, + "DamageTilesCastles": false, + "DamageTilesDungeons": false, + "DamageTilesCaves": false, + "DamageTilesTowns": false, + "DamageTilesTof": false, + "DamageTilesQuantity": 1, + "FreeTail": false, + "HintsVillage": false, + "SpellcrafterRetainPermissions": false, + "RandomWeaponBonus": true, + "RandomArmorBonus": true, + "RandomWeaponBonusExcludeMasa": false, + "RandomWeaponBonusLow": 0, + "RandomWeaponBonusHigh": 5, + "RandomArmorBonusLow": 0, + "RandomArmorBonusHigh": 5, + "SeparateBossHPScaling": true, + "SeparateEnemyHPScaling": false, + "ClampBossHPScaling": false, + "ClampEnemyHpScaling": false, + "PoolSize": 2, + "EnablePoolParty": false, + "SafePoolParty": false, + "IncludePromClasses": false, + "EnableRandomPromotions": false, + "IncludeBaseClasses": false, + "RandomPromotionsSpoilers": false, + "RandomizeClassCasting": true, + "RandomizeClassKeyItems": false, + "RandomizeClassIncludeXpBonus": false, + "AlternateFiends": false, + "FinalFantasy2Fiends": false, + "FinalFantasy3Fiends": false, + "FinalFantasy4Fiends": false, + "FinalFantasy5Fiends": false, + "FinalFantasy6Fiends": false, + "FinalFantasy1BonusFiends": false, + "BlackOrbFiends": false, + "NoBossSkillScriptShuffle": false, + "MooglieWeaponBalance": false, + "GuaranteeCustomClassComposition": false, + "LegendaryWeaponShop": false, + "LegendaryArmorShop": false, + "LegendaryBlackShop": false, + "LegendaryWhiteShop": false, + "LegendaryItemShop": false, + "ExclusiveLegendaryWeaponShop": false, + "ExclusiveLegendaryArmorShop": false, + "ExclusiveLegendaryBlackShop": false, + "ExclusiveLegendaryWhiteShop": false, + "ExclusiveLegendaryItemShop": false, + "RandomizeClassMode": 1, + "RandomizeClassMaxBonus": 1, + "RandomizeClassMaxMalus": 0, + "EarlierHighTierMagic": false, + "ChangeMaxMP": false, + "RedMageMaxMP": 9, + "WhiteMageMaxMP": 9, + "BlackMageMaxMP": 9, + "KnightMaxMP": 4, + "NinjaMaxMP": 4, + "Knightlvl4": true, + "PinkMage": false, + "BlackKnight": true, + "BlackKnightKeep": false, + "WhiteNinja": true, + "WhiteNinjaKeep": true, + "MpGainOnMaxGainMode": 0, + "LockMode": 3, + "MDefMode": 0, + "FormationShuffleMode": 1, + "RandomizeTreasure": 0, + "OpenChestsInOrder": false, + "SetRNG": false, + "WorldWealth": 1, + "DeepDungeonGenerator": 0, + "EvadeCap": 3, + "AllowUnsafeStartArea": false, + "IncreaseDarkPenalty": true, + "IncreaseRegeneration": false, + "PoisonMode": 6, + "PoisonSetDamageValue": 3, + "TouchIncludeBosses": true, + "Lockpicking": true, + "ReducedLuck": false, + "LockpickingLevelRequirement": 22, + "WhiteMageHarmEveryone": true, + "ProcgenEarth": false, + "LoosePlacementMode": 0 + } } diff --git a/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json b/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json index 7aa1ca126..c6e7c68a5 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json @@ -1,532 +1,534 @@ { "Name": "Winter Tournament 2025 Semifinals", - "Flags": { - "StartingEquipmentMasamune": false, - "StartingEquipmentKatana": false, - "StartingEquipmentHealStaff": false, - "StartingEquipmentZeusGauntlet": false, - "StartingEquipmentWhiteShirt": false, - "StartingEquipmentRibbon": false, - "StartingEquipmentDragonslayer": false, - "StartingEquipmentLegendKit": false, - "StartingEquipmentRandomEndgameWeapon": false, - "StartingEquipmentRandomAoe": false, - "StartingEquipmentRandomCasterItem": false, - "StartingEquipmentGrandpasSecretStash": false, - "StartingEquipmentOneItem": false, - "StartingEquipmentRandomCrap": false, - "StartingEquipmentStarterPack": false, - "StartingEquipmentRandomTypeWeapon": false, - "StartingEquipmentRemoveFromPool": false, - "StartingEquipmentNoDuplicates": false, - "ReversedFloors": false, - "BuffTier1DamageSpells": true, - "NoEmptyScripts": false, - "LaterLoose": false, - "MermaidPrison": true, - "GuaranteedDefenseItem": 3, - "GuaranteedPowerItem": 0, - "ScriptMultiplier": 1, - "TouchMultiplier": 2, - "TouchPool": 1, - "TouchMode": 0, - "RibbonMode": 0, - "Archipelago": false, - "ArchipelagoGold": false, - "ArchipelagoConsumables": false, - "ArchipelagoShards": false, - "ArchipelagoEquipment": 0, - "ItemMagicMode": 0, - "ItemMagicPool": 0, - "MagisizeWeapons": false, - "DisableMinimap": false, - "LooseItemsForwardPlacement": false, - "LooseItemsSpreadPlacement": false, - "LooseItemsNpcBalance": false, - "AllowUnsafePlacement": true, - "ShipCanalBeforeFloater": false, - "ExpChestConversionMin": 10, - "ExpChestConversionMax": 10, - "ExpChestMinReward": 3000, - "ExpChestMaxReward": 3000, - "SpellNameMadness": 0, - "ExtConsumableSet": 0, - "EnableSoftInBattle": true, - "EnableLifeInBattle": 0, - "NormalShopsHaveExtConsumables": false, - "LegendaryShopHasExtConsumables": false, - "ExtConsumableTreasureStackSize": 0, - "ExtStartingItemSet": 0, - "ExtConsumableChests": 0, - "OwMapExchange": 0, - "OwShuffledAccess": false, - "OwUnsafeStart": false, - "OwRandomPregen": false, - "RelocateChests": false, - "RelocateChestsTrapIndicator": false, - "ShuffleChimeAccess": true, - "ShuffleChimeIncludeTowns": false, - "GameMode": 0, - "MapGenSeed": 0, - "ReplacementMap": null, - "ResourcePack": null, - "ShopKillMode_Weapons": 0, - "ShopKillMode_Armor": 0, - "ShopKillMode_Item": 0, - "ShopKillMode_Black": 0, - "ShopKillMode_White": 0, - "ShopKillFactor_Weapons": 0, - "ShopKillFactor_Armor": 0, - "ShopKillFactor_Item": 0, - "ShopKillFactor_Black": 0, - "ShopKillFactor_White": 0, - "ShopKillExcludeConeria_Weapons": false, - "ShopKillExcludeConeria_Armor": false, - "ShopKillExcludeConeria_Item": false, - "ShopKillExcludeConeria_Black": false, - "ShopKillExcludeConeria_White": false, - "ExcludeGoldFromScaling": false, - "CheapVendorItem": false, - "StartingLevel": 0, - "TransmooglifierVariance": 0, - "MaxLevelLow": 50, - "MaxLevelHigh": 50, - "Spoilers": false, - "TournamentSafe": true, - "BlindSeed": false, - "Shops": true, - "Treasures": true, - "ChestsKeyItems": true, - "NPCItems": true, - "NPCFetchItems": true, - "RandomWares": false, - "RandomWaresIncludesSpecialGear": false, - "RandomLoot": false, - "ShardHunt": true, - "ShardCount": 7, - "OrbsRequiredCount": 4, - "OrbsRequiredMode": 0, - "OrbsRequiredSpoilers": false, - "TransformFinalFormation": 0, - "ChaosRush": false, - "ToFRMode": 1, - "FiendsRefights": 0, - "ExitToFR": true, - "ChaosFloorEncounters": false, - "MagicShops": false, - "MagicShopLocs": false, - "MagicShopLocationPairs": false, - "MagicLevels": true, - "MagicPermissions": false, - "Weaponizer": false, - "WeaponizerNamesUseQualityOnly": false, - "WeaponizerCommonWeaponsHavePowers": false, - "ArmorCrafter": false, - "MagicLevelsTiered": false, - "MagicLevelsMixed": false, - "MagicAutohitThreshold": 0, - "Rng": true, - "FixMissingBattleRngEntry": false, - "EncounterPrng": false, - "UnrunnableShuffle": true, - "UnrunnablesLow": 0, - "UnrunnablesHigh": 0, - "EnemyFormationsSurprise": true, - "UnrunnablesStrikeFirstAndSurprise": false, - "EnemyTrapTiles": 3, - "TCFormations": 2, - "TCBetterTreasure": 0, - "TCKeyItems": 2, - "TCShards": 2, - "TCExcludeCommons": false, - "TCChestCount": 0, - "TCProtectIncentives": false, - "TCMasaGuardian": false, - "TrappedChaos": false, - "TCIndicator": true, - "SwolePirates": false, - "ShuffleScriptsEnemies": true, - "RemoveBossScripts": false, - "ShuffleScriptsBosses": false, - "ShuffleSkillsSpellsEnemies": true, - "ShuffleSkillsSpellsBosses": false, - "NoConsecutiveNukes": false, - "TranceHasStatusElement": true, - "EnemySkillsSpellsTiered": false, - "AllowUnsafePirates": false, - "AllowUnsafeMelmond": false, - "WarMECHMode": 1, - "OrdealsPillars": true, - "ShuffleLavaTiles": false, - "SkyCastle4FMazeMode": 0, - "TitansTrove": true, - "LefeinSuperStore": true, - "LefeinShops": true, - "RandomVampAttack": false, - "RandomVampAttackIncludesConeria": false, - "FightBahamut": false, - "SwoleBahamut": false, - "SwoleAstos": false, - "ConfusedOldMen": false, - "GaiaShortcut": true, - "DamageTileLow": 1, - "DamageTileHigh": 1, - "OWDamageTiles": false, - "DamageTilesKill": false, - "ArmorResistsDamageTileDamage": false, - "MoveGaiaItemShop": true, - "ShufflePravokaShops": false, - "FlipDungeons": false, - "VerticallyFlipDungeons": false, - "SpookyFlag": false, - "DraculasFlag": false, - "MapOpenProgression": true, - "MapOpenProgressionDocks": true, - "Entrances": false, - "Towns": false, - "IncludeConeria": false, - "Floors": false, - "AllowDeepCastles": false, - "AllowDeepTowns": false, - "MapOpenProgressionExtended": true, - "MapAirshipDock": true, - "MapBahamutCardiaDock": true, - "MapLefeinRiver": true, - "MapBridgeLefein": true, - "MapRiverToMelmond": true, - "MapGaiaMountainPass": true, - "MapHighwayToOrdeals": true, - "MapDragonsHoard": false, - "MapHallOfDragons": false, - "EntrancesIncludesDeadEnds": false, - "EntrancesMixedWithTowns": false, - "IncentivizeFreeNPCs": true, - "IncentivizeFetchNPCs": true, - "IncentivizeTail": true, - "IncentivizeMainItems": true, - "IncentivizeFetchItems": true, - "IncentivizeCanoeItem": true, - "IncentivizeAirship": true, - "IncentivizeShipAndCanal": true, - "IncentivizeBridgeItem": false, - "IncentivizeMarsh": false, - "IncentivizeEarth": true, - "IncentivizeVolcano": true, - "IncentivizeIceCave": false, - "IncentivizeOrdeals": true, - "IncentivizeSeaShrine": true, - "IncentivizeConeria": true, - "IncentivizeMarshKeyLocked": false, - "IncentivizeSkyPalace": true, - "IncentivizeTitansTrove": true, - "IncentivizeCardia": true, - "IceCaveIncentivePlacementType": 0, - "OrdealsIncentivePlacementType": 1, - "MarshIncentivePlacementType": 0, - "TitansIncentivePlacementType": 1, - "EarthIncentivePlacementType": 3, - "VolcanoIncentivePlacementType": 2, - "SeaShrineIncentivePlacementType": 3, - "SkyPalaceIncentivePlacementType": 3, - "CorneriaIncentivePlacementType": 0, - "MarshLockedIncentivePlacementType": 0, - "CardiaIncentivePlacementType": 1, - "BetterTrapChests": false, - "IncentivizeMasamune": false, - "IncentivizeKatana": false, - "IncentivizeXcalber": true, - "IncentivizeVorpal": false, - "IncentivizeOpal": false, - "IncentivizeRibbon": false, - "IncentivizeDefCastArmor": false, - "IncentivizeOffCastArmor": false, - "IncentivizeOtherCastArmor": true, - "IncentivizePowerRod": false, - "IncentivizeDefCastWeapon": true, - "IncentivizeOffCastWeapon": false, - "IncentivizeOtherCastWeapon": false, - "LooseExcludePlacedDungeons": false, - "EarlyKing": true, - "EarlySarda": true, - "EarlySage": true, - "EarlyOrdeals": true, - "ShuffleObjectiveNPCs": false, - "OnlyRequireGameIsBeatable": false, - "FreeBridge": true, - "FreeShip": false, - "FreeAirship": false, - "FreeLute": false, - "FreeRod": false, - "EnableCritNumberDisplay": true, - "FreeCanal": false, - "FreeCanoe": false, - "EasyMode": false, - "HousesFillHp": true, - "SpeedHacks": true, - "NoPartyShuffle": true, - "Dash": true, - "SpeedBoat": true, - "AirBoat": true, - "BuyTen": true, - "IdentifyTreasures": true, - "ShopInfo": true, - "ChestInfo": true, - "IncentiveChestItemsFanfare": true, - "WaitWhenUnrunnable": true, - "ImprovedClinic": false, - "Etherizer": false, - "HouseMPRestoration": true, - "WeaponStats": true, - "BBCritRate": false, - "WeaponCritRate": true, - "WeaponBonuses": true, - "ThiefAgilityBuff": 1, - "SkyWarriorSpoilerBats": 1, - "SpoilerBatsDontCheckOrbs": true, - "MoveToFBats": false, - "WeaponTypeBonusValue": 42, - "ChanceToRun": 1, - "SpellBugs": true, - "BlackBeltAbsorb": true, - "NPCSwatter": true, - "BattleMagicMenuWrapAround": true, - "MagicMenuSpellReordering": true, - "InventoryAutosort": true, - "RepeatedHealPotionUse": false, - "AutoRetargeting": true, - "EnemyStatusAttackBug": true, - "ImproveTurnOrderRandomization": true, - "FixHitChanceCap": true, - "MelmondClinic": false, - "DDProgressiveTilesets": false, - "DDFiendOrbs": false, - "TailBahamutMode": 0, - "StartingGold": 3, - "IncludeMorale": false, - "DeadsGainXP": false, - "NonesGainXP": false, - "NoTail": false, - "NoFloater": false, - "GuaranteedMasamune": false, - "SendMasamuneHome": false, - "MoreConsumableChests": 0, - "NoMasamune": false, - "NoXcalber": false, - "ClassAsNpcFiends": false, - "ClassAsNpcKeyNPC": false, - "ClassAsNpcCount": 6, - "ClassAsNpcDuplicate": false, - "ClassAsNpcForcedFiends": false, - "ClassAsNpcPromotion": false, - "BossScaleStatsLow": 140, - "BossScaleStatsHigh": 200, - "BossScaleHpLow": 170, - "BossScaleHpHigh": 200, - "EnemyScaleStatsLow": 100, - "EnemyScaleStatsHigh": 160, - "EnemyScaleHpLow": 50, - "EnemyScaleHpHigh": 150, - "PriceScaleFactorLow": 50, - "PriceScaleFactorHigh": 200, - "ExpMultiplier": 2.5, - "ExpBonus": 150, - "ExpMultiplierFighter": 1.1, - "ExpMultiplierThief": 1.1, - "ExpMultiplierBlackBelt": 1, - "ExpMultiplierRedMage": 1, - "ExpMultiplierWhiteMage": 1, - "ExpMultiplierBlackMage": 1, - "EncounterRate": 12, - "DungeonEncounterRate": 15, - "ProgressiveScaleMode": 11, - "StartingItemSet": 4, - "ConsumableTreasureStackSize": 2, - "FIGHTER1": true, - "THIEF1": true, - "BLACK_BELT1": true, - "RED_MAGE1": false, - "WHITE_MAGE1": false, - "BLACK_MAGE1": false, - "FIGHTER2": true, - "THIEF2": true, - "BLACK_BELT2": false, - "RED_MAGE2": true, - "WHITE_MAGE2": true, - "BLACK_MAGE2": true, - "FIGHTER3": false, - "THIEF3": false, - "BLACK_BELT3": false, - "RED_MAGE3": false, - "WHITE_MAGE3": false, - "BLACK_MAGE3": false, - "FIGHTER4": false, - "THIEF4": false, - "BLACK_BELT4": false, - "RED_MAGE4": true, - "WHITE_MAGE4": true, - "BLACK_MAGE4": true, - "KNIGHT1": false, - "KNIGHT2": false, - "KNIGHT3": false, - "KNIGHT4": false, - "NINJA1": false, - "NINJA2": false, - "NINJA3": false, - "NINJA4": false, - "MASTER1": false, - "MASTER2": false, - "MASTER3": false, - "MASTER4": false, - "RED_WIZ1": false, - "RED_WIZ2": false, - "RED_WIZ3": false, - "RED_WIZ4": false, - "WHITE_WIZ1": false, - "WHITE_WIZ2": false, - "WHITE_WIZ3": false, - "WHITE_WIZ4": false, - "BLACK_WIZ1": false, - "BLACK_WIZ2": false, - "BLACK_WIZ3": false, - "BLACK_WIZ4": false, - "NONE_CLASS2": true, - "NONE_CLASS3": true, - "NONE_CLASS4": true, - "FORCED1": true, - "FORCED2": true, - "FORCED3": true, - "FORCED4": false, - "DraftFighter": false, - "DraftThief": false, - "DraftBlackBelt": false, - "DraftRedMage": false, - "DraftWhiteMage": false, - "DraftBlackMage": false, - "DraftKnight": false, - "DraftNinja": false, - "DraftMaster": false, - "DraftRedWiz": false, - "DraftWhiteWiz": false, - "DraftBlackWiz": false, - "TAVERN1": true, - "TAVERN2": true, - "TAVERN3": false, - "TAVERN4": true, - "TAVERN5": true, - "TAVERN6": true, - "WeaponPermissions": false, - "ArmorPermissions": false, - "RecruitmentMode": true, - "RecruitmentModeHireOnly": false, - "RecruitmentModeReplaceOnlyNone": true, - "ClampMinimumStatScale": false, - "ClampMinimumBossStatScale": false, - "ClampMinimumPriceScale": false, - "EFGWaterfall": false, - "FiendShuffle": false, - "DisableTentSaving": false, - "DisableInnSaving": false, - "SaveGameWhenGameOver": false, - "SaveGameDWMode": false, - "ShuffleAstos": false, - "UnsafeAstos": false, - "RandomizeEnemizer": false, - "RandomizeFormationEnemizer": false, - "GenerateNewSpellbook": false, - "SpellcrafterMixSpells": false, - "ThiefHitRate": true, - "AllSpellLevelsForKnightNinja": false, - "BuffHealingSpells": true, - "IntAffectsSpells": false, - "AddDamageTiles": false, - "DamageTilesCastles": false, - "DamageTilesDungeons": false, - "DamageTilesCaves": false, - "DamageTilesTowns": false, - "DamageTilesTof": false, - "DamageTilesQuantity": 1, - "FreeTail": false, - "HintsVillage": false, - "SpellcrafterRetainPermissions": false, - "RandomWeaponBonus": true, - "RandomArmorBonus": true, - "RandomWeaponBonusExcludeMasa": false, - "RandomWeaponBonusLow": 0, - "RandomWeaponBonusHigh": 5, - "RandomArmorBonusLow": 0, - "RandomArmorBonusHigh": 5, - "SeparateBossHPScaling": true, - "SeparateEnemyHPScaling": false, - "ClampBossHPScaling": false, - "ClampEnemyHpScaling": false, - "PoolSize": 2, - "EnablePoolParty": false, - "SafePoolParty": false, - "IncludePromClasses": false, - "EnableRandomPromotions": false, - "IncludeBaseClasses": false, - "RandomPromotionsSpoilers": false, - "RandomizeClassCasting": true, - "RandomizeClassKeyItems": false, - "RandomizeClassIncludeXpBonus": false, - "AlternateFiends": false, - "FinalFantasy2Fiends": false, - "FinalFantasy3Fiends": false, - "FinalFantasy4Fiends": false, - "FinalFantasy5Fiends": false, - "FinalFantasy6Fiends": false, - "FinalFantasy1BonusFiends": false, - "BlackOrbFiends": false, - "NoBossSkillScriptShuffle": false, - "MooglieWeaponBalance": false, - "GuaranteeCustomClassComposition": false, - "LegendaryWeaponShop": false, - "LegendaryArmorShop": false, - "LegendaryBlackShop": false, - "LegendaryWhiteShop": false, - "LegendaryItemShop": false, - "ExclusiveLegendaryWeaponShop": false, - "ExclusiveLegendaryArmorShop": false, - "ExclusiveLegendaryBlackShop": false, - "ExclusiveLegendaryWhiteShop": false, - "ExclusiveLegendaryItemShop": false, - "RandomizeClassMode": 1, - "RandomizeClassMaxBonus": 1, - "RandomizeClassMaxMalus": 0, - "EarlierHighTierMagic": false, - "ChangeMaxMP": false, - "RedMageMaxMP": 9, - "WhiteMageMaxMP": 9, - "BlackMageMaxMP": 9, - "KnightMaxMP": 4, - "NinjaMaxMP": 4, - "Knightlvl4": true, - "PinkMage": false, - "BlackKnight": true, - "BlackKnightKeep": false, - "WhiteNinja": true, - "WhiteNinjaKeep": true, - "MpGainOnMaxGainMode": 0, - "LockMode": 3, - "MDefMode": 0, - "FormationShuffleMode": 1, - "RandomizeTreasure": 0, - "OpenChestsInOrder": false, - "SetRNG": false, - "WorldWealth": 1, - "DeepDungeonGenerator": 0, - "EvadeCap": 3, - "AllowUnsafeStartArea": false, - "IncreaseDarkPenalty": true, - "IncreaseRegeneration": false, - "PoisonMode": 6, - "PoisonSetDamageValue": 3, - "TouchIncludeBosses": true, - "Lockpicking": true, - "ReducedLuck": false, - "LockpickingLevelRequirement": 22, - "WhiteMageHarmEveryone": true, - "ProcgenEarth": false, - "LoosePlacementMode": 0 - } + "Flags": { + "StartingEquipmentMasamune": false, + "StartingEquipmentKatana": false, + "StartingEquipmentHealStaff": false, + "StartingEquipmentZeusGauntlet": false, + "StartingEquipmentWhiteShirt": false, + "StartingEquipmentRibbon": false, + "StartingEquipmentDragonslayer": false, + "StartingEquipmentLegendKit": false, + "StartingEquipmentRandomEndgameWeapon": false, + "StartingEquipmentRandomAoe": false, + "StartingEquipmentRandomCasterItem": false, + "StartingEquipmentGrandpasSecretStash": false, + "StartingEquipmentOneItem": false, + "StartingEquipmentRandomCrap": false, + "StartingEquipmentStarterPack": false, + "StartingEquipmentRandomTypeWeapon": false, + "StartingEquipmentRemoveFromPool": false, + "StartingEquipmentNoDuplicates": false, + "ReversedFloors": false, + "BuffTier1DamageSpells": true, + "NoEmptyScripts": false, + "LaterLoose": false, + "MermaidPrison": true, + "GuaranteedDefenseItem": 3, + "GuaranteedPowerItem": 0, + "ScriptMultiplier": 1, + "TouchMultiplier": 2, + "TouchPool": 1, + "TouchMode": 0, + "RibbonMode": 0, + "Archipelago": false, + "ArchipelagoGold": false, + "ArchipelagoConsumables": false, + "ArchipelagoShards": false, + "ArchipelagoEquipment": 0, + "ItemMagicMode": 0, + "ItemMagicPool": 0, + "MagisizeWeapons": false, + "DisableMinimap": false, + "LooseItemsForwardPlacement": false, + "LooseItemsSpreadPlacement": false, + "LooseItemsNpcBalance": false, + "AllowUnsafePlacement": true, + "ShipCanalBeforeFloater": false, + "ExpChestConversionMin": 10, + "ExpChestConversionMax": 10, + "ExpChestMinReward": 3000, + "ExpChestMaxReward": 3000, + "SpellNameMadness": 0, + "ExtConsumableSet": 0, + "EnableSoftInBattle": true, + "EnableLifeInBattle": 0, + "NormalShopsHaveExtConsumables": false, + "LegendaryShopHasExtConsumables": false, + "ExtConsumableTreasureStackSize": 0, + "ExtStartingItemSet": 0, + "ExtConsumableChests": 0, + "OwMapExchange": 0, + "OwShuffledAccess": false, + "OwUnsafeStart": false, + "OwRandomPregen": false, + "RelocateChests": false, + "RelocateChestsTrapIndicator": false, + "ShuffleChimeAccess": true, + "ShuffleChimeIncludeTowns": false, + "GameMode": 0, + "MapGenSeed": 0, + "ReplacementMap": null, + "ResourcePack": null, + "ShopKillMode_Weapons": 0, + "ShopKillMode_Armor": 0, + "ShopKillMode_Item": 0, + "ShopKillMode_Black": 0, + "ShopKillMode_White": 0, + "ShopKillFactor_Weapons": 0, + "ShopKillFactor_Armor": 0, + "ShopKillFactor_Item": 0, + "ShopKillFactor_Black": 0, + "ShopKillFactor_White": 0, + "ShopKillExcludeConeria_Weapons": false, + "ShopKillExcludeConeria_Armor": false, + "ShopKillExcludeConeria_Item": false, + "ShopKillExcludeConeria_Black": false, + "ShopKillExcludeConeria_White": false, + "ExcludeGoldFromScaling": false, + "CheapVendorItem": false, + "StartingLevel": 0, + "TransmooglifierVariance": 0, + "MaxLevelLow": 50, + "MaxLevelHigh": 50, + "Spoilers": false, + "TriState": false, + "TournamentSafe": true, + "BlindSeed": false, + "Shops": true, + "Treasures": true, + "ChestsKeyItems": true, + "NPCItems": true, + "NPCFetchItems": true, + "RandomWares": false, + "RandomWaresIncludesSpecialGear": false, + "RandomLoot": false, + "ShardHunt": true, + "ShardCount": 7, + "OrbsRequiredCount": 4, + "OrbsRequiredMode": 0, + "OrbsRequiredSpoilers": false, + "TransformFinalFormation": 0, + "ChaosRush": false, + "ToFRMode": 1, + "FiendsRefights": 0, + "ExitToFR": true, + "ChaosFloorEncounters": false, + "MagicShops": false, + "MagicShopLocs": false, + "MagicShopLocationPairs": false, + "MagicLevels": true, + "MagicPermissions": false, + "Weaponizer": false, + "WeaponizerNamesUseQualityOnly": false, + "WeaponizerCommonWeaponsHavePowers": false, + "ArmorCrafter": false, + "MagicLevelsTiered": false, + "MagicLevelsMixed": false, + "MagicAutohitThreshold": 0, + "Rng": true, + "FixMissingBattleRngEntry": false, + "EncounterPrng": false, + "UnrunnableShuffle": true, + "UnrunnablesLow": 0, + "UnrunnablesHigh": 0, + "EnemyFormationsSurprise": true, + "UnrunnablesStrikeFirstAndSurprise": false, + "EnemyTrapTiles": 3, + "TCFormations": 2, + "TCBetterTreasure": 0, + "TCKeyItems": 2, + "TCShards": 2, + "TCExcludeCommons": false, + "TCChestCount": 0, + "TCProtectIncentives": false, + "TCMasaGuardian": false, + "TrappedChaos": false, + "TCIndicator": true, + "SwolePirates": false, + "ShuffleScriptsEnemies": true, + "RemoveBossScripts": false, + "ShuffleScriptsBosses": false, + "ShuffleSkillsSpellsEnemies": true, + "ShuffleSkillsSpellsBosses": false, + "NoConsecutiveNukes": false, + "TranceHasStatusElement": true, + "EnemySkillsSpellsTiered": false, + "AllowUnsafePirates": false, + "AllowUnsafeMelmond": false, + "WarMECHMode": 1, + "OrdealsPillars": true, + "ShuffleLavaTiles": false, + "SkyCastle4FMazeMode": 0, + "TitansTrove": true, + "LefeinShortcut": false, + "LefeinSuperStore": true, + "LefeinShops": true, + "RandomVampAttack": false, + "RandomVampAttackIncludesConeria": false, + "FightBahamut": false, + "SwoleBahamut": false, + "SwoleAstos": false, + "ConfusedOldMen": false, + "GaiaShortcut": true, + "DamageTileLow": 1, + "DamageTileHigh": 1, + "OWDamageTiles": false, + "DamageTilesKill": false, + "ArmorResistsDamageTileDamage": false, + "MoveGaiaItemShop": true, + "ShufflePravokaShops": false, + "FlipDungeons": false, + "VerticallyFlipDungeons": false, + "SpookyFlag": false, + "DraculasFlag": false, + "MapOpenProgression": true, + "MapOpenProgressionDocks": true, + "Entrances": false, + "Towns": false, + "IncludeConeria": false, + "Floors": false, + "AllowDeepCastles": false, + "AllowDeepTowns": false, + "MapOpenProgressionExtended": true, + "MapAirshipDock": true, + "MapBahamutCardiaDock": true, + "MapLefeinRiver": true, + "MapBridgeLefein": true, + "MapRiverToMelmond": true, + "MapGaiaMountainPass": true, + "MapHighwayToOrdeals": true, + "MapDragonsHoard": false, + "MapHallOfDragons": false, + "EntrancesIncludesDeadEnds": false, + "EntrancesMixedWithTowns": false, + "IncentivizeFreeNPCs": true, + "IncentivizeFetchNPCs": true, + "IncentivizeTail": true, + "IncentivizeMainItems": true, + "IncentivizeFetchItems": true, + "IncentivizeCanoeItem": true, + "IncentivizeAirship": true, + "IncentivizeShipAndCanal": true, + "IncentivizeBridgeItem": false, + "IncentivizeMarsh": false, + "IncentivizeEarth": true, + "IncentivizeVolcano": true, + "IncentivizeIceCave": false, + "IncentivizeOrdeals": true, + "IncentivizeSeaShrine": true, + "IncentivizeConeria": true, + "IncentivizeMarshKeyLocked": false, + "IncentivizeSkyPalace": true, + "IncentivizeTitansTrove": true, + "IncentivizeCardia": true, + "IceCaveIncentivePlacementType": 0, + "OrdealsIncentivePlacementType": 1, + "MarshIncentivePlacementType": 0, + "TitansIncentivePlacementType": 1, + "EarthIncentivePlacementType": 3, + "VolcanoIncentivePlacementType": 2, + "SeaShrineIncentivePlacementType": 3, + "SkyPalaceIncentivePlacementType": 3, + "CorneriaIncentivePlacementType": 0, + "MarshLockedIncentivePlacementType": 0, + "CardiaIncentivePlacementType": 1, + "BetterTrapChests": false, + "IncentivizeMasamune": false, + "IncentivizeKatana": false, + "IncentivizeXcalber": true, + "IncentivizeVorpal": false, + "IncentivizeOpal": false, + "IncentivizeRibbon": false, + "IncentivizeDefCastArmor": false, + "IncentivizeOffCastArmor": false, + "IncentivizeOtherCastArmor": true, + "IncentivizePowerRod": false, + "IncentivizeDefCastWeapon": true, + "IncentivizeOffCastWeapon": false, + "IncentivizeOtherCastWeapon": false, + "LooseExcludePlacedDungeons": false, + "EarlyKing": true, + "EarlySarda": true, + "EarlySage": true, + "EarlyOrdeals": true, + "ShuffleObjectiveNPCs": false, + "OnlyRequireGameIsBeatable": false, + "FreeBridge": true, + "FreeShip": false, + "FreeAirship": false, + "FreeLute": false, + "FreeRod": false, + "EnableCritNumberDisplay": true, + "FreeCanal": false, + "FreeCanoe": false, + "EasyMode": false, + "HousesFillHp": true, + "SpeedHacks": true, + "NoPartyShuffle": true, + "Dash": true, + "SpeedBoat": true, + "AirBoat": true, + "BuyTen": true, + "IdentifyTreasures": true, + "ShopInfo": true, + "ChestInfo": true, + "IncentiveChestItemsFanfare": true, + "WaitWhenUnrunnable": true, + "ImprovedClinic": false, + "Etherizer": false, + "HouseMPRestoration": true, + "WeaponStats": true, + "BBCritRate": false, + "WeaponCritRate": true, + "WeaponBonuses": true, + "ThiefAgilityBuff": 1, + "SkyWarriorSpoilerBats": 1, + "SpoilerBatsDontCheckOrbs": true, + "MoveToFBats": false, + "WeaponTypeBonusValue": 42, + "ChanceToRun": 1, + "SpellBugs": true, + "BlackBeltAbsorb": true, + "NPCSwatter": true, + "BattleMagicMenuWrapAround": true, + "MagicMenuSpellReordering": true, + "InventoryAutosort": true, + "RepeatedHealPotionUse": false, + "AutoRetargeting": true, + "EnemyStatusAttackBug": true, + "ImproveTurnOrderRandomization": true, + "FixHitChanceCap": true, + "MelmondClinic": false, + "DDProgressiveTilesets": false, + "DDFiendOrbs": false, + "TailBahamutMode": 0, + "StartingGold": 3, + "IncludeMorale": false, + "DeadsGainXP": false, + "NonesGainXP": false, + "NoTail": false, + "NoFloater": false, + "GuaranteedMasamune": false, + "SendMasamuneHome": false, + "MoreConsumableChests": 0, + "NoMasamune": false, + "NoXcalber": false, + "ClassAsNpcFiends": false, + "ClassAsNpcKeyNPC": false, + "ClassAsNpcCount": 6, + "ClassAsNpcDuplicate": false, + "ClassAsNpcForcedFiends": false, + "ClassAsNpcPromotion": false, + "BossScaleStatsLow": 140, + "BossScaleStatsHigh": 200, + "BossScaleHpLow": 170, + "BossScaleHpHigh": 200, + "EnemyScaleStatsLow": 100, + "EnemyScaleStatsHigh": 160, + "EnemyScaleHpLow": 50, + "EnemyScaleHpHigh": 150, + "PriceScaleFactorLow": 50, + "PriceScaleFactorHigh": 200, + "ExpMultiplier": 2.5, + "ExpBonus": 150, + "ExpMultiplierFighter": 1.1, + "ExpMultiplierThief": 1.1, + "ExpMultiplierBlackBelt": 1, + "ExpMultiplierRedMage": 1, + "ExpMultiplierWhiteMage": 1, + "ExpMultiplierBlackMage": 1, + "EncounterRate": 12, + "DungeonEncounterRate": 15, + "ProgressiveScaleMode": 11, + "StartingItemSet": 4, + "ConsumableTreasureStackSize": 2, + "FIGHTER1": true, + "THIEF1": true, + "BLACK_BELT1": true, + "RED_MAGE1": false, + "WHITE_MAGE1": false, + "BLACK_MAGE1": false, + "FIGHTER2": true, + "THIEF2": true, + "BLACK_BELT2": false, + "RED_MAGE2": true, + "WHITE_MAGE2": true, + "BLACK_MAGE2": true, + "FIGHTER3": false, + "THIEF3": false, + "BLACK_BELT3": false, + "RED_MAGE3": false, + "WHITE_MAGE3": false, + "BLACK_MAGE3": false, + "FIGHTER4": false, + "THIEF4": false, + "BLACK_BELT4": false, + "RED_MAGE4": true, + "WHITE_MAGE4": true, + "BLACK_MAGE4": true, + "KNIGHT1": false, + "KNIGHT2": false, + "KNIGHT3": false, + "KNIGHT4": false, + "NINJA1": false, + "NINJA2": false, + "NINJA3": false, + "NINJA4": false, + "MASTER1": false, + "MASTER2": false, + "MASTER3": false, + "MASTER4": false, + "RED_WIZ1": false, + "RED_WIZ2": false, + "RED_WIZ3": false, + "RED_WIZ4": false, + "WHITE_WIZ1": false, + "WHITE_WIZ2": false, + "WHITE_WIZ3": false, + "WHITE_WIZ4": false, + "BLACK_WIZ1": false, + "BLACK_WIZ2": false, + "BLACK_WIZ3": false, + "BLACK_WIZ4": false, + "NONE_CLASS2": true, + "NONE_CLASS3": true, + "NONE_CLASS4": true, + "FORCED1": true, + "FORCED2": true, + "FORCED3": true, + "FORCED4": false, + "DraftFighter": false, + "DraftThief": false, + "DraftBlackBelt": false, + "DraftRedMage": false, + "DraftWhiteMage": false, + "DraftBlackMage": false, + "DraftKnight": false, + "DraftNinja": false, + "DraftMaster": false, + "DraftRedWiz": false, + "DraftWhiteWiz": false, + "DraftBlackWiz": false, + "TAVERN1": true, + "TAVERN2": true, + "TAVERN3": false, + "TAVERN4": true, + "TAVERN5": true, + "TAVERN6": true, + "WeaponPermissions": false, + "ArmorPermissions": false, + "RecruitmentMode": true, + "RecruitmentModeHireOnly": false, + "RecruitmentModeReplaceOnlyNone": true, + "ClampMinimumStatScale": false, + "ClampMinimumBossStatScale": false, + "ClampMinimumPriceScale": false, + "FiendShuffle": false, + "DisableTentSaving": false, + "DisableInnSaving": false, + "SaveGameWhenGameOver": false, + "SaveGameDWMode": false, + "ShuffleAstos": false, + "UnsafeAstos": false, + "RandomizeEnemizer": false, + "RandomizeFormationEnemizer": false, + "GenerateNewSpellbook": false, + "SpellcrafterMixSpells": false, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, + "AllSpellLevelsForKnightNinja": false, + "BuffHealingSpells": true, + "IntAffectsSpells": false, + "AddDamageTiles": false, + "DamageTilesCastles": false, + "DamageTilesDungeons": false, + "DamageTilesCaves": false, + "DamageTilesTowns": false, + "DamageTilesTof": false, + "DamageTilesQuantity": 1, + "FreeTail": false, + "HintsVillage": false, + "SpellcrafterRetainPermissions": false, + "RandomWeaponBonus": true, + "RandomArmorBonus": true, + "RandomWeaponBonusExcludeMasa": false, + "RandomWeaponBonusLow": 0, + "RandomWeaponBonusHigh": 5, + "RandomArmorBonusLow": 0, + "RandomArmorBonusHigh": 5, + "SeparateBossHPScaling": true, + "SeparateEnemyHPScaling": false, + "ClampBossHPScaling": false, + "ClampEnemyHpScaling": false, + "PoolSize": 2, + "EnablePoolParty": false, + "SafePoolParty": false, + "IncludePromClasses": false, + "EnableRandomPromotions": false, + "IncludeBaseClasses": false, + "RandomPromotionsSpoilers": false, + "RandomizeClassCasting": true, + "RandomizeClassKeyItems": false, + "RandomizeClassIncludeXpBonus": false, + "AlternateFiends": false, + "FinalFantasy2Fiends": false, + "FinalFantasy3Fiends": false, + "FinalFantasy4Fiends": false, + "FinalFantasy5Fiends": false, + "FinalFantasy6Fiends": false, + "FinalFantasy1BonusFiends": false, + "BlackOrbFiends": false, + "NoBossSkillScriptShuffle": false, + "MooglieWeaponBalance": false, + "GuaranteeCustomClassComposition": false, + "LegendaryWeaponShop": false, + "LegendaryArmorShop": false, + "LegendaryBlackShop": false, + "LegendaryWhiteShop": false, + "LegendaryItemShop": false, + "ExclusiveLegendaryWeaponShop": false, + "ExclusiveLegendaryArmorShop": false, + "ExclusiveLegendaryBlackShop": false, + "ExclusiveLegendaryWhiteShop": false, + "ExclusiveLegendaryItemShop": false, + "RandomizeClassMode": 1, + "RandomizeClassMaxBonus": 1, + "RandomizeClassMaxMalus": 0, + "EarlierHighTierMagic": false, + "ChangeMaxMP": false, + "RedMageMaxMP": 9, + "WhiteMageMaxMP": 9, + "BlackMageMaxMP": 9, + "KnightMaxMP": 4, + "NinjaMaxMP": 4, + "Knightlvl4": true, + "PinkMage": false, + "BlackKnight": true, + "BlackKnightKeep": false, + "WhiteNinja": true, + "WhiteNinjaKeep": true, + "MpGainOnMaxGainMode": 0, + "LockMode": 3, + "MDefMode": 0, + "FormationShuffleMode": 1, + "RandomizeTreasure": 0, + "OpenChestsInOrder": false, + "SetRNG": false, + "WorldWealth": 1, + "DeepDungeonGenerator": 0, + "EvadeCap": 3, + "AllowUnsafeStartArea": false, + "IncreaseDarkPenalty": true, + "IncreaseRegeneration": false, + "PoisonMode": 6, + "PoisonSetDamageValue": 3, + "TouchIncludeBosses": true, + "Lockpicking": true, + "ReducedLuck": false, + "LockpickingLevelRequirement": 22, + "WhiteMageHarmEveryone": true, + "ProcgenEarth": false, + "LoosePlacementMode": 0 + } } diff --git a/FF1Blazorizer/wwwroot/tooltips/tooltips.json b/FF1Blazorizer/wwwroot/tooltips/tooltips.json index af21cf97a..ebfb4ed3b 100644 --- a/FF1Blazorizer/wwwroot/tooltips/tooltips.json +++ b/FF1Blazorizer/wwwroot/tooltips/tooltips.json @@ -17,6 +17,11 @@ "screenshot": "downloadSpoilersCheckBox.png", "description": "Download a spoiler log for the current seed. The resulting ROM's randomization will be different than if the log had not been generated in order to prevent cheating in races.\nNote: You may be asked by your browser to allow downloading multiple files when using this option." }, + { + "Id": "tristatesCheckBox", + "title": "Show Reveal Randomized State Flags Button", + "description": "Enables the reveal randomized state flags button. Clicking the button allows you to know what any selected tristate flags will become. This is NOT reversible. \nNote: Save your tristate flag string if you don't want remake it." + }, { "Id": "printBlursingsCheckBox", "title": "Print Class Blursings", @@ -281,6 +286,12 @@ "screenshot": "shopInfoIconsCheckBox.png", "description": "When using Shop Information, elements and statuses are shown as icons, allowing for more information to be displayed." }, + { + "Id": "magicShopMenuCheckBox", + "title": "Magic Shop Menus Match Equipment Shops Menu", + "screenshot": "MagicShopMenuChangeCheckBox.png", + "description": "Changes the magic shop menu order to match the equipment shops.\nSelect Spell > Pay > Choose Character." + }, { "Id": "renounceAutosortCheckBox", "title": "Renounce Autosort", @@ -376,16 +387,10 @@ "description": "Configure the Temple of Fiends Fiends Refights.\n\nAll: All Fiends must be fought to reach Chaos.\nTwo Paths: Only two fiends must be defeated. On floor 1F, two stairs will lead to two random Fiends floors each. If Short ToFR is selected, going left or right will lead to two different Fiends tiles.\nNone: No Fiends will be encountered in the Temple of Fiends Revisited.\nRandom: One of the previous options at random." }, { - "Id": "preserveFiendRefightsCheckBox", - "title": "Include Fiend Tiles", - "screenshot": "preserveFiendRefightsCheckBox.gif", - "description": "Adds the four Fiend refights to the Chaos floor. Two trap tiles will be found on either side south of the entrance, with the boss in each tile shuffled for each seed." - }, - { - "Id": "preserveAllFiendRefightsCheckBox", - "title": "Refight All Fiends", + "Id": "shortToFRFiendsRefightsDropDown", + "title": "Fiends Refights", "screenshot": "preserveAllFiendRefightsCheckBox.png", - "description": "Now all four Fiends are in both directions and they must all be defeated to reach CHAOS." + "description": "Configure the Temple of Fiends Fiends Refights.\n\nAll: All Fiends must be fought to reach Chaos.\nTwo Paths: Only two fiends must be defeated. Going left or right will lead to two different Fiends tiles.\nLopsided: Two Paths but one side has one buffed fiend, the other has three normal scaled fiends.\nProgressive: Two Paths but guarantees one easy and one hard fiend will fall on each side.\nAnything Goes: Two Paths but the fiend tiles are random. Possibly 4 Kraken, possibly 4 free steps.\nRude: All plus one extra fifth fiend refight.\nNone: No Fiends will be encountered in the Temple of Fiends Revisited.\nRandom: One of the previous options at random." }, { "Id": "exitToFRCheckBox", @@ -936,6 +941,12 @@ "screenshot": "gaiaShortcutMoveItemShop.png", "description": "Moves the Item Shop next to the Gaia Shortcut.\nThis flag is ignored if \"Add Gaia Shortcut\" is disabled." }, + { + "Id": "lefeinShortcutCheckBox", + "title": "Add Lefein Shortcut", + "screenshot": "LefienShortcut.png", + "description": "Tired of getting Lefeinian Linebacked? This flag adds two bridges that speed up Slab turn-in and talking to the hint giver." + }, { "Id": "lefeinShopsCheckBox", "title": "Lefeinish Hospitality", @@ -1037,7 +1048,7 @@ "Id": "tcChestCountSlider", "title": "Trapped Chests Count", "screenshot": "tcChestsPool.png", - "description": "Sets the number of chests that will have traps (monsters) in them. Setting the slider to the rightmost position will select a random number of trapped chests.\n\nIn game count may slightly differ for some flags combinations.\nFor best results, use in combination with the sub-flags included in this section." + "description": "Sets the number of chests that will have traps (monsters) in them. Setting the slider to the rightmost position will select a random number of trapped chests.\n\nIn game count may slightly differ for some flags combinations.\nThe starting value is the highest minimum number of possible trapped chests. This doesn't take into account free or removed items nor the random selection options.\nFor best results, use in combination with the sub-flags included in this section." }, { "Id": "tcBetterTreasuresDropDown", @@ -1061,7 +1072,7 @@ "Id": "tcExcludeCommonCheckBox", "title": "Exclude Common Treasures", "screenshot": "trappedChestsCheckBox.gif", - "description": "Common treasures (common equipment, consumables and GP chests) are never trapped." + "description": "Common treasures (common equipment, consumables and GP chests) are never trapped.\nThis will result in a lower number of trapped chests if a higher value than the minimum is chosen.\nE.G. shards + key items are set to always for 53 chests, but 60 is selected.\nAt least the extra 8 will be ignored." }, { "Id": "tcProtectIncentivesCheckBox", @@ -1363,6 +1374,18 @@ "screenshot": "onlyShuffleBossSkillsCheckBox.png", "description": "Shuffles bosses' skills and spells so they can appear in any script. The original Fiends are shuffled between themselves, then the second Fiends, WarMech and Chaos." }, + { + "Id": "templeoffiendrefightsonlyCheckBox", + "title": "Shuffle Temple of Fiend Refights Only", + "screenshot": null, + "description": "Will only shuffle the four fiend refights in the Temple of Fiends Revisted, This option will leave Chaos's script as default." + }, + { + "Id": "overworldfiendsonlyCheckBox", + "title": "Shuffle the Overworld Fiends", + "screenshot": null, + "description": "Will only shuffle the four fiends in the overworld." + }, { "Id": "enemyScriptsCheckBox", @@ -1404,7 +1427,7 @@ "Id": "EnemyTrapTiles", "title": "Trap Tiles", "screenshot": "enemyTrapTilesCheckBox.gif", - "description": "Vanilla: All tiles are their original monster formations.\n\nShuffle: Shuffles all the forced encounter tiles in the game, except the Fiend refights. This doesn't add in any new tiles, instead it simply shuffles the existing encounter tiles among themselves.\n\nA-Side Formations: Trap Tiles are randomly populated from the A-side encounter list.\n\nB-Side Formations: Trap tiles are randomly populated from the B-side encounter list.\n\nA-Side & B-Side: Trap tiles are randomly populated from any of the A-side or B-side encounter formations.\n\nRemove Trap Tiles: Removes all the forced encounter tiles from the game, except the Fiend refights.\n\nLocal Formations: Tiles will use formations from the same dungeon that they appear in (when possible).\n\nCurated: \"A-Side & B-Side\" but with overly punishing encounters removed. To make up for this, the best grind tiles have also been removed. (This is a sample pool. Tournament organizers can request specific enemy formations to be used, contact your local dev for details.)\n\n(None of the randomized pools include bosses.)" + "description": "Vanilla: All tiles are their original monster formations.\n\nShuffle: Shuffles all the forced encounter tiles in the game, except the Fiend refights. This doesn't add in any new tiles, instead it simply shuffles the existing encounter tiles among themselves.\n\nA-Side Formations: Trap Tiles are randomly populated from the A-side encounter list.\n\nB-Side Formations: Trap tiles are randomly populated from the B-side encounter list.\n\nA-Side & B-Side: Trap tiles are randomly populated from any of the A-side or B-side encounter formations.\n\nRemove Trap Tiles: Removes all the forced encounter tiles from the game, except the Fiend refights.\n\nLocal Formations: Tiles will use formations from the same dungeon that they appear in (when possible).\n\nUndead Only: Contains undead and some undead adjacent formations. \n\nOverpowered: \"A-Side & B-Side\" but with only the best grinds.\n\nCurated: \"A-Side & B-Side\" but with overly punishing encounters removed. To make up for this, the best grind tiles have also been removed. (This is a sample pool. Tournament organizers can request specific enemy formations to be used, contact your local dev for details.)\n\n(None of the randomized pools include bosses.)" }, { "Id": "WarMECHModeDropDown", @@ -1478,6 +1501,12 @@ "screenshot": null, "description": "Will add 45 Final Fantasy 6 Fiends to the Alternate Fiend Pool." }, + { + "Id": "winnerscirclepool", + "title": "Winner Circle", + "screenshot": null, + "description": "Any winner of a FFR Tournament gets the chance to add a fiend of their choice into the pool, this will add in all of the winner circle fiends to the Alternate Fiend Pool." + }, { "Id": "blackorbrisingpool", "title": "Black Orb Rising Fiends", @@ -1613,10 +1642,16 @@ "description": "Halves the Black Belt's unarmed critical hit rate, so that it is now equal to their current level. (Vanilla crit rate is equal to the character's level times 2.)" }, { - "Id": "thiefHitCheckBox", + "Id": "thiefHitDropDown", "title": "Thief Hit Rate Rebalance", - "screenshot": "thiefHitCheckBox.gif", - "description": "Increases the hit rate of Thieves and Ninjas from +2 per level to +4 per level, making them more effective combatants (helping to balance them in comparison to Fighters and Knights, which will still have significantly more HP and STR).\n[grid][r]{i}Hit% |Lvl 9|Lvl 17|Lvl 25[r]{l}Vanilla Thief|21%|37%|53%[r]{l}Fighter|34%|58%|82%[r]{l}Buffed Thief|37%|69%|101%" + "screenshot": "thiefHitDropDown.gif", + "description": "Changes the hit rate of Thieves and Ninjas from +2 per level to +N per level, potentially making them more effective combatants (helping to balance them in comparison to Fighters and Knights, which will still have significantly more HP and STR).\n[grid][r]{i}Hit% |Lvl 9|Lvl 17|Lvl 25[r]{l}Vanilla Thief|21%|37%|53%[r]{l}Fighter|34%|58%|82%[r]{l}Buffed Thief (Double)|37%|69%|101%" + }, + { + "Id": "redMageHitDropDown", + "title": "Red Mage Hit Rate Rebalance", + "screenshot": "redMageHitDropDown.png", + "description": "Changes the hit rate of Red Mages and Wizards from +2 per level to +N per level, making them more or less viable as melee." }, { "Id": "thiefAgilityBuffDropDown", @@ -2100,6 +2135,12 @@ "screenshot": "identifyTreasuresCheckBox.png", "description": "If enabled, the player can see what item is in a chest if their inventory is full, instead of seeing \"Can't hold any more\"." }, + { + "Id": "chestsAppearOpenedCheckBox", + "title": "Chests Appear Opened", + "screenshot": "chestsAppearOpened.png", + "description": "Treasure chests will have an opened appearance after you open them." + }, { "Id": "dashCheckBox", "title": "Faster Walking Speed", @@ -2609,5 +2650,11 @@ "title": "Map Derp", "screenshot": "mapDerp.png", "description": "Derp." + }, + { + "Id": "funFountainsCheckBox", + "title": "Fun Fountain Text", + "screenshot": "FountainText.png", + "description": "We all love being told to wash our face, but what if the fountain said other things?" } ] diff --git a/FF1Lib/AltFiends.cs b/FF1Lib/AltFiends.cs index 997b0b47a..fd5cd4f71 100644 --- a/FF1Lib/AltFiends.cs +++ b/FF1Lib/AltFiends.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Linq; @@ -2812,35 +2813,18 @@ public void AlternativeFiends(ExtAltFiends extAltFiends, EnemyScripts enemyScrip MonsterType = MonsterType.GIANT, SpellChance1 = 0x00, Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, - SkillChance1 = 0x40, + SkillChance1 = 0x00, Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, SpellChance2 = 0x00, Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, - SkillChance2 = 0x40, + SkillChance2 = 0x00, Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, }, }; var FF1BonusFiendsList = new List { - new AlternateFiends { - Name = "B.VAMP", //Will be Moved to Winner Fiends at a later date - SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, - FormationPattern = FormationPattern.Large4, - GFXOffset = FormationGFX.Sprite2, - Palette1 = 0x23, - Palette2 = 0x25, - ElementalWeakness = SpellElement.Lightning, - MonsterType = MonsterType.UNDEAD, - SpellChance1 = 0x40, - Spells1 = new List { (byte)SpellByte.FIRE, (byte)SpellByte.FOG, (byte)SpellByte.FIR2, (byte)SpellByte.INVS, (byte)SpellByte.FIRE, (byte)SpellByte.FIR2, (byte)SpellByte.FOG, (byte)SpellByte.INVS }, - SkillChance1 = 0x00, - Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, - SpellChance2 = 0x40, - Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.FOG, (byte)SpellByte.INVS, (byte)SpellByte.NUKE, (byte)SpellByte.FIR3, (byte)SpellByte.FOG, (byte)SpellByte.INVS, (byte)SpellByte.CUR3 }, - SkillChance2 = 0x40, - Skills2 = new List { (byte)EnemySkills.Blaze, (byte)EnemySkills.Inferno, (byte)EnemySkills.Blaze, (byte)EnemySkills.Inferno }, - }, + new AlternateFiends { Name = "BEHOLDER", @@ -2899,6 +2883,25 @@ public void AlternativeFiends(ExtAltFiends extAltFiends, EnemyScripts enemyScrip Skills2 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Frost, (byte)EnemySkills.Blizzard }, }, + new AlternateFiends { + Name = "CARAVAN", + SpriteSheet = FormationSpriteSheet.MummyCoctricWyvernTyro, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Earth, + MonsterType = MonsterType.REGENERATIVE, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Gaze, (byte)EnemySkills.Trance, (byte)EnemySkills.Ink, (byte)EnemySkills.Stare }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FAST, (byte)SpellByte.ICE2, (byte)SpellByte.FOG, (byte)SpellByte.FIR2, (byte)SpellByte.CUR3, (byte)SpellByte.LIT2, (byte)SpellByte.SLO2, (byte)SpellByte.SABR }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Toxic, (byte)EnemySkills.Crack, (byte)EnemySkills.Dazzle }, + }, + new AlternateFiends { Name = "DR.UNNE", SpriteSheet = FormationSpriteSheet.SlimeSpiderManticorAnkylo, @@ -2918,25 +2921,6 @@ public void AlternativeFiends(ExtAltFiends extAltFiends, EnemyScripts enemyScrip Skills2 = new List { (byte)EnemySkills.Blizzard, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Tornado, (byte)EnemySkills.Toxic }, }, - new AlternateFiends { - Name = "ENSINGER", //Will be Moved to Winner Fiends at a later date - SpriteSheet = FormationSpriteSheet.BoneCreepHyenaOgre, - FormationPattern = FormationPattern.Mixed, - GFXOffset = FormationGFX.Sprite4, - Palette1 = 0x23, - Palette2 = 0x25, - ElementalWeakness = SpellElement.Time, - MonsterType = MonsterType.MAGE, - SpellChance1 = 0x40, - Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.INVS, (byte)SpellByte.LIT2, (byte)SpellByte.HOLD, (byte)SpellByte.ICE2, (byte)SpellByte.RUB, (byte)SpellByte.LIT, (byte)SpellByte.HOLD }, - SkillChance1 = 0x40, - Skills1 = new List { (byte)EnemySkills.Cremate, (byte)EnemySkills.Glance, (byte)EnemySkills.Trance, (byte)EnemySkills.Frost }, - SpellChance2 = 0x40, - Spells2 = new List { (byte)SpellByte.XFER, (byte)SpellByte.INVS, (byte)SpellByte.LIT3, (byte)SpellByte.XFER, (byte)SpellByte.NUKE, (byte)SpellByte.INVS, (byte)SpellByte.LIT3, (byte)SpellByte.STOP }, - SkillChance2 = 0x40, - Skills2 = new List { (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Toxic, (byte)EnemySkills.Trance, (byte)EnemySkills.Thunder }, - }, - new AlternateFiends { Name = "EVILELF", SpriteSheet = FormationSpriteSheet.VampGargoyleEarthDragon1, @@ -3089,6 +3073,25 @@ public void AlternativeFiends(ExtAltFiends extAltFiends, EnemyScripts enemyScrip Skills2 = new List { (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Nuclear, (byte)EnemySkills.Squint, (byte)EnemySkills.Tornado }, }, + new AlternateFiends { + Name = "NIMBUS", //Will be Moved to Winner Fiends at a later date + SpriteSheet = FormationSpriteSheet.SahagPirateSharkBigEye, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.SLEP, (byte)SpellByte.ICE2, (byte)SpellByte.STUN, (byte)SpellByte.FOG, (byte)SpellByte.SLOW, (byte)SpellByte.ICE2, (byte)SpellByte.WALL, (byte)SpellByte.BLND }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stare, (byte)EnemySkills.Snorting, (byte)EnemySkills.Frost, (byte)EnemySkills.Glance }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.SLP2, (byte)SpellByte.ICE3, (byte)SpellByte.XFER, (byte)SpellByte.SLO2, (byte)SpellByte.FOG2, (byte)SpellByte.ICE3, (byte)SpellByte.XFER, (byte)SpellByte.ZAP }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Swirl, (byte)EnemySkills.Flash, (byte)EnemySkills.Blizzard, (byte)EnemySkills.Poison_Stone }, + }, + new AlternateFiends { Name = "REVENANT", SpriteSheet = FormationSpriteSheet.KaryLich, @@ -3146,6 +3149,25 @@ public void AlternativeFiends(ExtAltFiends extAltFiends, EnemyScripts enemyScrip Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, }, + new AlternateFiends { + Name = "SEPHROTH", //Will be Moved to Winner Fiends at a later date + SpriteSheet = FormationSpriteSheet.SlimeSpiderManticorAnkylo, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Status, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.ICE2, (byte)SpellByte.LIT2, (byte)SpellByte.CUR2, (byte)SpellByte.FIR2, (byte)SpellByte.LIT2, (byte)SpellByte.ICE2, (byte)SpellByte.CUR2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Heat, (byte)EnemySkills.Flash, (byte)EnemySkills.Trance }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.XFER, (byte)SpellByte.ICE3, (byte)SpellByte.FIR3, (byte)SpellByte.LIT3, (byte)SpellByte.FAST, (byte)SpellByte.WALL, (byte)SpellByte.CUR4, (byte)SpellByte.SABR }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Nuclear, (byte)EnemySkills.Blaze, (byte)EnemySkills.Thunder, (byte)EnemySkills.Blizzard }, + }, + new AlternateFiends { Name = "VAMAKALI", SpriteSheet = FormationSpriteSheet.KrakenTiamat, @@ -3165,6 +3187,25 @@ public void AlternativeFiends(ExtAltFiends extAltFiends, EnemyScripts enemyScrip Skills2 = new List { (byte)EnemySkills.Inferno, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Crack, (byte)EnemySkills.Toxic }, }, + new AlternateFiends { + Name = "WHEELS", //Will be Moved to Winner Fiends at a later date + SpriteSheet = FormationSpriteSheet.BadmanAstosMadponyWarmech, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stare, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Heat, (byte)EnemySkills.Ink }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Nuclear, (byte)EnemySkills.Blaze, (byte)EnemySkills.Thunder, (byte)EnemySkills.Trance }, + }, + new AlternateFiends { Name = "WRONGEYE", SpriteSheet = FormationSpriteSheet.MedusaCatmanPedeTiger, @@ -3184,53 +3225,2948 @@ public void AlternativeFiends(ExtAltFiends extAltFiends, EnemyScripts enemyScrip Skills2 = new List { (byte)EnemySkills.Toxic, (byte)EnemySkills.Swirl, (byte)EnemySkills.Stare, (byte)EnemySkills.Poison_Stone }, }, - }; - var alternateFiendsList = new List - { - + new AlternateFiends { + Name = "ZINOGRE", //Will be Moved to Winner Fiends at a later date + SpriteSheet = FormationSpriteSheet.MedusaCatmanPedeTiger, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.LIT, (byte)SpellByte.LIT2, (byte)SpellByte.HOLD, (byte)SpellByte.STUN, (byte)SpellByte.LOCK, (byte)SpellByte.INVS, (byte)SpellByte.LIT, (byte)SpellByte.LIT2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Gaze, (byte)EnemySkills.Flash, (byte)EnemySkills.Stare, (byte)EnemySkills.Gaze }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.LIT3, (byte)SpellByte.FIR3, (byte)SpellByte.STOP, (byte)SpellByte.RUSE, (byte)SpellByte.LOK2, (byte)SpellByte.ZAP, (byte)SpellByte.LIT3, (byte)SpellByte.FIR3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Thunder, (byte)EnemySkills.Trance, (byte)EnemySkills.Blaze, (byte)EnemySkills.Inferno }, + }, }; - if ((bool)flags.FinalFantasy2Fiends) - + var WinnerCirleFiendsList = new List { - alternateFiendsList.AddRange(FF2AltFiendslist); - } + new AlternateFiends { + Name = "AGNEA", + SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Earth, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.INVS, (byte)SpellByte.CUR2, (byte)SpellByte.FOG2, (byte)SpellByte.SABR, (byte)SpellByte.INVS, (byte)SpellByte.CUR2, (byte)SpellByte.SABR, (byte)SpellByte.FAST }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.WALL, (byte)SpellByte.INVS, (byte)SpellByte.SABR, (byte)SpellByte.FAST, (byte)SpellByte.INVS, (byte)SpellByte.FOG, (byte)SpellByte.SABR, (byte)SpellByte.CUR3 }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, - if ((bool)flags.FinalFantasy3Fiends) + new AlternateFiends { + Name = "B.VAMP", + SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.UNDEAD, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIRE, (byte)SpellByte.FOG, (byte)SpellByte.FIR2, (byte)SpellByte.INVS, (byte)SpellByte.FIRE, (byte)SpellByte.FIR2, (byte)SpellByte.FOG, (byte)SpellByte.INVS }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.FOG, (byte)SpellByte.INVS, (byte)SpellByte.NUKE, (byte)SpellByte.FIR3, (byte)SpellByte.FOG, (byte)SpellByte.INVS, (byte)SpellByte.CUR3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blaze, (byte)EnemySkills.Inferno, (byte)EnemySkills.Blaze, (byte)EnemySkills.Inferno }, + }, - { - alternateFiendsList.AddRange(FF3AltFiendslist); - } + new AlternateFiends { + Name = "ENSINGER", + SpriteSheet = FormationSpriteSheet.BoneCreepHyenaOgre, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Time, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.INVS, (byte)SpellByte.LIT2, (byte)SpellByte.HOLD, (byte)SpellByte.ICE2, (byte)SpellByte.RUB, (byte)SpellByte.LIT, (byte)SpellByte.HOLD }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Cremate, (byte)EnemySkills.Glance, (byte)EnemySkills.Trance, (byte)EnemySkills.Frost }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.XFER, (byte)SpellByte.INVS, (byte)SpellByte.LIT3, (byte)SpellByte.XFER, (byte)SpellByte.NUKE, (byte)SpellByte.INVS, (byte)SpellByte.LIT3, (byte)SpellByte.STOP }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Toxic, (byte)EnemySkills.Trance, (byte)EnemySkills.Thunder }, + }, - if ((bool)flags.FinalFantasy4Fiends) + new AlternateFiends { + Name = "NIMBUS", + SpriteSheet = FormationSpriteSheet.SahagPirateSharkBigEye, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.SLEP, (byte)SpellByte.ICE2, (byte)SpellByte.STUN, (byte)SpellByte.FOG, (byte)SpellByte.SLOW, (byte)SpellByte.ICE2, (byte)SpellByte.WALL, (byte)SpellByte.BLND }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stare, (byte)EnemySkills.Snorting, (byte)EnemySkills.Frost, (byte)EnemySkills.Glance }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.SLP2, (byte)SpellByte.ICE3, (byte)SpellByte.XFER, (byte)SpellByte.SLO2, (byte)SpellByte.FOG2, (byte)SpellByte.ICE3, (byte)SpellByte.XFER, (byte)SpellByte.ZAP }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Swirl, (byte)EnemySkills.Flash, (byte)EnemySkills.Blizzard, (byte)EnemySkills.Poison_Stone }, + }, - { - alternateFiendsList.AddRange(FF4AltFiendsList); - } + new AlternateFiends { + Name = "SEPHROTH", + SpriteSheet = FormationSpriteSheet.SlimeSpiderManticorAnkylo, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Status, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.ICE2, (byte)SpellByte.LIT2, (byte)SpellByte.CUR2, (byte)SpellByte.FIR2, (byte)SpellByte.LIT2, (byte)SpellByte.ICE2, (byte)SpellByte.CUR2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Heat, (byte)EnemySkills.Flash, (byte)EnemySkills.Trance }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.XFER, (byte)SpellByte.ICE3, (byte)SpellByte.FIR3, (byte)SpellByte.LIT3, (byte)SpellByte.FAST, (byte)SpellByte.WALL, (byte)SpellByte.CUR4, (byte)SpellByte.SABR }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Nuclear, (byte)EnemySkills.Blaze, (byte)EnemySkills.Thunder, (byte)EnemySkills.Blizzard }, + }, - if ((bool)flags.FinalFantasy5Fiends) + new AlternateFiends { + Name = "THNDBIRD", + SpriteSheet = FormationSpriteSheet.SlimeSpiderManticorAnkylo, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIRE, (byte)SpellByte.FIRE, (byte)SpellByte.STUN, (byte)SpellByte.FIR2, (byte)SpellByte.FIRE, (byte)SpellByte.FIRE, (byte)SpellByte.LOCK, (byte)SpellByte.FIR2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Heat, (byte)EnemySkills.Scorch, (byte)EnemySkills.Heat, (byte)EnemySkills.Glance }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.FAST, (byte)SpellByte.LOCK, (byte)SpellByte.FIR3, (byte)SpellByte.FIR2, (byte)SpellByte.INVS, (byte)SpellByte.WALL, (byte)SpellByte.FIR3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blaze, (byte)EnemySkills.Inferno, (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Inferno }, + }, - { - alternateFiendsList.AddRange(FF5AltFiendsList); - } + new AlternateFiends { + Name = "WHEELS", + SpriteSheet = FormationSpriteSheet.BadmanAstosMadponyWarmech, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stare, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Heat, (byte)EnemySkills.Ink }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Nuclear, (byte)EnemySkills.Blaze, (byte)EnemySkills.Thunder, (byte)EnemySkills.Trance }, + }, - if ((bool)flags.FinalFantasy6Fiends) + new AlternateFiends { + Name = "ZINOGRE", + SpriteSheet = FormationSpriteSheet.MedusaCatmanPedeTiger, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.LIT, (byte)SpellByte.LIT2, (byte)SpellByte.HOLD, (byte)SpellByte.STUN, (byte)SpellByte.LOCK, (byte)SpellByte.INVS, (byte)SpellByte.LIT, (byte)SpellByte.LIT2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Gaze, (byte)EnemySkills.Flash, (byte)EnemySkills.Stare, (byte)EnemySkills.Gaze }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.LIT3, (byte)SpellByte.FIR3, (byte)SpellByte.STOP, (byte)SpellByte.RUSE, (byte)SpellByte.LOK2, (byte)SpellByte.ZAP, (byte)SpellByte.LIT3, (byte)SpellByte.FIR3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Thunder, (byte)EnemySkills.Trance, (byte)EnemySkills.Blaze, (byte)EnemySkills.Inferno }, + }, + }; + var FF2AltFiendListHardcore = new List { - alternateFiendsList.AddRange(FF6AltFiendsList); - } - - if ((bool)flags.FinalFantasy1BonusFiends) + new AlternateFiends { - alternateFiendsList.AddRange(FF1BonusFiendsList); + Name = "ADMNTOSE", + SpriteSheet = FormationSpriteSheet.AspLobsterBullTroll, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FAST, (byte)SpellByte.FOG, (byte)SpellByte.AFIR, (byte)SpellByte.AICE, (byte)SpellByte.TMPR, (byte)SpellByte.FOG, (byte)SpellByte.INVS, (byte)SpellByte.CUR2 }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FAST, (byte)SpellByte.SABR, (byte)SpellByte.INVS, (byte)SpellByte.LOCK, (byte)SpellByte.FAST, (byte)SpellByte.SABR, (byte)SpellByte.INVS, (byte)SpellByte.CUR4 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Ink, (byte)EnemySkills.Ink, (byte)EnemySkills.Ink, (byte)EnemySkills.Ink }, + }, + + new AlternateFiends + { + Name = "ASTAROTH", + SpriteSheet = FormationSpriteSheet.BadmanAstosMadponyWarmech, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x39, + Palette2 = 0x39, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIRE, (byte)SpellByte.FIRE, (byte)SpellByte.BRAK, (byte)SpellByte.FIRE, (byte)SpellByte.FIRE, (byte)SpellByte.FIRE, (byte)SpellByte.BRAK, (byte)SpellByte.FIRE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Heat, (byte)EnemySkills.Heat, (byte)EnemySkills.Heat, (byte)EnemySkills.Poison_Stone }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.FIR3, (byte)SpellByte.FIR2, (byte)SpellByte.BRAK, (byte)SpellByte.FIR2, (byte)SpellByte.FIR3, (byte)SpellByte.FIR2, (byte)SpellByte.BANE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Scorch, (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Blaze, (byte)EnemySkills.Poison_Stone }, + }, + + new AlternateFiends + { + Name = "BELZEBUB", + SpriteSheet = FormationSpriteSheet.SlimeSpiderManticorAnkylo, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x30, + Palette2 = 0x30, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.UNDEAD, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIRE, (byte)SpellByte.FAST, (byte)SpellByte.FIRE, (byte)SpellByte.FOG, (byte)SpellByte.FIRE, (byte)SpellByte.SLOW, (byte)SpellByte.FIRE, (byte)SpellByte.RUB }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Flash, (byte)EnemySkills.Stinger, (byte)EnemySkills.Flash, (byte)EnemySkills.Dazzle }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.FAST, (byte)SpellByte.FIR3, (byte)SpellByte.FOG, (byte)SpellByte.FIR2, (byte)SpellByte.SLO2, (byte)SpellByte.FIR3, (byte)SpellByte.BANE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Nuclear, (byte)EnemySkills.Flash, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Inferno }, + }, + + new AlternateFiends + { + Name = "BORGEN", + SpriteSheet = FormationSpriteSheet.MedusaCatmanPedeTiger, + FormationPattern = FormationPattern.Small9, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.CUR2, (byte)SpellByte.CURE, (byte)SpellByte.FIRE, (byte)SpellByte.AFIR, (byte)SpellByte.FIR2, (byte)SpellByte.HEAL, (byte)SpellByte.HEL2, (byte)SpellByte.CURE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Snorting, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Trance }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.NUKE, (byte)SpellByte.FIR3, (byte)SpellByte.HOLD, (byte)SpellByte.XFER, (byte)SpellByte.BANE, (byte)SpellByte.ZAP, (byte)SpellByte.MUTE, (byte)SpellByte.STOP }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Gaze, (byte)EnemySkills.Trance, (byte)EnemySkills.Gaze, (byte)EnemySkills.Blaze }, + }, + + new AlternateFiends + { + Name = "BEHEMOTH", + SpriteSheet = FormationSpriteSheet.BoneCreepHyenaOgre, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x1D, // Yellow/Orange + Palette2 = 0x1D, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.UNDEAD, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.STUN, (byte)SpellByte.FIR2, (byte)SpellByte.FAST, (byte)SpellByte.FIR2, (byte)SpellByte.STUN, (byte)SpellByte.FIR2, (byte)SpellByte.FAST }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Snorting, (byte)EnemySkills.Snorting, (byte)EnemySkills.Snorting, (byte)EnemySkills.Snorting }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.STOP, (byte)SpellByte.FIR3, (byte)SpellByte.FAST, (byte)SpellByte.FIR3, (byte)SpellByte.SLO2, (byte)SpellByte.FIR3, (byte)SpellByte.NUKE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Snorting, (byte)EnemySkills.Snorting, (byte)EnemySkills.Snorting, (byte)EnemySkills.Blaze }, + }, + + new AlternateFiends + { + Name = "B.KNIGHT", + SpriteSheet = FormationSpriteSheet.BadmanAstosMadponyWarmech, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x1A, // Grey/Purple + Palette2 = 0x1A, + ElementalWeakness = SpellElement.Poison, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FAST, (byte)SpellByte.SLOW, (byte)SpellByte.STUN, (byte)SpellByte.STOP, (byte)SpellByte.FAST, (byte)SpellByte.SLOW, (byte)SpellByte.STUN, (byte)SpellByte.STOP }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Flash, (byte)EnemySkills.Flash, (byte)EnemySkills.Flash, (byte)EnemySkills.Dazzle }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.MUTE, (byte)SpellByte.SLO2, (byte)SpellByte.FAST, (byte)SpellByte.SABR, (byte)SpellByte.STUN, (byte)SpellByte.STOP, (byte)SpellByte.SABR, (byte)SpellByte.BRAK }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Trance, (byte)EnemySkills.Flash, (byte)EnemySkills.Ink, (byte)EnemySkills.Glare }, + }, + + new AlternateFiends + { + Name = "GOTUS", + SpriteSheet = FormationSpriteSheet.KrakenTiamat, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Poison, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.SLOW, (byte)SpellByte.DARK, (byte)SpellByte.SLOW, (byte)SpellByte.LIT, (byte)SpellByte.FIRE, (byte)SpellByte.ICE, (byte)SpellByte.DARK, (byte)SpellByte.MUTE }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FAST, (byte)SpellByte.FAST, (byte)SpellByte.SABR, (byte)SpellByte.TMPR, (byte)SpellByte.SABR, (byte)SpellByte.ZAP, (byte)SpellByte.XXXX, (byte)SpellByte.QAKE }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + + new AlternateFiends + { + Name = "IROGIANT", + SpriteSheet = FormationSpriteSheet.KaryLich, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FOG, (byte)SpellByte.STUN, (byte)SpellByte.BLND, (byte)SpellByte.FIR2, (byte)SpellByte.HOLD, (byte)SpellByte.STUN, (byte)SpellByte.FIRE, (byte)SpellByte.CURE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Flash, (byte)EnemySkills.Trance, (byte)EnemySkills.Stinger }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.NUKE, (byte)SpellByte.XFER, (byte)SpellByte.XXXX, (byte)SpellByte.SLO2, (byte)SpellByte.MUTE, (byte)SpellByte.FIR3, (byte)SpellByte.CUR3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Blaze, (byte)EnemySkills.Glare, (byte)EnemySkills.Toxic }, + }, + + new AlternateFiends + { + Name = "LAMQUEEN", + SpriteSheet = FormationSpriteSheet.MummyCoctricWyvernTyro, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Time, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FOG, (byte)SpellByte.STUN, (byte)SpellByte.ICE2, (byte)SpellByte.FOG, (byte)SpellByte.SLEP, (byte)SpellByte.SLOW, (byte)SpellByte.ICE2, (byte)SpellByte.LIT2 }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.INVS, (byte)SpellByte.MUTE, (byte)SpellByte.XXXX, (byte)SpellByte.FOG2, (byte)SpellByte.SLO2, (byte)SpellByte.FIR3, (byte)SpellByte.ICE3, (byte)SpellByte.CUR4 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Tornado, (byte)EnemySkills.Ink, (byte)EnemySkills.Poison_Damage }, + }, + + new AlternateFiends + { + Name = "MEDUSAE", + SpriteSheet = FormationSpriteSheet.KaryLich, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x23, // Green/Grey + Palette2 = 0x23, + ElementalWeakness = SpellElement.Poison, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.STUN, (byte)SpellByte.STOP, (byte)SpellByte.STUN, (byte)SpellByte.BRAK, (byte)SpellByte.STUN, (byte)SpellByte.STOP, (byte)SpellByte.STUN, (byte)SpellByte.BRAK }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Gaze, (byte)EnemySkills.Glance, (byte)EnemySkills.Gaze, (byte)EnemySkills.Glare }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.STUN, (byte)SpellByte.STOP, (byte)SpellByte.XXXX, (byte)SpellByte.BRAK, (byte)SpellByte.STUN, (byte)SpellByte.STOP, (byte)SpellByte.XXXX, (byte)SpellByte.BRAK }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Glare, (byte)EnemySkills.Glance, (byte)EnemySkills.Glare, (byte)EnemySkills.Poison_Stone }, + }, + + new AlternateFiends + { + Name = "RNDWORM", + SpriteSheet = FormationSpriteSheet.VampGargoyleEarthDragon1, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.NONE, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Trance, (byte)EnemySkills.Ink, (byte)EnemySkills.Trance }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Nuclear, (byte)EnemySkills.Toxic, (byte)EnemySkills.Thunder }, + }, + + new AlternateFiends + { + Name = "SERGEANT", + SpriteSheet = FormationSpriteSheet.AspLobsterBullTroll, + FormationPattern = FormationPattern.Small9, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.CURE, (byte)SpellByte.HEAL, (byte)SpellByte.MUTE, (byte)SpellByte.XFER, (byte)SpellByte.BLND, (byte)SpellByte.ICE, (byte)SpellByte.CURE, (byte)SpellByte.MUTE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Gaze, (byte)EnemySkills.Glance, (byte)EnemySkills.Stare, (byte)EnemySkills.Dazzle }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FAST, (byte)SpellByte.TMPR, (byte)SpellByte.BLND, (byte)SpellByte.XFER, (byte)SpellByte.XXXX, (byte)SpellByte.ICE3, (byte)SpellByte.BANE, (byte)SpellByte.FOG }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blizzard, (byte)EnemySkills.Nuclear, (byte)EnemySkills.Glare, (byte)EnemySkills.Squint }, + }, + + new AlternateFiends + { + Name = "TWHD.DRG", + SpriteSheet = FormationSpriteSheet.KaryLich, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Time, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Trance, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Flash, (byte)EnemySkills.Stinger }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.TMPR, (byte)SpellByte.FAST, (byte)SpellByte.XFER, (byte)SpellByte.INVS, (byte)SpellByte.TMPR, (byte)SpellByte.SLO2, (byte)SpellByte.CUR3, (byte)SpellByte.MUTE }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + + }; + var FF3AltFiendListHardcore = new List + { + new AlternateFiends { + Name = "AHRIMAN", + SpriteSheet = FormationSpriteSheet.ImpWolfIguanaGiant, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.ICE2, (byte)SpellByte.MUTE, (byte)SpellByte.SLO2, (byte)SpellByte.LIT2, (byte)SpellByte.CUR2, (byte)SpellByte.INVS, (byte)SpellByte.SLP2 }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.NUKE, (byte)SpellByte.SLO2, (byte)SpellByte.XXXX, (byte)SpellByte.CUR4, (byte)SpellByte.ICE3, (byte)SpellByte.MUTE, (byte)SpellByte.FIR3, (byte)SpellByte.XFER }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + new AlternateFiends { + Name = "AMON", + SpriteSheet = FormationSpriteSheet.SlimeSpiderManticorAnkylo, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Status, + MonsterType = MonsterType.NONE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.FIR2, (byte)SpellByte.LIT2, (byte)SpellByte.BRAK, (byte)SpellByte.SLOW, (byte)SpellByte.FOG, (byte)SpellByte.STUN, (byte)SpellByte.AICE }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.NUKE, (byte)SpellByte.LIT3, (byte)SpellByte.CUR4, (byte)SpellByte.XXXX, (byte)SpellByte.BANE, (byte)SpellByte.QAKE, (byte)SpellByte.SLO2 }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + new AlternateFiends{ + Name = "BIGRAT", + SpriteSheet = FormationSpriteSheet.MummyCoctricWyvernTyro, + FormationPattern = FormationPattern.Small9, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.WERE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIRE, (byte)SpellByte.ICE, (byte)SpellByte.MUTE, (byte)SpellByte.STUN, (byte)SpellByte.ICE, (byte)SpellByte.FIRE, (byte)SpellByte.LIT, (byte)SpellByte.DARK }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Ink, (byte)EnemySkills.Stinger, (byte)EnemySkills.Snorting, (byte)EnemySkills.Dazzle }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.ICE3, (byte)SpellByte.XXXX, (byte)SpellByte.LIT3, (byte)SpellByte.INVS, (byte)SpellByte.ICE3, (byte)SpellByte.MUTE, (byte)SpellByte.RUB }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Inferno, (byte)EnemySkills.Blizzard, (byte)EnemySkills.Thunder, (byte)EnemySkills.Swirl }, + }, + new AlternateFiends { + Name = "CARBUNCL", + SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x2D, // Blue/Grey + Palette2 = 0x2D, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.CURE, (byte)SpellByte.FAST, (byte)SpellByte.CURE, (byte)SpellByte.SLOW, (byte)SpellByte.CURE, (byte)SpellByte.FAST, (byte)SpellByte.CURE, (byte)SpellByte.SLOW }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Gaze, (byte)EnemySkills.Dazzle }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FAST, (byte)SpellByte.CUR2, (byte)SpellByte.SLO2, (byte)SpellByte.WALL, (byte)SpellByte.CUR2, (byte)SpellByte.XFER, (byte)SpellByte.SABR, (byte)SpellByte.CUR3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Gaze, (byte)EnemySkills.Glance, (byte)EnemySkills.Dazzle }, + }, + new AlternateFiends { + Name = "DJINN", + SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x23, // Green/White + Palette2 = 0x23, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIRE, (byte)SpellByte.FIRE, (byte)SpellByte.FIRE, (byte)SpellByte.FAST, (byte)SpellByte.FIRE, (byte)SpellByte.FIRE, (byte)SpellByte.FIRE, (byte)SpellByte.FAST }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Scorch, (byte)EnemySkills.Heat, (byte)EnemySkills.Scorch, (byte)EnemySkills.Gaze }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.FIR2, (byte)SpellByte.FAST, (byte)SpellByte.FIR3, (byte)SpellByte.FIR2, (byte)SpellByte.SLO2, (byte)SpellByte.FIR2, (byte)SpellByte.NUKE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blaze, (byte)EnemySkills.Scorch, (byte)EnemySkills.Scorch, (byte)EnemySkills.Inferno }, + }, + new AlternateFiends + { + Name = "DOGA", + SpriteSheet = FormationSpriteSheet.MedusaCatmanPedeTiger, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.MUTE, (byte)SpellByte.BRAK, (byte)SpellByte.SLEP, (byte)SpellByte.STUN, (byte)SpellByte.QAKE, (byte)SpellByte.SLOW, (byte)SpellByte.MUTE, (byte)SpellByte.BLND }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.BRAK, (byte)SpellByte.BRAK, (byte)SpellByte.QAKE, (byte)SpellByte.QAKE, (byte)SpellByte.NUKE, (byte)SpellByte.SLO2, (byte)SpellByte.RUB, (byte)SpellByte.XXXX }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + new AlternateFiends { + Name = "ECHIDNA", + SpriteSheet = FormationSpriteSheet.KaryLich, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x25, // Red/White + Palette2 = 0x2F, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.STUN, (byte)SpellByte.STOP, (byte)SpellByte.STUN, (byte)SpellByte.SLOW, (byte)SpellByte.STUN, (byte)SpellByte.STOP, (byte)SpellByte.STUN, (byte)SpellByte.SLOW }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Dazzle, (byte)EnemySkills.Ink, (byte)EnemySkills.Ink, (byte)EnemySkills.Crack }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.STUN, (byte)SpellByte.STOP, (byte)SpellByte.ZAP, (byte)SpellByte.STOP, (byte)SpellByte.WALL, (byte)SpellByte.XFER, (byte)SpellByte.STUN, (byte)SpellByte.XXXX }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Trance, (byte)EnemySkills.Crack, (byte)EnemySkills.Gaze }, + }, + new AlternateFiends + { + Name = "GARUDA", + SpriteSheet = FormationSpriteSheet.KrakenTiamat, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Earth, + MonsterType = MonsterType.NONE, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Dazzle, (byte)EnemySkills.Flash, (byte)EnemySkills.Ink, (byte)EnemySkills.Gaze }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Thunder, (byte)EnemySkills.Nuclear, (byte)EnemySkills.Toxic, (byte)EnemySkills.Poison_Damage }, + }, + new AlternateFiends + { + Name = "GENERAL", + SpriteSheet = FormationSpriteSheet.BoneCreepHyenaOgre, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.NONE, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Flash, (byte)EnemySkills.Stare, (byte)EnemySkills.Stare, (byte)EnemySkills.Trance }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Trance, (byte)EnemySkills.Squint, (byte)EnemySkills.Toxic, (byte)EnemySkills.Crack }, + }, + new AlternateFiends { + Name = "GOLDOR", + SpriteSheet = FormationSpriteSheet.MedusaCatmanPedeTiger, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.LIT2, (byte)SpellByte.ICE2, (byte)SpellByte.MUTE, (byte)SpellByte.AFIR, (byte)SpellByte.AICE, (byte)SpellByte.ALIT, (byte)SpellByte.SLOW }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.NUKE, (byte)SpellByte.LIT3, (byte)SpellByte.ICE3, (byte)SpellByte.WALL, (byte)SpellByte.MUTE, (byte)SpellByte.SLO2, (byte)SpellByte.SLO2 }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + new AlternateFiends { + Name = "GUARDIN", + SpriteSheet = FormationSpriteSheet.SahagPirateSharkBigEye, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Stinger, (byte)EnemySkills.Trance, (byte)EnemySkills.Gaze }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.WALL, (byte)SpellByte.CUR4, (byte)SpellByte.SLO2, (byte)SpellByte.FAST, (byte)SpellByte.INVS, (byte)SpellByte.SLP2, (byte)SpellByte.QAKE, (byte)SpellByte.QAKE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Stare, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Tornado }, + }, + new AlternateFiends { + Name = "GUTSCO", + SpriteSheet = FormationSpriteSheet.BoneCreepHyenaOgre, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIRE, (byte)SpellByte.FIR2, (byte)SpellByte.SLOW, (byte)SpellByte.FIRE, (byte)SpellByte.FIR2, (byte)SpellByte.STUN, (byte)SpellByte.BLND, (byte)SpellByte.FIRE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Cremate, (byte)EnemySkills.Heat, (byte)EnemySkills.Stinger, (byte)EnemySkills.Trance }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.FIR3, (byte)SpellByte.FAST, (byte)SpellByte.FOG, (byte)SpellByte.SLO2, (byte)SpellByte.SLP2, (byte)SpellByte.FIR3, (byte)SpellByte.LOK2 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blaze, (byte)EnemySkills.Nuclear, (byte)EnemySkills.Cremate, (byte)EnemySkills.Squint }, + }, + new AlternateFiends { + Name = "HECATON", + SpriteSheet = FormationSpriteSheet.KrakenTiamat, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Earth, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stare, (byte)EnemySkills.Gaze, (byte)EnemySkills.Squint, (byte)EnemySkills.Trance }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Squint, (byte)EnemySkills.Toxic, (byte)EnemySkills.Glare }, + }, + new AlternateFiends { + Name = "KUNOICHI", + SpriteSheet = FormationSpriteSheet.CaribeGatorOchoHydra, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.NONE, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Dazzle, (byte)EnemySkills.Gaze, (byte)EnemySkills.Trance, (byte)EnemySkills.Trance }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Tornado, (byte)EnemySkills.Trance, (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Glare }, + }, + new AlternateFiends { + Name = "LEVIATHN", + SpriteSheet = FormationSpriteSheet.ImageGeistWormEye, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x01, // Blue/White + Palette2 = 0x01, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE, (byte)SpellByte.ICE2, (byte)SpellByte.ICE, (byte)SpellByte.STOP, (byte)SpellByte.ICE, (byte)SpellByte.ICE2, (byte)SpellByte.ICE, (byte)SpellByte.STOP }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Stinger, (byte)EnemySkills.Flash }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ICE2, (byte)SpellByte.ICE2, (byte)SpellByte.ICE3, (byte)SpellByte.ICE3, (byte)SpellByte.ICE2, (byte)SpellByte.ICE2, (byte)SpellByte.XFER, (byte)SpellByte.ICE3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Swirl, (byte)EnemySkills.Blizzard, (byte)EnemySkills.Swirl }, + }, + new AlternateFiends { + Name = "LUCIFER", + SpriteSheet = FormationSpriteSheet.ImpWolfIguanaGiant, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.REGENERATIVE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.FIRE, (byte)SpellByte.FIR2, (byte)SpellByte.SLOW, (byte)SpellByte.SLEP, (byte)SpellByte.BLND, (byte)SpellByte.MUTE, (byte)SpellByte.FIRE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Heat, (byte)EnemySkills.Scorch, (byte)EnemySkills.Trance, (byte)EnemySkills.Glance }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.NUKE, (byte)SpellByte.FIR3, (byte)SpellByte.XFER, (byte)SpellByte.FIR3, (byte)SpellByte.XXXX, (byte)SpellByte.FAST, (byte)SpellByte.FOG2, (byte)SpellByte.TMPR }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Inferno, (byte)EnemySkills.Toxic, (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Squint }, + }, + new AlternateFiends{ + Name = "NEP.DRGN", + SpriteSheet = FormationSpriteSheet.KrakenTiamat, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stare, (byte)EnemySkills.Heat, (byte)EnemySkills.Cremate, (byte)EnemySkills.Trance }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Tornado, (byte)EnemySkills.Toxic, (byte)EnemySkills.Inferno, (byte)EnemySkills.Tornado }, + }, + new AlternateFiends{ + Name = "NINJI", + SpriteSheet = FormationSpriteSheet.MummyCoctricWyvernTyro, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Time, + MonsterType = MonsterType.NONE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FOG, (byte)SpellByte.INVS, (byte)SpellByte.BLND, (byte)SpellByte.BLND, (byte)SpellByte.STUN, (byte)SpellByte.SLEP, (byte)SpellByte.SLEP, (byte)SpellByte.FOG }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FAST, (byte)SpellByte.SABR, (byte)SpellByte.FOG2, (byte)SpellByte.INVS, (byte)SpellByte.SLO2, (byte)SpellByte.SLP2, (byte)SpellByte.BANE, (byte)SpellByte.ZAP }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + new AlternateFiends { + Name = "SALAMAND", + SpriteSheet = FormationSpriteSheet.WizardGarlandDragon2Golem, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x27, // Orange/Red + Palette2 = 0x27, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIRE, (byte)SpellByte.DARK, (byte)SpellByte.FIRE, (byte)SpellByte.FIR2, (byte)SpellByte.FIRE, (byte)SpellByte.DARK, (byte)SpellByte.FIRE, (byte)SpellByte.FIR2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Flash, (byte)EnemySkills.Heat, (byte)EnemySkills.Flash, (byte)EnemySkills.Heat }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.FIR3, (byte)SpellByte.FIR3, (byte)SpellByte.NUKE, (byte)SpellByte.FIR2, (byte)SpellByte.FIR2, (byte)SpellByte.FIR3, (byte)SpellByte.DARK }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Scorch, (byte)EnemySkills.Blaze, (byte)EnemySkills.Heat, (byte)EnemySkills.Inferno }, + }, + + new AlternateFiends { + Name = "SCYLLA", + SpriteSheet = FormationSpriteSheet.KrakenTiamat, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x1A, // Blue/Green + Palette2 = 0x24, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.AQUATIC, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.LIT, (byte)SpellByte.LIT2, (byte)SpellByte.LIT, (byte)SpellByte.LIT2, (byte)SpellByte.LIT, (byte)SpellByte.LIT2, (byte)SpellByte.LIT, (byte)SpellByte.LIT2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Dazzle, (byte)EnemySkills.Flash, (byte)EnemySkills.Glance, (byte)EnemySkills.Flash }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.LIT2, (byte)SpellByte.LIT2, (byte)SpellByte.LIT3, (byte)SpellByte.SLO2, (byte)SpellByte.LIT2, (byte)SpellByte.LIT2, (byte)SpellByte.LIT3, (byte)SpellByte.FAST }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Thunder, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Tornado, (byte)EnemySkills.Flash }, + }, + + new AlternateFiends { + Name = "UNNE", + SpriteSheet = FormationSpriteSheet.BadmanAstosMadponyWarmech, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Status, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE, (byte)SpellByte.ICE, (byte)SpellByte.SLOW, (byte)SpellByte.ICE, (byte)SpellByte.FOG, (byte)SpellByte.MUTE, (byte)SpellByte.SLOW, (byte)SpellByte.MUTE }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ICE3, (byte)SpellByte.SLO2, (byte)SpellByte.XFER, (byte)SpellByte.ICE3, (byte)SpellByte.BANE, (byte)SpellByte.MUTE, (byte)SpellByte.ICE2, (byte)SpellByte.ICE2 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blizzard, (byte)EnemySkills.Tornado, (byte)EnemySkills.Frost, (byte)EnemySkills.Glare }, + }, + + new AlternateFiends { + Name = "ZANDE", + SpriteSheet = FormationSpriteSheet.KaryLich, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIRE, (byte)SpellByte.LIT2, (byte)SpellByte.FIR2, (byte)SpellByte.CUR2, (byte)SpellByte.HOLD, (byte)SpellByte.LIT, (byte)SpellByte.HOLD, (byte)SpellByte.BLND }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.NUKE, (byte)SpellByte.LIT3, (byte)SpellByte.FIR3, (byte)SpellByte.QAKE, (byte)SpellByte.FIR3, (byte)SpellByte.XXXX, (byte)SpellByte.SLP2, (byte)SpellByte.RUB }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Nuclear, (byte)EnemySkills.Blaze, (byte)EnemySkills.Toxic }, + }, + }; + var FF4AltFiendListHardcore = new List + { + new AlternateFiends { + Name = "ANTLION", + SpriteSheet = FormationSpriteSheet.AspLobsterBullTroll, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Crack, (byte)EnemySkills.Trance, (byte)EnemySkills.Cremate }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Toxic, (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Blaze, (byte)EnemySkills.Crack }, + }, + + new AlternateFiends { + Name = "ASURA", + SpriteSheet = FormationSpriteSheet.BoneCreepHyenaOgre, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.REGENERATIVE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.CUR2, (byte)SpellByte.CUR3, (byte)SpellByte.CUR3, (byte)SpellByte.FAST, (byte)SpellByte.CUR2, (byte)SpellByte.CUR3, (byte)SpellByte.CUR3, (byte)SpellByte.FAST }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.CUR2, (byte)SpellByte.CUR3, (byte)SpellByte.CUR2, (byte)SpellByte.FAST, (byte)SpellByte.CUR3, (byte)SpellByte.CUR2, (byte)SpellByte.CUR3, (byte)SpellByte.CUR4 }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + + new AlternateFiends { + Name = "BAIGAN", + SpriteSheet = FormationSpriteSheet.SlimeSpiderManticorAnkylo, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Status, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.SLOW, (byte)SpellByte.LIT2, (byte)SpellByte.ICE2, (byte)SpellByte.WALL, (byte)SpellByte.FIR2, (byte)SpellByte.STOP, (byte)SpellByte.TMPR, (byte)SpellByte.FIR2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Cremate, (byte)EnemySkills.Frost }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.WALL, (byte)SpellByte.FAST, (byte)SpellByte.ICE3, (byte)SpellByte.NUKE, (byte)SpellByte.SLO2, (byte)SpellByte.FOG, (byte)SpellByte.LIT3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Crack, (byte)EnemySkills.Stare, (byte)EnemySkills.Stinger }, + }, + + new AlternateFiends { + Name = "BALNAB", + SpriteSheet = FormationSpriteSheet.ImpWolfIguanaGiant, + FormationPattern = FormationPattern.Small9, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Cremate, (byte)EnemySkills.Toxic, (byte)EnemySkills.Cremate, (byte)EnemySkills.Stare }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Thunder, (byte)EnemySkills.Nuclear, (byte)EnemySkills.Toxic }, + }, + + new AlternateFiends { + Name = "BARBRICA", + SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Earth, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.LIT, (byte)SpellByte.DARK, (byte)SpellByte.SLOW, (byte)SpellByte.LIT2, (byte)SpellByte.LIT, (byte)SpellByte.DARK, (byte)SpellByte.SLOW, (byte)SpellByte.LIT2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Heat, (byte)EnemySkills.Flash, (byte)EnemySkills.Gaze, (byte)EnemySkills.Heat }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.LIT3, (byte)SpellByte.LIT2, (byte)SpellByte.SLOW, (byte)SpellByte.LIT3, (byte)SpellByte.LIT2, (byte)SpellByte.SLO2, (byte)SpellByte.DARK, (byte)SpellByte.DARK }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Flash, (byte)EnemySkills.Thunder, (byte)EnemySkills.Glare, (byte)EnemySkills.Thunder }, + }, + new AlternateFiends { + Name = "CAGNAZZO", + SpriteSheet = FormationSpriteSheet.MummyCoctricWyvernTyro, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x14, // Blue/Purple + Palette2 = 0x14, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.AQUATIC, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE, (byte)SpellByte.STUN, (byte)SpellByte.ICE, (byte)SpellByte.ICE2, (byte)SpellByte.ICE, (byte)SpellByte.STUN, (byte)SpellByte.ICE, (byte)SpellByte.ICE2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Flash, (byte)EnemySkills.Frost, (byte)EnemySkills.Flash }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ICE2, (byte)SpellByte.ICE2, (byte)SpellByte.ICE3, (byte)SpellByte.CUR3, (byte)SpellByte.ICE2, (byte)SpellByte.ICE3, (byte)SpellByte.ICE3, (byte)SpellByte.CUR4 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Frost, (byte)EnemySkills.Blizzard }, + }, + + new AlternateFiends { + Name = "CALCABRN", + SpriteSheet = FormationSpriteSheet.KrakenTiamat, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x14, // Blue/Purple + Palette2 = 0x14, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FAST, (byte)SpellByte.LIT, (byte)SpellByte.LIT2, (byte)SpellByte.SLOW, (byte)SpellByte.FOG, (byte)SpellByte.BLND, (byte)SpellByte.BRAK, (byte)SpellByte.ICE2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Trance, (byte)EnemySkills.Frost, (byte)EnemySkills.Gaze, (byte)EnemySkills.Stare }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.SABR, (byte)SpellByte.ICE3, (byte)SpellByte.SLO2, (byte)SpellByte.INVS, (byte)SpellByte.LIT3, (byte)SpellByte.XXXX, (byte)SpellByte.MUTE, (byte)SpellByte.CUR4 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blizzard, (byte)EnemySkills.Crack, (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Squint }, + }, + + new AlternateFiends { + Name = "D.MIST", + SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE, (byte)SpellByte.ICE2, (byte)SpellByte.SLOW, (byte)SpellByte.FOG, (byte)SpellByte.FOG, (byte)SpellByte.ICE2, (byte)SpellByte.DARK, (byte)SpellByte.CUR2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Snorting, (byte)EnemySkills.Frost, (byte)EnemySkills.Frost, (byte)EnemySkills.Gaze }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ICE3, (byte)SpellByte.SLO2, (byte)SpellByte.ICE3, (byte)SpellByte.FOG, (byte)SpellByte.INVS, (byte)SpellByte.ICE3, (byte)SpellByte.SLO2, (byte)SpellByte.FOG }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blizzard, (byte)EnemySkills.Tornado, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Squint }, + }, + + new AlternateFiends { + Name = "D.STORM", + SpriteSheet = FormationSpriteSheet.SahagPirateSharkBigEye, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Time, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.LIT, (byte)SpellByte.FAST, (byte)SpellByte.LIT2, (byte)SpellByte.SLOW, (byte)SpellByte.LIT2, (byte)SpellByte.LOCK, (byte)SpellByte.LIT2, (byte)SpellByte.SLOW }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Glare, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Trance, (byte)EnemySkills.Stare }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.LIT3, (byte)SpellByte.FAST, (byte)SpellByte.LIT3, (byte)SpellByte.SABR, (byte)SpellByte.XXXX, (byte)SpellByte.LIT3, (byte)SpellByte.LOK2, (byte)SpellByte.CUR3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Tornado, (byte)EnemySkills.Thunder, (byte)EnemySkills.Glare, (byte)EnemySkills.Poison_Stone }, + }, + + new AlternateFiends { + Name = "DARKELF", + SpriteSheet = FormationSpriteSheet.ImpWolfIguanaGiant, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Poison, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.ICE2, (byte)SpellByte.LIT2, (byte)SpellByte.MUTE, (byte)SpellByte.STUN, (byte)SpellByte.FIR2, (byte)SpellByte.LIT2, (byte)SpellByte.ICE2 }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.LIT3, (byte)SpellByte.ICE3, (byte)SpellByte.FIR3, (byte)SpellByte.INVS, (byte)SpellByte.XXXX, (byte)SpellByte.NUKE, (byte)SpellByte.CUR3, (byte)SpellByte.SLO2 }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + + new AlternateFiends { + Name = "DETHMACH", + SpriteSheet = FormationSpriteSheet.KrakenTiamat, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Earth, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.BANE, (byte)SpellByte.FOG, (byte)SpellByte.BRAK, (byte)SpellByte.FAST, (byte)SpellByte.STUN, (byte)SpellByte.HOLD, (byte)SpellByte.QAKE, (byte)SpellByte.ZAP }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.XXXX, (byte)SpellByte.XFER, (byte)SpellByte.ZAP, (byte)SpellByte.XFER, (byte)SpellByte.XXXX, (byte)SpellByte.QAKE, (byte)SpellByte.BANE, (byte)SpellByte.BRAK }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + + new AlternateFiends { + Name = "EVILWALL", + SpriteSheet = FormationSpriteSheet.KrakenTiamat, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Earth, + MonsterType = MonsterType.NONE, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Gaze, (byte)EnemySkills.Glance, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Stare }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Toxic, (byte)EnemySkills.Squint, (byte)EnemySkills.Nuclear }, + }, + + new AlternateFiends { + Name = "FLANMAST", + SpriteSheet = FormationSpriteSheet.SahagPirateSharkBigEye, + FormationPattern = FormationPattern.Small9, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Status, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.INVS, (byte)SpellByte.FIR2, (byte)SpellByte.MUTE, (byte)SpellByte.RUB, (byte)SpellByte.SLOW, (byte)SpellByte.FIR2, (byte)SpellByte.LIT2 }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.NUKE, (byte)SpellByte.XXXX, (byte)SpellByte.FIR3, (byte)SpellByte.SLO2, (byte)SpellByte.BRAK, (byte)SpellByte.WALL, (byte)SpellByte.FIR3, (byte)SpellByte.INVS }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + + new AlternateFiends { + Name = "GIGAWORM", + SpriteSheet = FormationSpriteSheet.ImageGeistWormEye, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.NONE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.LIT2, (byte)SpellByte.FIR2, (byte)SpellByte.QAKE, (byte)SpellByte.STUN, (byte)SpellByte.MUTE, (byte)SpellByte.LIT2, (byte)SpellByte.FIR2, (byte)SpellByte.RUB }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Cremate, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Trance }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.QAKE, (byte)SpellByte.FAST, (byte)SpellByte.FIR3, (byte)SpellByte.SLP2, (byte)SpellByte.XXXX, (byte)SpellByte.INVS, (byte)SpellByte.FIR3, (byte)SpellByte.SLO2 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Nuclear, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Blaze, (byte)EnemySkills.Dazzle }, + }, + + new AlternateFiends { + Name = "GOLBEZ", + SpriteSheet = FormationSpriteSheet.KrakenTiamat, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.QAKE, (byte)SpellByte.ICE2, (byte)SpellByte.RUB, (byte)SpellByte.LIT2, (byte)SpellByte.FIRE, (byte)SpellByte.FIR2, (byte)SpellByte.LIT, (byte)SpellByte.ICE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Cremate, (byte)EnemySkills.Frost, (byte)EnemySkills.Gaze, (byte)EnemySkills.Stare }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.NUKE, (byte)SpellByte.INVS, (byte)SpellByte.XXXX, (byte)SpellByte.ICE3, (byte)SpellByte.XFER, (byte)SpellByte.BRAK, (byte)SpellByte.FIR3, (byte)SpellByte.STOP }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blaze, (byte)EnemySkills.Inferno, (byte)EnemySkills.Swirl, (byte)EnemySkills.Poison_Stone }, + }, + + new AlternateFiends { + Name = "IFRIT", + SpriteSheet = FormationSpriteSheet.VampGargoyleEarthDragon1, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x00, // Brown/Red + Palette2 = 0x00, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIRE, (byte)SpellByte.STUN, (byte)SpellByte.FIRE, (byte)SpellByte.FIR2, (byte)SpellByte.FIRE, (byte)SpellByte.STUN, (byte)SpellByte.FIRE, (byte)SpellByte.FIR2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Heat, (byte)EnemySkills.Scorch, (byte)EnemySkills.Heat, (byte)EnemySkills.Flash }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.FIR3, (byte)SpellByte.XFER, (byte)SpellByte.FIR2, (byte)SpellByte.FIR3, (byte)SpellByte.WALL, (byte)SpellByte.FIR3, (byte)SpellByte.NUKE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Inferno, (byte)EnemySkills.Flash, (byte)EnemySkills.Blaze, (byte)EnemySkills.Nuclear }, + }, + + new AlternateFiends { + Name = "LUGAE", + SpriteSheet = FormationSpriteSheet.WizardGarlandDragon2Golem, + FormationPattern = FormationPattern.Small9, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.UNDEAD, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.LIT2, (byte)SpellByte.FIR2, (byte)SpellByte.QAKE, (byte)SpellByte.STUN, (byte)SpellByte.MUTE, (byte)SpellByte.LIT2, (byte)SpellByte.FIR2, (byte)SpellByte.RUB }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Cremate, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Trance }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.QAKE, (byte)SpellByte.FAST, (byte)SpellByte.FIR3, (byte)SpellByte.SLP2, (byte)SpellByte.XXXX, (byte)SpellByte.INVS, (byte)SpellByte.FIR3, (byte)SpellByte.SLO2 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Nuclear, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Blaze, (byte)EnemySkills.Dazzle }, + }, + + new AlternateFiends { + Name = "MOMBOMB", + SpriteSheet = FormationSpriteSheet.BoneCreepHyenaOgre, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.NONE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIRE, (byte)SpellByte.FIR2, (byte)SpellByte.RUB, (byte)SpellByte.SLOW, (byte)SpellByte.FIR2, (byte)SpellByte.FIR2, (byte)SpellByte.STUN, (byte)SpellByte.BLND }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Heat, (byte)EnemySkills.Cremate, (byte)EnemySkills.Trance, (byte)EnemySkills.Heat }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.NUKE, (byte)SpellByte.MUTE, (byte)SpellByte.RUB, (byte)SpellByte.FIR3, (byte)SpellByte.FAST, (byte)SpellByte.CUR3, (byte)SpellByte.SLOW }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blaze, (byte)EnemySkills.Cremate, (byte)EnemySkills.Inferno, (byte)EnemySkills.Trance }, + }, + + new AlternateFiends { + Name = "OCTOMAM", + SpriteSheet = FormationSpriteSheet.BoneCreepHyenaOgre, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.AQUATIC, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE, (byte)SpellByte.CUR2, (byte)SpellByte.ICE2, (byte)SpellByte.FOG, (byte)SpellByte.ICE2, (byte)SpellByte.STUN, (byte)SpellByte.SLEP, (byte)SpellByte.ICE2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Ink, (byte)EnemySkills.Stinger, (byte)EnemySkills.Ink, (byte)EnemySkills.Stare }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ICE3, (byte)SpellByte.ICE3, (byte)SpellByte.FAST, (byte)SpellByte.CUR4, (byte)SpellByte.SLO2, (byte)SpellByte.XXXX, (byte)SpellByte.TMPR, (byte)SpellByte.ICE3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Swirl, (byte)EnemySkills.Ink, (byte)EnemySkills.Blizzard, (byte)EnemySkills.Stinger }, + }, + + new AlternateFiends { + Name = "ODIN", + SpriteSheet = FormationSpriteSheet.ImpWolfIguanaGiant, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x26, // Yellow/Blue + Palette2 = 0x26, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.STUN, (byte)SpellByte.CUR2, (byte)SpellByte.FAST, (byte)SpellByte.SLOW, (byte)SpellByte.STUN, (byte)SpellByte.CUR2, (byte)SpellByte.FAST, (byte)SpellByte.SLOW }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Gaze, (byte)EnemySkills.Flash, (byte)EnemySkills.Flash, (byte)EnemySkills.Crack }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.STUN, (byte)SpellByte.CUR3, (byte)SpellByte.XXXX, (byte)SpellByte.SLO2, (byte)SpellByte.CUR3, (byte)SpellByte.STOP, (byte)SpellByte.SLOW, (byte)SpellByte.NUKE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Gaze, (byte)EnemySkills.Flash, (byte)EnemySkills.Dazzle }, + }, + + new AlternateFiends { + Name = "OGOPOGO", + SpriteSheet = FormationSpriteSheet.ImpWolfIguanaGiant, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.AQUATIC, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE2, (byte)SpellByte.ICE, (byte)SpellByte.ICE2, (byte)SpellByte.FOG, (byte)SpellByte.HEL2, (byte)SpellByte.ICE2, (byte)SpellByte.SLOW, (byte)SpellByte.ICE2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Ink, (byte)EnemySkills.Frost, (byte)EnemySkills.Ink, (byte)EnemySkills.Frost }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ICE3, (byte)SpellByte.ICE3, (byte)SpellByte.INVS, (byte)SpellByte.BLND, (byte)SpellByte.ICE3, (byte)SpellByte.BRAK, (byte)SpellByte.WALL, (byte)SpellByte.ICE3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Swirl, (byte)EnemySkills.Ink, (byte)EnemySkills.Blizzard, (byte)EnemySkills.Frost }, + }, + + new AlternateFiends { + Name = "PALEDIM", + SpriteSheet = FormationSpriteSheet.ImpWolfIguanaGiant, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE2, (byte)SpellByte.FIR2, (byte)SpellByte.LIT2, (byte)SpellByte.SLOW, (byte)SpellByte.ICE2, (byte)SpellByte.FIR2, (byte)SpellByte.LIT2, (byte)SpellByte.SLOW }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Frost, (byte)EnemySkills.Cremate, (byte)EnemySkills.Trance }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ICE3, (byte)SpellByte.FIR3, (byte)SpellByte.LIT3, (byte)SpellByte.SLO2, (byte)SpellByte.ICE3, (byte)SpellByte.LIT3, (byte)SpellByte.FIR3, (byte)SpellByte.SLO2 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Thunder, (byte)EnemySkills.Inferno, (byte)EnemySkills.Blizzard, (byte)EnemySkills.Crack }, + }, + + new AlternateFiends { + Name = "PLAGUE", + SpriteSheet = FormationSpriteSheet.ImageGeistWormEye, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Status, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.BRAK, (byte)SpellByte.SLOW, (byte)SpellByte.QAKE, (byte)SpellByte.SLOW, (byte)SpellByte.INVS, (byte)SpellByte.RUB, (byte)SpellByte.BRAK, (byte)SpellByte.SLOW }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.XXXX, (byte)SpellByte.BRAK, (byte)SpellByte.QAKE, (byte)SpellByte.SLO2, (byte)SpellByte.INVS, (byte)SpellByte.RUB, (byte)SpellByte.ZAP, (byte)SpellByte.BANE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Nuclear, (byte)EnemySkills.Toxic, (byte)EnemySkills.Crack }, + }, + + new AlternateFiends { + Name = "RAMUH", + SpriteSheet = FormationSpriteSheet.AspLobsterBullTroll, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x26, + Palette2 = 0x26, + ElementalWeakness = SpellElement.Earth, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.LIT, (byte)SpellByte.LIT2, (byte)SpellByte.CUR2, (byte)SpellByte.LIT2, (byte)SpellByte.LIT, (byte)SpellByte.CUR2, (byte)SpellByte.LIT, (byte)SpellByte.LIT2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Flash, (byte)EnemySkills.Flash, (byte)EnemySkills.Stinger }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.LIT3, (byte)SpellByte.STUN, (byte)SpellByte.LIT3, (byte)SpellByte.SLOW, (byte)SpellByte.CUR3, (byte)SpellByte.LIT3, (byte)SpellByte.STOP, (byte)SpellByte.LIT3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Thunder, (byte)EnemySkills.Stinger, (byte)EnemySkills.Flash, (byte)EnemySkills.Tornado }, + }, + + new AlternateFiends { + Name = "RUBICANT", + SpriteSheet = FormationSpriteSheet.VampGargoyleEarthDragon1, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x0D, // Red/Red + Palette2 = 0x0D, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIRE, (byte)SpellByte.FIRE, (byte)SpellByte.FIRE, (byte)SpellByte.FIR2, (byte)SpellByte.FIRE, (byte)SpellByte.FIRE, (byte)SpellByte.FIRE, (byte)SpellByte.FIR2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Heat, (byte)EnemySkills.Scorch, (byte)EnemySkills.Flash, (byte)EnemySkills.Dazzle }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.FIR2, (byte)SpellByte.FIR3, (byte)SpellByte.NUKE, (byte)SpellByte.FIR2, (byte)SpellByte.FIR3, (byte)SpellByte.FIR3, (byte)SpellByte.NUKE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Scorch, (byte)EnemySkills.Heat, (byte)EnemySkills.Blaze, (byte)EnemySkills.Nuclear }, + }, + new AlternateFiends { + Name = "SCARMLIO", + SpriteSheet = FormationSpriteSheet.BoneCreepHyenaOgre, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x1B, // Brown/Blue + Palette2 = 0x1B, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.UNDEAD, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Snorting, (byte)EnemySkills.Gaze, (byte)EnemySkills.Ink, (byte)EnemySkills.Crack }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Snorting, (byte)EnemySkills.Crack, (byte)EnemySkills.Snorting }, + }, + + new AlternateFiends { + Name = "SHADOW.D", + SpriteSheet = FormationSpriteSheet.VampGargoyleEarthDragon1, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x1B, + Palette2 = 0x1B, + ElementalWeakness = SpellElement.Earth, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.STUN, (byte)SpellByte.HOLD, (byte)SpellByte.RUB, (byte)SpellByte.STUN, (byte)SpellByte.HOLD, (byte)SpellByte.RUB, (byte)SpellByte.STUN, (byte)SpellByte.HOLD }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Toxic, (byte)EnemySkills.Nuclear, (byte)EnemySkills.Poison_Stone }, + }, + + new AlternateFiends { + Name = "SHIVA", + SpriteSheet = FormationSpriteSheet.KaryLich, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x13, // Blue/Purple + Palette2 = 0x14, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE, (byte)SpellByte.ICE, (byte)SpellByte.ICE, (byte)SpellByte.ICE2, (byte)SpellByte.ICE, (byte)SpellByte.ICE, (byte)SpellByte.ICE, (byte)SpellByte.ICE2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Flash, (byte)EnemySkills.Gaze, (byte)EnemySkills.Snorting }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ICE2, (byte)SpellByte.ICE3, (byte)SpellByte.ICE2, (byte)SpellByte.ICE2, (byte)SpellByte.ICE3, (byte)SpellByte.ICE3, (byte)SpellByte.ICE2, (byte)SpellByte.BRAK }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Flash, (byte)EnemySkills.Blizzard, (byte)EnemySkills.Gaze }, + }, + new AlternateFiends { + Name = "TITAN", + SpriteSheet = FormationSpriteSheet.ImpWolfIguanaGiant, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x32, // Brown/White + Palette2 = 0x32, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.LIT, (byte)SpellByte.LIT, (byte)SpellByte.LIT, (byte)SpellByte.LIT, (byte)SpellByte.LIT, (byte)SpellByte.LIT, (byte)SpellByte.LIT, (byte)SpellByte.LIT }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Dazzle, (byte)EnemySkills.Gaze, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Flash }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.LIT2, (byte)SpellByte.FAST, (byte)SpellByte.LIT3, (byte)SpellByte.SLO2, (byte)SpellByte.STOP, (byte)SpellByte.LIT3, (byte)SpellByte.LIT2, (byte)SpellByte.XFER }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Swirl, (byte)EnemySkills.Scorch, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Tornado }, + }, + + new AlternateFiends { + Name = "WYVERN", + SpriteSheet = FormationSpriteSheet.CaribeGatorOchoHydra, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x32, + Palette2 = 0x32, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.SLOW, (byte)SpellByte.FIR2, (byte)SpellByte.INVS, (byte)SpellByte.FIR2, (byte)SpellByte.MUTE, (byte)SpellByte.FIR2, (byte)SpellByte.SLOW }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Heat, (byte)EnemySkills.Cremate, (byte)EnemySkills.Trance, (byte)EnemySkills.Heat }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.NUKE, (byte)SpellByte.INVS, (byte)SpellByte.FIR3, (byte)SpellByte.FAST, (byte)SpellByte.XXXX, (byte)SpellByte.NUKE, (byte)SpellByte.SLO2, (byte)SpellByte.FIR3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Inferno, (byte)EnemySkills.Tornado, (byte)EnemySkills.Glare, (byte)EnemySkills.Tornado }, + }, + + new AlternateFiends { + Name = "ZEMUS", + SpriteSheet = FormationSpriteSheet.KaryLich, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x32, + Palette2 = 0x32, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.LIT2, (byte)SpellByte.ICE2, (byte)SpellByte.ZAP, (byte)SpellByte.SLOW, (byte)SpellByte.MUTE, (byte)SpellByte.QAKE, (byte)SpellByte.ICE2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Trance, (byte)EnemySkills.Cremate, (byte)EnemySkills.Frost, (byte)EnemySkills.Stare }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FAST, (byte)SpellByte.NUKE, (byte)SpellByte.FIR3, (byte)SpellByte.BANE, (byte)SpellByte.SABR, (byte)SpellByte.SLO2, (byte)SpellByte.NUKE, (byte)SpellByte.CUR4 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Swirl, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Toxic, (byte)EnemySkills.Nuclear }, + }, + + + }; + var FF5AltFiendListHarcore = new List + { + new AlternateFiends { + Name = "ABDUCTOR", + SpriteSheet = FormationSpriteSheet.WizardGarlandDragon2Golem, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Status, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stare, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Trance, (byte)EnemySkills.Cremate }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Toxic, (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Blaze, (byte)EnemySkills.Crack }, + }, + + new AlternateFiends { + Name = "ALTAROIT", + SpriteSheet = FormationSpriteSheet.SahagPirateSharkBigEye, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Time, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE2, (byte)SpellByte.SLOW, (byte)SpellByte.SLEP, (byte)SpellByte.LIT2, (byte)SpellByte.MUTE, (byte)SpellByte.ICE2, (byte)SpellByte.LIT2, (byte)SpellByte.INVS }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ZAP, (byte)SpellByte.ICE3, (byte)SpellByte.LIT3, (byte)SpellByte.XXXX, (byte)SpellByte.CUR3, (byte)SpellByte.ICE3, (byte)SpellByte.SLO2, (byte)SpellByte.LIT3 }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + new AlternateFiends { + Name = "APANDA", + SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.SLOW, (byte)SpellByte.CUR2, (byte)SpellByte.LIT2, (byte)SpellByte.LIT2, (byte)SpellByte.FOG, (byte)SpellByte.FOG, (byte)SpellByte.CUR2, (byte)SpellByte.SLOW }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Trance, (byte)EnemySkills.Stinger, (byte)EnemySkills.Frost, (byte)EnemySkills.Flash }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.LIT3, (byte)SpellByte.FOG2, (byte)SpellByte.CUR3, (byte)SpellByte.LOK2, (byte)SpellByte.LIT3, (byte)SpellByte.FOG2, (byte)SpellByte.CUR3, (byte)SpellByte.LIT3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Tornado, (byte)EnemySkills.Nuclear, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Glare }, + }, + new AlternateFiends { + Name = "ARCHAVIS", + SpriteSheet = FormationSpriteSheet.SlimeSpiderManticorAnkylo, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.BANE, (byte)SpellByte.FAST, (byte)SpellByte.HOLD, (byte)SpellByte.FIR2, (byte)SpellByte.SLEP, (byte)SpellByte.FIR2, (byte)SpellByte.MUTE, (byte)SpellByte.FIR2 }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Tornado, (byte)EnemySkills.Toxic, (byte)EnemySkills.Glance, (byte)EnemySkills.Thunder }, + }, + new AlternateFiends { + Name = "ATMOS", + SpriteSheet = FormationSpriteSheet.KaryLich, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.SLOW, (byte)SpellByte.FAST, (byte)SpellByte.INVS, (byte)SpellByte.HOLD, (byte)SpellByte.SLOW, (byte)SpellByte.HOLD, (byte)SpellByte.LOCK, (byte)SpellByte.LOCK }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.BANE, (byte)SpellByte.ZAP, (byte)SpellByte.XXXX, (byte)SpellByte.SLO2, (byte)SpellByte.ZAP, (byte)SpellByte.SLO2, (byte)SpellByte.XXXX, (byte)SpellByte.CUR3 }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + new AlternateFiends { + Name = "ARCHDEMN", + SpriteSheet = FormationSpriteSheet.KaryLich, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.UNDEAD, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.LOCK, (byte)SpellByte.FIR2, (byte)SpellByte.STUN, (byte)SpellByte.FIR2, (byte)SpellByte.SLOW, (byte)SpellByte.FIR2, (byte)SpellByte.LOCK }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Dazzle, (byte)EnemySkills.Trance, (byte)EnemySkills.Snorting, (byte)EnemySkills.Stinger }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.INVS, (byte)SpellByte.NUKE, (byte)SpellByte.FAST, (byte)SpellByte.FIR3, (byte)SpellByte.STOP, (byte)SpellByte.MUTE, (byte)SpellByte.FIR3 }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + new AlternateFiends { + Name = "AZULMAGE", + SpriteSheet = FormationSpriteSheet.KrakenTiamat, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Poison, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.ICE2, (byte)SpellByte.LIT2, (byte)SpellByte.SLOW, (byte)SpellByte.FOG, (byte)SpellByte.INVS, (byte)SpellByte.FOG, (byte)SpellByte.MUTE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Cremate, (byte)EnemySkills.Frost, (byte)EnemySkills.Gaze, (byte)EnemySkills.Heat }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.ICE3, (byte)SpellByte.LIT3, (byte)SpellByte.STOP, (byte)SpellByte.LOK2, (byte)SpellByte.ZAP, (byte)SpellByte.CUR4, (byte)SpellByte.INVS }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Nuclear, (byte)EnemySkills.Blaze, (byte)EnemySkills.Trance, (byte)EnemySkills.Stare }, + }, + new AlternateFiends { + Name = "BYBLOS", + SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Squint, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Frost, (byte)EnemySkills.Trance }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Tornado, (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Toxic }, + }, + new AlternateFiends { + Name = "C.BRAIN", + SpriteSheet = FormationSpriteSheet.BadmanAstosMadponyWarmech, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Time, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE2, (byte)SpellByte.STUN, (byte)SpellByte.FIR2, (byte)SpellByte.SLOW, (byte)SpellByte.ICE2, (byte)SpellByte.STUN, (byte)SpellByte.FIR2, (byte)SpellByte.TMPR }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Heat, (byte)EnemySkills.Ink, (byte)EnemySkills.Stinger, (byte)EnemySkills.Dazzle }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ICE3, (byte)SpellByte.RUB, (byte)SpellByte.FIR3, (byte)SpellByte.SLP2, (byte)SpellByte.ICE3, (byte)SpellByte.XFER, (byte)SpellByte.FIR3, (byte)SpellByte.FAST }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Swirl, (byte)EnemySkills.Stare, (byte)EnemySkills.Poison_Stone }, + }, + new AlternateFiends { + Name = "CALOFIST", + SpriteSheet = FormationSpriteSheet.CaribeGatorOchoHydra, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Status, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FAST, (byte)SpellByte.FOG, (byte)SpellByte.CUR2, (byte)SpellByte.SLOW, (byte)SpellByte.INVS, (byte)SpellByte.STUN, (byte)SpellByte.SLOW, (byte)SpellByte.SLEP }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.INVS, (byte)SpellByte.FOG2, (byte)SpellByte.CUR4, (byte)SpellByte.SLO2, (byte)SpellByte.FADE, (byte)SpellByte.WALL, (byte)SpellByte.BANE, (byte)SpellByte.MUTE }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + new AlternateFiends { + Name = "CATOBLEP", + SpriteSheet = FormationSpriteSheet.SahagPirateSharkBigEye, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Poison, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.STUN, (byte)SpellByte.SLOW, (byte)SpellByte.FIR2, (byte)SpellByte.BRAK, (byte)SpellByte.FIR2, (byte)SpellByte.STUN, (byte)SpellByte.BRAK }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Blaze, (byte)EnemySkills.Glance, (byte)EnemySkills.Gaze }, + }, + new AlternateFiends { + Name = "CRAYCLAW", + SpriteSheet = FormationSpriteSheet.SlimeSpiderManticorAnkylo, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Stare, (byte)EnemySkills.Stare, (byte)EnemySkills.Gaze }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Toxic, (byte)EnemySkills.Tornado, (byte)EnemySkills.Blaze }, + }, + new AlternateFiends { + Name = "CTSTRPHE", + SpriteSheet = FormationSpriteSheet.CaribeGatorOchoHydra, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Status, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.SABR, (byte)SpellByte.INVS, (byte)SpellByte.QAKE, (byte)SpellByte.CUR2, (byte)SpellByte.SABR, (byte)SpellByte.INVS, (byte)SpellByte.QAKE, (byte)SpellByte.CUR2 }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.QAKE, (byte)SpellByte.BRAK, (byte)SpellByte.NUKE, (byte)SpellByte.XXXX, (byte)SpellByte.RUB, (byte)SpellByte.BRAK, (byte)SpellByte.CUR3, (byte)SpellByte.QAKE }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + new AlternateFiends { + Name = "D.POD", + SpriteSheet = FormationSpriteSheet.ImpWolfIguanaGiant, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Death, + MonsterType = MonsterType.REGENERATIVE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.SLEP, (byte)SpellByte.SLOW, (byte)SpellByte.STUN, (byte)SpellByte.HOLD, (byte)SpellByte.SLEP, (byte)SpellByte.SLOW, (byte)SpellByte.HOLD, (byte)SpellByte.STUN }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Gaze, (byte)EnemySkills.Stinger, (byte)EnemySkills.Gaze }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.SLP2, (byte)SpellByte.MUTE, (byte)SpellByte.SLP2, (byte)SpellByte.SLO2, (byte)SpellByte.MUTE, (byte)SpellByte.BRAK, (byte)SpellByte.LOK2, (byte)SpellByte.MUTE }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + new AlternateFiends { + Name = "ENKIDU", + SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Time, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.LIT2, (byte)SpellByte.STUN, (byte)SpellByte.LIT2, (byte)SpellByte.SLOW, (byte)SpellByte.LIT2, (byte)SpellByte.TMPR, (byte)SpellByte.INVS, (byte)SpellByte.LIT2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Glare, (byte)EnemySkills.Trance, (byte)EnemySkills.Flash, (byte)EnemySkills.Dazzle }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.LIT3, (byte)SpellByte.CUR4, (byte)SpellByte.SLO2, (byte)SpellByte.LIT3, (byte)SpellByte.FOG2, (byte)SpellByte.LOK2, (byte)SpellByte.LIT3, (byte)SpellByte.STOP }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Tornado, (byte)EnemySkills.Squint, (byte)EnemySkills.Tornado, (byte)EnemySkills.Glare }, + }, + new AlternateFiends { + Name = "EXDEATH", + SpriteSheet = FormationSpriteSheet.KrakenTiamat, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.REGENERATIVE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.LIT2, (byte)SpellByte.SLOW, (byte)SpellByte.FIR2, (byte)SpellByte.INVS, (byte)SpellByte.ICE2, (byte)SpellByte.CUR2, (byte)SpellByte.FOG, (byte)SpellByte.RUB }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ZAP, (byte)SpellByte.NUKE, (byte)SpellByte.QAKE, (byte)SpellByte.ICE3, (byte)SpellByte.CUR4, (byte)SpellByte.FIR3, (byte)SpellByte.LIT3, (byte)SpellByte.BRAK }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Blaze, (byte)EnemySkills.Blizzard, (byte)EnemySkills.Poison_Stone }, + }, + new AlternateFiends { + Name = "FORZA", + SpriteSheet = FormationSpriteSheet.ImpWolfIguanaGiant, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Status, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + new AlternateFiends { + Name = "GARULA", + SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Status, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + new AlternateFiends { + Name = "GILGAMSH", + SpriteSheet = FormationSpriteSheet.WizardGarlandDragon2Golem, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x36, // Yellow/Purple + Palette2 = 0x36, + ElementalWeakness = SpellElement.Time, + MonsterType = MonsterType.NONE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FAST, (byte)SpellByte.XFER, (byte)SpellByte.SLOW, (byte)SpellByte.WALL, (byte)SpellByte.FAST, (byte)SpellByte.XFER, (byte)SpellByte.SLOW, (byte)SpellByte.WALL }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FAST, (byte)SpellByte.XFER, (byte)SpellByte.SLO2, (byte)SpellByte.SABR, (byte)SpellByte.XXXX, (byte)SpellByte.SABR, (byte)SpellByte.SLO2, (byte)SpellByte.WALL }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + new AlternateFiends { + Name = "GOGO", + SpriteSheet = FormationSpriteSheet.SahagPirateSharkBigEye, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE2, (byte)SpellByte.INVS, (byte)SpellByte.LOCK, (byte)SpellByte.FIR2, (byte)SpellByte.LAMP, (byte)SpellByte.TMPR, (byte)SpellByte.SLOW, (byte)SpellByte.LIT2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Cremate, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Ink }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FADE, (byte)SpellByte.FAST, (byte)SpellByte.SLO2, (byte)SpellByte.INVS, (byte)SpellByte.RUB, (byte)SpellByte.TMPR, (byte)SpellByte.CUR3, (byte)SpellByte.XFER }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blizzard, (byte)EnemySkills.Thunder, (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Toxic }, + }, + new AlternateFiends { + Name = "GOLEM", + SpriteSheet = FormationSpriteSheet.CaribeGatorOchoHydra, + FormationPattern = FormationPattern.Small9, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.REGENERATIVE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.INVS, (byte)SpellByte.INVS, (byte)SpellByte.FOG, (byte)SpellByte.TMPR, (byte)SpellByte.CUR2, (byte)SpellByte.TMPR, (byte)SpellByte.MUTE, (byte)SpellByte.LOCK }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FAST, (byte)SpellByte.CUR3, (byte)SpellByte.INVS, (byte)SpellByte.WALL, (byte)SpellByte.FOG2, (byte)SpellByte.SABR, (byte)SpellByte.SLOW, (byte)SpellByte.CUR3 }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + new AlternateFiends { + Name = "KARLABOS", + SpriteSheet = FormationSpriteSheet.SahagPirateSharkBigEye, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.AQUATIC, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Dazzle, (byte)EnemySkills.Gaze, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Gaze }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Swirl, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Nuclear, (byte)EnemySkills.Dazzle }, + }, + new AlternateFiends { + Name = "L.FLAME", + SpriteSheet = FormationSpriteSheet.BadmanAstosMadponyWarmech, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.FIRE, (byte)SpellByte.FIR2, (byte)SpellByte.SLOW, (byte)SpellByte.FIR2, (byte)SpellByte.FIR2, (byte)SpellByte.FIRE, (byte)SpellByte.STUN }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Heat, (byte)EnemySkills.Cremate, (byte)EnemySkills.Flash, (byte)EnemySkills.Flash }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.FOG, (byte)SpellByte.FIR3, (byte)SpellByte.FIR3, (byte)SpellByte.SABR, (byte)SpellByte.HEL3, (byte)SpellByte.FIR3, (byte)SpellByte.FIR3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Inferno, (byte)EnemySkills.Nuclear, (byte)EnemySkills.Toxic, (byte)EnemySkills.Blaze }, + }, + new AlternateFiends { + Name = "MAGISSA", + SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.CUR2, (byte)SpellByte.FIR2, (byte)SpellByte.ICE2, (byte)SpellByte.LIT2, (byte)SpellByte.FIR2, (byte)SpellByte.CUR2, (byte)SpellByte.LIT2, (byte)SpellByte.ICE2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Stinger, (byte)EnemySkills.Stinger, (byte)EnemySkills.Stinger }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.ICE3, (byte)SpellByte.CUR4, (byte)SpellByte.ICE3, (byte)SpellByte.INVS, (byte)SpellByte.HEL3, (byte)SpellByte.NUKE, (byte)SpellByte.LIT3 }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + new AlternateFiends { + Name = "MELUSINE", + SpriteSheet = FormationSpriteSheet.VampGargoyleEarthDragon1, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Poison, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.LIT2, (byte)SpellByte.MUTE, (byte)SpellByte.ICE2, (byte)SpellByte.SLOW, (byte)SpellByte.FIR2, (byte)SpellByte.INVS, (byte)SpellByte.STUN, (byte)SpellByte.FOG }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.SLO2, (byte)SpellByte.LIT3, (byte)SpellByte.WALL, (byte)SpellByte.ICE3, (byte)SpellByte.MUTE, (byte)SpellByte.XXXX, (byte)SpellByte.BANE }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, +new AlternateFiends { + Name = "MINOS", + SpriteSheet = FormationSpriteSheet.MedusaCatmanPedeTiger, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Snorting, (byte)EnemySkills.Stare, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Trance }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Toxic, (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Poison_Stone }, + }, +new AlternateFiends { + Name = "NCROPHBE", + SpriteSheet = FormationSpriteSheet.AspLobsterBullTroll, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.All, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.AFIR, (byte)SpellByte.ICE2, (byte)SpellByte.AICE, (byte)SpellByte.LIT2, (byte)SpellByte.ALIT, (byte)SpellByte.RUB, (byte)SpellByte.HEL2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Cremate, (byte)EnemySkills.Frost, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Trance }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.WALL, (byte)SpellByte.XXXX, (byte)SpellByte.NUKE, (byte)SpellByte.SLO2, (byte)SpellByte.ICE3, (byte)SpellByte.MUTE, (byte)SpellByte.ZAP }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Swirl, (byte)EnemySkills.Inferno, (byte)EnemySkills.Stare }, + }, +new AlternateFiends { + Name = "OMEGA", + SpriteSheet = FormationSpriteSheet.KaryLich, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.REGENERATIVE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.HOLD, (byte)SpellByte.QAKE, (byte)SpellByte.FIR2, (byte)SpellByte.ICE2, (byte)SpellByte.INVS, (byte)SpellByte.SLOW, (byte)SpellByte.LIT2, (byte)SpellByte.CUR2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stare, (byte)EnemySkills.Cremate, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Stinger }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.NUKE, (byte)SpellByte.XXXX, (byte)SpellByte.LOK2, (byte)SpellByte.ICE3, (byte)SpellByte.CUR3, (byte)SpellByte.FAST, (byte)SpellByte.SLO2, (byte)SpellByte.ICE3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Thunder, (byte)EnemySkills.Blaze, (byte)EnemySkills.Nuclear, (byte)EnemySkills.Crack }, + }, +new AlternateFiends { + Name = "OMNISENT", + SpriteSheet = FormationSpriteSheet.KrakenTiamat, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Earth, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.MUTE, (byte)SpellByte.FIR2, (byte)SpellByte.LIT2, (byte)SpellByte.STUN, (byte)SpellByte.ICE2, (byte)SpellByte.MUTE, (byte)SpellByte.ZAP, (byte)SpellByte.FOG }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.INVS, (byte)SpellByte.FADE, (byte)SpellByte.CUR3, (byte)SpellByte.LIT3, (byte)SpellByte.XXXX, (byte)SpellByte.STOP, (byte)SpellByte.INVS, (byte)SpellByte.NUKE }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, +new AlternateFiends { + Name = "SHINRYU", + SpriteSheet = FormationSpriteSheet.MedusaCatmanPedeTiger, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.INVS, (byte)SpellByte.ZAP, (byte)SpellByte.ICE2, (byte)SpellByte.ICE2, (byte)SpellByte.LIT2, (byte)SpellByte.FAST, (byte)SpellByte.SLOW, (byte)SpellByte.LIT2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Cremate, (byte)EnemySkills.Frost, (byte)EnemySkills.Gaze, (byte)EnemySkills.Trance }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.QAKE, (byte)SpellByte.FADE, (byte)SpellByte.CUR4, (byte)SpellByte.FAST, (byte)SpellByte.SLO2, (byte)SpellByte.SABR, (byte)SpellByte.NUKE, (byte)SpellByte.XXXX }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Toxic, (byte)EnemySkills.Blizzard, (byte)EnemySkills.Swirl, (byte)EnemySkills.Crack }, + }, +new AlternateFiends { + Name = "SIREN", + SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.UNDEAD, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Trance, (byte)EnemySkills.Frost, (byte)EnemySkills.Glance }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Toxic, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Crack, (byte)EnemySkills.Squint }, + }, + new AlternateFiends { + Name = "S.CANNON", + SpriteSheet = FormationSpriteSheet.SahagPirateSharkBigEye, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.REGENERATIVE, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Cremate, (byte)EnemySkills.Crack, (byte)EnemySkills.Glare, (byte)EnemySkills.Trance }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Nuclear, (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Tornado, (byte)EnemySkills.Thunder }, + }, + new AlternateFiends { + Name = "TWINTANI", + SpriteSheet = FormationSpriteSheet.MummyCoctricWyvernTyro, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.INVS, (byte)SpellByte.FIR2, (byte)SpellByte.FIR2, (byte)SpellByte.HEL2, (byte)SpellByte.MUTE, (byte)SpellByte.LIT2, (byte)SpellByte.LIT2, (byte)SpellByte.SLOW }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Trance, (byte)EnemySkills.Stinger, (byte)EnemySkills.Snorting, (byte)EnemySkills.Heat }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FAST, (byte)SpellByte.LIT3, (byte)SpellByte.LOCK, (byte)SpellByte.LOCK, (byte)SpellByte.NUKE, (byte)SpellByte.LIT3, (byte)SpellByte.SLO2, (byte)SpellByte.XXXX }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Swirl, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Crack, (byte)EnemySkills.Blaze }, + }, + new AlternateFiends { + Name = "W.RAPTOR", + SpriteSheet = FormationSpriteSheet.ImpWolfIguanaGiant, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x36, + Palette2 = 0x36, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stare, (byte)EnemySkills.Glare, (byte)EnemySkills.Squint, (byte)EnemySkills.Trance }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Tornado, (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Toxic, (byte)EnemySkills.Tornado }, + }, + + }; + var FF6AltFiendListHardcore = new List + { + new AlternateFiends { + Name = "A.WORM", + SpriteSheet = FormationSpriteSheet.ImageGeistWormEye, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.NONE, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Stinger, (byte)EnemySkills.Trance, (byte)EnemySkills.Dazzle }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Tornado, (byte)EnemySkills.Crack, (byte)EnemySkills.Glance }, + }, + + new AlternateFiends { + Name = "ATMA", + SpriteSheet = FormationSpriteSheet.KaryLich, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.STUN, (byte)SpellByte.ICE2, (byte)SpellByte.SLOW, (byte)SpellByte.LIT2, (byte)SpellByte.MUTE, (byte)SpellByte.ZAP, (byte)SpellByte.ICE2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Heat, (byte)EnemySkills.Trance, (byte)EnemySkills.Stinger }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.QAKE, (byte)SpellByte.ICE3, (byte)SpellByte.SLO2, (byte)SpellByte.LIT3, (byte)SpellByte.XXXX, (byte)SpellByte.FADE, (byte)SpellByte.WALL }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blizzard, (byte)EnemySkills.Inferno, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Nuclear }, + }, + + new AlternateFiends { + Name = "B.DRAGON", + SpriteSheet = FormationSpriteSheet.SahagPirateSharkBigEye, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE2, (byte)SpellByte.SLOW, (byte)SpellByte.DARK, (byte)SpellByte.ICE2, (byte)SpellByte.MUTE, (byte)SpellByte.ICE2, (byte)SpellByte.SLOW, (byte)SpellByte.ICE2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Frost, (byte)EnemySkills.Trance, (byte)EnemySkills.Frost }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ICE3, (byte)SpellByte.XXXX, (byte)SpellByte.SLO2, (byte)SpellByte.ICE3, (byte)SpellByte.SLO2, (byte)SpellByte.MUTE, (byte)SpellByte.LOCK, (byte)SpellByte.ICE3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Blizzard, (byte)EnemySkills.Toxic, (byte)EnemySkills.Swirl }, + }, + + new AlternateFiends { + Name = "CHDRNOOK", + SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.UNDEAD, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.LIT2, (byte)SpellByte.LIT, (byte)SpellByte.FOG, (byte)SpellByte.CUR2, (byte)SpellByte.LIT2, (byte)SpellByte.FOG, (byte)SpellByte.LIT2, (byte)SpellByte.LIT }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.LIT3, (byte)SpellByte.FAST, (byte)SpellByte.LIT3, (byte)SpellByte.SLP2, (byte)SpellByte.LIT3, (byte)SpellByte.CUR3, (byte)SpellByte.LIT3, (byte)SpellByte.RUB }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Thunder, (byte)EnemySkills.Squint, (byte)EnemySkills.Glare, (byte)EnemySkills.Thunder }, + }, + + new AlternateFiends { + Name = "CRANE", + SpriteSheet = FormationSpriteSheet.BoneCreepHyenaOgre, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.NONE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.LIT2, (byte)SpellByte.FOG, (byte)SpellByte.LIT2, (byte)SpellByte.INVS, (byte)SpellByte.LIT2, (byte)SpellByte.LIT, (byte)SpellByte.FOG, (byte)SpellByte.LIT }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Trance, (byte)EnemySkills.Gaze, (byte)EnemySkills.Trance, (byte)EnemySkills.Gaze }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FOG2, (byte)SpellByte.LIT3, (byte)SpellByte.WALL, (byte)SpellByte.LIT3, (byte)SpellByte.RUB, (byte)SpellByte.LIT3, (byte)SpellByte.STOP, (byte)SpellByte.LIT3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Dazzle, (byte)EnemySkills.Thunder, (byte)EnemySkills.Toxic, (byte)EnemySkills.Tornado }, + }, + + new AlternateFiends { + Name = "DADALUMA", + SpriteSheet = FormationSpriteSheet.SlimeSpiderManticorAnkylo, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Poison, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.CURE, (byte)SpellByte.FOG, (byte)SpellByte.HEL2, (byte)SpellByte.FOG, (byte)SpellByte.CURE, (byte)SpellByte.INVS, (byte)SpellByte.HEL2, (byte)SpellByte.INVS }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.CUR3, (byte)SpellByte.FAST, (byte)SpellByte.FOG2, (byte)SpellByte.MUTE, (byte)SpellByte.TMPR, (byte)SpellByte.HEL3, (byte)SpellByte.CUR3, (byte)SpellByte.FOG2 }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + + new AlternateFiends { + Name = "DOOMGAZE", + SpriteSheet = FormationSpriteSheet.MummyCoctricWyvernTyro, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.UNDEAD, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE2, (byte)SpellByte.RUB, (byte)SpellByte.FOG, (byte)SpellByte.ICE2, (byte)SpellByte.ZAP, (byte)SpellByte.FOG, (byte)SpellByte.MUTE, (byte)SpellByte.ICE2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Gaze, (byte)EnemySkills.Stare, (byte)EnemySkills.Stare, (byte)EnemySkills.Gaze }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.QAKE, (byte)SpellByte.ICE3, (byte)SpellByte.XXXX, (byte)SpellByte.ZAP, (byte)SpellByte.WALL, (byte)SpellByte.ICE3, (byte)SpellByte.BRAK, (byte)SpellByte.BANE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Toxic, (byte)EnemySkills.Nuclear, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Tornado }, + }, + + new AlternateFiends { + Name = "DULLAHAN", + SpriteSheet = FormationSpriteSheet.ImpWolfIguanaGiant, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.SLEP, (byte)SpellByte.ICE2, (byte)SpellByte.ICE2, (byte)SpellByte.MUTE, (byte)SpellByte.ICE2, (byte)SpellByte.SLOW, (byte)SpellByte.ICE2, (byte)SpellByte.RUB }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Frost, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Frost }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ICE3, (byte)SpellByte.WALL, (byte)SpellByte.FADE, (byte)SpellByte.CUR4, (byte)SpellByte.ICE3, (byte)SpellByte.SLO2, (byte)SpellByte.ICE3, (byte)SpellByte.BRAK }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blizzard, (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Toxic, (byte)EnemySkills.Blizzard }, + }, + + new AlternateFiends { + Name = "E.DRAGON", + SpriteSheet = FormationSpriteSheet.KrakenTiamat, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.QAKE, (byte)SpellByte.LIT2, (byte)SpellByte.XFER, (byte)SpellByte.LIT2, (byte)SpellByte.SLOW, (byte)SpellByte.LIT2, (byte)SpellByte.QAKE, (byte)SpellByte.XFER }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.LIT3, (byte)SpellByte.QAKE, (byte)SpellByte.XXXX, (byte)SpellByte.BANE, (byte)SpellByte.LIT3, (byte)SpellByte.BRAK, (byte)SpellByte.LIT3, (byte)SpellByte.QAKE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Thunder, (byte)EnemySkills.Crack, (byte)EnemySkills.Thunder }, + }, + + new AlternateFiends { + Name = "F.EATER", + SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIRE, (byte)SpellByte.FIR2, (byte)SpellByte.FOG, (byte)SpellByte.FIR2, (byte)SpellByte.HEL2, (byte)SpellByte.FIRE, (byte)SpellByte.FIR2, (byte)SpellByte.FOG }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Heat, (byte)EnemySkills.Heat, (byte)EnemySkills.Cremate, (byte)EnemySkills.Cremate }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.FOG2, (byte)SpellByte.FIR3, (byte)SpellByte.NUKE, (byte)SpellByte.FOG2, (byte)SpellByte.FIR3, (byte)SpellByte.HEL3, (byte)SpellByte.NUKE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Inferno, (byte)EnemySkills.Tornado, (byte)EnemySkills.Inferno, (byte)EnemySkills.Tornado }, + }, + new AlternateFiends { + Name = "FIEND", + SpriteSheet = FormationSpriteSheet.SlimeSpiderManticorAnkylo, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.REGENERATIVE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE, (byte)SpellByte.INVS, (byte)SpellByte.ICE2, (byte)SpellByte.TMPR, (byte)SpellByte.ICE, (byte)SpellByte.FOG, (byte)SpellByte.ICE2, (byte)SpellByte.ICE2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Trance, (byte)EnemySkills.Frost }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ICE3, (byte)SpellByte.FAST, (byte)SpellByte.ICE3, (byte)SpellByte.SABR, (byte)SpellByte.ICE2, (byte)SpellByte.ICE3, (byte)SpellByte.FOG2, (byte)SpellByte.ICE3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blizzard, (byte)EnemySkills.Nuclear, (byte)EnemySkills.Toxic, (byte)EnemySkills.Poison_Damage }, + }, + new AlternateFiends { + Name = "FLANPRIN", + SpriteSheet = FormationSpriteSheet.ImpWolfIguanaGiant, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.NONE, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Trance, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Stare, (byte)EnemySkills.Gaze }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Toxic, (byte)EnemySkills.Glance, (byte)EnemySkills.Squint }, + }, + + new AlternateFiends { + Name = "G.DRAGON", + SpriteSheet = FormationSpriteSheet.MummyCoctricWyvernTyro, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.INVS, (byte)SpellByte.LIT, (byte)SpellByte.LIT2, (byte)SpellByte.SLEP, (byte)SpellByte.LIT2, (byte)SpellByte.LIT2, (byte)SpellByte.STUN, (byte)SpellByte.LIT2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Snorting, (byte)EnemySkills.Trance, (byte)EnemySkills.Flash, (byte)EnemySkills.Stare }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.LIT3, (byte)SpellByte.WALL, (byte)SpellByte.LIT3, (byte)SpellByte.FAST, (byte)SpellByte.LIT3, (byte)SpellByte.XXXX, (byte)SpellByte.LIT3, (byte)SpellByte.CUR3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Thunder, (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Thunder, (byte)EnemySkills.Squint }, + }, + + new AlternateFiends { + Name = "GARGANT", + SpriteSheet = FormationSpriteSheet.BadmanAstosMadponyWarmech, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Poison, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stare, (byte)EnemySkills.Glare, (byte)EnemySkills.Flash, (byte)EnemySkills.Stare }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Toxic, (byte)EnemySkills.Crack, (byte)EnemySkills.Tornado }, + }, + + new AlternateFiends { + Name = "GODDESS", + SpriteSheet = FormationSpriteSheet.SahagPirateSharkBigEye, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.REGENERATIVE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.SLEP, (byte)SpellByte.LIT2, (byte)SpellByte.FOG, (byte)SpellByte.LIT2, (byte)SpellByte.INVS, (byte)SpellByte.LIT2, (byte)SpellByte.SLEP, (byte)SpellByte.LIT2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Dazzle, (byte)EnemySkills.Trance, (byte)EnemySkills.Flash, (byte)EnemySkills.Stare }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.SLP2, (byte)SpellByte.LIT3, (byte)SpellByte.FAST, (byte)SpellByte.LIT3, (byte)SpellByte.BANE, (byte)SpellByte.LIT3, (byte)SpellByte.SLO2, (byte)SpellByte.LOCK }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Toxic, (byte)EnemySkills.Thunder, (byte)EnemySkills.Crack, (byte)EnemySkills.Poison_Stone }, + }, + +new AlternateFiends { + Name = "H.DRAGON", + SpriteSheet = FormationSpriteSheet.MummyCoctricWyvernTyro, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FADE, (byte)SpellByte.XFER, (byte)SpellByte.FAST, (byte)SpellByte.XFER, (byte)SpellByte.FADE, (byte)SpellByte.SLO2, (byte)SpellByte.MUTE, (byte)SpellByte.SLP2 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Trance, (byte)EnemySkills.Squint, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Tornado }, + }, + +new AlternateFiends { + Name = "H.RIDER", + SpriteSheet = FormationSpriteSheet.AspLobsterBullTroll, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Time, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Glance, (byte)EnemySkills.Stinger, (byte)EnemySkills.Glance }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Nuclear, (byte)EnemySkills.Squint, (byte)EnemySkills.Toxic }, + }, + +new AlternateFiends { + Name = "I.DRAGON", + SpriteSheet = FormationSpriteSheet.ImpWolfIguanaGiant, + FormationPattern = FormationPattern.Small9, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE2, (byte)SpellByte.STUN, (byte)SpellByte.ICE2, (byte)SpellByte.HOLD, (byte)SpellByte.ICE2, (byte)SpellByte.STUN, (byte)SpellByte.ICE2, (byte)SpellByte.HOLD }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ICE3, (byte)SpellByte.STOP, (byte)SpellByte.ICE3, (byte)SpellByte.XFER, (byte)SpellByte.ICE3, (byte)SpellByte.STOP, (byte)SpellByte.ICE3, (byte)SpellByte.SLOW }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blizzard, (byte)EnemySkills.Trance, (byte)EnemySkills.Frost, (byte)EnemySkills.Blizzard }, + }, + +new AlternateFiends { + Name = "IPOOH", + SpriteSheet = FormationSpriteSheet.VampGargoyleEarthDragon1, + FormationPattern = FormationPattern.Mixed, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.NONE, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + +new AlternateFiends { + Name = "K.BEHEM", + SpriteSheet = FormationSpriteSheet.KrakenTiamat, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.REGENERATIVE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE, (byte)SpellByte.FOG, (byte)SpellByte.ICE2, (byte)SpellByte.ICE2, (byte)SpellByte.SLOW, (byte)SpellByte.SLEP, (byte)SpellByte.ICE2, (byte)SpellByte.ICE2 }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ICE3, (byte)SpellByte.FAST, (byte)SpellByte.FADE, (byte)SpellByte.SLO2, (byte)SpellByte.ICE3, (byte)SpellByte.FOG, (byte)SpellByte.FADE, (byte)SpellByte.FAST }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Nuclear, (byte)EnemySkills.Blizzard, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Squint }, + }, + +new AlternateFiends { + Name = "K.DRAGON", + SpriteSheet = FormationSpriteSheet.WizardGarlandDragon2Golem, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE2, (byte)SpellByte.FIR2, (byte)SpellByte.SLOW, (byte)SpellByte.INVS, (byte)SpellByte.LIT2, (byte)SpellByte.RUB, (byte)SpellByte.ICE2, (byte)SpellByte.FIR2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Dazzle, (byte)EnemySkills.Cremate, (byte)EnemySkills.Frost, (byte)EnemySkills.Stare }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.NUKE, (byte)SpellByte.XXXX, (byte)SpellByte.FAST, (byte)SpellByte.FIR3, (byte)SpellByte.LIT3, (byte)SpellByte.FOG2, (byte)SpellByte.SABR, (byte)SpellByte.BANE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Inferno, (byte)EnemySkills.Thunder, (byte)EnemySkills.Toxic, (byte)EnemySkills.Crack }, + }, + +new AlternateFiends { + Name = "KATNSOUL", + SpriteSheet = FormationSpriteSheet.AspLobsterBullTroll, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Poison, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Cremate, (byte)EnemySkills.Stare, (byte)EnemySkills.Squint }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Inferno, (byte)EnemySkills.Thunder, (byte)EnemySkills.Blizzard, (byte)EnemySkills.Tornado }, + }, + +new AlternateFiends { + Name = "KEFKA", + SpriteSheet = FormationSpriteSheet.KrakenTiamat, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.SLOW, (byte)SpellByte.ICE2, (byte)SpellByte.INVS, (byte)SpellByte.FIR2, (byte)SpellByte.LIT2, (byte)SpellByte.RUB, (byte)SpellByte.CUR2, (byte)SpellByte.ZAP }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Frost, (byte)EnemySkills.Cremate, (byte)EnemySkills.Trance }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.LIT3, (byte)SpellByte.SLO2, (byte)SpellByte.FOG, (byte)SpellByte.NUKE, (byte)SpellByte.XXXX, (byte)SpellByte.XFER, (byte)SpellByte.ICE3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Tornado, (byte)EnemySkills.Swirl, (byte)EnemySkills.Crack, (byte)EnemySkills.Poison_Damage }, + }, + +new AlternateFiends { + Name = "M.MASTER", + SpriteSheet = FormationSpriteSheet.SlimeSpiderManticorAnkylo, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.MAGE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE2, (byte)SpellByte.FIR2, (byte)SpellByte.LIT2, (byte)SpellByte.MUTE, (byte)SpellByte.RUB, (byte)SpellByte.MUTE, (byte)SpellByte.HOLD, (byte)SpellByte.ZAP }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.NUKE, (byte)SpellByte.XXXX, (byte)SpellByte.MUTE, (byte)SpellByte.ICE3, (byte)SpellByte.SLO2, (byte)SpellByte.INVS, (byte)SpellByte.LIT3, (byte)SpellByte.BRAK }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + +new AlternateFiends { + Name = "NERAPA", + SpriteSheet = FormationSpriteSheet.BadmanAstosMadponyWarmech, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.RUB, (byte)SpellByte.ALIT, (byte)SpellByte.FIR2, (byte)SpellByte.SLOW, (byte)SpellByte.FIR2, (byte)SpellByte.SLEP, (byte)SpellByte.FIR2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Heat, (byte)EnemySkills.Frost, (byte)EnemySkills.Trance, (byte)EnemySkills.Ink }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FAST, (byte)SpellByte.FIR3, (byte)SpellByte.SLO2, (byte)SpellByte.FIR3, (byte)SpellByte.XXXX, (byte)SpellByte.SLP2, (byte)SpellByte.FIR3, (byte)SpellByte.BRAK }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Cremate, (byte)EnemySkills.Inferno, (byte)EnemySkills.Inferno, (byte)EnemySkills.Glance }, + }, + +new AlternateFiends { + Name = "NO128", + SpriteSheet = FormationSpriteSheet.SahagPirateSharkBigEye, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.WERE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.HOLD, (byte)SpellByte.ICE2, (byte)SpellByte.FAST, (byte)SpellByte.ICE2, (byte)SpellByte.CUR2, (byte)SpellByte.ICE2, (byte)SpellByte.BRAK, (byte)SpellByte.ICE2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Ink, (byte)EnemySkills.Trance, (byte)EnemySkills.Frost }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.INVS, (byte)SpellByte.ICE3, (byte)SpellByte.STOP, (byte)SpellByte.ICE3, (byte)SpellByte.STUN, (byte)SpellByte.ICE3, (byte)SpellByte.FAST, (byte)SpellByte.BANE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blaze, (byte)EnemySkills.Tornado, (byte)EnemySkills.Crack, (byte)EnemySkills.Toxic }, + }, + +new AlternateFiends { + Name = "P.TRAIN", + SpriteSheet = FormationSpriteSheet.KaryLich, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.UNDEAD, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.SLEP, (byte)SpellByte.HOLD, (byte)SpellByte.STUN, (byte)SpellByte.TMPR, (byte)SpellByte.SLOW, (byte)SpellByte.SLEP, (byte)SpellByte.STUN, (byte)SpellByte.DARK }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Trance, (byte)EnemySkills.Frost, (byte)EnemySkills.Frost }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.STOP, (byte)SpellByte.SLO2, (byte)SpellByte.SLP2, (byte)SpellByte.FAST, (byte)SpellByte.SABR, (byte)SpellByte.ZAP, (byte)SpellByte.XXXX, (byte)SpellByte.STOP }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Tornado, (byte)EnemySkills.Swirl, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Poison_Damage }, + }, + +new AlternateFiends { + Name = "PHUNBABA", + SpriteSheet = FormationSpriteSheet.AspLobsterBullTroll, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Poison, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.LIT2, (byte)SpellByte.LIT2, (byte)SpellByte.HOLD, (byte)SpellByte.LIT2, (byte)SpellByte.SLOW, (byte)SpellByte.LOCK, (byte)SpellByte.LIT2, (byte)SpellByte.LIT2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stare, (byte)EnemySkills.Gaze, (byte)EnemySkills.Trance, (byte)EnemySkills.Stinger }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.LIT3, (byte)SpellByte.FAST, (byte)SpellByte.TMPR, (byte)SpellByte.LIT3, (byte)SpellByte.TMPR, (byte)SpellByte.LIT3, (byte)SpellByte.SLO2, (byte)SpellByte.SLP2 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Squint, (byte)EnemySkills.Tornado, (byte)EnemySkills.Swirl, (byte)EnemySkills.Toxic }, + }, + +new AlternateFiends { + Name = "POLTRGST", + SpriteSheet = FormationSpriteSheet.MedusaCatmanPedeTiger, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Poison, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FOG, (byte)SpellByte.FIR2, (byte)SpellByte.FOG, (byte)SpellByte.FIR2, (byte)SpellByte.ZAP, (byte)SpellByte.FIR2, (byte)SpellByte.STUN, (byte)SpellByte.HOLD }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Heat, (byte)EnemySkills.Cremate, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Gaze }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FOG2, (byte)SpellByte.BANE, (byte)SpellByte.FIR3, (byte)SpellByte.FIR3, (byte)SpellByte.BRAK, (byte)SpellByte.STOP, (byte)SpellByte.SLP2, (byte)SpellByte.FIR3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blaze, (byte)EnemySkills.Inferno, (byte)EnemySkills.Toxic, (byte)EnemySkills.Tornado }, + }, + +new AlternateFiends { + Name = "R.DRAGON", + SpriteSheet = FormationSpriteSheet.MummyCoctricWyvernTyro, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIRE, (byte)SpellByte.FIR2, (byte)SpellByte.FOG, (byte)SpellByte.MUTE, (byte)SpellByte.FIR2, (byte)SpellByte.FIR2, (byte)SpellByte.SLOW, (byte)SpellByte.FIR2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Heat, (byte)EnemySkills.Cremate, (byte)EnemySkills.Heat, (byte)EnemySkills.Cremate }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.NUKE, (byte)SpellByte.XXXX, (byte)SpellByte.FIR3, (byte)SpellByte.FAST, (byte)SpellByte.FIR3, (byte)SpellByte.SLO2, (byte)SpellByte.XFER }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Inferno, (byte)EnemySkills.Blaze, (byte)EnemySkills.Squint, (byte)EnemySkills.Toxic }, + }, + +new AlternateFiends { + Name = "RIZOPAS", + SpriteSheet = FormationSpriteSheet.ImpWolfIguanaGiant, + FormationPattern = FormationPattern.Small9, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.AQUATIC, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE, (byte)SpellByte.ICE2, (byte)SpellByte.LIT2, (byte)SpellByte.INVS, (byte)SpellByte.ICE2, (byte)SpellByte.SLOW, (byte)SpellByte.LOCK, (byte)SpellByte.LIT2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Trance, (byte)EnemySkills.Stinger, (byte)EnemySkills.Dazzle }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ICE3, (byte)SpellByte.SABR, (byte)SpellByte.LIT3, (byte)SpellByte.SLO2, (byte)SpellByte.ICE3, (byte)SpellByte.XFER, (byte)SpellByte.XXXX, (byte)SpellByte.ICE3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Thunder, (byte)EnemySkills.Blizzard, (byte)EnemySkills.Swirl, (byte)EnemySkills.Stinger }, + }, + +new AlternateFiends { + Name = "SKDRAGON", + SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.UNDEAD, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.XFER, (byte)SpellByte.SLOW, (byte)SpellByte.BANE, (byte)SpellByte.DARK, (byte)SpellByte.BRAK, (byte)SpellByte.XFER, (byte)SpellByte.SLOW, (byte)SpellByte.RUB }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.XXXX, (byte)SpellByte.BANE, (byte)SpellByte.BRAK, (byte)SpellByte.QAKE, (byte)SpellByte.XFER, (byte)SpellByte.RUB, (byte)SpellByte.BANE, (byte)SpellByte.BRAK }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Toxic, (byte)EnemySkills.Squint, (byte)EnemySkills.Glance }, + }, + +new AlternateFiends { + Name = "STDRAGON", + SpriteSheet = FormationSpriteSheet.BadmanAstosMadponyWarmech, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.DRAGON, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Trance, (byte)EnemySkills.Crack, (byte)EnemySkills.Stare, (byte)EnemySkills.Stare }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FAST, (byte)SpellByte.CUR4, (byte)SpellByte.LOK2, (byte)SpellByte.MUTE, (byte)SpellByte.SLO2, (byte)SpellByte.STOP, (byte)SpellByte.TMPR, (byte)SpellByte.FOG2 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Tornado, (byte)EnemySkills.Swirl, (byte)EnemySkills.Tornado, (byte)EnemySkills.Gaze }, + }, + +new AlternateFiends { + Name = "T.ARMOR", + SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.REGENERATIVE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.ICE2, (byte)SpellByte.LIT2, (byte)SpellByte.BRAK, (byte)SpellByte.FIR2, (byte)SpellByte.ICE2, (byte)SpellByte.LIT2, (byte)SpellByte.BRAK }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Ink, (byte)EnemySkills.Cremate, (byte)EnemySkills.Frost }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.BANE, (byte)SpellByte.ICE3, (byte)SpellByte.LIT3, (byte)SpellByte.BRAK, (byte)SpellByte.ICE3, (byte)SpellByte.FIR3, (byte)SpellByte.LIT3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Toxic, (byte)EnemySkills.Inferno }, + }, + +new AlternateFiends { + Name = "TENTACLE", + SpriteSheet = FormationSpriteSheet.KrakenTiamat, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Earth, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Stinger, (byte)EnemySkills.Dazzle, (byte)EnemySkills.Trance, (byte)EnemySkills.Gaze }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.STOP, (byte)SpellByte.BANE, (byte)SpellByte.STUN, (byte)SpellByte.SLO2, (byte)SpellByte.HOLD, (byte)SpellByte.BRAK, (byte)SpellByte.STOP, (byte)SpellByte.BANE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Toxic, (byte)EnemySkills.Squint, (byte)EnemySkills.Glare, (byte)EnemySkills.Poison_Damage }, + }, + + +new AlternateFiends { + Name = "TONBERRY", + SpriteSheet = FormationSpriteSheet.ImpWolfIguanaGiant, + FormationPattern = FormationPattern.Small9, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.NONE, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FAST, (byte)SpellByte.SABR, (byte)SpellByte.FOG, (byte)SpellByte.SLP2, (byte)SpellByte.TMPR, (byte)SpellByte.STOP, (byte)SpellByte.SLO2, (byte)SpellByte.SABR }, + SkillChance2 = 0x00, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + +new AlternateFiends { + Name = "TRITOCH", + SpriteSheet = FormationSpriteSheet.CaribeGatorOchoHydra, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE2, (byte)SpellByte.MUTE, (byte)SpellByte.ICE2, (byte)SpellByte.STUN, (byte)SpellByte.ICE2, (byte)SpellByte.MUTE, (byte)SpellByte.ICE2, (byte)SpellByte.SLOW }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Frost, (byte)EnemySkills.Stare, (byte)EnemySkills.Trance }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ICE3, (byte)SpellByte.SLO2, (byte)SpellByte.ICE3, (byte)SpellByte.CUR3, (byte)SpellByte.ICE3, (byte)SpellByte.QAKE, (byte)SpellByte.ICE3, (byte)SpellByte.SLP2 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blizzard, (byte)EnemySkills.Squint, (byte)EnemySkills.Blizzard, (byte)EnemySkills.Crack }, + }, + +new AlternateFiends { + Name = "TYPHON", + SpriteSheet = FormationSpriteSheet.VampGargoyleEarthDragon1, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIR2, (byte)SpellByte.STUN, (byte)SpellByte.FIR2, (byte)SpellByte.SLOW, (byte)SpellByte.FIR2, (byte)SpellByte.INVS, (byte)SpellByte.DARK, (byte)SpellByte.FIR2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Heat, (byte)EnemySkills.Cremate, (byte)EnemySkills.Stinger, (byte)EnemySkills.Gaze }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FIR3, (byte)SpellByte.STOP, (byte)SpellByte.FIR3, (byte)SpellByte.NUKE, (byte)SpellByte.SLO2, (byte)SpellByte.FIR3, (byte)SpellByte.STOP, (byte)SpellByte.SLO2 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Inferno, (byte)EnemySkills.Tornado, (byte)EnemySkills.Blaze, (byte)EnemySkills.Squint }, + }, + +new AlternateFiends { + Name = "ULTROS", + SpriteSheet = FormationSpriteSheet.WizardGarlandDragon2Golem, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.REGENERATIVE, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Ink, (byte)EnemySkills.Ink, (byte)EnemySkills.Trance, (byte)EnemySkills.Ink }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FAST, (byte)SpellByte.ICE3, (byte)SpellByte.BRAK, (byte)SpellByte.LIT3, (byte)SpellByte.WALL, (byte)SpellByte.FIR3, (byte)SpellByte.FOG, (byte)SpellByte.LIT3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Crack, (byte)EnemySkills.Swirl, (byte)EnemySkills.Ink, (byte)EnemySkills.Swirl }, + }, + +new AlternateFiends { + Name = "VARGAS", + SpriteSheet = FormationSpriteSheet.SlimeSpiderManticorAnkylo, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Poison, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Tornado, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Toxic, (byte)EnemySkills.Tornado }, + }, + +new AlternateFiends { + Name = "WELK", + SpriteSheet = FormationSpriteSheet.MedusaCatmanPedeTiger, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.SLOW, (byte)SpellByte.LIT, (byte)SpellByte.SLOW, (byte)SpellByte.LIT2, (byte)SpellByte.FOG, (byte)SpellByte.LIT2, (byte)SpellByte.INVS, (byte)SpellByte.LIT2 }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.LIT3, (byte)SpellByte.SLO2, (byte)SpellByte.LIT3, (byte)SpellByte.FOG2, (byte)SpellByte.WALL, (byte)SpellByte.LIT3, (byte)SpellByte.CUR3, (byte)SpellByte.LIT3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Thunder, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Glance, (byte)EnemySkills.Thunder }, + }, +new AlternateFiends { + Name = "WREXSOUL", + SpriteSheet = FormationSpriteSheet.MummyCoctricWyvernTyro, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite1, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.UNDEAD, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.LIT, (byte)SpellByte.LIT2, (byte)SpellByte.RUB, (byte)SpellByte.LIT2, (byte)SpellByte.STUN, (byte)SpellByte.DARK, (byte)SpellByte.LIT2, (byte)SpellByte.LIT2 }, + SkillChance1 = 0x00, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.LIT3, (byte)SpellByte.XXXX, (byte)SpellByte.SLO2, (byte)SpellByte.LIT3, (byte)SpellByte.BANE, (byte)SpellByte.XXXX, (byte)SpellByte.LIT3, (byte)SpellByte.ZAP }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Thunder, (byte)EnemySkills.Toxic, (byte)EnemySkills.Crack, (byte)EnemySkills.Blaze }, + }, + +new AlternateFiends { + Name = "YETI", + SpriteSheet = FormationSpriteSheet.MummyCoctricWyvernTyro, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.ICE2, (byte)SpellByte.CUR2, (byte)SpellByte.ICE2, (byte)SpellByte.TMPR, (byte)SpellByte.CUR2, (byte)SpellByte.ICE2, (byte)SpellByte.ICE2, (byte)SpellByte.TMPR }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Frost, (byte)EnemySkills.Frost, (byte)EnemySkills.Frost, (byte)EnemySkills.Stare }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.ICE3, (byte)SpellByte.CUR4, (byte)SpellByte.FAST, (byte)SpellByte.ICE3, (byte)SpellByte.SABR, (byte)SpellByte.ICE3, (byte)SpellByte.TMPR, (byte)SpellByte.ICE3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Blizzard, (byte)EnemySkills.Blizzard, (byte)EnemySkills.Glance, (byte)EnemySkills.Crack }, + }, + +new AlternateFiends { + Name = "ZIGFRIED", + SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x3A, + Palette2 = 0x3A, + ElementalWeakness = SpellElement.Fire, + MonsterType = MonsterType.GIANT, + SpellChance1 = 0x00, + Spells1 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + SpellChance2 = 0x00, + Spells2 = new List { (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE, (byte)SpellByte.NONE }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None, (byte)EnemySkills.None }, + }, + + }; + var FF1AltFiendsListHardcore = new List + { + + }; + + var alternateFiendsList = new List + { + + + }; + if ((bool)flags.FinalFantasy2Fiends /*&& (bool)!flags.HardcoreAltFiends*/) + + { + alternateFiendsList.AddRange(FF2AltFiendslist); + } + + if ((bool)flags.FinalFantasy3Fiends /*&& (bool)!flags.HardcoreAltFiends*/) + + { + alternateFiendsList.AddRange(FF3AltFiendslist); + } + + if ((bool)flags.FinalFantasy4Fiends /*&& (bool)!flags.HardcoreAltFiends*/) + + { + alternateFiendsList.AddRange(FF4AltFiendsList); + } + + if ((bool)flags.FinalFantasy5Fiends /*&& (bool)!flags.HardcoreAltFiends*/) + + { + alternateFiendsList.AddRange(FF5AltFiendsList); + } + + if ((bool)flags.FinalFantasy6Fiends /*&& (bool)!flags.HardcoreAltFiends*/) + + { + alternateFiendsList.AddRange(FF6AltFiendsList); + } + + if ((bool)flags.FinalFantasy1BonusFiends /*&& (bool)!flags.HardcoreAltFiends*/) + { + alternateFiendsList.AddRange(FF1BonusFiendsList); + } + + if ((bool)flags.WinnerCircleFiends /*&& (bool)!flags.HardcoreAltFiends*/) + { + alternateFiendsList.AddRange(WinnerCirleFiendsList); } - if ((bool)flags.BlackOrbFiends) + if ((bool)flags.BlackOrbFiends) { alternateFiendsList.AddRange(extAltFiends.BlackOrbAltFiends); } - if ((bool)!flags.FinalFantasy2Fiends && (bool)!flags.FinalFantasy3Fiends && (bool)!flags.FinalFantasy4Fiends && (bool)!flags.FinalFantasy5Fiends && (bool)!flags.FinalFantasy6Fiends && (bool)!flags.FinalFantasy1BonusFiends && (bool)!flags.BlackOrbFiends) + if ((bool)!flags.FinalFantasy2Fiends && (bool)!flags.FinalFantasy3Fiends && (bool)!flags.FinalFantasy4Fiends && (bool)!flags.FinalFantasy5Fiends && (bool)!flags.FinalFantasy6Fiends && (bool)!flags.FinalFantasy1BonusFiends && (bool)!flags.WinnerCircleFiends && (bool)!flags.BlackOrbFiends) { alternateFiendsList.AddRange(FF1MasterFiendList); } diff --git a/FF1Lib/AltFiendsExt.cs b/FF1Lib/AltFiendsExt.cs index c00b44a5b..d7f064c14 100644 --- a/FF1Lib/AltFiendsExt.cs +++ b/FF1Lib/AltFiendsExt.cs @@ -49,7 +49,8 @@ public ExtAltFiends(Flags flags) (bool)flags.FinalFantasy3Fiends || (bool)flags.FinalFantasy4Fiends || (bool)flags.FinalFantasy5Fiends || - (bool)flags.FinalFantasy6Fiends; + (bool)flags.FinalFantasy6Fiends || + (bool)flags.WinnerCircleFiends; if (!NormalAltFiends && (bool)flags.BlackOrbFiends) { diff --git a/FF1Lib/BankUsageRegister.md b/FF1Lib/BankUsageRegister.md new file mode 100644 index 000000000..5375da2d3 --- /dev/null +++ b/FF1Lib/BankUsageRegister.md @@ -0,0 +1,97 @@ +; Bank Usage - Last Update 2024-12-23 +; Whenever a feature adds code to the rom, this table must be updated. +; Doesn't include the new features placed at the freed space at 0B and 0E. This is already a mess and no feature should be written there if possible. +; NOTE This list was done retroactively, so some ranges might be missing. +; +; ~ = No upper range is enforced in the code, data could potentially overlap other used ranges. +; ! = Potential bug, to correct + + +Bank Offset Range Description +----------------------------- +; Freed (write only after SM have been read) +04 8000-FFFF Unused +05 8000-FFFF Unused +06 8000-FFFF Unused + +; Freed (write only after data has been moved to 1F) +0F 8000-8B35 Stats Tracking code +0F 9000-93CD Stats Tracking code +0F 8AD0-8AE3 Castable Items targeting +0F 8B40-8C06 Nones code +0F 8D00-8D53 Autosort +0F 9100-91AC Progressive Scaling +0F B000-B300 Expanded Teleporter tables + +10 8000-FFFF Dialogues (whole bank is reserved) + +11 8000-81A0 NPC Objects talk table +11 ~8200-85C6 [NO MAX SET] Talk Routines +11 8EA0-9000 Monster In A Box +11 902B-9915 Moving NPC talk routines +11 95C8-95D4 Random promotions [modify DoClassChanges, which was moved with NPC Talk Routines] +11 99A0-9CE3 Shop Upgrade Text routines +11 9DF0-9DFC Promotion table +11 9F10-9F19 GiveItem talk routine +11 !A000-ADA7 Shop Upgrade text [Max Set at $B400, potential overlaps] +11 B120-B1AF Extra talk routines +11 B400-B519 Treasure Stacks +11 B600-B700 Incentive Chests Item Fanfare LUT +11 B700-B831 Shop Upgrade routines +11 B900-B922 Open chests in order +11 B940-B9FF Chests appear opened +11 BA00-BEE0 NPC Objects data + +12 8000-8800 Tileset copy +12 8A00-8C40 New Icons +12 8E00-9000 Font Tileset +12 9000-9038 New Icons routines + +14 8000-FFFF Standard Maps (moved from 04, 05, 06 for extra space) +15 8000-FFFF Standard Maps +16 8000-FFFF Standard Maps +17 8000-FFFF Standard Maps + +19 8000-8F90 QuickMiniMap map + +1A 84FB-84FE Repeated Heal Potions +1A 8600-8852 Repeated Heal Potions + +1B 8000-8FF5 Moving routines from bank 0B to 1B (Xp, levelup) +1B 8FF5-90E8 Save on Death +1B 9100-91AC Random Promotion +1B 9300-9369 Thief Lockpicking +1B 9400-9470 LoadPlayerIBStats moved +1B 9500-9535 AltClass XP +1B 9535-9814 Class Level Requirement tables +1B 9830-987B Gain MP on MP Up +1B 9900-9A11 SetRng +1B A000-A0DB AirBoat +1B AF80-AF94 BB Absorb bugfix +1B B800-B8C3 Start Game/Start Battle Blursings routines + +1C A010-A165 ExtConsumables Drink box +1C A1C0-A1EF AutoRetargeting +1C A200-A246 White Mage Harm Everyone +1C A250-A275 AutoRetargeting +1C A290-A4B7 Int Affect Spells +1C A4F0-A50E Stats Tracking +1C A600-A648 Spell Reordering +1C A670-A724 Poison Mode routines + +1D ~8000-B9A0 [NO MAX SET] Music Tracks +1D B9A0-B9F8 Moved Music Engine +1D BA00-BFC9 Moved Music Engine +1D C682-C691 Moved Music Engine + +1E 8000-85B0 Moving routines from bank 0E to 1E (PartyGen and menu stuff) +1E 85B0-85C1 Parry Permissions table +1E 8680-86A7 New Icons routine +1E 86E0-B9F1 Encounter Table True PRNG +1E 8800-8933 Class Info Window +1E ~8970-8AF6 [NO MAX SET] Info Window Content +1E B100-B21C Damage Tiles Kill +1E BA00-BC0D Screen Tracking code +1E BCC0-BCC4 Archipelago + +1F 8000-FFFF Moving Bank 0F to 1F for MMC3 expansion diff --git a/FF1Lib/BugFixes.cs b/FF1Lib/BugFixes.cs index 598e2dd78..9521985be 100644 --- a/FF1Lib/BugFixes.cs +++ b/FF1Lib/BugFixes.cs @@ -61,7 +61,7 @@ public void FixHouse(bool MPfix, bool HPfix) if (HPfix) { - Put(0x03b2c8, Blob.FromHex("20D2AB2000B4")); + Put(0x03B2C8, Blob.FromHex("20D2AB2000B4")); } } diff --git a/FF1Lib/Classes/ClassesBalances.cs b/FF1Lib/Classes/ClassesBalances.cs index 48c425de5..dd6d62811 100644 --- a/FF1Lib/Classes/ClassesBalances.cs +++ b/FF1Lib/Classes/ClassesBalances.cs @@ -33,6 +33,42 @@ public enum ThiefAGI [Description("120")] Agi120 = 3 } + + public enum ThiefHit + { + [Description("1 (Useless)")] + HitUseless = 1, + + [Description("2 (Vanilla)")] + Vanilla = 2, + + [Description("3 (Moderate)")] + HitBalanced = 3, + + [Description("4 (Double)")] + HitDouble = 4, + + [Description("5 (Ridiculous)")] + HitEverything = 5, + } + + public enum RedMageHit + { + [Description("1 (Useless)")] + HitUseless = 1, + + [Description("2 (Vanilla)")] + Vanilla = 2, + + [Description("3 (Moderate)")] + HitBalanced = 3, + + [Description("4 (Double)")] + HitDouble = 4, + + [Description("5 (Ridiculous)")] + HitEverything = 5, + } public enum ThiefOptions { [Description("None")] diff --git a/FF1Lib/Classes/ClassesData.cs b/FF1Lib/Classes/ClassesData.cs index fa5c5a4a9..2eaf498ae 100644 --- a/FF1Lib/Classes/ClassesData.cs +++ b/FF1Lib/Classes/ClassesData.cs @@ -231,13 +231,28 @@ public ClassData this[Classes index] } public void RaiseThiefHitRate(Flags flags) { - if (!(bool)flags.ThiefHitRate) + if ((int)flags.ThiefHitBuff == (int)ThiefHit.Vanilla) { return; } - _classes[(int)Classes.Thief].HitGrowth = 4; - _classes[(int)Classes.Ninja].HitGrowth = 4; + int hits = (int)flags.ThiefHitBuff; + + _classes[(int)Classes.Thief].HitGrowth = (byte)hits; + _classes[(int)Classes.Ninja].HitGrowth = (byte)hits; + } + + public void RaiseRedMageHitRate(Flags flags) + { + if ((int)flags.RedMageHitBuff == (int)RedMageHit.Vanilla) + { + return; + } + + int hits = (int)flags.RedMageHitBuff; + + _classes[(int)Classes.RedMage].HitGrowth = (byte)hits; + _classes[(int)Classes.RedWizard].HitGrowth = (byte)hits; } public void BuffThiefAGI(Flags flags) { diff --git a/FF1Lib/Credits.cs b/FF1Lib/Credits.cs index 49639bd9d..e4db73cb2 100644 --- a/FF1Lib/Credits.cs +++ b/FF1Lib/Credits.cs @@ -237,7 +237,7 @@ public partial class FF1Rom : NesRom "", " artea", " drcatdoctor", - " leggystarscream", + " xxxxxxxxxxxxxxx", " nic0lette", " splitpunched", " onefineday", diff --git a/FF1Lib/Data/DomainData.cs b/FF1Lib/Data/DomainData.cs deleted file mode 100644 index 06ee4171c..000000000 --- a/FF1Lib/Data/DomainData.cs +++ /dev/null @@ -1,33 +0,0 @@ -namespace FF1Lib -{ - public unsafe struct Domain - { - private fixed byte Formations[8]; - - public byte this[int i] - { - get { return Formations[i]; } - set { Formations[i] = value; } - } - - public byte this[byte i] - { - get { return Formations[i]; } - set { Formations[i] = value; } - } - } - - public class DomainData : MemTable - { - public DomainData(FF1Rom _rom) : base(_rom, 0x2C000, 128) - { - } - - public void SwapDomains(int from, int to) - { - var tmp = Data[to]; - Data[to] = Data[from]; - Data[from] = tmp; - } - } -} diff --git a/FF1Lib/Dialogues.cs b/FF1Lib/Dialogues.cs index 6332aca13..eda6df55d 100644 --- a/FF1Lib/Dialogues.cs +++ b/FF1Lib/Dialogues.cs @@ -302,11 +302,34 @@ public void InsertDialogues(Dictionary dialogsdict) dialogues[d.Key] = d.Value; } } - public void UpdateNPCDialogues(Flags flags) + public void TombstoneDialogue(MT19337 rng) + { + // Epitaphs for deceased members of the FFR community + List epitaphs = new() + { + " You stand now on the\n shoulders of Disch,\n a titan of\n Final Fantasy\n development", // 2020-06-03 + " --Monoci85--\nSage, Mentor, and Friend\n In recaps, he lives on.\n Rest well, Buzzsaw\n 'Mono, recap!'", // 2021-05-15 + " For HaateXIII,\n Your Voice Will\n be Missed\n Car-Bo-Nate" // 2025-02-13 + }; + + string epitaph = epitaphs.PickRandom(rng); + + // Most recent epitaph has a ~2 weeks priority, update as appropriate + if (DateTime.Today < new DateTime(2025, 03, 01)) + { + epitaph = epitaphs.Last(); + } + + dialogues[0x12B] = epitaph; + } + + public void UpdateNPCDialogues(Flags flags, MT19337 rng) { // Update treasure box dialog for new DrawDialogueString routine dialogues[0xF0 + 0x50] = "In the treasure box,\nyou found..\n#"; + TombstoneDialogue(rng); + // Remove reference to "Cave of Marsh" from Astos dialog, unless Crown/Crystal not shuffled // We do this before returning from Lich's Revenge since that flag modify all other dialogues, but not astos' if (flags.IncentivizeFetchNPCs != false || flags.ChestsKeyItems != false) diff --git a/FF1Lib/Enemies.cs b/FF1Lib/Enemies.cs index 3aed126b1..ebf6c8206 100644 --- a/FF1Lib/Enemies.cs +++ b/FF1Lib/Enemies.cs @@ -1,5 +1,6 @@ using System.Collections; using System.ComponentModel; +using System.ComponentModel.Design; using System.Diagnostics.SymbolStore; using System.Security.Cryptography.X509Certificates; using FF1Lib.Helpers; @@ -164,6 +165,8 @@ public void ShuffleEnemyScripts(MT19337 rng, Flags flags) bool allowUnsafePirates = (bool)flags.AllowUnsafePirates; bool excludeImps = (bool)flags.EnemySkillsSpellsTiered; bool RemoveBossScripts = (bool)flags.RemoveBossScripts; + bool OverworldFiendsOnly = (bool)flags.OverworldFiendsOnly; + bool TempleOfFiendRefightsOnly = (bool)flags.TempleOfFiendRefightsOnly; ScriptTouchMultiplier scriptMultiplier = flags.ScriptMultiplier; if (!shuffleNormalEnemies && !shuffleBosses) @@ -236,7 +239,7 @@ public void ShuffleEnemyScripts(MT19337 rng, Flags flags) } - if (shuffleBosses) + if (shuffleBosses && !OverworldFiendsOnly && !TempleOfFiendRefightsOnly) { var oldBosses = new List { @@ -269,7 +272,9 @@ public void ShuffleEnemyScripts(MT19337 rng, Flags flags) newEnemies[Enemy.Kraken2][EnemyStat.Scripts] = oldBigBosses[3][EnemyStat.Scripts]; newEnemies[Enemy.Tiamat2][EnemyStat.Scripts] = oldBigBosses[4][EnemyStat.Scripts]; newEnemies[Enemy.Chaos][EnemyStat.Scripts] = oldBigBosses[5][EnemyStat.Scripts]; - } + + } + if (RemoveBossScripts) { @@ -305,6 +310,40 @@ public void ShuffleEnemyScripts(MT19337 rng, Flags flags) } + if (shuffleBosses && OverworldFiendsOnly) + { + var outsidefiends = new List + { + oldEnemies[Enemy.Lich], + oldEnemies[Enemy.Kary], + oldEnemies[Enemy.Kraken], + oldEnemies[Enemy.Tiamat] + }; + outsidefiends.Shuffle(rng); + + newEnemies[Enemy.Lich][EnemyStat.Scripts] = outsidefiends[0][EnemyStat.Scripts]; + newEnemies[Enemy.Kary][EnemyStat.Scripts] = outsidefiends[1][EnemyStat.Scripts]; + newEnemies[Enemy.Kraken][EnemyStat.Scripts] = outsidefiends[2][EnemyStat.Scripts]; + newEnemies[Enemy.Tiamat][EnemyStat.Scripts] = outsidefiends[3][EnemyStat.Scripts]; + } + + if(shuffleBosses && TempleOfFiendRefightsOnly) + { + var insidefiends = new List + { + oldEnemies[Enemy.Lich2], + oldEnemies[Enemy.Kary2], + oldEnemies[Enemy.Kraken2], + oldEnemies[Enemy.Tiamat2] + }; + insidefiends.Shuffle(rng); + + newEnemies[Enemy.Lich2][EnemyStat.Scripts] = insidefiends[0][EnemyStat.Scripts]; + newEnemies[Enemy.Kary2][EnemyStat.Scripts] = insidefiends[1][EnemyStat.Scripts]; + newEnemies[Enemy.Kraken2][EnemyStat.Scripts] = insidefiends[2][EnemyStat.Scripts]; + newEnemies[Enemy.Tiamat2][EnemyStat.Scripts] = insidefiends[3][EnemyStat.Scripts]; + } + Put(EnemyOffset, newEnemies.SelectMany(enemy => enemy.ToBytes()).ToArray()); } diff --git a/FF1Lib/EnemyScripts.cs b/FF1Lib/EnemyScripts.cs index 55f6e3337..f8e8041d8 100644 --- a/FF1Lib/EnemyScripts.cs +++ b/FF1Lib/EnemyScripts.cs @@ -191,6 +191,8 @@ public void ShuffleEnemySkillsSpells(FF1Rom rom, MT19337 rng, Flags flags) bool nonEmpty = (bool)flags.NoEmptyScripts; bool buffedPirates = (bool)flags.SwolePirates; bool generateBalancedscript = (bool)flags.EnemySkillsSpellsTiered && shuffleNormalEnemies; + bool OverworldFiendsOnly = (bool)flags.OverworldFiendsOnly; + bool TempleOfFiendRefightsOnly = (bool)flags.TempleOfFiendRefightsOnly; if (!shuffleBosses && !shuffleNormalEnemies) { @@ -212,18 +214,29 @@ public void ShuffleEnemySkillsSpells(FF1Rom rom, MT19337 rng, Flags flags) var normalIndices = Enumerable.Range(0, 32).Concat(new[] { 33, 43 }).ToList(); var bossIndices = new List { 34, 36, 38, 40 }; var bigBossIndices = new List { 32, 35, 37, 39, 41, 42 }; + var bigBossExChaosIndices = new List { 32, 35, 37, 39, 41 }; if (shuffleNormalEnemies) { ShuffleIndexedSkillsSpells(rom, normalIndices, noConsecutiveNukes, nonEmpty, rng); } - if (shuffleBosses) + if (shuffleBosses && !OverworldFiendsOnly && !TempleOfFiendRefightsOnly) { ShuffleIndexedSkillsSpells(rom, bossIndices, noConsecutiveNukes, false, rng); ShuffleIndexedSkillsSpells(rom, bigBossIndices, noConsecutiveNukes, false, rng); } + if(shuffleBosses && OverworldFiendsOnly) + { + ShuffleIndexedSkillsSpells(rom, bossIndices, noConsecutiveNukes, false, rng); + } + + if(shuffleBosses && TempleOfFiendRefightsOnly) + { + ShuffleIndexedSkillsSpells(rom, bigBossExChaosIndices, noConsecutiveNukes, false, rng); + } + //Put(ScriptOffset, scriptBytes.SelectMany(script => script.ToBytes()).ToArray()); } diff --git a/FF1Lib/FF1Lib.csproj b/FF1Lib/FF1Lib.csproj index 0eef341bc..950c5e2fb 100644 --- a/FF1Lib/FF1Lib.csproj +++ b/FF1Lib/FF1Lib.csproj @@ -73,6 +73,7 @@ + @@ -101,6 +102,7 @@ + @@ -184,6 +186,7 @@ + @@ -207,6 +210,7 @@ + @@ -217,6 +221,7 @@ + @@ -230,6 +235,7 @@ + @@ -237,6 +243,7 @@ + @@ -249,10 +256,10 @@ - + - + diff --git a/FF1Lib/FF1Rom.cs b/FF1Lib/FF1Rom.cs index 8858b331f..1216c7a6d 100644 --- a/FF1Lib/FF1Rom.cs +++ b/FF1Lib/FF1Rom.cs @@ -12,16 +12,66 @@ using FF1Lib.Procgen; using FF1Lib.Assembly; using System.Numerics; +using System.Diagnostics; +using System.Xml.Linq; namespace FF1Lib; // ReSharper disable once InconsistentNaming public partial class FF1Rom : NesRom { + public string RomPutsTracker = ""; public new void Put(int index, Blob data) { //Debug.Assert(index <= 0x4000 * 0x0E + 0x9F48 - 0x8000 && (index + data.Length) > 0x4000 * 0x0E + 0x9F48 - 0x8000); base.Put(index, data); + + /* + // This is tracking code to register all the Puts to the rom, for debugging only + // Get the stack calling the put + StackTrace trace = new StackTrace(); + string stackline = ""; + + foreach (var frame in trace.GetFrames()) + { + var name = frame.GetMethod().Name; + // Might apply only to blazorizer interface, but if we're at move next, we don't need to go further + if (name == "MoveNext") + { + break; + } + // no need to write down put/putinbank either + else if (name == "Put" || name == "PutInBank") + { + continue; + } + + var origin = frame.GetMethod().DeclaringType.Name; + stackline += origin + "-" + name + "/"; + } + + // if only 0's are written, we're wiping data + var sumdata = 1; + try + { + // if it's not 0's, sum() will probably overflow, we skip that error then + sumdata = data.ToInts().Sum(); + } + catch + { } + + if (sumdata == 0) + { + stackline += "[Wipe]"; + } + + // get the bank, start offset, end offset and write to tracker + int bank = index / 0x4000; + int offsetstart = bank == 0x1F ? (index % 0x4000) + 0xC000 : (index % 0x4000) + 0x8000; + int offsetend = bank == 0x1F ? (index % 0x4000) + 0xC000 + data.Length - 1 : (index % 0x4000) + 0x8000 + data.Length - 1; + var fullstring = $"{stackline} - Bank: {bank:X2)}, Address: {offsetstart:X4} - {offsetend:X4}"; + RomPutsTracker += fullstring + "\n"; + */ } public void PutInBank(int bank, int address, Blob data) diff --git a/FF1Lib/FF1Text.cs b/FF1Lib/FF1Text.cs index ec49c67b5..e37390594 100644 --- a/FF1Lib/FF1Text.cs +++ b/FF1Lib/FF1Text.cs @@ -241,7 +241,8 @@ public enum MenuString { "!", 0xC4 }, { "?", 0xC5 }, - // I can put two in 7E, 7F + // I can put two in 7E, 7F + // Not anymore, that's used for opened chests // 0xC6 Level icon (it has a sinlge different PIXEL so it's off limits despite being otherwise identical to the regular L...) // 0xC7 Equip icon (ditto but for E) diff --git a/FF1Lib/FFRVersion.cs b/FF1Lib/FFRVersion.cs index d1c0ac229..9068cdee9 100644 --- a/FF1Lib/FFRVersion.cs +++ b/FF1Lib/FFRVersion.cs @@ -3,7 +3,7 @@ // THIS FILE IS UPDATED DURING THE BUILD AND DEPLOY. DO NOT EDIT UNLESS YOU KNOW WHAT YOU ARE DOING. public static class FFRVersion { - public static readonly string Version = "4.8.6"; + public static readonly string Version = "4.9.0"; public static readonly string Sha = "SHA"; public static readonly string Branch = "BRANCH"; public static readonly string MasterBranch = "master"; diff --git a/FF1Lib/Flags/Flags.cs b/FF1Lib/Flags/Flags.cs index 13e6427b6..8fb8260f2 100644 --- a/FF1Lib/Flags/Flags.cs +++ b/FF1Lib/Flags/Flags.cs @@ -169,6 +169,7 @@ public partial class Flags : IIncentiveFlags, IScaleFlags, IVictoryConditionFlag public int MaxLevelHigh { get; set; } = 50; public bool Spoilers { get; set; } = false; + public bool TriState { get; set; } = false; public bool TournamentSafe { get; set; } = false; public bool BlindSeed { get; set; } = false; public bool? Shops { get; set; } = false; @@ -191,6 +192,7 @@ public partial class Flags : IIncentiveFlags, IScaleFlags, IVictoryConditionFlag public bool? ChaosRush { get; set; } = false; public ToFRMode ToFRMode { get; set; } = ToFRMode.Long; public FiendsRefights FiendsRefights { get; set; } = FiendsRefights.All; + public ShortToFRFiendsRefights ShortToFRFiendsRefights { get; set; } = ShortToFRFiendsRefights.All; public bool? ExitToFR { get; set; } = false; public bool? ChaosFloorEncounters { get; set; } = false; public bool? MagicShops { get; set; } = false; @@ -239,6 +241,8 @@ public partial class Flags : IIncentiveFlags, IScaleFlags, IVictoryConditionFlag public bool? ShuffleScriptsBosses { get; set; } = false; public bool? ShuffleSkillsSpellsEnemies { get; set; } = false; public bool? ShuffleSkillsSpellsBosses { get; set; } = false; + public bool? OverworldFiendsOnly { get; set; } = false; + public bool? TempleOfFiendRefightsOnly { get; set; } = false; public bool? NoConsecutiveNukes { get; set; } = false; public bool TranceHasStatusElement { get; set; } = false; public bool? EnemySkillsSpellsTiered { get; set; } = false; @@ -252,6 +256,7 @@ public partial class Flags : IIncentiveFlags, IScaleFlags, IVictoryConditionFlag public bool? TitansTrove { get; set; } = false; public bool? LefeinSuperStore { get; set; } = false; public bool? LefeinShops { get; set; } = false; + public bool? LefeinShortcut { get; set; } = false; public bool? RandomVampAttack { get; set; } = false; public bool? RandomVampAttackIncludesConeria { get; set; } = false; public bool? FightBahamut { get; set; } = false; @@ -369,6 +374,7 @@ public partial class Flags : IIncentiveFlags, IScaleFlags, IVictoryConditionFlag public bool? AirBoat { get; set; } = false; public bool BuyTen { get; set; } = false; public bool IdentifyTreasures { get; set; } = false; + public bool ChestsAppearOpened { get; set; } = false; public bool ShopInfo { get; set; } = false; public bool ChestInfo { get; set; } = false; public bool IncentiveChestItemsFanfare { get; set; } = false; @@ -382,6 +388,8 @@ public partial class Flags : IIncentiveFlags, IScaleFlags, IVictoryConditionFlag public bool WeaponCritRate { get; set; } = false; public bool WeaponBonuses { get; set; } = false; public ThiefAGI ThiefAgilityBuff { get; set; } = ThiefAGI.Vanilla; + public ThiefHit ThiefHitBuff { get; set; } = ThiefHit.HitDouble; + public RedMageHit RedMageHitBuff { get; set; } = RedMageHit.Vanilla; public SpoilerBatHints SkyWarriorSpoilerBats { get; set; } = SpoilerBatHints.Vanilla; public bool? SpoilerBatsDontCheckOrbs { get; set; } = false; public bool? MoveToFBats { get; set; } = false; @@ -452,7 +460,19 @@ public partial class Flags : IIncentiveFlags, IScaleFlags, IVictoryConditionFlag [IntegerFlag(0, 500, 10)] public int EnemyScaleHpHigh { get; set; } = 200; - + + // [IntegerFlag(0, 255, 1)] + // public int EnemySleepScaleLow { get; set; } = 0; + + // [IntegerFlag(0, 255, 1)] + // public int EnemySleepScaleHigh { get; set; } = 80; + + [IntegerFlag(0, 255, 1)] + public int PlayerSleepScaleLow { get; set; } = 0; + + [IntegerFlag(0, 255, 1)] + public int PlayerSleepScaleHigh { get; set; } = 80; + [IntegerFlag(0, 500, 10)] public int PriceScaleFactorLow { get; set; } = 50; @@ -580,7 +600,6 @@ public partial class Flags : IIncentiveFlags, IScaleFlags, IVictoryConditionFlag public bool? ClampMinimumStatScale { get; set; } = false; public bool? ClampMinimumBossStatScale { get; set; } = false; public bool? ClampMinimumPriceScale { get; set; } = false; - public bool EFGWaterfall { get; set; } = false; public bool? FiendShuffle { get; set; } = false; public bool DisableTentSaving { get; set; } = false; public bool DisableInnSaving { get; set; } = false; @@ -592,7 +611,6 @@ public partial class Flags : IIncentiveFlags, IScaleFlags, IVictoryConditionFlag public bool? RandomizeFormationEnemizer { get; set; } = false; public bool? GenerateNewSpellbook { get; set; } = false; public bool? SpellcrafterMixSpells { get; set; } = false; - public bool ThiefHitRate { get; set; } = false; public bool AllSpellLevelsForKnightNinja { get; set; } = false; public bool BuffHealingSpells { get; set; } = false; public bool IntAffectsSpells { get; set; } = false; @@ -636,12 +654,14 @@ public partial class Flags : IIncentiveFlags, IScaleFlags, IVictoryConditionFlag public bool? RandomizeClassKeyItems { get; set; } = false; public bool? RandomizeClassIncludeXpBonus { get; set; } = false; public bool? AlternateFiends { get; set; } = false; + public bool? HardcoreAltFiends { get; set; } = false; public bool? FinalFantasy2Fiends { get; set; } = false; public bool? FinalFantasy3Fiends { get; set; } = false; public bool? FinalFantasy4Fiends { get; set; } = false; public bool? FinalFantasy5Fiends { get; set; } = false; public bool? FinalFantasy6Fiends { get; set; } = false; public bool? FinalFantasy1BonusFiends { get; set; } = false; + public bool? WinnerCircleFiends { get; set; } = false; public bool? BlackOrbFiends { get; set; } = false; public bool? NoBossSkillScriptShuffle { get; set; } = false; diff --git a/FF1Lib/Flags/FlagsCompute.cs b/FF1Lib/Flags/FlagsCompute.cs index 53e63abdf..07238dd84 100644 --- a/FF1Lib/Flags/FlagsCompute.cs +++ b/FF1Lib/Flags/FlagsCompute.cs @@ -15,7 +15,7 @@ public partial class Flags : IIncentiveFlags, IScaleFlags, IVictoryConditionFlag public bool Incentivize65K => false; public bool IncentivizeBad => false; public bool OrbsRequiredEnabled => !ShardHunt && (GameMode != GameModes.DeepDungeon); - public bool OrbsRequiredOptionsEnabled => OrbsRequiredEnabled && (OrbsRequiredCount != 4 && OrbsRequiredCount != 0); + public bool OrbsRequiredOptionsEnabled => OrbsRequiredEnabled && (OrbsRequiredCount != 4 && OrbsRequiredCount != 0); public bool PoisonConstantValueEnabled => PoisonMode == PoisonModeOptions.Constant; public LoosePlacementMode LoosePlacementMode { @@ -257,9 +257,9 @@ public LoosePlacementMode LoosePlacementMode + ((IncentivizeCardia ?? true) ? 1 : 0); public int TrappedChestsFloor => 0 - + ((TCShards == TCOptions.All) ? 32 : 0) - + ((TCKeyItems == TCOptions.All) ? 16 : 0) - + ((TCBetterTreasure == TCOptions.All) ? 50 : 0) + + ((ShardHunt && TCShards == TCOptions.All) ? 32 : 0) + + ((TCKeyItems == TCOptions.All) ? 21 : 0) + + ((TCBetterTreasure == TCOptions.All) ? 45 : 0) + ((TCMasaGuardian == true && TCBetterTreasure != TCOptions.All) ? 1 : 0) + ((TrappedChaos == true) ? 1 : 0); diff --git a/FF1Lib/Flags/Preferences.cs b/FF1Lib/Flags/Preferences.cs index ce0bfdf17..39460049e 100644 --- a/FF1Lib/Flags/Preferences.cs +++ b/FF1Lib/Flags/Preferences.cs @@ -29,12 +29,14 @@ public class Preferences public TitanSnack TitanSnack { get; set; } = TitanSnack.Ruby; public bool randomShardNames { get; set; } = false; public Fate HurrayDwarfFate { get; set; } = Fate.Spare; + public bool FunFountainText { get; set; } = false; public bool RenounceAutosort { get; set; } = false; public bool RenounceChestInfo { get; set; } = false; public bool RenounceCantHoldRed { get; set; } = false; public bool AccessibleSpellNames { get; set; } = false; public bool CleanBlursedEquipmentNames { get; set; } = false; public bool ShopInfoIcons { get; set; } = false; + public bool MagicShopMenuChange { get; set; } = false; public bool NoTabLayout { get; set; } = false; public string SpriteSheet { get; set; } = null; public bool CropScreen { get; set; } = false; diff --git a/FF1Lib/Formations.cs b/FF1Lib/Formations.cs index 683bdc223..9865a1ff2 100644 --- a/FF1Lib/Formations.cs +++ b/FF1Lib/Formations.cs @@ -55,6 +55,10 @@ public void SwapDomains(int from, int to) formations[to] = new ZoneFormation() { Index = formations[from].Index, Formations = formations[from].Formations }; formations[from] = new ZoneFormation() { Index = tmp.Index, Formations = tmp.Formations }; } + public void ReplaceDomain(ZoneFormation newzoneformation, int to) + { + formations[to] = new ZoneFormation() { Index = to, Formations = newzoneformation.Formations }; + } public void UpdateFromBlob(Blob zonedata) { formations = zonedata.Chunk(ZoneFormationsSize).Select((z, i) => new ZoneFormation() { Index = i, Formations = z.ToBytes().ToList() }).ToList(); diff --git a/FF1Lib/Fun.cs b/FF1Lib/Fun.cs index 08448c765..b881103e0 100644 --- a/FF1Lib/Fun.cs +++ b/FF1Lib/Fun.cs @@ -500,6 +500,37 @@ public void ChangeLute(bool changelute, DialogueData dialogues, MT19337 rng) ItemsText[(int)Item.Lute] = newLute; } + public void ChangeFountainText(bool changeFountain, DialogueData dialogues, MT19337 rng) + { + if (!changeFountain) + { + return; + } + + List roasts = new() + { + "See your face upon the\nclear water. SO DIRTY!\nCome,\n wash your face.", + "See your face upon the\ndirty water. How clean!\nFilter the water.", + "Sparkling Water Fountain\n Brought to you by\n Bubbles Sodo Co.\n\n Car-Bo-Nate", + "Fill your cup. You have\na long journey ahead\nof you.\n\nGood Luck Have Fun!", + "See your face upon the\nclean water. How nice!\nYou have a pretty face.", + "You take a moment to\nlook at the fountain.\nThe sound of rushing\nwater fills you with\nDetermination.", + "Are you thirsty?\nTake a moment to drink\nthe endlessly recycled\nwater.", + "I am no ordinary well.\nI am a unique fountain,\nblessed by the light\nwariors.", + "WASH YOUR FACE!!!!", + "You may wash your face,\nbut come to the inn to\nget a full private bath!", + "Please go to the\nordinary well to fill\nme back up.", + "Sploosh, Splash.\nThe fountain sprayed\nyour face.", + "You examine the fountain.\nIt is only a trickle.\nThe water element\nhas been corrupted." + }; + + string roast = roasts.PickRandom(rng); + + //roast = roasts[12]; //for testing + + dialogues[0x136] = roast; + } + public void HurrayDwarfFate(Fate fate, NpcObjectData npcdata, DialogueData dialogues, MT19337 rng) { if (fate == Fate.Spare) diff --git a/FF1Lib/GlobalHacks/GlobalHacks.cs b/FF1Lib/GlobalHacks/GlobalHacks.cs index f5b195533..019bb103e 100644 --- a/FF1Lib/GlobalHacks/GlobalHacks.cs +++ b/FF1Lib/GlobalHacks/GlobalHacks.cs @@ -18,7 +18,6 @@ public void GlobalHacks() MakeSpace(); Bank1E(); Bank1B(); - EasterEggs(); PermanentCaravan(); ShiftEarthOrbDown(); CastableItemTargeting(); @@ -117,10 +116,6 @@ public void PermanentCaravan() { Put(CaravanFairyCheck, Enumerable.Repeat((byte)Nop, CaravanFairyCheckSize).ToArray()); } - public void EasterEggs() - { - Put(0x2ADDE, Blob.FromHex("91251A682CFF8EB1B74DB32505FFBE9296991E2F1AB6A4A9A8BE05FFFFFFFFFFFF9B929900")); - } public void DrawCanoeUnderBridge() { // Draw canoe under bridge if bridge is placed over a river, see 1F_E26A_DrawCanoeUnderBridge.asm @@ -253,8 +248,10 @@ public void AddNewChars() var newChars = new List<(byte, string)> { (0x7B, "000008083E080800FFFFFFFFFFFFFFFF"), // + sign - (0x7C, "FFFFFF7F3DFFFFFFFFFF99C2E6C299FE"), // Trapped chest (standard) - (0x7D, "FFFF99C3E7C399FF0000663C183C6600") // Trap tile + (0x7C, "FFFFFF7F3DFFFFFFFFFF99C2E6C299FE"), // Trapped chest (standard) + (0x7D, "FFFF99C3E7C399FF0000663C183C6600"), // Trap tile + (0x7E, "FFFFEEC0FFFFFFFFFF807F7F00FFDFBB"), // Opened chest left + (0x7F, "FFFF3B97FBFDFFFFFF03EDEE06FAFDFA") // Opened chest right }; foreach (var newchar in newChars) @@ -279,7 +276,11 @@ public void AddNewChars() // Hack this one in, because chests in sky have different graphics from other chests var trappedChestSky = "FFFFFF7F3DFFFF7FFF6699C2E64299EE"; - Put(tilesetOffset + tilesetSize * (int)TileSets.SkyCastle + 0x7C * 0x10, Blob.FromHex(trappedChestSky)); + Put(tilesetOffset + tilesetSize * (int)TileSets.SkyCastle + 0x7C * 0x10, Blob.FromHex(trappedChestSky)); + var openedChestSkyLeft = "FFFFFFC0FFFFFFFFFF007F7F00FFDFBF"; + Put(tilesetOffset + tilesetSize * (int)TileSets.SkyCastle + 0x7E * 0x10, Blob.FromHex(openedChestSkyLeft)); + var openedChestSkyRight = "FFFFFF17FBFDFFFFFF07EBED06FAFDFA"; + Put(tilesetOffset + tilesetSize * (int)TileSets.SkyCastle + 0x7F * 0x10, Blob.FromHex(openedChestSkyRight)); } } } diff --git a/FF1Lib/GlobalImprovements.cs b/FF1Lib/GlobalImprovements.cs index 1f1bc8de6..4369e4487 100644 --- a/FF1Lib/GlobalImprovements.cs +++ b/FF1Lib/GlobalImprovements.cs @@ -23,6 +23,11 @@ public void GlobalImprovements(Flags flags, StandardMaps maps, Preferences prefe if ((bool)flags.IdentifyTreasures) { EnableIdentifyTreasures(Dialogues); + } + + if ((bool)flags.ChestsAppearOpened) + { + EnableChestsAppearOpened(); } if ((bool)flags.BuyTen || (bool)flags.Archipelago) @@ -98,6 +103,18 @@ public void EnableIdentifyTreasures(DialogueData dialogues) { dialogues[0xF1 + 0x50] = "Can't hold\n#"; dialogues[0xF1] = "Can't hold\n#"; + } + + public void EnableChestsAppearOpened() + { + // Open chest routine + PutInBank(0x1F, 0xCBF9, Blob.FromHex("A9112003FE4C8AB9")); + PutInBank(0x11, 0xB98A, Blob.FromHex("A645BD00622904F003A9F2602078DDC9F1F06148A52F186907A8A533C908D004884CB3B9C904D001C898C90F9002E90FA8A514291FC910B00E0A19E2D5850EB9F2D5850F4CE0B9290F0A19E2D5850EB9F2D50904850F20A8FEAD0220A50F8D0620A50E8D0620A97E8D0720A97F8D072020A1CC6860")); + + // Map loading routine + PutInBank(0x1F, 0xCC45, Blob.FromHex("A9112003FE4C40B9")); + PutInBank(0x1F, 0xCC62, Blob.FromHex("A9002003FE")); + PutInBank(0x11, 0xB940, Blob.FromHex("A000B900042908F017BE0104BD00622904F00D984AAAA97E9D0005A97F9D8005C8C8D0DEA9008511A5480A0A0A26110A26118510A6110610261118651085108A651109A085114C62CC")); } public void EnableBuyQuantity(bool archipelagoenabled) diff --git a/FF1Lib/Hacks.cs b/FF1Lib/Hacks.cs index 10edfb351..68ac56ecd 100644 --- a/FF1Lib/Hacks.cs +++ b/FF1Lib/Hacks.cs @@ -97,11 +97,15 @@ public void EnableAirBoat(Flags flags) PutInBank(0x1F, 0xE1F6, Blob.FromHex("2089C6")); PutInBank(0x1F, 0xE248, Blob.FromHex("4C58E2A91B85572003FE4C25E2")); PutInBank(0x1F, 0xE373, Blob.FromHex("2000A0")); - PutInBank(0x1B, 0xA000, Blob.FromHex($"AD00602901D00160AD00602980498060A542C908F0034C5FA04CB8C6BD00042908D008A9018D0460A90060BD00042904F00160AD00602901D003A90160A5271869078D0160A5281869078D0260A90485468542A9{shiptrack:X2}854BA9008D0460686860AD0460D00DA542C904F00160AD2B60D01560A527186907CD0560D0F5A528186907CD0660D0EBA90885468542A9{airshiptrack:X2}854BA9008D0460AD006009808D00604CA8E1AD0060297F8D0060A5271869078D0160A5281869078D026018A9308D0C40A9{overworldtrack:X2}854B602000A0F011AD0160C512D00AAD0260C513D003A90160A90060")); + PutInBank(0x1B, 0xA000, Blob.FromHex($"AD0060297FD00160AD00602980498060A542C908F0034C5FA04CB8C6BD00042908D008A9018D0460A90060BD00042904F00160AD0060297FD003A90160A5271869078D0160A5281869078D0260A90485468542A9{shiptrack:X2}854BA9008D0460686860AD0460D00DA542C904F00160AD2B60D01560A527186907CD0560D0F5A528186907CD0660D0EBA90885468542A9{airshiptrack:X2}854BA9008D0460AD006009808D00604CA8E1AD0060297F8D0060A5271869078D0160A5281869078D026018A9308D0C40A9{overworldtrack:X2}854B602000A0F011AD0160C512D00AAD0260C513D003A90160A90060")); // super secret stuff PutInBank(0x0D, 0xB600, Blob.FromHex("FDF804E2D897D9477797DA07D977974777274777D104B6D897D9477797DA07D977974777274777D517B6D90777A7DA07572747D9A7DA07D95777A7D52AB6D017B6FDF803E2D897979797D546B6979797979797979797979797D54DB6070707070707070707070707D55CB6D04DB6FDF809E7C0C0D994DA27477794DB07DAB77794DB07DAB7779475B744240527D9B577D174B6DA045777A7DB045747DAA7DB045747DAA7DB04DAA5DB27DA7454457725D9A7DA045777A7DB045747DAA7DB045747DAA7DB04A7975770D074B6")); PutInBank(0x0D, 0x8028, Blob.FromHex("00B641B66EB6")); + + //rename FLOATER to AIRBOAT + ItemsText[(int)Item.Floater] = "AIRBOAT"; + MenuText.MenuStrings[(int)FF1Text.MenuString.UseFloater] = FF1Text.TextToBytes("A mysterious boat", useDTE: true); } public void ImproveTurnOrderRandomization(bool enable, MT19337 rng) diff --git a/FF1Lib/Helpers/Utilities.cs b/FF1Lib/Helpers/Utilities.cs index fa541800f..762cc2fbf 100644 --- a/FF1Lib/Helpers/Utilities.cs +++ b/FF1Lib/Helpers/Utilities.cs @@ -4,6 +4,8 @@ public static class Utilities { public static string SpoilerCache { get; set; } = ""; + public static string FlagCache { get; set; } = ""; + public static string ArchipelagoCache { get; set; } = ""; /// diff --git a/FF1Lib/MIAB.cs b/FF1Lib/MIAB.cs index 0c5b8375b..62dfdb0ad 100644 --- a/FF1Lib/MIAB.cs +++ b/FF1Lib/MIAB.cs @@ -128,7 +128,11 @@ public void MonsterInABox(ItemPlacement itemPlacement, ZoneFormations zoneformat } int maxChests = 0; - int guaranteedChests = ((flags.TCKeyItems == TCOptions.All) ? RangeKeyItems.Count() : 0) + ((flags.TCShards == TCOptions.All) ? RangeShards.Count() : 0) + ((flags.TCBetterTreasure == TCOptions.All) ? RangeBetterTreasure.Count() : 0) + (((bool)flags.TCMasaGuardian) ? RangeMasamune.Count() : 0) + (((bool)flags.TrappedChaos) ? 1 : 0); + int guaranteedChests = ((flags.TCKeyItems == TCOptions.All) ? RangeKeyItems.Count() : 0) + + ((flags.TCShards == TCOptions.All) ? RangeShards.Count() : 0) + + ((flags.TCBetterTreasure == TCOptions.All) ? RangeBetterTreasure.Count() : 0) + + (((bool)flags.TCMasaGuardian) ? RangeMasamune.Count() : 0) + + (((bool)flags.TrappedChaos) ? 1 : 0); if (flags.TCChestCount == 260) { diff --git a/FF1Lib/MapExchange/OwMapExchange.cs b/FF1Lib/MapExchange/OwMapExchange.cs index 808f4ad6a..e9b95f4ae 100644 --- a/FF1Lib/MapExchange/OwMapExchange.cs +++ b/FF1Lib/MapExchange/OwMapExchange.cs @@ -291,25 +291,12 @@ public void RefreshData() ShipLocations.SetShipLocation(255); }*/ - public void UpdateDomains(DomainData domains) - { - - DomainData originalDomains = new DomainData(rom); - originalDomains.LoadTable(); - //domains.LoadTable(); - - if (data.DomainFixups != null) foreach (var df in data.DomainFixups) domains.SwapDomains(df.From, df.To); - if (data.DomainUpdates != null) foreach (var df in data.DomainUpdates) domains.Data[df.To] = originalDomains.Data[df.From]; - - //domains.StoreTable(); - //locations.StoreData(); - } public void UpdateDomains(ZoneFormations domains) { ZoneFormations originalDomains = new ZoneFormations(rom); if (data.DomainFixups != null) foreach (var df in data.DomainFixups) domains.SwapDomains(df.From, df.To); - if (data.DomainUpdates != null) foreach (var df in data.DomainUpdates) domains[df.To] = originalDomains[df.From]; + if (data.DomainUpdates != null) foreach (var df in data.DomainUpdates) domains.ReplaceDomain(originalDomains[df.From], df.To); } private static OwMapExchangeData LoadJson(string _name) diff --git a/FF1Lib/MapObjects.cs b/FF1Lib/MapObjects.cs index 91861674f..0eeb9ff1a 100644 --- a/FF1Lib/MapObjects.cs +++ b/FF1Lib/MapObjects.cs @@ -99,7 +99,8 @@ public IEnumerator GetEnumerator() } public MapObject FindNpc(ObjectId mapObjId) { - var validobjects = mapObjects.Where(o => o.ObjectId == mapObjId); + // Even if there's 16 objects data, the game only load 15, so ignore any hit on the 16th slot + var validobjects = mapObjects.Where(o => o.ObjectId == mapObjId && o.Index < 15); if (validobjects.Any()) { diff --git a/FF1Lib/MetroidVaniaMap.cs b/FF1Lib/MetroidVaniaMap.cs index 7b429a7ed..a6b8344c4 100644 --- a/FF1Lib/MetroidVaniaMap.cs +++ b/FF1Lib/MetroidVaniaMap.cs @@ -1545,9 +1545,26 @@ public void ShuffleFloor(StandardMaps maps, Teleporters teleportersdata, TileSet var originTile = TeleportersTiles.Find(x => x.Item1.Index == (byte)targetile && x.Item1.TileSet == (int)tilesetList[(int)source.Item1].Item2); var originTeleporter = teleporters.Find(x => x.ID == originTile.Item1.PropertyValue); - var freenpc = maps[(MapIndex)originTeleporter.Destination].MapObjects.FindNpc(ObjectId.None); - if (freenpc.Index > 0 || (freenpc.Index == 0 && freenpc.Coords == new Sanity.SCCoords(0, 0))) + MapObject freenpc; + + // Onrac has no free npcs, kidnap the old man behind the clinic + if ((MapIndex)originTeleporter.Destination == MapIndex.Onrac) + { + freenpc = maps[(MapIndex)originTeleporter.Destination].MapObjects.FindNpc(ObjectId.OnracOldMan1); + } + else + { + freenpc = maps[(MapIndex)originTeleporter.Destination].MapObjects.FindNpc(ObjectId.None); + } + + // A few maps are full of bats; so pick a bat instead + if (freenpc is null) + { + freenpc = maps[(MapIndex)originTeleporter.Destination].MapObjects.FindNpc(ObjectId.Bat); + } + + if (freenpc is not null && (freenpc.Index > 0 || (freenpc.Index == 0 && freenpc.Coords == new Sanity.SCCoords(0, 0)))) { maps[(MapIndex)originTeleporter.Destination].MapObjects.SetNpc(freenpc.Index, source.Item4, originTeleporter.X, originTeleporter.Y, originTeleporter.InRoom, true); var sprite_palette = GetFromBank(0x00, 0xA000 + (originTeleporter.Destination * 0x30) + 0x18, 8); diff --git a/FF1Lib/Music/NewMusic.cs b/FF1Lib/Music/NewMusic.cs index fb1fe3a6d..133055f2f 100644 --- a/FF1Lib/Music/NewMusic.cs +++ b/FF1Lib/Music/NewMusic.cs @@ -255,6 +255,7 @@ private List SelectMusic(NewMusicData newMusicData, Preferences preference { newMusicData.NewSongs.Remove(newMusicData.NewSongs.Where(x => x.Name == "UnderTheSea").First()); newMusicData.NewSongs.Remove(newMusicData.NewSongs.Where(x => x.Name == "JeopardyThink").First()); + newMusicData.NewSongs.Remove(newMusicData.NewSongs.Where(x => x.Name == "DW1Fanfare").First()); Song tmp = OriginalSongs[(int)SongNames.TempleOfFiend]; tmp.ReplacementCandidates = new List() { ReplacableSongs.Mermaids }; diff --git a/FF1Lib/Music/NewMusicData.cs b/FF1Lib/Music/NewMusicData.cs index 655dfa6b8..504237f0e 100644 --- a/FF1Lib/Music/NewMusicData.cs +++ b/FF1Lib/Music/NewMusicData.cs @@ -37,6 +37,13 @@ public NewMusicData() new List { ReplacableSongs.Crystal}, "DW1Fanfare") ); + NewSongs.Add(new Song( + new SongChannel(Blob.FromHex("FDF805E1DBA7572707DAA7572707D9A7572707D8A7572707DB2757A7572707DAA7572707D9A7572707D8A757DB7727DAA7977727D9A7977727D8A7977727A797DAA7DB277727DAA7977727D9A7977727D8A7977727E2DBA7572707DAA7572707D9A7572707D8A7572707DB2757A7572707DAA7572707D9A7572707D8A757DB7727DAA7977727D9A7977727D8A7977727A797DAA7DB277727DAA7977727D9A7977727D8A727A797E177A7375777A7D9375777A7DA375777A7DB3757775737DAA7775737D9A7775737D8A7775737A7DAA7DB277727DAA7977727D9A7977727D8A727A797DB775737DAA7775737D9A7775737D8A7775737A777A7375777A7D9375777A7DA375777A7DB375797775707DAA7773707D997775707D897775707E267A7175767A7D9175767A7DA175767A7DB1757D8570767A7175767A7D9175767A7DA175767A7E1DB577797775707DA97775707D997775707D89777DB87775707DA87775707D987775707D887775707DB577787775707DA87775707D987775707D88777D00081").ToBytes(), 0x8100), + new SongChannel(Blob.FromHex("FDF806E1D8A7072757A7D9072757A7DA072757A7DB072757D85707A7072757A7D9072757A7DA072757A7DB07D97797A7277797A7DA277797A7DB277797A727D827077797A7277797A7D9277797A7DA277797E2D9A7D8072757A7D9072757A7DA072757A7DB072757D8A797A7072757A7D9072757A7DA0727572707D827077797A7277797A7D9277797A7DA2777A7D877A7375777A7D9375777A7DA375777A7DB3757E1D8A79777A7375777A7D9375777A7DA375777A7DB3757775737DAA7775737D9A7775737D8A77757D877A7375777A7D9375777A7DA375777A7DB37573757775737DAA7775737D9A7775737D8A77757A79777A7375777A7D9375777A7DA375777A7D89707577797D907577797DA07577797DB075777E2875717DAA7675717D9A7675717D8A7675717A7DB1757675717DAA7675717D9A7675717D8A76757E137A79707577797D907577797DA07577797DB07D88707377787D907377787DA07577787DB075777D817A78707177787D907577787DA07577787DB07D00086").ToBytes(), 0x8600), + new SongChannel(Blob.FromHex("FDF805E7CDCFD95D5FCDCFDA2D2FD8A797A7072757A7D9072757A7DA072757A7DB07A7572707DAA7572707D9A7572707D8A757270727077797A7277797A7D9277797A7DA277797DB7727DAA7977727D9A7977727D8A7977727A797A3A4D9A731DA3334D9A731CDCFDA3334D9A73337D8A735A3A4D937A3A4DA379394D99701DB1757675717DAA7675717D9A7675717D8A7675767A7175767A7D9175767A7DA175767A7DB1757DA535407D9535777DA0757DB57778555DA877754D9775707D88777DB877507DA8555D987750307D0008B").ToBytes(), 0x8B00), + new List { ReplacableSongs.Crystal }, + "AltVanillaPrelude") + ); NewSongs.Add(new Song( new SongChannel(Blob.FromHex("FEE0F80BDA8434446472644442C232C2024232C4D9B4DA427262C2427262C43492DB02DAFBB494846442C2FF").ToBytes(), 0x8100), new SongChannel(Blob.FromHex("FEE1F809D9B27496B6DA04D9B494746246667696B466769434444626447464664662DA04D9062646667696B46434D8B4D9724474D8B4B6D9163244647444FB3414D8B494B2C2FF").ToBytes(), 0x8600), diff --git a/FF1Lib/Overworld.cs b/FF1Lib/Overworld.cs index 6cc5fd6d9..ba19415ae 100644 --- a/FF1Lib/Overworld.cs +++ b/FF1Lib/Overworld.cs @@ -22,7 +22,6 @@ public class Overworld //private OwMapExchangeData owMapExchangeData; private OwLocationData locations; private ShipLocations shipLocations; - private DomainData domains; private ZoneFormations zoneFormations; private TileSet owTileSet; @@ -46,25 +45,16 @@ public Overworld(FF1Rom _rom, Flags _flags, ZoneFormations _zoneFormations, MT19 locations = new OwLocationData(rom); overworldMap = new OverworldMap(rom, flags); - domains = new DomainData(rom); zoneFormations = _zoneFormations; owTileSet = new TileSet(rom, 0xFF); - //domains.LoadTable(); - //owMapExchange = new(rom, ); - //locations = new OwLocationData(_rom); shipLocations = OwMapExchange.GetDefaultShipLocations(locations); BattleBackdrops = rom.GetFromBank(lut_BtlBackdrops_Bank, lut_BtlBackdrops, 0x80).ToBytes().Select(b => (Backdrop)b).ToList(); - //_owMapExchange = await OwMapExchange.FromFlags(this, _overworldMap, flags, rng); - - } public void Write() { - //domains.StoreTable(); locations.StoreData(); owTileSet.StoreData(); rom.PutInBank(lut_BtlBackdrops_Bank, lut_BtlBackdrops, BattleBackdrops.Select(b => (byte)b).ToArray()); - //overworldMap. } public async Task LoadMapExchange() { diff --git a/FF1Lib/PlacementContext.cs b/FF1Lib/PlacementContext.cs index 4f421912e..424fa637e 100644 --- a/FF1Lib/PlacementContext.cs +++ b/FF1Lib/PlacementContext.cs @@ -701,7 +701,7 @@ private List SelectIncentivizedChests(IIncentiveFlags flags, MT19 return incentiveLocationPool; } - private List KeyItems = new() { Item.Lute, Item.Bridge, Item.Ship, Item.Adamant, Item.Crown, Item.Crystal, Item.Herb, Item.Crystal, Item.Key, Item.Tnt, Item.Canal, Item.Ruby, Item.Rod, Item.Canoe, Item.Floater, Item.Tail, Item.Bottle, Item.Oxyale, Item.Cube, Item.Slab, Item.Chime }; + private List KeyItems = new() { Item.Lute, Item.Bridge, Item.Ship, Item.Adamant, Item.Crown, Item.Crystal, Item.Herb, Item.Key, Item.Tnt, Item.Canal, Item.Ruby, Item.Rod, Item.Canoe, Item.Floater, Item.Tail, Item.Bottle, Item.Oxyale, Item.Cube, Item.Slab, Item.Chime }; public IEnumerable ForcedItemPlacements { get; private set; } public IEnumerable AllValidItemLocations { get; private set; } public IEnumerable AllValidPreBlackOrbItemLocations { get; private set; } diff --git a/FF1Lib/PredictivePlacement.cs b/FF1Lib/PredictivePlacement.cs index 38e93c077..599bccf1b 100644 --- a/FF1Lib/PredictivePlacement.cs +++ b/FF1Lib/PredictivePlacement.cs @@ -8,6 +8,8 @@ public class PredictivePlacement : ItemPlacement static HashSet FetchQuestItems = new HashSet { Item.Crystal, Item.Herb, Item.Adamant, Item.Slab, Item.Bottle }; static HashSet GatingItems = new HashSet { Item.Crown, Item.Key, Item.Lute, Item.Rod, Item.Cube, Item.Oxyale, Item.Tnt }; static HashSet KeyItems = new HashSet(MapChangeItems.Concat(FetchQuestItems).Concat(GatingItems)); + + static List forbiddenApChests = new() { 145, 146, 147, 148, 187, 188, 189, 190, 191, 192, 193, 194, 195 }; //Thy algorithm sllows flexible placement of many items. The average order is set by 3 Factors. //A chance modifier(ExceptionWeights) @@ -483,7 +485,7 @@ protected override ItemPlacementResult DoSanePlacement(MT19337 rng, OwLocationDa //place the shards(almost same code as in GuidedPlacement) if (!placementFailed && shards.Count > 0) { - var leftoverItemLocations = GetAllAccessibleRewardSources(preBlackOrbLocationPool, placedItems); + var leftoverItemLocations = GetAllAccessibleRewardSources(preBlackOrbLocationPool, placedItems).Where(l => !forbiddenApChests.Contains(l.Address - 0x3100)).ToList(); foreach (var shard in shards) { diff --git a/FF1Lib/QualityOfLife.cs b/FF1Lib/QualityOfLife.cs index e33d7bff5..408555a4b 100644 --- a/FF1Lib/QualityOfLife.cs +++ b/FF1Lib/QualityOfLife.cs @@ -64,8 +64,58 @@ public void QualityOfLifeHacks(Flags flags, Preferences preferences) { UninterruptedMusic(); } + if (preferences.MagicShopMenuChange) + { + MagicShopsMatchEquipShops(); + } + } + public void MagicShopsMatchEquipShops() + { + // QoS to make magic shop function like weapon/armor shops + PutInBank(0x0E, 0xA360, Blob.FromHex("A90D205BAA2089A9B0EDA662BD00038D0C032065AA20C2A8B0DEA562D0DA20EBA49008A910205BAA4C65A34CE094A5626A6A6A29C08D0A0320DFAA20CDA4AE0A03AD0B039D00634C60A3")); + + // assembly for QoS + // LDA #$0D + // JSR $AA5B + // JSR $A989 + // BCS $A357 + // LDX $62 + // LDA $0300,X + // STA $030C + // JSR $AA65 + // JSR $A8C2 + // BCS $A358 + // LDA $62 + // BNE $A358 + // JSR $A4EB + // BCC $A38B + // LDA #$10 + // JSR $AA5B + // JMP $A365 + // JSR $94E0 + // LDA $62 + // ROR A + // ROR A + // ROR A + // AND #$C0 + // STA $030A + // JSR $AADF + // JSR $A4CD + // LDX $030A + // LDA $030B + // STA $6300,X + // JMP $A360 + + PutInBank(0x0E, 0x94E0, Blob.FromHex("A917205BAA20E4A8B0034C8EA34C65A3")); + + // assembly for QoS + // LDA #$17 + // JSR $AA5B + // JSR $A8E4 + // BCS $94ED + // JMP $A38E + // JMP $A365 - } public void DisableDamageTileFlicker() { diff --git a/FF1Lib/RandoRNG.cs b/FF1Lib/RandoRNG.cs index 59d66624b..75db00961 100644 --- a/FF1Lib/RandoRNG.cs +++ b/FF1Lib/RandoRNG.cs @@ -12,10 +12,10 @@ namespace FF1Lib { public partial class FF1Rom { - private MT19337 rng; + public static MT19337 rng; private MT19337 funRng; //private MT19337 asyncRng; - private Blob GenerateRng(Flags flags, Blob seed) + public Blob GenerateRng(Flags flags, Blob seed) { // to review if (flags.OwMapExchange == OwMapExchanges.GenerateNewOverworld || flags.OwMapExchange == OwMapExchanges.LostWoods) diff --git a/FF1Lib/Randomize.cs b/FF1Lib/Randomize.cs index 8cf7d7b35..39d5423b1 100644 --- a/FF1Lib/Randomize.cs +++ b/FF1Lib/Randomize.cs @@ -71,7 +71,8 @@ public async Task Progress(string message="", int addMax=0) await ProgressCallback(currentStep, maxSteps, message); } } - public async Task Randomize(Blob seed, Flags flags, Preferences preferences) + + public async Task Randomize(Blob seed, Flags flags, Preferences preferences) { // Confirm ROM integrity if (flags.TournamentSafe) AssureSafe(); @@ -182,7 +183,7 @@ public async Task Randomize(Blob seed, Flags flags, Preferences preferences) await this.Progress(); // NPCs - Dialogues.UpdateNPCDialogues(flags); + Dialogues.UpdateNPCDialogues(flags, rng); PacifistBat(Maps, TalkRoutines, NpcData); TalkRoutines.Update(flags); ClassAsNPC(flags, TalkRoutines, NpcData, Dialogues, Maps, rng); @@ -299,6 +300,7 @@ public async Task Randomize(Blob seed, Flags flags, Preferences preferences) FiendShuffle((bool)flags.FiendShuffle, rng); ScaleEnemyStats(rng, flags); ScaleBossStats(rng, flags); + ScaleSleep(rng, flags); // Encounters ZoneFormations.ShuffleEnemyFormations(rng, flags.FormationShuffleMode, flags.EnemizerEnabled); @@ -351,6 +353,7 @@ public async Task Randomize(Blob seed, Flags flags, Preferences preferences) ClassData.SetMPMax(flags); ClassData.SetMpGainOnMaxGain(flags, this); ClassData.RaiseThiefHitRate(flags); + ClassData.RaiseRedMageHitRate(flags); ClassData.BuffThiefAGI(flags); ClassData.EarlierHighTierMagicCharges(flags); ClassData.CustomSpellPermissions(flags, rng); @@ -377,6 +380,7 @@ public async Task Randomize(Blob seed, Flags flags, Preferences preferences) // Fun Stuff ChangeLute(preferences.ChangeLute, Dialogues, new MT19337(funRng.Next())); + ChangeFountainText(preferences.FunFountainText, Dialogues, new MT19337(funRng.Next())); TitanSnack(preferences.TitanSnack, NpcData, Dialogues, new MT19337(funRng.Next())); HurrayDwarfFate(preferences.HurrayDwarfFate, NpcData, Dialogues, new MT19337(funRng.Next())); PaletteSwap(preferences.PaletteSwap && !flags.EnemizerEnabled, new MT19337(funRng.Next())); @@ -443,5 +447,6 @@ public async Task Randomize(Blob seed, Flags flags, Preferences preferences) if (flags.TournamentSafe) Put(0x3FFE3, Blob.FromHex("66696E616C2066616E74617379")); await this.Progress("Randomization Completed"); + return flags; } } diff --git a/FF1Lib/RelocateChests.cs b/FF1Lib/RelocateChests.cs index 39efcff2d..af22ba370 100644 --- a/FF1Lib/RelocateChests.cs +++ b/FF1Lib/RelocateChests.cs @@ -383,7 +383,7 @@ public async Task shuffleChestLocations(MT19337 rng, StandardMaps maps, TileSets hasNpc = true; if (npcdata != null) { - List killableTalks = new() { TalkScripts.Talk_fight, TalkScripts.Talk_kill, TalkScripts.Talk_FightBranched }; + List killableTalks = new() { TalkScripts.Talk_fight, TalkScripts.Talk_kill, TalkScripts.Talk_FightBranched, TalkScripts.Talk_CoOGuy }; hasKillableNpc = killableTalks.Contains(npcdata[npc.ObjectId].Script); } room.npcs.Add(me); diff --git a/FF1Lib/RelocateChestsChestPicker.cs b/FF1Lib/RelocateChestsChestPicker.cs index e47190d28..a3ee420ee 100644 --- a/FF1Lib/RelocateChestsChestPicker.cs +++ b/FF1Lib/RelocateChestsChestPicker.cs @@ -261,7 +261,7 @@ public TileCandidate GetCandidate(Room room, int chestCount, MT19337 rng) var totalPlacedCount = Candidates.Where(c => c.RoomIndex == candidate.RoomIndex && c.MapIndex == candidate.MapIndex).Count(c => c.Placed); var reachedPlacedCount = reachedCandidates.Count(c => c.Placed); - var validTiles = Candidates.Where(c => (c.RoomIndex == candidate.RoomIndex && c.MapIndex == candidate.MapIndex) || c.MapIndex != candidate.MapIndex).Count(c => c.Placeable); + var validTiles = Candidates.Where(c => (c.RoomIndex != candidate.RoomIndex && c.MapIndex == candidate.MapIndex) || c.MapIndex != candidate.MapIndex).Count(c => c.Placeable); var reachedTiles = reachedCandidates.Count(c => c.Placeable); // If we couldn't reach all placed tiles, this is a bad tile, mark it and remove it from the pool diff --git a/FF1Lib/ResourcePack.cs b/FF1Lib/ResourcePack.cs index 6de319140..3830b70e4 100644 --- a/FF1Lib/ResourcePack.cs +++ b/FF1Lib/ResourcePack.cs @@ -86,8 +86,19 @@ await SetCustomMapGraphics(s, 128, 4, } } + var npcs = resourcePackArchive.GetEntry("npcs.png"); + if (npcs != null) + { + using (var s = npcs.Open()) + { + SetCustomNPCGraphics(s); + } + } + } + + } async Task LoadResourcePackPostROM(string resourcepack, DialogueData dialogues, EnemyScripts enemyScripts, Preferences preferences) { @@ -125,6 +136,8 @@ async Task LoadResourcePackPostROM(string resourcepack, DialogueData dialogues, } } + + var fiends = resourcePackArchive.GetEntry("fiends.png"); if (fiends != null) { diff --git a/FF1Lib/RngTables.cs b/FF1Lib/RngTables.cs index 02679a6b3..dcc303a42 100644 --- a/FF1Lib/RngTables.cs +++ b/FF1Lib/RngTables.cs @@ -24,7 +24,7 @@ public class RngTables private const int BattleStepRNGOffset = 0xC571; // Bank 1F private ushort BattleStepSeed; private const int BattleStepSeedOffset = 0xDB09; // two unused bytes in Bank 1F - private const int LoadPRNGSeedOnPartyGenOffset = 0x8C00; // Bank 1E + private const int LoadPRNGSeedOnPartyGenOffset = 0x86E0; // Bank 1E private List BattleRNG; private List EncounterRNG; @@ -72,7 +72,7 @@ public void Write(FF1Rom rom, Flags flags) { // just after partygen is confirmed, this executes the subroutine to // write the battlestep seed into sram - rom.PutInBank(0x1E, 0x806B, Blob.FromHex("EAEA20008C")); + rom.PutInBank(0x1E, 0x806B, Blob.FromHex("EAEA20E086")); rom.PutInBank(0x1E, LoadPRNGSeedOnPartyGenOffset, Blob.FromHex("A9008D0120AD09DB8DF06FAD0ADB8DF16F60")); // write the prng over the subroutine that followed the encounter table diff --git a/FF1Lib/Sanity/SCMap.cs b/FF1Lib/Sanity/SCMap.cs index 90d94ac48..7c78cf969 100644 --- a/FF1Lib/Sanity/SCMap.cs +++ b/FF1Lib/Sanity/SCMap.cs @@ -169,20 +169,20 @@ private void ProcessNPC(ref MapObject npc) switch(npc.ObjectId) { case ObjectId.SubEngineer: - Tiles[npc.Coords.X, npc.Coords.Y].Tile = SCBitFlags.Oxyale; + Tiles[npc.Coords.X, npc.Coords.Y].Tile |= SCBitFlags.Oxyale; break; case ObjectId.Titan: - Tiles[npc.Coords.X, npc.Coords.Y].Tile = SCBitFlags.Ruby; + Tiles[npc.Coords.X, npc.Coords.Y].Tile |= SCBitFlags.Ruby; break; case ObjectId.BlackOrb: - Tiles[npc.Coords.X, npc.Coords.Y].Tile = SCBitFlags.Orbs; + Tiles[npc.Coords.X, npc.Coords.Y].Tile |= SCBitFlags.Orbs; break; case ObjectId.LutePlate: - Tiles[npc.Coords.X, npc.Coords.Y].Tile = SCBitFlags.Lute; + Tiles[npc.Coords.X, npc.Coords.Y].Tile |= SCBitFlags.Lute; CheckUseLuteRodSanity(npc.Coords.X, npc.Coords.Y, SCBitFlags.UseLute, ObjectId.LutePlate); break; case ObjectId.RodPlate: - Tiles[npc.Coords.X, npc.Coords.Y].Tile = SCBitFlags.Rod; + Tiles[npc.Coords.X, npc.Coords.Y].Tile |= SCBitFlags.Rod; CheckUseLuteRodSanity(npc.Coords.X, npc.Coords.Y, SCBitFlags.UseRod, ObjectId.RodPlate); break; default: @@ -212,17 +212,17 @@ private void ProcessDefaultNPCs(ref MapObject npc) ProcessQuestNpc(ref npc); break; case TalkScripts.Talk_Nerrick: - Tiles[npc.Coords.X, npc.Coords.Y].Tile = SCBitFlags.Tnt; + Tiles[npc.Coords.X, npc.Coords.Y].Tile |= SCBitFlags.Tnt; ProcessQuestNpc(ref npc); break; case TalkScripts.NoOW_Floater: - Tiles[npc.Coords.X, npc.Coords.Y].Tile = SCBitFlags.Floater; + Tiles[npc.Coords.X, npc.Coords.Y].Tile |= SCBitFlags.Floater; break; case TalkScripts.NoOW_Chime: - Tiles[npc.Coords.X, npc.Coords.Y].Tile = SCBitFlags.Chime; + Tiles[npc.Coords.X, npc.Coords.Y].Tile |= SCBitFlags.Chime; break; case TalkScripts.NoOW_Canoe: - Tiles[npc.Coords.X, npc.Coords.Y].Tile = SCBitFlags.Canoe; + Tiles[npc.Coords.X, npc.Coords.Y].Tile |= SCBitFlags.Canoe; break; default: if (npc.ObjectId == ObjectId.Princess1 || npc.ObjectId == ObjectId.Vampire || npc.ObjectId == ObjectId.ElfDoc || npc.ObjectId == ObjectId.Unne) diff --git a/FF1Lib/Sanity/SanityCheckerV2.cs b/FF1Lib/Sanity/SanityCheckerV2.cs index cb239dffd..1d6b1c889 100644 --- a/FF1Lib/Sanity/SanityCheckerV2.cs +++ b/FF1Lib/Sanity/SanityCheckerV2.cs @@ -810,6 +810,7 @@ private void BuildInitialRequirements(IVictoryConditionFlags victoryConditions, { changes |= MapChange.Airship; airShipLocationAccessible = true; + LiftOff(); } if (victoryConditions.IsCanalFree ?? false) { diff --git a/FF1Lib/Scale.cs b/FF1Lib/Scale.cs index 5a789a299..6f8980fd9 100644 --- a/FF1Lib/Scale.cs +++ b/FF1Lib/Scale.cs @@ -248,6 +248,27 @@ public int GetEvadeIntFromFlag(EvadeCapValues evadeCapFlag) return evadeCap; } + public void ScaleSleep(MT19337 rng, Flags flags) + { + // fix the enemy sleep buffer; Currently this hard locks the game :/ + // PutInBank(0x0C,0xB1E9,Blob.FromHex("A90020AF0AAD68571004A902D007A9DF20B190A90F4CB28E")); + + // if (flags.PlayerSleepScaleLow == 0 && flags.PlayerSleepScaleHigh == 80 && flags.EnemySleepScaleLow == 0 && flags.EnemySleepScaleHigh == 80) + if (flags.PlayerSleepScaleLow == 0 && flags.PlayerSleepScaleHigh == 80) + { + return; + } + + string minPlayerSleep = (bool)flags.ClampMinimumStatScale ? 0.ToString("X") : flags.PlayerSleepScaleLow.ToString("X"); + string highPlayerSleep = (bool)flags.ClampMinimumStatScale ? Math.Max(255, flags.PlayerSleepScaleHigh).ToString("X") : flags.PlayerSleepScaleHigh.ToString("X"); + // string minEnemySleep = (bool)flags.ClampMinimumStatScale ? 0.ToString("X") : flags.EnemySleepScaleLow.ToString("X"); + // string highEnemySleep = (bool)flags.ClampMinimumStatScale ? Math.Max(255, flags.EnemySleepScaleHigh).ToString("X") : flags.EnemySleepScaleHigh.ToString("X"); + + PutInBank(0x0C,0xA435,Blob.FromHex(minPlayerSleep)); + PutInBank(0x0C,0xA437,Blob.FromHex(highPlayerSleep)); + // PutInBank(0x0C,0xB1E2,Blob.FromHex(minEnemySleep)); + // PutInBank(0x0C,0xB1E4,Blob.FromHex(highEnemySleep)); + } public void ScaleEnemyStats(MT19337 rng, Flags flags) { diff --git a/FF1Lib/ShopInformation.cs b/FF1Lib/ShopInformation.cs index 064e65ee0..1ed542fc5 100644 --- a/FF1Lib/ShopInformation.cs +++ b/FF1Lib/ShopInformation.cs @@ -103,11 +103,11 @@ public enum shopInfoWordsIndex }; public void ShopUpgrade(Flags flags, DialogueData dialogues, Preferences preferences) { - if (!flags.ShopInfo) - { - return; - } - + if (!flags.ShopInfo) + { + return; + } + // Modify DrawShopPartySprites to use new DrawOBSprite routines, see 0E_9500_ShopUpgrade.asm PutInBank(0x0E, 0xAA04, Blob.FromHex("205795")); PutInBank(0x0E, 0xAA0D, Blob.FromHex("205795")); @@ -120,8 +120,8 @@ public void ShopUpgrade(Flags flags, DialogueData dialogues, Preferences prefere PutInBank(0x0E, 0x9500, Blob.FromHex("A564C928F038A566C904B035C902B017A20020D495A24020D495A28020D495A2C020D4954C4195A200208B95A240208B95A280208B95A2C0208B954C41952047952027A74C2696A9008DD66A8DDA6A8DDE6A8DE26A6060AA4A8510BD0061A8B9A4EC8511BD0161F011C901F0E9C903F004A9038511A9144C8395A5104A4A4AAABDD66A18651085104C24EC8A8515BD00610AAABD00AD8510BD01AD8511A662BD000338E9B0851229078513A5124A4A4AA8B1108514A613BD38AC2514F005A9004CC595A90E8510A5154A4A4A4AAAA5109DD66A608A8515BD00610AAABDB9BC8512BDBABC8513A662BD000338C944B01638E91C0AAABD50BF25128510BD51BF251305104C1896E9440AAABDA0BF25128510BDA1BF25130510C9019005A9004CC595A90E4CC595A522F033A564C928F02DA662BD00038514205E962027A7A520C561F0F7A9008522204D964C46E1A9018538A9128539A90E853CA90A853D60204D96A90E85572063E0A53E8512A53F8513A514380AAAB00DBD0093853EBD0193853F4C8E96BD0094853EBD0194853FA9118557A90E85582036DEA512853EA513853FA900852260")); if (flags.ChestInfo && flags.IdentifyTreasures && !preferences.RenounceChestInfo) - { - // Shorten TreasureChest Dialog + { + // Shorten TreasureChest Dialog dialogues[320] = "You found.. #"; dialogues[321] = "Can't hold.. #"; @@ -135,11 +135,11 @@ public void ShopUpgrade(Flags flags, DialogueData dialogues, Preferences prefere // Patch in the equip menu loop to add gear info PutInBank(0x0E, 0xBB8F, Blob.FromHex("4CE090EA")); - // Patch in the magic menu loop to add spell info - if (!flags.MagicMenuSpellReordering) - { - //MagicMenuSpellReordering overwrites this jump - PutInBank(0x0E, 0xAECD, Blob.FromHex("4C2691EA")); + // Patch in the magic menu loop to add spell info + if (!flags.MagicMenuSpellReordering) + { + //MagicMenuSpellReordering overwrites this jump + PutInBank(0x0E, 0xAECD, Blob.FromHex("4C2691EA")); } // the UpgradedEquipMenu and UpgradedMagicMenu code that the above patches jump to PutInBank(0x0E, 0x90E0, Blob.FromHex("A525D007A522D0044C93BB60A662BD0003F030297FA466C018D005691A4C029169428514203CC4205E9620F9BCA520C561F0F7A9008D0120853720F3BD2083B720DAEC4C93BBA525D007A522D0044CD1AE60A9018537A5664A6A6A0562AA0A2900187D00631869AF8514205E962080B72025B6A9008D01208537857F20029CA56248206DBA688562A90720EFB8A9292059B92080B74CD1AE")); @@ -271,12 +271,12 @@ public string GenerateEquipPermission(int classUsability) { } else if ((classUsability & InfoClassEquipPerms[i*2+1]) != 0) { description += " " + InfoClassAbbrev[i*2+1]; } - } - description = description.Trim(); - if (description.Length > 12) - { - description = description.Replace(" ", ""); - } + } + description = description.Trim(); + if (description.Length > 12) + { + description = description.Replace(" ", ""); + } if (description == "FiThBbRmWmBm") { description = "All classes"; } diff --git a/FF1Lib/Shops.cs b/FF1Lib/Shops.cs index e8f537d71..4444809e4 100644 --- a/FF1Lib/Shops.cs +++ b/FF1Lib/Shops.cs @@ -71,29 +71,35 @@ public void ShuffleMagicLocations(bool enable, bool keepPairs, MT19337 rng) private void ShuffleShopType(ShopType shopType, MT19337 rng, bool randomize = false, IEnumerable excludeItemsFromRandomShops = null, WorldWealthMode wealth = WorldWealthMode.Standard) { var shops = Shops.Where(s => s.Type == shopType).ToList(); - var newShopEntries = shops.ToDictionary(s => s.Index, s => new List()); + Dictionary> newShopEntries; bool shopsBlocked; - bool requiredAdded = false; do { shopsBlocked = false; + // Get shops + newShopEntries = shops.ToDictionary(s => s.Index, s => new List()); + // Get Shop Items var allEntries = shops.SelectMany(s => s.Entries).ToList(); allEntries.Shuffle(rng); + int entry = 0; + // Insert guaranteed items - if (shopType == ShopType.Item && (bool)flags.ImmediatePureAndSoftRequired && !requiredAdded) + if (shopType == ShopType.Item && (bool)flags.ImmediatePureAndSoftRequired) { + // Reorder list so 2 first items are pure and soft allEntries.Remove(Item.Pure); allEntries.Remove(Item.Soft); + allEntries = new List() { Item.Pure, Item.Soft }.Concat(allEntries).ToList(); - newShopEntries[60 + coneriaEntranceShopIndex].AddRange(new List(){ Item.Pure, Item.Soft }); - requiredAdded = true; + newShopEntries[60 + coneriaEntranceShopIndex].Add(allEntries[entry++]); + newShopEntries[60 + coneriaEntranceShopIndex].Add(allEntries[entry++]); } - int entry = 0; + // Each shop contain at least one item foreach (var shop in newShopEntries) { if (!shop.Value.Any()) diff --git a/FF1Lib/SpikeTile.cs b/FF1Lib/SpikeTile.cs index 43786a2db..6bbe17ab0 100644 --- a/FF1Lib/SpikeTile.cs +++ b/FF1Lib/SpikeTile.cs @@ -20,8 +20,12 @@ public enum TrapTileMode LocalFormations, [Description("Remove Trap Tiles")] Remove, + [Description("Undead Only")] + Undead, [Description("Curated")] - Curated + Curated, + [Description("Overpowered")] + Overpowered } public enum TrapTileOffsets : int @@ -125,7 +129,7 @@ public void UpdateTrapTiles(FF1Rom rom, ZoneFormations zoneformations, Flags fla } else { - ShuffleTrapTiles(zoneformations, rng, mode, (bool)flags.FightBahamut); + ShuffleTrapTiles(zoneformations, rng, mode, (bool)flags.FightBahamut, flags.AllowUnsafePlacement, flags.WarMECHMode); } } @@ -163,7 +167,7 @@ public void RemoveTrapTiles(bool extendedtraptiles) } } - public void ShuffleTrapTiles(ZoneFormations zoneformations, MT19337 rng, TrapTileMode mode, bool fightBahamut) + public void ShuffleTrapTiles(ZoneFormations zoneformations, MT19337 rng, TrapTileMode mode, bool fightBahamut, bool unsafePlacement, WarMECHMode mechMode) { if (mode == TrapTileMode.LocalFormations) { @@ -238,7 +242,7 @@ public void ShuffleTrapTiles(ZoneFormations zoneformations, MT19337 rng, TrapTil encounters = encounters.Except(FormationLists.BahamutEncounter).ToList(); } } - else + else if (mode == TrapTileMode.Curated) { //balanced/curated mode //this mode is really just in here so tournament organizers know that it's possible @@ -273,7 +277,214 @@ public void ShuffleTrapTiles(ZoneFormations zoneformations, MT19337 rng, TrapTil encounters.Remove(0x71); // ANKYLO (used for Bahamut) } } + else if (mode == TrapTileMode.Undead) + { + //all random + encounters = new(FormationLists.ASideEncounters); + //if (fightBahamut) + //{ + // encounters = encounters.Except(FormationLists.BahamutEncounter).ToList(); + //} + + for (int i = encounters.Count - 1; i > 4; i--) + { + //remove all encounters + //encounters.RemoveAt(i); + encounters.Remove((byte)i); + } + + encounters.Add(0x01); // Bones + encounters.Add(0x01 + 0x80); // Bones and Crawls + + encounters.Add(0x04); // Zombies + encounters.Add(0x04 + 0x80); // Zombies and Ghouls + + encounters.Add(0x08); // Ghoul + encounters.Add(0x08 + 0x80); // Geists and Ghouls + + encounters.Add(0x0A); // Shadows + encounters.Add(0x0A + 0x80); // Shadows + + encounters.Add(0x04); // Giests + encounters.Add(0x04 + 0x80); // Geists and Specters + + encounters.Add(0x18); // Images + encounters.Add(0x18 + 0x80); // Images and Wraiths + + encounters.Add(0x1D); // Mummies + encounters.Add(0x1D + 0x80); // Mummies and Wzmummy + + encounters.Add(0x2B); // Bones, RBone, Crawl + encounters.Add(0x2B + 0x80); // RBones + + encounters.Add(0x2C); // Images, Wraiths, Specters, Geists + encounters.Add(0x2C + 0x80); // Wraiths + + encounters.Add(0x2F); // Mages + encounters.Add(0x2F + 0x80); // Mages and Fighter + + encounters.Add(0x32); // ZomBULLs + encounters.Add(0x32 + 0x80); // ZomBULLs and Trolls + + encounters.Add(0x46); // Phantom + encounters.Add(0x46 + 0x80); // Ghosts + + encounters.Add(0x4A); // WzMummies, Mummies, Perilisks, Coctrices + encounters.Add(0x4A + 0x80); // WzMummies, Mummies + + encounters.Add(0x4B); // ZombieDs + encounters.Add(0x4B + 0x80); // ZombieDs + + encounters.Add(0x53); // WzVamps + encounters.Add(0x53 + 0x80); // WzVamps and ZombieDs + + encounters.Add(0x56 + 0x80); // Fighters + + encounters.Add(0x68); // Vamps + encounters.Add(0x68 + 0x80); // WzVamp, Vamps + + encounters.Add(0x69); // Eye + //encounters.Add(0x69 + 0x80); // Eyes + + + encounters.Remove(0x71); // ANKYLO + encounters.Remove(0x72); // Seasneak + + encounters.Remove(0x04); + encounters.Remove(0x03); + encounters.Remove(0x02); + encounters.Remove(0x01); + encounters.Remove(0x00); + } + else + { + //UNbalanced/curated mode + //this mode is really just in here so we have the option to make spike tiles overpowered + encounters = new(FormationLists.AllRandomEncounters); + + if (unsafePlacement || mechMode == WarMECHMode.All) { + encounters.Add(0x56); + } + + + /* + //keep the god grinds + encounters.Remove(0x69); //1 eye tile. + encounters.Remove(0x69 + 0x80); //3 eye tile. + encounters.Remove(0x56 + 0x80); //2 fighter. + encounters.Remove(0x3C); //1 sandworm + encounters.Remove(0x3C + 0x80); //1-2 sandworm + */ + + //remove the too hard/annoying encounters + encounters.Remove(0x21 + 0x80); //2-4 Earth + encounters.Remove(0x27 + 0x80); //3-4 Fire + encounters.Remove(0x38); //1-2 rankylo + encounters.Remove(0x38 + 0x80); //4 rankylo + //encounters.Remove(0x4E + 0x80); //3 blue d + //encounters.Remove(0x3B + 0x80); //3-4 chimera + encounters.Remove(0x4D + 0x80); //5-9 badmen + //encounters.Remove(0x49 + 0x80); //3-6 waters + encounters.Remove(0x51 + 0x80); //3-6 airs + //encounters.Remove(0x57 + 0x80); //3-4 worm + + //remove the worst enemies in the game + encounters.Remove(0x6A); //2-5 rgoyles + encounters.Remove(0x6A + 0x80); //3-7 rgoyles + + //foreach (var tileset in tileSets) + //{ + // tileset.Tiles.ForEach(tile => + //if (fightBahamut) + //{ + encounters.Remove(0x80 + 0x71); // ANKYLO (used for Bahamut) + encounters.Remove(0x71); // ANKYLO (used for Bahamut) + //} + //these can be not on the list regardless of whether fight Bahamut is on + //remove most of the encounters + for (int i = 0; i < 0x17; i++) { //stop before Pedes 0x17 + encounters.Remove((byte)i); + encounters.Remove((byte)(0x80 + i)); + } + encounters.Remove(0x80 + 0x17); + for (int i = 0x18; i < 0x1E; i++) //stop before Giants 0x1E + { + encounters.Remove((byte)i); + encounters.Remove((byte)(0x80 + i)); + } + encounters.Remove(0x80 + 0x1E); + for (int i = 0x1F; i < 0x24; i++) //stop before R.Hydra 0x24 and Ochos 0x25 and R.Giants 0x26 + { + encounters.Remove((byte)i); + encounters.Remove((byte)(0x80 + i)); + } + encounters.Remove(0x80 + 0x25); + encounters.Remove(0x27); //1-2 fires + encounters.Remove(0x28); // grey Worm + encounters.Remove(0x80 + 0x28); + //skip 0x29 agama and 0x2A Red D + encounters.Remove(0x2B); + encounters.Remove(0x2C); + encounters.Remove(0x80 + 0x2B); + encounters.Remove(0x80 + 0x2C); + //skip FrWolfs 0x2D + encounters.Remove(0x2E); //FrWolfs + FrGiants + encounters.Remove(0x80 + 0x2E); //FrWolfs + FrGiants + //skip Mages 0x2F + for (int i = 0x30; i < 0x3B; i++) //stop before Chimeras 0x3B, sandworm, and both steaks 0x3E + { + encounters.Remove((byte)i); + encounters.Remove((byte)(0x80 + i)); + } + encounters.Remove(0x80 + 0x3E); + encounters.Remove(0x3F);//mud gols + encounters.Remove(0x08 + 0x3F);//mud gols + encounters.Remove(0x40);//grmedusas + encounters.Remove(0x80 + 0x40);//grmedusas + //NOACHO skip 0x41 + for (int i = 0x42; i < 0x45; i++) //stop before GrShark+WizSahag 0x45 + { + encounters.Remove((byte)i); + } + encounters.Remove(0x80 + 0x45); + encounters.Remove(0x46);//Phantom + encounters.Remove(0x80 + 0x46); + encounters.Remove(0x47);//Naga Water + //skip bigeye grshark 0x48 + encounters.Remove(0x49);//1-3 waters + //skip wizMumies 0x4A and Zombie Ds 0x4B + encounters.Remove(0x4A);//mummies, wiz mumies, conctrice + encounters.Remove(0x80 + 0x4A); + for (int i = 0x4C; i < 0x4E; i++) //stop before Blue D 0x4E + { + encounters.Remove((byte)i); + } + encounters.Remove(0x80 + 0x4C); + encounters.Remove(0x4F);//nitemares + encounters.Remove(0x80 + 0x4F);//nitemares + //skip slimes 0x50 + encounters.Remove(0x51);//2-4 air + encounters.Remove(0x80 + 0x51); + encounters.Remove(0x52);//Gr Naga + air + encounters.Remove(0x80 + 0x52); + //skip wz vamps + encounters.Remove(0x54);//Nitemares + evilman + encounters.Remove(0x80 + 0x54); + //skip Jimera, Warmech, Worms, RockGol, Gas D, + encounters.Remove(0x80 + 0x55); + for (int i = 0x5A; i < 0x69; i++) //stop before Eye 0x69 + { + encounters.Remove((byte)i); + encounters.Remove((byte)(0x80 + i)); + } + for (int i = 0x6A; i < 0x73; i++) //stop before Lich 0x73 + { + encounters.Remove((byte)i); + encounters.Remove((byte)(0x80 + i)); + } + encounters.Remove(0x80 + 0x7E);//R + Wiz Sahags + } foreach (var tileset in tileSets) { diff --git a/FF1Lib/Sprites.cs b/FF1Lib/Sprites.cs index f108aa3c9..26987dbba 100644 --- a/FF1Lib/Sprites.cs +++ b/FF1Lib/Sprites.cs @@ -11,12 +11,17 @@ namespace FF1Lib public partial class FF1Rom : NesRom { // Copied from FFHackster. + // LATER fix these so they use banks and offsets within banks. const int CHARBATTLEPIC_OFFSET = 0x25000; const int MAPMANGRAPHIC_OFFSET = 0x9000; const int VEHICLEGRAPHIC_OFFSET = 0x9D00; + const int NPCGRAPHIC_OFFSET = 0xA200; + + const int SHOPKEEPERGRAPHIC_OFFSET = 0x24080; + const int BATTLEPATTERNTABLE_OFFSET = 0x1C000; // nametables @@ -1358,13 +1363,115 @@ public async Task SetCustomBattleBackdrop(Stream backdrop) { // Color 3; dark main color // Follow the reference enemy sprite sheet for how these map to the Grayscale palette. Dictionary GrayscaleIndex = new Dictionary { - { new Rgba32(0x00, 0x00, 0x00), 0 }, - { new Rgba32(0xff, 0xff, 0xff), 1 }, - { new Rgba32(0xbd, 0xbd, 0xbd), 2 }, - { new Rgba32(0x7b, 0x7b, 0x7b), 3 } + { new Rgba32(0x00, 0x00, 0x00), 0 }, //black + { new Rgba32(0xff, 0xff, 0xff), 1 }, // white + { new Rgba32(0xbd, 0xbd, 0xbd), 2 }, //light gray + { new Rgba32(0x7b, 0x7b, 0x7b), 3 } //dark gray + }; + + // flip dark and light gray here in order to to make the shades similar to those in vanilla + Dictionary NPCGrayscaleIndex = new Dictionary { + { new Rgba32(0xff, 0x00, 0xff), 0 }, //magenta as transparent + { new Rgba32(0x00, 0x00, 0x00), 1 }, //black + { new Rgba32(0x7b, 0x7b, 0x7b), 2 }, //dark gray + { new Rgba32(0xbd, 0xbd, 0xbd), 3 } //light gray }; + public void SetCustomNPCGraphics(Stream stream) { + Image image = Image.Load(stream); + + const int SHOPKEEPERGRAPHIC_SKIP = 0xE0; + + + + + bool allColorsGood = true; + // n is an iterator for successive 8x8 tiles in the ROM, added to the various offsets. + int n = 0; + // first process the shopkeepers + // sk for x"shopkeeper" + for (int sk = 0; sk < 8; sk++) + { + //skx is the x coordinate of successive shopkeepers + int skx = sk * 16; + + + // n needs to be reset for each shopkeeper + n = 0; + + for (int y = 0; y < 24; y+=8) + { + for (int x = 0; x < 16; x+=8) + { + byte[] tile; + try + { + tile = makeTile(image, y, skx+x, GrayscaleIndex); + } + catch (KeyNotFoundException) + { + if (allColorsGood) + { + Task task = Progress("WARNING: npcs.png contains incorrect colors. Quantizing."); + allColorsGood = false; + } + tile = makeTileQuantize(image, y, skx+x, GrayscaleIndex); + } + Put(SHOPKEEPERGRAPHIC_OFFSET + sk*SHOPKEEPERGRAPHIC_SKIP + n*16, EncodeForPPU(tile)); + n++; + } + } + } + + + // next process the NPCs. we are leaving out the orb and plate map objects, so we have to skip those in the ROM. + // 28 npcs total + allColorsGood = true; + // n is an iterator for successive 8x8 tiles in the ROM, added to the various offsets. + // the NPC sprites are contiguous in ROM, so no need to reset it in this for loop. + n = 0; + + for (int npc = 0; npc < 28; npc++) + { + int side = npc % 2; + int row = npc / 2; + + for (int sprite = 0; sprite < 4; sprite++) + { + for (int y = 0; y < 16; y+=8) + { + for (int x = 0; x < 16; x+=8) + { + byte[] tile; + try + { + tile = makeTile(image, row*16 + y + 24, side*64 + sprite*16 + x, NPCGrayscaleIndex); + } + catch (KeyNotFoundException) + { + if (allColorsGood) + { + Task task = Progress("WARNING: npcs.png contains incorrect colors. Quantizing."); + allColorsGood = false; + } + tile = makeTileQuantize(image, row*16 + y + 24, side*64 + sprite*16 + x, NPCGrayscaleIndex); + } + Put(NPCGRAPHIC_OFFSET + n*16, EncodeForPPU(tile)); + n++; + //each NPC is 16 tiles. In the ROM, orb is NPC 4 and plate is NPC 27; we skip those here. + if (n == 4*16 || n == 27*16) + { + n+=16; + } + + } + } + } + } + } + + public void SetRobotChickenGraphics(Preferences preferences) { if (preferences.RobotChicken) diff --git a/FF1Lib/StandardMaps/FlippedMaps.cs b/FF1Lib/StandardMaps/FlippedMaps.cs index d73c0263a..9ddf3c111 100644 --- a/FF1Lib/StandardMaps/FlippedMaps.cs +++ b/FF1Lib/StandardMaps/FlippedMaps.cs @@ -78,7 +78,7 @@ public List VerticalFlipStep1() ValidMaps_Vertical.Shuffle(rng); mapsToFlipVertically = ValidMaps_Vertical.GetRange(0, rng.Between((int)(ValidMaps_Vertical.Count * 0.33), (int)(ValidMaps_Vertical.Count * 0.75))); - if (flags.EFGWaterfall) mapsToFlipVertically.Remove(MapIndex.Waterfall); + //if (flags.EFGWaterfall) mapsToFlipVertically.Remove(MapIndex.Waterfall); /* foreach (var MapIndex in mapsToFlipVertically) @@ -467,7 +467,7 @@ public List HorizontalFlip(MT19337 rng, StandardMaps maps, Teleporters ValidMaps_Horizontal.Shuffle(rng); var mapsToFlip = ValidMaps_Horizontal.GetRange(0, rng.Between((int)(ValidMaps_Horizontal.Count * 0.33), (int)(ValidMaps_Horizontal.Count * 0.75))); - if (flags.EFGWaterfall) mapsToFlip.Remove(MapIndex.Waterfall); + //if (flags.EFGWaterfall) mapsToFlip.Remove(MapIndex.Waterfall); foreach (MapIndex map in mapsToFlip) { diff --git a/FF1Lib/StandardMaps/SMUpdates.cs b/FF1Lib/StandardMaps/SMUpdates.cs index 030e930fa..8fe7be627 100644 --- a/FF1Lib/StandardMaps/SMUpdates.cs +++ b/FF1Lib/StandardMaps/SMUpdates.cs @@ -23,7 +23,7 @@ public void ProcgenDungeons(MT19337 rng) // } } - ProcgenWaterfall((bool)flags.EFGWaterfall, teleporters, mapObjects[(int)MapIndex.Waterfall], rng); + //ProcgenWaterfall((bool)flags.EFGWaterfall, teleporters, mapObjects[(int)MapIndex.Waterfall], rng); FlipMaps(flags, rng); } public void Update(ZoneFormations formations, MT19337 rng) @@ -33,6 +33,7 @@ public void Update(ZoneFormations formations, MT19337 rng) EnableMelmondClinic((bool)flags.MelmondClinic); RandomVampireAttack((bool)flags.RandomVampAttack, (bool)flags.LefeinShops, (bool)flags.RandomVampAttackIncludesConeria, rng); ShufflePravoka((bool)flags.ShufflePravokaShops, AttackedTown == MapIndex.Pravoka, rng); + EnableLefeinShortcut((bool)flags.LefeinShortcut); EnableGaiaShortcut((bool)flags.GaiaShortcut); MoveGaiaItemShop((bool)flags.MoveGaiaItemShop && (bool)flags.GaiaShortcut, rng); EnableLefeinSuperStore((bool)flags.LefeinSuperStore && (flags.ShopKillMode_White == ShopKillMode.None && flags.ShopKillMode_Black == ShopKillMode.None), flags.NoOverworld); @@ -83,7 +84,7 @@ private void FlipMaps(Flags flags, MT19337 rng) var mapFlipper = new FlippedMaps(rom, this, flags, teleporters, rng); VerticalFlippedMaps = mapFlipper.VerticalFlipStep1(); - if ((bool)flags.ReversedFloors) new ReversedFloors(rom, this, rng, teleporters, VerticalFlippedMaps).Work((bool)flags.ProcgenEarth); + if ((bool)flags.ReversedFloors && (flags.GameMode == GameModes.Standard)) new ReversedFloors(rom, this, rng, teleporters, VerticalFlippedMaps).Work((bool)flags.ProcgenEarth); if((bool)flags.VerticallyFlipDungeons) mapFlipper.VerticalFlipStep2(); @@ -217,6 +218,16 @@ private void ShufflePravoka(bool shufflepravokashops, bool blightedPravoka, MT19 maps[(int)MapIndex.Pravoka][coord.y + 1, coord.x] = shop.door; } } + private void EnableLefeinShortcut(bool lefeinshortcut) + { + if (!lefeinshortcut) + { + return; + } + + maps[(byte)MapIndex.Lefein][21, 23] = (byte)Tile.TownHorizonalBridge; + maps[(byte)MapIndex.Lefein][21, 15] = (byte)Tile.TownHorizonalBridge; + } private void EnableGaiaShortcut(bool gaiashortcut) { if (!gaiashortcut) diff --git a/FF1Lib/TempleOfFiends.cs b/FF1Lib/TempleOfFiends.cs index 0da8c1c06..c40fe46a6 100644 --- a/FF1Lib/TempleOfFiends.cs +++ b/FF1Lib/TempleOfFiends.cs @@ -24,6 +24,25 @@ public enum FiendsRefights None, [Description("Random")] Random, + } + public enum ShortToFRFiendsRefights + { + [Description("All")] + All, + [Description("Two Paths")] + TwoPaths, + [Description("Lopsided")] + Lopsided, + [Description("Progressive")] + Progressive, + [Description("Anything Goes")] + AnythingGoes, + [Description("Rude")] + Rude, + [Description("None")] + None, + [Description("Random")] + Random, } public partial class FF1Rom : NesRom { @@ -31,13 +50,14 @@ private void UpdateToFR(StandardMaps maps, Teleporters teleporters, TileSetsData { // Collapse Flags ToFRMode mode = flags.ToFRMode == ToFRMode.Random ? (ToFRMode)rng.Between(0, (Enum.GetNames(typeof(ToFRMode)).Length - 2)) : flags.ToFRMode; - FiendsRefights fiendsrefights = flags.FiendsRefights == FiendsRefights.Random ? (FiendsRefights)rng.Between(0, (Enum.GetNames(typeof(FiendsRefights)).Length - 2)) : flags.FiendsRefights; + FiendsRefights fiendsrefights = flags.FiendsRefights == FiendsRefights.Random ? (FiendsRefights)rng.Between(0, (Enum.GetNames(typeof(FiendsRefights)).Length - 2)) : flags.FiendsRefights; + ShortToFRFiendsRefights shorttofrfiendsrefights = flags.ShortToFRFiendsRefights == ShortToFRFiendsRefights.Random ? (ShortToFRFiendsRefights)rng.Between(0, (Enum.GetNames(typeof(ShortToFRFiendsRefights)).Length - 2)) : flags.ShortToFRFiendsRefights; if (flags.GameMode == GameModes.DeepDungeon) { if (mode == ToFRMode.Short) { - UpdateDeepDungeonToFR(maps, teleporters, tilesets, fiendsrefights, (bool)flags.ChaosFloorEncounters, rng); + UpdateDeepDungeonToFR(maps, flags, teleporters, tilesets, shorttofrfiendsrefights, (bool)flags.ChaosFloorEncounters, rng); return; } else @@ -66,7 +86,7 @@ private void UpdateToFR(StandardMaps maps, Teleporters teleporters, TileSetsData } else if (mode == ToFRMode.Short) { - ShortenToFR(maps, teleporters, fiendsrefights, true, false, rng); + ShortenToFR(maps, flags, teleporters, shorttofrfiendsrefights, true, false, rng); } // Update Fiends Refights @@ -100,11 +120,11 @@ private void UpdateToFR(StandardMaps maps, Teleporters teleporters, TileSetsData EnableChaosRush(tilesets); } } - private void UpdateDeepDungeonToFR(StandardMaps maps, Teleporters teleporters, TileSetsData tilesets, FiendsRefights fiendsRefights, bool chaosfloorsencouters, MT19337 rng) + private void UpdateDeepDungeonToFR(StandardMaps maps, Flags flags, Teleporters teleporters, TileSetsData tilesets, ShortToFRFiendsRefights shorttofrfiendsrefights, bool chaosfloorsencouters, MT19337 rng) { teleporters.StandardMapTeleporters[TeleportIndex.TempleOfFiends10] = new TeleportDestination(MapIndex.TempleOfFiendsRevisitedChaos, new Coordinate(0x0F, 0x03, CoordinateLocale.StandardInRoom)); - ShortenToFR(maps, teleporters, fiendsRefights, false, true, rng); + ShortenToFR(maps, flags, teleporters, shorttofrfiendsrefights, false, true, rng); // Add Encounters to Chaos' Floor if (chaosfloorsencouters) @@ -160,7 +180,7 @@ private void MidToFR(StandardMaps maps) maps[MapIndex.TempleOfFiendsRevisitedWater].Map[0x1B, 0x16] = 0x5C; maps[MapIndex.TempleOfFiendsRevisitedWater].Map[0x0F, 0x0F] = 0x5D; // Move Masa Chest } - private void ShortenToFR(StandardMaps maps, Teleporters teleporters, FiendsRefights fiendsrefights, bool addLutePlate, bool deepdungeon, MT19337 rng) + private void ShortenToFR(StandardMaps maps, Flags flags, Teleporters teleporters, ShortToFRFiendsRefights shorttofrfiendsrefights, bool addLutePlate, bool deepdungeon, MT19337 rng) { // Black Orb tile Warp destination change straight to an edit Chaos floor with all the ToFR Chests. if (!deepdungeon) @@ -184,15 +204,142 @@ private void ShortenToFR(StandardMaps maps, Teleporters teleporters, FiendsRefig var battles = new List { 0x57, 0x58, 0x59, 0x5A }; - if (fiendsrefights == FiendsRefights.All) + if (shorttofrfiendsrefights == ShortToFRFiendsRefights.All) { landingArea.Add(Blob.FromHex($"31{battles[3]:X2}{battles[2]:X2}{battles[1]:X2}{battles[0]:X2}31{battles[0]:X2}{battles[1]:X2}{battles[2]:X2}{battles[3]:X2}31")); } - else if (fiendsrefights == FiendsRefights.TwoPaths) + else if (shorttofrfiendsrefights == ShortToFRFiendsRefights.TwoPaths) { battles.Shuffle(rng); landingArea.Add(Blob.FromHex($"31{battles[0]:X2}3131{battles[1]:X2}31{battles[2]:X2}3131{battles[3]:X2}31")); - } + } + else if (shorttofrfiendsrefights == ShortToFRFiendsRefights.Lopsided) + { + // Roll 1d4 to see which fiend gets buffed. + int fiend = Rng.Between(rng, 0, 3); + byte buffedFiend = 0; + byte fiendReference = 0; + + // Roll 1d2 to see which side (left/right) will have the single buffed fiend. + bool flipLopsided = Rng.Between(rng, 0, 1) > 0; + + switch (fiend) + { + case 0: + buffedFiend = 0x57; + fiendReference = Enemy.Lich2; + battles = new List { 0x58, 0x59, 0x5A }; + break; + case 1: + buffedFiend = 0x58; + fiendReference = Enemy.Kary2; + battles = new List { 0x57, 0x59, 0x5A }; + break; + case 2: + buffedFiend = 0x59; + fiendReference = Enemy.Kraken2; + battles = new List { 0x57, 0x58, 0x5A }; + break; + case 3: + buffedFiend = 0x5A; + fiendReference = Enemy.Tiamat2; + battles = new List { 0x57, 0x58, 0x59 }; + break; + } + + battles.Shuffle(rng); + ScaleSingleEnemyStats(fiendReference, flags.BossScaleStatsLow * 2, flags.BossScaleStatsHigh * 2, flags.IncludeMorale, rng, + (bool)flags.SeparateBossHPScaling, flags.BossScaleHpLow * 2, flags.BossScaleHpHigh * 2, GetEvadeIntFromFlag(flags.EvadeCap)); + if (flipLopsided) + { + landingArea.Add(Blob.FromHex($"31313131{buffedFiend:X2}31{battles[0]:X2}{battles[1]:X2}{battles[2]:X2}3131")); + } + else + { + landingArea.Add(Blob.FromHex($"3131{battles[2]:X2}{battles[1]:X2}{battles[0]:X2}31{buffedFiend:X2}31313131")); + } + } + else if (shorttofrfiendsrefights == ShortToFRFiendsRefights.Progressive) + { + var easyBattles = new List { 0x57, 0x58 }; + var hardBattles = new List { 0x59, 0x5A }; + easyBattles.Shuffle(rng); + hardBattles.Shuffle(rng); + landingArea.Add(Blob.FromHex($"31{hardBattles[0]:X2}3131{easyBattles[0]:X2}31{easyBattles[1]:X2}3131{hardBattles[1]:X2}31")); + } + else if (shorttofrfiendsrefights == ShortToFRFiendsRefights.AnythingGoes) + { + /** + * 0 - No encounter + * 1 - Lich2 + * 2 - Kary2 + * 3 - Kraken2 + * 4 - Kraken2 + * 5 - Tiamat2 + * 6 - Tiamat2 **/ + String anythingGoesHex = "31"; + for (int i = 0; i < 8; i++) + { + int encounter = Rng.Between(rng, 0, 6); + switch (encounter) + { + case 0: // no encounter, 14.3% + anythingGoesHex += "31"; + break; + case 1: // lich2, 14.3% + anythingGoesHex += $"{0x57:X2}"; + break; + case 2: // kary2, 14.3% + anythingGoesHex += $"{0x58:X2}"; + break; + case 3: + case 4: // kraken2, 28.6% + anythingGoesHex += $"{0x59:X2}"; + break; + case 5: + case 6: // tiamat2, 28.6% + anythingGoesHex += $"{0x5A:X2}"; + break; + } + if (i == 3) + { + anythingGoesHex += "31"; // center tile + } + } + anythingGoesHex += "31"; + landingArea.Add(Blob.FromHex(anythingGoesHex)); + } + else if (shorttofrfiendsrefights == ShortToFRFiendsRefights.Rude) + { + // Mimic "All" option + landingArea.Add(Blob.FromHex($"31{battles[3]:X2}{battles[2]:X2}{battles[1]:X2}{battles[0]:X2}31{battles[0]:X2}{battles[1]:X2}{battles[2]:X2}{battles[3]:X2}31")); + + // Add 5th fiend encounter + int fiend = Rng.Between(rng, 0, 3); + byte extraFiend = 0; + extraFiend = 0x57; + switch (fiend) + { + case 0: // lich + extraFiend = 0x57; + break; + case 1: // kary + extraFiend = 0x58; + break; + case 2: // kraken + extraFiend = 0x59; + break; + case 3: // tiamat + extraFiend = 0x5A; + break; + } + maps[MapIndex.TempleOfFiendsRevisitedChaos].Map[22, 15] = (byte)extraFiend; + } + else + { + landingArea.Add(Blob.FromHex("3131313131313131313131")); + } + maps[MapIndex.TempleOfFiendsRevisitedChaos].Map.Put((0x0A, 0x00), landingArea.ToArray()); if (addLutePlate) diff --git a/FF1Lib/archipelago/Archipelago.cs b/FF1Lib/archipelago/Archipelago.cs index b9c184a9e..d9a27529a 100644 --- a/FF1Lib/archipelago/Archipelago.cs +++ b/FF1Lib/archipelago/Archipelago.cs @@ -87,11 +87,20 @@ public Archipelago(FF1Rom _rom, ItemPlacement _itemPlacement, SanityCheckerV2 ch case ArchipelagoEquipment.Incentivized: AddIncentivizedEquipment(kiPlacement, generatedPlacement); break; - } - - //Remove ToFr and distinct by address to remove duplicates - kiPlacement = kiPlacement.Where(r => !ItemLocations.ToFR.Any(l => l.Address == r.Address)).GroupBy(r => r.Address).Select(g => g.First()).ToList(); - + } + + //Remove ToFr and distinct by address to remove duplicates + if (flags.GameMode != GameModes.DeepDungeon) + { + kiPlacement = kiPlacement.Where(r => !ItemLocations.ToFR.Any(l => l.Address == r.Address)).GroupBy(r => r.Address).Select(g => g.First()).ToList(); + } + else + { + List forbiddenApChests = new() { 145, 146, 147, 148, 187, 188, 189, 190, 191, 192, 193, 194, 195 }; + + kiPlacement = kiPlacement.Where(r => !forbiddenApChests.Contains(r.Address - 0x3100)).GroupBy(r => r.Address).Select(g => g.First()).ToList(); + } + logic = new SCLogic(rom, checker.Main, kiPlacement, locations, flags, true); } @@ -254,7 +263,7 @@ private int GetLocationId(SCLogicRewardSource r) } throw new NotSupportedException(); - } + } private List> GetRule(SCLogicRewardSource r) { diff --git a/FF1Lib/asm/11_B940_ChestsAppearOpened.asm b/FF1Lib/asm/11_B940_ChestsAppearOpened.asm new file mode 100644 index 000000000..78cce0fff --- /dev/null +++ b/FF1Lib/asm/11_B940_ChestsAppearOpened.asm @@ -0,0 +1,247 @@ +tmp = $10 ; 16 bytes +doorppuaddr = $0E ; 2 bytes + +tileprop = $44 ; 2 bytes +cur_map = $48 + +tileset_data = $0400 +load_map_pal = tileset_data+$380 +TP_SPEC_TREASURE = %00001000 + +lut_SMPalettes = $A000 ; BANK_SMINFO - $1000 byte bound +lut_NTLo = $D5E2 +lut_NTHi = $D5F2 + +unsram = $6000 ; $400 bytes +game_flags = unsram+$0200 +GMFLG_TCOPEN = %00000100 +DLGID_TCGET = $F0 ; "In this chest you find..." +DLGID_CANTCARRY = $F1 ; "You can't carry anymore" +DLGID_EMPTYTC = $F2 ; "this treasure chest is empty" + +SwapPRG = $FE03 +Copy256 = $CC74 +OpenTreasureChest = $DD78 +WaitForVBlank = $FEA8 +SetSMScroll = $CCA1 + +scroll_y = $2F ; Y scroll in tiles (16x16). range=0-E +facing = $33 ; 1=R 2=L 4=D 8=U +FACING_RIGHT = $01 +FACING_LEFT = $02 +FACING_DOWN = $04 +FACING_UP = $08 + +PPU_STATUS = $2002 +PPU_ADDR = $2006 +PPU_DATA = $2007 + +; bank 1F +; Original LoadSMTilesetData @ $CC45 +; load map palettes + +; LDA #0 +; STA tmp+1 +; +; LDA cur_map ; get current map and multiply it by $30, rotating carry into tmp+1 +; ASL A ; first, shift left by 4 to multiply by $10 +; ASL A +; ASL A +; ROL tmp+1 +; ASL A +; ROL tmp+1 +; STA tmp +; +; LDX tmp+1 ; load high byte into X. Here X and A are *$10 +; +; ASL tmp ; shift RAM by 1 more to multiply by $20 +; ROL tmp+1 +; +; CLC ; add *$10 (in A,X) to the *$20 (in tmp,tmp+1) to get *$30 +; ADC tmp +; STA tmp +; TXA +; ADC tmp+1 +; ORA #>lut_SMPalettes ; OR high byte with high byte of palette LUT +; STA tmp+1 + +; Patch + +.ORG $CC45 + LDA #$11 + JSR SwapPRG + JMP ReplaceOpenedChestTSA + +.ORG $CC62 + LDA #$00 ; BANK_SMINFO + JSR SwapPRG + +; A9 11 20 03 FE 4C 40 B9 +; A9 00 20 03 FE + +.ORG $B940 +ReplaceOpenedChestTSA: + ; The tileset data has been loaded to $0400, we need to loop over it, and + ; if a tile is a chest, and the chest is opened, replace the top two TSA + ; bytes with the opened chest tile values. + + LDY #$00 + @Loop: + LDA tileset_data,Y ; get the first byte of tile properties + AND #TP_SPEC_TREASURE ; see if it's a treasure chest + BEQ @EndLoop + LDX tileset_data+1,Y ; get the treasure index + LDA game_flags,X ; get the game flags + AND #GMFLG_TCOPEN ; get the opened flag + BEQ @EndLoop + + ; The TSA is stored as all the top left tiles, then all the top right, etc. + ; So to change the top left, we just offset into that array by the tile index, + ; which is half of Y (since Y is incrementing by 2 bytes per tile). + TYA + LSR A + TAX + LDA #$7E ; opened chest top left tile + STA tileset_data+$100,X + LDA #$7F ; opened chest top right tile + STA tileset_data+$180,X + + @EndLoop: + INY + INY ; advance two bytes + BNE @Loop + + ; Here we have to replicate a chunk of LoadSMTilesetData that we jumped around. + LDA #0 + STA tmp+1 + + LDA cur_map ; get current map and multiply it by $30, rotating carry into tmp+1 + ASL A ; first, shift left by 4 to multiply by $10 + ASL A + ASL A + ROL tmp+1 + ASL A + ROL tmp+1 + STA tmp + + LDX tmp+1 ; load high byte into X. Here X and A are *$10 + + ASL tmp ; shift RAM by 1 more to multiply by $20 + ROL tmp+1 + + CLC ; add *$10 (in A,X) to the *$20 (in tmp,tmp+1) to get *$30 + ADC tmp + STA tmp + TXA + ADC tmp+1 + ORA #>lut_SMPalettes ; OR high byte with high byte of palette LUT + STA tmp+1 + + JMP $CC62 ; jump back to LoadSMTilesetData + +; A0 00 B9 00 04 29 08 F0 17 BE 01 04 BD 00 62 29 04 F0 0D 98 4A AA A9 7E 9D 00 05 A9 7F 9D 80 05 +; C8 C8 D0 DE A9 00 85 11 A5 48 0A 0A 0A 26 11 0A 26 11 85 10 A6 11 06 10 26 11 18 65 10 85 10 8A +; 65 11 09 A0 85 11 4C 62 CC + + + +; Original TalkToSMTile @ $CBF9 + +; @TreasureChest: ; if the tile is a treasure chest +; LDX tileprop+1 ; put the chest ID in X +; LDA game_flags, X ; get the game flag associated with that chest +; AND #GMFLG_TCOPEN ; to see if the chest has already been opened +; BEQ :+ ; if it has.... +; LDA #DLGID_EMPTYTC ; select "The Chest is empty" text, and exit +; RTS + +;: JMP OpenTreasureChest ; otherwise, open the chest + +; Patch +.ORG $CBF9 + LDA #$11 + JSR SwapPRG + JMP WrapOpenTreasureChest + +; A9 11 20 03 FE 4C 8A B9 + +.ORG $B98A +WrapOpenTreasureChest: + ; Replicate the patched out code + LDX tileprop+1 ; put the chest ID in X + LDA game_flags,X ; get the game flag associated with that chest + AND #GMFLG_TCOPEN ; to see if the chest has already been opened + BEQ :+ ; if it has.... + LDA #DLGID_EMPTYTC ; select "The Chest is empty" text, and exit + RTS + + ; Now we call the original OpenTreasureChest +: JSR OpenTreasureChest + CMP #DLGID_CANTCARRY + BEQ @End + PHA ; save whatever the return value was from OpenTreasureChest + ; So that we can come back here and draw the new tiles + LDA scroll_y ; get the scroll value to see where the player is + CLC ; necessary because the vertical position can't be simply masked out + ADC #$07 ; add 7 to get the row the player is on + TAY + LDA facing ; get the facing direction + CMP #FACING_UP ; is the player facing up? + BNE @NotUp + DEY ; player is facing up, so go one row up + JMP @SetAddr + @NotUp: + CMP #FACING_DOWN + BNE @SetAddr + INY ; player is facing down, so go one row down + @SetAddr: + TYA ; get the row back + CMP #$0F ; if the row is >= 15, clamp it to 15 + BCC @RowGood + SBC #$0F + @RowGood: + TAY ; Y is now the actual row + LDA tmp+4 ; get the X coordinate + AND #$1F ; this one we can mask off + CMP #$10 ; see if the high bit is set + BCS @SecondPage + + @FirstPage: + ASL A ; the X tile coordinate is double the map coordinate + ORA lut_NTLo,Y ; the nametable addresses for each row are in this lookup table + STA doorppuaddr ; reuse this variable + LDA lut_NTHi,Y ; get the high byte + STA doorppuaddr+1 + JMP @Draw + + @SecondPage: + AND #$0F ; mask off the high bit + ASL A ; the X tile coordinate is double the map coordinate + ORA lut_NTLo,Y ; the nametable addresses for each row are in this lookup table + STA doorppuaddr ; reuse this variable + LDA lut_NTHi,Y ; get the high byte + ORA #$04 ; second nametable page + STA doorppuaddr+1 + + @Draw: + JSR WaitForVBlank + LDA PPU_STATUS ; reset address + LDA doorppuaddr+1 ; get high byte + STA PPU_ADDR + LDA doorppuaddr ; get low byte + STA PPU_ADDR + LDA #$7E ; opened chest top left tile + STA PPU_DATA + LDA #$7F ; opened chest top right tile + STA PPU_DATA + + JSR SetSMScroll ; reset the scroll (don't know why this is needed, but it prevents flicker) + PLA ; restore the return value from OpenTreasureChest + @End: + RTS + +; A6 45 BD 00 62 29 04 F0 03 A9 F2 60 20 78 DD C9 F1 F0 61 48 A5 2F 18 69 07 A8 A5 33 C9 08 D0 04 +; 88 4C B3 B9 C9 04 D0 01 C8 98 C9 0F 90 02 E9 0F A8 A5 14 29 1F C9 10 B0 0E 0A 19 E2 D5 85 0E B9 +; F2 D5 85 0F 4C E0 B9 29 0F 0A 19 E2 D5 85 0E B9 F2 D5 09 04 85 0F 20 A8 FE AD 02 20 A5 0F 8D 06 +; 20 A5 0E 8D 06 20 A9 7E 8D 07 20 A9 7F 8D 07 20 20 A1 CC 68 60 + diff --git a/FF1Lib/asm/1B_A000_AirBoatRoutines.asm b/FF1Lib/asm/1B_A000_AirBoatRoutines.asm index d2819aef4..9071ebd98 100644 --- a/FF1Lib/asm/1B_A000_AirBoatRoutines.asm +++ b/FF1Lib/asm/1B_A000_AirBoatRoutines.asm @@ -112,7 +112,7 @@ NewLandingDrawOWSprites: ; 13 bytes (10 bytes used) ; Check the highest bit; draw ship if 0, don't draw if 1 CheckShip: ; called on foot, canoe, in airship LDA ship_vis - AND #$01 ; do we have ship? + AND #$7F ; do we have ship? BNE CS_HaveShip RTS CS_HaveShip: @@ -146,7 +146,7 @@ NotAirshipTile: RTS IsShipTile: LDA ship_vis - AND #$01 + AND #$7F BNE HaveShip LDA #$01 RTS @@ -255,4 +255,3 @@ BoardCheck: BoardFail: LDA #$00 RTS - \ No newline at end of file diff --git a/FF1Lib/asm/1F_C571_EncounterPrng.asm b/FF1Lib/asm/1F_C571_EncounterPrng.asm index 68f97fe33..e5759c1f7 100644 --- a/FF1Lib/asm/1F_C571_EncounterPrng.asm +++ b/FF1Lib/asm/1F_C571_EncounterPrng.asm @@ -18,11 +18,11 @@ NewGame_LoadStartingStats = $C76D JSR PartyGen_ShutOffPPUAndLoadBattleStepSeed ;;; assembled bytes - ;;; EAEA20008C + ;;; EAEA20E086 -.ORG $8C00 +.ORG $86E0 PartyGen_ShutOffPPUAndLoadBattleStepSeed: ;;; we call this subroutine from bank $1E $806B ;;; do the PPU reset that was there diff --git a/FF1Lib/imagedata/bosses/AGNEA.png b/FF1Lib/imagedata/bosses/AGNEA.png new file mode 100644 index 000000000..ae823bab8 Binary files /dev/null and b/FF1Lib/imagedata/bosses/AGNEA.png differ diff --git a/FF1Lib/imagedata/bosses/ATMA.png b/FF1Lib/imagedata/bosses/ATMA.png index 22dffd855..c8e0cc1b5 100644 Binary files a/FF1Lib/imagedata/bosses/ATMA.png and b/FF1Lib/imagedata/bosses/ATMA.png differ diff --git a/FF1Lib/imagedata/bosses/B.DRAGON.png b/FF1Lib/imagedata/bosses/B.DRAGON.png index 0feb718ed..646ba2120 100644 Binary files a/FF1Lib/imagedata/bosses/B.DRAGON.png and b/FF1Lib/imagedata/bosses/B.DRAGON.png differ diff --git a/FF1Lib/imagedata/bosses/CARAVAN.png b/FF1Lib/imagedata/bosses/CARAVAN.png new file mode 100644 index 000000000..7a6b8c2b5 Binary files /dev/null and b/FF1Lib/imagedata/bosses/CARAVAN.png differ diff --git a/FF1Lib/imagedata/bosses/FIEND.png b/FF1Lib/imagedata/bosses/FIEND.png index 08e39c35e..09dba937e 100644 Binary files a/FF1Lib/imagedata/bosses/FIEND.png and b/FF1Lib/imagedata/bosses/FIEND.png differ diff --git a/FF1Lib/imagedata/bosses/GODDESS.png b/FF1Lib/imagedata/bosses/GODDESS.png index 907ab50b3..a78d7f882 100644 Binary files a/FF1Lib/imagedata/bosses/GODDESS.png and b/FF1Lib/imagedata/bosses/GODDESS.png differ diff --git a/FF1Lib/imagedata/bosses/H.DRAGON.png b/FF1Lib/imagedata/bosses/H.DRAGON.png index f8766f658..2ea5a54cf 100644 Binary files a/FF1Lib/imagedata/bosses/H.DRAGON.png and b/FF1Lib/imagedata/bosses/H.DRAGON.png differ diff --git a/FF1Lib/imagedata/bosses/H.RIDER.png b/FF1Lib/imagedata/bosses/H.RIDER.png index 19fb3a827..0c954223d 100644 Binary files a/FF1Lib/imagedata/bosses/H.RIDER.png and b/FF1Lib/imagedata/bosses/H.RIDER.png differ diff --git a/FF1Lib/imagedata/bosses/NCROPHBE.png b/FF1Lib/imagedata/bosses/NCROPHBE.png index 92f9a7856..b26411ad6 100644 Binary files a/FF1Lib/imagedata/bosses/NCROPHBE.png and b/FF1Lib/imagedata/bosses/NCROPHBE.png differ diff --git a/FF1Lib/imagedata/bosses/NIMBUS.png b/FF1Lib/imagedata/bosses/NIMBUS.png new file mode 100644 index 000000000..62c5c681a Binary files /dev/null and b/FF1Lib/imagedata/bosses/NIMBUS.png differ diff --git a/FF1Lib/imagedata/bosses/OMNISENT.png b/FF1Lib/imagedata/bosses/OMNISENT.png index a92245c30..b88087049 100644 Binary files a/FF1Lib/imagedata/bosses/OMNISENT.png and b/FF1Lib/imagedata/bosses/OMNISENT.png differ diff --git a/FF1Lib/imagedata/bosses/R.DRAGON.png b/FF1Lib/imagedata/bosses/R.DRAGON.png index 6902e4432..e7f46b0d3 100644 Binary files a/FF1Lib/imagedata/bosses/R.DRAGON.png and b/FF1Lib/imagedata/bosses/R.DRAGON.png differ diff --git a/FF1Lib/imagedata/bosses/SEPHROTH.png b/FF1Lib/imagedata/bosses/SEPHROTH.png new file mode 100644 index 000000000..c6cadc286 Binary files /dev/null and b/FF1Lib/imagedata/bosses/SEPHROTH.png differ diff --git a/FF1Lib/imagedata/bosses/T.ARMOR.png b/FF1Lib/imagedata/bosses/T.ARMOR.png index a1861ed71..186a0400a 100644 Binary files a/FF1Lib/imagedata/bosses/T.ARMOR.png and b/FF1Lib/imagedata/bosses/T.ARMOR.png differ diff --git a/FF1Lib/imagedata/bosses/THNDBIRD.png b/FF1Lib/imagedata/bosses/THNDBIRD.png new file mode 100644 index 000000000..e8df44e55 Binary files /dev/null and b/FF1Lib/imagedata/bosses/THNDBIRD.png differ diff --git a/FF1Lib/imagedata/bosses/WHEELS.png b/FF1Lib/imagedata/bosses/WHEELS.png new file mode 100644 index 000000000..a4df1648f Binary files /dev/null and b/FF1Lib/imagedata/bosses/WHEELS.png differ diff --git a/FF1Lib/imagedata/bosses/WREXSOUL.png b/FF1Lib/imagedata/bosses/WREXSOUL.png index 589232813..cd9e6d323 100644 Binary files a/FF1Lib/imagedata/bosses/WREXSOUL.png and b/FF1Lib/imagedata/bosses/WREXSOUL.png differ diff --git a/FF1Lib/imagedata/bosses/ZINOGRE.png b/FF1Lib/imagedata/bosses/ZINOGRE.png new file mode 100644 index 000000000..c8ac7bf2c Binary files /dev/null and b/FF1Lib/imagedata/bosses/ZINOGRE.png differ diff --git a/FF1Lib/procgen/MapGenerator.cs b/FF1Lib/procgen/MapGenerator.cs index 0ef675602..3429a2532 100644 --- a/FF1Lib/procgen/MapGenerator.cs +++ b/FF1Lib/procgen/MapGenerator.cs @@ -158,8 +158,6 @@ private IMapGeneratorEngine GetEngine(MapGeneratorStrategy strategy) { case MapGeneratorStrategy.Cellular: return new CellularGenerator(); - case MapGeneratorStrategy.WaterfallClone: - return new WaterfallEngine(); case MapGeneratorStrategy.Square: return new RectilinearGenerator(); case MapGeneratorStrategy.BSPTree: diff --git a/FF1Lib/procgen/WaterfallEngine.cs b/FF1Lib/procgen/WaterfallEngine.cs deleted file mode 100644 index 4a0efa444..000000000 --- a/FF1Lib/procgen/WaterfallEngine.cs +++ /dev/null @@ -1,411 +0,0 @@ -namespace FF1Lib.Procgen -{ - class WaterfallEngine : IMapGeneratorEngine - { - public CompleteMap Generate(MT19337 rng, MapRequirements reqs) - { - //Constants! Get yer constants here! - int iteration_count = 15; - - //((List)reqs.Rooms)[0].Tiledata = ((List)reqs.Rooms)[0].Tiledata; - - CompleteMap complete = new CompleteMap - { - Map = new Map((byte)Tile.WaterfallInside) - }; - //(57,56) - var startLoc = (x: 0x39, y: 0x38); - - var startingX = rng.Between(-3, 0) + startLoc.x; - var startingY = rng.Between(-4, -1) + startLoc.y; - - var startRegion = new Region(startingX, startingY, 4, 5, Tile.WaterfallRandomEncounters); - - List regionList = new List(); - regionList.Add(startRegion); - - List endingRegions = new List(); - for (var i = 0; i < iteration_count; i++) - { - var startPoint = regionList[rng.Between(0, regionList.Count - 1)]; - var newRegions = RegionChain(rng, startPoint, regionList, 30 - i); - regionList.AddRange(newRegions); - if (newRegions.Count > 0) - { - endingRegions.Add(newRegions[newRegions.Count - 1]); - } - } - - var foundRoomPlace = false; - var room = ((List)reqs.Rooms)[0]; - var room_x = -1; - var room_y = -1; - - while (!foundRoomPlace && endingRegions.Count > 0) - { - var borderRegion = endingRegions.PickRandom(rng); - - var base_x = (borderRegion.x - (room.Width - 1) + 64) % 64; - room_y = (borderRegion.y - room.Height + 64) % 64; - var x_offset = 1; - List valid_offsets = new List(); - - while (x_offset < room.Width) - { - room_x = (base_x + x_offset) % 64; - var validRoomPlace = true; - foreach (Region r in regionList) - { - var testVal = validRoomPlace && !r.IntersectsRoom(room, room_x, room_y); - if (!testVal && validRoomPlace) - { - //Console.WriteLine(room_x); - } - validRoomPlace = testVal; - } - if (validRoomPlace) - { - valid_offsets.Add(x_offset); - } - x_offset++; - } - - if (valid_offsets.Count != 0) - { - foundRoomPlace = true; - room_x = (base_x + valid_offsets[rng.Between(0, valid_offsets.Count - 1)]); - } - - endingRegions.Remove(borderRegion); - } - - if (!foundRoomPlace) - { - List idxs = Enumerable.Range(0, regionList.Count).ToList(); - while (!foundRoomPlace && idxs.Count > 0) - { - int regionIdx = idxs.PickRandom(rng); - - var borderRegion = regionList[regionIdx]; - var base_x = (borderRegion.x - (room.Width - 1) + 64) % 64; - room_y = (borderRegion.y - (room.Height - 1) + 64) % 64; - var x_offset = 1; - List valid_offsets = new List(); - - while (x_offset < room.Width) - { - room_x = (base_x + x_offset) % 64; - var validRoomPlace = true; - foreach (Region r in regionList) - { - var testVal = validRoomPlace && !r.IntersectsRoom(room, room_x, room_y); - if (!testVal && validRoomPlace) - { - //Console.WriteLine(room_x); - } - validRoomPlace = testVal; - } - if (validRoomPlace) - { - valid_offsets.Add(x_offset); - } - x_offset++; - } - - if (valid_offsets.Count != 0) - { - foundRoomPlace = true; - room_x = (base_x + valid_offsets[rng.Between(0, valid_offsets.Count - 1)]); - } - - idxs.Remove(regionIdx); - } - } - - if (!foundRoomPlace) - { - Console.WriteLine("No room found :o"); - return null; - } - - //Draw every room in regionList to complete - foreach (Region r in regionList) - { - r.DrawRegion(complete); - } - - Region waterfallRoom = new Region(room_x, room_y, room); - waterfallRoom.DrawRegion(complete); - - - int doorYPos = (room_y + room.Height) % 64; - - List possibleDoors = new List(); - for (var i = 0; i < room.Width; i++) - { - if (complete.Map[((room_x + i) % 64, doorYPos)].Tile == Tile.WaterfallRandomEncounters) - { - if (!(i == 0 || i == 7)) - { - possibleDoors.Add(i); - } - } - if (complete.Map[((room_x + i) % 64, doorYPos)].Tile == Tile.WaterfallInside) - { - if (complete.Map[((room_x + i + 63) % 64, doorYPos)].Tile == Tile.WaterfallRandomEncounters) - { - complete.Map[((room_x + i) % 64, doorYPos)].Tile = Tile.RoomLeft; - } - else if (complete.Map[((room_x + i + 1) % 64, doorYPos)].Tile == Tile.WaterfallRandomEncounters) - { - complete.Map[((room_x + i) % 64, doorYPos)].Tile = Tile.RoomRight; - } - } - } - - if (possibleDoors.Count == 0) - { - return null; - } - - //Then we do the cleanup - complete = CleanUp(complete); - if (complete == null) return null; - - //Now, place the door (so it doesn't get in the way of the cleanup) - int doorPos = (possibleDoors[rng.Between(0, possibleDoors.Count - 1)] + room_x)%64; - - complete.Map[(doorPos, doorYPos)].Tile = Tile.Door; - complete.Map[(doorPos, doorYPos)].Neighbor(Direction.Down).Tile = Tile.Doorway; - complete.Map[(doorPos, doorYPos)].Neighbor(Direction.Up).Tile = Tile.WaterfallSpikeTile; - - //NPC management - reqs.Rooms.First().NPCs.ToList().ForEach(npc => - { - npc.Coord.x = (npc.Coord.x + room_x)%64; - npc.Coord.y = (npc.Coord.y + room_y) % 64; - reqs.MapObjects.SetNpc(npc.Index, npc.ObjectId, npc.Coord.x, npc.Coord.y, npc.InRoom, npc.Stationary); - }); - - - //Stuff to do at the end~ - complete.Map[(startLoc.x, startLoc.y)].Tile = Tile.WarpUp; - complete.Entrance = new Coordinate((byte)startLoc.x, (byte)startLoc.y, CoordinateLocale.Standard); - - return complete; - } - - public CompleteMap OneGapToWalkable(CompleteMap complete) - { - //We're gonna deal with the 1x1 gaps by just filling them in - //We thought about rocks. But now just making bigger spaces feels... simpler - foreach (MapElement cell in complete.Map) - { - if (cell.Tile == Tile.WaterfallInside && cell.Neighbor(Direction.Up).Tile == Tile.WaterfallRandomEncounters && cell.Neighbor(Direction.Down).Tile == Tile.WaterfallRandomEncounters) - { - cell.Tile = Tile.WaterfallRandomEncounters; - } - if (cell.Tile == Tile.WaterfallInside && cell.Neighbor(Direction.Left).Tile == Tile.WaterfallRandomEncounters && cell.Neighbor(Direction.Right).Tile == Tile.WaterfallRandomEncounters) - { - cell.Tile = Tile.WaterfallRandomEncounters; - } - } - //Two passes to catch literal corner cases. - foreach (MapElement cell in complete.Map) - { - if (cell.Tile == Tile.WaterfallInside && cell.Neighbor(Direction.Up).Tile == Tile.WaterfallRandomEncounters && cell.Neighbor(Direction.Down).Tile == Tile.WaterfallRandomEncounters) - { - cell.Tile = Tile.WaterfallRandomEncounters; - } - if (cell.Tile == Tile.WaterfallInside && cell.Neighbor(Direction.Left).Tile == Tile.WaterfallRandomEncounters && cell.Neighbor(Direction.Right).Tile == Tile.WaterfallRandomEncounters) - { - cell.Tile = Tile.WaterfallRandomEncounters; - } - } - - return complete; - } - - public CompleteMap CleanUp(CompleteMap complete) - { - complete = OneGapToWalkable(complete); - - //Okay, time to do something hacky to handle the one-off-wall nonsense - foreach (MapElement cell in complete.Map) - { - if (cell.Tile == Tile.WaterfallRandomEncounters && cell.Neighbor(Direction.Up).Tile == Tile.WaterfallInside && cell.Neighbor(Direction.Down).Tile == Tile.WaterfallInside) - { - MapElement updated = cell.Neighbor(Direction.Up); - updated.Tile = Tile.WaterfallRandomEncounters; - if (updated.Neighbor(Direction.Right).Tile == Tile.WaterfallInside) - { - updated.Neighbor(Direction.Right).Tile = Tile.WaterfallRandomEncounters; - } - else - { - if (updated.Neighbor(Direction.Left).Tile != Tile.WaterfallInside && updated.Neighbor(Direction.Left).Tile != Tile.WaterfallRandomEncounters) return null; - updated.Neighbor(Direction.Left).Tile = Tile.WaterfallRandomEncounters; - } - } - } - - Dictionary<(int x, int y), Tile> replaceDict = new Dictionary<(int x, int y), Tile>(); - - // Now, add the top wall bits - - foreach (MapElement cell in complete.Map) - { - //if (cell.Tile == Tile.Impassable || cell.Tile == Tile.WaterfallRandomEncounters) - if (cell.Tile == Tile.WaterfallRandomEncounters) - { - Tile upperCell = cell.Neighbor(Direction.Up).Tile; - bool replaceCell = (upperCell == Tile.WaterfallInside); - replaceCell = replaceCell || upperCell == Tile.RoomFrontLeft; - replaceCell = replaceCell || upperCell == Tile.RoomFrontRight; - replaceCell = replaceCell || upperCell == Tile.RoomFrontCenter; - replaceCell = replaceCell || upperCell == Tile.RoomBackLeft; - replaceCell = replaceCell || upperCell == Tile.RoomBackRight; - replaceCell = replaceCell || upperCell == Tile.RoomBackCenter; - if (replaceCell) - { - replaceDict[cell.Coord] = Tile.InsideWall; - } - - } - - //Now, add the 0x01 - 0x08 parts to form the borders - if (cell.Tile == Tile.WaterfallInside) - { - if (cell.Neighbor(Direction.Left).Tile == Tile.WaterfallRandomEncounters) - { - cell.Tile = Tile.RoomLeft; - } - if (cell.Neighbor(Direction.Right).Tile == Tile.WaterfallRandomEncounters) - { - cell.Tile = Tile.RoomRight; - } - if (cell.Neighbor(Direction.Up).Tile == Tile.WaterfallRandomEncounters) - { - if (cell.Neighbor(Direction.Left).Tile == Tile.WaterfallRandomEncounters) - { - cell.Tile = Tile.RoomBackLeft; - } - else if (cell.Neighbor(Direction.Right).Tile == Tile.WaterfallRandomEncounters) - { - cell.Tile = Tile.RoomBackRight; - } - else - { - cell.Tile = Tile.RoomBackCenter; - } - } - if (cell.Neighbor(Direction.Down).Tile == Tile.WaterfallRandomEncounters) - { - if (cell.Neighbor(Direction.Left).Tile == Tile.WaterfallRandomEncounters) - { - cell.Tile = Tile.RoomFrontLeft; - } - else if (cell.Neighbor(Direction.Right).Tile == Tile.WaterfallRandomEncounters) - { - cell.Tile = Tile.RoomFrontRight; - } - else - { - cell.Tile = Tile.RoomFrontCenter; - } - } - - //Highjacking this to include some room-bottom cleanup; this prevents a runaway robot! - if (cell.Neighbor(Direction.Up).Tile == Tile.RoomFrontCenter || cell.Neighbor(Direction.Up).Tile == Tile.RoomFrontLeft || cell.Neighbor(Direction.Up).Tile == Tile.RoomFrontRight) - { - cell.Tile = Tile.RoomBackCenter; - } - } - - if (cell.Tile == Tile.RoomLeft && cell.Neighbor(Direction.Up).Tile == Tile.RoomFrontCenter) - { - cell.Tile = Tile.RoomBackLeft; - } - - if (cell.Tile == Tile.RoomLeft && cell.Neighbor(Direction.Up).Tile == Tile.RoomFrontLeft) - { - cell.Tile = Tile.RoomBackLeft; - } - - if (cell.Tile == Tile.RoomRight && cell.Neighbor(Direction.Up).Tile == Tile.RoomFrontCenter) - { - cell.Tile = Tile.RoomBackRight; - } - - if (cell.Tile == Tile.RoomRight && cell.Neighbor(Direction.Up).Tile == Tile.RoomFrontLeft) - { - cell.Tile = Tile.RoomBackRight; - } - } - - foreach (KeyValuePair<(int x, int y), Tile> entry in replaceDict) - { - complete.Map[(entry.Key.x, entry.Key.y)].Tile = entry.Value; - } - - //Finally we'll need to to clean up the room sometimes - - /*foreach (MapElement cell in complete.Map) - { - if (cell.Tile == Tile.RoomFrontCenter && cell.Neighbor(Direction.Down).Tile == Tile.RoomFrontCenter) - { - cell.Tile = Tile.WaterfallInside; - } - if (cell.Tile == Tile.RoomBackCenter && cell.Neighbor(Direction.Up).Tile == Tile.RoomBackCenter) - { - cell.Tile = Tile.WaterfallInside; - } - if (cell.Tile == Tile.RoomLeft && cell.Neighbor(Direction.Left).Tile == Tile.RoomLeft) - { - cell.Tile = Tile.WaterfallInside; - } - if (cell.Tile == Tile.RoomRight && cell.Neighbor(Direction.Right).Tile == Tile.RoomRight) - { - cell.Tile = Tile.WaterfallInside; - } - }*/ - - return complete; - } - - public List RegionChain(MT19337 rng, Region startCell, List curList, int iterations) - { - List outList = new List(); - - var curCell = startCell; - - for (var i = 0; i < iterations; i++) - { - Region nextCell = CreateAdjacent(rng, curCell); - if (nextCell.GetAdjacents(outList).Count + nextCell.GetAdjacents(curList).Count == 1) - { - outList.Add(nextCell); - curCell = nextCell; - } - } - - return outList; - } - - public Region CreateAdjacent(MT19337 rng, Region cell) - { - var dx = rng.Between(-4, 3); - var dy = rng.Between(-4, 4); - var manhat = Math.Abs(dx) + Math.Abs(dy); - - while (manhat < 2 || manhat > 7) - { - dx = rng.Between(-4, 3); - dy = rng.Between(-4, 4); - manhat = Math.Abs(dx) + Math.Abs(dy); - } - - return new Region((cell.x + dx + 64) % 64, (cell.y + dy + 64) % 64, cell); - } - } -} diff --git a/FF1R/FF1R.csproj b/FF1R/FF1R.csproj index 03dcf0ca2..020ce93bc 100644 --- a/FF1R/FF1R.csproj +++ b/FF1R/FF1R.csproj @@ -17,7 +17,7 @@ - +