From f43f74f0e1bb22ee50daacf4d278bab52c5026ea Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Sat, 21 Dec 2024 10:22:26 -0500 Subject: [PATCH 01/61] Update version --- FF1Lib/FFRVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FF1Lib/FFRVersion.cs b/FF1Lib/FFRVersion.cs index d1c0ac229..5405eed65 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.8.7"; public static readonly string Sha = "SHA"; public static readonly string Branch = "BRANCH"; public static readonly string MasterBranch = "master"; From 7c70c21c669671820775bfe7952d37d2b7e5de32 Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Mon, 23 Dec 2024 18:51:22 -0500 Subject: [PATCH 02/61] Add Bank Usage Register --- FF1Lib/BankUsageRegister.md | 94 +++++++++++++++++++++++++++++++++++++ FF1Lib/FF1Rom.cs | 50 ++++++++++++++++++++ FF1Lib/RelocateChests.cs | 2 +- 3 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 FF1Lib/BankUsageRegister.md diff --git a/FF1Lib/BankUsageRegister.md b/FF1Lib/BankUsageRegister.md new file mode 100644 index 000000000..a28ade1c5 --- /dev/null +++ b/FF1Lib/BankUsageRegister.md @@ -0,0 +1,94 @@ +; 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 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 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/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/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); From 5c8c2770d83868eb86d6b30e3ba421b9ace1ae04 Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Fri, 27 Dec 2024 09:15:17 -0500 Subject: [PATCH 03/61] Remove unused flag --- FF1Blazorizer/Tabs/ClassesTab.razor | 1 - 1 file changed, 1 deletion(-) diff --git a/FF1Blazorizer/Tabs/ClassesTab.razor b/FF1Blazorizer/Tabs/ClassesTab.razor index a296e0a3a..b14a172bb 100644 --- a/FF1Blazorizer/Tabs/ClassesTab.razor +++ b/FF1Blazorizer/Tabs/ClassesTab.razor @@ -10,7 +10,6 @@ Halve BB Crit Rate Double Thief & Ninja Hit% Growth Better Thief & Ninja Agility - Raise Hit % Cap MDEF Growth: Improved HARM for White Mage Thief Lockpicking From d8ca9763ee507b9a12fe9f0d94ae17481fcb97fe Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Fri, 27 Dec 2024 09:18:32 -0500 Subject: [PATCH 04/61] Disable swap stairs with nooverworld --- FF1Blazorizer/Tabs/DungeonsTab.razor | 2 +- FF1Lib/StandardMaps/SMUpdates.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/FF1Blazorizer/Tabs/DungeonsTab.razor b/FF1Blazorizer/Tabs/DungeonsTab.razor index 84484b627..c290086d6 100644 --- a/FF1Blazorizer/Tabs/DungeonsTab.razor +++ b/FF1Blazorizer/Tabs/DungeonsTab.razor @@ -29,7 +29,7 @@
Flip Dungeons Horizontally Flip Dungeons Vertically - Swap Stair Locations + Swap Stair Locations
Relocate Chests and Trap Tiles Relocated Trap Tiles Are Marked diff --git a/FF1Lib/StandardMaps/SMUpdates.cs b/FF1Lib/StandardMaps/SMUpdates.cs index 030e930fa..e5abb5a4a 100644 --- a/FF1Lib/StandardMaps/SMUpdates.cs +++ b/FF1Lib/StandardMaps/SMUpdates.cs @@ -83,7 +83,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(); From 807a5f88bc33e620ee2284ee59a5f1ddbaf6d477 Mon Sep 17 00:00:00 2001 From: brbrofsvl Date: Fri, 10 Jan 2025 13:46:15 -0500 Subject: [PATCH 05/61] Bugfix for true RNG clobbers transmoog data (#1112) --- FF1Lib/BankUsageRegister.md | 1 + FF1Lib/RngTables.cs | 4 ++-- FF1Lib/asm/1F_C571_EncounterPrng.asm | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/FF1Lib/BankUsageRegister.md b/FF1Lib/BankUsageRegister.md index a28ade1c5..4cc025722 100644 --- a/FF1Lib/BankUsageRegister.md +++ b/FF1Lib/BankUsageRegister.md @@ -85,6 +85,7 @@ Bank Offset Range Description 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 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/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 From fe2f0db9d93b5f10a8274dd25a7b90c4efd415bf Mon Sep 17 00:00:00 2001 From: brbrofsvl Date: Fri, 10 Jan 2025 19:10:11 -0500 Subject: [PATCH 06/61] NPC sprite import via resource pack (#1113) --- FF1Lib/ResourcePack.cs | 13 +++++ FF1Lib/Sprites.cs | 115 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 124 insertions(+), 4 deletions(-) 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/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) From 20f5f18623301a44cde0db2364408e10651f6a81 Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Sat, 18 Jan 2025 20:50:03 -0500 Subject: [PATCH 07/61] Fix tombstone custom dialogue --- FF1Lib/Dialogues.cs | 8 ++++++++ FF1Lib/GlobalHacks/GlobalHacks.cs | 5 ----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/FF1Lib/Dialogues.cs b/FF1Lib/Dialogues.cs index 6332aca13..d5ff9964c 100644 --- a/FF1Lib/Dialogues.cs +++ b/FF1Lib/Dialogues.cs @@ -302,6 +302,12 @@ public void InsertDialogues(Dictionary dialogsdict) dialogues[d.Key] = d.Value; } } + public void TombstoneDialogue() + { + // EasterEgg + dialogues[0x12B] = "Here lies Entroper\n 'IMPs are safe'\n RIP"; + } + public void UpdateNPCDialogues(Flags flags) { // Update treasure box dialog for new DrawDialogueString routine @@ -343,6 +349,8 @@ public void UpdateNPCDialogues(Flags flags) dialogues[0x27] = "Take this.\n\n\n\n\nReceived #"; dialogues[0x2B] = (bool)flags.EarlySage ? "The FIENDS are waking.\nTake this and go defeat\nthem!\n\n\nReceived #" : "Great job vanquishing\nthe Earth FIEND.\nWith this, go and defeat\nthe other FIENDS!\n\nReceived #"; dialogues[0xCD] = "With this, you can\navenge the SKY WARRIORS.\n\n\n\nReceived #"; + + TombstoneDialogue(); } public void Write() { diff --git a/FF1Lib/GlobalHacks/GlobalHacks.cs b/FF1Lib/GlobalHacks/GlobalHacks.cs index f5b195533..cb2e1f72a 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 From 7efd265061092eee061521962dbafd46a1bd1ff7 Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Sat, 18 Jan 2025 21:21:36 -0500 Subject: [PATCH 08/61] Fix LiftOff not getting called in logic when airboat+freeairship+freeship --- FF1Lib/Sanity/SanityCheckerV2.cs | 1 + 1 file changed, 1 insertion(+) 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) { From a9e668f8be125bdd7b937adb244d8078aa984005 Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Sun, 19 Jan 2025 11:57:19 -0500 Subject: [PATCH 09/61] Fix custom map domain import bug --- FF1Lib/Data/DomainData.cs | 33 ----------------------------- FF1Lib/Formations.cs | 4 ++++ FF1Lib/MapExchange/OwMapExchange.cs | 15 +------------ FF1Lib/Overworld.cs | 10 --------- 4 files changed, 5 insertions(+), 57 deletions(-) delete mode 100644 FF1Lib/Data/DomainData.cs 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/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/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/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() { From 497d50ff743398c53deb23c07448aba86d98a7b3 Mon Sep 17 00:00:00 2001 From: Oslodo <161620626+Oslodo@users.noreply.github.com> Date: Sun, 19 Jan 2025 15:41:33 -0400 Subject: [PATCH 10/61] Boss Script Selector (#1107) Two new option to shuffle the ToFR fiends scripts (not chaos) only and to shuffle only the overworld fiends scripts. Confirm that this works with the alt fiends as well. --- FF1Blazorizer/Tabs/EnemiesTab.razor | 4 +- FF1Blazorizer/wwwroot/tooltips/tooltips.json | 12 ++++++ FF1Lib/Enemies.cs | 43 +++++++++++++++++++- FF1Lib/EnemyScripts.cs | 15 ++++++- FF1Lib/Flags/Flags.cs | 2 + 5 files changed, 72 insertions(+), 4 deletions(-) diff --git a/FF1Blazorizer/Tabs/EnemiesTab.razor b/FF1Blazorizer/Tabs/EnemiesTab.razor index 15a645c06..e99f587a2 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
diff --git a/FF1Blazorizer/wwwroot/tooltips/tooltips.json b/FF1Blazorizer/wwwroot/tooltips/tooltips.json index af21cf97a..5cf4d6215 100644 --- a/FF1Blazorizer/wwwroot/tooltips/tooltips.json +++ b/FF1Blazorizer/wwwroot/tooltips/tooltips.json @@ -1363,6 +1363,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", 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/Flags/Flags.cs b/FF1Lib/Flags/Flags.cs index 13e6427b6..990a50226 100644 --- a/FF1Lib/Flags/Flags.cs +++ b/FF1Lib/Flags/Flags.cs @@ -239,6 +239,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; From 861e4a75fd853db020a0e252210b878b142a79eb Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Fri, 24 Jan 2025 20:37:16 -0500 Subject: [PATCH 11/61] Fix relocate chest tile validation bug --- FF1Lib/RelocateChestsChestPicker.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 2d863f582aab6c6795ce057c3f219efcd7a56c22 Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Sun, 16 Feb 2025 18:14:56 -0500 Subject: [PATCH 12/61] Epitaphs for FFR community --- FF1Lib/Dialogues.cs | 27 +++++++++++++++++++++------ FF1Lib/FF1Lib.csproj | 4 ++-- FF1Lib/Randomize.cs | 2 +- FF1R/FF1R.csproj | 2 +- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/FF1Lib/Dialogues.cs b/FF1Lib/Dialogues.cs index d5ff9964c..eda6df55d 100644 --- a/FF1Lib/Dialogues.cs +++ b/FF1Lib/Dialogues.cs @@ -302,17 +302,34 @@ public void InsertDialogues(Dictionary dialogsdict) dialogues[d.Key] = d.Value; } } - public void TombstoneDialogue() + public void TombstoneDialogue(MT19337 rng) { - // EasterEgg - dialogues[0x12B] = "Here lies Entroper\n 'IMPs are safe'\n RIP"; + // 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) + 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) @@ -349,8 +366,6 @@ public void UpdateNPCDialogues(Flags flags) dialogues[0x27] = "Take this.\n\n\n\n\nReceived #"; dialogues[0x2B] = (bool)flags.EarlySage ? "The FIENDS are waking.\nTake this and go defeat\nthem!\n\n\nReceived #" : "Great job vanquishing\nthe Earth FIEND.\nWith this, go and defeat\nthe other FIENDS!\n\nReceived #"; dialogues[0xCD] = "With this, you can\navenge the SKY WARRIORS.\n\n\n\nReceived #"; - - TombstoneDialogue(); } public void Write() { diff --git a/FF1Lib/FF1Lib.csproj b/FF1Lib/FF1Lib.csproj index 0eef341bc..873c7209d 100644 --- a/FF1Lib/FF1Lib.csproj +++ b/FF1Lib/FF1Lib.csproj @@ -249,10 +249,10 @@ - + - + diff --git a/FF1Lib/Randomize.cs b/FF1Lib/Randomize.cs index 8cf7d7b35..a2d6101ca 100644 --- a/FF1Lib/Randomize.cs +++ b/FF1Lib/Randomize.cs @@ -182,7 +182,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); diff --git a/FF1R/FF1R.csproj b/FF1R/FF1R.csproj index 03dcf0ca2..014159a49 100644 --- a/FF1R/FF1R.csproj +++ b/FF1R/FF1R.csproj @@ -17,7 +17,7 @@ - + From ad2147d8f4feabae50d9d857100241f3c8932623 Mon Sep 17 00:00:00 2001 From: Oslodo <161620626+Oslodo@users.noreply.github.com> Date: Sat, 15 Mar 2025 15:20:26 -0300 Subject: [PATCH 13/61] New Fiends and Update to ImageSharp (#1116) * New Alt Fiend Art * New Friends Added * Update ImageSharp --- FF1Lib/AltFiends.cs | 38 +++++++++++++++++++++++++++ FF1Lib/FF1Lib.csproj | 4 ++- FF1Lib/imagedata/bosses/ATMA.png | Bin 3345 -> 3570 bytes FF1Lib/imagedata/bosses/B.DRAGON.png | Bin 3093 -> 3294 bytes FF1Lib/imagedata/bosses/FIEND.png | Bin 3238 -> 3518 bytes FF1Lib/imagedata/bosses/GODDESS.png | Bin 3954 -> 3360 bytes FF1Lib/imagedata/bosses/H.DRAGON.png | Bin 3179 -> 3471 bytes FF1Lib/imagedata/bosses/H.RIDER.png | Bin 2967 -> 3228 bytes FF1Lib/imagedata/bosses/NCROPHBE.png | Bin 4117 -> 3885 bytes FF1Lib/imagedata/bosses/OMNISENT.png | Bin 4460 -> 4192 bytes FF1Lib/imagedata/bosses/R.DRAGON.png | Bin 3240 -> 3522 bytes FF1Lib/imagedata/bosses/T.ARMOR.png | Bin 2807 -> 3106 bytes FF1Lib/imagedata/bosses/WHEELS.png | Bin 0 -> 3052 bytes FF1Lib/imagedata/bosses/WREXSOUL.png | Bin 2922 -> 3196 bytes FF1Lib/imagedata/bosses/ZINOGRE.png | Bin 0 -> 2805 bytes FF1R/FF1R.csproj | 2 +- 16 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 FF1Lib/imagedata/bosses/WHEELS.png create mode 100644 FF1Lib/imagedata/bosses/ZINOGRE.png diff --git a/FF1Lib/AltFiends.cs b/FF1Lib/AltFiends.cs index 997b0b47a..dedb54116 100644 --- a/FF1Lib/AltFiends.cs +++ b/FF1Lib/AltFiends.cs @@ -3165,6 +3165,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,6 +3203,25 @@ public void AlternativeFiends(ExtAltFiends extAltFiends, EnemyScripts enemyScrip Skills2 = new List { (byte)EnemySkills.Toxic, (byte)EnemySkills.Swirl, (byte)EnemySkills.Stare, (byte)EnemySkills.Poison_Stone }, }, + 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 }, + }, + }; var alternateFiendsList = new List { diff --git a/FF1Lib/FF1Lib.csproj b/FF1Lib/FF1Lib.csproj index 873c7209d..1f5c5fe0a 100644 --- a/FF1Lib/FF1Lib.csproj +++ b/FF1Lib/FF1Lib.csproj @@ -230,6 +230,7 @@ + @@ -237,6 +238,7 @@ + @@ -252,7 +254,7 @@ - + diff --git a/FF1Lib/imagedata/bosses/ATMA.png b/FF1Lib/imagedata/bosses/ATMA.png index 22dffd855fb082ec7cd667ee33e0fa15dfdf3016..c8e0cc1b5ce4114c05b756efec9068335ef5c9ef 100644 GIT binary patch delta 2022 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 diff --git a/FF1Lib/imagedata/bosses/FIEND.png b/FF1Lib/imagedata/bosses/FIEND.png index 08e39c35eb371ba1bae9bb02fdbf3f1ecb578246..09dba937e7f33556fd0e0b30c695e26e0dfee26c 100644 GIT binary patch delta 1968 zcma)-dpy+n8poM2)aJ6aVg_XzEQ>L}8FOKpal)u1*WsX5F4IgV%(%=jE6f<>M;$g~w3t!qTdEh(21YA8eH7&~gu>%7iu|2XG)eJ`KqdB47w=llKRse;`x zykLsn>2=uGMMXtrV`Bquw*Vyt-M@dI$Kxs8i_hg7N}$2<@t`VQrKuRWf%oSg)dy)@ z$&D{EMAMF=F$`-s2EbrZXtc5+(e^~Zj)=woY^i!&bxR~Gj>us$7xh_0=}6I(U~2|j-^J2(&%KwUOWzGi~AFJF?saJ z017jT&Wihd6Z?O!`Gf-h8~yC0Hla%SKN3a2<2Wwy9AZK^U74QpNB;7R<7zfwybU(5 z1F|QtQ9Y3VP+;7yq5@&NQXG8)&TtD{Z_e9kI-~Y|x3Mk$;NZU4iwScljvqjD>j@`*ANS_(_(QroGs<9^qn(KTWKU~AxT=kV8|Pt zeV1?{yVK?sD}wzEt43=NANoZyZJ5%MaPhg!D$+wMyPkQ*TyB zP6aoltS6-{4=YlGj7^|2Q{2DuQx)pg_jt|!B-{&JMVI8sP&zB;vnG>hqe-3b*E-7d zJ;{3SGI+(2g12lLSFUjx1uT2!zXu74=Po#XA^7U9)NiT6>ccYouCcyX%3{0DLYu#2 zl)s#iJ+WO+Gz;;yNE02xe6MTSFjzVJa_3dH%%am-Ai#y4I)Wrs7;SqsWieebR>tI@ z*9V^4+*}jZ7@RxxtjpbxU(kd#v=)%khrbi;rBc#|=d~%}cgYjqrsVViS`8;oTCBOa zv&wpn;z}Lf9ediLu7UjrwKl}?g?I340pBFb_)gGONMMPni$Tltw`v1c`F$2YQjUb* zAqp+eRywJco3^yQJ~^^fb4=b$YHBxIh+X>n*H(AUSTV2G@50TtAH}CLzBqg)#xQaB zi)-1tcZgsG_h9V73>>K%erc1%ME#E(`WillF__FRd z*SO`^W5%-yl}+MA(%zmZnZa0T(QkU@iw)AJQLGg>TY>ux%7~tB69%R%@n;7|uf(~_ zKTPy$u7$kQyaUp7Bd2^gK!_B~y}NaS2+5XxHR52Z!MX}l7=_la+#y7-*$;MWrgU02 zy$~xvy3P)vum}tD^Z;B&Hm0s%EmQFzE%=^SMtfUNNfAbU>7!z>poP%owxEY33e0*! z&K--0R=1i^QGl-=aKOIjA31ZYJNe<#%Ey{y#qD%>kHrrbtP)WWHAU-(`(JOUhY(Wo zr;^(%)lPD?BA{*`^aYiLqES$TxezK>`z0N%@N*9Ki+0iNS+DPXtQ!gqnnX@2a=}}T zl4xl}n4e0cUw>0a=V{rYB+}E`aJdx9h|{ftGJvCi%`;p1lVA9Bk5#t!D?^KqCh#6? z!-JWD_26W{mQhs(%$KiWSj9`;iMGq)yNwz{ebd9DAzcQ^?)qG7Lg?ATnTx30#M2B| zby3~5ur5leP3-uY^BV@u�qpW^-n7R^oggCVWgFb87D5&Ge5#&Nmq|0@8O&=f}XB zY1Q#gsPV!^{uWtlv1DQhkyewVb_K6t0H517&bk!aY5B=JZQ3RVA!qO0haUAZNA!LGfwa<-se0#JSljJYh%Uu zIHI+3(0x3}T9R8B7H{nsw`jGcW58|=LEsczMn|_4R$&L)>6!iKUTr^|b&8oD1{%9@ z>L@wW_|jB4NorM+Y+f3}eFQj)i@SCkyl%GFL3;Ri?ulzTNOSMlswYQO*S~D_X_sUK xQ{h+-Kmk5+rebzix%Ggu$ZFFATp8}}DwayUMcFs)5jAgfa&_^b)H#I+{{WHmW}*N9 delta 1714 zcma)-X*3&%8iqqEscmS`v<(`nIz=WS5wWF1b=0YS8Bs(ckq*W(R}oc>o3V^4v9#6X zXltleEwPWrsDx3fwyIjH5wx1BeXK#q)j8+>x_|C_&iCVep6{IR=hq5*d_2d%6Xx#h zeE|Rf$Ye4&ZlU9?G~l-MrL&5(rRMtKuP_OJgm9o0uX?(A9n^mU@N%O=zQX8>elY-m zvc}hu18@qD0RW)8xshxbmW)MPVol&?C^HNag+`j1Ay5`p7@U%!}!0Vd*ij`gSg4#R#2|_-;CF>nBUv|T=@N-K+wbsKSeu#K}gU;}qT7XyiVnip7 zGBneM!s|pzOM60Q>&LxMo%mlqG&!#IFt@ECYg?CWCZ}b2#FGkWzB8>)&5Lj*h1VLj zZIaZ(|GxjyN{_zvCa01my}}43r3E>Rqh@+Qgvk?pTcH7Cp&FgjO|44rPU*JcPq3v~ zqomFNfr4Y;)xd@8KRu(p&EFKynzQCPT|2KjGe(ijs3E9kKd-F5_Y5Y68}-|#YGD)Q zrK_SfSu=zBBxCL7kmFA(PDt@6)ZXXcm%sfNFCb(YYBYst7lciIVU)bKuf1tdR<2#3 z%w2!8;(;pqH3@h}|L`B49p+&M<;=^WMGX&s)=5*!itri!W6WkTn%CU{Nsf#q{IS*j-TYtxa)WvyZ}4 z$ZWz?xugyQPz{@SL`M%wLgVWJ&{U+E*?P+aWtpAx-k%!HblEaIbRMp)*q`lE?iPG zid{q_`3)@lN2s=2WPBa6%-_bSboUu25_5fb%-*<31$4JAzNxlMN2Odu%tDl2?r8Ql zae|iU=|ERi6R=GkZ9~)aaW~Z86U0Is$=6P`WC6)HdR2RV_TJ|oR+a|GN%^F$;O{%1 zwT47(YFr1ZF$gYkcrqm0)ZzHtrwTCR;YV%^vJv(`k^qE7pP-9UcCGO`yTY{%-K3px zX4hiPRGBQDX*b(dGy6Rl#d5$}NLjN2m-jAfaLfG9w2*!)OoiF>?~`iki-T<_X(5}+$6gK@6Xz*u1Mq~z_1nQM z^ZD$+w{teG>oKy*L)9@FKf9$AtGR+=OmDKT^<{>}k=5riID@|s3A5iqjIX2`AEP+N zj}Z0H&O$JmH|3)%3q#i?r{`@f2P{q49(vGASAa83YS0A@g5qFAe}~BuME7~!*rnc! znHt)2*pM%B8t_Dz{45*jCYY(Lfut zsq!MZ5QbrdVz6PRa4Z^YZic}q7ZO7vqlsj5i(Av7K-K8j1Tr@wEKE2J)Y9A#W*8LO z3;|D$*&xj1h>v9RhWJQ?t{{#&9*M>wF=#Igj*KUg@fJcUXz#zx6%Y=H6{5kq`*2JW znqW>qBf}UN1`}EbU=2Ck6^}fgSipxSPBAz z_+h&xAr$cD$>b8wy#s{GdM5!B5G)>GNiJE~RhHeppzC z3GzL^r4yRa0d zp#we2CZ85=bbHkMQMm(Apt-cAeVceneW#?BUU~bmQR8U6ljkl=5w)rD3@Xt2Gc@%o zxAORd3y_lTd4Ar#Uu-4vtTe-sLV#mTe|+&3O|(L61*|FdZrM_Wr)g;I8Z8!i(E@ zEw;%wo=qPedXi&v8vgRi5I~`Y>NuiN_H{Y0zJEym8$YLf4;C-NqqiQ-R5&vonsJ7b zu$=zWbO?Ss-YlGdD`;X@Zh+fKPm(7@2TZq=sMQh zPcO80dGrk>-F4(%TwDu%8XaexJGFu-`2qq(oy=sh%s;4Uam( zku9f=6*xE0N*qe1OWXPA%|r8D&-10~{%$Ro{N>44DK19ui=Jn`s(}e|ZpQD>qR>;s zcXpPf39Oe>zI~Z<5_Ecg%5xvPUiuBeFPOEvjKAm=sn)U|^0~2-MN?txRg{r*DBBp| zjfVFV{0+5K?3*D^q8^_!sTNK?KQS)0J2`?#=NxZ7^A@s9y396W0bOYOoV>eQ{hvIY zaPKWDCyRAo415RG_bq~^%og_wOr9C;WWmP$v)t&dsc*k5lESH>onNGP3`(W?b!jdD ze(vqyTs!MY2~Qg&n`tRE?r9|xqEfyHSmwCgG70$VtSJA6f|8z;*we#Hy+;J@S_R2s zWVxt!k?P0){Izy=fITr-=B^?^#UA$IZWZp9a!`2{$?GMef)$55;?EtkmQ9lml^$$E z#cb`D{hIcN$G0P$CW6TKLj4SBxA|uzKDWTY-jGO(Gbi16%#)U=yF zRC@}FT;yf}#9Gz&HO4B<@~%~e!inkA!-IhAtQQNsgqkz-q-TplN4dtNS_XgHL1Yyw zUQwa27vASJcf2;vxY(m7ZuA^~qG*8e_%^1!_rO8bH6Fj+b$>yO43D0c>y=xPlFtnQ z!=uWoww=u!SQ0g)u)nr8VGYz2U)PZyV2P$EF}EI07hFxjwMIQyYC#5kH5Ve0nRT;Q zFTC=vY#f~g>q;1b5Fbh6Wj@aDuwUJ3g`O!ZS25St)%4tS;_15uG&WT>Jj^NI^!882 z^^n9-Sb_zNnzx5eWA#-X=K9cUPAzoYLg!{5(`xgWUo}fS*?YZEFQBga3OF&mWqKqe zONi;aYa<@;_qcP@VDAc8N04*)^v}c}l;7EQrmtg|iwoeOQmX`;CVK001cQuVvhK zkmTSlxF1p^qesv~8tQ4vA>aslgcq>~N; zjnqXW3}A2+8V*;Giwh^A?TFEY075juf)GtKQTTV8{~_llb0W=<{~_Dip|KHB(S!(p zBG$r0;j~;UI5+@J&?gx9=^%Ar0S1NvFccA`12gc42f~mj0uhBWAP@)!h}>_S585wr zy$34(U+iHnNbWsuZt#Bx&V9t~nEM2brv}ML3IG5+$yf_Br=X+-_i_sBlE4B>M}S9Q z0}R?y0ZB-MKoAfJBz2k(#raM{fRBTNkB>uu|3s9FpOcTDPf%j{$B{d-D|azxVRN%} zTzb>`Tri3<^>h7jT_sm`XX|I(!F`$*Q+6&}pruO?^r#An$f^!SvVX==hr_+|zBP;; zCj-maD(r;wAGjw~>%!w5elF+uzyXD0`c*Q#(-U(=LOHOIi}u&mPpW_x+;S|Ml+`SBIQdM?Z5 z880|qNkEI{+l@FM<69|K z^SZ4VOw-M?i#$?Z;E4c1QwhsXqeI_5xs28UJla3lbtB#(g4%6#i=Q}~I24e98qH

Gh`S91u@Jkj?qjYE#tWvhNtG(AGyAfHXUxQ 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 HDWM4fj8w`@ delta 1443 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 delta 1741 zcmV;;1~U1r9+e=F86g4y001Qm=7|6R010qNS#tmY3ljhU3ljkVnw%H_0120oa+n-s zVqr66VKXcsGB7eTFEKJNF*7YNH99ahIy5=6CIMsulhOtllcEC^lhOtllg|Sy0W*{P z100h=2qv>V1Tg^uHZ+rQ1sDQ0G_#BaO#`#02{r+LZ>Ln|000IgNkl*odl-ZRdWE`2=@chYG!y&lh} z)l@HkYnFZm8Dbr9{*^E$_dRBkP8M_e05w3D_^0W#ni>!MHo@EFi1| zw@3D;)zm&OK`pz6=mB^p-UR*_5BjrL`v&)aQ{j0tz6am%=_5_1yUF5(48(-(G1ep3 zR*fW9_aY@Mv0Y+o;~doz+tOW2chz|XN`_feP~HZ*bXNej$aA6RsJMrX3B7dJ92Ieg z>6WE6O@&5fk9X}D0^p=~cLWc*kd5Qw|JE$VQIJv#6mvaTNp_2+g2L*g?+r zG|(kZ>X!Se4-7%?cVtHt&TWn;ycqz8?1FX`RQK0e|BoN0noC zM6tm7h$6>K9Anm{x(HF%j2k+`Eqfw=x++9})}sN4q-p(-2tE`&!~xW1IAfPyFh#6; zWNxM__b{LaLs!APCSdG+jnK=f#5 zhS3aY`sm^zlzmrC%3EX0xcl8e;c7lt9?;Qhh4%9Z1NVqO%7*6vrMt39Q@C0bc|6>~ zz@y|LR&#=MiD>iC6sPUe#b^lnL5dviT6$k%YX!y1O#v*hw#blt?UKdZ5GP-|biS^| zd@cZB?~<<_0Pl!bYm-+Hy*bo>07-3$gYbA%>)EH{HtH&6jUPQ<@eD>gU`Si@ihfc_ z^Eo3@h=7L<9IHR@mewQB^Mr<|=n%B|fG2FlYUKTOph@r<3?$z5H$H63G)oXO+_%HU z+_yEmcO0hkHQqC{f3UzBK#tkZpzb1-I*TH&xac}91-s<-F&4wtSh!^OTKp|f-;@7l}}1+wS=cNU%wcwtnl3CN+HP3j33f;2oljE*`l zYWctdYfD?!{@NI^G?dQQCltxo?s`0%1JohtJ)`(N5W^k7T46JX9F@UXxhb;Bnr8iR zBok-Z&THy%bM7=th%C*2%E;z>7j5S$i-DA839A8$_W?8mdU`L+=)_~siy8(Du4#(sO^dJ{o!gic%(N6w!+^$|sO&uv))}`=p=o8=u4{!}HmV%69J3r%mhEg2ItKlr zVZfFSEyokT-Lm8b-2C`l5Pdpd^O7s*vqPwKSBsTq>)-fbC1R^-B%N?|MQ_^BU}_v5 zQFv95_m-AjMx)SwKtnQ9xs7Wjs>vpi5w6t^2*htQRv^3`E+-Ta(`Vt(6GKfp z)JX>eGmjsgG3dI&MA0++BPM>^o=#k|(E&Gf7ZLYSV?ra`Ywz9; jmlJ9eVhH+Q-dq0*e}yh@WSTlK00000NkvXXu0mjf0lq#% diff --git a/FF1Lib/imagedata/bosses/OMNISENT.png b/FF1Lib/imagedata/bosses/OMNISENT.png index a92245c30c69fbf6fed2b8e9878b5c68c4687fea..b8808704960c4161b421165471b1f7b738d798fb 100644 GIT binary patch delta 1576 zcma)6eK^wz9RJxSBxa4vyIG1ymc7|#*Mvx3Pbe(9HrpOERxm&?6G#LiouvdraC-I_Pu(apgUup`von~TS7|X)LF523(nU%r zs}sZ}n=hy(BM?=^MAn`2HdmnUU60EYZA{-)LwloRQqzcbSi=N}9o~F@f1KeF)_af{ zX;5ZD*qiHtW-MCVTdZ9O4(}j{^{g~uCoK`inO*Skno_#5V7#)fk_A$BkGo7-!8N$| z-?c7v6m2qwF`TRbRpThEHC>3s{@f|(y6LOwdN9Hh7BtP8))Wx4E1^J9%`4i~+Nopq zd25c*9W;gSfd@B}(rxBk-jWOM8Wo4ZGpn?R%Y)pV;UW1l#(d$pJY~ zzzXqN4JxTso$s8yUd$?2S=LLsizgctqBX9jK}Q}wb9I8FOXThO-#dzSJ{D9}`+Mx4 zoaBc`QWXrg*sy=YQA8kQrVgOW8Zw*XRW^s{*-7~pzUN0pyPHK|Sawbd&(ZBHD91Ej zaKgl5wYm&`%B_L)qJNmvsUGIM$%+jwX+>(rZYg;)gY%R#i;N2>`*ETZ-YJJmQOy}eoXd4U~n`gXV zbLE59@%BgG2_zjA#(SWM0nxN#IA^&M>NS+1=O$}HB5+yR%9llpV-L4y&SYOsADr;g z9jOuj7M(&t`&^0IHTG#xyXknkP20l0%*|0-#v`F;fLYqqAo#$2VwIZWuny0S2 delta 1880 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 delta 1663 zcma)$c{~#g1IO9p?5RCGzFXE;l=>Knq1fAIZTD|%ZAe6VIc zCmVJ0&hnVVV!~Wn7r%T@rt8H;Q9;eL_j|)V_trdCL-WS4%a^u|eFMmsqKYF`;qyu` znU@<=gU_gfPvvlT?l$gOcwf)Vk1jC^OgZz+mGk@$ z2JGP$fx5NaM!HGRiVhBEfb*fZC#bu7g|PF`Cseqwp!U=w%Rd=;*kXvUf3zk12JFGn zsF@tfyauW)$O~L5J3!F2YU;dEIYB5p#<1$twb2<*iAp;l#X3e4kr> z!c{76H?!%DP&*Yeqs=VTQaao9P{+1g-8;GtrcQAxTYjVkc$s%>*4i~z_u1&)r0T0VQ}a~n`kj|}oa z#r(3_#FaHCAI9cn<3RcvE47-dwP#3PIDfC#Ey@bUkhLtP3{@JOV=w%O3AzGJ3exY; zm-UFLm6p|>Sx-Ca@k^dUOeVM~aa(qUx1-|G~myGaC3mo|J^Raxz7Y=*}z9fvkO>&ZYZesxbN%H2k^NgAPY@o(eyC4Xw~PINVAkZx zk`22nWvl%>V-H`XaPNv(LZIh|3d0^Jwj(W-nVjM0e%}#Je&gBmr76C*&{VAn$In`r zGc1jsiWx!JGYUu3M3>G6WIxOZFl-;JzoY)p6yMWgKL&nvZsEGdDaHC=;P=yMN9g={ z;CGJz1@WY*;N{$EuJTG{=)_XB0ipgB9ie;N}~y%>wloM4y4K>uQqMyK;L zt^fH9;5!&fDue{u!39S@bI9*5*pRQ}2 zn)OZ(&Vt(GPv#Eiz2!5`MEjnqRQ-s#xXS0>=Vywq&SOa>(Ll9PKQH*NQDtbX=QAjBXUpLY)nTXl6wHxiwFo zJbYexba^!8G4A?XqERm7wQ>g~B(6hg{0~k@elLD}u-ZZL&b&Xa&#g93(-8c{oi-U$g9LVx#SM!xqQr815P9JNw z2gSTZRS&V~PqOG(HYu8!%_K}Y74Zs;_q5$#b@5bqku`=#Pbhj*0%R&q9>*cw7szFy z`ED`hCtZ&w8(Z7kc<+nf?)pD!X|46S`EhFF068~zVDNyiE~?QsKK#*-BJVcauORHJd|qB0nOys6K59vN>NDsHh>b*9=9ml%SS+se$Ltt;o_dxZV5yIZQR zW-5$+>efZA_i>RUlC@8<_pVX4r?acDU*g|bg{N&Dr?coiV(cEAf%~HU~Q=yx{C5)}I&&3-|y4 diff --git a/FF1Lib/imagedata/bosses/T.ARMOR.png b/FF1Lib/imagedata/bosses/T.ARMOR.png index a1861ed7150a14502a27b4f5b6b90408b027755d..186a0400afa9dbad1f27f90de117546a822e55b4 100644 GIT binary patch delta 1494 zcmew^x=3O|2^0JBiDfgT4Ulzw_7#drd8e5r| zPv&Np#T2w)4p1>QFi1^KHAvM>OH8)ZO))S@(oHh3Fw-?RN=Y#=wM?E9d;2{G#B3#N)UB}i=JxmwAgcAe*RbfdXhsmm}oUhcoEgE?je2JkUx$Ws;Zq>$?Wh_MVd%HMTs8zW<%` z%JV5E^5;%`vT48myWaGz1=pLeLCaH|q8>4GRWWVRI=k0(YuPj1T2_rIll-FEC(ccm z@?m@(zECAnpsUEfXt{&_2MssPrP>Z9fjwqtsyvVI=g#`>bA0de<=?-25^Sko|F_et zAc%i)i3ztLi*42W5{=)_7t0z)rO8gY_Ka<>cG`})qGg(Yj_A(eV0?W!AkirQs%hB0 z>gR0VE~W{pI8^oAImWPZO1k9Ev=GM7r#oC$vi5bE-I$)%z_IkGcIPcKZq_ent$FYB zyyw>wEA`?yt$e4-(qOa8QuW74CG*Xu)_YExKgmih?nI7S;kz4#8|r-DG90a|u|2f$ zt-^{K4GEhTMBm${CGsf2cgORDtD0}`?cY%v{?x-ue{#V0m24U!I)U1MYvwjN1o9?% z?$O)s_n1>bfu%E%=d>BOu*Q83uVxdW-$IVLN^@1>4huIIv(IC@o$Hd+`TTex_tqJY zrv=u(c$YAjzy;6p0+bc#20 zt$ceneC09GgFBSZTs(6vCNoX^)t0usiFe+=lJwT&aMh?^lNtBkaC^wJD67h&ti`pT zs`xt;9Qt|{jT|2cD`v$igd0s%@{sZ0?WAJC<9%4dbav4#XQ^FRHZpteU2UPr{6NBj zdC%So#^q^To35_0GcG%txP9*T)E_^sDz`k;ZirA4TH-r($$lZFH>SrWE^J$Osq91W zb)DFQmnJc63VmQMfD&J1i2H*k-a6aMX04FFPl7-FN>krv&C2?c{xZ zOwKQ#e-hc)DlN`i@-@V}JyBktGwk3rn{PQz<|jA*dBIkfyO8?9x%&hS zyroUvX0HAu8ogC*i^ifQx;ynmgAbnPIz3(ScDB!}Sf*HxU2|mgdS)Ek%{|rcSTFze zE3(WV&Yf#bPR~8RPxhO8`inIF`ulbNjD9R%X#X~T`+f#}n?LVtC)HLlFfj0?MtG+A c`Z8z%*&IL&0+)g(14&K>Pgg&ebxsLQ03XI^W&i*H delta 1226 zcmZ1^@m+L62@~72iDfgT%@WOwEzNWkj0}uS^bL&l4UKdS%&kl;tc;8|YcZxUPJY6a zD_{Z?(={*-F*LU_FtRc=ot(%liz(R09H5e7l4fRVVPTiDmlc5Z1eluEeNTQYbEQEi17q&q&R)RRTE^-7)W24JO}YQ<{8& zJ+eOPOO_=A1M_K57srr@*0<9R7Co`xahBKU{`-G^ww2I#hnsK9if+tYdH1r$)FLHs z0ZyR_58wabcl$kG@QuIn559(fA`gJ{RtAHF-!o4BNo|PPle<6I(O9DUXS{V)FYoN< z_ZM&7Xpzx#-on*r{%l5{P1-Gt>g?bDUUNyxvY%Ri=2pgquy1EGoBPv@vL~r1-sD%| zJaCwk;o9f9jVq@uS>~(rd1m|9-}SazbKlNwoO!~>L-n%4epA2Mwb?yx(ssN06nQsj zc`&EW?RW56+ZoLzx1r9~#&grT?Kj_LyXx&YuM(Agn0d}alR}@&Ek|`^ga=acq4Qze;* z{>49xk9l2v_NcZ;^l&q?XsgAMt8C)GwnPT%nHJg?*uAJ9M|0X_Vk*jU6yWy$s`WLsqUg`A8M2?72BFyEspS#Fgw&z?z`Gc+V zC7-XHUvh$Zf%{2)#?4#rYcC8CI38Uz@p^1}!=1aaN25G0nOv*mZ@OE4Ao>2sUxB6@ z;wNzLQSnJ?pLV%wP0_ktR}NLW8ocNDYWCUUOtGa{%XQB}If?JPcO_Z+9#ys}sjt}S zdS&9go!i3V3lGNhZ(nQe*dRUY@<|qU?Uom{jWH>Yyqn%LRbw^UF2F+a@w{Ym7xNM20tgX=!wQa-gco*THfJty>Mo zw;1(qmw0q}Yu113h2@Kj<8&%3Dg>(;)?J>gbzw8hYNPjhhh8T&?yIPsxqJ7tFLw?W z_FoRjmk7wa6uh&r=z+`n_cKmDe7-64XJ6Rb&Qig4_2ZLX2N}xdyx&kG`KjV;)?V)g z+z0j5+qsobRh)NPI`QD+Q_G#~gex}}Kg@W4y!ai@?_{Gt?d$i=Z~uR7_5R24{q+nT Ws(<{x{cu~#00f?{elF{r5}E*1!z1+o diff --git a/FF1Lib/imagedata/bosses/WHEELS.png b/FF1Lib/imagedata/bosses/WHEELS.png new file mode 100644 index 0000000000000000000000000000000000000000..a4df1648f8b6d159f1edf796b26618a3975a66d8 GIT binary patch literal 3052 zcmbVO3se(V8jj)vtq)x47F>#PbUjp^WM(o+$VjA05KzM_L4&K}Wab7&lT1to60ll) zP*GgnwR%J?i!3TDEvT)>wTgmTA9c05c6$~V)Ux7RQM974_PBRQh>xSy(|eM+ckch) z|MA`bzju}=C&u;fJEX5fBI%zHuSr2778jrA1ctms zBa=6m(XdGLIBArJf(mRvprsz0)$XD^TBK7i1;^sF9FcZHgt=N|yl7Br(kDw}cqfo* zWH`!T7$H?_WHipOIAIwhB`|`N<2d}GxQ4MdzG;yxL2yuV zx!diQxfL?rnJLFL8jTzyH6^UWs-Ya~(jQ3S4})lL4_g(9Pjp(FmO78J#bz z79}tE1w7nqprXVNbx<)*KnuLn$n(~&{ZH;9LP{uQYH7qY&d%~~*9W2-z6C%>3qXsA zxqxCy6eo=YM&SyI)SwtiVVD=H=UL8@>xU{)Oo8HrQN-aC@gfvvB1;SO8^J6?S$L<7 zhBR_EIupnp_Dn?T-yAB2xAIPCSoE&b3%#C7u)74>&VU4+7J(tiIF6+vfl3icTOv__ z;TWonByp5hnawDvR+`NOPODXFvTMDLXR^h75!ZWbhvgZl!=rN1N+&m*y7sCdo=vo6LwW-^j{I zJBx&(8E+7bn4f?}eAC=3w({*r^Qv`c0Z7*` zcAZfH3#MevD9~UuYGFtcHIr&JiotZU02ON{=*X_npLZQ16h<7Q6bcH573eLww{>0f zd`Wv3F`h|eSh0(~phd=BsPa550 z(aogZD>Ktq|Af~yEIahYyN<0zKkZcHPQ91XcBhwh)3umT%{NU=?LUO~GL=QAo(el@ zh$z3^oHQz|;gozzXjp9b?c{NJTb=cZYu}lisr4~sUlb~vgHMDo`7`?#_vr?HliYK` zM~#}WsOg*Dqf-J+M|B0xl|$PeU;S{?CxuTUBz?k%rn@f<-s>3~G-6Ik(9)*RkDu&3 zzJJBOmddCv2ka?!C$)6sU0Q!PTos(UuJ!Z$j)ETx3|mH*luIt8?OA&LAX0lT>Wqc1 z>u?XtDA=`Y=%_~9=_+UA`&C0CCJcN0Uym@Xwt81f%jt~Djrrv>RrhUUd%gR(`9#X} zqM+2_j*I-ExD>KwM`K*-*>$@!?i>#(-hdy%ZXL|W0~2QsUi^rN&W~&%HsPQ5H^iT{ zwLZMCF#j~@S6ydlCl~C>E82OAyc4HKB-`A@$xF>#T-C(g`&w_Dr|RSC+*cm`VeM*x z9WkE){M9&H(v=;nf(irwTKQuvpEqxPX;9%G$JMSna{A^(cSe<`WL(Alfu`kuGlaBT zGG`zwDz`q#LG$(nWL&^ze?Ox~&6#j*#r^qV6Azv%==M0oGUY*3RP?tEBgfwgS#+X) zdqHzPKI!a)nwdLK{?E8@YxzxGH~PEl!KR>(Bp2(OZHD&vVS^U^hhJ9OkWg1qE*mhZ zeci%sBf8Jod^>iw`sVVowX2gy&Q1%<9;@y%XpO)+KB#SuuwHGd3g?P;rR^^|HuWGI zWK5157Un5k-}^7`of)3H&yq=0jO{z}`-;|8-?E1nF6MI-1gM9Z>9e@J(^fm~CIz&)HhK z@!_`J8P~RuN7~Yg76he?nzbP|=|+CxWnIlwW=HxAN6%wprdRG=@#%xZb=@63Y8SF& zbU)uoIreo=&9sK_1$S4>N_w>U^0`B;4>td{c+ESi4cYNM)Va~sN1Ntt*%124;3fZl tIB-fsM@7&3I}GpxdH^sbSoC_yC^!xjzo=n5XZTd?5@Hi|)e~kf{y#jbWzGNq literal 0 HcmV?d00001 diff --git a/FF1Lib/imagedata/bosses/WREXSOUL.png b/FF1Lib/imagedata/bosses/WREXSOUL.png index 5892328131696dc4a91429dd8c89c453e2bd76d6..cd9e6d32358382600da4c97978a7531915195692 100644 GIT binary patch delta 1643 zcmaDQ_D5oZilJzLPlzi61H=FS|NqReIN`&ygn{ADpFcpZR9*-lP=dWA$S)Yk1p)>s zZ)UfNvEoeZ%O{r2lr~IGF*HikQ7|$vGSN3Q1R`BSODh8lD-*NLT8t@-965Q#RwbEf zX_MzMiiv_4`i6Q2`br8FxgeR;icGK!Cx`)-ncT%xC}65Cn8)5?duBB?XXg zteo?6@{58C5|dMHm8{K7O^r>V5&@YNsW}lYnYpQX#SoWR!t{WpB2lF_JF(nnbRoi{ zN(#j#u4N@wG0s1gSJ(T0<$w59`ba#()2MpYACsH^ z?w1G=75S&^y{FwZyU^tnQ_lgtyzHL|7m9LkDQ#i6q;vI??!+4QITM6?mlZ$m=G1jM zCvAAodx4H}cJ8U8^_S9ivSb|0)|F?N;(BK13LQU(=p@d0oqMJ`2tK?x)5UnQam(8f zor#9$m)3yAssMJK;=^qr6Hn~)Iv1JK9aA1p3i+g-uQbeq~>tNDVtvR~f z*AzQ`ur4@L7bm8(Q^!EBd#m)9XX<;8ssH{t>7zI+x3lgwtt|qtulm>POTEz9uq7$w zmZ8*)IU?Q}o~!5G{*m?c#*eK!MTu8;9RO%!#x2fj{`H#X4VN3$Q`4MoSGP>-Ni$eHRj_EorOAbc7QG=2 z{&ZtkSW1`{j{~;rW3op84^hgQ2Cc(ILhtQy&FI5#!9vr%Hy!%nAH@>^^5$PIPUX z#!%juF_ZIW=fT?t7cG{al&I;n_4tm{o|}$@Z>yJBb<^^k;*1wEixm5BO;)syy0~6* z{`SutX?>uR)9xV_lroM-=x?VH~` zF0jq9=rOt26VvADm~AIf!*u4{L}RHfjeM(KP5FAO^ZaE=mYwN2&HDf5UJ&>a&+z2Q zv_DsjXRns5uig1MouOpvwUe%DnU6A(?Wf&~EnMr_kmoU}?=;)=vh56({yM);@lUoi zITORNoq;(eUB0pML&J-*%enDucQAXDJ*-?&zT~`J?b*xSx9;9fPk-N&u3Qv8=`Y6~ zlOHBR238gqI1itZdm>yIwEx&AUrx_+W}1ZYVe8Ymay*yj|H9`1$?)RU#YXH9C^67!!F%H-Pyu(Sw8=?*VoTe?R{H_42UsgBw5Q zZhZcrcHQl>EQ@Q+*cs38ylDG>UUkkPd;e>{U)$S?=DW@Q|HB?wKk%hSc&7RKGH3zW V96$^Lmx3pQC{I^Emvv4FO#taUuXF$a delta 1395 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 T!F46E)X_vo#;K}iB^Ue~TSpG+ literal 0 HcmV?d00001 diff --git a/FF1R/FF1R.csproj b/FF1R/FF1R.csproj index 014159a49..e028394c8 100644 --- a/FF1R/FF1R.csproj +++ b/FF1R/FF1R.csproj @@ -17,7 +17,7 @@ - + From 304a8ca368f3286847a2d9183f76a6578164f50d Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Sun, 16 Mar 2025 11:33:44 -0400 Subject: [PATCH 14/61] Fix NoOw floor shuffle crash --- FF1Lib/MetroidVaniaMap.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/FF1Lib/MetroidVaniaMap.cs b/FF1Lib/MetroidVaniaMap.cs index 7b429a7ed..4c97f5710 100644 --- a/FF1Lib/MetroidVaniaMap.cs +++ b/FF1Lib/MetroidVaniaMap.cs @@ -1547,7 +1547,13 @@ public void ShuffleFloor(StandardMaps maps, Teleporters teleportersdata, TileSet var freenpc = maps[(MapIndex)originTeleporter.Destination].MapObjects.FindNpc(ObjectId.None); - if (freenpc.Index > 0 || (freenpc.Index == 0 && freenpc.Coords == new Sanity.SCCoords(0, 0))) + // A few maps have no free npcs, because they're 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); From 0717814eb473fb83d17f2b6fd151fb111a315121 Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Mon, 17 Mar 2025 09:41:11 -0400 Subject: [PATCH 15/61] Fix Deep Dungeon ap shard bug --- FF1Lib/archipelago/Archipelago.cs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/FF1Lib/archipelago/Archipelago.cs b/FF1Lib/archipelago/Archipelago.cs index b9c184a9e..297503a9f 100644 --- a/FF1Lib/archipelago/Archipelago.cs +++ b/FF1Lib/archipelago/Archipelago.cs @@ -87,11 +87,18 @@ 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 + { + kiPlacement = kiPlacement.GroupBy(r => r.Address).Select(g => g.First()).ToList(); + } + logic = new SCLogic(rom, checker.Main, kiPlacement, locations, flags, true); } From 4b977e41f53356bce17e44cd4c542c94097affc0 Mon Sep 17 00:00:00 2001 From: Oslodo <161620626+Oslodo@users.noreply.github.com> Date: Tue, 18 Mar 2025 20:36:31 -0300 Subject: [PATCH 16/61] Alt fiends (#1117) * Adding Alt Fiends and testing code to for Alt fiends selection (currently broken) * Finished adding fiends * Alt Fiend Code Re-done, working * Alt Fiends work * Fiends added, tool tips updated * Added final FF4 fiends * Alt Fiend code finished * Fixed Bad Fiends * Fixed Fiend errors * Fixed missing value on fiend * Subshell for FF5 fiends created * Gave Bubbles back Fade * Hurray Added Start of FF5 * 2 more fiends added * More Fiends added * All 'C' fiend finished * Finished D and E, moved Gilly back home to FFV * Fiends to 'O' completed * All FFV fiends Finished * Added Missing Tool Tip * FF6 Fiends entered, first 4 * Missing Flagset * More Fiend work * Missing code re-added * Troubleshooting hanging fiends * Confirmed Alt Fiends working * D's and E's finished * 'F' Fiends finished and tested * Finished G and H Fiends * "I" Fiends completed * "K" Fiends finished * "N" Fiends Done * "P" Fiends added and Tested * Missing M Master and R fiends done * "S" Fiends Done * Started on "T" Fiends * "T" Fiends completed * FF6 fiends completed * Tooltip added for FF6 Fiends * Testing * Update to fiend skills * Fixed error * Removed Ruse from Alt Fiend Scripts * Fiend Code Clean Up * New Fiends added * FF2 to FF4 Fiend Patch applied * FF5 Fiends Patched * FF6 Fiend Patch applied * FF1Bonus Fiend patch applied * New Alt Fiends added to pool * Tooltips Updates * Code Clean Up * Updated Alt Fiend Images * More Fiend Updates * New Alt Fiend Art * New Friends Added * New Alt Fiend added --- FF1Lib/AltFiends.cs | 19 +++++++++++++++++++ FF1Lib/FF1Lib.csproj | 1 + FF1Lib/imagedata/bosses/SEPHROTH.png | Bin 0 -> 3102 bytes 3 files changed, 20 insertions(+) create mode 100644 FF1Lib/imagedata/bosses/SEPHROTH.png diff --git a/FF1Lib/AltFiends.cs b/FF1Lib/AltFiends.cs index dedb54116..d3687bb34 100644 --- a/FF1Lib/AltFiends.cs +++ b/FF1Lib/AltFiends.cs @@ -3146,6 +3146,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 = 0x00, + Skills2 = new List { (byte)EnemySkills.Nuclear, (byte)EnemySkills.Blaze, (byte)EnemySkills.Thunder, (byte)EnemySkills.Blizzard }, + }, + new AlternateFiends { Name = "VAMAKALI", SpriteSheet = FormationSpriteSheet.KrakenTiamat, diff --git a/FF1Lib/FF1Lib.csproj b/FF1Lib/FF1Lib.csproj index 1f5c5fe0a..91dcb1a39 100644 --- a/FF1Lib/FF1Lib.csproj +++ b/FF1Lib/FF1Lib.csproj @@ -207,6 +207,7 @@ + diff --git a/FF1Lib/imagedata/bosses/SEPHROTH.png b/FF1Lib/imagedata/bosses/SEPHROTH.png new file mode 100644 index 0000000000000000000000000000000000000000..c6cadc286ede831c3844c73fc220f3af66c23988 GIT binary patch literal 3102 zcmbVO2~-o;8V=G5s3;E#rB-bW+Tt?FOfp$!BrFmN2tkC1fa_#t0;5SLBmn{x7Zi8v zR`8X&U>}H8T6{`@rw@GKf)+jcTyWR&@JU^<^?1Y$-W?KfIa)pMo@DNw`+xUezWe|8 z&a&8;aQA+L`|)@@_s9rU9O#3&zpFENZmM2z2Xwx%(V8&OcXf67229(2{n@kg+YcT* zXti3wjGJ=xSs-(@#>K>gSFZ7{F04%gb8e=HBnyw%-;4V@@rpM3@^~&~j3&{VsE)=- z)*vJ(R!a+Q1`|N@cmY8+6G6_Qt$Zz=!Wfl;_I>*We1=jArbyMW+7wEsG7;HkIzBr_ zLuSt*F-i~=$PcjLK!Jg_5`3FMZ?xbxrJ!3c4#wQHNWkxgSm!7OA)G;eqB@oz%9?3D zCPW|-hQ)k2CL|D&Ld3eUd@(FWMF;|Z5Q5>b0!L+hM-u>ZW=e<0slId=18+(}s?}=3 zMWW2iOkt)($eL3`2!>%ISS%8YA%K7^Sw<^igNzox9t|qmLYf(qm0^v1P9vdZ)2&JY zaMd1z!PKkPXmRia7!%nDlL!&QTuj|SitNRi(#`sA;}j{P^|XODS}g#J^kPk^td+H- zvTsq{D}KcQ;8v~fwedz@42E747He1r2*W|h8_^a`mWdX{(H1t{OwwT)z)ioNXsnFx z1)Z;~<|ME9McbISKsiY-)P#qcX~N2yH7u*|+5gxcBKTsdP|o+C!Wbzw(=v*4!?A!? z5ms6$;Bo^hl}el0NBV8>#21nXJSElPS##GOZ6#o!T)1!P^8 z7=7&lvYeAdP0BMb%2m)5Ku%C z903(*FS+-19ecT??Tg4%!k9vXt3)LD|ATqIl6q|)-gYRwUobKu`p#fP+y!FKFwyJD z*DZVLvH=^}Jq2zsZrFQwf|uUgmo@^P%-r4D{#`PU=iC&j3ehCy=NC?0cZlz*8Wgd+ z>*434A1pXAqWW-A(PjTi^+Mkkspna*kw?XCBPXdwiRR=w^M2qzT^W0-?B>V8lY*Oq z;tl7&&^sL=k;dy^HLmthUG)fB^mwC>A}z5`WG?aPz^|BM({z!~%&;!yCzT0HE0-5E2JuF>=M9UV z%5QYfE2~=glexP72(?}CI_^eCx%D{^IT@Mba^r@sdHF-nqAOB&zX8W$rRBBL@nz_uU)NN( zo-f}!Q?`N>AG*9;x@UFinug2YcH;SdU(2`;`7Z~Y&?8_ z$L@olRbbniT;ZvmYI8x;-FjLf;7)-UFzPiet+I96uq5tx@ z^1LjjV$jO62KRblVEEinBU$rpLg{Q}>)FP`S?re6*FIFV^qXjqm!+6Iwh+R-Ov=#C zfftrdoiZsjr}ZII^Qct3t!&e%ZT=bg9>Xq8T$JQm7v0y*McBF<+Fv&%`rGHlV^7x= z`2HdtS({Vc1TEb-Tt2U9;?Dj*%_^>Mz30t72s~0dH+*YU`>~6;lNXFj4r|p$HHRf6 z94{%^H*U)8+?j(4U6wS@o>5R5JLYEz@A`QUp#6^<^U%1K^54BP%Kll<_5FdB`@;)P z51p|*Zf8}(ou{k*{@bnxL4sA@KYI7?dl%2Wiq%%hI;Ss8o^*2XiNYn%J=*U6`|+b8 z#b=VeH93Pve4V_xQ+UT~X``^;WN%GD$Z)@?oFn&tTg=0&FG5)ADz@!{(51>r4vSPqi4&xyE_lt_Cf1gW)vj3wd4jq4u4YBq(z22zI`^} z`G#Tp6Sf*$kE?H%cKoBOBge9I{0C2%WM1L(R==C+hc<7@9&@;D?~%QhXP#NfVW0ew zuqI`Gqg%2d-`zya2bZQ* wRl~Pj=b6eY)!7n59r)ZHNGC?>)N0;nFm~m>zd<_{zn<$N!(voFjh~hGKQ>u_5C8xG literal 0 HcmV?d00001 From 80a6acf5200303080c55a58e0c7abc3bab06e1f4 Mon Sep 17 00:00:00 2001 From: Oslodo <161620626+Oslodo@users.noreply.github.com> Date: Tue, 18 Mar 2025 21:07:25 -0300 Subject: [PATCH 17/61] Alt fiends (#1118) * Adding Alt Fiends and testing code to for Alt fiends selection (currently broken) * Finished adding fiends * Alt Fiend Code Re-done, working * Alt Fiends work * Fiends added, tool tips updated * Added final FF4 fiends * Alt Fiend code finished * Fixed Bad Fiends * Fixed Fiend errors * Fixed missing value on fiend * Subshell for FF5 fiends created * Gave Bubbles back Fade * Hurray Added Start of FF5 * 2 more fiends added * More Fiends added * All 'C' fiend finished * Finished D and E, moved Gilly back home to FFV * Fiends to 'O' completed * All FFV fiends Finished * Added Missing Tool Tip * FF6 Fiends entered, first 4 * Missing Flagset * More Fiend work * Missing code re-added * Troubleshooting hanging fiends * Confirmed Alt Fiends working * D's and E's finished * 'F' Fiends finished and tested * Finished G and H Fiends * "I" Fiends completed * "K" Fiends finished * "N" Fiends Done * "P" Fiends added and Tested * Missing M Master and R fiends done * "S" Fiends Done * Started on "T" Fiends * "T" Fiends completed * FF6 fiends completed * Tooltip added for FF6 Fiends * Testing * Update to fiend skills * Fixed error * Removed Ruse from Alt Fiend Scripts * Fiend Code Clean Up * New Fiends added * FF2 to FF4 Fiend Patch applied * FF5 Fiends Patched * FF6 Fiend Patch applied * FF1Bonus Fiend patch applied * New Alt Fiends added to pool * Tooltips Updates * Code Clean Up * Updated Alt Fiend Images * More Fiend Updates * New Alt Fiend Art * New Friends Added * New Alt Fiend added * Fixed error --- FF1Lib/AltFiends.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FF1Lib/AltFiends.cs b/FF1Lib/AltFiends.cs index d3687bb34..78e4a4456 100644 --- a/FF1Lib/AltFiends.cs +++ b/FF1Lib/AltFiends.cs @@ -3161,7 +3161,7 @@ public void AlternativeFiends(ExtAltFiends extAltFiends, EnemyScripts enemyScrip 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 = 0x00, + SkillChance2 = 0x40, Skills2 = new List { (byte)EnemySkills.Nuclear, (byte)EnemySkills.Blaze, (byte)EnemySkills.Thunder, (byte)EnemySkills.Blizzard }, }, From 90c47cb2f075facda906ffe27227d61c1e6617e0 Mon Sep 17 00:00:00 2001 From: Oslodo <161620626+Oslodo@users.noreply.github.com> Date: Mon, 24 Mar 2025 23:44:39 -0300 Subject: [PATCH 18/61] Alt fiends (#1119) * Adding Alt Fiends and testing code to for Alt fiends selection (currently broken) * Finished adding fiends * Alt Fiend Code Re-done, working * Alt Fiends work * Fiends added, tool tips updated * Added final FF4 fiends * Alt Fiend code finished * Fixed Bad Fiends * Fixed Fiend errors * Fixed missing value on fiend * Subshell for FF5 fiends created * Gave Bubbles back Fade * Hurray Added Start of FF5 * 2 more fiends added * More Fiends added * All 'C' fiend finished * Finished D and E, moved Gilly back home to FFV * Fiends to 'O' completed * All FFV fiends Finished * Added Missing Tool Tip * FF6 Fiends entered, first 4 * Missing Flagset * More Fiend work * Missing code re-added * Troubleshooting hanging fiends * Confirmed Alt Fiends working * D's and E's finished * 'F' Fiends finished and tested * Finished G and H Fiends * "I" Fiends completed * "K" Fiends finished * "N" Fiends Done * "P" Fiends added and Tested * Missing M Master and R fiends done * "S" Fiends Done * Started on "T" Fiends * "T" Fiends completed * FF6 fiends completed * Tooltip added for FF6 Fiends * Testing * Update to fiend skills * Fixed error * Removed Ruse from Alt Fiend Scripts * Fiend Code Clean Up * New Fiends added * FF2 to FF4 Fiend Patch applied * FF5 Fiends Patched * FF6 Fiend Patch applied * FF1Bonus Fiend patch applied * New Alt Fiends added to pool * Tooltips Updates * Code Clean Up * Updated Alt Fiend Images * More Fiend Updates * New Alt Fiend Art * New Friends Added * New Alt Fiend added * Fixed error * Fixed Issue With Fiend Code --- FF1Lib/AltFiends.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FF1Lib/AltFiends.cs b/FF1Lib/AltFiends.cs index 78e4a4456..42c9204a0 100644 --- a/FF1Lib/AltFiends.cs +++ b/FF1Lib/AltFiends.cs @@ -2812,11 +2812,11 @@ 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 }, }, From 363f98e76af92e10853546dc29bffceb928dfbba Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Sun, 13 Apr 2025 09:42:06 -0400 Subject: [PATCH 19/61] Fix Sanity npc requirements overwriting tile requirement --- FF1Lib/Sanity/SCMap.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) 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) From 941aa6cd11aa7600d61be1122b4eb17990750df9 Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Fri, 25 Apr 2025 07:55:40 -0400 Subject: [PATCH 20/61] NoOverworld fix Onrac sigil block --- FF1Lib/MapObjects.cs | 3 ++- FF1Lib/MetroidVaniaMap.cs | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) 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 4c97f5710..a6b8344c4 100644 --- a/FF1Lib/MetroidVaniaMap.cs +++ b/FF1Lib/MetroidVaniaMap.cs @@ -1545,9 +1545,20 @@ 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); - // A few maps have no free npcs, because they're full of bats; so pick a bat instead + 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); From 96c3d64be00573a2ff560a8d2b2e135f1b49c741 Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Mon, 28 Apr 2025 07:35:48 -0400 Subject: [PATCH 21/61] Remove Procgen Waterfall at author's request --- FF1Blazorizer/Tabs/DungeonsTab.razor | 1 - .../presets/Fall_League_-_0_Loose_3_Orbs.json | 2 +- .../presets/Fall_League_-_E-F_Shuffle.json | 2 +- ...ll_League_-_Procgen_OW_Oops_All_Loose.json | 2 +- .../presets/Winter_Tournament_2024.json | 2 +- FF1Blazorizer/wwwroot/presets/Beginner.json | 1 - FF1Blazorizer/wwwroot/presets/Chaos_Rush.json | 1 - .../wwwroot/presets/Deep_Dungeon.json | 1 - .../presets/Entrance_Floor_Shuffle.json | 1 - .../wwwroot/presets/Floaterless.json | 1 - .../wwwroot/presets/Free_Enterprise.json | 1 - .../wwwroot/presets/Hidden_Chaos.json | 1 - .../wwwroot/presets/Improved_Vanilla.json | 1 - .../wwwroot/presets/Lichs_Revenge.json | 1 - .../wwwroot/presets/Maximum_Troll.json | 1 - FF1Blazorizer/wwwroot/presets/NOverworld.json | 1 - .../wwwroot/presets/Oops_All_Loose.json | 1 - .../wwwroot/presets/Over_Randomizer.json | 1 - .../wwwroot/presets/Procgen_Overworld.json | 1 - FF1Blazorizer/wwwroot/presets/Shard_Hunt.json | 1 - .../presets/Winter_Tournament_2024.json | 1 - FF1Blazorizer/wwwroot/presets/default.json | 1 - .../wwwroot/presets/wt2025finals.json | 1 - .../wwwroot/presets/wt2025qfinals.json | 1 - .../wwwroot/presets/wt2025quals.json | 1 - FF1Blazorizer/wwwroot/presets/wt2025r16.json | 1 - FF1Blazorizer/wwwroot/presets/wt2025r32.json | 1 - FF1Blazorizer/wwwroot/presets/wt2025r64.json | 1 - FF1Blazorizer/wwwroot/presets/wt2025r8.json | 1 - .../wwwroot/presets/wt2025sfinals.json | 1 - FF1Lib/Credits.cs | 2 +- FF1Lib/Flags/Flags.cs | 1 - FF1Lib/StandardMaps/SMUpdates.cs | 2 +- FF1Lib/procgen/MapGenerator.cs | 2 - FF1Lib/procgen/WaterfallEngine.cs | 411 ------------------ 35 files changed, 6 insertions(+), 446 deletions(-) delete mode 100644 FF1Lib/procgen/WaterfallEngine.cs diff --git a/FF1Blazorizer/Tabs/DungeonsTab.razor b/FF1Blazorizer/Tabs/DungeonsTab.razor index c290086d6..5de30fb80 100644 --- a/FF1Blazorizer/Tabs/DungeonsTab.razor +++ b/FF1Blazorizer/Tabs/DungeonsTab.razor @@ -25,7 +25,6 @@ Bahamut's Hoard Hall of Dragons Mermaid Prison - Generated Waterfall Cave

Flip Dungeons Horizontally Flip Dungeons Vertically 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 index c28c87b9e..a0eb1cb06 100644 --- a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_0_Loose_3_Orbs.json +++ b/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_0_Loose_3_Orbs.json @@ -415,7 +415,7 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, + "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_E-F_Shuffle.json b/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_E-F_Shuffle.json index 5b0ab36b9..8c0ac0763 100644 --- a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_E-F_Shuffle.json +++ b/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_E-F_Shuffle.json @@ -414,7 +414,7 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, + "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, 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 index 99a99369a..3e0be029b 100644 --- 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 @@ -414,7 +414,7 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, + "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/output/wwwroot/presets/Winter_Tournament_2024.json b/FF1Blazorizer/output/wwwroot/presets/Winter_Tournament_2024.json index 1448322c7..c7d1bead4 100644 --- a/FF1Blazorizer/output/wwwroot/presets/Winter_Tournament_2024.json +++ b/FF1Blazorizer/output/wwwroot/presets/Winter_Tournament_2024.json @@ -417,7 +417,7 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, + "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/Beginner.json b/FF1Blazorizer/wwwroot/presets/Beginner.json index 201e883fc..fb3c52f6e 100644 --- a/FF1Blazorizer/wwwroot/presets/Beginner.json +++ b/FF1Blazorizer/wwwroot/presets/Beginner.json @@ -416,7 +416,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/Chaos_Rush.json b/FF1Blazorizer/wwwroot/presets/Chaos_Rush.json index 74a8ceb3c..4d3c323de 100644 --- a/FF1Blazorizer/wwwroot/presets/Chaos_Rush.json +++ b/FF1Blazorizer/wwwroot/presets/Chaos_Rush.json @@ -416,7 +416,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/Deep_Dungeon.json b/FF1Blazorizer/wwwroot/presets/Deep_Dungeon.json index b6bf3b2e1..a871c6053 100644 --- a/FF1Blazorizer/wwwroot/presets/Deep_Dungeon.json +++ b/FF1Blazorizer/wwwroot/presets/Deep_Dungeon.json @@ -416,7 +416,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/Entrance_Floor_Shuffle.json b/FF1Blazorizer/wwwroot/presets/Entrance_Floor_Shuffle.json index a86df5748..f3a24cab8 100644 --- a/FF1Blazorizer/wwwroot/presets/Entrance_Floor_Shuffle.json +++ b/FF1Blazorizer/wwwroot/presets/Entrance_Floor_Shuffle.json @@ -416,7 +416,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/Floaterless.json b/FF1Blazorizer/wwwroot/presets/Floaterless.json index 8d1abebda..3ebc330f9 100644 --- a/FF1Blazorizer/wwwroot/presets/Floaterless.json +++ b/FF1Blazorizer/wwwroot/presets/Floaterless.json @@ -416,7 +416,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/Free_Enterprise.json b/FF1Blazorizer/wwwroot/presets/Free_Enterprise.json index c0136a4ee..f73737053 100644 --- a/FF1Blazorizer/wwwroot/presets/Free_Enterprise.json +++ b/FF1Blazorizer/wwwroot/presets/Free_Enterprise.json @@ -416,7 +416,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/Hidden_Chaos.json b/FF1Blazorizer/wwwroot/presets/Hidden_Chaos.json index 712007cdc..bd12faed2 100644 --- a/FF1Blazorizer/wwwroot/presets/Hidden_Chaos.json +++ b/FF1Blazorizer/wwwroot/presets/Hidden_Chaos.json @@ -416,7 +416,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json b/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json index 08a5c70b3..8453bb9ca 100644 --- a/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json +++ b/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json @@ -416,7 +416,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json b/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json index 976fa6928..a0ce08fa8 100644 --- a/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json +++ b/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json @@ -416,7 +416,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/Maximum_Troll.json b/FF1Blazorizer/wwwroot/presets/Maximum_Troll.json index 887443323..615afa5be 100644 --- a/FF1Blazorizer/wwwroot/presets/Maximum_Troll.json +++ b/FF1Blazorizer/wwwroot/presets/Maximum_Troll.json @@ -385,7 +385,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": true, "EFGEarth1": false, "EFGEarth2": false, "FiendShuffle": true, diff --git a/FF1Blazorizer/wwwroot/presets/NOverworld.json b/FF1Blazorizer/wwwroot/presets/NOverworld.json index 1deffee6c..a3adf286f 100644 --- a/FF1Blazorizer/wwwroot/presets/NOverworld.json +++ b/FF1Blazorizer/wwwroot/presets/NOverworld.json @@ -416,7 +416,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/Oops_All_Loose.json b/FF1Blazorizer/wwwroot/presets/Oops_All_Loose.json index 63f4d1363..764d33aa5 100644 --- a/FF1Blazorizer/wwwroot/presets/Oops_All_Loose.json +++ b/FF1Blazorizer/wwwroot/presets/Oops_All_Loose.json @@ -416,7 +416,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/Over_Randomizer.json b/FF1Blazorizer/wwwroot/presets/Over_Randomizer.json index 0680d7675..8e0337ff3 100644 --- a/FF1Blazorizer/wwwroot/presets/Over_Randomizer.json +++ b/FF1Blazorizer/wwwroot/presets/Over_Randomizer.json @@ -416,7 +416,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": true, "FiendShuffle": true, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/Procgen_Overworld.json b/FF1Blazorizer/wwwroot/presets/Procgen_Overworld.json index 4243f890f..c8e15c5ee 100644 --- a/FF1Blazorizer/wwwroot/presets/Procgen_Overworld.json +++ b/FF1Blazorizer/wwwroot/presets/Procgen_Overworld.json @@ -416,7 +416,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/Shard_Hunt.json b/FF1Blazorizer/wwwroot/presets/Shard_Hunt.json index 4a689999a..d80963572 100644 --- a/FF1Blazorizer/wwwroot/presets/Shard_Hunt.json +++ b/FF1Blazorizer/wwwroot/presets/Shard_Hunt.json @@ -416,7 +416,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/Winter_Tournament_2024.json b/FF1Blazorizer/wwwroot/presets/Winter_Tournament_2024.json index b2b850bba..bd936c424 100644 --- a/FF1Blazorizer/wwwroot/presets/Winter_Tournament_2024.json +++ b/FF1Blazorizer/wwwroot/presets/Winter_Tournament_2024.json @@ -416,7 +416,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/default.json b/FF1Blazorizer/wwwroot/presets/default.json index e0bed3091..7de4e9945 100644 --- a/FF1Blazorizer/wwwroot/presets/default.json +++ b/FF1Blazorizer/wwwroot/presets/default.json @@ -416,7 +416,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025finals.json b/FF1Blazorizer/wwwroot/presets/wt2025finals.json index 1085d4f7d..f12752e66 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025finals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025finals.json @@ -422,7 +422,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json b/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json index 787145318..8e58024ba 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json @@ -422,7 +422,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025quals.json b/FF1Blazorizer/wwwroot/presets/wt2025quals.json index a3989d4ef..7430f40e5 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025quals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025quals.json @@ -422,7 +422,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025r16.json b/FF1Blazorizer/wwwroot/presets/wt2025r16.json index 798a0f4b8..76a67ab3e 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r16.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r16.json @@ -422,7 +422,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025r32.json b/FF1Blazorizer/wwwroot/presets/wt2025r32.json index 2caa1f6be..f0f171103 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r32.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r32.json @@ -422,7 +422,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025r64.json b/FF1Blazorizer/wwwroot/presets/wt2025r64.json index eb79561ee..b39a75ac7 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r64.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r64.json @@ -422,7 +422,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025r8.json b/FF1Blazorizer/wwwroot/presets/wt2025r8.json index ea3498ef5..e1e906bde 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r8.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r8.json @@ -422,7 +422,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json b/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json index 7aa1ca126..c42b94df7 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json @@ -422,7 +422,6 @@ "ClampMinimumStatScale": false, "ClampMinimumBossStatScale": false, "ClampMinimumPriceScale": false, - "EFGWaterfall": false, "FiendShuffle": false, "DisableTentSaving": false, "DisableInnSaving": false, 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/Flags/Flags.cs b/FF1Lib/Flags/Flags.cs index 990a50226..ca7c5b2c1 100644 --- a/FF1Lib/Flags/Flags.cs +++ b/FF1Lib/Flags/Flags.cs @@ -582,7 +582,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; diff --git a/FF1Lib/StandardMaps/SMUpdates.cs b/FF1Lib/StandardMaps/SMUpdates.cs index e5abb5a4a..c29da19df 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) 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); - } - } -} From 4ff902f44c00b164da733c4408e33b23535893a4 Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Mon, 28 Apr 2025 09:03:56 -0400 Subject: [PATCH 22/61] Fix build error --- FF1Lib/StandardMaps/FlippedMaps.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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) { From bc7e2ce8eb082108b6697e6e27652412849015e1 Mon Sep 17 00:00:00 2001 From: MeridianBC Date: Tue, 29 Apr 2025 23:40:00 -0300 Subject: [PATCH 23/61] Renamed FLOATER to AIRBOAT when airboat is enabled. --- FF1Lib/Hacks.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/FF1Lib/Hacks.cs b/FF1Lib/Hacks.cs index 10edfb351..a91d1a748 100644 --- a/FF1Lib/Hacks.cs +++ b/FF1Lib/Hacks.cs @@ -102,6 +102,10 @@ public void EnableAirBoat(Flags flags) // 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) From 63b29fadb1ef18028c61d648f01e366557390098 Mon Sep 17 00:00:00 2001 From: HQS Date: Mon, 5 May 2025 09:27:34 -0400 Subject: [PATCH 24/61] add more fiend tile setups for short tofr (#1120) --- FF1Blazorizer/Tabs/GoalTab.razor | 7 +- .../preserveFiendRefightsCheckBox.gif | Bin 99759 -> 0 bytes FF1Blazorizer/wwwroot/tooltips/tooltips.json | 12 +- FF1Lib/Flags/Flags.cs | 1 + FF1Lib/TempleOfFiends.cs | 155 +++++++++++++++++- 5 files changed, 157 insertions(+), 18 deletions(-) delete mode 100644 FF1Blazorizer/wwwroot/images/tooltips/preserveFiendRefightsCheckBox.gif 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/wwwroot/images/tooltips/preserveFiendRefightsCheckBox.gif b/FF1Blazorizer/wwwroot/images/tooltips/preserveFiendRefightsCheckBox.gif deleted file mode 100644 index 942461adcf9811dcb5f541df3dc3817f3b2d11ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99759 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
pR(#oO2~u{cxVSkTnirBNIhb9<^%&TxRe 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 Da|VyX diff --git a/FF1Blazorizer/wwwroot/tooltips/tooltips.json b/FF1Blazorizer/wwwroot/tooltips/tooltips.json index 5cf4d6215..72d1063c7 100644 --- a/FF1Blazorizer/wwwroot/tooltips/tooltips.json +++ b/FF1Blazorizer/wwwroot/tooltips/tooltips.json @@ -376,16 +376,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", diff --git a/FF1Lib/Flags/Flags.cs b/FF1Lib/Flags/Flags.cs index ca7c5b2c1..606ef5bc0 100644 --- a/FF1Lib/Flags/Flags.cs +++ b/FF1Lib/Flags/Flags.cs @@ -191,6 +191,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; diff --git a/FF1Lib/TempleOfFiends.cs b/FF1Lib/TempleOfFiends.cs index 0da8c1c06..b3f872550 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,14 +204,133 @@ 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; } maps[MapIndex.TempleOfFiendsRevisitedChaos].Map.Put((0x0A, 0x00), landingArea.ToArray()); From ae7c6b7cb8ded82316b80cc7d94cd07481524adb Mon Sep 17 00:00:00 2001 From: 1nf3rna Date: Fri, 16 May 2025 19:22:17 -0400 Subject: [PATCH 25/61] adding new ignore file --- .gitignore | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e7c1aeff3..3650abb3d 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 @@ -1035,5 +1041,5 @@ FF1Blazorizer/output/presets/full-npc.json FF1Blazorizer/output/presets/default.json FF1Blazorizer/output/presets/debug.json FF1Blazorizer/output/presets/beginner.json -FF1Lib/FF1Lib.sln FF1Blazorizer/output/wwwroot/images/tooltips/transmooglifier.gif +FF1Lib/FF1Lib.sln From ed9077deb44c80c67687eecef529526431424e98 Mon Sep 17 00:00:00 2001 From: Oslodo <161620626+Oslodo@users.noreply.github.com> Date: Sat, 24 May 2025 17:24:37 -0300 Subject: [PATCH 26/61] Alt fiends Additions (#1126) * Adding Alt Fiends and testing code to for Alt fiends selection (currently broken) * Finished adding fiends * Alt Fiend Code Re-done, working * Alt Fiends work * Fiends added, tool tips updated * Added final FF4 fiends * Alt Fiend code finished * Fixed Bad Fiends * Fixed Fiend errors * Fixed missing value on fiend * Subshell for FF5 fiends created * Gave Bubbles back Fade * Hurray Added Start of FF5 * 2 more fiends added * More Fiends added * All 'C' fiend finished * Finished D and E, moved Gilly back home to FFV * Fiends to 'O' completed * All FFV fiends Finished * Added Missing Tool Tip * FF6 Fiends entered, first 4 * Missing Flagset * More Fiend work * Missing code re-added * Troubleshooting hanging fiends * Confirmed Alt Fiends working * D's and E's finished * 'F' Fiends finished and tested * Finished G and H Fiends * "I" Fiends completed * "K" Fiends finished * "N" Fiends Done * "P" Fiends added and Tested * Missing M Master and R fiends done * "S" Fiends Done * Started on "T" Fiends * "T" Fiends completed * FF6 fiends completed * Tooltip added for FF6 Fiends * Testing * Update to fiend skills * Fixed error * Removed Ruse from Alt Fiend Scripts * Fiend Code Clean Up * New Fiends added * FF2 to FF4 Fiend Patch applied * FF5 Fiends Patched * FF6 Fiend Patch applied * FF1Bonus Fiend patch applied * New Alt Fiends added to pool * Tooltips Updates * Code Clean Up * Updated Alt Fiend Images * More Fiend Updates * New Alt Fiend Art * New Friends Added * New Alt Fiend added * Fixed error * Fixed Issue With Fiend Code * Another Fiend * New Alt Fiends Added, Hardcore fiends created but not finished --- FF1Lib/AltFiends.cs | 2787 ++++++++++++++++++++++++++- FF1Lib/FF1Lib.csproj | 3 + FF1Lib/Flags/Flags.cs | 1 + FF1Lib/imagedata/bosses/AGNEA.png | Bin 0 -> 2380 bytes FF1Lib/imagedata/bosses/CARAVAN.png | Bin 0 -> 2468 bytes FF1Lib/imagedata/bosses/NIMBUS.png | Bin 0 -> 2913 bytes 6 files changed, 2785 insertions(+), 6 deletions(-) create mode 100644 FF1Lib/imagedata/bosses/AGNEA.png create mode 100644 FF1Lib/imagedata/bosses/CARAVAN.png create mode 100644 FF1Lib/imagedata/bosses/NIMBUS.png diff --git a/FF1Lib/AltFiends.cs b/FF1Lib/AltFiends.cs index 42c9204a0..85761da25 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; @@ -2823,6 +2824,26 @@ public void AlternativeFiends(ExtAltFiends extAltFiends, EnemyScripts enemyScrip }; var FF1BonusFiendsList = new List { + + new AlternateFiends { + Name = "AGNEA", //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.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 }, + }, + new AlternateFiends { Name = "B.VAMP", //Will be Moved to Winner Fiends at a later date SpriteSheet = FormationSpriteSheet.SentryWaterNagaChimera, @@ -2899,6 +2920,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, @@ -3089,6 +3129,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, @@ -3242,42 +3301,2758 @@ public void AlternativeFiends(ExtAltFiends extAltFiends, EnemyScripts enemyScrip }, }; + var FF2AltFiendListHardcore = new List + { + new AlternateFiends + { + 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) + if ((bool)flags.FinalFantasy2Fiends /*&& (bool)!flags.HardcoreAltFiends*/) { alternateFiendsList.AddRange(FF2AltFiendslist); } - if ((bool)flags.FinalFantasy3Fiends) + if ((bool)flags.FinalFantasy3Fiends /*&& (bool)!flags.HardcoreAltFiends*/) { alternateFiendsList.AddRange(FF3AltFiendslist); } - if ((bool)flags.FinalFantasy4Fiends) + if ((bool)flags.FinalFantasy4Fiends /*&& (bool)!flags.HardcoreAltFiends*/) { alternateFiendsList.AddRange(FF4AltFiendsList); } - if ((bool)flags.FinalFantasy5Fiends) + if ((bool)flags.FinalFantasy5Fiends /*&& (bool)!flags.HardcoreAltFiends*/) { alternateFiendsList.AddRange(FF5AltFiendsList); } - if ((bool)flags.FinalFantasy6Fiends) + if ((bool)flags.FinalFantasy6Fiends /*&& (bool)!flags.HardcoreAltFiends*/) { alternateFiendsList.AddRange(FF6AltFiendsList); } - if ((bool)flags.FinalFantasy1BonusFiends) + if ((bool)flags.FinalFantasy1BonusFiends /*&& (bool)!flags.HardcoreAltFiends*/) { alternateFiendsList.AddRange(FF1BonusFiendsList); } diff --git a/FF1Lib/FF1Lib.csproj b/FF1Lib/FF1Lib.csproj index 91dcb1a39..f58fc804d 100644 --- a/FF1Lib/FF1Lib.csproj +++ b/FF1Lib/FF1Lib.csproj @@ -73,6 +73,7 @@ + @@ -101,6 +102,7 @@ + @@ -184,6 +186,7 @@ + diff --git a/FF1Lib/Flags/Flags.cs b/FF1Lib/Flags/Flags.cs index 606ef5bc0..c28ffaf48 100644 --- a/FF1Lib/Flags/Flags.cs +++ b/FF1Lib/Flags/Flags.cs @@ -638,6 +638,7 @@ 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; diff --git a/FF1Lib/imagedata/bosses/AGNEA.png b/FF1Lib/imagedata/bosses/AGNEA.png new file mode 100644 index 0000000000000000000000000000000000000000..ae823bab8d03a1a4138005026cdd204485422fd6 GIT binary patch literal 2380 zcmbVO32+lt7+zWm^Z=+EI!JSd?q93=Btoo2CJgYuK6Hcm4nOfB*5` z+l2*rnZ4tZ;}8Vtot>7qnm@Tn_fNX#zt-BI-;FHdZr;7TXHY@seLeSsjJ*B&kPD ztd2FZBruysp)^Sw2vSdwMx0_fiss;Y_`#q#zu@Ewtr=lsaAd(;sw#5?5eNiy0liN0 zmk<=ovII#JG>t?CMX@L`4kcq_=ucb=J$k*3p^ouM6c*m6(~zZWM!A6N{UOm2XtilKL%iIZMKMw zyK?b*BPJ9zeHL^h9FV(8EB10(Bnm}ED)aMV`YcFunC6YljrWT{mHc)|@^odYpo=m} z8*~(nrcQGE1Sz15xJ^T}0#&qNFl`J@Q8;O|Qxr$joSwx=14ojbqBcozJIf=Y2ApJY znzhqZ>k&zN!6#F%j2K^b^J0*W?(E`6)Smuach z^gGL3ka&o3%c_AD7{7a}_%K(ST%$Ql)7pm*rMq?#ja(q)03c_dISiR1_TG zwPLqmyq0BAz{1n+yTs$6EQj?2E)jy>C;6S$70IavfL|P20%P~!>LTvNUIDZ2&)w-D zfu00ToTkir+-TIIPYPz7hH>Ww)?hFjU`2M4`agG?qe%{CK3uqu#61koyMV7mgoh`A zJ-Rm!SDANsbFaPiaNZbo#@n}fr_vqH5ZaO1S!2YVyx{ByFG|0W3G>q4z1Y#ww5ax#tjgXWo;`Q2J!5Ok zl4d4-%edA79o-gR+iCS|o05K{^y^l`v^DL{KBu2;t8R7`r^N-5A8#+?>%pehx3)g9 z?uXMaH64pinYdw%qTF23*!I-mq#I4t^zA#IPF$5ZcHfVG-NzV2v@~ne~1F=={Kh3GDUp+N(aL<~mym`#W3A@neT9Bky zYubo7onNoI|JlCcYQy}Km1j{F6jmMFTbfDPepR_rox?oL z-0RGcBwKW;f7HwGohrJDzK$hF<@Ni-w7b1Htv)lU@s#D_fIU~fS&-IBH=Ne5JKi7u ip!5-ovz;~@G7|QCX@4y6IaXAoHQDKT*7|WXD*pv#NIfM0 literal 0 HcmV?d00001 diff --git a/FF1Lib/imagedata/bosses/CARAVAN.png b/FF1Lib/imagedata/bosses/CARAVAN.png new file mode 100644 index 0000000000000000000000000000000000000000..7a6b8c2b5e00720f29f293dfbf65471391d1af6c GIT binary patch literal 2468 zcmbVO4Nwzj8s0*n2ntMTwXNs5U1}A%%_f`QT?j%GAUFn6;1q4^x!K)>l_Z!_%e4(O?KBZ{X?rH68z)6((a)WbXNc=k9^D{8g5A(i_!gw(d$c5Y{O z_xpLi=XwA3P1f6s3nwMMm1h1*~dFA=wJvutt33Y}} zg<#{&=d<4kUE3AfY6Oczm#6oG?Fmw8aT%C~FQ}{}@Ql3Zvn~`NC@D?8pMth+e;$J3 zwOo0HRAHM((!57WF}#CS20T81hM?>@0Ut$Iu@dZHU7Xj1+&*yp*t z9X9g<3lmB;N~=^jY#@}Bp3-Xw{V!l#g=;aD22`Os!POK81k{9mV;o1$S7Sp)uCYdRVU{0<1cU^;Pl` zFIMtTppI^TO8~^yW{YY())tQ^Dj`bwHNcHXKpu-0%WHisR?3QewLr7^HNebt*&82e z7FbH+g>s&Ek7vq0ZZeGPlxiHFwSe<7ykE?CB-Vt;X+za&6xWxlb);5Lg4nBc zq)Iggwebw+to=UJNa|Fi*6=MTC>n;6s2>G0H0k684+T8tJd}&Yd|npQ$&itEEvrtyQB0u6CeWt$_e#$rvbu zbNsx8r>o`E%IC+*oZ)G}@r^2uYaMFZX+#M^i=$2!JRBOvh^n*%<6s#lWl&S&Y$XB* zzBJ1HD64E00~jfSa5`8GgVGcTtInupP@{oWqfVm+*Ev*1jb2a4TM_WaQ@Ha8ZyHEf>29q2(;I3=&!99utqBq#QZ#uVew~4v?YtD?DPqj}j=*WmrKpAx?q!z?9GD=4eWG7OU|xk#9Ge9$4bxZ;IuKIwDo` z!!i14H8bY?_ha;(s{g-Y6iEPGNqJo?Xwn!WdxOc{Y%KlQcPk^j_ekd(hl6%152KA7 zOrk#ptQSxVpwa*3=&!mVC}yC@l2=}_`qq{+TW-vrXz5T}M@Rqoj4>xxQ4{+3cw?43 zeu8KJ+(R45VgJM4EC0Exbg`18{`db@&qV}t)=6FTU#ROBw?mg$v9NX^UXEquWYTM6!e13f}Wd>Zof9Psi z-@f1eW9=pA@M}rCU+UO$jaY%3G74fT^{Wei-us2?y}HBZ4Ii9vZ40)&^UgW+t=^?Q z2RC&yDR+tK`260o#H|h2i|!rF@)Q>adT%vN%Q(v=<(^Unz1S&;jZpZ?b2cHz3oUv z{Q-O4nk9GqSrsVpiw}LBQ+_kK`uF#&`S1OKfMv|{yT|IE+LQKEVGIVzzRodGA z#g)A&E2o88cE0&$>8vB?7bV%}wlCTd^k{PZ!+E*HRBb0_9huB$eBQF|$jR&-y{W;p z|13WH<^9gy{Uy`x&phO@is{lOrJ;*G)x33XVAn$HnRt8a>cktr{C(!g+O|L6pMAP0 zwa2%4Br$7w&)4f$c^tQc|N7);%*bFtuH%J6&BKlK>(pSA>#4tPADTIAer51p%AIwF VoCE#OZj=8D73CLO4!*ji;eQRikg5Ox literal 0 HcmV?d00001 diff --git a/FF1Lib/imagedata/bosses/NIMBUS.png b/FF1Lib/imagedata/bosses/NIMBUS.png new file mode 100644 index 0000000000000000000000000000000000000000..62c5c681a67b87472531ae8a51f20589f8f67e07 GIT binary patch literal 2913 zcmbVO2~-nj9v=<`p;}MO3g{TM^KqQyRgdf*`1W=nO?PXoH+TPdD(tqj=>*&C>lKmIcF6 zRUfVb3m$BA#B4AG4>TgoZ916hXPPnB0zuwGoIe*RXFCUi`hKQW#j>%=aDp=Gc_eLA zGrSbN37{cp%G4ASNhLBYtY+f11{t@hoK+muwoTAqmEJTWo+sR9SzH^$-g*zc^qKqqd8iZq&QE;%)%)mHLfKVtZ zgadINF2PY!8W;d$C?@8kLOv=%1UMnU2(aG$aDh29ts$Zn)4PpcyF?W?iRon&LA$M$Z^n3&09`v8DtgYqTU7-$LEH z{2K!xwn}BMjW=r1>w8UD*pMXPMt4Boh_l{$y8L2WEd0k1QOrU5N zRB5EOn$%vX7(qn{hO00kAp&S282$Fp*kK zqKt^b1$57Tg^{v4Q|sK{Rpzvj0vx|uWf)W_K!psV38ZKQLhpvCFuWGs_I{r)ygKhIqV_X%n5B+ju6TOU^#o_d|J1!o7dStn*z0LZt;aOX|6@T_)pGA?A z2DOdyKQfDxy-(3B>-%C*-il9rCvl#(RGef|iwbsfvod#M6)T>vgUYV>53X^&fQ;Qa zaPl_!XS+blG*umQZ{PUg3TIy@Ip_PcAn(qCs(m>5&PxMf?KHyjYrs;T`?#j!cf(&m9dDKRhd`~7!!#v^}Msn3!pt&tP$cirw! z-qhHUXf3O#E48Q6G1e`OM~;5JJjw1>rM^|?UwN;irgD!1>G`xSR8rg%>*3$Oq+AdaP(W>XN_l zm>_7^@Qk0-g^i1b#oBjoPFt3@c=A^G#p%$ibH_*jV4S`@^|^?vpFDr01=8)hU;a~h zmQw!w`7&Qz^J4?N)Hk+4SRqn=4aFpVx^{j<#)AjVTh7<6XeG(a9G^${y6n_GxwiCj zNif4%shZ>n5+AsJ3|&7we~$auiQBT2D_c|#XBN7~Nxyw&Pj&xt5abnUw@r~-{RVg- zu>mn3`jwZ?wL^vXT!(%!ta95g6&sGp{^?2XEF}&t8Go|PBx_QMea%Z#mJT=&vY`0E z%%MKRFP^F0d&T{m2_?R{TRkGn?vvw7NAq(VT5inJY1_`7+if1wFE6V+LOE`D&4RPH zE8=`^zCU?YX=w@PHhbK%asQ2ssg=n zU(7Js>_>B6hV>75$*G)I)G^b&`e0J1dtAD1O1OUp_g~`@^&w|{I6fw1lz92j@oL#iD9-1Ke@x=Yf^)0Ch}ok%_mtP3 zuh?L?J!TCf{?4q)i@W@|a5OS&ku41IIXDjwn(9}lxKR-rvF&FUu^V|gczeBH>-0U% zA8fez)l#1R4l4Ze+Q|UU`jnKBBdgPgB`@5XP2PV0yHTxE0#omuNz1%aX6-*3FwexQQYx!W7hpRGFeyzGaP^^Tfre?Ppnro%-Qu+>DuMY-UsbpR6^s!=MT aiJ)So6wL5Md7r?tNsUCZ&sK9 literal 0 HcmV?d00001 From 42cde7c25918c2d8ebc1d280228f4b7ee3b390ec Mon Sep 17 00:00:00 2001 From: Oslodo <161620626+Oslodo@users.noreply.github.com> Date: Sat, 24 May 2025 23:59:05 -0300 Subject: [PATCH 27/61] Alt fiends Breakout (#1127) * Adding Alt Fiends and testing code to for Alt fiends selection (currently broken) * Finished adding fiends * Alt Fiend Code Re-done, working * Alt Fiends work * Fiends added, tool tips updated * Added final FF4 fiends * Alt Fiend code finished * Fixed Bad Fiends * Fixed Fiend errors * Fixed missing value on fiend * Subshell for FF5 fiends created * Gave Bubbles back Fade * Hurray Added Start of FF5 * 2 more fiends added * More Fiends added * All 'C' fiend finished * Finished D and E, moved Gilly back home to FFV * Fiends to 'O' completed * All FFV fiends Finished * Added Missing Tool Tip * FF6 Fiends entered, first 4 * Missing Flagset * More Fiend work * Missing code re-added * Troubleshooting hanging fiends * Confirmed Alt Fiends working * D's and E's finished * 'F' Fiends finished and tested * Finished G and H Fiends * "I" Fiends completed * "K" Fiends finished * "N" Fiends Done * "P" Fiends added and Tested * Missing M Master and R fiends done * "S" Fiends Done * Started on "T" Fiends * "T" Fiends completed * FF6 fiends completed * Tooltip added for FF6 Fiends * Testing * Update to fiend skills * Fixed error * Removed Ruse from Alt Fiend Scripts * Fiend Code Clean Up * New Fiends added * FF2 to FF4 Fiend Patch applied * FF5 Fiends Patched * FF6 Fiend Patch applied * FF1Bonus Fiend patch applied * New Alt Fiends added to pool * Tooltips Updates * Code Clean Up * Updated Alt Fiend Images * More Fiend Updates * New Alt Fiend Art * New Friends Added * New Alt Fiend added * Fixed error * Fixed Issue With Fiend Code * Another Fiend * New Alt Fiends Added, Hardcore fiends created but not finished * Branched out the Winner Circle fiends to a new pool * Fixed Missing Line for Alt Fiends Pulling in classic fiends * Updated --- FF1Blazorizer/Tabs/EnemiesTab.razor | 3 +- FF1Blazorizer/wwwroot/tooltips/tooltips.json | 6 + FF1Lib/AltFiends.cs | 227 +++++++++++-------- FF1Lib/FF1Lib.csproj | 1 + FF1Lib/Flags/Flags.cs | 1 + FF1Lib/imagedata/bosses/THNDBIRD.png | Bin 0 -> 2618 bytes 6 files changed, 147 insertions(+), 91 deletions(-) create mode 100644 FF1Lib/imagedata/bosses/THNDBIRD.png diff --git a/FF1Blazorizer/Tabs/EnemiesTab.razor b/FF1Blazorizer/Tabs/EnemiesTab.razor index e99f587a2..46dc7d68a 100644 --- a/FF1Blazorizer/Tabs/EnemiesTab.razor +++ b/FF1Blazorizer/Tabs/EnemiesTab.razor @@ -70,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/wwwroot/tooltips/tooltips.json b/FF1Blazorizer/wwwroot/tooltips/tooltips.json index 72d1063c7..6412e2a32 100644 --- a/FF1Blazorizer/wwwroot/tooltips/tooltips.json +++ b/FF1Blazorizer/wwwroot/tooltips/tooltips.json @@ -1484,6 +1484,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", diff --git a/FF1Lib/AltFiends.cs b/FF1Lib/AltFiends.cs index 85761da25..0d9c6827c 100644 --- a/FF1Lib/AltFiends.cs +++ b/FF1Lib/AltFiends.cs @@ -2825,43 +2825,6 @@ public void AlternativeFiends(ExtAltFiends extAltFiends, EnemyScripts enemyScrip var FF1BonusFiendsList = new List { - new AlternateFiends { - Name = "AGNEA", //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.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 }, - }, - - 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", @@ -2958,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, @@ -3206,7 +3150,124 @@ public void AlternativeFiends(ExtAltFiends extAltFiends, EnemyScripts enemyScrip }, new AlternateFiends { - Name = "SEPHROTH", //Will be Moved to Winner Fiends at a later date + Name = "VAMAKALI", + SpriteSheet = FormationSpriteSheet.KrakenTiamat, + FormationPattern = FormationPattern.Fiends, + GFXOffset = FormationGFX.Sprite2, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.Ice, + MonsterType = MonsterType.MAGICAL, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.FIRE, (byte)SpellByte.STUN, (byte)SpellByte.FIR2, (byte)SpellByte.INVS, (byte)SpellByte.SLOW, (byte)SpellByte.FIRE, (byte)SpellByte.MUTE, (byte)SpellByte.RUB }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Cremate, (byte)EnemySkills.Heat, (byte)EnemySkills.Trance, (byte)EnemySkills.Stinger }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.XFER, (byte)SpellByte.FIR3, (byte)SpellByte.FAST, (byte)SpellByte.SABR, (byte)SpellByte.BRAK, (byte)SpellByte.SLO2, (byte)SpellByte.FIR2, (byte)SpellByte.FIR3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Inferno, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Crack, (byte)EnemySkills.Toxic }, + }, + + new AlternateFiends { + Name = "WRONGEYE", + SpriteSheet = FormationSpriteSheet.MedusaCatmanPedeTiger, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite3, + Palette1 = 0x23, + Palette2 = 0x25, + ElementalWeakness = SpellElement.None, + MonsterType = MonsterType.REGENERATIVE, + SpellChance1 = 0x40, + Spells1 = new List { (byte)SpellByte.SLOW, (byte)SpellByte.FIR2, (byte)SpellByte.FOG, (byte)SpellByte.FIRE, (byte)SpellByte.RUB, (byte)SpellByte.SLEP, (byte)SpellByte.DARK, (byte)SpellByte.FIR2 }, + SkillChance1 = 0x40, + Skills1 = new List { (byte)EnemySkills.Ink, (byte)EnemySkills.Trance, (byte)EnemySkills.Heat, (byte)EnemySkills.Gaze }, + SpellChance2 = 0x40, + Spells2 = new List { (byte)SpellByte.FAST, (byte)SpellByte.FIR3, (byte)SpellByte.BANE, (byte)SpellByte.XXXX, (byte)SpellByte.LIT3, (byte)SpellByte.SLP2, (byte)SpellByte.XFER, (byte)SpellByte.FIR3 }, + SkillChance2 = 0x40, + Skills2 = new List { (byte)EnemySkills.Toxic, (byte)EnemySkills.Swirl, (byte)EnemySkills.Stare, (byte)EnemySkills.Poison_Stone }, + }, + + }; + var WinnerCirleFiendsList = new List + { + 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 }, + }, + + 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 }, + }, + + 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 }, + }, + + 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 }, + }, + + new AlternateFiends { + Name = "SEPHROTH", SpriteSheet = FormationSpriteSheet.SlimeSpiderManticorAnkylo, FormationPattern = FormationPattern.Large4, GFXOffset = FormationGFX.Sprite4, @@ -3225,26 +3286,26 @@ public void AlternativeFiends(ExtAltFiends extAltFiends, EnemyScripts enemyScrip }, new AlternateFiends { - Name = "VAMAKALI", - SpriteSheet = FormationSpriteSheet.KrakenTiamat, - FormationPattern = FormationPattern.Fiends, - GFXOffset = FormationGFX.Sprite2, + Name = "THNDBIRD", + SpriteSheet = FormationSpriteSheet.SlimeSpiderManticorAnkylo, + FormationPattern = FormationPattern.Large4, + GFXOffset = FormationGFX.Sprite4, Palette1 = 0x23, Palette2 = 0x25, - ElementalWeakness = SpellElement.Ice, - MonsterType = MonsterType.MAGICAL, + ElementalWeakness = SpellElement.Lightning, + MonsterType = MonsterType.MAGE, SpellChance1 = 0x40, - Spells1 = new List { (byte)SpellByte.FIRE, (byte)SpellByte.STUN, (byte)SpellByte.FIR2, (byte)SpellByte.INVS, (byte)SpellByte.SLOW, (byte)SpellByte.FIRE, (byte)SpellByte.MUTE, (byte)SpellByte.RUB }, + 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.Cremate, (byte)EnemySkills.Heat, (byte)EnemySkills.Trance, (byte)EnemySkills.Stinger }, + Skills1 = new List { (byte)EnemySkills.Heat, (byte)EnemySkills.Scorch, (byte)EnemySkills.Heat, (byte)EnemySkills.Glance }, SpellChance2 = 0x40, - Spells2 = new List { (byte)SpellByte.XFER, (byte)SpellByte.FIR3, (byte)SpellByte.FAST, (byte)SpellByte.SABR, (byte)SpellByte.BRAK, (byte)SpellByte.SLO2, (byte)SpellByte.FIR2, (byte)SpellByte.FIR3 }, + 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.Inferno, (byte)EnemySkills.Poison_Stone, (byte)EnemySkills.Crack, (byte)EnemySkills.Toxic }, + Skills2 = new List { (byte)EnemySkills.Blaze, (byte)EnemySkills.Inferno, (byte)EnemySkills.Poison_Damage, (byte)EnemySkills.Inferno }, }, new AlternateFiends { - Name = "WHEELS", //Will be Moved to Winner Fiends at a later date + Name = "WHEELS", SpriteSheet = FormationSpriteSheet.BadmanAstosMadponyWarmech, FormationPattern = FormationPattern.Fiends, GFXOffset = FormationGFX.Sprite2, @@ -3263,26 +3324,7 @@ public void AlternativeFiends(ExtAltFiends extAltFiends, EnemyScripts enemyScrip }, new AlternateFiends { - Name = "WRONGEYE", - SpriteSheet = FormationSpriteSheet.MedusaCatmanPedeTiger, - FormationPattern = FormationPattern.Large4, - GFXOffset = FormationGFX.Sprite3, - Palette1 = 0x23, - Palette2 = 0x25, - ElementalWeakness = SpellElement.None, - MonsterType = MonsterType.REGENERATIVE, - SpellChance1 = 0x40, - Spells1 = new List { (byte)SpellByte.SLOW, (byte)SpellByte.FIR2, (byte)SpellByte.FOG, (byte)SpellByte.FIRE, (byte)SpellByte.RUB, (byte)SpellByte.SLEP, (byte)SpellByte.DARK, (byte)SpellByte.FIR2 }, - SkillChance1 = 0x40, - Skills1 = new List { (byte)EnemySkills.Ink, (byte)EnemySkills.Trance, (byte)EnemySkills.Heat, (byte)EnemySkills.Gaze }, - SpellChance2 = 0x40, - Spells2 = new List { (byte)SpellByte.FAST, (byte)SpellByte.FIR3, (byte)SpellByte.BANE, (byte)SpellByte.XXXX, (byte)SpellByte.LIT3, (byte)SpellByte.SLP2, (byte)SpellByte.XFER, (byte)SpellByte.FIR3 }, - SkillChance2 = 0x40, - Skills2 = new List { (byte)EnemySkills.Toxic, (byte)EnemySkills.Swirl, (byte)EnemySkills.Stare, (byte)EnemySkills.Poison_Stone }, - }, - - new AlternateFiends { - Name = "ZINOGRE", //Will be Moved to Winner Fiends at a later date + Name = "ZINOGRE", SpriteSheet = FormationSpriteSheet.MedusaCatmanPedeTiger, FormationPattern = FormationPattern.Large4, GFXOffset = FormationGFX.Sprite3, @@ -6057,12 +6099,17 @@ public void AlternativeFiends(ExtAltFiends extAltFiends, EnemyScripts enemyScrip alternateFiendsList.AddRange(FF1BonusFiendsList); } - if ((bool)flags.BlackOrbFiends) + if ((bool)flags.WinnerCircleFiends /*&& (bool)!flags.HardcoreAltFiends*/) + { + alternateFiendsList.AddRange(WinnerCirleFiendsList); + } + + 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/FF1Lib.csproj b/FF1Lib/FF1Lib.csproj index f58fc804d..c3ec22dbf 100644 --- a/FF1Lib/FF1Lib.csproj +++ b/FF1Lib/FF1Lib.csproj @@ -221,6 +221,7 @@ + diff --git a/FF1Lib/Flags/Flags.cs b/FF1Lib/Flags/Flags.cs index c28ffaf48..edce82a3d 100644 --- a/FF1Lib/Flags/Flags.cs +++ b/FF1Lib/Flags/Flags.cs @@ -645,6 +645,7 @@ public partial class Flags : IIncentiveFlags, IScaleFlags, IVictoryConditionFlag 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/imagedata/bosses/THNDBIRD.png b/FF1Lib/imagedata/bosses/THNDBIRD.png new file mode 100644 index 0000000000000000000000000000000000000000..e8df44e5552fe9070af616b56de7cc27888a6bb3 GIT binary patch literal 2618 zcmbVO2~-s49iJs0t5gG_8fyTjLrlG9=h)d}Cafqd;Rp*97Dehyot>H89ogL(cLsN% zu@WL$5-B-72%s3FKwb@))FUCD&yu4r0<}#|Jr<9=JgU_gwX`**-*Rk>)x?*1Z|1vx z-~a#nU*9)1`MDXBCQhFSLC~bEOltvX7ldE!1K``Z_nAwec_=@}o(|fsmMaxh*de$?p9Q({-a!Nwc?+`GV8d;4n&1{QEBr!XMXsHzDCKA# zNtq8P2N@v1E2u0S^m=>>6SN>hav9JMPh$u?1W`*Z$ilEfxY(8tr%8SRrga3$;kX_) z(K^~lQafZ=)!H=+d15F`WEM;-*I^Yc!o!1~09GBC0rZdH{T3=0GTx`19M z`CS-6(=>*Y7)hc4fhy%bl?|dkC23TGRZuv;D6696gToS8hg7Co5I}X<2Cp0u>r+Pj z1U!ZXSs5dAc-W>PAkRf`a+%*Vq@3q4!6SGDpQ->X5y8rCNtG10bPv&ynfzO~sR zI_}EF>y4;T)by3Wj1h<26|LCIWdSP?6sgS53F#{V&7`n3GLz;PSXJ`dCCM`ysr*sO zFlo>cBs^=e=;Nh;GW)h2f|XST3j)GMp#*{AMms?;B+2M$6gMz9J`A-|p zljT!X*2f81Rto}*)`=p|=vm$@ILvy~Kv8BCrzt1u;3*z;(j3iF20cq~!&ZR(R*5SM zhc>)_ILΐVqRYM^dQGK9$#6%f1fkpd|cR*dvK zB0Q8749kU+-GXr8C<{C?GA-W4ANQqsWPiXd0HNOz{9)~iOJ9G)2R!>zf$%)G;zd)3zcS!2|hZZGrUO?McBg^$eP9K-HRzoE6;j#m)Lp($`? zhr5y60t_Pejo<@*@`Kyt;WGam2#WeT%ev5BT-~_%@`g*W_Q@|g2Oq&s&Zu;hRlN79 z@>$26*dyycsqVU|!B#J2>v|tsu=e;M^z^civVL`B8nmUfu{+9J;(AMC-mu@N&AZ$S zJEKCDBQq~Sd*Jw-rnHTrLZ3SIH333EInoV=G zC;H{Kw{j*`wjSyE`<7NH_tBM8#&oPI-1^wetunmgY{8HAw5;;Y+tQSDXd=D4Wp3iw zZ1M1|0jIZg@_fwQd}{I3u}IOxcf`ch{nsu&w<>Mg3zbmKVSK+(^8D(mj-RZD{?jyO zih0Mtbfpx^pr%K+Iu?ytP-5*n_sW}DaedLx=C5e@#n`wFM{BFbEu$x-9&7n|`>CE| z@02#5U@EoRhNJ)Z@zR9eSg(#ENrgl;I^1Alob-C4cwHESB5 zeer#;<8NO)1c%Fn!TA7d_)o&cC|Wnvw8e>%bS#XXmc+RS#|rtybS%o(ILm zFM52N`;D=iF{slw?NIWW^K#0qa{6?4(Z>3o-R92d?X#gj?7wPxIZ^Y9kYDuVf1}!e z_shHs0jNjxG-y6qtynjmsNMViRErq%x_w`VZ|Ump%C7^h{Z}ab^L?JB&!D?%u0WsP ztV?_v`rs?MDd($e*T)^w1{1Wc+631l2kP7HSJM(&Zbs|WG+XlQegpU=n=BM(Ic+uw Z6a}OW|D%DYxA5g~la-!p-Icnm>VFU2rP2TZ literal 0 HcmV?d00001 From 6bedd9510310c1cc593d20301a725363a88e1a1f Mon Sep 17 00:00:00 2001 From: Oslodo <161620626+Oslodo@users.noreply.github.com> Date: Wed, 28 May 2025 13:29:32 -0300 Subject: [PATCH 28/61] Alt fiends (#1128) * Adding Alt Fiends and testing code to for Alt fiends selection (currently broken) * Finished adding fiends * Alt Fiend Code Re-done, working * Alt Fiends work * Fiends added, tool tips updated * Added final FF4 fiends * Alt Fiend code finished * Fixed Bad Fiends * Fixed Fiend errors * Fixed missing value on fiend * Subshell for FF5 fiends created * Gave Bubbles back Fade * Hurray Added Start of FF5 * 2 more fiends added * More Fiends added * All 'C' fiend finished * Finished D and E, moved Gilly back home to FFV * Fiends to 'O' completed * All FFV fiends Finished * Added Missing Tool Tip * FF6 Fiends entered, first 4 * Missing Flagset * More Fiend work * Missing code re-added * Troubleshooting hanging fiends * Confirmed Alt Fiends working * D's and E's finished * 'F' Fiends finished and tested * Finished G and H Fiends * "I" Fiends completed * "K" Fiends finished * "N" Fiends Done * "P" Fiends added and Tested * Missing M Master and R fiends done * "S" Fiends Done * Started on "T" Fiends * "T" Fiends completed * FF6 fiends completed * Tooltip added for FF6 Fiends * Testing * Update to fiend skills * Fixed error * Removed Ruse from Alt Fiend Scripts * Fiend Code Clean Up * New Fiends added * FF2 to FF4 Fiend Patch applied * FF5 Fiends Patched * FF6 Fiend Patch applied * FF1Bonus Fiend patch applied * New Alt Fiends added to pool * Tooltips Updates * Code Clean Up * Updated Alt Fiend Images * More Fiend Updates * New Alt Fiend Art * New Friends Added * New Alt Fiend added * Fixed error * Fixed Issue With Fiend Code * Another Fiend * New Alt Fiends Added, Hardcore fiends created but not finished * Branched out the Winner Circle fiends to a new pool * Fixed Missing Line for Alt Fiends Pulling in classic fiends * Updated * Added in Ext code. --- FF1Lib/AltFiendsExt.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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) { From 7492188e38cee2a9ff748e3f99bc65ed39c4232d Mon Sep 17 00:00:00 2001 From: Franklin RN Date: Sat, 14 Jun 2025 11:02:16 -0700 Subject: [PATCH 29/61] =?UTF-8?q?Thief=20Hit%=20buff=20feature=20has=20bee?= =?UTF-8?q?n=20expanded...=20to=20give=20flag=20crafters=20more=20?= =?UTF-8?q?=E2=80=A6=20(#1121)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Thief Hit% buff feature has been expanded to give flag crafters more fine tuned control. The Red Mage now also has hit % options and thus can be made into a viable melee, or nerfed to have the melee capablilities of the wm and bm. * Cleanup of the feature. The tooltip image is still waiting for an artist to redo. I have been informed that the thiefHitRate bool is still present in the code but I couldn't find it. * Finishing touches on the feature. --------- Co-authored-by: Andrew-6657 --- FF1Blazorizer/FF1Blazorizer.csproj | 1 + FF1Blazorizer/Tabs/ClassesTab.razor | 3 +- .../presets/Fall_League_-_0_Loose_3_Orbs.json | 3 +- .../presets/Fall_League_-_E-F_Shuffle.json | 3 +- .../presets/Fall_League_-_Noverworld.json | 3 +- ...ll_League_-_Procgen_OW_Oops_All_Loose.json | 3 +- .../presets/Fall_League_-_Relay_Race.json | 3 +- .../presets/Winter_Tournament_2024.json | 3 +- .../images/tooltips/redMageHitDropDown.png | Bin 0 -> 61868 bytes ...efHitCheckBox.gif => thiefHitDropDown.gif} | Bin FF1Blazorizer/wwwroot/presets/Beginner.json | 5 +- FF1Blazorizer/wwwroot/presets/Chaos_Rush.json | 3 +- .../wwwroot/presets/Deep_Dungeon.json | 3 +- .../presets/Entrance_Floor_Shuffle.json | 3 +- .../wwwroot/presets/Floaterless.json | 3 +- .../wwwroot/presets/Free_Enterprise.json | 3 +- .../wwwroot/presets/Hidden_Chaos.json | 3 +- .../wwwroot/presets/Improved_Vanilla.json | 3 +- .../wwwroot/presets/Lichs_Revenge.json | 3 +- .../wwwroot/presets/Maximum_Troll.json | 3 +- FF1Blazorizer/wwwroot/presets/NOverworld.json | 3 +- .../wwwroot/presets/Oops_All_Loose.json | 3 +- .../wwwroot/presets/Over_Randomizer.json | 3 +- .../wwwroot/presets/Procgen_Overworld.json | 3 +- FF1Blazorizer/wwwroot/presets/Shard_Hunt.json | 3 +- .../presets/Winter_Tournament_2024.json | 3 +- FF1Blazorizer/wwwroot/presets/default.json | 3 +- .../wwwroot/presets/wt2025finals.json | 1057 +++++++++-------- .../wwwroot/presets/wt2025qfinals.json | 1057 +++++++++-------- .../wwwroot/presets/wt2025quals.json | 1057 +++++++++-------- FF1Blazorizer/wwwroot/presets/wt2025r16.json | 1057 +++++++++-------- FF1Blazorizer/wwwroot/presets/wt2025r32.json | 1057 +++++++++-------- FF1Blazorizer/wwwroot/presets/wt2025r64.json | 1057 +++++++++-------- FF1Blazorizer/wwwroot/presets/wt2025r8.json | 1057 +++++++++-------- .../wwwroot/presets/wt2025sfinals.json | 1057 +++++++++-------- FF1Blazorizer/wwwroot/tooltips/tooltips.json | 12 +- FF1Lib/Classes/ClassesBalances.cs | 36 + FF1Lib/Classes/ClassesData.cs | 21 +- FF1Lib/Flags/Flags.cs | 3 +- FF1Lib/Randomize.cs | 1 + 40 files changed, 4348 insertions(+), 4256 deletions(-) create mode 100644 FF1Blazorizer/wwwroot/images/tooltips/redMageHitDropDown.png rename FF1Blazorizer/wwwroot/images/tooltips/{thiefHitCheckBox.gif => thiefHitDropDown.gif} (100%) 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/Tabs/ClassesTab.razor b/FF1Blazorizer/Tabs/ClassesTab.razor index b14a172bb..c3c495d44 100644 --- a/FF1Blazorizer/Tabs/ClassesTab.razor +++ b/FF1Blazorizer/Tabs/ClassesTab.razor @@ -8,7 +8,8 @@

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 MDEF Growth: Improved HARM for White Mage 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 index a0eb1cb06..ce1e9d292 100644 --- a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_0_Loose_3_Orbs.json +++ b/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_0_Loose_3_Orbs.json @@ -427,7 +427,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_E-F_Shuffle.json b/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_E-F_Shuffle.json index 8c0ac0763..1a1d40219 100644 --- a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_E-F_Shuffle.json +++ b/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_E-F_Shuffle.json @@ -426,7 +426,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Noverworld.json b/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Noverworld.json index e573fd5f0..e7848c63e 100644 --- a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Noverworld.json +++ b/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Noverworld.json @@ -427,7 +427,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, 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 index 3e0be029b..22e1aa2d2 100644 --- 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 @@ -426,7 +426,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Relay_Race.json b/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Relay_Race.json index ad9e6b70b..c42869006 100644 --- a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Relay_Race.json +++ b/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Relay_Race.json @@ -426,7 +426,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": true, + "ThiefHitBuff": 4, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": true, "FreeTail": false, diff --git a/FF1Blazorizer/output/wwwroot/presets/Winter_Tournament_2024.json b/FF1Blazorizer/output/wwwroot/presets/Winter_Tournament_2024.json index c7d1bead4..1c358b279 100644 --- a/FF1Blazorizer/output/wwwroot/presets/Winter_Tournament_2024.json +++ b/FF1Blazorizer/output/wwwroot/presets/Winter_Tournament_2024.json @@ -429,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/images/tooltips/redMageHitDropDown.png b/FF1Blazorizer/wwwroot/images/tooltips/redMageHitDropDown.png new file mode 100644 index 0000000000000000000000000000000000000000..611505b043c5110b8a490046970c725305fc21fb GIT binary patch literal 61868 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

m!Phu-dDL7_Ft-Up#yNe3J^c zL!w0f0^!bI&;`?l8V1t8bGv@G&C0W6AQs*x_F{NgMV!3hph)K?rnHu^q#O-Z0b334 zE%A!!V|mt+??8?ApwcPc*l9LI;}Qp8QYtNc<$jdb;1;vJ?R^7390dfVd2GxyUAdLIZmk%#v)$ zE|=-uhd(h%cV6T*D1Dw5rv(UuK(cq#`{L)mxROsYk`rpEuJk!$R@rnA@e5&7KU9Mf zc+dmd)Udm_F-Me~Nl|TfY3h5rBW;#>;a1Bg(>wGC-Ptc>yyPRZ*z=7_LIlN3#QWqa z%$bzb`Cok?f2=qcrGUmmr7{*n)BuJPI>K_rd+9DqH27p-*9qz-vn2du)E{)2zt%^buuX-{RGJX*zjPgipl&>j zu7jveLP>`Nw4UnHr z$C{lpTPr12+77oKbwe9LOVwf6wTmW`#nq* z$%|3c7zvbVO9r|yCQ!s%ec`F5mp2-+e;_xni(PaqJ|Z_ZRB%Kvi0#9tM!Mr_J%FFt z$2>eb+PYnF*%3bv6l`7lM6uHH(Hi0t{_^rtV-$jDB7?XMgN&1ie^odAr#ONYUOe51 z_;o5nH;dCR*W{D1#myHdzclCtBrIcoR8Op$B#lC1&nn)yUEa{|<_9FD4Yo(WH-ORJ zp;Gj_blF*)3CXv68sak*wfTG=amt4dhbaH44^@Il_qoi19v<)4z{v(8%?tM_C0g}A zdyRZm!LAd;i+XS#j_OGHdsj}69 z>fb!jxP(d&z=hVt%dwp|B6iSftz_N}FCo4fDbBKc-HP4S9dO|0UNyFDgjkjG@~p!RwrdrFYDB=YYc9d>Ibrs^7XtLLtuPq)rQHIDb!eN6D&;=d$= zj^dy%uCEz{%<7s|x{V)m_MUj}ppW@%q|&TREzD!h(8*dKvG&uin(l3FhI^;ladCPD zN0B3-IqTu%d8)+79jg`2gp;qjE*?eGmdm$BP2!F{L#YxOf4NO+J^gwHhLq!mGc@`$ z-ZW#y9Kx;JZoG?qCMK-c&eL=$;b&*TX!Jy(HYk36MXhTcopjX}{$+Z^qo0tT{W}Wz z0)3m!Bk&__I;W0>{rzb1k)Ms31E{%Wrk4Zu`2GB8sRNJOyq?JeIt!HFS65of7k+b6 z>s=4tXYa`{Ev@^KmAq+WIwOcVHp(_N8T4L}wTj<)l3mZ}yBJ1`#`3?$(xI=$y9Pf$ zPi20|W=*Z>Ao?5py~V~~HS=S_x?tBb zZzE!{wF>>h*G__|SKxsOs0R_|RWoF<8?x)0iH*qInG#L)e=?25j%&{tiO3%Dsh`ws zA2a>+e$gY$IJmFiK6L9*;%(6;)X3lTe7*C0I{OfqIrTF0;l4!jp5bMY=9%l|;#&|* zmt!dt-WNQV3Z#trd%sj4wXpx-4Q&jF=`8n1xD7VrIy@(!y!(SNkx4M}uZfao(J6{* zWyI8C)&uci%Tw9!Fj(*vhf);7WR|-T`RoNHR~*yYT3XZ>D^Lu3@ee*5Q3#h9M#aeH zycTTs6){KK;P$8o@#W!#ZOZqU@#$7W`V+Pp46{E0(d}*r{(5qW>~mgNlg`C;RKCcW zD(dPrW3EG@?I~rhFhT+Bh3)YRPum{q*31Z3qQ5g%0+cY&@9<}jJlgF#vcm@X1&qt^yaeR*)cjL}oTu^A=uPs0E;1R~_L-SEX+Z*b9e%0CiaOTGg zo49-mrX9*$>KSquXI~li2oQVo5KN9{Hk9Q3*~4M7G?#4kVbvxGbYKax4x%4w@yVhV zck5}-ANmyLB*IH}vM2nHa({rY?=FCSyjT~|)YS!*GchufUh8#zZO9mBdQ;f!dF&mZ z_u3o&yO7L_uV=x?5%>t|T#uKA94;e?7AGAeRN#<~Y;7~LPoREuAvt@c5c-JhkM7b2 zzwYMWSIO7-PW!SDD3FOdgP!9p{T_*#c{8sdm?luvS+Q?oe$R71gH9CAL_s&M+(FUf6K7A4J>{ z30}crVF&ex3qI3AuMnr-g$;k%TqhwdS`BvQI^94_f9#tYz=aa@oX1=0g26cZf26UMorJ*OvAm|05hy`O=HN#ABwa?_theOc2Y}u5nNe<>5AHGZ; z-^fH_XH5?pnyxe?$v;3%P@$_wdti+Xb;!E8y_sFUpV;d&5pcD0aEO7@z1Hsa88l)x zujl}SGcjsvI!(QVdZr5s;WeHlpid*<9^^eHSi8nxB9usC)`jMg2c~^ewcuDK(RR-% zbR`VCOzdY4BJnam7-$$L&I2_Y)OT*b)rlvmAV0um~-<=c%;W+Lvh*_Dh#a zmBv?VCYhi7;9pq7XZdnO7JfDveC%I_)`HvME8cZW0vjlJlh`GGme{WlNb$M*;?{f6 zUeexS>7TsMqUctCZ)Ab}-E(r{o3RH0mUj`kI9Ny!F5~LY&;`bQx}HLP3aFXdA$>uA zu)y7TJqs3KCkQh!M|JH&f4NHJyn7r~*gB9vZIZcoa|-Fm=f8tBAYIAb_Orx-3=Bw7 zZ#PDZC|ntt3b_ctj5%PT9NS8UaeD>S98{Dg3EsZQ@9O#%Cvh12BiHB=y?96q!Cct` zmlJJ_zJG$^NVj8J3sZ3QpUScSiR_YCS|R)x3Ht;Fxas@-%#Hzok0_tcUvUav-{(r= z>hLvMh3SSpyy`{efd@9#E@CtWG@u0Qk0Nd(TUe0TjpuUM)+(p0@SU?$wu)W7Z;12B5vnk7~>xjjiW^=BvB zcjXnKJqOI2r|)2?Q+=;bSYk)WchwFdQ4*54seeE4NZ`cD+5ZeakaCbDRKo_P-|vk- z{}=&F;QkZH>$pnsQSIex`!fM;DqlI)H$yx@AtNU*Eon$RjQlm^vZMlClpyGIWo&UhXOuC? z(9O_s!i%!r@R1*3eh(F4nzS>hE3E?w9~&L0WJ543Hiwi9JCvW(C4jMRQ;VB41;IsY zZi6j-$!%bo)kgG5ah#y*MDE4)$kPa^hyG8t7Ox**HB*Can2QRCm#&00=Uc~dcTXu! z1t{9u4GUR$Ikt|%3UxJ!e_G6dE^W!XCmZS;qCJ_XMJvgX@XaFP*-GBB%%vzMp=_Xb zU9=l3^sm|FK^F%Xl0n$KG2_O;PN-?C z8P5|#89kV!=TRH4s#0zDf)-)=%uf@peXg$}UH9a^sOC9^CF>Xh&(XtlUxH;BE%)3{ zgHNp&gv%VI?YUDO5=9ZIE(_29S*Gij8YBA06Dpxamm%D4FMLS(T)Rx@PW<PkROYTZnOoOY3$wE?SdC7LX2F^h&EJaq77lKz{Y1BUHyrS{cI5>uIFbpYq&_ z8HE0;u{cQnW-SJNK{&v${n-+>_(=d`k?D^kkE85T`e$yk1w{vhYk~#~f1p9HAs2rB zK5M{T-*xEo5hZfq=HNxD#J91wDe(yo->2n zL<=AMjE$XfPf^%8gEP=5Jt%DZUJXoS@(lneK(p3fx(j&damA*NBz%D%bEz52e%Q|9 z#eoyZSiT9a0sIUra1qWM{;{&|eCW{%r`D{*pBLqwR;LEZxi` zmYJTWIXfDirXIiIqaFf>_1^=o@pIqd#0&cRhwrRC>+X1gdt96G8>o`c-!6^{!Zd;~ zByKrjaiW{u=eUZz4T8V=T>4$1Wb2ohmTPbYPe-@HK{$a=BU=NKC`Ua7!nlj8Q>8ff zy`j%5n>5UuUQvbr-uXPAY;pBK+E=Dtxt}gH`bMcPE(^NE&NPC!peLl8b*{l&lH@R< zd_ts3e4m4n&9`|U^l-2l;J<}=9@Xs{X$p@a42z(N#C@T6ZvPLuS4!xH+QsHnU&SlM zslPZB7BIcIesz%^F3+GM(fe*Brm$LM%qFGV|L&{*oy*tdQ{wDCW1X~5bOEW7W0mskZUulTYzB&>QK}K-YhF6-*%}cb% z!`EwMf|SM}625>OQB&_vI)A7v~kI=KHX zWTdF2gM>vIr#B^vnL1=7A4}KQ0VIGhPP(=FWiz+p%_#b2HLJ+a_swbvI1@@bLuo}D zIS=z^uFsvwCoSczNa5yN@A>gg$P?r2o>Yj3#>T8zN&tHuLClRSH!sj{eb9zv{fT-h zD+09_Lm{!h>h@a57mFGOpmcRb1K1XtRgyCfa7(_s>72haace=r7r*ddy`v3}vUH%N z?jcnt&R-7q6W;U{DVxPxaOB!@Lm#v+I*~|L40jfYbI1mgW4|4q=mPIw@6K3zT_HM{ zS$p#S;HVPHDFM@GM>2tjz3h$juxcW#TH6|d<8mg2*tHc-YiJRs`KcA^+FTRXuoMYC z`KWhvwI_-e+ijd`RfQBkFfkC7S<%1H{cfKk{VEUN1pOJIzHaUZV1{* zukCv~$zrf^9v9o3-B(R$N8C|=-O}0}uX!k96w&}!ihiiQr(vDtu5cQ5MhlRti@E&hxAB zY@#DWU^Gtcz&8Z7QTnAXihliB+sjgV%@mpr=Dqs=v_WVw)qiYwNy*-|C!U?@goB8~ z8{N#JA|jAE&ASwv42N3&sz|V2icy9jaEBL8O}8~Qq^^jh)Z$Y3w8)LMeDO49?~Jz$ z%gyNH9dz!x#ABckz^_X;6uV-%R=F;PMp47_=nayF=AL+#8t%nd#mC{0%?NdRpMy_+ z2NMhB{4!4^hUK06ppGOKY@W7%GiXHc&sSh4*~yS;y_iW1OiND2m$=I;*g1dQIyW+( zYyuCW1a1=+Kz&t%^-S@%@!(On;v(evH!llvI#>5ei}sNS*X|I?S4?p*%KA)tM98N? zjOm10MD87Wcgyx_CfhGgCkCCgSdqtM?*Hh#*^Y8P?UIBt7OE_MiE`u{EtN$O(2Z+s zBZA@OyIjrvrWEIDJXaAmH1=E{9!O6uXz49kKpO~lI``zkWor&z@bP_j#TG)MH;Njg zQ}%<+`U+8z)y*u`)P-#%;aOBY&yTchR-_a-~-`uM}V7kg$cs)_h?|KrkOHM4P;oZDE2LIIdweWsglkBVUu>)3LSOk(t+-Sj!pEu0SgVQh)2+NmM zJ#SAR{Ri6vW+^^8ij;!16nJ7noq)cl=&?;i;R+Jo1%y)luM`Md>ea#Dzkw<`WDHB-| zrxXHxuC|F1B_3FC#b9s>2~=R=f}ne(zUIA$tp_nM?Qd35dremzL}0!rQt*dg4>mGsWGYLZ%O9&L5ZHDSGUYo9d0 zB<|@j-HM6))yCYI%KGW7Gg+p=ACcmdb3dP6cDnlyF3N-XQ_48C%xtzxb0nJJG=fDh zR-&u_ynGdKY3w{4V~x85tHfaQM><@Ia7lmZY0<*_7P8?QFhUG22^cQ0!{5Loqv?&? z8R<y5fWsW*o z+zJo2ICGlk?$W$$(ZEtA?+K{`ZnOaD81*Mf<9lt77Clc_Xu*0&UkpN)gPQSt=uVFhhTdVDYIt|_kBIWO_AQ17#+rQQ}Hb`^8 zhAM2BwziXiu-7d+uGj<1$W*Rvndy(a00=Tcq_Vu=A)jtbDPbvgVwM53sbTTO5`$^m z-AQiOBPMi5#bUQ6(R{b)+E)GGSe5^y@{6O-zX*;PZDq?I_WRJ1AJ0KH2h3$xJEclT=^N33;xPtUiDI&K@UUqCW1p z<-5-0`8$(92HyrtI;v`0baRP%z%ixZ%XZJ>`GKd!6EAK)`3?viQDzq(yE1Sq-gS_b zb)%Z3z3odKFCXUDo$zr57Rdc5HdV6V*xiK?tWxu8TbqqKbyx0%_;O7%aQ;F%TH3>h zuqh*nS@0|lTT;{5BZd+;=%PU_hTZ9FYd^c4F5P(^&v&wtC|q_SMS`an7KZE1I+wb9 z`Kok}wMX5EwUwXv&l}RFZy3L2DE#swi-}mqpIstA=d;fmDr2;1js6`ATOhU}H=?$h5tataEl*|#?Y z<_H`#8I(%H=@5HBclAJY)m)8JcnEjOcN8kEyez=VXDJOeMV#=T*Exh!$XqpWhUrp^ z9d#9+ZC$Yjm$S5$G-y#Oj0Bi(6yoq$L`FnhsqVK@6)-wY`e!4U?B@2?<6=`91r@bH zVuoq-7NyKfBgJW1Rghw$O`@I%33(hIs5cD6PFwicUI1?(G;M*c(WZJbUBa`7{8rFAgAA;iQ2F((QU zrz_#F+nm!TzhM7wj?71w6%4@*gjVYCx-aLZyIXolnna{?wMk>9r8Os5-Q6Sar~`x5 za(aH;{(T+I7Y`ci4||OZLzNs~?|zM<5`77I%lkP!9d>h*Tlnpo^5_P6`_f@x%NHV! zOXR)=_+^*(pW8Q4qutcx=ugq;-&37sxnen)m#2}>c-nO4aK9k=!gPY+<^TR355d=va?_LHa`xkq0 zHee{wXNrqMqtQ-ygBOZ*%--Ac{(=aL*K_FtS12O2A40KfSYj8Ul~>yV%jvxy%vBPj z$q3fG5!w*Iap=Dh(0HOz3sD&)5BY{`z#t(=!%=D%iW1AT&HilfVD=eEUoD&9q*o zT65qwuMnjJ8PYmhoEytj`@0i!tcjcZ!Z9I`2#`^`mTC}Gc4FNgG+$cS{dfA88mwN3 z5Ce?3jzs$_QIwRCGo&Na{ekn@r(9Js7yOPH-n|tLl)vc3D!|{K*C1*#6u{LkL#rtv z9v>rfLq&x{lNUr5T$cE|S#$R#^?k=Yr=j?}n$eA`Z`Sk^JZIUbBf<5fDR@S2nxRbk zV+%pN5TQ`ztA-nG8iIndGCMc-@K_2BpZ^>0w|JtRD4M+O`Vo@7tDONNKJQeQl!a9G z(|V7dw7YEK&{cuhgVsN~OpFu#4Gu&jeQpMw58c7b2w($5gaY|GgM_g3fz=@*RG}9% z)O`M-xr(9C$Yi3`@u`R(2f#d1cN%U0C?N}AG#z>opEz$1>Cl1>*H`Dns8h&EVlZQ* zzv5G8RTSD0R8$nv(f?cc^GhE>5LY{Wsnp@-YsAD1BScMb1+3u5j$_9VnLnEUYvWaR z57Nn#Mfqh4U-w}lGJ<$~iFl(oBnwSE_Qo{$ z36%^u4C6^frmy!#{x1zVn#s4awT*s$_DcT+joG4FYsSZ%XIpglgWBmh7vw=ivB?ps z66_2}3LuZ6k}C>$iW}){+40zAcx+vLP~QFCW7j<+J^W@~pX&igy89D)Yb1N?%3FFF z8Esj8H<}Ct^N$PqKuaw6$eXujU|5kb#Gz+7ft_7Y{HKvfxq6m5yA*#Wb(&m?Qi*Jd zTJiFmK$=|Fop7L?Y{Sybe=m?&QiUxozqA>{(WJA_oG@#AmVTsb^>OY*2!H)bI!qI6 z;0e3@Wz~!Dp?{VV@TCF`A%=PNBO z18XxpG_=^(j!Elz^(=$&TmH8EE#%aHLr%OdBsfCS|SF%g@a1QRGgw-7>DIYBH1X4$yxVI*sRSe0q+J;e} zPBCxP0VU_&xY*2mN3&an<&cKDfQs}qOs zKU`yjw}zIjN0UPs-$Uh{w>`&Z_|KWkf$Zi!iJmV#4^3tBKf0oSK_zQ5jsQknIpvuY znG=`&QFOq1l{W-Q9f|BC5W*v>2>Ft zvaS=#CFN?A((y;bM%e~|Mury#i9h_bA=25$LCV#Ngrg+}4QU*vN&yi(z>Z z3G@>z!)waB=KZa>AY~0^G1c(k>5#GzC{4l?*>aKRSlf$K9tvrx+`FQ+7>$`&R7E_J z4@NGmKE}RX$;a%E1EzlN6t3*&bcv})7N+Q+j<<^HfyAdg<#KgXZ`&*Yq?yj+n@FPk z#_RHeG%+y&Kww!@)YY0Xnw7GRtHrAbA3wN5di1JsG%N4t?I83e5Vc>8wK8?kp$wK+ zyL@=SU@$znw&CVvigI^?{trYo;l`?ec!9_ReLuJ>%O3SJe35YeCPDmN3r77Jx_NhS z>5Za(xbsG|xEy*Vj*hnqV=%_R75GM^FbR9s2|?Hl*YS{EYAhJ=9$Hwt`z)raj}i3+ zh2%{_t=z_UYj+ngLJRw4Nt;bgGc1Rab^l037P*^{MCn9ah6nTETtxkJ+T{@$jt_XG z^PMp}`za#9)DwD_|L<8V=r=uH^vT^f&LZ)G=j6JIS$uA7+<4VHLHcfK#x%>BQsg^_ z_2Bs>ML(M)8q$Es0jmTyBOAx|eYFOy7C6+<P+SKOZuf*$29f_>j3NV z=?S>8F(oJ{NM1OwzMjpwjYu4xQ*pqFxHwgtDaN^N^5%y9Sv;s;t^*sP3efxi`RsaG zwe^{XGIn!JvWC&n5R>B+p$%C4avWGsJ>+%YlSMJ>ip^AP8m>6$h&2SiCy&}D?Vz`@ zCX_N(P=T>f1wLg03Yo8w#JHW-nv96bkb#HdZ5}~-%J~#)&Bc*{gkO)P5zo^Zg4kU5 z!_u-hHVZXWlSpO`Pz!6>cs=nH8*R8xa|Ar%pP!#kV-^sDF55V@oFgs6tV$+lSF}3w|KKuci4R@t*z!$s6WK41JP2h~D0u@mpr3wB5|n;t zo6W=;FYp7Pjb&v}8uiku)KM?lwQKscYnEo$^!T{k8d+No{GBUd2;)(@EC|DXy*0}3 z^}+NXY`VpF`d=B@`DP|2dHT%Xe(;SrzxK2p926M5_(YW)th-=BK(V^!y3$YeZu2kJ zMICvE`sKT>kk!}?VvC6{T$9V(tGZzgkP&dnniolSP?&qqyFMTlfdsCrkGYeavFzuWDw?v0W zM|>U^MDdtaq07*8e#NK8*teX_g0i5susNY%47tXuIKk>RRs%Q>(-*FP6OB(baj9Ae zkf@HugV$nYt3;^v3?G1eN!aBr|Q5f%yW zd*O_m^eQ(rKbsjDC%h{l;1`R_l&VDU(FYYmf~Haa`?)1+?Fb!@BaR!axYj(EGL@)A zeN0T;=Wah9uk2|ol&Q!w+hIqX{fNTaT9QzsXyE#jh%EhrYQLr+!XC?Dmk(nm%`;EF zUK@lFg_bZf>n6+2_l;jDtW?J{FUsLtz9yk3_NR9NElK$zQb z{{DF!R?{k#OEn*V8^z_KF11&hFe=u>?;R*kx%ZaT)$#i(X;cQNEmumK*kkOPYM#0& z$chlc2lzW0=pJamNa3#i?Mm9qqoK(E+N4lKo*d4?`2M@UPm;Czt)yg}7OgGs^3?Xl z^n_E+Ec3q`M$Ls`7ojtEysHz=K=DFRU?~5;jBXjZLt96uP@ma|9n!YxRQZd)l9DJS zUY0Z?0r}E`vi&>GZmxl6)>v;TvS%E1T!~btccx1OsR>of= zCR6HFh14`-d)4wdr**@h+3mAbsqVujj&m%EB-Ydas?7$%ktHe6i;;GCO?0b4)tb?k z9M(ast=@lXcRR4fWsty1y!sSG%;*Sd@L}UX14>TBSUI-1h=t3nUtm}(Vz(Z^RO2qg z5FLyYm9pvytru|otA1Xu&V?G$hz0%fQD$(4{bQy_Nk}Aq;Wvdr%Q-Zfs}vG<*)Gzs zsr?*`K}B(S1s0}G7O_E9)&8}-6l@XtL+4I4(q&iFzd^oPu2dDgrAHa0pJY9qz3)cP zxZT&)KD@aMta~#3bG$w^c6N0h&TmiG#&&hrw>kV?(P1TDh>l*|Lp_zC0v~FAlS@$I zC}WV~nLEBBo1<(>JG%;Lg2(1h7AA$gMQ%s(dmYsAHUgkC6+2O$GW{6Flpz@Kl8E+NSKA3cjma z1PrNbRV+BE>p(K%WhbJ4fHRGQLqSQ&u&C9W8BJW@`OIL)HKuH|YO8PCCjeo!gS5qZ z9`Ck39Y+RLNsa$DVN&P?JIDL$kejSEg2WgrGRt+X1aFCAYU68d} z5Q0N6p45@D-%1&S!AKymr<|O0xAbKMZnKTjTN2 z*Y+6f#S(-mxfsm>a*!gY{D7^l!jiq*dDoj}0LjcP?XL+egf9efuoV@iS=8HY-3iy}glEcfTu3hm!naixE)&p#_F!ixR`_pormDK@HT5K7q? ze0;>ra!&PWa|j!_s4Q+1M4K8AEFZ8{#drAGH&t)8m>K}0t&-|^wkIa$PuS>rgbT%% zkXIuY`}@`kU3e2nX0?}Eq9ZzvtvB)HIBCkhmnZ z+VkxzLS)t@zj^^yr$B}@Ioj^{!f>czEn=eOqW^yHv~uqNT4~F=n4B6kBuewS_+)vp1rcAGt-fejl~6Pvp#5hSddHeoNXC`mT^(Xac?!8q~dUWHCyhv`SjK{vd8A1sWQFU3coOU05 zk5m`gOdjih57rLI*uMfb8hzBJ&WME1SIt}C*~^?+tv^c%zhr$I1r75F`)6gABg(+6 z)&-RZ9x*%#ugni6@?Rxtc6dFWR8q$^PP$K=utzj*B$9u|7 z*k-pS&~`uT;Og*ojujy`F7A2-Xx2TPb3*4814iJZ)QMcPv%c>KnQaySrA1E|S?zWZ zFd+6@oKT!hlm)MDucRb!2#82b*fvKI)~41}F3!yWEk}izhcmH{^v@l)mhPk}pYXZw z%!qAXB>s0|N+f*p)$68fqs$F+hT?3kflZ6ryt*6r+tOL{|38Yru-dWezPR#n9jsua?y8gAv?? zk{F?wgt89L5QdHUy4{kzei$AvM%IGYT->ha$4JE6dbq;VdOW^)DmO^Dx8E17td5mK z@mR?ieRY|!h-tybrE2zs_?AAO{Ni!2rv3;WI+T~sf`+utpK3|h>B`4x=1{+*#py8$ zX-F)|Qc8S01(N(~&FIoBY|BISv?U!0)`~m$ z=LEi2g;Hif^MI}R>j*7$tEttje+6Ggqx}vKB8f+fr(pxD78mV2V{ExGcj48X?)nIq zk`&RfjatueyZ>037_J5n!W!F~B6XagYjunszn^Wo2IgizCdRuJ@tL&q3zYLR09)6k z3hro$=>8xn-c3GNSZJxq?jL8DZyOSYzVgeerfxpp_7RSTch8HHqyS=Ybi`!KH<;-R zm>BN;^355i((~TWv^^4YUz_K9$U}}^7^j)Q{7Fr$8piqQ; zTcTGh$GN6LLPbrH8Dyp89{`8^&gx%WloDjY%eT-2&@cUE2@S0NLe?mAD1(K1;%sTK z)6i3%RwFUMIU3%s{_81WIXOE9Wsl7-uK`0Y#FA}V#3LkXR2de1pu3`AQZls-cnkkbYc=CJsZ@w@eA)I$&&U4qd+KMw|KL zF33$X;w8gqtdZ3z9Sh|>L_)H8E7WbET74e>kR_*#-!02N!Q9-D7+nHv_;XthnF>QJ zh6-I5&ayF9gC0E87&=efxBufmHVrXQCUuuTp@h%FT%#AE94KnZeuul_7ZIO0ysLzj z>$^9~Sx;tPq1zpj>wFV)7*$0MuQTi%`|3(Z2;t+#=tFk6>H@dbu(GrN8PutF#7bKL zX1!ywT8U_vhQtD=+6idR8fL^TBQsNMnX}npBitsdstRikD@1`}Vs;j-Wdlf+LnSFL zD}$?CDw;#0UZKa5A}5G*z73M7x?CL-U4}p9_P~fIz`~K!&&VPpJh!-gZGd2O9m_kCp zL)-wMT1W%NKm6kX_*gio4y{OQlOTjOKYnt z_|8!0M1w6FLR-$r+HDx5t!VCTptZhMOQJxew4>B(wi#AGkTyp7rzQ}g#nC_@)1;MiOg zH402Pdj(abjLZ@IIiseO01tv?O*aTa*7&0=-J+W;rj>KbH0xHHfCt?x&)o8c@{$p` z(XL)RXyTe=R<7zIelT zZj@@Llt4mynBz+X*@9?Oaq9iDtvRJfk(~bB(UJJPu^|m?JN)zklFWkD%8_dNH_zeP z_DXr2jc2BiejM*@Pr;p>oLHEc0HHwMvK(IZ_4E+`m$pG|udlRCKpF3MNI;NLb)TB1 z;nZtd%EY4-4R?$RotRO9J;@`UCbe{GB(2*u^u0t#kU2HbkTdbJQUEA3BK1N9<-I;D?yyBWpj}>Zpw=fZtT;)!IHuj_fkK1yYW@VyI z56K4WRY~yTKx;LuQe(LN(bnH)DSwMh({fQk`~i0+AmR-O|J2VQk*Gisf5ams-RmFv z$|+?waAnEgXkcxaF)5RA((iSMd!(&9$tEN;1;j@JIJB#W+wIG8Po4qK83lR*hlohR zrMOn}FHgbYw|S%;>x_$w3o>e^f>qn(i38^91~oa`d-~@zq6&Pp1f>}Tb}j+g`cCn} zPRR;}>9bwVk$BP)b^5u5xf#b#Sl90~dC2H$W;t2Bay6}klj}rQGdU){zC;EKe6F|T z7oE3C?d<~B4!^7a$VfGUOzE9)982sDO|rkl-?&o#5D;_v2v|R1C<%*p>ld6TY){Z6HG~BxM1Nc1JdPcSk}~6s z9v3g~y^gvS%QBZ8|{Rddd!X!Pcv5eLb@7uK?JuVI2=U-gD>z07NNyeOYnRW$=oYpZJ}`3+CAnFAaduSW1-9Unb87M85rBfNTqEP69?Irt7N#)N5s< z7r4XQ#;R0A-+Mcwoq*3vk%Jhc7mAoLK5uR+RsjR&DI4>Z{(EAqLW&Y|XXoVGqnQP3 zPGFzF9hEV8n?F!CoFg69nvFZ$s7t3EFV?-Nm8RGN*k+z@_x2IJ!o$N?n%&m0r^VKq zGjlUb>hyb?h=5iZNIBanj36<6+lA>qygD{Ry*&!}IC|@|`V8DtCZWmEI9ahY9n!qg zz(tLaZVcP=WMpP^yjxKnKVaW5*g!%-nFpZG8bbHR&tBo=RbE8-+Z+Lo;mj1PHczKy zU*Q?K`rht$pVgiK5rbTV<;fRcY`a1z*m+d5G`q>oS7pw!kFbk1Dk;u9qSM3rFb}e> zJ^1G@iAx27tIe6UTsn?IcpH*$!xEsMD-r1@rX_S^T)nECXb268DF2|<;6q!zQO}Ry zq%z;}<29D;(9+}TtZ@y6legQjfl9UZmG(AtP6ufVNUeS@F`j>m~k{C5Tl_&{o; zAt~eJ60@U<_{SObdz&Y^wJ2&~+)N|AeEC$H3vq|;?t;kJ_>ne`6D?F01=*x6`2cYb zi)JQy+#OB1%!WJU6sxSP{1Cyjn);xe%{EMMQ$xqN`*OjWTYH>|t%p?^yjlRT3zn4t z0V*_@qAWbNzAnfx1l7FIpF$FUzWvO+hdbTa`bX5MB+^0$2?^={)E@wn0J99B+dn=% zKez%!J0E9Wy8r}%a#pHoqw;f6TRZQdKg_9OiM~xg9ub#W(84WEMt`J4ojGaZz|r8> z^fU@Z5^VyYj0E0*D>DU4E4np4q6R;;l3|g+;_&c@PsA-<4y@3nI-&2&GKf&*6%58na06Hg=FTTF|VDDLaKGKs845 zdw&NSO4DmzfXA}D%o94>Xgqr14Ah{FhKdjSt~<=cM4648^-L6_Ok%Qg_tiEA@u`~H z&@1d^g{~q&Bvg|=d5Jv~!(=gb&_gh%L4u-+ofE6Hg&_*?k*8r7p8^?u{WJt|taUaV z?=9UF@iV8;2b`eLplxf%AHo*rtx|4c<&~$N)t9W zr>qE4?@&ydJW&43o-Rq-kl;~XXYb^R1%*GscU15R{hW2IbfegUZPNLfG0-z&M8UYY zxB$61+g>CUMVP21_{8g@aXjY-=>jNqZfiIMQ`Fy6zWW|r)H*)Z59}j8>DAR@rwFL#mPWR0+Tu_td5(*-DBY%+5>OBU9AEi`s(<&&b3A+T} zlw)ek-`<6BHIHByMRyXN8@dcx9Z|F^jrM9WTlB)DDwW{r^Nh}Jqxp6DNm3*MkJO@E zm{hqk{NqcDI!dXZi{{^DOuF>?a`+;2#xZXV8ru6+)Gf6C9M}Ac8cH5~;VHOB-7CRt zRVyk-IEfY0ZLywY`aZ*?W|&p1s?+CTAf6?sMWOULOGe!B(0K8{gK>T~^h@}@UoZ^O z$~sl<7YsyTg)PWbmOIwo{Pc>s`R>9*Z_8i0Q2;Fs{yrz>54KvNQaF3|>Z}vAU!me1 z)qjm9@3ily-eZ;vPxEC<_DKrVQA4|nwp;+@J$7_EIW?umoHomu(zh9Rw(5+j*ZgDm zp#!Dv5N)P=W61-vm~qED zAmr#%S@3yen`vil?KBLe32OUF(yrsr5P$Ssoqo`oH0QOAzckStz5! zkze+}CMPTHPmeoo+v^qH>~w>!B|JOylOXO4pq`5S&BH0#T8S%U zj;5UDi9s~c-@;T(=m=lc-6;-Vl!TWZ;c?T=_OeE&?`+24ixH#qnj) zMk$|v3i?rGbTACjwRqudr86y#klQSaddCsoV7Xpb>@6To>E-73J1bX8cMas`L%YXq z{o^N+$Xj~;UP#L)5^3vmnderJ@>RT$$l&JA+UjOYe#`kYr2lr4$PnRU*RRbQ$i>hv z3hAtqqQxCLr3@`Xe!D}WNEO4CJ_GU zw2&^)>T>F{lIP2G>f-?frEC5_CR_B8A2?F|xhdhuYt22G)h7~2(!d4`C^g$}^dBG7Qif2T zt+%CIcAZ8%^%~@Fr~7$0Uvc@Y2AsOL!?7zUDmgvP4G3NjnqkQ?z)O+mDsk}g%JAow zTIlfBNPzK+VNk0scWW;B2IKW2%3JwJe77MKE^kY{>ujr>uzKH2Bps>9nC z9Ir91F(Kqh8-!kkMpI&qclSplDjMy|qxMYwz7_|dqI=!k)l7V5B|~!yi!jT|D2paQ z>$Q*bD^CdmKC}XT%C+8YM2Y*y>hRSSE%Y2-p=g-MMS%~U+Ptz5L_QX!vFq3W#@*Ov}MvzL9mI8($EhCu;u)k)eK ze6dTtZ>9^}|E8$-5=4fF%)UA1@{3>BZd=Dlo1Sg9{aW67BKfg(&CQMMKuHple8Gdi zPFNP87d>4FL-_bu|9TH5YPTcx`SEvp7MXYuXseo)ifAN(@w5_qe@}}ZyZG`ua~dze zU1DNl0wJ~cjEKL0@!^?jio@Ua^wZh|A(afY(K4D zuRl6JGYWvaRw3Xhn(N}59*x82K07h-wBixCAle=laCf{)_p|>iAYS>PkTU~J;XvbmoHgCs4(Tc(F^ByE+wqmgRVhb!eCy-=h|l|uw)?cO z@(_U#{07RkNi~+U)h|gjF=Hom-B)2OSGWNm zxPlK)W`K&1XoS2aXOF??eH_5Qu%wKS=}jnMx+PCZDH>iOrl-zvvzw%!=Y@=oSh+^ z@&K0HQBwgNAUPUnQ8^XON?QA)Xp~i|HPNHVFyaA%SLH8(c)k8^o=?xzhEbb9LGbuN zMow0-3T-Fot7zq{dK>_CHLNmjY;3rCc!+QzTp6UoUAbO?)b;bFCd@X|C-sus(q~L3 zz!&t}URVT7hgnR_i%i4xip-0;lbnJ#c?HqpoA-PMfDT39YSY=q6N3)aZqivm8+hd9 z*{xh{XlCmj4RFn@0zC5I)!th{-D;d$m)qt4Ah1Lqsn{y}q$>vvhbVUV0NPhyX7G)X zLpiTR-C=&*RW)W1J&M!NHnBuAk}#YwEf0+Zi|nmtCI0jb+gDA zF&qY26pgb8(n6-ZY)Q>yX8nX@ZDCE_Csl5JDF6uugUkkn5I zwC+H0ugeDdN_K{>8Ntf|J{k^&i2~!Va&MFvX{jM)&rj!#+6vq`LqqBs8jWV(gs8zu)|?e9Q#6>2wTv8me6q8o`)8RhZ%an+Tr3}F zRzOp@bMJ{yOn4yoiLL2ZX?uh*`;|J!nMp&OkZT(DEZkI%A-X=J3dYi0ljeIdMX;K1 z3`vSXg!zQy^^MevFd-RlHuWC8>B}2^lw&v`203#VI5;@qB|;e@5lI52Y4+Bo~DPaZ4B*7X-w=0LrNSK$ADu}f}0w0Cy*yv#L}Uyml-v`k}g7e8qi0Sb{g81RFlPU z)|`<&(h-<`BTDuWB!hpuvaQ{OK9cD% z9!x7Lrn61 zk+gw1NwQMnq3MS@#BHIcXC1LUkFYf#@`EA%?B$>+l}L3)IqKZ$ z+3r6ATV7{h(r?`j5n0SM4+xm)7|<_8NXcAr(+K<_7=KuEWzi8LcmrNA8qH$VHPq)9 zRVVu2C@O_TaALyd=hen1CYIpk#vjT8Md{P}k8atxxQ2jU`FW`}VCb~AXL@^^tll%$ znlV~rn}#4JnT~hLlZLDy-6193zYJz}BfONDHB!Ys(VCgvrFDJGq%6&V8_@s!%jxnC4=akAH z1xf}jh%x?$q?ApPE!Jy0uc~D;U_BoM;mogS?T;|iOVv4`1wW~Xp`$~Aop4l5cRTTW zg(_oeT()Hw0d8mshfxXoKX##bexd&mzN%sXG&2me*zoXh>(#0Sb$A(i;_veEVMF^q zOl=B0gaV%9`oC2fOqTZCgcc;Rq3pjCTya-!V2?h#d`)McUKyontwq0hOK z5V``z&=#@&OxL`1=@qZ4K#VphQ0G!#+>#;Z4Y?j*!REuMrejmOccG|SfpB8cbsp+C zS$m&O7GnLbNItq5dt?8|L=yiSI%hg)%2CL39QADhwEJ}! zcEsy*@5=zXk_x{3vTKO&^bzyYm); zNRk0{7ZV&@)WbBIF*6774o_N;M%9@%(aKSH&jq3_U|v%J@ZteDL1edS+2}~C z=Y^|YG@AW8F}ELGGX(FW&n`LYF7H8pV!H!e#sexNxJ&2V4}h@(Vl zMfqJ&?eE`FM9~WV+7=I)6b%;995N0!f3iO0`N6xxMYbslq1VYn2`FGRX>w4@svrk( zT})rUZuEvjiDp9%#&WO!Cx_EdcPJe`#yDB1cfFl&Ff7DB<@^cZLh9FB67YnsW%!1k zR9RL|DHBE>r>a09r=p)jL8aWt$tiR7kMYGAi=Ca0PeNZtRTVs-S|l-BdEL4+{he30 zI+uhF4J3nMV&WCOlVnmVZFSuy5sRWU@6nx~6vVdab!71IQu`79`SST%+xec|a_t4Z zf?T3~uO!(OTP_nZW_+-;Y`8a&AUxc(O_4HfK66KSH!f3|^26~|0YdB-xdTFDa)zb# zEWHk^pLr!i9FoOC@H3%nU>I8TXy zaWs>6wA|yLR)2kcrmIAkPhwS%nL;p5FW(Z&&-0Gq0b?idTU3w=LkS>h>^{jjqV z$qJ?hL0YguQVvZvW*j9+gI(pP)BHbI;{|yy8c1i_{dz|CJ-&@CsY?w%4T z+uGKueTxq26YDf&k&Z!E9vzbNgw#>*Y%gB0(T`!S(QoS?9fdcn{k62Dad>zbIkK1f z>z5gKHacJfx^)pNM4O4|{h2USfW#=Z8~f5fIl>M~#*l!P$iXMF?B53&u0fPo6ua@G z!Ne9xw)M$`42kA0Nk*wgklP7)TB)oAaN75=LD`7)vi!RSEhs1|JGt41Ue`lv*7)}C zzxJ5FE&4nen62cp@e5E@RKl?HL#~<*8aHAr^NF!TQJjRvj{GvUr5hNP$tq+Z*T2AX zs)b}L`GzK$mKq%%AbqnL?g( z#laeo?jh`(rmW;Q_&j0dxwm0-I}q?j=>Pmrp0N#=j)AG9ygbUZ?0Zx=kPXU@5$TOC zCeEfBKca15Fw}Hx>g$^`H>Y~wEB^07;hx8=Xo}1p!z{Riw||4qx&#*nQZ*GG0i%&F zXth|fqBXsu)SakFas6?W@{HG=$el9@3)`YiDcLb&^3T$L*D@Y(T}{}j_^!w5VHfA2 zAUQmw@H6h_|452xi7BKjA;aye3|e|K(}5G%9lDcxE<6-XBQqaojOX`Gf+fBDZBpiy$aS8WLkd4 zXib?nW(88bB~}J$ySCvG6IxDl#jNd_PIF0+9n)kgY(GBFp5AkEajWWmj|o^xU^X%F zSQ8`hx-+TZKM%$9Kg6*DqHf5Ekdh;*fQ1G<1r37>(LMt6ff^`?52w>z2rEbR9e{Bi z9UKF9>dDtPsQ{i2_{UJkzoFCnM7h%6)zxO-B%qUjQ??QmHoifi3c7|i`w6hFfDUo3 zGBOCPoK(?eqCBDUw-Q)@4kK>+k)aHFfe@zQO|b5KA+Xv=K>#8S8b++QfQNScZ@c%n zoIGvQzmwk#yH_Eo^GjWrm9itpLkXEg_~J@p^{b&O>cKTGxDH!S+={QLWMv$TjLbW6 zl4IuV@I`@rj&>wL`?0Y~^Q!9Vk_HCE8fhBv@E}ZCbMr|{4!0(^>=}rCg>XsUNRJ=k zbyoO%X`nNMAlKmGJSBcoA-RP-XItAZ$zO?6z&53&YA_VA?BeM4#R}#_A&ImlHSM@Z z@wWRIkSSvQ6eqI9=BC#m!+;DKkQjBf^=wNPx9x0RloWV!a*Fjbiv|k?BR*XF-e(90q%V?; zUe9jMI@KB^M_t0puyHX;H4!~xxLgziti$H}p&_1xh8V*18HZ&aP>>G*L4{H;0 zEOPQ_b@%(a%kq>nK5rr`9lj#N9z~Q66d2a5SXX!VtC`P)fa!pz&4BHdIWsI=fw|NB z#l^)dpRJd!sV@*fdJCW`fH_geFwb);nF{1y{2R z`|^&@?CYD=tz~GkJBf`U&yXPrDTW0ft_Cw8%U+R3pC-%jI{(~+;~azOK#)1JHtuDY z=}Mie@t=*JK{9A=eSPwx%cuNz6$lTBU8Ky_H+w3)O=c$5Bk|YP2i(U^?I%xd*E0d2 zUOm2tjg?MmFuHhTNLJgJPv$sv!&nPqoEXF$ha?(emw(3Mive;#3+wCAWs@_EGOXqf z#1mnnCt@P;()nDT%>WO3KtJlo1)P4nYm}#8{FJ3cxg}nE#@pXH% zA;)&M=yD8b#7aa%RFRg1!9z+57hQty{VlwnTYlPAnhxap8Ry7iXfSvD#0M7GfEW1& z;Bx2Y*JGC|V3z6V=}oO>rmJCkbdDdgIKo7p#gH*| zqyN#4W?`CY*+P<1+4Zw8V>?crPPO3Uy6nf3@<*cC3<)*!v)AXI$J10tPhZ#B@acWS zz99t~()P7Ce0Xq}>=wsLmC+Gm#G2xA$5$N#2|Y#}P%etB+JCG3jhTO{GpuDPrKSux zFGU9Dj=IOLY4S@eOGw_B4{LL1(C<{|R%FQ1EIoaR0yj6`?_53h>ekT0*34jv|AYc_ z8G4rkx4<+74e*kBpiq!r!0EDq9%VP*r6{i>(cwY@^puZ(5%($Uc#Vn<#{9S{?ds>sP&7|0;pUMq8%czfZh{)-Yn~IjfPju`yFp$8i#xaKw#6{oQ^(&%-?3eIDKK zaDpB;AjLRE9(oA#eqmAuOhk|`zpFG&(Pku>-0>LM&@b5tYBV*H@l(*>zaYjP+5VLG z!A^!zo279b&B+&-5|1NAmIiT#+Weyo>GT$oB#ulZU>F8QA$ETL=qcMFYff{&Te^O7 z1rR}>Y5nZ%tSBeJ0no;pySs;b3i^*snPW!5G&VLWC@7K1VgQrdD$}s5G+%N3t`2#w ztg3-Q*n-aF$`c;IN&_6AfOq7PJNa6U9+O0Kt6QxE8Vn;2Vu$$PUzsatbeA=a+Kapku$gRIl}XviV2>zq7GllO!jk*TtjDI+_)-6m|8wzef9 zx0LutM8h!h)Ci=?@N? zRqX86Fek%^VdWMc28Q@P6|~0H*j0P!vW3FsQ?~3yp*x3tr%Iq#)F*5me!c9;j~h%? zpdasN@YBl3&K)vmH*H)4YBOG(w1PBdvaRHeRB!X|R_W1zda{XV%D+P;Qiq3@Y;qVV zWhsAXcTmDI;iWS4T+xwW;HAYmn>=RQ%HSFmhxZ7Ey6QxAVRH>fZf+22zTozWvR1mZ z8_Zh%1xCP_;a1mc3K6essgFarfQgxaYeed@QtnMytY%g;U~eR$$@PIQ-l{b6O9)8Z ze|^u4QK404Fm46e7=D^8sn--Yk%}Y9I9i6byVSpdi~)a)w(W3(QQh2uFKb^c-J&Ro z77-CKHa4~nILSmP970@ER{4Iz$v$7Zlu)6n7;BB|wH^6$8Ch!4;)XAtG_$JOt#lpf z>d!}LhOgn?7~6gwpLQq&1c*>kl|aC}MNcq;$7ERX)cr6vS8q1xVU~o}nwufldNS4m zi^vKvsqXlNc0?1^dnMd7zHpbN>;ysjzwiXa<#Fa382o8!Qr%^w&P9i3X5tWG9sDB_ zUcWLOf+{TY-HZ~T%(NND_xEA^v})1dVV4|wvqexC?UckkI315?$%&>ZlydopPB^Tz zU0F=)b$K1Pdxzfze{LJV@lgVvW0^rykeL&EIhHfMlpqGhc9zw@GyLhU7jj%BCJt`$ z#?E9AS|p}?sqE3CQ?-ay>b0;4Pj%x@t3{SjGI*I}6xqcT*~+zOe3>%y;2_rJ8l>yP z)1IB&mQ6FjvI`Ib=~{r_3-jMcB{>6Dj#Ak!Z#`Mnd^G@jpv4Tq!$60MldF{j>%bBv zEKeLi;Q^t;N1b=`^7^fgK_{6u>pytd?(y!r5{Pn}=cU$_yf+o$13~b-3ew*E0$x|! zkU7qwLu2H?&x#;Wy5i+jB@HuZ*x4nYbV*@n*pcrAc(1NP?p!&OBc(HPa{3L;%j~Rh zH8eE5af&xS=>r0)%AE%lm4$jxwQ>t!=K*WgWJi@4~A01fT$q`+{ov2 zSr{#CoeT?`u`sfzXlUII#VGWGq;s4xnh81c)46(8|0fTT{hp8I&vBZ3{~~**O8Mzu zhW<7#kaY&;nTqGLqqP4c=^6w2e!q5JSS{Q9uG+8VW!uZOY}>YNyOx)YWpi0e3#+y4 zdhY$77rm`MI`=u(xxl=!E9Je3A60|ztCuaxo1*?+4%@o+(hd&>Mm#7Y$K{R3&0n&= zleOMyVPyQ$B1W(}Bpbvhp6Nk3@0_+a!;b!(P*9C)$l`LZa)0u^`>5x!!@zrfhsArd zjMe$KkMsUmy=Q3q5lvY~HKgA_q;`IzX{zMZ)SZ`LD8DJYUcI}GuWz#X z`~a0ea-1bVBm3n$h3?CwSG0#n@&e~)HKho~$U|xA_qJAL-meCc?KkKOC5WDC=^43u z)h)i0k7wPJhj-Kw!G?N4P=VxyNzUPk!JSBxw%A9`gl83L0pFnkFTZzv{mTuxCIs8i z*m!RdUJy4EY8la^kK&brVDLGCL(7`oWF48X%^15stDud4v+K(0KZR_Qtrs8On?od0 zuLp=k9=GfnRn8AroT3KPkAzoj92|fU6L+zYq_;m%M0a?!Di=|bJ;+QZf>$c}AV#|E z6v%h_=Dmv=IpQ4mMzCq7HHg*ctw4LP@vD0UX@)|IF&J0p`dcCaCGbmJ_e&VlgLY_Q5{_=H6I2Cf0Q ze{5rkyW$>W&&m!Id1$j@aa!;MQF9o#Z{M8%CrWNSkXu9jXKp(unldDES?3a62Pf=3 zCucsMTm^GtV#nM$ij1S3K2Pz+*q&%x%gV+U8n$bsjR^X;m6IQf3rgzhaS&2J>i%hRnBBvG&DDHk&V}tFKN~#6eeUwNf7L>eJ)NM zH|Wrjc6V6x?*3%=aw5(%0oK$R38lS}z-TO%|F}2aUSC#wcHGm&vvTjNO~bk<4!@gu z@zz-Tg)WY59^GE_j;)uzy}u}>kd(!HluHy4Yi`I!2rO{WGgLAQ0;~YjyYA=t_BFhe zI3?l{TY(@tSI&?j3kx&zlobHUr+sgnYIKk2h>;6g;k$W=n^ecQ<{{Jx`MH>lgeNDK zpC;7Ne4}bf9yz9Y&xy<3L$^AwIRsuF$u1Xbw~TDP;mewmE9wcWOnH3${Esr;MIlAMucgn$0@041~V_Q#Txluy#qD|NT%VjGVm z*y@V&GXuG>Z;lR+jaLqKPwp>)qm8d^8COp{Og?%bxjswAd(fh_mF9%Di%VM(zHKV(T(;fB=IDQ&0; zyV3~v7{&HOk|9sQC@;d6+qX& zJK;^B$*3vS@qP>u_}O;GE8Q>jreT|63e_*VO>~&E`vodbG{LmF6)hMb3X67T)dvb&ozzpQ^j0@~V9v*wJD^NoJf zOH7;MtwY^{nUS!sFKhqp@uI42bLhV$yRv@&D;5liWMgM{Je(0~cXi!iY*JR&LlsUm zXA37cj+erU2}KI^me$AX$^|wdq`rp+$8JArH#9%%RM_FQ)T=D}{&$Oi5#kRCPmlJ5 z6N$7qLsX~b-yIv_GQ}%9T%GTW9rBd^ZOukTUsgXKP{Ssra+MfP2VqueD0?O!z7ZJA z&GnH?>>aBoGS1K^9{~q0fL`j0>H>zz`~q|T=qyjV5;Aaqntddm=DU%LCHC-_AoEEU zc=8T5quqPW8CRu6~~7&ywP zD;+O9J9liSeN2-n$e$8^-foQOMf`$g-h=;gw{zTl`vEx1-G$aLT4+ndplE8dMjo4Q zD^gj8DE9tUbo=Jpwx&N5GBz!4JiKIya@9kpdnbcNl__TVC#s@;V@YOaK521j{cn*I z6LQRatndU0shO_F3`ESv*2#-24sU*GXk_*Su+rBy7U2D+W@hjId%rypv3vDrD{c}5 z&p1*T@|nURMD&TB=SthfVFZAP))5{-rx5l@F(;rvm=kRfOi`wG4po+L?8MH+JG?w95< zwL=LuRlf`CcUK|v!b!myz;c+%5g49$!XA|+26TYED{3;F>!uJl%5V086;u|)K}fX zvFQ%e<6*)t&V=C%~%Px%Lv2PD)j-3gt!g%qWWTqJ2uC zVdD3DNeTpnq=qgoIC;~WNAgqD8Gp%c+vEo1p&qM7W}~E*{d9+iM7O8y)BVDMaine_cx^qy$>K zH2bpz7mr(uvbwf}l+=4iaX`~CY*@9&#sOg1Ur%*So$DRf4kQE-$;4a|oa(DTynUNK z9iLwIM6O6Tg9a^!x^_(M&EtVkiHN(?si-xlPfV9}=zulX@xXQ8`SEkRgY{y8Ej&wn zDywLpgW4BgTC>jRwm|nMmPE8jVnxmOidvM0EfJrhsI$c|xpO4BsW6zAF(zC^yGTVf zGiZ%rD{OT)Wx0d4&i=V=0q>oEOLF%kOdlT~Svk47&J$A;6O)*{@uw}|#1nZo4xCog zpt8(f?+sY%!vn(?tjn6ZqskPr_spl~Ps+K+{yb2fRPl+*c)XK$;sS!{Uy(WMOE37h zE+i!;5_B6nJmr=Q!i^>AE^^E)+|knqWo;!PhGxu{mnZ;BMXFtjqLx%iR{z$1Tr{F6 zZ#Qjl+%cBmOu4zB`ta}{E6@de#P2LCtILvlzFt#U`yq}eNO$xVQaf@C1@Nu&$7cWx z?4?4<>8;cBa*vG3k|(LX4QAvpx0;(*d4sE+Xb<<+GhoNi#P}VY*t#w&h7Q)$R2jOg zSk(mD&pa{_c@uPaj3A|+0+D!7cyZHkBj|QS3o!r;CmxjG&N~I{wt#~k@Mi-E=;YPa zTUORFGgnvF$=j6`0#nmcPF$!yTvO@!@Is_hwFo;O|50-;F?$-z)wn22G#TC`li02 zG79`{aM}g;8#osRbamW*b34=J_F65sq^C&!>vVJ>hKq-nvOhe59U%BKHuj|@GA0;O z0W~6K-tKWoO_Gw5lAMxaQv-VkgW^AVNJpuUNqv$iN@+py&Dd}bmLp8iM=rB|4lcnw z^uC1Usl4k@n{4pQk_;_Ucb)H3L(#|)TObq&4;O*{$ih;{O^T7=jLA}e{L?69a1b!W zaWyp3&3t_Wz`OJB-3>7|)9T$T z#;_Zogxk1o*?VU4czouGLfS^r-iWOLZTUqK6$litC{!kq0eMkAKDB`qP_X#f-md9+YR*~i&@DP zQjCX47o{25^v!ZL>dWifhl>8f$j+M;r+h;nNaTQ z!zD2J$^!HoIH7^x*MR;ud^N!~&-!n<%FM+#y0=FSV92rCa;ehNvh>W1O%13j9jwic zcxUdn;#8)U85Nnxgq~wxS8a+5hb0$mSzWp~w8-cSj`->1-i(2RZ{kSS-)gMsN0Z!QjtaA;eIrmo*9 zJOASe>r@WUa8rO4984rxj~7W+Q=Q?B6D!v17Rd-?+(ij<=7{DkLPTMvDSbOxexnIq zNeV7^yNRbKJol<`pcJg~c*%ssnbFDv-3a@ZF#VYjOG-T2Ba)mhO+8zLEO*=sQH#I7 zKjb~MmD}m+;Jltkn_`cp+L(Q+a@gs?wn;CSAax| zC!L2DX>4gRbyDoP_y)@jJUd5NLf{JqdIMy5->+*Y(?`o9s#O%ItHP}W5 zsyli+9K`EQWQ|K2mBW4jB4 zir=45M;+a^EeY{>v~p+8kWlORtIdZp<1qLJ<+!FV3Q9p}G9`$V#d8+GZ5?3$S9*lT zhVHmr9~66x-ozR*)TC$z3JD+tK}#rMfYoZ{f^?lS*EU@wWrl1h;8OepjR0`gw?Cei zk)2JA8^>VPA{*L>TXcq-KSMukZcL={n7hQa^mB;Fk4NzeCggs9tn{f3HODO`z5@%A z?$A4#rj0H*N0l)?^IJN?>@77W1{@cnT14xQp}!NpQ!#(c*5^m-r+X{BLcUqSc^vud zY_bk0L(e%T<}XJoULcCe>3#p)O(a!|=>Nf@pk7d1trO9V$e0fTYxZy=I?(l|=Q%mtUzq56?Bi^DK9l@1 z`?73V|jgg#bl>jG)G}cH6qTX+%@Z^n33j5bvxXPOvj2XJBUKbW*|8^KI4c9NwC}- z2QgP>yecyam5D_4>8rn#GU^B#hdt3&mf`yu6rUpyQ+GZmCI*z`2i+?&G;GRaW{_ym zqZwBFLKUgR=yC*->jK1TgOhSM=4TC}{}(HimA|?$O9_s@<7Grd0HxZ%BXc&wfOgo- zp2=d?nFFTF{+8C>p0Yif!vGTT1dTrQ5q=^!4SyNVl z=fUZF0N^<=eF*aG7KD-&r^0O@kV=dij6h0whyysr0 zfffuvhazz4I10t5NDC!L)HqdJb>m2?zrSxh)8Ti2r5Zvgz5Cl0=W(>3cK`DS&(rkl zvw+8alOAAVKnbCL)RYxf7V0$MtS6_Eq9kYLU>Qp3=Kn_y5~Xb2uuWaJMTe7?aXf$g zL%i47)ctvys0h_V_^0?*hfnKi{W*t7s*}vz$(={h9;Tq#jPkmom}*fU{ZSH8G)J#89uK-UF*0k7)W<9IUccC}QshagLA{jPSyix~n5C?Lj zis-VcPr}AcPl2=_bPjc;?e4Yo%$F_<&3H{xA1sS~_8Zl_{qv18`{GkJxhdwk?{OoD zmE=f>+^`lwvB6(gpsaODzqGaZ$}2v@OC~mox8&>eBz?&VNwm-%vZQcSJ`Tj=5bcgv ztBO?CsD5h6FyvHdl#D@&G59HyLaxs%^>}(jQ5>lb8Y^tvI zd)<%af12r~MLGz=HUh{ITh&uD($jlSU3bqtfvIu-z9R_8y}amAj>j2{UG2?B3_cws zS;oaUlQWjHuoL~c0a5X^>@0gI^0E|(i>gBw;0|-f zQr?S+s{_@+9$9>eahpv^awriCAFup=&-kqlV+8XDTbVadOMaq&BPI?&+ms(_ONK3L zvq#R7i92I8jm1}g5dGOP)t+mtT_BhqUK0!lQV#G1_TdHFpzD%2zgO2p^-RyrDy^=L zIp{g(1tt#pV2gTD&jJEESR3X6uZUVGZpDz2M(o>ijPtE?o!K-g*m&1zFs@wt@?s2= z{l!8=kSxJ5Lv0}o8P9K`N~AqnQn*>1+d)BfIV#Ey?MRAOy_rufs1QCAH_Zn$Rw^vC zvZIc}-D^%Y_h)B#tZ~(17I=(olX#2>aa373V5|FOa5om~+ABgluvm=s@M_Gpp_r~Z zP12TCvWX?$mj5GSAZAr@Ls62z!ymHqgV#UP9(M&{?_F_==8wKs)a=|J zMc`tzjI6G`J+gnh*RU>L$_!A~02I!W@pe=t(U{%?c7A}U-xPbqY~ngcudTiA=Q`t{ z7ja7fS#ucgHa!E(cBqRIOR+H(!zhXD#4-VXttpM7Ja>^Y?!rS;2g*@&Mr&(Oi9Q3~ zROTl)HDl&xETaV^Y9j(iS`k_dG5G=V95tC%rL|w%+%16Fn9r%GtkXYhB;oNZqwHv9 zC1}HTSpTDmXP1h%+j%mGaXBm4I4cvE^b5d8bm9OhMf~vEur=QdWg&x?uoTH zX3H`dXJ1;IsxY0(ipTBW^dNN=>i9W<{H44yxa@&~P?48eH_WyEII}bU^^yV+hC2r> zY9X-bE23FlQeq;ebT$n(9?mW!eR~#+;E0R$ z$Qy8E9i5);Tj{+L4wLx=|IyL;v8b-Bq#2-deZ$JmH&}0$p}{Mz)db(lie7)cVY#Oy zUIv7v*NrX>8Q(WThSIYZ3`kV?dUL{r{cPToBTE+_6Jhifk{hHlrbnB8rVVIK7N4?< zMNPttpQSPq7wr`c9W#ELlub>lVc_tW?GmdDad2HzJ9!OSN#)p_BkP}CEnObpC<;?& zFIJp@ypPZG1~!zHgq_?9&DXbGK2>sbWT0_T{P<7GtgJi_(3ofhDsI&yib%@uiXhi5 zc)_xutt|ssS7q6Cm1|rN8oGJ^m=0T%vaNa!fb0-RS zCWGG@V_JxX^&eag$c>L^4(wnz<9{kmE+-_+JDfzI<3fu{mC;uJN*JqlfQPdVgiiWO zM{yh;F3utd6F@NPFF;E3Q-_xLZ_?;UON(5SZ)yUNUHs!|<#pa+z5KF!Nlnvxp;2aK z%?pFd_YZJ-tY0(1g^z5U^pi+68N6~c$c^KF3D@g^}EX{ZZ{TJuOLNS zJ>+13XhNCYOPo3;w=FuFGiT~QIyfcaA4KTUi4||4H2r}OD6R2F_X}Up#d_) zh7-cU15!$iTgnQrYslyZ3mcyheF|l6c*BmS5-jP7b zH7G8v^{?K#GErXeYh(szY>rxfAv+mFnI-1&`)`k&0~IOXiu0Hzkw{^GOefYLULYSI zDHfuml7?xHBthihc~J>9)p!e3y17$%c3{qh}P~1|zwz(GVtBs?b zYBE>exC7+9?Le(Yfz85se#kNxQ?J6O~Ma#-=%&V!#3BxT9GE=8rAU`W-T z^~{>@j3ZD7<~;y9rapR44*2xlbp9JgXAi zt%3aYaNY31&Trr2(0yW;)%OhVz4}-Xf)ve-;azz*6gGm-xIBIw{25Fq}z#(i@V(QyJLPm?Rj+r9FLH#Gr-ENZ*3f@ z^}S{gOm_M@pX1yk6kdv~79I6h}CPq zY|oX9f9di}!I?$|;Wo{)YUn?zyJL{Ob@q-wd@cG`MIA~W3781v;mCfbyBGVO6>kyi ztMDI zJ>ydKQvsy@@=963=_13dZGEXsV<0wm&aXNT@URj`Pcv#z(*FCBJUldf)UiH%ID%N` z{-vuZr8~c%_V!V&F6XNGGCGv!x+=8eIyO|>L)~OY`;Urt@^@nvB~8sy0Q4OFIUX`? zVBzE(9tHz%#`M&T+YyUtL&zIacmFqJ-thp^&K{HpjzF!8elagEzMZ3$Vo1{PLxL7r!pb8;pVB^xb^}gGY|tvQak68@4Pxso^g;ouBS3dQa&t(_ zIH4%;U1Lx4c_nstGjK9Ny&U+x<~agpvv|=t+NXvm%$}$j@lg;R0YIK~x5-^CduDLB zudfp$1Yr_=D<}wvyg()-BC@cwEd2Tv(n0gk!3f3nQ1babEgc=e3k@6`5t@X;5r?16H99e1Q2vz{A&ps95P&pp{#+ew)fAg>yXsa3z5mddS>F>Wq6#^zR59egtWM(@ayaA-y+ z%O$(bXVmmKwU)f>xjd&SJNj_oC}$DJZ8@W4q6T)(PY{_RDZx6oeN}5rdOV(bVK;Fs zOm9wGh&zdv7`g7JBWOLPSu#ZJX683nr<4`=21m^l=G+)y@|TY~%bh&*fU?F@30>7I zh{%}92IWY6>rp3|JD(g9z_?rY>3q-A?I^OlH+oZGx7lt)x~D27S3BGe752A zHID-~ocrAt;crb-@~RJJa=Dy^`=(1vmXm&T`GgFk$NvR<*U#^2$|=j+^hS!8E&;j) z6?N5l0JK8mlM!A-Kx$DmjR?i+O{i!nR#D|=DpYz|lDBg_INC_u8A5tSpCC*53Q%g0tuZ8<+&jd8xiV00L z2SC={vmp0&YOzGG)(by)2q%ZOu|zt<0&x!6JxLqs&=MDCRhg-~ye8&*CN$Z0CiY^4bONsVtA z5MgB#VP0I}fIICW^04^O$RQ8Zh=I_Fqrbfp=d59ndG1VSxLqZ*-%Rs9vw@$9P*#87 zGuv-_aM(Y57j^aw57Yuc_4|VJdKdQ^zIIyLRTOmQ_xgy~b33_}G-=Ap-SwXv=8??0 zE9i5t1?T?x@Z7<^RH4rhHZ?Xzhm!Ds3xds>bjACU;1{t5uc_AO{P^tq1?4~5GP-kj zzT(f?kBJjYQb=nWtLy1d_Vy=-%-y%oXR`|{qfDS#0_BQhQ)%LPP9@Vf?qyDEg9 zo-#!msQQqT9x-pptJD}AY5Sl0U=IGvHUfqi=jTYgx?l(hc#^NZ;-mPTV@?%dF9OrM z{c{=IikI7-Y49qvIv;@=q)UVT7D)N}U~jkL>`%woxiVxytqb#7$-#jNfmcH=`m%PI zQC(xPe4HEF$BSH-!^UQPyApHk$+tejgBBJ9LT3BEqx+~o0L^7acQ?QI@KCrom5Q3$ z?8@x_%IE26iI*AYcm4SLHV>G9-c$>}h-tDwa`5~`R8?^R2e|u%e=3hp;dQ~c235EJ z?9y(&()o{jwtpc{f@-zTO+*$Z)Rxh~6e<7xp3#)ID?;A1f{6)^0{=N&-;sjCIBXCs zsD(S)*Csrkw$h1CIbW8!F7w9C=K2mU>K6E#C0Sp)Lu39N?0Q;Q%q&K&d8h@Ya#(UT zdk$~g&unZ=*5q`c!{HN>{<`MWJ@`?s0JuTUu8o%?brM{TuNawHnV@)$hEl!@5!Nn! zrul;kE^TghQ^-q#$22P9@_^~@i`UuZ%j4OumNR%B&23XltK6JaaB(1Kle){`H;O7C;bKri8iI(>2UCZmQEy^c>*ZtRoH*ek$z z4#;kSEBVP z&sjbDbWAUBxAj>!H?A)Ll!MvcdS3IRQ;?PY$im&XGq*!RY~yH_k3EF_gYWuUn>dSV zIC+d{&FAbgh#V1{Cu#-AK1fbai3NO#i)KfreP5h({dQfv`N;s0;-U|Q>6_oHZ)qtl zm)8yP^Yb%kAHfRTwl$SY`ap-_6TG`mX06=*!}P1I@b7#eXliU}nFo(iLE#-}Z~pOP z^3%3Ta|S#$W5G-D$;=M0DhM=`Qz!xjxG~G@>iXEZM4Ymc?i7dy8Ed;d z02E*FK3ptE3}d|Pz20GYczXU*BbpwVqFi>1C~^x_^oguAZzFI!%fqezMi)x}Cng#h zw`_kb2}qfQ3G4qZ!_<>a2i5MeeUG=?WyJ|3(qB5ABS0S!8j6!Qan=IL=q@}&E`8|vvhmBUgo8b!nr~J1xa36k_ zwntA5ad$R_ewjyD_10wdT}3`}&eVsD?ERnySJaxeL5+z7@EedFyVBOyv5)gf0@~!b zCzTSJNjGkmqj2YX^PZAifHv1s&K0)M-U_?8kUqth8gZzdt$X0tvOme$$ea{=bvFiV zqik-8#mjXEB~;^4_l1s;9ao&;F-1rg<>F+g(`~^-Bgf(LDm+&nX$w}Hd$cqG@|oQm z&g;1|V&f*G0yO8suTz$GP7Pxac{|o6B-Cb-f6Ib6ZH7O1SoOzwK2#8cx&?n~x9m?X ziQm%z=v((}vKS+RJ%E~;#2E|zD7G+UAbv?sC)wh?WeIZH8!l_HiOJ12PI7W`sVq1W z3_)BtmOvKit<6JG!i`HCp60@H@e!u+n9kb{l#FbKhm(ol9CPx5f|xX7EzVI#n>f(< z?_Pv+P7TbMtD!{myqe8M(1`9Ua26(dsEHeir+9-IFDH@|0sZZ7%(or(s085FD^UG2QZTjV;vK<*1id?fu zqE_k`F|Sb&s*MUi^NzE&WSBG&WGm*Ybf0ICNOnEGd!p;vn!Xrg@$DgliW(FKeZlLV z_G|E_&tuBh4qHwrR8&;J#Wv!-{-F%uAi%NTmV{F&!i!oFwvc*Hn^Z#@rno3d$8-Su4bAb%r7;xMH`em)6x^|p=&j!YCS0O6d-0cZDh;t2H ziiv73gvGQA8xL-uSIEtcbK2*cOP=2=QHPIj`4o*94XmB3!I{PCy-T#E4~D3dwGM@A zf>*{4*FOWsEP$H#o{8xoK_d3@)Xpy}C=BiM=g*m{$XblJTH0D%=YaU``IDl8zH;$O zrAt@AL=0YnjDKvY=f)-XVN4lN(Ug>QV<#=gQ#FkgJ2vD&*#(kX6*U#pS1>BlI~*+} z=wgd$t!aTgXh?_K>5#eB8QI^cpr-w)^NGyy7WjI?*Uzb}fGMY>r>CHrBD@ROJ+w(k z4Wm`w6Ip&7*>(|ym{}8=pJk;qk!WZJv2k#=A&!bbysHEjwjCrsP@t<;E>StlK|l`|o-l!@SR!UIP7|YhT&7?pBvPt`c^gU0jS>)|S}1 zA(82_roIm`|t03dnNL`fnuW9n%RgY<70-bhK*WeWF+Lj|Avm7KdYz&H?*dMx06^54Lm~b zuH+91gN8sOnh-|n9v}1uO;J;+yyjiX#fpvV&Dq+tz_ZzFvfnG-Yp&m=U2?M**fdz! z*oc)O+esxt9I@-nZb?Z6&hZrluGtj$U*O_$+@p7gzpmYasrt2hGFH$!7o5pPYZg^x~qpmp0F7b(UX^ zj7`*vteF|zFd5fWQ5Z z?Ah5(c`t3EsYF9dE33A%?nn2#f+FBwZ`iOeo=9xWGJ?2TTNGUQ^ozgCQ`gvc@xGw7=*!Q@}Cqe&*z5V8FoqIyhguCv%KP~C?@r2Jmu>Ji;RMjHux^?c_;3ildYaSzlUMJ3BRYf*Mu{lS1<2_j;;L+v%KwD z39|j(fS^yOVpe11h>=!JL^+xpm5N*ku}4sfkE<8;S@U^02F})SW%D3e_RT*tv}yiF z#;xZmxBLDx@3b@T10HYn=SrXMtXmzd3nF1fiQMC3OKxtS<+g^f)KpwzG>MyTH7=nT zi$yRpInm|qChQIa&ZKzl5*20qsPSKSzHA=9T!v?LDcYoe?#oeWx;tS44-{m67tFe~ zE%^+-jH~g*3^8 zz^`{26yN)^*ImEAL1ZufpeO$K9$bPTT8TdbeFJx&1fGwk?@mt4;6#L|bAmy`R8bKL z+yuEh+AS<>zGrgkOivF3|BID{?^t>si4qFg`JfA}Ojo&hXaBMzHZ(L0(29wv$@A6U zwdYBBFTqX+(MyguoQ}Vi(qsH! zyFwUTGY3j77Z;ahVpr!vIGAEq0+8m=&;YywCa{pg05K3Sqsq=K$*`2Mf~mIIb9hta zF%aQ2G@LOaME@j0jmYi)FlFrY(LoIP?JlHPG-As;G&*vOsPWf!v%gN`EfC_5r!fKW zUqsb}hKcu;7kshQ-xcF~9v{ih$Ms$lfhZ3191aEsM3DTm^0`d&{SKs$PMbcre4uPP zav*uc*nPwYm877cE+8}%fmkfoS`z@=gfaC$we(FqLKGq4(+5V*Um~tKfpZ#tHN@%J zSD;Kj=YRa+Xa)4RL4a266oio#c6E_RCD)f>HnH3V38k)&-}$_(l`=kd7Fg`r-M$t4 zhqSZhs=iA~N&?DYAe3+fzTBIBuRi>IE|I{%+X-kcrt~^{L!$7w{I+3$Yu&$qp?|_Y z6ujg!@K97v6pR;Rx$7<4Gu0GO+cs?fsgtwtjcg5K^(7;i|0`p)VxTK({kT|_U$3ln z-OQLINqz3w2@c_OIaAQmmqTg=F_*N*#Hf^phKKL(cH=bdKg7%0Fs+VGQutlz)`oXr zK(6)HjvaHMWAiPBQh3NKas3JQ%^MSMR|!H=Lm?5)&dz^NMw39Bvnwkr`!`PD9;r+| z&(Om|lk1emOtNeqcKSg#~T&`fCO3q9CiHf$luhL%Re62hzr`=1=aBhtOL6a>*KaS;*^n@Vd!bfP2}yO zudlyGHhXZ1fgB=9?KDNF{N7|Qhd9sJ&>N;@O^z~`JVh1*5z>A9%hVKnCIdUn`!odq z7Bq2Tb>|?|{udIwaPizx6s^xHKv%u2on37`yD5w5oH#Gb>-v(r=ms$#{7N)}oSq zlTtG?Kt}+Q`Up|Vtk}>(OR#>2!&f9)Kez-aykyxN+!HkJuU{D%xj=$Xn;XtxgZK6$ z0FMU-;Ks)pzzr8G3)q=m1a@K|N_zbSsJiUsax-KRYTZ(nbiHE059;j&%Lb3z-13j) zCOULc3^NDjuy5dBQjvKUn0`no{GBV@#%PE?} zc(|+4QqO5q*6Y44$U-hCYFeMA0iEyM9VTsj5a6o-tNG-&&1*KDx3MTOX3X+Bdg=q?ijPuWsr?pWOK%zOLKW`s1((wd2d2lsC$+w_zTWm#9b3#fF;<0p5P00#Y$)hNHRTZf z(3~Z#@-yX8ENzdMq}9;5u5WA|`1|)GfN}r>XXhNhTqRNwGV$XIJ18g!?5V!(xnd!Q zEUxfDs2XHHqU!@Y*9Nm`7XETkuLRY+&~oF*loXSi8@>JGg-UQNymwBbK!3}^&oLE( zasb{w3e1SFE;!-ChK!7@haKJ-0RdL->Rl@Y5sV_-Ie=9U;AI@p{{z8KDJ>o7$*1VO zP!Xt1qckJTTE6vy2lu@6z~%SCo9F$21U_uASBzKk5Jm@CzO3h>fh8qkscC6vibPvn zpec}YK*HI_i6jx!I^QZi;WnjU`Uj2fTeWZQqD0!D%8rd^JF=W(^4|Srma9yi!jb8Od-7 z#JcW&JCY&W%n|4bkwS+nvDs^?ra~+%j6%mQss4;cQ8_cgSJv1Ai5$z1A6_pcw&XWX+y;S@Dt!O-1?g1peN)oymFlq2u1x$yw#Z+ zy422-cxe(2or@>xN^ax`{Y*=tO{l14p@ZPb6gUglUv%aQ=U~`t_{u{GW50dzvssK#a%Yvas^ahR3HD{`!%<`M{@1R zVpk?ilnzEn`LZN{U4q!xqC4Lc^Wjt1%ON7Wzu=HI$qC#I1s2@*JFUXINMK?s8*mA0UBEe3uddGEG09=K<+~BNMaRLH6=Bz&{^Y&_XqVB zRy`b*XG8lF29;ifi)lW)W+-PksZ!4$ivCLC5|xMv-J|5K$ZtR(^VP-unHO|PQh*5z z6a`i8*c%Z-cKXAyBtKLZ6ajDtvLgBTI+Cl|rG8$NjC(&Em37{3dbNC~(?`39`FR9Z z1wTIAHN*G5KKngy)i*3h=+@HZNLTJ@5Mc>|Fb*y&$`&-uIjiYCzAT%4uP4SG@DwDU+(3(*+Kv|7znW@DcsHG;PNRno`f~}^*u#;(Z ztZC2Q+kf?gO}$pv#NHk~ZCvbAg|*kQGxv!ak=*1YNIPk;TKW%6oH*MhsWjRb>?TTY zi;Y#k)lBl-(nyej&PsfQwt_FaQuKv&HO<<~hBK%0W|b|c$);j~*-gl+C;#+vYw4ST zSNSbxySlwV&(kVvAUS%BD2QDx>gma=n^gi51m;Xx-t%QFFkBD*Kb6x)=L4V}8SzawfG4AtiYlWp)!!L%UPc-7;WLBZi-#fqP%^wBCQiE;&B(n9jY)cG;HMkSfu$tI7z%h3m~w)Uc56cL!T4H0u7 zm-DZNkAB{FIF#Q4Uh|6DudrKFGm<_gSb8{D@3X==i$rS8;yM2qUI+qK9)$H-^; zD?JR+Hnz%hv2*WV%&dxTIE-4!oD!6D{g5x3lNqP#sj8=UcABXY zoOA!IRxQj*z%`zAFZ^D8$-5wJTyzTJohB!-*lf0N=HV;|)iD|RU0;8tq3{0kpv`li zo~j5i(hcNuc}D@oTEAswMhX*Xm@-y05fBhGw6yy69hpC|rN_W}@HlG((n4v0+j_J{ z4ppOblr}s}hfhji3K|lM*34P%a+%oFwxL<-c29x0&EM&?0vUZ?Ym#Ond#k>D$g6%L z>&L7ix5#5m;V@_&K{{TZ00K3z7?s;f;pcz&D*`ylg5>!5O>HUvJUhTz*7a;91`-Z} zPCyVwDk^F!PCikJkcffig&mG_>ysmHb4ZnI~dog5aU{dVa1#V^#BmTD-~UBQ}tN7$?Cz zmyw>S56+V-n?^$%+gr?^WG^pd#x#h7pLA>SsyAw7N|@?CAQt9l2OJ*${P{iTWVtQ~ zXg_p4k7zc1&UBu91wb&%KS%-?&A zeAj38)!*-cT2!5Vk!o*UCae6u4Lb(1cP;b>8hnb)Nqs zS{V`Cdiuo)G~ZA_UzE-55?KknW!TxpK4MSAO18jSy|Ho8@(w!M`pwp(6Hgrh(7e^P zH2~K$NsxXD)Ga$0e*J5t>vPIZnSjWh^Iu0Xlt~0ej2Kc_pWA@rwK%+g`oRK2^+VPV zQ>{V><D?=6;=FLg)!=iXbcD*BtGxXM&hGMKO&T%JXuJdAy0mQ7-vi=a(5jM|T zLzRO9_`vyu^0fWG!hj7`u7aE+FJWQv{=+eg36Oq)Z8=aQa&*MpG@m%=FWd-Jx>uVLz%C zZOSM8YiVu1*OoMWo^$3KCi3RpHlrhWFCa_|2j|12OK`ooLqsj8ZH1P>*!2h!Ym=S! zKkjz~|5LHv7g0QYe{tNjQpAZsBWE*IGQ&;gDAa*XII}Lf_T(y5l76A1+_%Yq{)463 zYMK`j#xo~2^1=~~_){-{MGn9QtgO5ZsiQx3{>b>YW@E_>(a|em*cw8$K6zihB?}gg zin9JoY1*`IS9kJ4S&Li5)%Q6#Ft;qp8Kc*-W$>a(eSmAJvbP6(g!ayd$;yhlV2i#Z z2HLm4_i9%0pEL?OH~s*ZT#u4J{~J=v z2v9rH?LAhyqvPW~%O-D982!_)g^+x)N!KcIk8B#<_!SiidBw#sywnQKjO z@#{Uw8hsdRi(0mk2fS_S4E`=k<^_AZ*oF zn&CCMxa6fljR+Y@YA$m3$KYDPj@Nsk*6$2B6rp`Rf?}z6q<**&mQomHHRJxG5n2sC z&$L!`a`VSKZA3av7t%~g>hPgLcXf3x;0nR?dTg@kzUyN8eAtIZQ5!o|4vy5!AXST98*`Ck&J^kg?Nsjxz&V5~<_p~s_fA(5i z91qC<$>JIt%6F|%zs);MIYF%ypU*?mTW?{@`v|BXAn`YkK~Ay7)4_MkB^EcX`)$8@ zhb1SN=*vH{Y#xjZb0y0o+Au~7s)sDw%_~=X%xfVrGiJ0L0r+Es?Xnl&7H+X-N7I>9 zRh|AM^Y$gi>}eP|8c$8Dc@-}yHe#A#5b8=6emt(fU99bWPNuw=H6v zAD7@@T&3_bIx*}l@(6mC*a^tAzT!2h{U6yse_M6VwWuR@l?>ihn~M4`3jXGE0^J1x zlVIjv+Bg{!Jywy+g%<|i+dQTE4L`TGm>;m|uRH)I^?{)e{-WV!cT03$ZXPKqxska! zhPvoBglKHdHA#n|yx4gYk^eIna%=kr`XERC!(3(_^x6-{4sQvl#nQsu1GX}FX$exN z?CgHp@N$WW48Rklz!WRAP5j?L+UOYMAoEBvkY|AupuS#!4#P|5ZV_F+A`^&p$jHd3 zh%_6EArcDG0U(U5%d0UGIWse}b8|}wq?!Lk{s&`JGP2*eoCcDNr3T=5vc9?5mYrf} z5L)vLtw|9$Z933?e*qj+I_f_y>;MBl1P_`j^DRS3(=KNv!%y8)HvlN2^#m zrYyRX2hqO7#Kb^ls;TP5RJ5SwJz)$s|o;h{qadJoiF z+$%)~cGfH>oN(fmh2!`G%8jXiAkvYNmP%mY-rk19KB73Sgc~4@++!CWAomLoC}A8Y5%k=L$c;@czsQ;Gxti|n?ZC{(7_V*r7Ub24 zV1F4|hn=XPpx}oM@3PZ3Z36@PWcgQLwIOO+{7LWYzXL%_a}DqPPdabp5uy?_2wjVY zHbuC40y3T6yG@5NOb0h%HO+lKCo3xu=-a^X16ib+ z^J8)v)hApvO`V^}#A6EI6?~-24+^&?tF50!k^8^Z*kxi(lH>QcWmg9F2kP6B{Lkb{ z^|sqKk0B&$@^@uwna~+AED1Pb!jQW+Ah=szRri*;%V*o#a2cjOngXw*HE1DBXWoUn7 z-z?5dvfO;J^EZqz%A{6M+Wam5L+)Dcf99nRV<`o{16+1jDk!`;8%kPFZ9Fb)z!T{ z7ffM$q6?t21O#Sr-wPmEq>3gxJNqs5=b4=@l~~#>-qpssw#CeX0w5;h`;P!1~me{KDa6nM|82;(${xal;I79yc^56*22VL^Z;h`yU3#})& z{NaQ?@ZHuC0F8eT@!&iTEER33mM;oK-M4%jXDD{(CpGkzFx{+gYQ_-$@s z?3a$r?dg7!;c&d6(Hg^UM!Y&YF|q8x2S-nEF?=BBZ*^}ze4H-m8H>!-{FQUAOh^ae z^{{Z)j=YA~u|FGOX3Xb(P-MiG5~hET-((O~>_wfPmS*PkTD72#nM;_ff3FL3v3zL{ z=wHybtjni3NQ6m)rHa@DGqa`TzrjL_7xP}V*a(EV=_8}t-6dN=HX^%tXkgiTDJhA5 zjB^aJG4KSvhQQL)^78K;y$|@kugTxPm*d-V13n0!HYWKSLPYR_3`tx7AP@NU@UKZR z1y>&2h8KvQ{sAYjBqB$?YU>GYAc^C;!FbJ17AZ^0rowL_3dmvby$2r0)mom*kk0kP*>MnaAR}cx#UNh zIQP2PCos+d#d|f@5Z*X6wAk?0MzH%`}#K&7Lv4KqsYU4RK_9Zy~?4TdB?fsVqW;;MLLevtcExe}6lxG%Ja0vMeHr+5f;5JYc0_CwTkC7&>BoMdQlkoKNYW_x8^sHM6w!ZH+yd$%tea*fXpyh#O=zM-e z2Gn=vCl@(dLikoFdi%!f5D6G4?8`s`n{epjsc*Z$u-^HBVpSLHDYx$nz3I18E2h%$ zdbi#Vh8V44Bt#F9`0Pq{wOWOoWnr=ii<^~yGP$ak=LuRK>p4k#UQOZ8l~sfM3q_8(w=1Gs{*^>JRYY_yFCG<) zG+s|{_6@S_^*k+OXJ?PbVWBG$2XQoQlk^f$7k#h=NfjAhVM(ij8_pZcV^V3j-OWsJeO0(ih5}$ zXQ7s>g&r)5w=iApH|KR>J9pkc6Y(K(s4hF;LHZ3nG*-7SGEm2j=f1(pdsj$So;i(f z%1K6|cTaDpp%3&L$Y|#Io3oa`@Ci3HGJ11!EDGfB1>jWQJkF>;J1{(Yp-5OkpM4i9 zAciby@uLW_nXFwAny;{rj*mG61X>%d0|FMQAb$gFV^gIxMMAkaxR8em8tc*{eJYYD zHGMS&6%`dtOCJgb@g*-3sr^vi`7Shf`9RRCc(Ve&XHGHoeW3pKNeO@H=w% z?-XqD3_bhCugchA-^44MJ7RTtjbdW53?nHQKZiIaUY~$5yKY}kK7)*QUk`8Ml3r;MQ>$H&S0dEvNVIYfPsaz0-!8{-_A^7MB zLwM+AJam}6`ThaYtsrRzsW1WlQnSebdS};K+#)5Do(`HNQg1!Ry#t8=e1de##;)zj6ONZr-v;pgw(ENdEw@;joL^E*@^(SQGC^l_p(JPXLFNFu>fft043 zSI5XOVs!!UiH*^ghKRK#d^m4V>|qut|1y(#jg@NAPeN)7q=ooWEQQ>~?pl7;W_YUcu`xF{B;u2?15&5! z2-^f*2Oaz%HT4zK?xyzER#XrN6?+Itn5dW{27cnOr}p(2)Ek6$+hhT250Ew7OE@X5 zj3|lxSamXn(cVn}mL&)z*S9v1lQ)P=*oB1pLjUu9N4xH^a7{z*zrqI`2kk3a7s`g; zQu@A+LHi^tKu70NRlDpkDMP0Qr3hcWC+ysgkJ$P7JD!$ZrT|xnMwSe@6G*XR$Gr!h zH$nftc^!kBBeryaRaQ=Rzohg41Obo{ta5aV_mNve5UiT|`Ua$kv4Yw8ypIeSlmUWY zf#C7qfehiGu>yz}a<#J>i^)}pU?Uk^n_T-_h{pVsB|Ez*=)=k8(_6ufnK@^$k9OPe z-sI)1(rIe>wwuU)WP>y2*UFF6^*TZn_uJaq;IzO%p{y?D(vbAc<&3~$Fb#m^Xk~T@ z^)c;7ky7ySBqSsRjdl#3M#zs6zPEY?cyxI$75*}_SzIrxIltnOzci9EG-p}uL zRxTME|B$4QgNXwytN>arW#3OIDFrMC9+LENVLwBpKn4c01U3%NqK*UH(B$;w0XsI& zCWAzh2Qsv=q&OkPpTi^MVbpVa6>G$v?UQ%rW2#7SoP-6J$t~aXXN2Q3X2@# z`W#qTosN4nM9xoX&hMO$ZOfR27;`_wlMK@+(;}ms^Uo+)FBo)%!gcAqh=-HB3-{R} z$p?8@`DjR)_^w2E__q~AX@Pv~q~>H33k5tVA6Y&s^hEH-shD%b(lSnbl2qhRmt~-; zi^KX#C({a64;6#Y+FoJLd9#Wz5Rqt`hZixc*sEr%+9l&WYI!aK{Tmxhkkp(lem4_> z#P-g7iqAEny8smPVB&D#BR}=UYD?{-C&vwy)uR&R88GF9?U>Fdep=;NK$wn>4$=qV zC|6PJvZlnHG5MSEy3>#4=V@02Zf?kVvrvy}eb_YS>rpfoK4mj7E|X}6q+ZLOZ61$< z^9cB$j#pF*_ZJQ?UeXfEk~a*i_L)m+e@jZh?7(ffomc4*iK_j-sQjX44LX}CjBVFi z%KXGwsUZC9q5Mzjgc7JfG9Oa@+quI@d?17>d^M^D%IuYp5HT3XvVXkv^%V}iPmx>q zc3>IQOzs^Y4dn`7zqwXh|uWjODI=7ziN=l#092MTPWyb4UY}$jht1N zd9MFysa@Y~+?^8Qd4juPkC^$XlF^@N7+lPVJ?6zEv$96_?(BY1mCAbfxL?YWl5=#*Nq<~jmZvGJlM+mD}|J`H4`XwM6AX}qRR&e_Go<{)uG81 z34EjZ_jpn1W<_aA#c*)`=5*KdOsfU%W-v&SuE$zVlQ2vAODb}|Nz+{mtndsx4$7<# zqGxNdT}d_DiOl?#GFPtQ6m2H?sL9G;M&Zf)on{^0152jxp7Bo@;@d}4Dq1DZ&Cy-L z#hA+d5&Wrc6u0l{cvN3b)L2g79I`cL-0UcbWb13a?fdCTOg%GIH&-dUI+0+4qmD{U zeG@x9g(c`qC0rS3cU$MLiCnX~O4t41=rM#QHwhgcCf@s}a=1YoL`MaA=}S`<>A%%c z0G<2rSoo*mWryLf>ETwxoBsK|k<&@ET0(%$yyHUbtiWpV;5XkK?|xL?@~GelJ#4 ztc3GSVjQdNYK+v7Ci>F@Q|jKjm2=ONt41-BU{9jl%KfHearz1~qWFb`=}|-VwzpQ^ zemVj=!Uu;F(fv>3RA?@3suV7783~^qS110Rf8Nx z#?!&8+AjuMISaYRc5+7ez5b-f;A5?24#{>KBE0RMMfI;oD-F)tBM3bi%v9%m`*3auxB&?}5DaC9Ctr3t|e+CMz{YXyTr- z^ku$>263y6PAl1a2*ep%C)%SV1#cy9{ef|GjV$8Ew&{ZvLsi56gtTg_vbO1j{%PF} zNxDYFhr9O-yEFxR-)v^+tL3_K>!c2(+*=WDQ4u(szn3wjd|IqiYa?*>t0&_oA_O)4 zX`i2h&ZeCm8c$At`V@N{D&`7WSK^?hD3Qp-x{G!R2>_$Own5+=HEfTdSAv}bFcBnw zxj)+->59UC%OQUECiLce`fu+#;Ot(!2m%oqJcLjFolr+$V*`cUE3c>oJ%~;a4cIY6 z`%&{{iJDmsd0|yQRz+ma7mV$z=Zr<`Xjq3Vm#G;ci67`~tLM)c$ng{06F9@C7}t-b z16y4f@@Y1XI0PRtzLXwq&5Y@6VzMvpmP-wJEkwgm`4uNa+>G4zs4oM@>RAQ1D$%#p zF=FN3vVQ7{vIi?vO!a|*PF-E^EU9Xpj9V+ttOtv@h_};2TvrEsE6a;@e7WoM8Q)B& zrw#=KUOto6jf+0>TusvW_57nPzZ!mw%Ctbne@@Z(UHu=NU)X%eP@pHYEh*s(4@ag` zogZ1T>eYQ;_(fS7jGmIJYbS={lacmYxbYay2z!g6r@kT^8ylw^6U`xef2{3$z!qiv z>echG=ar@9)>QdD;GW3d!p$chAJ3f#%599*ux?_Z%1;w6i?f_KEVF7Lnm*og*8NPm z{fMbW6T3v-b5-S`p0D<@Fak%lFp;BWr=pm-n!Bj3wf?mkp>o#1%h)fY2(#C=Rx$Iq z!L}dGWUGr2e>8i)+SM1^VRRB>MPNPk|aY4{=rfMO_MvZ^UW*6cn1-6RU(=3Z0=>zxPi)1@3TgZ4VQe_!%OU9)ir0>d2P!qL!uqZub8} zI5n)VS^o6~+fu9lwdhTy5FcOH>Dz}7OQfdDE(U)r64Ih>6?7ctczbIxu?mKT1*|H;a{YKCK z)TyTBFt|sLC5O2Q&P1WT%u7%VkYz#$=VvvQ!G$tMAktUEi{{jNpRBm@ZVQj%MiXmJ zH(g2*qPf ztJs7s*6%H1r_XLS=DP^v2$3xGGtn{)mdzC4>&7)JbR1Qz&X~tJ)#hBa2|cC6S$Vc^ zPz|*2*qZhyytR3;@`8i8o2_%Y@!&Il6T8N?&Z3~KJ}*<}cvn*%XRg}|tY?|J<#uiH*u*o_@3V8?h|rc zHC4@?AZZG*(a-EVM^AMX>Dpie$Sm{xei|l>?{)e|RIjW|k*XiA+Kn%V+ z8@U*~ExS|OfX06-ySOyoKmW|O?5B0`XwvC+>xsah zI$9)i3~y>&hD5A)x)1(x-0pJqxOGeX7}w`XjN!hI@gALDQn_0ue(4Oyv(`UBW9CAx zhg{JtnItC5v9qM(8TgIM45VqhF0^B|&tr0*y%Tm0CH>)9AbEk%hvxhE>4 z_qbSqW=+Z4(QStAzmzEBueiEBYd>?_eps8iuN-T5-T!D)&L`}+YdNjhrn~<`HzAsJ z=5)R3itc^7N`2Or&P>;;N9*~zCc>ZZ`Galha3JY)$z*$Y$=p2dTh6);#k31XwC~Zl zhn@cJPz^4SPmm86^y7^|nc<=C#mm<#NrU%l6P*`l_@CQ-VW(1Jn#Tb@jAGu4j0YWm zbaJmyVVUWr;2}}WQpsRP*A{WaNo^!_h)Om@SbY17lj*aa?^Y@W$pcM%S`$T zSDxN1YJcZ>K}ptPWAkQqq$43wuWp`|r&Zda8`d2ey!_()%!bORo3fj|%7}lQ2N?Hx zNdLMD?%BS1^Xh9p!+|}k=(^Z$z|G3xMMZ!(pfz>7d%nmP1}G>Po*P%(4KUbgx$y%( zzNL-L7tl-3T{V#^NC6myFbtgDGA_b@I%7O~ahCQj@I&>Gv~s`O;Ybo~7>xHRsVP>I zLvM;hN`|+l4iCHixSvoz$}Gq3QGLO4t$McvU1{BNH#4_hYX3v(%i?aew&^3@3?8dN zGHi^UmR(FGkuzF-{og>9G!_|*5l<$aW*J}T4q|ar(>f}sWJ(Ri(b>Xev} z2zC;qUyr)JaFHs6Z0=lNM^4*dYPL8H&*ekUBKfbHSnDe*WdVJKVp zaff1My-cY8dhQA+UB;aZ8f36-Y`zDl@5&_2CyygEu>1o4Pa*9035lOTO)4KzF2HTs z(oqLnm4i+YqJeuvu>f4&GVH{lHz7Q&$&G1fzzSV*;QN@8^2*LG z-BdM<2V7$Ozr5c7*_Rkf;q&fx(;Xlvla_MEcWLl2O$D=tjMM`?M7#pw#~?j1HoSL! z7`?Gnk156o3h?#*x8MJuxqG7J+O@vE9_h;u566Q04bd;qI3gk5Zl~5rE9!p0Pr-M9 z;(fC9IjbTZL}q+M(1~Cw=zr6hEX)*1EqZ*v<&kxss3#$WEUuprGKeL{4uisFO+ z)y*qC4sD4ZYik=5CG@vASi9XqgX+%(3YngMor+(mn?}*p)t6In#i{101}+_nFp`=y z4YibPZMVH{0euWfSn?4{<&BLIW3N|18+CMa^lN^85Pn^$8!=JXK_PDuOa=@rEUQIN zT6zxWJ<>m%oD{bOoYc6*-tD++CPdL`$_~bzpI=QnJ>V_@-YK3a&bAI@B6=oV{?I6q zKH%|W5He(|#H&XXYdH-KkK%^jcD&9ht|H1%a#Ulrh%X;ST7$u7rmE8lL8n}mm9zvs z@!yK8B9M3QxXeE-ahya}t_RpTqkrl8aE1nJu)KO&71_7(J518E6(Nhu5W5yh9{7X5Ixa~ zP?wN#0%^HlzPtq++;C-4DAYEa z_2{Z74wh0peE29HZ@EIAf&7(=O+4K{0v;Y7ZeDJu{Z@35>lKsM#d1ysR>mK%HI}CD z1l|H6W@UgVJb^gYj>y-9k&Kr>8U@*^kgumCzo54pd^m1xY;Fu~x=dBq{86Z_tNW`S| zK;+w(klrVco2!3kN27UQ?-tX@uc@tdUioohWoZKxyHTZ1K}kVwQ%NKMXtX?b#(<8( zW(0p{V&f74MM0pib!tA0V%yh6vE|J?#f%;!jDA=~lC@V4XkQ#XDJG}jv);=~a$uO3 zo#xGcKA{H^DRTpKB#&biLlyJ1mh8fN>}B$_u4RY4ZoQcvQW1PxgO2GLR;b8mdc2km z$sJt?h#!NdHNr3{z_pNd^blq+F}3dz(INSOB8s4N(uNZmypm7^VBb0?q*5S6&r(FI z63om_qGf6K&wL@_x`U;rBi0o`UwDfggn>vgMqM3gnxcvn6LFvmy@HfxU?eLWTjhps zhb24Y6IQgg8nOR^FbR_<6eja?O_SSh;LqkQimW)`B$t#7{}p5AQzSw{Lh?=`8*Cav z2KRx$g~#C6`a-mtc-p%Sze7MXOe+JToL57D>{Ea}r^4DxLCMISp|tn+4jq*0b-#7W zk}I3Yj&nlYmh&0<>NY`HyV~gHR*r8v_M&{^FUaM<@WTjf{MzpB-=p=BPonLmOS%ERLm4r*#bHe4yUX@2|N`$^P2U7K6VI<7(wHr4^GE=%Sf zz+RKs^y!JP0l8<_W$r56y#Pp&K8*@r3At>)SKoq2hS1%Hs3z|dWgXS$U?_mYP|nw{ zfb5;-;GLHIka}+9t?LOLaZ#P1@Pr_rp3_r4&9b|-iWG)$DYX-JF--rWmc|Fc&g9xhPFZi{ zCsnW6C;5F6D?yl4<#U<@`IvW|`xm#F%b2+!jHI`^YdAJ_y}$}|5%DM#VWfU71bzQ& zClwvs+A8LB)w-IO&Q_sgQsoTu?v4b%4kp8f7Q^$k zwr8S#HS&svhY2G#Ug?aoOlWy64%&fTe}<2=sQvfZGGqA_i$W5XcF)CnvHJoERL(m zeik16TG zu!vYOVi#L|fqrH0E1z4uQJib_PBiSrdnx08UZ6;Ox6XkgR%>A*kZiW7c-52GCdQC9s@K&Ib+!{JpYGn4XuL>C z+%>$Fz^JZ4d{^A*8#%W^+xm>!$K0^tDKh#vjzb-~MEOvoWO=g4Md*At*t_?ff0zdl>OHu-lAOAp-hId-SuRRW5JNd4>Dv;UHqo)l z7q~sA(1%(`dM5nn$tEkRLWtVwn*QyinJ$#g4ZJ@)i-P&&uD=&dy?QU8`N9 Y$^7BOZIlYPK!HCpl8O?g&y52A4>sWlssI20 literal 0 HcmV?d00001 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 fb3c52f6e..922a113cd 100644 --- a/FF1Blazorizer/wwwroot/presets/Beginner.json +++ b/FF1Blazorizer/wwwroot/presets/Beginner.json @@ -287,7 +287,7 @@ "NPCSwatter": true, "BattleMagicMenuWrapAround": true, "InventoryAutosort": true, - "AutoRetargeting": false, + "AutoRetargeting": false, "EnemyStatusAttackBug": true, "ImproveTurnOrderRandomization": true, "FixHitChanceCap": true, @@ -427,7 +427,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 4d3c323de..9c751332d 100644 --- a/FF1Blazorizer/wwwroot/presets/Chaos_Rush.json +++ b/FF1Blazorizer/wwwroot/presets/Chaos_Rush.json @@ -427,7 +427,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 a871c6053..f32d4c22e 100644 --- a/FF1Blazorizer/wwwroot/presets/Deep_Dungeon.json +++ b/FF1Blazorizer/wwwroot/presets/Deep_Dungeon.json @@ -427,7 +427,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 f3a24cab8..457cd7b4e 100644 --- a/FF1Blazorizer/wwwroot/presets/Entrance_Floor_Shuffle.json +++ b/FF1Blazorizer/wwwroot/presets/Entrance_Floor_Shuffle.json @@ -427,7 +427,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 3ebc330f9..c3a3f076b 100644 --- a/FF1Blazorizer/wwwroot/presets/Floaterless.json +++ b/FF1Blazorizer/wwwroot/presets/Floaterless.json @@ -427,7 +427,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 f73737053..ac1e9f383 100644 --- a/FF1Blazorizer/wwwroot/presets/Free_Enterprise.json +++ b/FF1Blazorizer/wwwroot/presets/Free_Enterprise.json @@ -427,7 +427,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 bd12faed2..ef34ec851 100644 --- a/FF1Blazorizer/wwwroot/presets/Hidden_Chaos.json +++ b/FF1Blazorizer/wwwroot/presets/Hidden_Chaos.json @@ -427,7 +427,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 8453bb9ca..a677d189a 100644 --- a/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json +++ b/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json @@ -427,7 +427,8 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitRate": false, + "ThiefHitBuff": 2, + "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": false, "FreeTail": false, diff --git a/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json b/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json index a0ce08fa8..5d1e351e8 100644 --- a/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json +++ b/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json @@ -427,7 +427,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 615afa5be..cbe06960d 100644 --- a/FF1Blazorizer/wwwroot/presets/Maximum_Troll.json +++ b/FF1Blazorizer/wwwroot/presets/Maximum_Troll.json @@ -398,7 +398,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 a3adf286f..b1b4cd7ef 100644 --- a/FF1Blazorizer/wwwroot/presets/NOverworld.json +++ b/FF1Blazorizer/wwwroot/presets/NOverworld.json @@ -427,7 +427,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 764d33aa5..3e2d5132a 100644 --- a/FF1Blazorizer/wwwroot/presets/Oops_All_Loose.json +++ b/FF1Blazorizer/wwwroot/presets/Oops_All_Loose.json @@ -427,7 +427,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 8e0337ff3..1306d0391 100644 --- a/FF1Blazorizer/wwwroot/presets/Over_Randomizer.json +++ b/FF1Blazorizer/wwwroot/presets/Over_Randomizer.json @@ -427,7 +427,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 c8e15c5ee..bd737d92c 100644 --- a/FF1Blazorizer/wwwroot/presets/Procgen_Overworld.json +++ b/FF1Blazorizer/wwwroot/presets/Procgen_Overworld.json @@ -427,7 +427,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 d80963572..13be2dcd3 100644 --- a/FF1Blazorizer/wwwroot/presets/Shard_Hunt.json +++ b/FF1Blazorizer/wwwroot/presets/Shard_Hunt.json @@ -427,7 +427,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 bd936c424..95db3c46e 100644 --- a/FF1Blazorizer/wwwroot/presets/Winter_Tournament_2024.json +++ b/FF1Blazorizer/wwwroot/presets/Winter_Tournament_2024.json @@ -427,7 +427,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 7de4e9945..922a113cd 100644 --- a/FF1Blazorizer/wwwroot/presets/default.json +++ b/FF1Blazorizer/wwwroot/presets/default.json @@ -427,7 +427,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 f12752e66..66f89cb48 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025finals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025finals.json @@ -1,531 +1,532 @@ { "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, - "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, + "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, + "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 8e58024ba..0b3e8d90d 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json @@ -1,531 +1,532 @@ { "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, - "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, + "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, + "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 7430f40e5..7ca0d3cda 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025quals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025quals.json @@ -1,531 +1,532 @@ { "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, - "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, + "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, + "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 76a67ab3e..8e78378d3 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r16.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r16.json @@ -1,531 +1,532 @@ { "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, - "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, + "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, + "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 f0f171103..52392b5b7 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r32.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r32.json @@ -1,531 +1,532 @@ { "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, - "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, + "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, + "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 b39a75ac7..922c5d45d 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r64.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r64.json @@ -1,531 +1,532 @@ { "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, - "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, + "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, + "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 e1e906bde..dce57bec7 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r8.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r8.json @@ -1,531 +1,532 @@ { "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, - "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, + "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, + "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 c42b94df7..e503cff32 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json @@ -1,531 +1,532 @@ { "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, - "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, + "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, + "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 6412e2a32..7d4944414 100644 --- a/FF1Blazorizer/wwwroot/tooltips/tooltips.json +++ b/FF1Blazorizer/wwwroot/tooltips/tooltips.json @@ -1625,10 +1625,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", 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/Flags/Flags.cs b/FF1Lib/Flags/Flags.cs index edce82a3d..61fe0149f 100644 --- a/FF1Lib/Flags/Flags.cs +++ b/FF1Lib/Flags/Flags.cs @@ -385,6 +385,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; @@ -594,7 +596,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; diff --git a/FF1Lib/Randomize.cs b/FF1Lib/Randomize.cs index a2d6101ca..9473ff006 100644 --- a/FF1Lib/Randomize.cs +++ b/FF1Lib/Randomize.cs @@ -351,6 +351,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); From 21a3ecaf5f0205b98368022e05d9a17e489107ea Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Tue, 24 Jun 2025 14:25:02 -0400 Subject: [PATCH 30/61] fix infinite loop in shop shuffling --- FF1Lib/Shops.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) 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()) From 51db81a0dc4aa05e7bb15b0a34176292c0aa5077 Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Wed, 2 Jul 2025 19:16:41 -0400 Subject: [PATCH 31/61] Fix short tofr + no fiends stair loop --- FF1Lib/TempleOfFiends.cs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/FF1Lib/TempleOfFiends.cs b/FF1Lib/TempleOfFiends.cs index b3f872550..c40fe46a6 100644 --- a/FF1Lib/TempleOfFiends.cs +++ b/FF1Lib/TempleOfFiends.cs @@ -223,7 +223,7 @@ private void ShortenToFR(StandardMaps maps, Flags flags, Teleporters teleporters // Roll 1d2 to see which side (left/right) will have the single buffed fiend. bool flipLopsided = Rng.Between(rng, 0, 1) > 0; - switch(fiend) + switch (fiend) { case 0: buffedFiend = 0x57; @@ -248,12 +248,13 @@ private void ShortenToFR(StandardMaps maps, Flags flags, Teleporters teleporters } 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)); + 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 + } + else { landingArea.Add(Blob.FromHex($"3131{battles[2]:X2}{battles[1]:X2}{battles[0]:X2}31{buffedFiend:X2}31313131")); } @@ -265,7 +266,8 @@ private void ShortenToFR(StandardMaps maps, Flags flags, Teleporters teleporters 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) + } + else if (shorttofrfiendsrefights == ShortToFRFiendsRefights.AnythingGoes) { /** * 0 - No encounter @@ -306,7 +308,8 @@ private void ShortenToFR(StandardMaps maps, Flags flags, Teleporters teleporters } anythingGoesHex += "31"; landingArea.Add(Blob.FromHex(anythingGoesHex)); - } else if (shorttofrfiendsrefights == ShortToFRFiendsRefights.Rude) + } + 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")); @@ -331,7 +334,12 @@ private void ShortenToFR(StandardMaps maps, Flags flags, Teleporters teleporters 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) From b0f3d91a3f9e0ec593d47596edaf1aabf1502f9a Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Mon, 7 Jul 2025 16:16:56 -0400 Subject: [PATCH 32/61] Fix DD exclusive chests seeping into AP --- FF1Lib/PredictivePlacement.cs | 4 +++- FF1Lib/archipelago/Archipelago.cs | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) 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/archipelago/Archipelago.cs b/FF1Lib/archipelago/Archipelago.cs index 297503a9f..d9a27529a 100644 --- a/FF1Lib/archipelago/Archipelago.cs +++ b/FF1Lib/archipelago/Archipelago.cs @@ -96,7 +96,9 @@ public Archipelago(FF1Rom _rom, ItemPlacement _itemPlacement, SanityCheckerV2 ch } else { - kiPlacement = kiPlacement.GroupBy(r => r.Address).Select(g => g.First()).ToList(); + 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); @@ -261,7 +263,7 @@ private int GetLocationId(SCLogicRewardSource r) } throw new NotSupportedException(); - } + } private List> GetRule(SCLogicRewardSource r) { From afcabd6febd577a19d761b5f7bf79b726c7c3a35 Mon Sep 17 00:00:00 2001 From: wildham0 <64616385+wildham0@users.noreply.github.com> Date: Fri, 11 Jul 2025 09:43:17 -0400 Subject: [PATCH 33/61] Add Airboat support for multiple ships --- FF1Lib/Hacks.cs | 2 +- FF1Lib/asm/1B_A000_AirBoatRoutines.asm | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/FF1Lib/Hacks.cs b/FF1Lib/Hacks.cs index a91d1a748..68ac56ecd 100644 --- a/FF1Lib/Hacks.cs +++ b/FF1Lib/Hacks.cs @@ -97,7 +97,7 @@ 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")); 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 From c7545a29767daf82eadcee2722d7896d64ab62a3 Mon Sep 17 00:00:00 2001 From: Franklin RN Date: Fri, 22 Aug 2025 15:02:20 -0700 Subject: [PATCH 34/61] Fountain funpercent redo (#1129) * Thief Hit% buff feature has been expanded to give flag crafters more fine tuned control. The Red Mage now also has hit % options and thus can be made into a viable melee, or nerfed to have the melee capablilities of the wm and bm. * Cleanup of the feature. The tooltip image is still waiting for an artist to redo. I have been informed that the thiefHitRate bool is still present in the code but I couldn't find it. * Finishing touches on the feature. * Cleaned up the feature and seperated from the hitpercent rebalance code. * Cleaned up the code so that it is ready for merge. Also updated the presets appropriately. --------- --- FF1Blazorizer/Tabs/DungeonsTab.razor | 1 + FF1Blazorizer/Tabs/FunTab.razor | 1 + .../wwwroot/images/tooltips/FountainText.png | Bin 0 -> 7506 bytes .../images/tooltips/LefienShortcut.png | Bin 0 -> 8106 bytes FF1Blazorizer/wwwroot/presets/Beginner.json | 1 + FF1Blazorizer/wwwroot/presets/Chaos_Rush.json | 1 + .../wwwroot/presets/Deep_Dungeon.json | 1 + .../presets/Entrance_Floor_Shuffle.json | 1 + .../wwwroot/presets/Floaterless.json | 1 + .../wwwroot/presets/Free_Enterprise.json | 1 + .../wwwroot/presets/Hidden_Chaos.json | 1 + .../wwwroot/presets/Improved_Vanilla.json | 1 + .../wwwroot/presets/Lichs_Revenge.json | 1 + .../wwwroot/presets/Maximum_Troll.json | 3 +- FF1Blazorizer/wwwroot/presets/NOverworld.json | 1 + .../wwwroot/presets/Oops_All_Loose.json | 1 + .../wwwroot/presets/Over_Randomizer.json | 1 + .../wwwroot/presets/Procgen_Overworld.json | 1 + FF1Blazorizer/wwwroot/presets/Shard_Hunt.json | 1 + .../presets/Winter_Tournament_2024.json | 1 + FF1Blazorizer/wwwroot/presets/default.json | 1 + .../wwwroot/presets/wt2025finals.json | 1 + .../wwwroot/presets/wt2025qfinals.json | 1 + .../wwwroot/presets/wt2025quals.json | 1 + FF1Blazorizer/wwwroot/presets/wt2025r16.json | 1 + FF1Blazorizer/wwwroot/presets/wt2025r32.json | 1 + FF1Blazorizer/wwwroot/presets/wt2025r64.json | 1 + FF1Blazorizer/wwwroot/presets/wt2025r8.json | 1 + .../wwwroot/presets/wt2025sfinals.json | 1 + FF1Blazorizer/wwwroot/tooltips/tooltips.json | 12 ++++++++ FF1Lib/Flags/Flags.cs | 1 + FF1Lib/Flags/Preferences.cs | 1 + FF1Lib/Fun.cs | 29 ++++++++++++++++++ FF1Lib/Randomize.cs | 1 + FF1Lib/StandardMaps/SMUpdates.cs | 11 +++++++ 35 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 FF1Blazorizer/wwwroot/images/tooltips/FountainText.png create mode 100644 FF1Blazorizer/wwwroot/images/tooltips/LefienShortcut.png diff --git a/FF1Blazorizer/Tabs/DungeonsTab.razor b/FF1Blazorizer/Tabs/DungeonsTab.razor index 5de30fb80..2cf082a14 100644 --- a/FF1Blazorizer/Tabs/DungeonsTab.razor +++ b/FF1Blazorizer/Tabs/DungeonsTab.razor @@ -47,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/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/wwwroot/images/tooltips/FountainText.png b/FF1Blazorizer/wwwroot/images/tooltips/FountainText.png new file mode 100644 index 0000000000000000000000000000000000000000..854c37936e6920844501db4ad3cb26851e1448e8 GIT binary patch literal 7506 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 VKDW0k0p5dxl;zdr%4N)g{|7SbGj0F? literal 0 HcmV?d00001 diff --git a/FF1Blazorizer/wwwroot/images/tooltips/LefienShortcut.png b/FF1Blazorizer/wwwroot/images/tooltips/LefienShortcut.png new file mode 100644 index 0000000000000000000000000000000000000000..445aff7d7c1e1dac2a01e702e6577a921f457941 GIT binary patch literal 8106 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 literal 0 HcmV?d00001 diff --git a/FF1Blazorizer/wwwroot/presets/Beginner.json b/FF1Blazorizer/wwwroot/presets/Beginner.json index 922a113cd..db0dafd49 100644 --- a/FF1Blazorizer/wwwroot/presets/Beginner.json +++ b/FF1Blazorizer/wwwroot/presets/Beginner.json @@ -157,6 +157,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/Chaos_Rush.json b/FF1Blazorizer/wwwroot/presets/Chaos_Rush.json index 9c751332d..0c2ef889a 100644 --- a/FF1Blazorizer/wwwroot/presets/Chaos_Rush.json +++ b/FF1Blazorizer/wwwroot/presets/Chaos_Rush.json @@ -157,6 +157,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/Deep_Dungeon.json b/FF1Blazorizer/wwwroot/presets/Deep_Dungeon.json index f32d4c22e..966549a41 100644 --- a/FF1Blazorizer/wwwroot/presets/Deep_Dungeon.json +++ b/FF1Blazorizer/wwwroot/presets/Deep_Dungeon.json @@ -157,6 +157,7 @@ "OrdealsPillars": false, "SkyCastle4FMazeMode": 0, "TitansTrove": false, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/Entrance_Floor_Shuffle.json b/FF1Blazorizer/wwwroot/presets/Entrance_Floor_Shuffle.json index 457cd7b4e..4807fe60f 100644 --- a/FF1Blazorizer/wwwroot/presets/Entrance_Floor_Shuffle.json +++ b/FF1Blazorizer/wwwroot/presets/Entrance_Floor_Shuffle.json @@ -157,6 +157,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/Floaterless.json b/FF1Blazorizer/wwwroot/presets/Floaterless.json index c3a3f076b..f0c2f2313 100644 --- a/FF1Blazorizer/wwwroot/presets/Floaterless.json +++ b/FF1Blazorizer/wwwroot/presets/Floaterless.json @@ -157,6 +157,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/Free_Enterprise.json b/FF1Blazorizer/wwwroot/presets/Free_Enterprise.json index ac1e9f383..d32d636c9 100644 --- a/FF1Blazorizer/wwwroot/presets/Free_Enterprise.json +++ b/FF1Blazorizer/wwwroot/presets/Free_Enterprise.json @@ -157,6 +157,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/Hidden_Chaos.json b/FF1Blazorizer/wwwroot/presets/Hidden_Chaos.json index ef34ec851..b81f74ab1 100644 --- a/FF1Blazorizer/wwwroot/presets/Hidden_Chaos.json +++ b/FF1Blazorizer/wwwroot/presets/Hidden_Chaos.json @@ -157,6 +157,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": false, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json b/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json index a677d189a..88df7a044 100644 --- a/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json +++ b/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json @@ -157,6 +157,7 @@ "OrdealsPillars": false, "SkyCastle4FMazeMode": 0, "TitansTrove": false, + "LefeinShortcut": false, "LefeinSuperStore": false, "LefeinShops": false, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json b/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json index 5d1e351e8..b3bb9731f 100644 --- a/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json +++ b/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json @@ -157,6 +157,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": false, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/Maximum_Troll.json b/FF1Blazorizer/wwwroot/presets/Maximum_Troll.json index cbe06960d..dd6cc6c90 100644 --- a/FF1Blazorizer/wwwroot/presets/Maximum_Troll.json +++ b/FF1Blazorizer/wwwroot/presets/Maximum_Troll.json @@ -146,6 +146,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": false, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": true, @@ -156,7 +157,7 @@ "GaiaShortcut": true, "OWDamageTiles": false, "DamageTilesKill": false, - "MoveGaiaItemShop": true, + "MoveGaiaItemShop": false, "FlipDungeons": true, "SpookyFlag": false, "DraculasFlag": false, diff --git a/FF1Blazorizer/wwwroot/presets/NOverworld.json b/FF1Blazorizer/wwwroot/presets/NOverworld.json index b1b4cd7ef..0b19a838f 100644 --- a/FF1Blazorizer/wwwroot/presets/NOverworld.json +++ b/FF1Blazorizer/wwwroot/presets/NOverworld.json @@ -157,6 +157,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/Oops_All_Loose.json b/FF1Blazorizer/wwwroot/presets/Oops_All_Loose.json index 3e2d5132a..67c26b4a1 100644 --- a/FF1Blazorizer/wwwroot/presets/Oops_All_Loose.json +++ b/FF1Blazorizer/wwwroot/presets/Oops_All_Loose.json @@ -157,6 +157,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/Over_Randomizer.json b/FF1Blazorizer/wwwroot/presets/Over_Randomizer.json index 1306d0391..8352527f8 100644 --- a/FF1Blazorizer/wwwroot/presets/Over_Randomizer.json +++ b/FF1Blazorizer/wwwroot/presets/Over_Randomizer.json @@ -157,6 +157,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": true, diff --git a/FF1Blazorizer/wwwroot/presets/Procgen_Overworld.json b/FF1Blazorizer/wwwroot/presets/Procgen_Overworld.json index bd737d92c..0d12ad2d4 100644 --- a/FF1Blazorizer/wwwroot/presets/Procgen_Overworld.json +++ b/FF1Blazorizer/wwwroot/presets/Procgen_Overworld.json @@ -157,6 +157,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/Shard_Hunt.json b/FF1Blazorizer/wwwroot/presets/Shard_Hunt.json index 13be2dcd3..af36ddcc1 100644 --- a/FF1Blazorizer/wwwroot/presets/Shard_Hunt.json +++ b/FF1Blazorizer/wwwroot/presets/Shard_Hunt.json @@ -157,6 +157,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/Winter_Tournament_2024.json b/FF1Blazorizer/wwwroot/presets/Winter_Tournament_2024.json index 95db3c46e..a9be354f9 100644 --- a/FF1Blazorizer/wwwroot/presets/Winter_Tournament_2024.json +++ b/FF1Blazorizer/wwwroot/presets/Winter_Tournament_2024.json @@ -157,6 +157,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": false, "LefeinSuperStore": false, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/default.json b/FF1Blazorizer/wwwroot/presets/default.json index 922a113cd..db0dafd49 100644 --- a/FF1Blazorizer/wwwroot/presets/default.json +++ b/FF1Blazorizer/wwwroot/presets/default.json @@ -157,6 +157,7 @@ "OrdealsPillars": true, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": true, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025finals.json b/FF1Blazorizer/wwwroot/presets/wt2025finals.json index 66f89cb48..3a7d498e7 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025finals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025finals.json @@ -160,6 +160,7 @@ "ShuffleLavaTiles": false, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": false, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json b/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json index 0b3e8d90d..1140ee9a1 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json @@ -160,6 +160,7 @@ "ShuffleLavaTiles": false, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": false, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025quals.json b/FF1Blazorizer/wwwroot/presets/wt2025quals.json index 7ca0d3cda..cfe60eb31 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025quals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025quals.json @@ -160,6 +160,7 @@ "ShuffleLavaTiles": false, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": false, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025r16.json b/FF1Blazorizer/wwwroot/presets/wt2025r16.json index 8e78378d3..3b3ec021f 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r16.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r16.json @@ -160,6 +160,7 @@ "ShuffleLavaTiles": false, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": false, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025r32.json b/FF1Blazorizer/wwwroot/presets/wt2025r32.json index 52392b5b7..6137f7ee8 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r32.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r32.json @@ -160,6 +160,7 @@ "ShuffleLavaTiles": false, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": false, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025r64.json b/FF1Blazorizer/wwwroot/presets/wt2025r64.json index 922c5d45d..0758b322b 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r64.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r64.json @@ -160,6 +160,7 @@ "ShuffleLavaTiles": false, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": false, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025r8.json b/FF1Blazorizer/wwwroot/presets/wt2025r8.json index dce57bec7..c50507e05 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r8.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r8.json @@ -160,6 +160,7 @@ "ShuffleLavaTiles": false, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": false, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json b/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json index e503cff32..3bdf3ddc1 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json @@ -160,6 +160,7 @@ "ShuffleLavaTiles": false, "SkyCastle4FMazeMode": 0, "TitansTrove": true, + "LefeinShortcut": false, "LefeinSuperStore": true, "LefeinShops": true, "RandomVampAttack": false, diff --git a/FF1Blazorizer/wwwroot/tooltips/tooltips.json b/FF1Blazorizer/wwwroot/tooltips/tooltips.json index 7d4944414..eb1962ec2 100644 --- a/FF1Blazorizer/wwwroot/tooltips/tooltips.json +++ b/FF1Blazorizer/wwwroot/tooltips/tooltips.json @@ -930,6 +930,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", @@ -2627,5 +2633,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/Flags/Flags.cs b/FF1Lib/Flags/Flags.cs index 61fe0149f..03680fc98 100644 --- a/FF1Lib/Flags/Flags.cs +++ b/FF1Lib/Flags/Flags.cs @@ -255,6 +255,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; diff --git a/FF1Lib/Flags/Preferences.cs b/FF1Lib/Flags/Preferences.cs index ce0bfdf17..9547070d8 100644 --- a/FF1Lib/Flags/Preferences.cs +++ b/FF1Lib/Flags/Preferences.cs @@ -29,6 +29,7 @@ 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; diff --git a/FF1Lib/Fun.cs b/FF1Lib/Fun.cs index 08448c765..1b389b0b8 100644 --- a/FF1Lib/Fun.cs +++ b/FF1Lib/Fun.cs @@ -500,6 +500,35 @@ 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 get\na full private bath!", + "Please go to the\nordinary well to fill\nme back up." + }; + + string roast = roasts.PickRandom(rng); + + //roast = roasts[9]; //for testing + + dialogues[0x136] = roast; + } + public void HurrayDwarfFate(Fate fate, NpcObjectData npcdata, DialogueData dialogues, MT19337 rng) { if (fate == Fate.Spare) diff --git a/FF1Lib/Randomize.cs b/FF1Lib/Randomize.cs index 9473ff006..390ec9c90 100644 --- a/FF1Lib/Randomize.cs +++ b/FF1Lib/Randomize.cs @@ -378,6 +378,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())); diff --git a/FF1Lib/StandardMaps/SMUpdates.cs b/FF1Lib/StandardMaps/SMUpdates.cs index c29da19df..8fe7be627 100644 --- a/FF1Lib/StandardMaps/SMUpdates.cs +++ b/FF1Lib/StandardMaps/SMUpdates.cs @@ -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); @@ -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) From 800feab0f54c7fc51f19bf57dac563c7acf438c2 Mon Sep 17 00:00:00 2001 From: Franklin RN Date: Fri, 22 Aug 2025 15:28:15 -0700 Subject: [PATCH 35/61] Undead spike tiles fall league (#1131) * Thief Hit% buff feature has been expanded to give flag crafters more fine tuned control. The Red Mage now also has hit % options and thus can be made into a viable melee, or nerfed to have the melee capablilities of the wm and bm. * Cleanup of the feature. The tooltip image is still waiting for an artist to redo. I have been informed that the thiefHitRate bool is still present in the code but I couldn't find it. * Finishing touches on the feature. * Version 1 of the formation list * Bug fixed, it generates now. A new bug has emerged though. Some encounters are being left in that shouldn't be left in. removing them is causing the system to collapse * Bug fixed. Just need to have enough formations in the pool of options. --------- --- FF1Blazorizer/wwwroot/tooltips/tooltips.json | 2 +- FF1Lib/SpikeTile.cs | 83 ++++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) diff --git a/FF1Blazorizer/wwwroot/tooltips/tooltips.json b/FF1Blazorizer/wwwroot/tooltips/tooltips.json index eb1962ec2..84828a624 100644 --- a/FF1Blazorizer/wwwroot/tooltips/tooltips.json +++ b/FF1Blazorizer/wwwroot/tooltips/tooltips.json @@ -1416,7 +1416,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\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", diff --git a/FF1Lib/SpikeTile.cs b/FF1Lib/SpikeTile.cs index 43786a2db..4b3cbffef 100644 --- a/FF1Lib/SpikeTile.cs +++ b/FF1Lib/SpikeTile.cs @@ -20,6 +20,8 @@ public enum TrapTileMode LocalFormations, [Description("Remove Trap Tiles")] Remove, + [Description("Undead Only")] + Undead, [Description("Curated")] Curated } @@ -238,6 +240,87 @@ public void ShuffleTrapTiles(ZoneFormations zoneformations, MT19337 rng, TrapTil encounters = encounters.Except(FormationLists.BahamutEncounter).ToList(); } } + 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 { //balanced/curated mode From 0fd93d17b3ae33591d4a356deded4caa7415956b Mon Sep 17 00:00:00 2001 From: Franklin RN Date: Fri, 22 Aug 2025 15:45:59 -0700 Subject: [PATCH 36/61] Spike tile grind pool (#1130) * Thief Hit% buff feature has been expanded to give flag crafters more fine tuned control. The Red Mage now also has hit % options and thus can be made into a viable melee, or nerfed to have the melee capablilities of the wm and bm. * Cleanup of the feature. The tooltip image is still waiting for an artist to redo. I have been informed that the thiefHitRate bool is still present in the code but I couldn't find it. * Finishing touches on the feature. * Should hopefully be ready for merge. * Deleted duplicated code that caused the problem. --------- Merged successfully with the Undead pool. --- FF1Blazorizer/wwwroot/tooltips/tooltips.json | 2 +- FF1Lib/SpikeTile.cs | 151 +++++++++++++++++-- 2 files changed, 138 insertions(+), 15 deletions(-) diff --git a/FF1Blazorizer/wwwroot/tooltips/tooltips.json b/FF1Blazorizer/wwwroot/tooltips/tooltips.json index 84828a624..a2b676870 100644 --- a/FF1Blazorizer/wwwroot/tooltips/tooltips.json +++ b/FF1Blazorizer/wwwroot/tooltips/tooltips.json @@ -1416,7 +1416,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\nUndead Only: Contains undead and some undead adjacent formations.\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", diff --git a/FF1Lib/SpikeTile.cs b/FF1Lib/SpikeTile.cs index 4b3cbffef..52a0e2bfc 100644 --- a/FF1Lib/SpikeTile.cs +++ b/FF1Lib/SpikeTile.cs @@ -23,7 +23,9 @@ public enum TrapTileMode [Description("Undead Only")] Undead, [Description("Curated")] - Curated + Curated, + [Description("Overpowered")] + Overpowered } public enum TrapTileOffsets : int @@ -240,6 +242,41 @@ public void ShuffleTrapTiles(ZoneFormations zoneformations, MT19337 rng, TrapTil encounters = encounters.Except(FormationLists.BahamutEncounter).ToList(); } } + else if (mode == TrapTileMode.Curated) + { + //balanced/curated mode + //this mode is really just in here so tournament organizers know that it's possible + encounters = new(FormationLists.AllRandomEncounters); + + //remove 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 + + if (fightBahamut) + { + encounters.Remove(0x80 + 0x71); // ANKYLO (used for Bahamut) + encounters.Remove(0x71); // ANKYLO (used for Bahamut) + } + } else if (mode == TrapTileMode.Undead) { //all random @@ -256,8 +293,6 @@ public void ShuffleTrapTiles(ZoneFormations zoneformations, MT19337 rng, TrapTil encounters.Remove((byte)i); } - - encounters.Add(0x01); // Bones encounters.Add(0x01 + 0x80); // Bones and Crawls @@ -323,41 +358,129 @@ public void ShuffleTrapTiles(ZoneFormations zoneformations, MT19337 rng, TrapTil } else { - //balanced/curated mode - //this mode is really just in here so tournament organizers know that it's possible + //UNbalanced/curated mode + //this mode is really just in here so we have the option to make spike tiles overpowered encounters = new(FormationLists.AllRandomEncounters); - - //remove the god grinds + 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(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(0x49 + 0x80); //3-6 waters encounters.Remove(0x51 + 0x80); //3-6 airs - encounters.Remove(0x57 + 0x80); //3-4 worm + //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 - if (fightBahamut) - { + //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) { tileset.Tiles.ForEach(tile => From 4fe9af811056cd6ef99f4385ce3d32882e7f52d9 Mon Sep 17 00:00:00 2001 From: Douglas Kirby Date: Sat, 23 Aug 2025 03:19:40 -0400 Subject: [PATCH 37/61] Tri state flag output (#1115) * Added functionality for optionally outputting flags. Making TriState flags more useful for random settings seeds. * Ignore .vscode directory * updated ImageSharp to fix vulnerability error * Updated tooltip to match changed checkbox/button layout for revealing tristates * added new flag default to all presets --- .gitignore | 8 +++- FF1Blazorizer/Tabs/FileTab.razor | 38 ++++++++++++++++++- FF1Blazorizer/wwwroot/presets/Beginner.json | 1 + FF1Blazorizer/wwwroot/presets/Chaos_Rush.json | 1 + .../wwwroot/presets/Deep_Dungeon.json | 1 + .../presets/Entrance_Floor_Shuffle.json | 1 + .../wwwroot/presets/Floaterless.json | 1 + .../wwwroot/presets/Free_Enterprise.json | 1 + .../wwwroot/presets/Hidden_Chaos.json | 1 + .../wwwroot/presets/Improved_Vanilla.json | 1 + .../wwwroot/presets/Lichs_Revenge.json | 1 + .../wwwroot/presets/Maximum_Troll.json | 1 + FF1Blazorizer/wwwroot/presets/NOverworld.json | 1 + .../wwwroot/presets/Oops_All_Loose.json | 1 + .../wwwroot/presets/Over_Randomizer.json | 1 + .../wwwroot/presets/Procgen_Overworld.json | 1 + FF1Blazorizer/wwwroot/presets/Shard_Hunt.json | 1 + .../presets/Winter_Tournament_2024.json | 1 + FF1Blazorizer/wwwroot/presets/default.json | 1 + .../wwwroot/presets/wt2025finals.json | 1 + .../wwwroot/presets/wt2025qfinals.json | 1 + .../wwwroot/presets/wt2025quals.json | 1 + FF1Blazorizer/wwwroot/presets/wt2025r16.json | 1 + FF1Blazorizer/wwwroot/presets/wt2025r32.json | 1 + FF1Blazorizer/wwwroot/presets/wt2025r64.json | 1 + FF1Blazorizer/wwwroot/presets/wt2025r8.json | 1 + .../wwwroot/presets/wt2025sfinals.json | 1 + FF1Blazorizer/wwwroot/tooltips/tooltips.json | 5 +++ FF1Lib/FF1Lib.csproj | 2 +- FF1Lib/Flags/Flags.cs | 1 + FF1Lib/Helpers/Utilities.cs | 2 + FF1Lib/RandoRNG.cs | 4 +- FF1Lib/Randomize.cs | 4 +- 33 files changed, 82 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index e7c1aeff3..3650abb3d 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 @@ -1035,5 +1041,5 @@ FF1Blazorizer/output/presets/full-npc.json FF1Blazorizer/output/presets/default.json FF1Blazorizer/output/presets/debug.json FF1Blazorizer/output/presets/beginner.json -FF1Lib/FF1Lib.sln FF1Blazorizer/output/wwwroot/images/tooltips/transmooglifier.gif +FF1Lib/FF1Lib.sln 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/wwwroot/presets/Beginner.json b/FF1Blazorizer/wwwroot/presets/Beginner.json index db0dafd49..9787326c1 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, diff --git a/FF1Blazorizer/wwwroot/presets/Chaos_Rush.json b/FF1Blazorizer/wwwroot/presets/Chaos_Rush.json index 0c2ef889a..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, diff --git a/FF1Blazorizer/wwwroot/presets/Deep_Dungeon.json b/FF1Blazorizer/wwwroot/presets/Deep_Dungeon.json index 966549a41..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, diff --git a/FF1Blazorizer/wwwroot/presets/Entrance_Floor_Shuffle.json b/FF1Blazorizer/wwwroot/presets/Entrance_Floor_Shuffle.json index 4807fe60f..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, diff --git a/FF1Blazorizer/wwwroot/presets/Floaterless.json b/FF1Blazorizer/wwwroot/presets/Floaterless.json index f0c2f2313..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, diff --git a/FF1Blazorizer/wwwroot/presets/Free_Enterprise.json b/FF1Blazorizer/wwwroot/presets/Free_Enterprise.json index d32d636c9..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, diff --git a/FF1Blazorizer/wwwroot/presets/Hidden_Chaos.json b/FF1Blazorizer/wwwroot/presets/Hidden_Chaos.json index b81f74ab1..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, diff --git a/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json b/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json index 88df7a044..510041c2a 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, diff --git a/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json b/FF1Blazorizer/wwwroot/presets/Lichs_Revenge.json index b3bb9731f..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, diff --git a/FF1Blazorizer/wwwroot/presets/Maximum_Troll.json b/FF1Blazorizer/wwwroot/presets/Maximum_Troll.json index dd6cc6c90..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, diff --git a/FF1Blazorizer/wwwroot/presets/NOverworld.json b/FF1Blazorizer/wwwroot/presets/NOverworld.json index 0b19a838f..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, diff --git a/FF1Blazorizer/wwwroot/presets/Oops_All_Loose.json b/FF1Blazorizer/wwwroot/presets/Oops_All_Loose.json index 67c26b4a1..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, diff --git a/FF1Blazorizer/wwwroot/presets/Over_Randomizer.json b/FF1Blazorizer/wwwroot/presets/Over_Randomizer.json index 8352527f8..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, diff --git a/FF1Blazorizer/wwwroot/presets/Procgen_Overworld.json b/FF1Blazorizer/wwwroot/presets/Procgen_Overworld.json index 0d12ad2d4..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, diff --git a/FF1Blazorizer/wwwroot/presets/Shard_Hunt.json b/FF1Blazorizer/wwwroot/presets/Shard_Hunt.json index af36ddcc1..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, diff --git a/FF1Blazorizer/wwwroot/presets/Winter_Tournament_2024.json b/FF1Blazorizer/wwwroot/presets/Winter_Tournament_2024.json index a9be354f9..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, diff --git a/FF1Blazorizer/wwwroot/presets/default.json b/FF1Blazorizer/wwwroot/presets/default.json index db0dafd49..9787326c1 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, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025finals.json b/FF1Blazorizer/wwwroot/presets/wt2025finals.json index 3a7d498e7..f397f8827 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025finals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025finals.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": true, "BlindSeed": false, "Shops": true, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json b/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json index 1140ee9a1..b34ce4d46 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025qfinals.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": true, "BlindSeed": false, "Shops": true, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025quals.json b/FF1Blazorizer/wwwroot/presets/wt2025quals.json index cfe60eb31..937484467 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025quals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025quals.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": true, "BlindSeed": false, "Shops": true, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025r16.json b/FF1Blazorizer/wwwroot/presets/wt2025r16.json index 3b3ec021f..50beb5b6f 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r16.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r16.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": true, "BlindSeed": false, "Shops": true, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025r32.json b/FF1Blazorizer/wwwroot/presets/wt2025r32.json index 6137f7ee8..232b20ef6 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r32.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r32.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": true, "BlindSeed": false, "Shops": true, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025r64.json b/FF1Blazorizer/wwwroot/presets/wt2025r64.json index 0758b322b..4e1ffeb4d 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r64.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r64.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": true, "BlindSeed": false, "Shops": true, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025r8.json b/FF1Blazorizer/wwwroot/presets/wt2025r8.json index c50507e05..31f6141c6 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025r8.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025r8.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": true, "BlindSeed": false, "Shops": true, diff --git a/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json b/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json index 3bdf3ddc1..c6e7c68a5 100644 --- a/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json +++ b/FF1Blazorizer/wwwroot/presets/wt2025sfinals.json @@ -92,6 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, + "TriState": false, "TournamentSafe": true, "BlindSeed": false, "Shops": true, diff --git a/FF1Blazorizer/wwwroot/tooltips/tooltips.json b/FF1Blazorizer/wwwroot/tooltips/tooltips.json index a2b676870..a60f6012c 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", diff --git a/FF1Lib/FF1Lib.csproj b/FF1Lib/FF1Lib.csproj index c3ec22dbf..950c5e2fb 100644 --- a/FF1Lib/FF1Lib.csproj +++ b/FF1Lib/FF1Lib.csproj @@ -259,7 +259,7 @@ - + diff --git a/FF1Lib/Flags/Flags.cs b/FF1Lib/Flags/Flags.cs index 03680fc98..8ee7496cb 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; 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/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 390ec9c90..3d4011427 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(); @@ -445,5 +446,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; } } From 4cd95ec357236d514ee846ad1dca9b90d5ca4504 Mon Sep 17 00:00:00 2001 From: Douglas Kirby Date: Sat, 23 Aug 2025 05:14:15 -0400 Subject: [PATCH 38/61] QoL magic shop menu update (#1124) * Added flag, checkbox, and function for magic shop QoS * made ignore of output directory full path --- .gitignore | 783 +----------------- FF1Blazorizer/Tabs/QoLTab.razor | 1 + .../tooltips/MagicShopMenuChangeCheckBox.png | Bin 0 -> 11072 bytes FF1Blazorizer/wwwroot/tooltips/tooltips.json | 6 + FF1Lib/AltFiends.cs | 57 ++ FF1Lib/Flags/Preferences.cs | 1 + FF1Lib/QualityOfLife.cs | 52 +- FF1Lib/ShopInformation.cs | 36 +- 8 files changed, 136 insertions(+), 800 deletions(-) create mode 100644 FF1Blazorizer/wwwroot/images/tooltips/MagicShopMenuChangeCheckBox.png diff --git a/.gitignore b/.gitignore index 3650abb3d..ce04ff675 100644 --- a/.gitignore +++ b/.gitignore @@ -261,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/wwwroot/images/tooltips/transmooglifier.gif +FF1Blazorizer/output/* + FF1Lib/FF1Lib.sln 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/wwwroot/images/tooltips/MagicShopMenuChangeCheckBox.png b/FF1Blazorizer/wwwroot/images/tooltips/MagicShopMenuChangeCheckBox.png new file mode 100644 index 0000000000000000000000000000000000000000..f0a360cc7e20bc051d98586facb598d5215e6b02 GIT binary patch literal 11072 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 en>T_Vq+ypDaw5M82WzjsF275}Vrq literal 0 HcmV?d00001 diff --git a/FF1Blazorizer/wwwroot/tooltips/tooltips.json b/FF1Blazorizer/wwwroot/tooltips/tooltips.json index a60f6012c..514280bfe 100644 --- a/FF1Blazorizer/wwwroot/tooltips/tooltips.json +++ b/FF1Blazorizer/wwwroot/tooltips/tooltips.json @@ -286,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", diff --git a/FF1Lib/AltFiends.cs b/FF1Lib/AltFiends.cs index 0d9c6827c..fd5cd4f71 100644 --- a/FF1Lib/AltFiends.cs +++ b/FF1Lib/AltFiends.cs @@ -3149,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, @@ -3168,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, @@ -3187,6 +3225,25 @@ public void AlternativeFiends(ExtAltFiends extAltFiends, EnemyScripts enemyScrip Skills2 = new List { (byte)EnemySkills.Toxic, (byte)EnemySkills.Swirl, (byte)EnemySkills.Stare, (byte)EnemySkills.Poison_Stone }, }, + 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 }, + }, + }; var WinnerCirleFiendsList = new List { diff --git a/FF1Lib/Flags/Preferences.cs b/FF1Lib/Flags/Preferences.cs index 9547070d8..39460049e 100644 --- a/FF1Lib/Flags/Preferences.cs +++ b/FF1Lib/Flags/Preferences.cs @@ -36,6 +36,7 @@ public class Preferences 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/QualityOfLife.cs b/FF1Lib/QualityOfLife.cs index e33d7bff5..48bae5d2d 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("A90D205BAA2089A9B0EDA662BD00038D0C032065AA20C2A8B0DEA562D0DA20EBA49008A910205BAA4C65A320E094A5626A6A6A29C08D0A0320DFAA20CDA4AE0A03AD0B039D00634C60A3")); + + // 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/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"; } From 6cb44777c403614cb2acde733563a74b17c0bd49 Mon Sep 17 00:00:00 2001 From: Douglas Kirby Date: Sat, 23 Aug 2025 21:33:21 -0400 Subject: [PATCH 39/61] Removed and ignored generated output file directory. Also needed to push a new commit for deployment. (#1132) * added vscode and comments to gitignore * removed output files --- .gitignore | 2 +- .../wwwroot/_framework/System.Xml.Linq.dll | Bin 4096 -> 0 bytes .../wwwroot/_framework/System.Xml.Linq.dll.br | Bin 1217 -> 0 bytes .../wwwroot/_framework/System.Xml.Linq.dll.gz | Bin 1392 -> 0 bytes .../_framework/dotnet.6.0.27.23owh3yvu8.js | 320 ----------- .../_framework/dotnet.6.0.27.23owh3yvu8.js.br | Bin 56492 -> 0 bytes .../_framework/dotnet.6.0.27.23owh3yvu8.js.gz | Bin 64542 -> 0 bytes .../RandomizeClassInnateMagicCheckBox.png | Bin 1781 -> 0 bytes .../wwwroot/images/tooltips/airboat.gif | Bin 120194 -> 0 bytes .../wwwroot/images/tooltips/procgenEarth.png | Bin 5074 -> 0 bytes .../images/tooltips/randomShardName.png | Bin 10519 -> 0 bytes .../presets/Fall_League_-_0_Loose_3_Orbs.json | 499 ----------------- .../presets/Fall_League_-_E-F_Shuffle.json | 498 ----------------- .../presets/Fall_League_-_Noverworld.json | 499 ----------------- ...ll_League_-_Procgen_OW_Oops_All_Loose.json | 498 ----------------- .../presets/Fall_League_-_Relay_Race.json | 498 ----------------- .../presets/Winter_Tournament_2024.json | 506 ------------------ 17 files changed, 1 insertion(+), 3319 deletions(-) delete mode 100644 FF1Blazorizer/output/wwwroot/_framework/System.Xml.Linq.dll delete mode 100644 FF1Blazorizer/output/wwwroot/_framework/System.Xml.Linq.dll.br delete mode 100644 FF1Blazorizer/output/wwwroot/_framework/System.Xml.Linq.dll.gz delete mode 100644 FF1Blazorizer/output/wwwroot/_framework/dotnet.6.0.27.23owh3yvu8.js delete mode 100644 FF1Blazorizer/output/wwwroot/_framework/dotnet.6.0.27.23owh3yvu8.js.br delete mode 100644 FF1Blazorizer/output/wwwroot/_framework/dotnet.6.0.27.23owh3yvu8.js.gz delete mode 100644 FF1Blazorizer/output/wwwroot/images/tooltips/RandomizeClassInnateMagicCheckBox.png delete mode 100644 FF1Blazorizer/output/wwwroot/images/tooltips/airboat.gif delete mode 100644 FF1Blazorizer/output/wwwroot/images/tooltips/procgenEarth.png delete mode 100644 FF1Blazorizer/output/wwwroot/images/tooltips/randomShardName.png delete mode 100644 FF1Blazorizer/output/wwwroot/presets/Fall_League_-_0_Loose_3_Orbs.json delete mode 100644 FF1Blazorizer/output/wwwroot/presets/Fall_League_-_E-F_Shuffle.json delete mode 100644 FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Noverworld.json delete mode 100644 FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Procgen_OW_Oops_All_Loose.json delete mode 100644 FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Relay_Race.json delete mode 100644 FF1Blazorizer/output/wwwroot/presets/Winter_Tournament_2024.json diff --git a/.gitignore b/.gitignore index ce04ff675..85e368ff1 100644 --- a/.gitignore +++ b/.gitignore @@ -261,6 +261,6 @@ _Pvt_Extensions FF1/Blazorizer/output/* -FF1Blazorizer/output/* +FF1Blazorizer/output/ FF1Lib/FF1Lib.sln 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 5bfebabd19134b05109eeadac210c78452cea44f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmeHKPiz!r6#oq^P(UjGLeLVNQaBKBTz0q1HbLB$7F*Mn+AdJ#0JA$E%f#88WoBB~ zfZ7;2=)st1;>E;^iSc5L@qk9X_~)V|-ZUm8o{R?*FC2)8*5CVPr@K%B#FHev?Y!^( z``-8deEViQ@%)?U0MN;2aS^z}RiL2pozVi--H(0VjZfEH?Y&}*U+pcPbwjfr_?5t} znq|9I^CPpQ%wVo&x;1n7=!{wQ9c8UwzjjyC_0$M3Zgk-5zrVkhoc1er_O3Hhz$!|* zV(H{=u4YW@=!9Mo$1PHcU&8`1wT?rD~3arGBCgWxu)`+kTrc7X=jsL%rLo?3|88CEs zQj7Vlm9jFa%>Drpb?VY=r@HSY;1bujg`SB5w^j+oVnauKKl+|NHa1M&B>y|tz9G*q zi2;FaTDy7+@R~4x85wN-MxVHvteh+@l1FH1sXV}S&5Pz;oHSP93yt?-)OZ*dX}Ssp z{6hR3x~QEemR%YV8|=uCu?riC(|CmV81@i5*st+`#unC5YGE^S#637k+y|Fw}j-O${@3E!FX)FI3?!bnxE zslc7LBV`@-12yiJFgqBr(xtgbVOW*sDiyorsg|s02Ne|^;p|Z7{osX`VlWIRID%?VRO!ULu=TXFOGwcoIockHk8WFY#76@`FS=?An!@A4YCD zOhiclaW*QLQNg@hR$;T842T^dJ3Hd3s;Y6oe7obVi#tEtGy3NAi@&}6-8-+yIE;Z` zat&RV{k4@zj*X^m@sz81uU-EdLppvlYVXFLRr-% zvEtdlKOY(^xnbi*?uc)??C-Bxjnmsw6vr_ccy=AG-!){pj?8YS9 zj!g#E)4)m}NN26w!2UFlHSk0%+M7=~sz2x0PAQYmWo=bHpz_LbGPcU3?KBt1PUX}2 z{$^&$vXn9f*LkV8H)o#c4+(7wwH%V!c(djdGaB~13EQoq8kU)!(p?v;#oaIqH=EyA zoT0DBwq>I}o~V2yFWj6?JQC#HFO<{X>B~I;#<`eaFMxe(5sDreq4A^^jX6h_}XX}=RDt-)Y_DW z)Z2(?=aY-!ek%nEtB#DDIAU3h1rDHKL@- zSvyPYaUIwG&rv^)txNmrI<^KYVQU`}*90xgjK`-JpV>sbm~u*hy2kBUjOrMY?1y<~ zsQ0?GZO`>?F&#uVV@muSr=NhHTD6k*NQzGy2l!-3LI1)}27 Axc~qF 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 00f93c58541e5189b9308c50f3944b356a998c77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1217 zcmV;y1U~y4{|^AJ3T$KA&=q0>gb)OqtfRlIBYVC_@L=~jZ~xvo^j;utKs1eAr%dS% zWSKH0Ab38f`jjy@^F=3r%M0bgk}lSbG8RPzy#D91y>qm#&(d;@(wk$lo6nM&zsaW1 zjBCcDLD^<8mK5o8Ou^IZ{42aXem|Edq1?Qx#=KJW?dFPV^0axw(x)}iES{k)FCvW* znrWmYYNRJpBvl@=`3~q!8}k92yx>_9DgOWGEI{tE|5n3Vzmz%r=Bv(})g4|#@C`bsm56V^31nh%&&1Q`?~ z5i@pKS08)|`xfPpF0U{^4tZBkY*U~TmVpG-X%`yd>-44iL^cSZ( zf^7nTgz}OWc7tEx>D&}3L7@084J13^ivY#;`Hc)0&(k{FMU}OI6Xd?Yd`+$uTMZD5 zLzxk=QU}q8cZ2M+8e>{06m@{60ET{H=>d+vSH<%$wFxO85PAm10I011_=%es1dst$ zB+4KI_5{Q`cx+>_1&ke&%*&@W5OeIFPH;6mR(?GQUUg^HE8Kc9rZS9jM5G_#lGY$g zQUNVNkY6EQSTbdPJSbV<0MFw&5NJAZvfNY;3wsdY$>9?r^a%|u+GN-buW}Z9+Bl(@ z;bhc_7UE)Qf*eI91R?Hm>vvbVre$Vqh&l~M*gcAquWynhHSgS6P--sVs;Q+>fm_Yr z*81$Qd!Ess+d~aN3MgIorZ4w&>BF^k{vWM>r>C=sTuxC63K`Wrgjq>vu9wAuH9@H1 zv)h_$sFY?}sa`7=BtXXWiXR$weOo`v|L*0Y7)iHH=I zEv+RKtAp4T=nZCeJE{|zGmTH2rAiu8fjv+6Fv$Qf6y)HO15(aTfyuO#X9d=csLVn0)?WpljE>Vq**&<11b&KEP*!Re zb+C#o+6C1MGS0p)&Co8&yKynH8q-+c54ZpwJENx-cY~xG`~KV%!*GT%b`m{%o{~JBnmY5}owb zU*BDC#QlYK4y+StqAm#Ck#1%;m_`XY9(P2znNqEwpl9l&(^rT#sQ;vIc8YEQ$cZ>) zsTrh&P7^(Z?kD(dzlWMMNozt^)D3x}Mb<-kAw*wV6X(^H;BEx~#y7rjF#MHhXp_+FY257R}My0AY#gFi>z z&@X|rcQl7H>Y*{Qi#CF1=n?Q^vZeB|DDjVQ0JD0U((6J=2c|u9(Uu2kz8-|q(Pw>Y$q1!> z*z@I-Ri=f}5S1=3hLVc1yjZOoWm_h?lHpfncm#KcJn#80B!63K zxvPzn?itT_j1We{UgdSzb842YtaH*fE~rtE*yk4A&~hZZ!Bn)JJ0FNOn6PmpW<)2Q z=l6{W+NRHpmw4|-Yqh;`&7NG!>uJR5+tS?Uq7~F^qdo(XHVIk}2R*YdlhgD2hciSu zK~F@gp+ee}BYD#>%h^IcXUNJvS&*igHDoqpWYC#Lx{xW1wA~4}-1j)t+v7Wr>EJEz z%I)vQTj>-sD%$q6VY%c46{IKCt~0IdChcBc&ij>ws@1ktSABG&rf;Kfyd4Wj`zC)# z#B{SW2Y#I9=@j@l&0#c2M`;G~B=`}GnZ8K<@ptpq?0>H}x^?>Lsg_gP_AC(PdN)i5@R5+jIgaMTKbg<(NE$6e`_OV29gPGlOMl1896v66|CnuRux9W$V>z)M2rj7?Zrm&IHIEs}Uv8Xg%m yzCR1N{RL_msA@TgXCr%U6^>ktBWe%mKSx^hojlwAXg;9-1^oj*I3q6r5C8xK$hdd_ 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 b2f3bc0be6ff1e6e046191ea3d145b5f0a4b5ec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56492 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 TUS!#8wb2bNmKtYZc#bvI2R5hZUOIv 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

Dv^M1noynO%Y!ThHf$*K<;&1jpG(TWy}LR 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

*V85gk1(d)F+ZZ6OlIBt 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

hqs{BQFI^?3C2Z_PC-9&eUC|K>lQI{AEn zEQ)0f9BEg&V%!A^Py@Q0w-q`~@1&FlDmyR}P^c)2p5@{+qFhyGLBw)^p>QfHYbs({ z;E4FVjV<}KcPB7DwnGE@ddyj-)yMf+mSUn&^$!O{J(V{ZuxzIr5}=>ufC}huetKDd z9TzkfphDx+)${QNEUibuf-u-^DeTizMwt5DyKNNWU~&vjVq0x_JV0_$glDsEcxR$% zioHjm7by^ly4(W*@JS-;sin~TPS1Zr;{<@YFpqJiw>Z7>WRFll?H@W?$ZFHms>7J7 z%Co&>KFb*stIHJ21Jqz?O5T|mH+g(^ckxr_C#)(1;$yoM#K(w%Wx(NeU!YT{l({?#U7w$;gOGsW^_WuU z4774^sS7YN4{3_=ajBnw;*if^xr9|@(7cQZ3^Kb?Y_7|M-CHKBxamry84@tkuZ><|G zPuGhP%lCEEFI}$)B_)9T7S}D@P4|@*C%aG*rFdQD!Q$lTDm7BLZM4J@?e&-dG1foJ ziFw{Lg(_bKC)!_kx_3lp5#7%zv?Q*1L!^bdZ!WdHiy?b4?)lJ`l&CD7v5Wgky4yF& z(j()B;?8&*6n0c-RJB^Z3ZCVxevxRYjWzaqRMKI09%__XVA*(I(L|vLY&jtDow0+0 zfUfV%R_rNCO;8N+aZjzc%KmnnC~uSQyOp^Ol#Hx-jAPdX;GgAGKw5*M7+0}fh^=Hq zH&o=XcGHFu-{pi4*8!Bho~Qzl<|vfc%&f;UrVwvSmR6fD90x)^5Be`Z)6qeloxSfDj*X{h+ZgyfqZOuq3^VRkoZ6JSG z3-|umgk7v;UXvYSyWn(zH*V5m5!pv35>_78uM$KQ^!!y%`d z(Tm7>n|9R6=$7(U)DBp9E6$K!u4*g=`kq|nTu`+e>4N18A6xbET3b=a&Lo=XT)DE^ z^N^hh6i}i?k2%IAQVAT%3s;CX$W>gMi&|!bqqR;r??O_`)#6#M>+Gy2M$fNt%)-k{ z+7O39x3_|MIqeVI`)-+p^ntOl4tURU?m6B#O4#cBO>PdcxZWMC#q9mHQFN?-JstDo zt&3*w6ARtl9F z2I6r@L@g6kN!)LgmKBkubyUE{yRcUy*+RJMwnIc-yK!8``*3k3=))!E&b4PXL)y!W za<_9TOOiNMk05=z+f<0lgKiGxAU9|BVtCn9?h$$+3k?%Ca1PWq>{$r-imwl}ok8YD97@8^SZnZ%^_92V^L;3{l+brJJ-g;J17@ z7#M~y7=ci^v0Cab6vqyN&>#010WNuZUEa%x?+R`VQL^U*f!`t#wNl8s33o;_K>9o^ z=$kR!)$_g9_q*w`&URyRxb%*SiE^c&4?c^ReH58j2+x2#`<_VCIeSPI5xoABzvVpp zndd;)7dg>DPe6LbUq=U-smmw1XJ2`)$o7@(*h=}}jL&i*KXcC$=$TjUDX@L0xz?$j zT_SzNgts`bd&B`4KR=HNGcNV7B5d@)eCYb-{19Bf=ftl(SbXKd(Srwz z5YB^L*DnfD73g(~@#|X@Q;M>$$97KR3PkjGc~@B(eY*pPc$VX%lXNeZ3`1=~1?zaW zjrLn6p>x&iN2V~rNgdSoATf3Z<+m}uHXQoY)T@ zTiRJx>>zugN^Whr*qV_vDHglcx)BX|F`f2dh{@_5;8yJ&k9+?jL;TF%u@=dCYl4Z> zdgd02ea%Z=KJG&Wq{}41qd-B;VO1F^WS^@ZTa=W7ca=(RmR+(#OI1KnYqyiu!5wIa zI+W}-X*b3J!ik8?HcfHoc`{uz&JeD}>=;w^SZbuZlE7x~5tAib_^~6#XE|geGe@5v z>y=1c+FcmY6RKz4Nz{$3pXPZNNc~>*$NH2ekUr%Oxkm>+xrCRkLd~&oG~&$!L|e`5 zAu8LZFLq3nSPeJF00-#91oMrg5Amv~w9QbVwcC<})fb$O|Po5xu&=$d}RF{>A4b zcWPXX`lUlWcQ`L;fxGySJ_)?hjkK@U_XEBd{9?V_;y#rV4R1$w*P?fHze3Wg8srj+ z54VtX2`0bh5@Bz|nOB4}r5Kmt7?s;I+VH?k?XVGX;!lz_>vzTLJMKX=^DV$9Q6#joC{k-3 zs4!1Xztm|sb^d(RH5d@Sa5a@+xkxqMIWc4}AMj)T;rkEH`N$Clm8L*{rX#ps00aX# z5yb$O?dew@ew;}w10tT6!S*#D=vivn!+ELwk!NmfPhheqaeU+LXLueU4zI}^==JC;hkx*PHGk#p5Rd#Jhfg8S4%dl(KE{xt zsbbbQR4+KqR72!#S>%oR=k#np`$+C1NA8dP>$u^1$ebretR-VV&pn{{KIb8i+{5K( zy^nLQlxMADODhMbrv0oBU#Gyk?%?kW=sCwgghY%4m68E(0Jo=N!1uuJseWc$zz0+X zW~+nZyGmWatnCoY#|kQNRjPf+`VoZynurAbYb_7TJ6`H~4F|wsj&m$uBo5X?cUQ9Y&J2NL=lOqr6qiRzvm-3CS(w1vL^?zHmr>Z5!I~Ec~36-UWz1s*X(xe{+`}cL(UgyxyYk?=7HOBtZIwR5~0ta zIOb^_+W8!i-(q27UOA4lm}m^Nz`JY&L|P{2JyS-WdmSw&EB$;? zw73pkp9&1VirCwZS<}ZsQQW8l4T7VDLoR22ZC(tk2=6A?MDStnpQxHcg+W_57LRU~iRXK5fg^&zT$4MV z8{H!@gm}3*S{Pug((p*@a0r&C~DQ%)VNR z9S=B3qP_+5kYmV)X1bbb24#ykj$m~$KHo`-uG!^coyZl3Q>AnDO`NkJ{7hr6XZKQ$ zyFOh~qPIj>#g-?13%!k|G_gIpHe_Uo;_~v%x`oF-VwX-+nf`rk{kfk0Ecdh8`g1)U z`o5pk)}QO?5P$heZT-2P4%z2h-T`8HdRbGD3#>aJg5?o!$(gc!si#;pH18VVGSENP zRSZyy{9UHf=bDQICRTo5tAXP5+q%u;I_Yb}168G>WX4pr8JGmf&+9voT*R6(y@kGm zV%RG+hmu^uY|LQMQ%4x|Z2?^$bK{-qyy31(k;m<_xnnk~tC{XFvn0HhB*S@!+RHa! z%s~n0>MNcH5!F2~-0!Iz2wKdSz_EsCPsK(2hb zNmsXc6LOgpMMPlXV|0C@TNK2 z7zwprFWjPlc%;j&gexOaF_XnQ=L+ldWCU!40OKmNo(yjD{$A{(*k8;(#>ndSC6{+ZR|J;9P(Xa-@_iI>P<)`G=F7S! zeF7APKa8LMWmzZM0%+k_+(Z#Nq{U8d4% z&GwU72ShV8v9?k2+ld!+dR>)~$h(e=DyWP?^#V$s@$<3f$d0luj*4#d@|75rDf48Y z0T2mDDGE*{3ML#^1noz$TIwJrAbqVXHM(G)O2- zLZhslh`p>Cv*oE2CZ9oau7>I%&$R(f>8>qd^RZbeil;L})6^Ku_GKL3Ymbos zP4XP$glq2R<~E!X@z4OE&YRBP)tvTl9sv3a^Yfb9qs|8L)?ci-J?d;w9{%H+TQ1Y; z`&x4N>AZ9Ed|5_o;HTKPLG)N-5gGB(-_Q$j0L{Cc$iu5mr@bYwPqNr|&v|=HbN;veC7Mc>bP9$Eoby zA7&esJqxWu-b`i9fqB-Kbwkwf_?Z^la%6IfF0!VsCl#+w>af>O^oda+`#e3?3K=$& zY59Ggg3sm#8s}r49=Ud&CGJmZp%Csq)kVSHOj`Tu=T$xvilbFU9I~3+tg9@QG4@OV z)uo&A|Qm@u`upLtP|d?>I@gZi3i&c zM}xpB1@c=G4+^9{>UwrQ7|lWTqb@szZOqZsxf(A1y6~F{zXYy#gyQW*_gmZaw#8n( z%QSTxFU{G%-wMA^7MY-4ZoBH*Rb#l>(NI1H=rY-CZKHQ?BPxtep|yH`CUmmft?$@j zxzppz>2Q{Ws|NK;5yY5t$pR+SxX`QGUIn6^KsSV8lidYiQ~A?f2E&MgWYvSXP|7+km@QO4OPre@r1<6%Ma~Xi^lZP6kLZ!7S8ZqSkijW) z11*e2W*?sAM$$bMS}ZOFH{|LbYwDt60U^ zKv7FwQ$x2sR0_oBFAmvHYIz-ls5=}anZ(O*wPN|RJzTi0UtacRX0Z4qUg5f;b`BTY zW{oP$aWRl5dGxTn-z}X69m0;uTwN$aao04L{0_}ScVBu7io0NUu^aQmL;@4c6Y2a?`|Et1vh-F=DSG0 zQiY{y%e#3DJb@iSU5s43;ulaJex~_+PZ08jEoQtP0=)5#xgDR^a;!zP$V-OHfDMkX z3l*x{Y%c{du2(p*KWB^mU0-o4pKFnP--iof#Si>+@ZCIL26zS4m#kLk(0jBAwIy?@ zgAi>Bj3uI!u+Tl4geS`1kwZT-gx-PlNek{-);em&Y$2F=7G>seFD_+sE9`y-GiE=_ z3@(Bmqd zidGO~8qcpVeg^5;M-Hg7*O%vYK=l{xW(|ihNOp>O!GKLR+MT&}ehS$&hkn<&{tX|w1w}=fVVfL27Zb@8j;PqSn5JwlQ(jr8|t8&GAePC?2CPq50ipv~3 z3S405EM9^V>YwmSyhZz^BW23=V6pVM(QZpysvb~PA04bqjNDaj&S6tRIDeiFZN#;U zWH#`^+%MXDe3ioC#%#%uJgyJMc4=)y)0)!}h@W*LmJ%!e*d%FVxKkDIsWK)`8;Ha( zGDg{*4@f-f3?b(bPrlTqk&x4xGA+lqqD`K9-QG^+;O?!H+Kw^Qi57;|1oyOR(j(E8X?V~zoiQhDm4Q*gQ{3Zh*@ zpR6>BymXUWr1qsP#16wzD85Jg+P@V9wqabEytelnC7ss$EeF=eQ?Paw1=kFL(P(A~ z&)>EV1^$2)Ybo0vk;$*o4ZS68Czw!1Z`kQzj0aE;v_}(=+`2rSPWSz(n{yT`XQ^OY z6?4*O?*xY?64?pbb0HoXdJ&6IyhSmkW8@Tb#nvx(9wVCQMHaMECh5-IWL7kh#oNi@ zmD3f%!4ug9bB;(htr`qghuNHTvQK+o@^761%(X8YC&Au#$t8pO#0Sx^(=FI?VdE*= zU{0T-<$2d~ZD*WgbmJu}!V2<&uM0Tdw$tiHT-WVW|3diS>6i|*Z+jNtde3W5^CN$! zwJ+-yCWusPcII1!?ia4Cd0n}K*Q;0u-3429Id0ia0_OtXa(W0~W`6&L)4%f0h~kXi zn5a2k^k2rQiwb0CGq&`q4wg^clLjYe`iMWnIR7D+W_?VV=9DL!Cuy4Te#S|d&(G&= zW$LA-5lX5m%b-mK-#rZnuBt^`-O4peop zk2*WGdSUkkiyg@-^@Rz-rBKh>d%qo4^6t36rqi4rI^um(xp}ZQ5IoHHH%urJN4c({ zy41~)EC3EY<*%hRUqtt)xSvV#=5L5<#5T?miBS-y4xVEWPiBs0E24UO<`h)o&MVwq zPDz6ETP(S_7cVt$HJnPW@eFk)%}Os@xsM zQ>2LGDlHdo(jM=GKhx~m%{pyXDZJiDHXA-X;+QT-9lL8$SvHVHs2$@->?{QZM>#Zn zcV^6N1le_Ctb~2Q8kE2<-D8?|h0=~CF&no`nMh{1N;aYR_G}@rzb9GgrdFdAYqiAr zz}?Z>`oP{jziVQXZ*Qj)C)_SPUN;GpS6$83u?Y97E_kSks#0U6)Ja%vON(oQC9%6N z2Fgv)Y8iCU_o+snrg_<&Yol2X6?hn}B zcp9{7Kl4TsMC>DPp=L;+u$@Ms`fFYOzhU0-VO{>c77wo<{k$&!UWi@>s>0uFDfY%V~E#XDKy+xdKu@7 z=+WC2Idpn?%ZI+rfuM2z;=P-X90;0+U%Yqop=&6<{~#awHV1-m9?FNl&5aEX0FeWS z%qBz@z8^1+j#u9nCzp;?O4j;* zmw??ob6{;=qDcLwPn-dd{y{M3`HY}{`CZGWcbRkq>Pzn`)GzhT_s}o*w?h3ZkL@x& z=SOgU`&hRIB15g&s8q}T{cqrS(U1B==9oXnSbiP{!*e_NvZA}tR|SdC%(H*5Gi*GS zg^yAU6GC<26pU&#RD>_3=&p;FOF?p2^R`}I!jm%?Y~c^hqMwMA+C%rNabZ|Sm9%#2 zGpQNlP2h%ED{y?~ed!TZRSKU`yl{QVbj>>axxeE9_&d&e%w-#=Jy z{pEGMuj{S!kJgDRy>T10U(5O9}JA@#|PvAkK3s++nmQshpvyXm^6@8nV#;x49qa zYoCLx3!mQ)1g$wd-Phi~_1?k#`c>{`7a<@tCnd?-oHdl(Y&!VMn@ujXT z`HN9yts+Fs+JgGQNbg`1Rm*8tqK(9D21u-19+HI7EOoQGxc+G0jtycH7XqsH02^$Y zJq`T3adtM<@`3G?R|a<0D`yO8G0*ex3voCSIaE*feSBkAVt;pmEfRqmyW_<^C81n; ziFQV}(M~%n`vUAZA6hrW2g@T8i(eDSLc6AiPLlX^K*w}R29kPhDz~Ec}WmEF6Tjs0qlD;D}^;(F0M|5~98Z2O$ZAU}c`D9SCU1 zK1m+qF^XWua?g9Fqi%4=UtuOiGE1+g)Bbp7mKuj_$1?}<0yQu$NJx6;!ns$eJtjMw z@7uGJOkt>NtMqs@XnXSgVy8nmPh3FHG5dXZYy3F}TUp7`%J)6fUsE9+80;`Ce1_|Z z0`QPsqc_=I*?XeiR%nu%L!ZK ziz6*>xyFL*^WaU#)tTGmn<7l6MSK=~WrwkEEH{xsqG- j7ZA7l9SbJF3v=Gls~v=2Y!QC{xRn13MM2HDH`@aMEZ(Ni diff --git a/FF1Blazorizer/output/wwwroot/images/tooltips/RandomizeClassInnateMagicCheckBox.png b/FF1Blazorizer/output/wwwroot/images/tooltips/RandomizeClassInnateMagicCheckBox.png deleted file mode 100644 index 036edf2b4c36046cac7329e830ed13a6a2e78f8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1781 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
Sleep
+ Player Wake HP RNG Range: + Enemy Wake HP RNG Range:

Spell Crafter

diff --git a/FF1Lib/Flags/Flags.cs b/FF1Lib/Flags/Flags.cs index 8ee7496cb..d900fa615 100644 --- a/FF1Lib/Flags/Flags.cs +++ b/FF1Lib/Flags/Flags.cs @@ -459,7 +459,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; 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/Randomize.cs b/FF1Lib/Randomize.cs index 3d4011427..39d5423b1 100644 --- a/FF1Lib/Randomize.cs +++ b/FF1Lib/Randomize.cs @@ -300,6 +300,7 @@ public async Task Randomize(Blob seed, Flags flags, Preferences preferenc FiendShuffle((bool)flags.FiendShuffle, rng); ScaleEnemyStats(rng, flags); ScaleBossStats(rng, flags); + ScaleSleep(rng, flags); // Encounters ZoneFormations.ShuffleEnemyFormations(rng, flags.FormationShuffleMode, flags.EnemizerEnabled); diff --git a/FF1Lib/Scale.cs b/FF1Lib/Scale.cs index 5a789a299..ea5c1cf5e 100644 --- a/FF1Lib/Scale.cs +++ b/FF1Lib/Scale.cs @@ -248,6 +248,26 @@ public int GetEvadeIntFromFlag(EvadeCapValues evadeCapFlag) return evadeCap; } + public void ScaleSleep(MT19337 rng, Flags flags) + { + // fix the enemy sleep buffer + PutInBank(0x0C,0xB1E9,Blob.FromHex("A90020AF0AAD68571004A902D007A9DF20B190A90F4CB28E")); + + if (flags.PlayerSleepScaleLow == 0 && flags.PlayerSleepScaleHigh == 80 && flags.EnemySleepScaleLow == 0 && flags.EnemySleepScaleHigh == 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/StandardMaps/FlippedMaps.cs b/FF1Lib/StandardMaps/FlippedMaps.cs index 9ddf3c111..d7fe967cb 100644 --- a/FF1Lib/StandardMaps/FlippedMaps.cs +++ b/FF1Lib/StandardMaps/FlippedMaps.cs @@ -35,15 +35,15 @@ public class FlippedMaps List ValidMaps_Vertical = new List { - MapIndex.TempleOfFiends, - MapIndex.EarthCaveB1, MapIndex.EarthCaveB2, MapIndex.EarthCaveB4, MapIndex.EarthCaveB3, MapIndex.EarthCaveB5, - MapIndex.MarshCaveB1, MapIndex.MarshCaveB2, MapIndex.MarshCaveB3, - MapIndex.IceCaveB1, MapIndex.IceCaveB2, MapIndex.IceCaveB3, - MapIndex.MirageTower1F, MapIndex.MirageTower2F, - MapIndex.SkyPalace1F, MapIndex.SkyPalace2F, MapIndex.SkyPalace3F, - MapIndex.SeaShrineB1, MapIndex.SeaShrineB2, MapIndex.SeaShrineB3, MapIndex.SeaShrineB4, MapIndex.SeaShrineB5, - MapIndex.Waterfall, - MapIndex.GurguVolcanoB1, MapIndex.GurguVolcanoB2, MapIndex.GurguVolcanoB3, MapIndex.GurguVolcanoB4, MapIndex.GurguVolcanoB5 + MapIndex.TempleOfFiends, + MapIndex.EarthCaveB1, MapIndex.EarthCaveB2, MapIndex.EarthCaveB4, MapIndex.EarthCaveB3, MapIndex.EarthCaveB5, + MapIndex.MarshCaveB1, MapIndex.MarshCaveB2, MapIndex.MarshCaveB3, + MapIndex.IceCaveB1, MapIndex.IceCaveB2, MapIndex.IceCaveB3, + MapIndex.MirageTower1F, MapIndex.MirageTower2F, + MapIndex.SkyPalace1F, MapIndex.SkyPalace2F, MapIndex.SkyPalace3F, + MapIndex.SeaShrineB1, MapIndex.SeaShrineB2, MapIndex.SeaShrineB3, MapIndex.SeaShrineB4, MapIndex.SeaShrineB5, + MapIndex.Waterfall, + MapIndex.GurguVolcanoB1, MapIndex.GurguVolcanoB2, MapIndex.GurguVolcanoB3, MapIndex.GurguVolcanoB4, MapIndex.GurguVolcanoB5 }; List mapsToFlipVertically; From fd790bae82d74247e6ec5c1ed7d5ee58ea7375a1 Mon Sep 17 00:00:00 2001 From: Douglas Kirby Date: Tue, 26 Aug 2025 08:24:17 -0400 Subject: [PATCH 44/61] Removed dupluicate crystal from KeyItems list and corrected MIAB floor counts (#1136) * removed duplicate crystal item * corrected item count for trapped chest floor --- FF1Lib/Flags/FlagsCompute.cs | 6 +++--- FF1Lib/PlacementContext.cs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/FF1Lib/Flags/FlagsCompute.cs b/FF1Lib/Flags/FlagsCompute.cs index 53e63abdf..88ee278b0 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 { @@ -258,8 +258,8 @@ public LoosePlacementMode LoosePlacementMode public int TrappedChestsFloor => 0 + ((TCShards == TCOptions.All) ? 32 : 0) - + ((TCKeyItems == TCOptions.All) ? 16 : 0) - + ((TCBetterTreasure == TCOptions.All) ? 50 : 0) + + ((TCKeyItems == TCOptions.All) ? 20 : 0) + + ((TCBetterTreasure == TCOptions.All) ? 46 : 0) + ((TCMasaGuardian == true && TCBetterTreasure != TCOptions.All) ? 1 : 0) + ((TrappedChaos == true) ? 1 : 0); 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; } From a9bf96a0c7b48a163aaea6fd8dc1883ea6d01eea Mon Sep 17 00:00:00 2001 From: Douglas Kirby Date: Tue, 26 Aug 2025 09:14:37 -0400 Subject: [PATCH 45/61] updated trapped chest counter and exclude common chests tooltips (#1137) * updated trapped chest counter and exclude common chests tooltips --- FF1Blazorizer/wwwroot/tooltips/tooltips.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FF1Blazorizer/wwwroot/tooltips/tooltips.json b/FF1Blazorizer/wwwroot/tooltips/tooltips.json index 514280bfe..2bd1fd3d5 100644 --- a/FF1Blazorizer/wwwroot/tooltips/tooltips.json +++ b/FF1Blazorizer/wwwroot/tooltips/tooltips.json @@ -1048,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", @@ -1072,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 52 chests, but 60 is selected.\nAt least the extra 8 will be ignored." }, { "Id": "tcProtectIncentivesCheckBox", From 3fbe0eff25eb21801d9f182d221a8b058ad7a35d Mon Sep 17 00:00:00 2001 From: Douglas Kirby Date: Tue, 26 Aug 2025 15:00:45 -0400 Subject: [PATCH 46/61] trapped chest shardhunt accuracy (#1138) * added check for shardhunt status to make trapped chest count more accurate --- FF1Lib/Flags/FlagsCompute.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FF1Lib/Flags/FlagsCompute.cs b/FF1Lib/Flags/FlagsCompute.cs index 88ee278b0..ab5388ff7 100644 --- a/FF1Lib/Flags/FlagsCompute.cs +++ b/FF1Lib/Flags/FlagsCompute.cs @@ -257,7 +257,7 @@ public LoosePlacementMode LoosePlacementMode + ((IncentivizeCardia ?? true) ? 1 : 0); public int TrappedChestsFloor => 0 - + ((TCShards == TCOptions.All) ? 32 : 0) + + ((ShardHunt && TCShards == TCOptions.All) ? 32 : 0) + ((TCKeyItems == TCOptions.All) ? 20 : 0) + ((TCBetterTreasure == TCOptions.All) ? 46 : 0) + ((TCMasaGuardian == true && TCBetterTreasure != TCOptions.All) ? 1 : 0) From 92d5283b8cd50533325820a155ee5be5c9b2d3a6 Mon Sep 17 00:00:00 2001 From: Franklin RN Date: Sat, 1 Nov 2025 22:40:05 -0700 Subject: [PATCH 47/61] Stream safe music DW1Fanfare Replacement (#1139) * Full test done. Everything in perfect working order. * Got things working on the code side. Now comes the hex translating part. * Almost working perfectly. Just need to get the rythms sorted and the data in * In great condition, only needs the data and the proper loop * fixed timings of things * fixed problem in pulse one missing 7 changed parity of the bytes. * made more progress, making a checkpoint here before trying to fix whatever is wrong * Song done, just need to find missalignment and make it loop * square waves finish and had fixes, triangle missing a couple beats somewhere * triangle fixed, just need a loop * Everything is done and working perfectly, final Commit and thanks to Meridian for speeding it up a little bit. --- FF1Lib/Music/NewMusic.cs | 1 + FF1Lib/Music/NewMusicData.cs | 7 +++++++ 2 files changed, 8 insertions(+) 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), From 69cf71e03074dee0bd9f97ebd3d1196740d3d149 Mon Sep 17 00:00:00 2001 From: Franklin RN Date: Wed, 5 Nov 2025 10:31:10 -0800 Subject: [PATCH 48/61] Release notes added for next release (#1140) * Creates release notes for next release. * Feature I missed added to change log * Resource Pack update included in the log --- FF1Blazorizer/Pages/WhatsNew.razor | 1897 ++++++++++++++-------------- 1 file changed, 969 insertions(+), 928 deletions(-) diff --git a/FF1Blazorizer/Pages/WhatsNew.razor b/FF1Blazorizer/Pages/WhatsNew.razor index 49b0817cf..dedc46c2c 100644 --- a/FF1Blazorizer/Pages/WhatsNew.razor +++ b/FF1Blazorizer/Pages/WhatsNew.razor @@ -1,96 +1,135 @@ -@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.8.7

    +

    New Features

    +
      +
    • Add more Fiend tile setups for Short ToFR.
    • +
    • Added TriState Flag Output.
    • +
    • Add Adjust Redmage Hit%.
    • +
    • Lefien Shortcut added.
    • +
    • Fountain Fun% added.
    • +
    • Magic Stores Menuing QoL added.
    • +
    • Resource Packs can support new NPC sprites.
    • +
    +

    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.
    • +
    • NoOveworld 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 +138,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 +149,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 +160,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.

+ +
+ + From 4bf2a309fa46976d44cd634ecaf328df23735e72 Mon Sep 17 00:00:00 2001 From: Franklin RN Date: Wed, 5 Nov 2025 20:49:45 -0800 Subject: [PATCH 49/61] Updated improved vanilla preset to match the SGLive one (#1141) * Updated improved vanilla preset to match the recent SGLive one (Thief hit% at +3) --- FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json b/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json index 510041c2a..350fc5a02 100644 --- a/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json +++ b/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json @@ -259,11 +259,11 @@ "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, @@ -289,7 +289,7 @@ "NPCSwatter": true, "BattleMagicMenuWrapAround": true, "InventoryAutosort": true, - "AutoRetargeting": false, + "AutoRetargeting": true, "EnemyStatusAttackBug": true, "ImproveTurnOrderRandomization": true, "FixHitChanceCap": false, @@ -429,7 +429,7 @@ "RandomizeFormationEnemizer": false, "GenerateNewSpellbook": false, "SpellcrafterMixSpells": false, - "ThiefHitBuff": 2, + "ThiefHitBuff": 3, "RedMageHitBuff": 2, "AllSpellLevelsForKnightNinja": false, "BuffHealingSpells": false, @@ -482,7 +482,7 @@ "KnightMaxMP": 4, "NinjaMaxMP": 4, "MpGainOnMaxGainMode": 0, - "LockMode": 3, + "LockMode": 2, "MDefMode": 0, "FormationShuffleMode": 0, "RandomizeTreasure": 0, From 62ac0cbef6bcb2ae4a4cb1b5f94e14b4cb87f2ff Mon Sep 17 00:00:00 2001 From: Entroper Date: Sat, 8 Nov 2025 19:33:09 -0500 Subject: [PATCH 50/61] rebased onto the correct dev branch --- FF1Blazorizer/Tabs/TreasuresTab.razor | 4 +- FF1Lib/FF1Text.cs | 3 +- FF1Lib/Flags/Flags.cs | 1 + FF1Lib/GlobalHacks/GlobalHacks.cs | 12 +- FF1Lib/GlobalImprovements.cs | 17 ++ FF1Lib/asm/11_B940_ChestsAppearOpened.asm | 241 ++++++++++++++++++++++ 6 files changed, 273 insertions(+), 5 deletions(-) create mode 100644 FF1Lib/asm/11_B940_ChestsAppearOpened.asm diff --git a/FF1Blazorizer/Tabs/TreasuresTab.razor b/FF1Blazorizer/Tabs/TreasuresTab.razor index 5792ac336..46041b673 100644 --- a/FF1Blazorizer/Tabs/TreasuresTab.razor +++ b/FF1Blazorizer/Tabs/TreasuresTab.razor @@ -36,7 +36,9 @@ Exclude Common Treasures Exclude Incentivized Items Trapped Chests are Marked -
+
+ + Chests Appear Opened

Freebies

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/Flags/Flags.cs b/FF1Lib/Flags/Flags.cs index 8ee7496cb..6bf09cd27 100644 --- a/FF1Lib/Flags/Flags.cs +++ b/FF1Lib/Flags/Flags.cs @@ -374,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; diff --git a/FF1Lib/GlobalHacks/GlobalHacks.cs b/FF1Lib/GlobalHacks/GlobalHacks.cs index cb2e1f72a..019bb103e 100644 --- a/FF1Lib/GlobalHacks/GlobalHacks.cs +++ b/FF1Lib/GlobalHacks/GlobalHacks.cs @@ -248,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) @@ -274,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..6e6fb19b9 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("A9112003FE4C8CB9")); + PutInBank(0x11, 0xB98C, Blob.FromHex("A645BD00622904F003A9F2602078DD48A52F186907A8A533C908D004884CB1B9C904D001C898C90F9002E90FA8A514291FC910B00E0A19E2D5850EB9F2D5850F4CDEB9290F0A19E2D5850EB9F2D50904850F20A8FEAD0220A50F8D0620A50E8D0620A97E8D0720A97F8D072020A1CC6860")); + + // 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/asm/11_B940_ChestsAppearOpened.asm b/FF1Lib/asm/11_B940_ChestsAppearOpened.asm new file mode 100644 index 000000000..08bc835c1 --- /dev/null +++ b/FF1Lib/asm/11_B940_ChestsAppearOpened.asm @@ -0,0 +1,241 @@ +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_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 8C B9 + +.ORG $B98C +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 + 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 + RTS + +; A6 45 BD 00 62 29 04 F0 03 A9 F2 60 20 78 DD 48 A5 2F 18 69 07 A8 A5 33 C9 08 D0 04 88 4C B1 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 DE 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 From e302a532aa33f24891152427b0c58f405e7bd0af Mon Sep 17 00:00:00 2001 From: Entroper Date: Mon, 10 Nov 2025 20:44:36 -0500 Subject: [PATCH 51/61] move to adjustments tab --- FF1Blazorizer/Tabs/AdjustmentsTab.razor | 3 ++- FF1Blazorizer/Tabs/TreasuresTab.razor | 2 -- FF1Blazorizer/wwwroot/presets/Beginner.json | 3 ++- FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json | 3 ++- FF1Blazorizer/wwwroot/presets/default.json | 3 ++- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/FF1Blazorizer/Tabs/AdjustmentsTab.razor b/FF1Blazorizer/Tabs/AdjustmentsTab.razor index ddce798a3..5f990c989 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/TreasuresTab.razor b/FF1Blazorizer/Tabs/TreasuresTab.razor index 46041b673..a7fd11a2e 100644 --- a/FF1Blazorizer/Tabs/TreasuresTab.razor +++ b/FF1Blazorizer/Tabs/TreasuresTab.razor @@ -37,8 +37,6 @@ Exclude Incentivized Items Trapped Chests are Marked
- - Chests Appear Opened

Freebies

diff --git a/FF1Blazorizer/wwwroot/presets/Beginner.json b/FF1Blazorizer/wwwroot/presets/Beginner.json index 9787326c1..5a2461bef 100644 --- a/FF1Blazorizer/wwwroot/presets/Beginner.json +++ b/FF1Blazorizer/wwwroot/presets/Beginner.json @@ -92,7 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, - "TriState": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": true, @@ -267,6 +267,7 @@ "AirBoat": false, "BuyTen": true, "IdentifyTreasures": true, + "ChestsAppearOpened": true, "ShopInfo": true, "ChestInfo": true, "IncentiveChestItemsFanfare": true, diff --git a/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json b/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json index 350fc5a02..ce03434ee 100644 --- a/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json +++ b/FF1Blazorizer/wwwroot/presets/Improved_Vanilla.json @@ -92,7 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, - "TriState": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": false, @@ -267,6 +267,7 @@ "AirBoat": false, "BuyTen": true, "IdentifyTreasures": true, + "ChestsAppearOpened": true, "ShopInfo": true, "ChestInfo": true, "IncentiveChestItemsFanfare": false, diff --git a/FF1Blazorizer/wwwroot/presets/default.json b/FF1Blazorizer/wwwroot/presets/default.json index 9787326c1..5a2461bef 100644 --- a/FF1Blazorizer/wwwroot/presets/default.json +++ b/FF1Blazorizer/wwwroot/presets/default.json @@ -92,7 +92,7 @@ "MaxLevelLow": 50, "MaxLevelHigh": 50, "Spoilers": false, - "TriState": false, + "TriState": false, "TournamentSafe": false, "BlindSeed": false, "Shops": true, @@ -267,6 +267,7 @@ "AirBoat": false, "BuyTen": true, "IdentifyTreasures": true, + "ChestsAppearOpened": true, "ShopInfo": true, "ChestInfo": true, "IncentiveChestItemsFanfare": true, From c27c1cc7e27bf094f912370180487a4d44ad71e2 Mon Sep 17 00:00:00 2001 From: Entroper Date: Tue, 11 Nov 2025 00:32:34 -0500 Subject: [PATCH 52/61] tooltip --- FF1Blazorizer/Tabs/AdjustmentsTab.razor | 2 +- .../images/tooltips/chestsAppearOpened.png | Bin 0 -> 6747 bytes FF1Blazorizer/wwwroot/tooltips/tooltips.json | 6 ++++++ 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 FF1Blazorizer/wwwroot/images/tooltips/chestsAppearOpened.png diff --git a/FF1Blazorizer/Tabs/AdjustmentsTab.razor b/FF1Blazorizer/Tabs/AdjustmentsTab.razor index 5f990c989..7df75d1cf 100644 --- a/FF1Blazorizer/Tabs/AdjustmentsTab.razor +++ b/FF1Blazorizer/Tabs/AdjustmentsTab.razor @@ -44,7 +44,7 @@ Faster Walking Speed Faster Ship Identify Treasures - Chests Appear Opened + Chests Appear Opened Buy Quantity Change Unrunnable RUN to WAIT Critical Hit Count diff --git a/FF1Blazorizer/wwwroot/images/tooltips/chestsAppearOpened.png b/FF1Blazorizer/wwwroot/images/tooltips/chestsAppearOpened.png new file mode 100644 index 0000000000000000000000000000000000000000..c633efe4b1b06ab979d7ece793935583811f5032 GIT binary patch literal 6747 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 E0o0c!v;Y7A literal 0 HcmV?d00001 diff --git a/FF1Blazorizer/wwwroot/tooltips/tooltips.json b/FF1Blazorizer/wwwroot/tooltips/tooltips.json index 2bd1fd3d5..2053b1583 100644 --- a/FF1Blazorizer/wwwroot/tooltips/tooltips.json +++ b/FF1Blazorizer/wwwroot/tooltips/tooltips.json @@ -2135,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", From 78dcc41f274ffaccb0f35df3322de3b3847b2994 Mon Sep 17 00:00:00 2001 From: Entroper Date: Tue, 11 Nov 2025 01:29:31 -0500 Subject: [PATCH 53/61] don't open when can't carry --- FF1Lib/GlobalImprovements.cs | 4 ++-- FF1Lib/asm/11_B940_ChestsAppearOpened.asm | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/FF1Lib/GlobalImprovements.cs b/FF1Lib/GlobalImprovements.cs index 6e6fb19b9..4369e4487 100644 --- a/FF1Lib/GlobalImprovements.cs +++ b/FF1Lib/GlobalImprovements.cs @@ -108,8 +108,8 @@ public void EnableIdentifyTreasures(DialogueData dialogues) public void EnableChestsAppearOpened() { // Open chest routine - PutInBank(0x1F, 0xCBF9, Blob.FromHex("A9112003FE4C8CB9")); - PutInBank(0x11, 0xB98C, Blob.FromHex("A645BD00622904F003A9F2602078DD48A52F186907A8A533C908D004884CB1B9C904D001C898C90F9002E90FA8A514291FC910B00E0A19E2D5850EB9F2D5850F4CDEB9290F0A19E2D5850EB9F2D50904850F20A8FEAD0220A50F8D0620A50E8D0620A97E8D0720A97F8D072020A1CC6860")); + PutInBank(0x1F, 0xCBF9, Blob.FromHex("A9112003FE4C8AB9")); + PutInBank(0x11, 0xB98A, Blob.FromHex("A645BD00622904F003A9F2602078DDC9F1F06148A52F186907A8A533C908D004884CB3B9C904D001C898C90F9002E90FA8A514291FC910B00E0A19E2D5850EB9F2D5850F4CE0B9290F0A19E2D5850EB9F2D50904850F20A8FEAD0220A50F8D0620A50E8D0620A97E8D0720A97F8D072020A1CC6860")); // Map loading routine PutInBank(0x1F, 0xCC45, Blob.FromHex("A9112003FE4C40B9")); diff --git a/FF1Lib/asm/11_B940_ChestsAppearOpened.asm b/FF1Lib/asm/11_B940_ChestsAppearOpened.asm index 08bc835c1..78cce0fff 100644 --- a/FF1Lib/asm/11_B940_ChestsAppearOpened.asm +++ b/FF1Lib/asm/11_B940_ChestsAppearOpened.asm @@ -15,6 +15,8 @@ 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 @@ -161,9 +163,9 @@ ReplaceOpenedChestTSA: JSR SwapPRG JMP WrapOpenTreasureChest -; A9 11 20 03 FE 4C 8C B9 +; A9 11 20 03 FE 4C 8A B9 -.ORG $B98C +.ORG $B98A WrapOpenTreasureChest: ; Replicate the patched out code LDX tileprop+1 ; put the chest ID in X @@ -175,6 +177,8 @@ WrapOpenTreasureChest: ; 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 @@ -233,9 +237,11 @@ WrapOpenTreasureChest: 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 48 A5 2F 18 69 07 A8 A5 33 C9 08 D0 04 88 4C B1 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 DE 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 +; 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 + From 8760aa6c8e5de04bc173e60d9a7aeb321854de9c Mon Sep 17 00:00:00 2001 From: Entroper Date: Thu, 13 Nov 2025 00:38:07 -0500 Subject: [PATCH 54/61] I _think_ I know what I'm doing --- FF1Blazorizer/Pages/WhatsNew.razor | 9 +++++---- FF1Lib/FFRVersion.cs | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/FF1Blazorizer/Pages/WhatsNew.razor b/FF1Blazorizer/Pages/WhatsNew.razor index dedc46c2c..66fe9a197 100644 --- a/FF1Blazorizer/Pages/WhatsNew.razor +++ b/FF1Blazorizer/Pages/WhatsNew.razor @@ -1,16 +1,17 @@ @page "/WhatsNew"
-

Version 4.8.7

+

Version 4.9.0

New Features

  • Add more Fiend tile setups for Short ToFR.
  • Added TriState Flag Output.
  • -
  • Add Adjust Redmage Hit%.
  • -
  • Lefien Shortcut added.
  • +
  • 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

    @@ -28,7 +29,7 @@
  • Fix LiftOff not getting called in logic when AIRBOAT + FREEAIRSHIP + FREESHIP.
  • Fix Custom Map domain import bug.
  • Fix Relocate Chest tile validation bug.
  • -
  • NoOveworld Fixes.
  • +
  • NoOverworld Fixes.
  • Fix Deep Dungeon Archipelago bugs.
  • Fix Sanity npc requirements overwriting tile requirement.
  • Fix infinite loop in shop shuffling.
  • diff --git a/FF1Lib/FFRVersion.cs b/FF1Lib/FFRVersion.cs index 5405eed65..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.7"; + 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"; From 2203f3a5ffc7b611316320d426a9ff70d5fa056f Mon Sep 17 00:00:00 2001 From: Entroper Date: Thu, 13 Nov 2025 13:14:12 -0500 Subject: [PATCH 55/61] update bank usage --- FF1Lib/BankUsageRegister.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/FF1Lib/BankUsageRegister.md b/FF1Lib/BankUsageRegister.md index 4cc025722..5375da2d3 100644 --- a/FF1Lib/BankUsageRegister.md +++ b/FF1Lib/BankUsageRegister.md @@ -38,6 +38,8 @@ Bank Offset Range Description 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 From 8fcf8ed4cec4423efd5a05f20574d88e34b5130e Mon Sep 17 00:00:00 2001 From: 1nf3rna Date: Fri, 14 Nov 2025 03:55:07 -0500 Subject: [PATCH 56/61] Format correction --- FF1Lib/BugFixes.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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")); } } From c98c84dae5676b3fac46ecc51b1c23331bb18e68 Mon Sep 17 00:00:00 2001 From: 1nf3rna Date: Fri, 14 Nov 2025 03:55:28 -0500 Subject: [PATCH 57/61] Removed extra indents --- FF1Lib/StandardMaps/FlippedMaps.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/FF1Lib/StandardMaps/FlippedMaps.cs b/FF1Lib/StandardMaps/FlippedMaps.cs index d7fe967cb..9ddf3c111 100644 --- a/FF1Lib/StandardMaps/FlippedMaps.cs +++ b/FF1Lib/StandardMaps/FlippedMaps.cs @@ -35,15 +35,15 @@ public class FlippedMaps List ValidMaps_Vertical = new List { - MapIndex.TempleOfFiends, - MapIndex.EarthCaveB1, MapIndex.EarthCaveB2, MapIndex.EarthCaveB4, MapIndex.EarthCaveB3, MapIndex.EarthCaveB5, - MapIndex.MarshCaveB1, MapIndex.MarshCaveB2, MapIndex.MarshCaveB3, - MapIndex.IceCaveB1, MapIndex.IceCaveB2, MapIndex.IceCaveB3, - MapIndex.MirageTower1F, MapIndex.MirageTower2F, - MapIndex.SkyPalace1F, MapIndex.SkyPalace2F, MapIndex.SkyPalace3F, - MapIndex.SeaShrineB1, MapIndex.SeaShrineB2, MapIndex.SeaShrineB3, MapIndex.SeaShrineB4, MapIndex.SeaShrineB5, - MapIndex.Waterfall, - MapIndex.GurguVolcanoB1, MapIndex.GurguVolcanoB2, MapIndex.GurguVolcanoB3, MapIndex.GurguVolcanoB4, MapIndex.GurguVolcanoB5 + MapIndex.TempleOfFiends, + MapIndex.EarthCaveB1, MapIndex.EarthCaveB2, MapIndex.EarthCaveB4, MapIndex.EarthCaveB3, MapIndex.EarthCaveB5, + MapIndex.MarshCaveB1, MapIndex.MarshCaveB2, MapIndex.MarshCaveB3, + MapIndex.IceCaveB1, MapIndex.IceCaveB2, MapIndex.IceCaveB3, + MapIndex.MirageTower1F, MapIndex.MirageTower2F, + MapIndex.SkyPalace1F, MapIndex.SkyPalace2F, MapIndex.SkyPalace3F, + MapIndex.SeaShrineB1, MapIndex.SeaShrineB2, MapIndex.SeaShrineB3, MapIndex.SeaShrineB4, MapIndex.SeaShrineB5, + MapIndex.Waterfall, + MapIndex.GurguVolcanoB1, MapIndex.GurguVolcanoB2, MapIndex.GurguVolcanoB3, MapIndex.GurguVolcanoB4, MapIndex.GurguVolcanoB5 }; List mapsToFlipVertically; From 1988653a2e0728ef29d3fe5374fb82522a4fc92b Mon Sep 17 00:00:00 2001 From: 1nf3rna Date: Fri, 14 Nov 2025 03:56:47 -0500 Subject: [PATCH 58/61] Removed enemy sleep change due to hard lock issue --- FF1Blazorizer/Tabs/ShopsTab.razor | 2 +- FF1Lib/Flags/Flags.cs | 8 ++++---- FF1Lib/Scale.cs | 15 ++++++++------- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/FF1Blazorizer/Tabs/ShopsTab.razor b/FF1Blazorizer/Tabs/ShopsTab.razor index d402cb861..5ec864350 100644 --- a/FF1Blazorizer/Tabs/ShopsTab.razor +++ b/FF1Blazorizer/Tabs/ShopsTab.razor @@ -56,7 +56,7 @@ Life in Battle:
    Sleep
    Player Wake HP RNG Range: - Enemy Wake HP RNG Range: + @* Enemy Wake HP RNG Range: *@

    Spell Crafter

    diff --git a/FF1Lib/Flags/Flags.cs b/FF1Lib/Flags/Flags.cs index 05f63e0de..8fb8260f2 100644 --- a/FF1Lib/Flags/Flags.cs +++ b/FF1Lib/Flags/Flags.cs @@ -461,11 +461,11 @@ 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 EnemySleepScaleLow { get; set; } = 0; - [IntegerFlag(0, 255, 1)] - public int EnemySleepScaleHigh { get; set; } = 80; + // [IntegerFlag(0, 255, 1)] + // public int EnemySleepScaleHigh { get; set; } = 80; [IntegerFlag(0, 255, 1)] public int PlayerSleepScaleLow { get; set; } = 0; diff --git a/FF1Lib/Scale.cs b/FF1Lib/Scale.cs index ea5c1cf5e..6f8980fd9 100644 --- a/FF1Lib/Scale.cs +++ b/FF1Lib/Scale.cs @@ -250,23 +250,24 @@ public int GetEvadeIntFromFlag(EvadeCapValues evadeCapFlag) } public void ScaleSleep(MT19337 rng, Flags flags) { - // fix the enemy sleep buffer - PutInBank(0x0C,0xB1E9,Blob.FromHex("A90020AF0AAD68571004A902D007A9DF20B190A90F4CB28E")); + // 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 && 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"); + // 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)); + // PutInBank(0x0C,0xB1E2,Blob.FromHex(minEnemySleep)); + // PutInBank(0x0C,0xB1E4,Blob.FromHex(highEnemySleep)); } public void ScaleEnemyStats(MT19337 rng, Flags flags) From e48279f7b52d085efd62231bba964b6ea00e6f6c Mon Sep 17 00:00:00 2001 From: 1nf3rna Date: Fri, 14 Nov 2025 09:50:35 -0500 Subject: [PATCH 59/61] Corrected MIAB floor numbers --- FF1Lib/Flags/FlagsCompute.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FF1Lib/Flags/FlagsCompute.cs b/FF1Lib/Flags/FlagsCompute.cs index ab5388ff7..5e0f64b46 100644 --- a/FF1Lib/Flags/FlagsCompute.cs +++ b/FF1Lib/Flags/FlagsCompute.cs @@ -258,8 +258,8 @@ public LoosePlacementMode LoosePlacementMode public int TrappedChestsFloor => 0 + ((ShardHunt && TCShards == TCOptions.All) ? 32 : 0) - + ((TCKeyItems == TCOptions.All) ? 20 : 0) - + ((TCBetterTreasure == TCOptions.All) ? 46 : 0) + + ((TCKeyItems == TCOptions.All) ? 16 : 0) + + ((TCBetterTreasure == TCOptions.All) ? 45 : 0) + ((TCMasaGuardian == true && TCBetterTreasure != TCOptions.All) ? 1 : 0) + ((TrappedChaos == true) ? 1 : 0); From 1b73fedb76e66705e39c714bc22d802451866145 Mon Sep 17 00:00:00 2001 From: 1nf3rna Date: Fri, 14 Nov 2025 09:53:13 -0500 Subject: [PATCH 60/61] Corrected MIAB floor count --- FF1Lib/Flags/FlagsCompute.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FF1Lib/Flags/FlagsCompute.cs b/FF1Lib/Flags/FlagsCompute.cs index 5e0f64b46..07238dd84 100644 --- a/FF1Lib/Flags/FlagsCompute.cs +++ b/FF1Lib/Flags/FlagsCompute.cs @@ -258,7 +258,7 @@ public LoosePlacementMode LoosePlacementMode public int TrappedChestsFloor => 0 + ((ShardHunt && TCShards == TCOptions.All) ? 32 : 0) - + ((TCKeyItems == TCOptions.All) ? 16 : 0) + + ((TCKeyItems == TCOptions.All) ? 21 : 0) + ((TCBetterTreasure == TCOptions.All) ? 45 : 0) + ((TCMasaGuardian == true && TCBetterTreasure != TCOptions.All) ? 1 : 0) + ((TrappedChaos == true) ? 1 : 0); From 0fad8400714ecf92cc9fe32536af4fceb464d231 Mon Sep 17 00:00:00 2001 From: 1nf3rna Date: Fri, 14 Nov 2025 09:56:58 -0500 Subject: [PATCH 61/61] Updated Tooltip --- FF1Blazorizer/wwwroot/tooltips/tooltips.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FF1Blazorizer/wwwroot/tooltips/tooltips.json b/FF1Blazorizer/wwwroot/tooltips/tooltips.json index 2053b1583..ebfb4ed3b 100644 --- a/FF1Blazorizer/wwwroot/tooltips/tooltips.json +++ b/FF1Blazorizer/wwwroot/tooltips/tooltips.json @@ -1072,7 +1072,7 @@ "Id": "tcExcludeCommonCheckBox", "title": "Exclude Common Treasures", "screenshot": "trappedChestsCheckBox.gif", - "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 52 chests, but 60 is selected.\nAt least the extra 8 will be ignored." + "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",

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 Pjv#qyWvObYNznfQ1W5tN 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 ce1e9d292..000000000 --- a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_0_Loose_3_Orbs.json +++ /dev/null @@ -1,499 +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, - - "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, - "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 1a1d40219..000000000 --- a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_E-F_Shuffle.json +++ /dev/null @@ -1,498 +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, - - "FiendShuffle": false, - "DisableTentSaving": false, - "DisableInnSaving": false, - "SaveGameWhenGameOver": true, - "SaveGameDWMode": false, - "ShuffleAstos": false, - "UnsafeAstos": false, - "RandomizeEnemizer": false, - "RandomizeFormationEnemizer": false, - "GenerateNewSpellbook": false, - "SpellcrafterMixSpells": false, - "ThiefHitBuff": 4, - "RedMageHitBuff": 2, - "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 e7848c63e..000000000 --- a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Noverworld.json +++ /dev/null @@ -1,499 +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, - "ThiefHitBuff": 4, - "RedMageHitBuff": 2, - "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 22e1aa2d2..000000000 --- a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Procgen_OW_Oops_All_Loose.json +++ /dev/null @@ -1,498 +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, - - "FiendShuffle": false, - "DisableTentSaving": false, - "DisableInnSaving": false, - "SaveGameWhenGameOver": false, - "SaveGameDWMode": false, - "ShuffleAstos": true, - "UnsafeAstos": false, - "RandomizeEnemizer": false, - "RandomizeFormationEnemizer": false, - "GenerateNewSpellbook": false, - "SpellcrafterMixSpells": false, - "ThiefHitBuff": 4, - "RedMageHitBuff": 2, - "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 c42869006..000000000 --- a/FF1Blazorizer/output/wwwroot/presets/Fall_League_-_Relay_Race.json +++ /dev/null @@ -1,498 +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, - "ThiefHitBuff": 4, - "RedMageHitBuff": 2, - "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 1c358b279..000000000 --- a/FF1Blazorizer/output/wwwroot/presets/Winter_Tournament_2024.json +++ /dev/null @@ -1,506 +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, - - "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, - "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 - } -} From 48c3000e599bcc2a4d74ea047223c903dd307ed2 Mon Sep 17 00:00:00 2001 From: Douglas Kirby Date: Sun, 24 Aug 2025 14:11:40 -0400 Subject: [PATCH 40/61] Fixing exit shop bug with magic shop QoL change (#1133) * Fixed exit shop bug in QoL Magic Shop Change --- FF1Lib/QualityOfLife.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FF1Lib/QualityOfLife.cs b/FF1Lib/QualityOfLife.cs index 48bae5d2d..408555a4b 100644 --- a/FF1Lib/QualityOfLife.cs +++ b/FF1Lib/QualityOfLife.cs @@ -72,7 +72,7 @@ public void QualityOfLifeHacks(Flags flags, Preferences preferences) public void MagicShopsMatchEquipShops() { // QoS to make magic shop function like weapon/armor shops - PutInBank(0x0E, 0xA360, Blob.FromHex("A90D205BAA2089A9B0EDA662BD00038D0C032065AA20C2A8B0DEA562D0DA20EBA49008A910205BAA4C65A320E094A5626A6A6A29C08D0A0320DFAA20CDA4AE0A03AD0B039D00634C60A3")); + PutInBank(0x0E, 0xA360, Blob.FromHex("A90D205BAA2089A9B0EDA662BD00038D0C032065AA20C2A8B0DEA562D0DA20EBA49008A910205BAA4C65A34CE094A5626A6A6A29C08D0A0320DFAA20CDA4AE0A03AD0B039D00634C60A3")); // assembly for QoS // LDA #$0D From c6d1019861ce41208ffa531142becb33ad67705f Mon Sep 17 00:00:00 2001 From: Franklin RN Date: Sun, 24 Aug 2025 14:04:26 -0700 Subject: [PATCH 41/61] Full test done. Everything in perfect working order. (#1134) --- FF1Lib/Fun.cs | 8 +++++--- FF1R/FF1R.csproj | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/FF1Lib/Fun.cs b/FF1Lib/Fun.cs index 1b389b0b8..b881103e0 100644 --- a/FF1Lib/Fun.cs +++ b/FF1Lib/Fun.cs @@ -518,13 +518,15 @@ public void ChangeFountainText(bool changeFountain, DialogueData dialogues, MT19 "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 get\na full private bath!", - "Please go to the\nordinary well to fill\nme back up." + "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[9]; //for testing + //roast = roasts[12]; //for testing dialogues[0x136] = roast; } diff --git a/FF1R/FF1R.csproj b/FF1R/FF1R.csproj index e028394c8..020ce93bc 100644 --- a/FF1R/FF1R.csproj +++ b/FF1R/FF1R.csproj @@ -17,7 +17,7 @@ - + From f7f147e403ee661d7f0ddcf024ce3e0f6726a496 Mon Sep 17 00:00:00 2001 From: Franklin RN Date: Sun, 24 Aug 2025 16:05:12 -0700 Subject: [PATCH 42/61] Grind spike tiles balance update (#1135) * Full test done. Everything in perfect working order. * Balanced the Grind spike tiles option so that the most difficult possible tile can only be in the pool if either unsafe placement is on or warmech mode = ALL --- FF1Lib/SpikeTile.cs | 81 ++++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 38 deletions(-) diff --git a/FF1Lib/SpikeTile.cs b/FF1Lib/SpikeTile.cs index 52a0e2bfc..6bbe17ab0 100644 --- a/FF1Lib/SpikeTile.cs +++ b/FF1Lib/SpikeTile.cs @@ -129,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); } } @@ -167,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) { @@ -243,40 +243,40 @@ public void ShuffleTrapTiles(ZoneFormations zoneformations, MT19337 rng, TrapTil } } else if (mode == TrapTileMode.Curated) - { - //balanced/curated mode - //this mode is really just in here so tournament organizers know that it's possible - encounters = new(FormationLists.AllRandomEncounters); - - //remove 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 - - if (fightBahamut) - { - encounters.Remove(0x80 + 0x71); // ANKYLO (used for Bahamut) - encounters.Remove(0x71); // ANKYLO (used for Bahamut) - } - } + { + //balanced/curated mode + //this mode is really just in here so tournament organizers know that it's possible + encounters = new(FormationLists.AllRandomEncounters); + + //remove 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 + + if (fightBahamut) + { + encounters.Remove(0x80 + 0x71); // ANKYLO (used for Bahamut) + encounters.Remove(0x71); // ANKYLO (used for Bahamut) + } + } else if (mode == TrapTileMode.Undead) { //all random @@ -294,7 +294,7 @@ public void ShuffleTrapTiles(ZoneFormations zoneformations, MT19337 rng, TrapTil } encounters.Add(0x01); // Bones - encounters.Add(0x01 + 0x80); // Bones and Crawls + encounters.Add(0x01 + 0x80); // Bones and Crawls encounters.Add(0x04); // Zombies encounters.Add(0x04 + 0x80); // Zombies and Ghouls @@ -361,7 +361,12 @@ public void ShuffleTrapTiles(ZoneFormations zoneformations, MT19337 rng, TrapTil //UNbalanced/curated mode //this mode is really just in here so we have the option to make spike tiles overpowered encounters = new(FormationLists.AllRandomEncounters); - encounters.Add(0x56); + + if (unsafePlacement || mechMode == WarMECHMode.All) { + encounters.Add(0x56); + } + + /* //keep the god grinds encounters.Remove(0x69); //1 eye tile. From d4785b2222c281b35d48f825283b0ae8be5c6640 Mon Sep 17 00:00:00 2001 From: 1nf3rna Date: Mon, 25 Aug 2025 20:32:48 -0400 Subject: [PATCH 43/61] beginning of making sleep relevant --- FF1Blazorizer/Tabs/ShopsTab.razor | 3 +++ FF1Lib/Flags/Flags.cs | 14 +++++++++++++- FF1Lib/MIAB.cs | 6 +++++- FF1Lib/Randomize.cs | 1 + FF1Lib/Scale.cs | 20 ++++++++++++++++++++ FF1Lib/StandardMaps/FlippedMaps.cs | 18 +++++++++--------- 6 files changed, 51 insertions(+), 11 deletions(-) diff --git a/FF1Blazorizer/Tabs/ShopsTab.razor b/FF1Blazorizer/Tabs/ShopsTab.razor index ecda872b2..d402cb861 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: +