Feature: Kielbasiago's add --start-junk flag - #7
Merged
Conversation
wrjones104
added a commit
that referenced
this pull request
Dec 19, 2022
* Adding Auto Life 3 and Auto Dog Block objective results (#36) * Stray Flash mod (#33) * Adding Osteoclave's bugfix (#29) * Adding expensive rods and super balls flags (#27) * Bugfix: Fix weapon special abilities with Capture and Multi-steals only giving 1 item (#25) * Porting Assassin's Capture bugfix * Adding Bropedio's Multi-Steal fix * Adding multi-steal dialog fix * updating flag doc * Small reduction in C1 usage * Fixing bug with -fc that causes escape from battle (and possibly other actions) to crash * Feature: Flashes: Moving flashes to Graphics; Slowing scrolling background during Air Force fight and Baren falls; add minimap high contrast option (#23) * Removing scrolling background during Air Force fight * switching to slowing the bg scroll. Also adding baren falls * Removing baren falls background vibration * Fixing typo in baren falls background palette change for frm * Changing events flashes from no-ops to flash-none to avoid any CPU cycle changes * Moving Remove Flashes flags from misc to graphics, so that they don't affect the seed * Adding -wmhc option to improve visibility of minimap * Making location indicator for wmhc stand out even more * Adding more event flashes to frw * Changing wmhc based on color feedback * Replacing boss death flash removal with flash of monster sprite * switching to Osteoclave's pixel remaster inspired minimap * Feature: Adding flags to improve Sketch/Control (#19) * Adding flag to make Sketch/Control 100% effective against valid targets * fixing minor typo * Refactoring data/sketch_control.py into separate files. Adding better abilities for Sketch & Control. Making Sketch use caster's stats. * Minor change to option logging * Modification to sketch custom command; split into multiple flags; removing control custom commands * Expanding sia to also include control. Separating Controls from Coliseum monster table. * Minor arg desc change * Control uses controller's stats, fix Control bug with Dance moves * Removing ultima from sketch magimaster * Feature: Kielbasiago's Adding flag for giving starting Espers (#18) * add --starting-espers-random flag - this will give you between the selected range of espers from the very start * fix err * Add better esper log * chore: update flag from sespr => stesp * chore: remove commented code * Remove "Random" from "Starting Espers" menu * Update starting_espers MAX to account for logic issues * ws, help updated Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * Feature: Kielbasiago's Update ability to shuffle/mix both dragons and statues (#17) * add -bmbs flag: adds statues to shuffle pool * add context for statue ids being in EnemyPacks * set default true ffor backwards compatibility * remove default as no way to turn it off * wip refactor shuffle to "boss location" flags * bug fixes * add boilerplate for adding future checks * chore: no longer appnd dragon locations to flags automatically * chore: add EOL * chore: remove unused ids from EnemyPacks * remove dbugpy code * Clean up enemy_packs.randomize_event_bosses * fix when original bosses with mixed dragon/statues * now exclude statues when not mix from normal encs * add KT bosses to condition checks (#2) Preview: https://youtu.be/wgBJHPq3p6o (Just me clearing KT while playing at 200-400%) Added the following KT boss locations as objective conditions: - Kefka's Tower Ambush - Inferno - Bit 59 - Kefka's Tower Guardian - Guardian - Bit 60 - KT Left Triad Statue - Doom - Bit 61 - KT Mid Triad Statue - Poltergeist - Bit 62 - KT Right Triad Statue - Goddess - Bit 63 ## Testing Used the following flags to test the five encounters: `-oa 40.1.1.11.59 -ob 40.1.1.11.60 -oc 40.1.1.11.61 -od 40.1.1.11.62 -oe 40.1.1.11.63` * fix initialization of exclude_bosses Co-authored-by: Nolan <10077353+nolanlocke@users.noreply.github.com> Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * Feature: Magic MP Randomization (#15) * Adding Ultima 255 MP flag, Adding Franklin's Magic MP Randomization, Fixing display bugs with 3 digit MP, letting Lore MP randomization go to 255 MP * Allowing random esper MP cost to go up to 255 * Switching max to 254 to avoid boundary conditions * making 254 max to avoid issues with MP checks * Moving from c3 to f0 * Adding --starting-level flag (#14) * QoL: Adding Rage Move descriptions to rage menu (#13) * Initial commit of Rage ability names in menu * Adding logic to display Special rage names * Adding logic for Special (0xef) attacks * Rewrite of Rage Description to use custom string table that includes more move details * More details in rage desc; handling special cases * Simplifying rage strings * Feature: Add Remove learnable spells flag + Submenus (#12) * All original remove learnable spells changes * Making Life 3 learnable in permadeath seeds * Fixing bug where Natural Magic users can learn Fire even if excluded * correcting natural magic learning with excluded commands * Fixing seed gen error when there's not enough spells available for randomization * Fixing possibility for long-branches with many submenus * Removing excluded non-S tier items from tiered or scaled chests (#11) * Ensuring that Gau can use Magic in FT (#10) * Feature: Adding random-encounters-chupon flag (#8) * Adding random-encounters-chupon flag * Making Chupon 64 sneeze always target entire party * Feature: Kielbasiago's add --start-junk flag (#7) * add --start-junk flag * Add relics to starting junk Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * QoL: Setting default config options to most commonly used values (#6) * adding comments * setting default back to Reset and adding Config 2 relocation for compatibility with DoctorDT tool * Making Party warp to Arvis house following K@N (#4) * Feature: Adding -llr flag to randomize L.x lore levels (#3) * Adding -llr flag to randomize L.x lore levels * Updating lore battle dialogs * QoL: Adding clarification of quantity of objective conditions required (#1) * Adding clarification of quantity of objective conditions required * responding to feedback on objective menu mods * Update version.py v1.1.0 -> v.1.2.0 * Update flags.py Updating to match dev branch * Update spells.py Updated to match dev branch * Feature: Making Top 4 Magitek commands an objective result (#21) * Making Terra's Magitek commands an objective result * Minor changes to address PR comments Co-authored-by: Will Jones <wrjones104@users.noreply.github.com> * Feature: Adding warp-all flag for 0 cost starting Warp (#9) * Adding warp-all flag for 0 cost starting Warp. Refactor ScanAll class to InitialSpells * Adding missed flag to log Co-authored-by: Will Jones <wrjones104@users.noreply.github.com> * Adding -hf flag to hide flags for fun mystery seeds (#2) Co-authored-by: Will Jones <wrjones104@users.noreply.github.com> * Feature: Add movement options, b-dash, sprint shoe options (#16) Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> Co-authored-by: asilverthorn <96998881+asilverthorn@users.noreply.github.com> Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> Co-authored-by: Nolan <10077353+nolanlocke@users.noreply.github.com> Co-authored-by: FF6 Worlds Collide <115676184+ff6wc@users.noreply.github.com>
asilverthorn
added a commit
that referenced
this pull request
Apr 8, 2023
* Update coliseum random to handle percentage * Remove shuffle as -crsr 0 is the same as -cos * Remove deprecated -cor and -crr flags * readd cor and crr flags * Remove removed shuffle options from options * Added as misc. options to have NPC dialog replaced with general game tips. * Adding Auto Life 3 and Auto Dog Block objective results (#36) * Stray Flash mod (#33) * Adding Osteoclave's bugfix (#29) * Adding expensive rods and super balls flags (#27) * Bugfix: Fix weapon special abilities with Capture and Multi-steals only giving 1 item (#25) * Porting Assassin's Capture bugfix * Adding Bropedio's Multi-Steal fix * Adding multi-steal dialog fix * updating flag doc * Small reduction in C1 usage * Fixing bug with -fc that causes escape from battle (and possibly other actions) to crash * Feature: Flashes: Moving flashes to Graphics; Slowing scrolling background during Air Force fight and Baren falls; add minimap high contrast option (#23) * Removing scrolling background during Air Force fight * switching to slowing the bg scroll. Also adding baren falls * Removing baren falls background vibration * Fixing typo in baren falls background palette change for frm * Changing events flashes from no-ops to flash-none to avoid any CPU cycle changes * Moving Remove Flashes flags from misc to graphics, so that they don't affect the seed * Adding -wmhc option to improve visibility of minimap * Making location indicator for wmhc stand out even more * Adding more event flashes to frw * Changing wmhc based on color feedback * Replacing boss death flash removal with flash of monster sprite * switching to Osteoclave's pixel remaster inspired minimap * Feature: Adding flags to improve Sketch/Control (#19) * Adding flag to make Sketch/Control 100% effective against valid targets * fixing minor typo * Refactoring data/sketch_control.py into separate files. Adding better abilities for Sketch & Control. Making Sketch use caster's stats. * Minor change to option logging * Modification to sketch custom command; split into multiple flags; removing control custom commands * Expanding sia to also include control. Separating Controls from Coliseum monster table. * Minor arg desc change * Control uses controller's stats, fix Control bug with Dance moves * Removing ultima from sketch magimaster * Feature: Kielbasiago's Adding flag for giving starting Espers (#18) * add --starting-espers-random flag - this will give you between the selected range of espers from the very start * fix err * Add better esper log * chore: update flag from sespr => stesp * chore: remove commented code * Remove "Random" from "Starting Espers" menu * Update starting_espers MAX to account for logic issues * ws, help updated Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * Feature: Kielbasiago's Update ability to shuffle/mix both dragons and statues (#17) * add -bmbs flag: adds statues to shuffle pool * add context for statue ids being in EnemyPacks * set default true ffor backwards compatibility * remove default as no way to turn it off * wip refactor shuffle to "boss location" flags * bug fixes * add boilerplate for adding future checks * chore: no longer appnd dragon locations to flags automatically * chore: add EOL * chore: remove unused ids from EnemyPacks * remove dbugpy code * Clean up enemy_packs.randomize_event_bosses * fix when original bosses with mixed dragon/statues * now exclude statues when not mix from normal encs * add KT bosses to condition checks (#2) Preview: https://youtu.be/wgBJHPq3p6o (Just me clearing KT while playing at 200-400%) Added the following KT boss locations as objective conditions: - Kefka's Tower Ambush - Inferno - Bit 59 - Kefka's Tower Guardian - Guardian - Bit 60 - KT Left Triad Statue - Doom - Bit 61 - KT Mid Triad Statue - Poltergeist - Bit 62 - KT Right Triad Statue - Goddess - Bit 63 ## Testing Used the following flags to test the five encounters: `-oa 40.1.1.11.59 -ob 40.1.1.11.60 -oc 40.1.1.11.61 -od 40.1.1.11.62 -oe 40.1.1.11.63` * fix initialization of exclude_bosses Co-authored-by: Nolan <10077353+nolanlocke@users.noreply.github.com> Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * Feature: Magic MP Randomization (#15) * Adding Ultima 255 MP flag, Adding Franklin's Magic MP Randomization, Fixing display bugs with 3 digit MP, letting Lore MP randomization go to 255 MP * Allowing random esper MP cost to go up to 255 * Switching max to 254 to avoid boundary conditions * making 254 max to avoid issues with MP checks * Moving from c3 to f0 * Adding --starting-level flag (#14) * QoL: Adding Rage Move descriptions to rage menu (#13) * Initial commit of Rage ability names in menu * Adding logic to display Special rage names * Adding logic for Special (0xef) attacks * Rewrite of Rage Description to use custom string table that includes more move details * More details in rage desc; handling special cases * Simplifying rage strings * Feature: Add Remove learnable spells flag + Submenus (#12) * All original remove learnable spells changes * Making Life 3 learnable in permadeath seeds * Fixing bug where Natural Magic users can learn Fire even if excluded * correcting natural magic learning with excluded commands * Fixing seed gen error when there's not enough spells available for randomization * Fixing possibility for long-branches with many submenus * Removing excluded non-S tier items from tiered or scaled chests (#11) * Ensuring that Gau can use Magic in FT (#10) * Feature: Adding random-encounters-chupon flag (#8) * Adding random-encounters-chupon flag * Making Chupon 64 sneeze always target entire party * Feature: Kielbasiago's add --start-junk flag (#7) * add --start-junk flag * Add relics to starting junk Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * QoL: Setting default config options to most commonly used values (#6) * adding comments * setting default back to Reset and adding Config 2 relocation for compatibility with DoctorDT tool * Making Party warp to Arvis house following K@N (#4) * Feature: Adding -llr flag to randomize L.x lore levels (#3) * Adding -llr flag to randomize L.x lore levels * Updating lore battle dialogs * QoL: Adding clarification of quantity of objective conditions required (#1) * Adding clarification of quantity of objective conditions required * responding to feedback on objective menu mods * Update version.py v1.1.0 -> v.1.2.0 * Update flags.py Updating to match dev branch * Update spells.py Updated to match dev branch * Feature: Making Top 4 Magitek commands an objective result (#21) * Making Terra's Magitek commands an objective result * Minor changes to address PR comments Co-authored-by: Will Jones <wrjones104@users.noreply.github.com> * Feature: Adding warp-all flag for 0 cost starting Warp (#9) * Adding warp-all flag for 0 cost starting Warp. Refactor ScanAll class to InitialSpells * Adding missed flag to log Co-authored-by: Will Jones <wrjones104@users.noreply.github.com> * Adding -hf flag to hide flags for fun mystery seeds (#2) Co-authored-by: Will Jones <wrjones104@users.noreply.github.com> * Feature: Add movement options, b-dash, sprint shoe options (#16) Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * Showing MP in menus if character knows Lore * feature: Add filtering of low value items from shops and chests. flag: -nti --no-trash-items * chore: Add gold and iron armor to trash * fix: when removing trash if item has no sell value asign chest empty. * feat: split trash filtering on shops and chests via -nts and -ntc * fix: place filter trash args to relevant parsers * fix: add new flags to options * feature: trash item price is based on vendor sell price flag * Removing clear of wound bit for coliseum in permadeath * Fixing bug with b-dash in which player can catch up to Vargas, soft-locking the game * Loot (-loot) and Chests-All-MIAB (-cam) First commit, added flags for randomize steals and drops (-loot) and make all chests monster-in-a-boxes (-cam). Note that there's currently no selection on what can be in boxes, you will get bosses. * No Random Encounters (-nre) self-explanatory. All encounter rates = 0. For use with Chests All MiaB and Loot. * bufgix - now no random encounters in dungeons * Add Moogle Curse The Moogle Curse (reskin of Moogle Charm) draws random encounters on the world map, when equipped. It does not work in dungeons. This is a workaround so you can still complete Gau and Gogo checks. The encounter rate is very low to avoid abuse. * Exclude buggy encounters Removes empty and bugged event battle groups from the MIAB encounter pool. (Doesn't currently overwrite them.) * Make each MiaB unique; take over unused event_battle_groups - Changed pad_enemy_packs to only put a single random formation in each one. This would make races fairer. - Expanded the event_battle_groups rewrite to claim those unused in FF6WC. This leaves 54 bosses, 199 single normal enemy formations (for MiaB), and 3 untouched [Zone Eater, Tier 1, Final Kefka]. * fixing small issues, as identified by Franklin and HoxNorf * Add boss% to -chests-all-monsters Now called as -cam <0--100>. The number is the percentage chance for each box to contain a boss (0 = no bosses, 100 = all bosses). * allowing 0 argument -cor * address asilverthorn's comments for PR to WC * Small Aesthetic Additions Palettes Added (10): - Alice-HoxNorf-Touhou - Alphys-LoneRedMage-Undertale - Amy-HoxNorf-Sonic - Frisk-LoneRedMage-Undertale - Gryz-HoxNorf-PS4 - Raja-HoxNorf-PS4 - Reimu (Blue)-HoxNorf-Touhou - Rune-HoxNorf-PS4 - Toriel-LoneRedMage-Undertale - Yuyuko-HoxNorf-Touhou Portraits Added (20): - Alice-HoxNorf-Touhou - Alma-Unknown-FFT - Alphys-LoneRedMage-Undertale - Amy-HoxNorf-Sonic - Cloud-JamesWhite89-FF7 - Fighter-CtrlxZ-FF1 - Frisk-LoneRedMage-Undertale - Gryz-HoxNorf-PS4 - Jessie-JamesWhite89-FF7 - Lenna (White Mage)-JamesWhite89-FF5 - Lenna-JamesWhite89-FF5 - Orlandeau-Unknown-FFT - Porom (Devout)-HoxNorf-FF4 - Raja-HoxNorf-PS4 - Ramza-Unknown-FFT - Reimu (Blue)-HoxNorf-Touhou - Rune-HoxNorf-PS4 - Sarisa-JamesWhite89-FF5 - Toriel-LoneRedMage-Undertale - Yuyuko-HoxNorf-Touhou Sprites Added (9): - Alice-HoxNorf-Touhou - Alphys-LoneRedMage-Undertale - Amy-HoxNorf-Sonic - Frisk-LoneRedMage-Undertale - Gryz-HoxNorf-PS4 - Raja-HoxNorf-PS4 - Rune-HoxNorf-PS4 - Toriel-LoneRedMage-Undertale - Yuyuko-HoxNorf-Touhou * Renamed Pirahna Plant-JamesWhite89-Mario to Piranha Plant-JamesWhite89-Mario * Change -loot to -ssd <random%> Changed the flag -loot to --shuffle-steals-drops <random%>. If random% = 0, the steals and drops table is just shuffled. if random% = 100, this recreates the original -loot. * menu bugfix Fix a problem with the menu description. * Fix menu bug 2 * Sprite Additions and "Restorations" - New Sprites/Palettes (11): Arthur-JamesWhite89-GnG Cait Sith-HoxNorf-FF7 Donkey Kong-Badass-Mario Gilius-JamesWhite89-GoldenAxe Kain (Holy Dragoon)-CtrlxZ-FF4TAY Lugae-Astaroth-FF4 Nitori-HoxNorf-Touhou Sanae-HoxNorf-Touhou Sherlotta-HoxNorf_ScarabEnigma-FFCC Wren-HoxNorf-PS4 X-Badass-Megaman - New Portraits (30): Arthur-JamesWhite89-GnG Banon-Laurel_Gens-FF6PR Cait Sith-HoxNorf-FF7 Celes-Laurel_Gens-FF6PR Cyan-Laurel_Gens-FF6PR Donkey Kong-Badass-Mario Edgar-Laurel_Gens-FF6PR Gau-Laurel_Gens-FF6PR General Leo-Laurel_Gens-FF6PR Gilius-JamesWhite89-GoldenAxe Ghost-Laurel_Gens-FF6PR Gogo-Laurel_Gens-FF6PR Imp-Laurel_Gens-FF6PR Kain (Holy Dragoon)-Unknown-FF4TAY Locke-Laurel_Gens-FF6PR Lugae-HoxNorf-FF4 Mog-Laurel_Gens-FF6PR Nitori-HoxNorf-Touhou Relm-Laurel_Gens-FF6PR Sabin-Laurel_Gens-FF6PR Sanae-HoxNorf-Touhou Setzer-Laurel_Gens-FF6PR Shadow-Laurel_Gens-FF6PR Sherlotta-HoxNorf-FFCC Strago-Laurel_Gens-FF6PR Terra-Laurel_Gens-FF6PR Umaro-Laurel_Gens-FF6PR WedgeVicks-Laurel_Gens-FF6PR Wren-HoxNorf-PS4 X-Unknown-Megaman - "Restored" Sprites/Palettes (32): Antlion-Astaroth-FF4 Atma-Astaroth-FF6 Boy-Zozma-FF6 Cagnazzo-Astaroth-FF4 Celes (Amano)-Astaroth-FF6 Celes (Opera)-Astaroth-FF6 Clyde-PocoLoco-FF6 Cultist-PocoLoco-FF6 Dancer-PocoLoco-FF6 Dark Elf-Astaroth-FF4 Draco-PocoLoco-FF6 Elena-Astaroth-FF7 Figaro Guard-PocoLoco-FF6 Interceptor-JamesWhite89-FF6 Katarin-Zozma-FF6 Link-FEOK-LegendOfZelda LoneWolf-PocoLoco-FF6 Lucca-FEOK-CT Lufia-JamesWhite89-Lufia Maduin-PocoLoco-FF6 Mini-JamesWhite89-FF NarsheGuard-PocoLoco-FF6 Peach-Halkel-SMRPG Rubicante-Astaroth-FF4 Scholar-PocoLoco-FF6 Siegfried-PocoLoco-FF6 Squall (Uniform)-SApprentice-FF8 Squall-PocoLoco-FF8 Tifa-Astaroth-FF7 Ultros-PocoLoco-FF6 Vargas-PocoLoco-FF6 Vincent-FEOK-FF7 - "Restored" Portraits (3): Golbez_TAY-HoxNorf-FF4 Link-JamesWhite89-LegendOfZelda Vincent-Xeblon-FF7 * Removed Duplicate Entries in Python Files * Gave proper credit to the Lufia and Vincent portraits * fix: Trash list update from feedback * fixing duplicate -npctips arg from merging --------- Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> Co-authored-by: Franklin <franklinjen@gmail.com> Co-authored-by: Nolan <10077353+nolanlocke@users.noreply.github.com> Co-authored-by: FF6 Worlds Collide <115676184+ff6wc@users.noreply.github.com> Co-authored-by: Will Jones <wrjones104@users.noreply.github.com> Co-authored-by: Gerard Noseworthy <gnoseworthy@gmail.com> Co-authored-by: Hans Rinderknecht <hans.rinderknecht@gmail.com> Co-authored-by: HoxNorf <45671870+HoxNorf@users.noreply.github.com>
JackQuincy
pushed a commit
to JackQuincy/WorldsCollide
that referenced
this pull request
Jan 30, 2025
* Update coliseum random to handle percentage * Remove shuffle as -crsr 0 is the same as -cos * Remove deprecated -cor and -crr flags * readd cor and crr flags * Remove removed shuffle options from options * Added as misc. options to have NPC dialog replaced with general game tips. * Adding Auto Life 3 and Auto Dog Block objective results (ff6wc#36) * Stray Flash mod (ff6wc#33) * Adding Osteoclave's bugfix (ff6wc#29) * Adding expensive rods and super balls flags (ff6wc#27) * Bugfix: Fix weapon special abilities with Capture and Multi-steals only giving 1 item (ff6wc#25) * Porting Assassin's Capture bugfix * Adding Bropedio's Multi-Steal fix * Adding multi-steal dialog fix * updating flag doc * Small reduction in C1 usage * Fixing bug with -fc that causes escape from battle (and possibly other actions) to crash * Feature: Flashes: Moving flashes to Graphics; Slowing scrolling background during Air Force fight and Baren falls; add minimap high contrast option (ff6wc#23) * Removing scrolling background during Air Force fight * switching to slowing the bg scroll. Also adding baren falls * Removing baren falls background vibration * Fixing typo in baren falls background palette change for frm * Changing events flashes from no-ops to flash-none to avoid any CPU cycle changes * Moving Remove Flashes flags from misc to graphics, so that they don't affect the seed * Adding -wmhc option to improve visibility of minimap * Making location indicator for wmhc stand out even more * Adding more event flashes to frw * Changing wmhc based on color feedback * Replacing boss death flash removal with flash of monster sprite * switching to Osteoclave's pixel remaster inspired minimap * Feature: Adding flags to improve Sketch/Control (ff6wc#19) * Adding flag to make Sketch/Control 100% effective against valid targets * fixing minor typo * Refactoring data/sketch_control.py into separate files. Adding better abilities for Sketch & Control. Making Sketch use caster's stats. * Minor change to option logging * Modification to sketch custom command; split into multiple flags; removing control custom commands * Expanding sia to also include control. Separating Controls from Coliseum monster table. * Minor arg desc change * Control uses controller's stats, fix Control bug with Dance moves * Removing ultima from sketch magimaster * Feature: Kielbasiago's Adding flag for giving starting Espers (ff6wc#18) * add --starting-espers-random flag - this will give you between the selected range of espers from the very start * fix err * Add better esper log * chore: update flag from sespr => stesp * chore: remove commented code * Remove "Random" from "Starting Espers" menu * Update starting_espers MAX to account for logic issues * ws, help updated Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * Feature: Kielbasiago's Update ability to shuffle/mix both dragons and statues (ff6wc#17) * add -bmbs flag: adds statues to shuffle pool * add context for statue ids being in EnemyPacks * set default true ffor backwards compatibility * remove default as no way to turn it off * wip refactor shuffle to "boss location" flags * bug fixes * add boilerplate for adding future checks * chore: no longer appnd dragon locations to flags automatically * chore: add EOL * chore: remove unused ids from EnemyPacks * remove dbugpy code * Clean up enemy_packs.randomize_event_bosses * fix when original bosses with mixed dragon/statues * now exclude statues when not mix from normal encs * add KT bosses to condition checks (#2) Preview: https://youtu.be/wgBJHPq3p6o (Just me clearing KT while playing at 200-400%) Added the following KT boss locations as objective conditions: - Kefka's Tower Ambush - Inferno - Bit 59 - Kefka's Tower Guardian - Guardian - Bit 60 - KT Left Triad Statue - Doom - Bit 61 - KT Mid Triad Statue - Poltergeist - Bit 62 - KT Right Triad Statue - Goddess - Bit 63 Used the following flags to test the five encounters: `-oa 40.1.1.11.59 -ob 40.1.1.11.60 -oc 40.1.1.11.61 -od 40.1.1.11.62 -oe 40.1.1.11.63` * fix initialization of exclude_bosses Co-authored-by: Nolan <10077353+nolanlocke@users.noreply.github.com> Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * Feature: Magic MP Randomization (ff6wc#15) * Adding Ultima 255 MP flag, Adding Franklin's Magic MP Randomization, Fixing display bugs with 3 digit MP, letting Lore MP randomization go to 255 MP * Allowing random esper MP cost to go up to 255 * Switching max to 254 to avoid boundary conditions * making 254 max to avoid issues with MP checks * Moving from c3 to f0 * Adding --starting-level flag (ff6wc#14) * QoL: Adding Rage Move descriptions to rage menu (ff6wc#13) * Initial commit of Rage ability names in menu * Adding logic to display Special rage names * Adding logic for Special (0xef) attacks * Rewrite of Rage Description to use custom string table that includes more move details * More details in rage desc; handling special cases * Simplifying rage strings * Feature: Add Remove learnable spells flag + Submenus (ff6wc#12) * All original remove learnable spells changes * Making Life 3 learnable in permadeath seeds * Fixing bug where Natural Magic users can learn Fire even if excluded * correcting natural magic learning with excluded commands * Fixing seed gen error when there's not enough spells available for randomization * Fixing possibility for long-branches with many submenus * Removing excluded non-S tier items from tiered or scaled chests (ff6wc#11) * Ensuring that Gau can use Magic in FT (ff6wc#10) * Feature: Adding random-encounters-chupon flag (ff6wc#8) * Adding random-encounters-chupon flag * Making Chupon 64 sneeze always target entire party * Feature: Kielbasiago's add --start-junk flag (ff6wc#7) * add --start-junk flag * Add relics to starting junk Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * QoL: Setting default config options to most commonly used values (#6) * adding comments * setting default back to Reset and adding Config 2 relocation for compatibility with DoctorDT tool * Making Party warp to Arvis house following K@N (#4) * Feature: Adding -llr flag to randomize L.x lore levels (#3) * Adding -llr flag to randomize L.x lore levels * Updating lore battle dialogs * QoL: Adding clarification of quantity of objective conditions required (#1) * Adding clarification of quantity of objective conditions required * responding to feedback on objective menu mods * Update version.py v1.1.0 -> v.1.2.0 * Update flags.py Updating to match dev branch * Update spells.py Updated to match dev branch * Feature: Making Top 4 Magitek commands an objective result (ff6wc#21) * Making Terra's Magitek commands an objective result * Minor changes to address PR comments Co-authored-by: Will Jones <wrjones104@users.noreply.github.com> * Feature: Adding warp-all flag for 0 cost starting Warp (ff6wc#9) * Adding warp-all flag for 0 cost starting Warp. Refactor ScanAll class to InitialSpells * Adding missed flag to log Co-authored-by: Will Jones <wrjones104@users.noreply.github.com> * Adding -hf flag to hide flags for fun mystery seeds (#2) Co-authored-by: Will Jones <wrjones104@users.noreply.github.com> * Feature: Add movement options, b-dash, sprint shoe options (ff6wc#16) Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * Showing MP in menus if character knows Lore * feature: Add filtering of low value items from shops and chests. flag: -nti --no-trash-items * chore: Add gold and iron armor to trash * fix: when removing trash if item has no sell value asign chest empty. * feat: split trash filtering on shops and chests via -nts and -ntc * fix: place filter trash args to relevant parsers * fix: add new flags to options * feature: trash item price is based on vendor sell price flag * Removing clear of wound bit for coliseum in permadeath * Fixing bug with b-dash in which player can catch up to Vargas, soft-locking the game * Loot (-loot) and Chests-All-MIAB (-cam) First commit, added flags for randomize steals and drops (-loot) and make all chests monster-in-a-boxes (-cam). Note that there's currently no selection on what can be in boxes, you will get bosses. * No Random Encounters (-nre) self-explanatory. All encounter rates = 0. For use with Chests All MiaB and Loot. * bufgix - now no random encounters in dungeons * Add Moogle Curse The Moogle Curse (reskin of Moogle Charm) draws random encounters on the world map, when equipped. It does not work in dungeons. This is a workaround so you can still complete Gau and Gogo checks. The encounter rate is very low to avoid abuse. * Exclude buggy encounters Removes empty and bugged event battle groups from the MIAB encounter pool. (Doesn't currently overwrite them.) * Make each MiaB unique; take over unused event_battle_groups - Changed pad_enemy_packs to only put a single random formation in each one. This would make races fairer. - Expanded the event_battle_groups rewrite to claim those unused in FF6WC. This leaves 54 bosses, 199 single normal enemy formations (for MiaB), and 3 untouched [Zone Eater, Tier 1, Final Kefka]. * fixing small issues, as identified by Franklin and HoxNorf * Add boss% to -chests-all-monsters Now called as -cam <0--100>. The number is the percentage chance for each box to contain a boss (0 = no bosses, 100 = all bosses). * allowing 0 argument -cor * address asilverthorn's comments for PR to WC * Small Aesthetic Additions Palettes Added (10): - Alice-HoxNorf-Touhou - Alphys-LoneRedMage-Undertale - Amy-HoxNorf-Sonic - Frisk-LoneRedMage-Undertale - Gryz-HoxNorf-PS4 - Raja-HoxNorf-PS4 - Reimu (Blue)-HoxNorf-Touhou - Rune-HoxNorf-PS4 - Toriel-LoneRedMage-Undertale - Yuyuko-HoxNorf-Touhou Portraits Added (20): - Alice-HoxNorf-Touhou - Alma-Unknown-FFT - Alphys-LoneRedMage-Undertale - Amy-HoxNorf-Sonic - Cloud-JamesWhite89-FF7 - Fighter-CtrlxZ-FF1 - Frisk-LoneRedMage-Undertale - Gryz-HoxNorf-PS4 - Jessie-JamesWhite89-FF7 - Lenna (White Mage)-JamesWhite89-FF5 - Lenna-JamesWhite89-FF5 - Orlandeau-Unknown-FFT - Porom (Devout)-HoxNorf-FF4 - Raja-HoxNorf-PS4 - Ramza-Unknown-FFT - Reimu (Blue)-HoxNorf-Touhou - Rune-HoxNorf-PS4 - Sarisa-JamesWhite89-FF5 - Toriel-LoneRedMage-Undertale - Yuyuko-HoxNorf-Touhou Sprites Added (9): - Alice-HoxNorf-Touhou - Alphys-LoneRedMage-Undertale - Amy-HoxNorf-Sonic - Frisk-LoneRedMage-Undertale - Gryz-HoxNorf-PS4 - Raja-HoxNorf-PS4 - Rune-HoxNorf-PS4 - Toriel-LoneRedMage-Undertale - Yuyuko-HoxNorf-Touhou * Renamed Pirahna Plant-JamesWhite89-Mario to Piranha Plant-JamesWhite89-Mario * Change -loot to -ssd <random%> Changed the flag -loot to --shuffle-steals-drops <random%>. If random% = 0, the steals and drops table is just shuffled. if random% = 100, this recreates the original -loot. * menu bugfix Fix a problem with the menu description. * Fix menu bug 2 * Sprite Additions and "Restorations" - New Sprites/Palettes (11): Arthur-JamesWhite89-GnG Cait Sith-HoxNorf-FF7 Donkey Kong-Badass-Mario Gilius-JamesWhite89-GoldenAxe Kain (Holy Dragoon)-CtrlxZ-FF4TAY Lugae-Astaroth-FF4 Nitori-HoxNorf-Touhou Sanae-HoxNorf-Touhou Sherlotta-HoxNorf_ScarabEnigma-FFCC Wren-HoxNorf-PS4 X-Badass-Megaman - New Portraits (30): Arthur-JamesWhite89-GnG Banon-Laurel_Gens-FF6PR Cait Sith-HoxNorf-FF7 Celes-Laurel_Gens-FF6PR Cyan-Laurel_Gens-FF6PR Donkey Kong-Badass-Mario Edgar-Laurel_Gens-FF6PR Gau-Laurel_Gens-FF6PR General Leo-Laurel_Gens-FF6PR Gilius-JamesWhite89-GoldenAxe Ghost-Laurel_Gens-FF6PR Gogo-Laurel_Gens-FF6PR Imp-Laurel_Gens-FF6PR Kain (Holy Dragoon)-Unknown-FF4TAY Locke-Laurel_Gens-FF6PR Lugae-HoxNorf-FF4 Mog-Laurel_Gens-FF6PR Nitori-HoxNorf-Touhou Relm-Laurel_Gens-FF6PR Sabin-Laurel_Gens-FF6PR Sanae-HoxNorf-Touhou Setzer-Laurel_Gens-FF6PR Shadow-Laurel_Gens-FF6PR Sherlotta-HoxNorf-FFCC Strago-Laurel_Gens-FF6PR Terra-Laurel_Gens-FF6PR Umaro-Laurel_Gens-FF6PR WedgeVicks-Laurel_Gens-FF6PR Wren-HoxNorf-PS4 X-Unknown-Megaman - "Restored" Sprites/Palettes (32): Antlion-Astaroth-FF4 Atma-Astaroth-FF6 Boy-Zozma-FF6 Cagnazzo-Astaroth-FF4 Celes (Amano)-Astaroth-FF6 Celes (Opera)-Astaroth-FF6 Clyde-PocoLoco-FF6 Cultist-PocoLoco-FF6 Dancer-PocoLoco-FF6 Dark Elf-Astaroth-FF4 Draco-PocoLoco-FF6 Elena-Astaroth-FF7 Figaro Guard-PocoLoco-FF6 Interceptor-JamesWhite89-FF6 Katarin-Zozma-FF6 Link-FEOK-LegendOfZelda LoneWolf-PocoLoco-FF6 Lucca-FEOK-CT Lufia-JamesWhite89-Lufia Maduin-PocoLoco-FF6 Mini-JamesWhite89-FF NarsheGuard-PocoLoco-FF6 Peach-Halkel-SMRPG Rubicante-Astaroth-FF4 Scholar-PocoLoco-FF6 Siegfried-PocoLoco-FF6 Squall (Uniform)-SApprentice-FF8 Squall-PocoLoco-FF8 Tifa-Astaroth-FF7 Ultros-PocoLoco-FF6 Vargas-PocoLoco-FF6 Vincent-FEOK-FF7 - "Restored" Portraits (3): Golbez_TAY-HoxNorf-FF4 Link-JamesWhite89-LegendOfZelda Vincent-Xeblon-FF7 * Removed Duplicate Entries in Python Files * Gave proper credit to the Lufia and Vincent portraits * fix: Trash list update from feedback * fixing duplicate -npctips arg from merging --------- Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> Co-authored-by: Franklin <franklinjen@gmail.com> Co-authored-by: Nolan <10077353+nolanlocke@users.noreply.github.com> Co-authored-by: FF6 Worlds Collide <115676184+ff6wc@users.noreply.github.com> Co-authored-by: Will Jones <wrjones104@users.noreply.github.com> Co-authored-by: Gerard Noseworthy <gnoseworthy@gmail.com> Co-authored-by: Hans Rinderknecht <hans.rinderknecht@gmail.com> Co-authored-by: HoxNorf <45671870+HoxNorf@users.noreply.github.com>
ff6wc
added a commit
that referenced
this pull request
May 29, 2026
* 1.2.2a (#51) * Add hox norf sprite submissions * Add hox norf portrait submissions * Finish adding submissions * Add Franklin's sprite submissions * v1.2.2a --------- Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * Change vanilla dialog to include gameplay tips (#52) Co-authored-by: unknown <franklinjen@gmail.com> * Adding cursed shield dialog, per doubledown's suggestion (#54) Co-authored-by: Matt Martin <mtkmartin@gmail.com> * Replace character check themes (#55) * Feature: Turn off boss music for Ultros 2 location * Feature: add -restoretheme flag Feature: add -restoreult2theme flag Feature: add song_utils and get_character_theme * Feature: implement character theme swap for 6 checks Feature: new ultros2 theme flag now respected * continue grand finale using event bit * remove unused code * fix opera house reward * fix audio menu --------- Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * Ebots rock (#56) * Increasing Ebot's Rock spotlight effect radius and tripling Coral values. * Adding flag for Ebot's Rock changes * Adding guaranteed warp to chest once you have 22 Coral * Minor documentation and code cleanup * minor fix to quantity to match Chest's check * Reverting changes except warp-to-chest --------- Co-authored-by: Matt Martin <mtkmartin@gmail.com> * Feature/coliseum opponent and reward random percents (#57) * Update coliseum random to handle percentage * Remove shuffle as -crsr 0 is the same as -cos * Remove deprecated -cor and -crr flags * readd cor and crr flags * Remove removed shuffle options from options --------- Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * Revert "Feature/coliseum opponent and reward random percents (#57)" This reverts commit a8284be. * adding top level __init__.py to allow higher level imports * Revert "Ebots rock (#56)" This reverts commit d08b469. * Small Aesthetic Additions Palettes Added (10): - Alice-HoxNorf-Touhou - Alphys-LoneRedMage-Undertale - Amy-HoxNorf-Sonic - Frisk-LoneRedMage-Undertale - Gryz-HoxNorf-PS4 - Raja-HoxNorf-PS4 - Reimu (Blue)-HoxNorf-Touhou - Rune-HoxNorf-PS4 - Toriel-LoneRedMage-Undertale - Yuyuko-HoxNorf-Touhou Portraits Added (20): - Alice-HoxNorf-Touhou - Alma-Unknown-FFT - Alphys-LoneRedMage-Undertale - Amy-HoxNorf-Sonic - Cloud-JamesWhite89-FF7 - Fighter-CtrlxZ-FF1 - Frisk-LoneRedMage-Undertale - Gryz-HoxNorf-PS4 - Jessie-JamesWhite89-FF7 - Lenna (White Mage)-JamesWhite89-FF5 - Lenna-JamesWhite89-FF5 - Orlandeau-Unknown-FFT - Porom (Devout)-HoxNorf-FF4 - Raja-HoxNorf-PS4 - Ramza-Unknown-FFT - Reimu (Blue)-HoxNorf-Touhou - Rune-HoxNorf-PS4 - Sarisa-JamesWhite89-FF5 - Toriel-LoneRedMage-Undertale - Yuyuko-HoxNorf-Touhou Sprites Added (9): - Alice-HoxNorf-Touhou - Alphys-LoneRedMage-Undertale - Amy-HoxNorf-Sonic - Frisk-LoneRedMage-Undertale - Gryz-HoxNorf-PS4 - Raja-HoxNorf-PS4 - Rune-HoxNorf-PS4 - Toriel-LoneRedMage-Undertale - Yuyuko-HoxNorf-Touhou * Renamed Pirahna Plant-JamesWhite89-Mario to Piranha Plant-JamesWhite89-Mario * Sprite Additions and "Restorations" - New Sprites/Palettes (11): Arthur-JamesWhite89-GnG Cait Sith-HoxNorf-FF7 Donkey Kong-Badass-Mario Gilius-JamesWhite89-GoldenAxe Kain (Holy Dragoon)-CtrlxZ-FF4TAY Lugae-Astaroth-FF4 Nitori-HoxNorf-Touhou Sanae-HoxNorf-Touhou Sherlotta-HoxNorf_ScarabEnigma-FFCC Wren-HoxNorf-PS4 X-Badass-Megaman - New Portraits (30): Arthur-JamesWhite89-GnG Banon-Laurel_Gens-FF6PR Cait Sith-HoxNorf-FF7 Celes-Laurel_Gens-FF6PR Cyan-Laurel_Gens-FF6PR Donkey Kong-Badass-Mario Edgar-Laurel_Gens-FF6PR Gau-Laurel_Gens-FF6PR General Leo-Laurel_Gens-FF6PR Gilius-JamesWhite89-GoldenAxe Ghost-Laurel_Gens-FF6PR Gogo-Laurel_Gens-FF6PR Imp-Laurel_Gens-FF6PR Kain (Holy Dragoon)-Unknown-FF4TAY Locke-Laurel_Gens-FF6PR Lugae-HoxNorf-FF4 Mog-Laurel_Gens-FF6PR Nitori-HoxNorf-Touhou Relm-Laurel_Gens-FF6PR Sabin-Laurel_Gens-FF6PR Sanae-HoxNorf-Touhou Setzer-Laurel_Gens-FF6PR Shadow-Laurel_Gens-FF6PR Sherlotta-HoxNorf-FFCC Strago-Laurel_Gens-FF6PR Terra-Laurel_Gens-FF6PR Umaro-Laurel_Gens-FF6PR WedgeVicks-Laurel_Gens-FF6PR Wren-HoxNorf-PS4 X-Unknown-Megaman - "Restored" Sprites/Palettes (32): Antlion-Astaroth-FF4 Atma-Astaroth-FF6 Boy-Zozma-FF6 Cagnazzo-Astaroth-FF4 Celes (Amano)-Astaroth-FF6 Celes (Opera)-Astaroth-FF6 Clyde-PocoLoco-FF6 Cultist-PocoLoco-FF6 Dancer-PocoLoco-FF6 Dark Elf-Astaroth-FF4 Draco-PocoLoco-FF6 Elena-Astaroth-FF7 Figaro Guard-PocoLoco-FF6 Interceptor-JamesWhite89-FF6 Katarin-Zozma-FF6 Link-FEOK-LegendOfZelda LoneWolf-PocoLoco-FF6 Lucca-FEOK-CT Lufia-JamesWhite89-Lufia Maduin-PocoLoco-FF6 Mini-JamesWhite89-FF NarsheGuard-PocoLoco-FF6 Peach-Halkel-SMRPG Rubicante-Astaroth-FF4 Scholar-PocoLoco-FF6 Siegfried-PocoLoco-FF6 Squall (Uniform)-SApprentice-FF8 Squall-PocoLoco-FF8 Tifa-Astaroth-FF7 Ultros-PocoLoco-FF6 Vargas-PocoLoco-FF6 Vincent-FEOK-FF7 - "Restored" Portraits (3): Golbez_TAY-HoxNorf-FF4 Link-JamesWhite89-LegendOfZelda Vincent-Xeblon-FF7 * Removed Duplicate Entries in Python Files * Gave proper credit to the Lufia and Vincent portraits * Dev updates (#67) * Update coliseum random to handle percentage * Remove shuffle as -crsr 0 is the same as -cos * Remove deprecated -cor and -crr flags * readd cor and crr flags * Remove removed shuffle options from options * Added as misc. options to have NPC dialog replaced with general game tips. * Adding Auto Life 3 and Auto Dog Block objective results (#36) * Stray Flash mod (#33) * Adding Osteoclave's bugfix (#29) * Adding expensive rods and super balls flags (#27) * Bugfix: Fix weapon special abilities with Capture and Multi-steals only giving 1 item (#25) * Porting Assassin's Capture bugfix * Adding Bropedio's Multi-Steal fix * Adding multi-steal dialog fix * updating flag doc * Small reduction in C1 usage * Fixing bug with -fc that causes escape from battle (and possibly other actions) to crash * Feature: Flashes: Moving flashes to Graphics; Slowing scrolling background during Air Force fight and Baren falls; add minimap high contrast option (#23) * Removing scrolling background during Air Force fight * switching to slowing the bg scroll. Also adding baren falls * Removing baren falls background vibration * Fixing typo in baren falls background palette change for frm * Changing events flashes from no-ops to flash-none to avoid any CPU cycle changes * Moving Remove Flashes flags from misc to graphics, so that they don't affect the seed * Adding -wmhc option to improve visibility of minimap * Making location indicator for wmhc stand out even more * Adding more event flashes to frw * Changing wmhc based on color feedback * Replacing boss death flash removal with flash of monster sprite * switching to Osteoclave's pixel remaster inspired minimap * Feature: Adding flags to improve Sketch/Control (#19) * Adding flag to make Sketch/Control 100% effective against valid targets * fixing minor typo * Refactoring data/sketch_control.py into separate files. Adding better abilities for Sketch & Control. Making Sketch use caster's stats. * Minor change to option logging * Modification to sketch custom command; split into multiple flags; removing control custom commands * Expanding sia to also include control. Separating Controls from Coliseum monster table. * Minor arg desc change * Control uses controller's stats, fix Control bug with Dance moves * Removing ultima from sketch magimaster * Feature: Kielbasiago's Adding flag for giving starting Espers (#18) * add --starting-espers-random flag - this will give you between the selected range of espers from the very start * fix err * Add better esper log * chore: update flag from sespr => stesp * chore: remove commented code * Remove "Random" from "Starting Espers" menu * Update starting_espers MAX to account for logic issues * ws, help updated Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * Feature: Kielbasiago's Update ability to shuffle/mix both dragons and statues (#17) * add -bmbs flag: adds statues to shuffle pool * add context for statue ids being in EnemyPacks * set default true ffor backwards compatibility * remove default as no way to turn it off * wip refactor shuffle to "boss location" flags * bug fixes * add boilerplate for adding future checks * chore: no longer appnd dragon locations to flags automatically * chore: add EOL * chore: remove unused ids from EnemyPacks * remove dbugpy code * Clean up enemy_packs.randomize_event_bosses * fix when original bosses with mixed dragon/statues * now exclude statues when not mix from normal encs * add KT bosses to condition checks (#2) Preview: https://youtu.be/wgBJHPq3p6o (Just me clearing KT while playing at 200-400%) Added the following KT boss locations as objective conditions: - Kefka's Tower Ambush - Inferno - Bit 59 - Kefka's Tower Guardian - Guardian - Bit 60 - KT Left Triad Statue - Doom - Bit 61 - KT Mid Triad Statue - Poltergeist - Bit 62 - KT Right Triad Statue - Goddess - Bit 63 ## Testing Used the following flags to test the five encounters: `-oa 40.1.1.11.59 -ob 40.1.1.11.60 -oc 40.1.1.11.61 -od 40.1.1.11.62 -oe 40.1.1.11.63` * fix initialization of exclude_bosses Co-authored-by: Nolan <10077353+nolanlocke@users.noreply.github.com> Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * Feature: Magic MP Randomization (#15) * Adding Ultima 255 MP flag, Adding Franklin's Magic MP Randomization, Fixing display bugs with 3 digit MP, letting Lore MP randomization go to 255 MP * Allowing random esper MP cost to go up to 255 * Switching max to 254 to avoid boundary conditions * making 254 max to avoid issues with MP checks * Moving from c3 to f0 * Adding --starting-level flag (#14) * QoL: Adding Rage Move descriptions to rage menu (#13) * Initial commit of Rage ability names in menu * Adding logic to display Special rage names * Adding logic for Special (0xef) attacks * Rewrite of Rage Description to use custom string table that includes more move details * More details in rage desc; handling special cases * Simplifying rage strings * Feature: Add Remove learnable spells flag + Submenus (#12) * All original remove learnable spells changes * Making Life 3 learnable in permadeath seeds * Fixing bug where Natural Magic users can learn Fire even if excluded * correcting natural magic learning with excluded commands * Fixing seed gen error when there's not enough spells available for randomization * Fixing possibility for long-branches with many submenus * Removing excluded non-S tier items from tiered or scaled chests (#11) * Ensuring that Gau can use Magic in FT (#10) * Feature: Adding random-encounters-chupon flag (#8) * Adding random-encounters-chupon flag * Making Chupon 64 sneeze always target entire party * Feature: Kielbasiago's add --start-junk flag (#7) * add --start-junk flag * Add relics to starting junk Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * QoL: Setting default config options to most commonly used values (#6) * adding comments * setting default back to Reset and adding Config 2 relocation for compatibility with DoctorDT tool * Making Party warp to Arvis house following K@N (#4) * Feature: Adding -llr flag to randomize L.x lore levels (#3) * Adding -llr flag to randomize L.x lore levels * Updating lore battle dialogs * QoL: Adding clarification of quantity of objective conditions required (#1) * Adding clarification of quantity of objective conditions required * responding to feedback on objective menu mods * Update version.py v1.1.0 -> v.1.2.0 * Update flags.py Updating to match dev branch * Update spells.py Updated to match dev branch * Feature: Making Top 4 Magitek commands an objective result (#21) * Making Terra's Magitek commands an objective result * Minor changes to address PR comments Co-authored-by: Will Jones <wrjones104@users.noreply.github.com> * Feature: Adding warp-all flag for 0 cost starting Warp (#9) * Adding warp-all flag for 0 cost starting Warp. Refactor ScanAll class to InitialSpells * Adding missed flag to log Co-authored-by: Will Jones <wrjones104@users.noreply.github.com> * Adding -hf flag to hide flags for fun mystery seeds (#2) Co-authored-by: Will Jones <wrjones104@users.noreply.github.com> * Feature: Add movement options, b-dash, sprint shoe options (#16) Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * Showing MP in menus if character knows Lore * feature: Add filtering of low value items from shops and chests. flag: -nti --no-trash-items * chore: Add gold and iron armor to trash * fix: when removing trash if item has no sell value asign chest empty. * feat: split trash filtering on shops and chests via -nts and -ntc * fix: place filter trash args to relevant parsers * fix: add new flags to options * feature: trash item price is based on vendor sell price flag * Removing clear of wound bit for coliseum in permadeath * Fixing bug with b-dash in which player can catch up to Vargas, soft-locking the game * Loot (-loot) and Chests-All-MIAB (-cam) First commit, added flags for randomize steals and drops (-loot) and make all chests monster-in-a-boxes (-cam). Note that there's currently no selection on what can be in boxes, you will get bosses. * No Random Encounters (-nre) self-explanatory. All encounter rates = 0. For use with Chests All MiaB and Loot. * bufgix - now no random encounters in dungeons * Add Moogle Curse The Moogle Curse (reskin of Moogle Charm) draws random encounters on the world map, when equipped. It does not work in dungeons. This is a workaround so you can still complete Gau and Gogo checks. The encounter rate is very low to avoid abuse. * Exclude buggy encounters Removes empty and bugged event battle groups from the MIAB encounter pool. (Doesn't currently overwrite them.) * Make each MiaB unique; take over unused event_battle_groups - Changed pad_enemy_packs to only put a single random formation in each one. This would make races fairer. - Expanded the event_battle_groups rewrite to claim those unused in FF6WC. This leaves 54 bosses, 199 single normal enemy formations (for MiaB), and 3 untouched [Zone Eater, Tier 1, Final Kefka]. * fixing small issues, as identified by Franklin and HoxNorf * Add boss% to -chests-all-monsters Now called as -cam <0--100>. The number is the percentage chance for each box to contain a boss (0 = no bosses, 100 = all bosses). * allowing 0 argument -cor * address asilverthorn's comments for PR to WC * Small Aesthetic Additions Palettes Added (10): - Alice-HoxNorf-Touhou - Alphys-LoneRedMage-Undertale - Amy-HoxNorf-Sonic - Frisk-LoneRedMage-Undertale - Gryz-HoxNorf-PS4 - Raja-HoxNorf-PS4 - Reimu (Blue)-HoxNorf-Touhou - Rune-HoxNorf-PS4 - Toriel-LoneRedMage-Undertale - Yuyuko-HoxNorf-Touhou Portraits Added (20): - Alice-HoxNorf-Touhou - Alma-Unknown-FFT - Alphys-LoneRedMage-Undertale - Amy-HoxNorf-Sonic - Cloud-JamesWhite89-FF7 - Fighter-CtrlxZ-FF1 - Frisk-LoneRedMage-Undertale - Gryz-HoxNorf-PS4 - Jessie-JamesWhite89-FF7 - Lenna (White Mage)-JamesWhite89-FF5 - Lenna-JamesWhite89-FF5 - Orlandeau-Unknown-FFT - Porom (Devout)-HoxNorf-FF4 - Raja-HoxNorf-PS4 - Ramza-Unknown-FFT - Reimu (Blue)-HoxNorf-Touhou - Rune-HoxNorf-PS4 - Sarisa-JamesWhite89-FF5 - Toriel-LoneRedMage-Undertale - Yuyuko-HoxNorf-Touhou Sprites Added (9): - Alice-HoxNorf-Touhou - Alphys-LoneRedMage-Undertale - Amy-HoxNorf-Sonic - Frisk-LoneRedMage-Undertale - Gryz-HoxNorf-PS4 - Raja-HoxNorf-PS4 - Rune-HoxNorf-PS4 - Toriel-LoneRedMage-Undertale - Yuyuko-HoxNorf-Touhou * Renamed Pirahna Plant-JamesWhite89-Mario to Piranha Plant-JamesWhite89-Mario * Change -loot to -ssd <random%> Changed the flag -loot to --shuffle-steals-drops <random%>. If random% = 0, the steals and drops table is just shuffled. if random% = 100, this recreates the original -loot. * menu bugfix Fix a problem with the menu description. * Fix menu bug 2 * Sprite Additions and "Restorations" - New Sprites/Palettes (11): Arthur-JamesWhite89-GnG Cait Sith-HoxNorf-FF7 Donkey Kong-Badass-Mario Gilius-JamesWhite89-GoldenAxe Kain (Holy Dragoon)-CtrlxZ-FF4TAY Lugae-Astaroth-FF4 Nitori-HoxNorf-Touhou Sanae-HoxNorf-Touhou Sherlotta-HoxNorf_ScarabEnigma-FFCC Wren-HoxNorf-PS4 X-Badass-Megaman - New Portraits (30): Arthur-JamesWhite89-GnG Banon-Laurel_Gens-FF6PR Cait Sith-HoxNorf-FF7 Celes-Laurel_Gens-FF6PR Cyan-Laurel_Gens-FF6PR Donkey Kong-Badass-Mario Edgar-Laurel_Gens-FF6PR Gau-Laurel_Gens-FF6PR General Leo-Laurel_Gens-FF6PR Gilius-JamesWhite89-GoldenAxe Ghost-Laurel_Gens-FF6PR Gogo-Laurel_Gens-FF6PR Imp-Laurel_Gens-FF6PR Kain (Holy Dragoon)-Unknown-FF4TAY Locke-Laurel_Gens-FF6PR Lugae-HoxNorf-FF4 Mog-Laurel_Gens-FF6PR Nitori-HoxNorf-Touhou Relm-Laurel_Gens-FF6PR Sabin-Laurel_Gens-FF6PR Sanae-HoxNorf-Touhou Setzer-Laurel_Gens-FF6PR Shadow-Laurel_Gens-FF6PR Sherlotta-HoxNorf-FFCC Strago-Laurel_Gens-FF6PR Terra-Laurel_Gens-FF6PR Umaro-Laurel_Gens-FF6PR WedgeVicks-Laurel_Gens-FF6PR Wren-HoxNorf-PS4 X-Unknown-Megaman - "Restored" Sprites/Palettes (32): Antlion-Astaroth-FF4 Atma-Astaroth-FF6 Boy-Zozma-FF6 Cagnazzo-Astaroth-FF4 Celes (Amano)-Astaroth-FF6 Celes (Opera)-Astaroth-FF6 Clyde-PocoLoco-FF6 Cultist-PocoLoco-FF6 Dancer-PocoLoco-FF6 Dark Elf-Astaroth-FF4 Draco-PocoLoco-FF6 Elena-Astaroth-FF7 Figaro Guard-PocoLoco-FF6 Interceptor-JamesWhite89-FF6 Katarin-Zozma-FF6 Link-FEOK-LegendOfZelda LoneWolf-PocoLoco-FF6 Lucca-FEOK-CT Lufia-JamesWhite89-Lufia Maduin-PocoLoco-FF6 Mini-JamesWhite89-FF NarsheGuard-PocoLoco-FF6 Peach-Halkel-SMRPG Rubicante-Astaroth-FF4 Scholar-PocoLoco-FF6 Siegfried-PocoLoco-FF6 Squall (Uniform)-SApprentice-FF8 Squall-PocoLoco-FF8 Tifa-Astaroth-FF7 Ultros-PocoLoco-FF6 Vargas-PocoLoco-FF6 Vincent-FEOK-FF7 - "Restored" Portraits (3): Golbez_TAY-HoxNorf-FF4 Link-JamesWhite89-LegendOfZelda Vincent-Xeblon-FF7 * Removed Duplicate Entries in Python Files * Gave proper credit to the Lufia and Vincent portraits * fix: Trash list update from feedback * fixing duplicate -npctips arg from merging --------- Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> Co-authored-by: Franklin <franklinjen@gmail.com> Co-authored-by: Nolan <10077353+nolanlocke@users.noreply.github.com> Co-authored-by: FF6 Worlds Collide <115676184+ff6wc@users.noreply.github.com> Co-authored-by: Will Jones <wrjones104@users.noreply.github.com> Co-authored-by: Gerard Noseworthy <gnoseworthy@gmail.com> Co-authored-by: Hans Rinderknecht <hans.rinderknecht@gmail.com> Co-authored-by: HoxNorf <45671870+HoxNorf@users.noreply.github.com> * Dev bugfix: Fixing dev -crr incompatibility with old flagsets (#68) * Update coliseum random to handle percentage * Remove shuffle as -crsr 0 is the same as -cos * Remove deprecated -cor and -crr flags * readd cor and crr flags * Remove removed shuffle options from options * allowing 0 argument -cor * Making -crr work with no arg --------- Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> * updating new -ssd arg Flags menu listing (#69) * Esper mastery icon into dev (#71) * adding Esper mastery flag -emi and indication * switching to new icon for complete: a star * Dev updates (#72) DoctorDT's latest for treasure_all_miab Moogle Defense peekable sprite in Open World now non-Mog * --chests-all-miab update, Moogle Defense Open World, Mobliz average level, Better enemy cures, Fixing ntc (#73) Updating to latest for --chests-all-miab Moogle defense in Open World now shows standard esper/item sprites Making higher-level cures more likely with scaled boss abilities Mobliz character now joins at average level Fixing breakage of --no-trash-chests due to earlier merge * Dev update: adding 'top' option for Remove Learnable Spells (#74) 'top' shortcut option to remove the best spells via -rls * New Aesthetic Additions New Sprites/Palettes (11): - Aria-HoxNorf-FF3 - Arle-HoxNorf-Madou - Marle-CtrlxZ-CT - Nakoruru-HoxNorf-SamSho - Noire-HoxNorf-Neptunia - Purple Sister-HoxNorf-Neptunia - Rash-JamesWhite89-Battletoads - Refia-HoxNorf-FF3 - Relm-HoxNorf-FF6PR - Simon-JamesWhite89-Castlevania - Tina-CtrlxZ-FF6 New Portraits (14): - Aria-JamesWhite89-FF3 - Arle-HoxNorf-Madou - Magus-asilverthorn-CT - Marle-CtrlxZ-CT - Nakoruru-HoxNorf-SamSho - Noire-JamesWhite89-Neptunia - Purple Sister-HoxNorf-Neptunia - Rash-JamesWhite89-Battletoads - Refia-JamesWhite89-FF3 - Santa_Olaf-asilverthorn-AW - Simon-JamesWhite89-Castlevania - Tina-CtrlxZ-FF6 - Vivi-asilverthorn-FF9 - Zidane-asilverthorn-FF9 * New Portraits by asilverthorn New Portraits (2): - Cloud-asilverthorn-Dissidia - Sephiroth-asilverthorn-Dissidia * Dev updates: adding Ebot's Rock warp to chest & New Sprites/Portraits (#75) * Restorations and Additions New Sprites/Palettes (2): - Luneth-HoxNorf-FF3 - Malin-HoxNorf-KOF New Portraits (8): - Barret-HoxNorf-FF7 - Garnet (Long Hair)-HoxNorf-FF9 - Garnet (Short Hair)-HoxNorf-FF9 - Lightning-asilverthorn-Dissidia - Luneth-JamesWhite89-FF3 - Malin-HoxNorf-KOF - Steiner-HoxNorf-FF9 - Yuffie-CtrlxZ-KH "Restored" Portraits (3): - Figaro Guard-JamesWhite89-FF6 - Simon-JamesWhite89-Castlevania - Vincent-Xeblon-FF7 * Dev updates: More Sprites/Portraits (#76) * Scale by bosses into dev (#78) * Adding Franklin's Scaling by Bosses defeated mods * increasing max allowable values for boss scaling * DoctorDT's dev updates: Fix Cid Timer Glitch + Don't add drops to final bosses (#80) * --shuffle-steals-drops: exclude drops in final battle Apparently drops in final battle will cause problems. * Add long_events; fix Cid timer glitch - Incorporated Lenophis' LongMapEvents code - Added long_event tiles to Outside Cid's House to reset the Cid health timer if you exit to the World Map. * Dev Update: Max AH espers + Osteoclave's Alternate Healing Text Color (#81) * Adding Osteoclave's change for Alternate (easier to read) healing text color * Adding auction-max-espers flag to be able to limit AH espers even without NFCE * New Portraits by Jones and Gens New Portraits (14): - Bartz-metalliguy_Gens-FF5 - Celes-Jones-FF6 - Chocobo-metalliguy_Gens-FF5 - Edgar-Jones-FF6 - Faris-metalliguy_Gens-FF5 - Galuf-metalliguy_Gens-FF5 - Gau-Jones-FF6 - Krile-metalliguy_Gens-FF5 - Lenna-metalliguy_Gens-FF5 - Locke-Jones-FF6 - Relm-Jones-FF6 - Sabin-Jones-FF6 - Terra-Jones-FF6 - Umaro-Jones-FF6 * New Portraits for dev (#82) * New Portraits by Jones and Gens New Portraits (14): - Bartz-metalliguy_Gens-FF5 - Celes-Jones-FF6 - Chocobo-metalliguy_Gens-FF5 - Edgar-Jones-FF6 - Faris-metalliguy_Gens-FF5 - Galuf-metalliguy_Gens-FF5 - Gau-Jones-FF6 - Krile-metalliguy_Gens-FF5 - Lenna-metalliguy_Gens-FF5 - Locke-Jones-FF6 - Relm-Jones-FF6 - Sabin-Jones-FF6 - Terra-Jones-FF6 - Umaro-Jones-FF6 --------- Co-authored-by: HoxNorf <45671870+HoxNorf@users.noreply.github.com> * New Sprites and Filling in Portraits New Sprites/Palettes (3): - Blaze-HoxNorf-Sonic - Toadette (Explorer)-HoxNorf-Mario - Xion-Kzinssie-KH New Portraits (6): - Blaze-HoxNorf-Sonic - Gau (Suit)-Tsushiy_Gens-FF6 - Gerad-Tsushiy_Gens-FF6 - Toadette (Explorer)-HoxNorf-Mario - Tohka-HoxNorf-DAL - Xion-Kzinssie-KH * Dev updates: Adding Dragons to defeated boss scaling. Updating MIAB randomization to include % of chests. Removing no-trash-chests/no-trash-shops (#83) * replacing bosses-only scaling option with Bosses + Dragons option * reworking chest-all-monsters to be a random percent of the chests * New Sprites and Filling in Portraits New Sprites/Palettes (3): - Blaze-HoxNorf-Sonic - Toadette (Explorer)-HoxNorf-Mario - Xion-Kzinssie-KH New Portraits (6): - Blaze-HoxNorf-Sonic - Gau (Suit)-Tsushiy_Gens-FF6 - Gerad-Tsushiy_Gens-FF6 - Toadette (Explorer)-HoxNorf-Mario - Tohka-HoxNorf-DAL - Xion-Kzinssie-KH * updating dev version and indenting Boss percent * reverting 'feature: filter low value items' --------- Co-authored-by: Hans Rinderknecht <hans.rinderknecht@gmail.com> Co-authored-by: HoxNorf <45671870+HoxNorf@users.noreply.github.com> * Bugfix: Fixing loss of objective +/- stats for unrecruited characters when playing moogle defense (#84) * not swapping stats with moogles to avoid losing objective stat gains * Minor change: leaving AH dialog vanilla with npctips (#85) * Leave dialog 2640 vanilla, as it's used in auction * Feature: Auto Overcast objective result (#86) * Adding Auto Overcast objective result * Bugfix: -chrm remove formations & zoneeater stomach (#87) - Added 58 to unused_battle_event_groups: this is an unused story battle vs Lv60 Magic. - Added 115 to unused_battle_event_groups. This is Terra's flashback battle with 3x Soldier. - Removed the three chests from the Zone Eater crush room from the MIAB pool. These cause a graphical glitch with the ceiling if you MIAB them (MIAB works fine) * Dev updates (#88) * Removing No Random Encounters; adding more vanilla events to unused group * Dev updates (#89) * Making Audio changes to match recruited character the default and non-optional * adding log output for ahtc * Updating version for official 1.3 (#90) * prepping official 1.3 release * New Aesthetic Additions New Palettes (10): - Cleon (Player 1)-HoxNorf-PB4 - Cleon (Player 2)-HoxNorf-PB4 - Doom Guy-JamesWhite89-Doom - Koishi-HoxNorf-Touhou - Lenna (Dancer)-HoxNorf-FF5 - Lenna (Ranger)-HoxNorf-FF5 - Lenna (Time Mage)-HoxNorf-FF5 - Ness-Badass-Mother - Satori-HoxNorf-Touhou - Tohka (Spirit)-HoxNorf-DAL New Portraits (11): - Bubble Dragon-Peebs-BB - Cleon-HoxNorf-PB4 - Doom Guy-JamesWhite89-Doom - Koishi-HoxNorf-Touhou - Lenna (Dancer)-JamesWhite89-FF5 - Lenna (Ranger)-JamesWhite89-FF5 - Lenna (Time Mage)-JamesWhite89-FF5 - Ness-Unknown-Mother - Reimu3-HoxNorf-Touhou - Satori-HoxNorf-Touhou - Tohka (Spirit)-HoxNorf-DAL New Sprites (9): - Cleon-HoxNorf-PB4 - Doom Guy-JamesWhite89-Doom - Koishi-HoxNorf-Touhou - Lenna (Dancer)-HoxNorf-FF5 - Lenna (Ranger)-HoxNorf-FF5 - Lenna (Time Mage)-HoxNorf-FF5 - Ness-Badass-Mother - Satori-HoxNorf-Touhou - Tohka (Spirit)-HoxNorf-DAL * 1.3.1 Dev updates -- MIAB bug fix, New Status objective results, HoxNorf graphics (#93) * Adding Auto Clear, Dark, and Imp objective results * New Aesthetic Additions New Palettes (10): - Cleon (Player 1)-HoxNorf-PB4 - Cleon (Player 2)-HoxNorf-PB4 - Doom Guy-JamesWhite89-Doom - Koishi-HoxNorf-Touhou - Lenna (Dancer)-HoxNorf-FF5 - Lenna (Ranger)-HoxNorf-FF5 - Lenna (Time Mage)-HoxNorf-FF5 - Ness-Badass-Mother - Satori-HoxNorf-Touhou - Tohka (Spirit)-HoxNorf-DAL New Portraits (11): - Bubble Dragon-Peebs-BB - Cleon-HoxNorf-PB4 - Doom Guy-JamesWhite89-Doom - Koishi-HoxNorf-Touhou - Lenna (Dancer)-JamesWhite89-FF5 - Lenna (Ranger)-JamesWhite89-FF5 - Lenna (Time Mage)-JamesWhite89-FF5 - Ness-Unknown-Mother - Reimu3-HoxNorf-Touhou - Satori-HoxNorf-Touhou - Tohka (Spirit)-HoxNorf-DAL New Sprites (9): - Cleon-HoxNorf-PB4 - Doom Guy-JamesWhite89-Doom - Koishi-HoxNorf-Touhou - Lenna (Dancer)-HoxNorf-FF5 - Lenna (Ranger)-HoxNorf-FF5 - Lenna (Time Mage)-HoxNorf-FF5 - Ness-Badass-Mother - Satori-HoxNorf-Touhou - Tohka (Spirit)-HoxNorf-DAL * bugfix for extra MIAB chests -- removing additional unused event battles --------- Co-authored-by: HoxNorf <45671870+HoxNorf@users.noreply.github.com> * Formalizing 1.3.1 (#95) Update version to 1.3.1 * 1.3.1 * add Lone Wolf & Tzen checks to NFP * 1.4 dev (#109) #108 (Ironmog Mode flag -- asilverthorn) #107 (Added flags for tiered equipable equipment and tiered equipable relics -- doubledown) #106 (Added flag to customize list of potential item rewards from checks -- doubledown) #105 (Indicate flag differences from standard in logs -- some changes, but user-facing changes are disabled -- asilverthorn) #103 (Improve events.py error message -- Overswarm) #102 (Split esper spells flags into separate flags for spells and learn rate -- doubledown) #101 (Throwable and Restoratives objectives -- doubledown) #94 (Add BC's nicer poison mod to reduce pixelation while moving -- note that it's always on now -- franklin) #104 (Add Mt. Zozo and Lone Wolf to NFP -- TheShwantz27) Other changes: - Updated README.md with new links - Added documentation from AtmaTek for posterity - Made Lone Wolf character reward play the characters theme, Updated Terra's theme to "Terra's Theme" from "Awakening", and fixed the Relm's theme playing at the end of Owzer's mansion if it's a different character - Version = 1.4d --------- Co-authored-by: Franklin Jen <franklinjen@gmail.com> Co-authored-by: dbldown11 <45882117+dbldown11@users.noreply.github.com> Co-authored-by: Overswarm <evandowning@gmail.com> Co-authored-by: Brian - TheShwantz27 <briguy7727@yahoo.com> * remove Tzen Thief, add Mt Zozo to NFP setting * New Aesthetic Additions * New Portraits (6) - Daryl-IvaarForkbeard-FF6 - Eirin-HoxNorf-Touhou - Riku-HoxNorf-KH - Suika-HoxNorf-Touhou - Umaro (Morph)-CDude-FF6 - Yamame-HoxNorf-Touhou * New Sprites/Palettes (5): - Daryl-IvaarForkbeard_Odbarc-FF6 - Eirin-HoxNorf-Touhou] - Riku-HoxNorf-KH - Suika-HoxNorf-Touhou - Yamame-HoxNorf-Touhou * 1.4 Dev Part 2 (#113) Removing the L. from "Remove L. Spells" to avoid confusion Latest from Added flag to customize list of potential item rewards from checks #106 Deprecate "Random RNG (-rr)" flag #112 Deprecate "Randomize Clock (-rc)" flag #111 Adding “High Tier Weapon”, “High Tier Armor”, “High Tier Shld”, “High Tier Helm”, “High Tier Relic” as results Increasing poison blur based on feedback that earlier change went too far Latest sprites & portraits (thanks HoxNorf) --------- Co-authored-by: HoxNorf <45671870+HoxNorf@users.noreply.github.com> Co-authored-by: dbldown11 <45882117+dbldown11@users.noreply.github.com> * Eliminating in-game RNG in fixed encounters (#114) * Initial development to reduce fixed encounter RNG, such that each runner in a seed encounters the same fixed encounters. Added documentation to better cross-reference with FF6Tools and set up every Fixed Encounter to be identical regardless of RNG. * Modifying Lete River Fixed Battle locations to reduce in-seed RNG * adding greater encounter variety to serpent trench * switching 2 opera house rat encounters to alternate pack * adding a second encounter possibility to imperial air force * adding a guaranteed fixed encounter to half of BH flames * updating dev version since these changes are significant * correcting bug with -debug flag due to it adding NPCs by setting aside additional free space for NPCs. Added an assert to capture this bug in the future * adding additional asserts to other classes that can grow beyond their space to catch difficult-to-find bugs during seed gen * Last Few Aesthetic Additions New Sprites/Palettes (8): - Samus-Badass-Metroid - Ridley-JamesWhite89-Metroid - Marth-HoxNorf-FE - Bartz (Knight)-HoxNorf-FF5 - Lenna (Knight)-HoxNorf-FF5 - Lenna (Thief)-HoxNorf-FF5 - Lenna (Summoner)-HoxNorf-FF5 - Lenna (Beastmaster)-HoxNorf-FF5 New Portraits (7): - Samus-Unknown-Metroid - Ridley-JamesWhite89-Metroid - Marth-HoxNorf-FE - Lenna (Knight)-JamesWhite89-FF5 - Lenna (Thief)-JamesWhite89-FF5 - Lenna (Summoner)-JamesWhite89-FF5 - Lenna (Beastmaster)-JamesWhite89-FF5 * Finalize 1.4.0 * fix bug with Phoenix Cave & KT skip for mid path * fix bug with Phoenix Cave & KT skip for mid path * Dev 1.4.1 (#119) * 1.4.1 (#118) * fix bug with Phoenix Cave & KT skip for mid path --------- Co-authored-by: Brian - TheShwantz27 <briguy7727@yahoo.com> * 1.4.2 * moving KT non-checks to quests; adding AH checks to check objective list; eliminating lines for 'All 1 of' objectives * Update arguments.py allow for -o to handle directories. (gives the default filename at the specified directory if no filename is given) * New Aesthetic Update New Sprites/Palettes (9): - Flowey-pomariin-Undertale - Kirby-HoxNorf-Kirby - Miko-HoxNorf-Touhou - Mokou-HoxNorf-Touhou - Purple Heart-HoxNorf-Touhou - Reimu (PC98)-HoxNorf-Touhou - Shulk-HoxNorf-Xenoblade - Toadette (Sailor)-HoxNorf-Mario - Youmu-HoxNorf-Touhou Updated Sprites (4): - Hotaru-HoxNorf-MOTW - Peach-Halkel-SMRPG - Toadette (Explorer)-HoxNorf-Mario - Toadette-HoxNoed-Mario New Portraits (9): - Flowey-pomariin-Undertale - Kirby-Unknown-Kirby - Miko-HoxNorf-Touhou - Mokou-HoxNorf-Touhou - Purple Heart-HoxNorf-Touhou - Reimu (PC98)-HoxNorf-Touhou - Shulk-HoxNorf-Xenoblade - Toadette (Sailor)-HoxNorf-Mario - Youmu-HoxNorf-Touhou Removed Portraits (1): - Wolf-JamesWhite89-Startfox (unneeded duplicate due to a typo of Wolf-JamesWhite89-Starfox) * New Additions * New Sprites/Palettes (2): - Meiling-HoxNorf-Touhou - Olimar-HoxNorf-Pikmin * New Portraits (2): - Meiling-HoxNorf-Touhou - Olimar-HoxNorf-Pikmin * update Coliseum display for shuffle+random * update Coliseum display for shuffle+random, include %s * update display for Coliseum opponents & rewards * More Additions * New Sprites/Palettes (4): - Alys-HoxNorf-PS4 - Chaz-HoxNorf-PS4 - Tao-HoxNorf-Shining - Tycoon-HoxNorf-FF5 * New Portraits (4): - Alys-HoxNorf-PS4 - Chaz-HoxNorf-PS4 - Tao-HoxNorf-Shining - Tycoon-metalliguy_Gens-FF5 * More Additions for Graphics * New Sprites/Palettes (5): - Demi-HoxNorf-PS4 - Falco-Badass-Starfox - Fox-CtrlxZ-Starfox - Lutz-HoxNorf-PS1 - Yukari-HoxNorf-Touhou * New Portraits (5): - Demi-HoxNorf-PS4 - Falco-JamesWhite89-Starfox - Fox-JamesWhite89-Starfox - Lutz-HoxNorf-PS1 - Yukari-HoxNorf-Touhou * Fixing bug where multiple items can be received from PT reward * Removing Mt. Zozo from No Free Characters/Espers (reverting 1.4.0) due to it breaking 100% seeds * Adding -scan to output logs when set * Removing debug output and increasing version * Removed chance of Dried Meat being placed in Figaro Castle WOR shops * Removed reference to depreciated code from Phantom Train check and expanded -sdm input range * Supporting newer versions of python * switching from list to sorted to ensure deterministic behavior. Thanks beauxq * New Aesthetic Additions (1.4.3) New Sprites/Palettes (6): - Bartz (Dancer)-HoxNorf-FF5 - Bow-HoxNorf-Mario - Ike (Ranger)-HoxNorf-FE - Marisa2-HoxNorf-Touhou - Megumin-HoxNorf-Konosuba - Tewi-HoxNorf-Touhou Updated Sprites/Palettes (1): - Iffy-HoxNorf-Neptunia New Portraits (4): - Bow-HoxNorf-Mario - Ike (Ranger)-HoxNorf-FE - Megumin-HoxNorf-Konosuba - Tewi-HoxNorf-Touhou * prevent random boss + Unlock Kefka requirements from softlocks * prevent random boss + Unlock Kefka requirements from softlocks * prevent random boss + Unlock Kefka requirements from softlocks * prevent random boss + Unlock Kefka requirements from softlocks * Adding Flags to Shuffle Drops and Shuffle Steals Separately (#134) * adding flags to shuffle shops and shuffle steals separately * PR feedback * More PR Feedback --------- Co-authored-by: jazer <jazer2187@gamil.com> * Rizopas custom timer (#132) * customizable Rizopas timer * just use the new args. They are given default values anyways --------- Co-authored-by: jazer <jazer2187@gamil.com> * Generic starting items (#133) * Adding flag for generic starting items * Getting ready to deprecate old starting item flags * PR feedback * PR feedback * fix items that roll 0 * Fixing issue from another branch * Allow 100 different stacks of items to be added * 100 caused issues in the menu back down to 30 --------- Co-authored-by: jazer <jazer2187@gamil.com> * add agents.md and llsm.md * increment version * updates per PR review * Revert rizopas timer (#146) * Revert "Rizopas custom timer (#132)" This reverts commit fd50e5f. * update max rizopas time to be 15 seconds --------- Co-authored-by: jazer <jazer2187@gamil.com> * Feature/update config trampoline (#149) * Update config.py Add Config byte 4 (Player 2 controlled characters) to configuration trampoline to allow command-line configuration using ff6_config.py * Update settings/config.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --------- Co-authored-by: Will Jones <wrjones104@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --------- Co-authored-by: FF6 Worlds Collide <115676184+ff6wc@users.noreply.github.com> Co-authored-by: Kiel <95580337+kielbasiago@users.noreply.github.com> Co-authored-by: unknown <franklinjen@gmail.com> Co-authored-by: Matt Martin <mtkmartin@gmail.com> Co-authored-by: asilverthorn <96998881+asilverthorn@users.noreply.github.com> Co-authored-by: HoxNorf <45671870+HoxNorf@users.noreply.github.com> Co-authored-by: Nolan <10077353+nolanlocke@users.noreply.github.com> Co-authored-by: Gerard Noseworthy <gnoseworthy@gmail.com> Co-authored-by: Hans Rinderknecht <hans.rinderknecht@gmail.com> Co-authored-by: Hans Rinderknecht <hgr@mit.edu> Co-authored-by: Brian - TheShwantz27 <briguy7727@yahoo.com> Co-authored-by: dbldown11 <45882117+dbldown11@users.noreply.github.com> Co-authored-by: Overswarm <evandowning@gmail.com> Co-authored-by: Brian - TheShwantz27 <106110257+BriGuy7727@users.noreply.github.com> Co-authored-by: rblakedavis <48291641+rblakedavis@users.noreply.github.com> Co-authored-by: Jack <JackQuincy@users.noreply.github.com> Co-authored-by: jazer <jazer2187@gamil.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
wrjones104
added a commit
that referenced
this pull request
Jul 23, 2026
* Base Narshe school clues on rooms actually mapped to each branch
ruin_map.AreasUsed records the branch an area was distributed to, but
distribution skips rooms already claimed by another branch (via
forced_same_branch, shared rooms, or the CHARACTER_AREAS['ALL'] pass).
That could tag a branch with an area whose rooms live elsewhere,
producing misleading Narshe school clues (e.g. a Coliseum clue on a
branch with no Coliseum room).
Add ruination_map.compute_actual_areas_used(), which scans each
branch's all_rooms_added against RUIN_ROOM_SETS and returns the branch
holding the most of each area's rooms. events.ruination_mod() now uses
this to populate args.ruination_areas_used.
* Count only reachable rooms when inferring branch area assignments
finalize_map only guarantees the hub has no dangling exits — non-hub
rooms may remain unconnected after finalization. Counting every entry
of branch.all_rooms_added could therefore credit a branch with area
rooms that were added but never became reachable.
Use the hub's compound ID as the connectivity oracle: compress_loop
joins merged IDs with '_', so a room R is reachable iff '_R_' is a
substring of the bracketed hub ID. The underscore boundaries avoid
false substring hits (78 vs 278, 501 vs 1501) and handle IDs that
already contain underscores (share_east, ruin_hub_0).
* Update doma_wob.py
Revert doma wob entrance_door_patch
* Extract party interaction pointer-set as shared Bank.CA subroutine
Write the per-character NPC pointer-rebinding code once at the end of
create_party_interaction_scripts and expose its address as
SET_PARTY_INTERACTION_POINTERS. NarsheWob's school entrance event now
invokes it via field.Call instead of inlining the full body, and
EsperWorld.cleanup_esper_world uses it as the entrance event for the
three repurposed esper-world maps.
* Make Serpent Trench fixed battles probabilistic on repeat runs (ruin)
In ruination mode the player can be forced to redo parts of the Serpent
Trench animation. The seven fixed battles are grouped into five segments;
each segment now has a tracking bit (0x3ad-0x3b1) so its battles fire
unconditionally on the first run through the segment and only with
probability RUINATION_REPEAT_BATTLE_PROBABILITY (0.25) on later runs.
The animation is a vehicle script and that opcode set has no random-branch
primitive, so the probability roll runs in a small field-mode pre-script
that executes once before the animation. For each segment it either leaves
the done bit set (skip the battles) or clears it (fight them); the
vehicle-side battles then check the bit to decide whether to fire, and the
last battle in each segment re-sets it.
The vehicle-script battle sites are 3-byte 'CF pack bg' invocations packed
between 2-byte movement opcodes, so a 6-byte conditional branch will not
fit inline. Each site is replaced with an unconditional branch to a
per-battle custom block in Bank CA that performs the bit check, the
conditional battle, the optional bit-set, and replays the four bytes of
adjacent vanilla instructions that the redirect displaced.
Done bits are cleared in init_event_bits so a fresh game always starts
with the segments unvisited.
Also adds vehicle.BranchIfEventBitSet alongside the existing
BranchIfEventBitClear in instruction/vehicle.py.
https://claude.ai/code/session_01Sv2b69a36YNwJhtYURJnYm
* Add files via upload
Add Bank EE decompile
* Add custom vehicle-script BranchProbability opcode (0xE1)
The previous commit implemented the Serpent Trench probabilistic-battle
behaviour with a field-mode pre-script and entry wrapper because the
vanilla vehicle-script opcode set has no random-branch primitive. That
forced two near-identical pre-script branches and an extra rewrite of
the animation entry point.
Replace that with a brand-new vehicle-script opcode 0xE1
("BranchProbability") that does the random roll inline. Format:
E1 cc dd_lo dd_mid dd_hi (5 bytes)
cc - 1-byte chance 0-255; branch iff rng < cc
dd_lo/mid/hi - 3-byte destination, encoded just like B0's
Vehicle opcodes E1-F2 are all unused in vanilla (their pointer-table
entries dispatch to a no-op stub at $EE74A4). We slot a real handler
into the E1 entry of the table at SNES $EE76FB and write the handler
ASM into the unused 767-byte block at SNES $EEAF01-$EEB1FF (already
declared free at memory/free.py:65).
The handler:
1. SEP #$20 to put A in 8-bit mode
2. fetches the chance byte at script offset $ED
3. inline RNG (X-mode-safe variant of c0.rng) - increments $1F6D and
reads $C0FD00,X
4. CMP+BCC to decide branch-taken vs fall-through
5. taken: rewrites $EA/$EB/$EC and zeros $ED/$EE (mirroring the tail
of the vanilla B0 handler at $EE715F-$EE717E), then JMP $7093
6. fall-through: advances $ED past the 4 operand bytes, then JMP $7093
Installation is lazy: the first BranchProbability(...) constructor used
in a build calls _install_branch_probability_handler() which writes the
handler and patches the dispatch table.
With this primitive, ruination_battles_mod becomes a single per-battle
detour block in Bank.CA. Each block:
- branches to FIGHT if the segment's done bit is clear (first visit)
- else BranchProbability(p, FIGHT) to fight with chance p on repeats
- else falls through past the battle
- on the FIGHT path, invokes the battle and (last battle in segment
only) sets the done bit
- replays the 4 bytes of original animation that the 6-byte
site-redirect displaced, then branches back
The field-mode pre-script and the entry wrapper at $0xa8ae3 are gone.
Probability is still a tweakable class constant on SerpentTrench.
Also: drop the unused vehicle.BranchIfEventBitSet helper that was added
in the previous commit (the new design uses BranchIfEventBitClear for
the first-visit fast path).
https://claude.ai/code/session_01Sv2b69a36YNwJhtYURJnYm
* ST minor updates
- Try to fix a music overrun at end of ST3;
- generalize length of displaced bytes
* Ruination mode fixed encounter nerfing: lete river
- Track Lete River fixed encounters; after the first time, have them occur with 1/4 chance.
* Update doma_wor.py
In door rando mode, make it so you only have to solve this puzzle once (and the couch correctly stays open, allowing retraversal)
* Weight ruination branch selection toward less-extended branches
Avoids the failure mode where two branches grow long and complicated while
the third remains a stub with only a few rooms. Each branch's reward count
is tracked, and viable branches are selected with weight
1 + total_rewards_found - branch_rewards_found[b], which is always >= 1
so any viable branch can still be chosen.
https://claude.ai/code/session_01J8pAH8M83BVK8GS3LT6FhG
* Refresh CLAUDE.md/ARCHIVE.md for ~80 commits since last update
Recent claude_ruination work introduced new modules and conventions that
weren't reflected in the docs. Updates:
CLAUDE.md
- Top 10 #5 (Code Organization): Note `no_free_heals_mod()` mirrors the
`ruination_mod()` pattern; cross-event sweepers belong in their own
module (e.g. `event/free_heals.py`).
- Top 10 #7 (Key Modules): Add `event/free_heals.py`, BedHealCharacter
(0xa4) and BranchProbability (0xE1) custom opcodes,
SET_PARTY_INTERACTION_POINTERS shared subroutine,
compute_actual_areas_used and branch-selection weighting on
ruination.py, the limited_heals() bucket on narshe_wob.py, the
450-byte init_event_bits allocation, and the entrance_door_patch
no-trailing-Return gotcha.
ARCHIVE.md
- Rewrite "No Free Heals" section: current architecture (free_heals.py
module), bed-heal flow (50% pincer ambush + per-character
BedHealCharacter), 9-outcome recovery springs, school bucket using
SCHOOL_LIMITED_HEALS_1/2 event bits (not NARSHE_CHECKPOINT word),
newly-covered events (Baren Falls, Collapsing House, Doma WOR).
- New section "entrance_door_patch must fall through" documenting the
trailing field.Return() footgun caught by Mt Zozo and Doma WoB fixes.
- New section "BranchProbability vehicle-script opcode (0xE1)" covering
format, lazy install, and Bank.EE handler.
- New section "SET_PARTY_INTERACTION_POINTERS shared subroutine"
describing why it exists and how to consume it.
- New section "Branch Area Detection for Narshe Clues" explaining why
args.ruination_areas_used now comes from compute_actual_areas_used()
and how branch selection weighting works.
- New section "Persistent Event State Across Reloads" with the burning
house fireball, KT switch, and minecart revisit patterns.
- New section "Debug Output Routing" on -debug vs -dv vprint usage.
- Update Local Character Gating example to drop trailing Return().
- Cross-link Conditional Area Checks to compute_actual_areas_used().
https://claude.ai/code/session_011q2oNq741QXwN4TVeF74Ph
* Update map_exit_extra.py
Move return position to Doma Dream castle from balcony to match door location
* Update claude reference files
* Restructure CLAUDE.md: shrink #7 to a concept, extract Module Map
#7 had grown to 12+ sub-bullets — it was a mini table of contents, not a
"top concept." Replace it with a real concept (Persistent Event State
Across Reloads) covering the init_event_bits + per-event bit pattern
that's been hit by burning house, KT switches, and minecart fixes, plus
the 450-byte buffer cap that bites overflow.
Move the module list out of the Top 10 into a new "Module Map" section
below the Top 10. The Module Map is grouped by area (Memory & ROM, Maps
& Doors, Ruination, Feature flags, Custom opcodes, Door-rando, Conventions)
so it can keep growing without crowding the prioritized list.
Also fix opcode references: SetupBranchPartySelect/FinalizeBranchPartySelect
are kept-for-backcompat aliases of SetupBranchRecruit/FinalizeBranchRecruit
(actual opcodes 0xec/0xed, not the previously-documented 0x8d/0x8e).
The full opcode table will land in ARCHIVE.md in a follow-up commit.
https://claude.ai/code/session_011q2oNq741QXwN4TVeF74Ph
* Add 'How to Find X' cheat sheet to CLAUDE.md
Consolidates lookup procedures I re-derive every session into a single
table (map IDs, NPCs, event bits/words, items/espers/spells, custom
opcodes, vanilla event scripts, dialogs, rooms, doors, ruination area
data, ROM addresses). Most entries point at claude_reference/ JSONs
because grep-on-JSON is faster than reading the .py source.
Sits between the Top 10 and the Module Map, since it's high-utility on
every session-start.
https://claude.ai/code/session_011q2oNq741QXwN4TVeF74Ph
* Add grouped Table of Contents to ARCHIVE.md
ARCHIVE.md is at 1100+ lines and 24 top-level sections with no organization
beyond chronological accretion. Add a TOC at the top, grouped by theme
(FF6 internals, Ruination architecture/mapping/party/patterns, Door
randomizer, Feature flags, Custom opcodes, Bug post-mortems, Conventions,
Lookups). Anchors are GFM-auto-generated from headings, so on-disk order
stays append-only.
The Custom Opcodes group has a forward link to a 'Custom Opcodes
Reference' section that will land in the next commit.
https://claude.ai/code/session_011q2oNq741QXwN4TVeF74Ph
* Add Custom Opcodes Reference table; fix wrong opcode numbers
Adds a single consolidated 'Custom Opcodes Reference' section in
ARCHIVE.md covering every custom opcode in the codebase (field, vehicle,
y_npc, battle-event), with class names, ROM banks, and purpose. Verified
against source on 2026-04-25 via:
awk '/^class / {cls=$2} /opcode = 0x/ {print cls, $0}' \
instruction/field/custom.py instruction/field/y_npc/instructions.py
Discovered while building the table: the existing 'Party Formation'
section listed wrong opcode numbers — MarkActivePartyAway/
RestoreActivePartyAvailable/RemapPartiesToFreeSlots are 0x66/0x67/0x68,
not 0x8a/0x8b/0x8c; the branch-recruit pair is now SetupBranchRecruit/
FinalizeBranchRecruit at 0xec/0xed (the old PartySelect names are
backwards-compat aliases). Fixed those in-place and updated the
RecruitAndSelectParty flow paragraph.
Includes an 'Adding a new opcode' subsection listing currently-unused
opcode slots so the next addition doesn't collide.
https://claude.ai/code/session_011q2oNq741QXwN4TVeF74Ph
* Update output_260425_1351.txt
* Fix stranded rewards when forced connection merges reward rooms
ForceConnections (and any normal connect()) can call compress_loop on a
loop containing two reward rooms - e.g. door 4418 <-> 744 fuses 371 and
'ruin-doma' into compound '371_ruin-doma'. The base Network knew to
update self.net/self.rooms but RuinationBranch.check_rooms still held
the original ids, so check_for_rewards never matched the compound and
both Doma WOB / Doma WOR_3 were stranded - causing 'No reserve areas
available to unstick branches' on Cyan-only starts.
Override compress_loop in RuinationBranch to re-point check_rooms at the
new compound id and track the original components in
_compound_check_rooms so check_for_rewards can return all merged rewards
in one shot. ROOM_REWARD stays keyed on original ids, keeping spoiler
log lookups and rebuilt-walk searches consistent.
* Add warp/town cooldown counters to ruination map generation
Each branch now tracks two countdowns that prevent warp points and town
entries from clustering near the hub or each other. While a counter is
> 0, the corresponding room type is filtered out of valid targets in
extend_branch_path. Mapping any unconnected room decrements both
counters; mapping a warp/town room then resets that counter to its
initial value (WARP_COOLDOWN_INITIAL=5, TOWN_COOLDOWN_INITIAL=4 on
ruination_map). WARP_ROOMS is a best-effort mapping derived from
data.warps.WARP_POINTS to specific room IDs in RUIN_ROOM_SETS;
TOWN_ROOMS picks a representative entry room per AREA_TYPES['TOWNS']
area.
* Ruin mapping: cooldown warps/towns dataset
- Edit Phantom Train warp point to a more useful one (car 4)
- Update WARP_ROOMS to fix warp locations
- add 'ruin-returners' to TOWN_ROOMS
- correctly handle WARP_ROOMS in -maze iso
* Ruin map image: distinguish warp and town rooms
Warp rooms render as upward triangles and town rooms render at 1.5x
size in generate_map_image, with matching legend entries. Rooms in both
sets get both treatments.
https://claude.ai/code/session_01KXr7MqZqs3SeCKLBus73oy
* Ruin map image: bump town node size to 600
https://claude.ai/code/session_01KXr7MqZqs3SeCKLBus73oy
* Ruin finalize: rescue branch with no connected warp room
If a branch enters finalize_map with at least one warp room sitting in the
network as an orphan (added via a rescue path but never wired up) and no
connected warp room, attempt to wire one in (door->door or hub/downstream
trap -> warp pit) before steps 1-6 run, then restart the finalize loop.
* Ruin warp rescue: switch compound membership test to bracketed match
split('_') is unsafe because some room ids themselves contain underscores
(share_east, ruin_hub_*, etc.). Switch to the bracket-and-search idiom
used elsewhere: compose f'_{node_id}_' once and look for f'_{w}_' for
each warp id, so the match only succeeds at full-token boundaries.
* Ruin warp rescue: drop consumed dead-end from self.dead_ends
A warp room classified as a dead end (1 door, 0 traps/pits) has its only
door consumed by the door<->door rescue. Without bookkeeping, it stays in
self.dead_ends as a 0-door survivor and step 6's room.doors.pop() crashes.
Pre-step5 cleanup only purges entries no longer in net.nodes, so handle
the in-place case explicitly.
* Update ruination.py
Boost requested # warps per branch to 2 (not forced if none available)
* Ruin ferry: gate South Figaro <-> Nikeah on rooms actually mapped
ruin_map.AreasUsed records which branch an area was *distributed* to,
but distribution can tag a branch whose rooms already lived elsewhere
(or whose rooms are unreachable post-finalize). That left the ferry
enabled when one of the towns had no connected rooms on the map,
letting players board it and exit to the world map from an unmapped
Nikeah.
Switch the ferry check to ruin_map.compute_actual_areas_used(), the
same data structure the Narshe school clue fix uses to confirm an
area's rooms are reachable in some branch.
https://claude.ai/code/session_01FgmThAwKE1KDLKqPNh4mhN
* Ruin ferry: extend network to include Albrook port
Replaces the SF<->Nikeah-only ferry with a 3-port network (South Figaro,
Nikeah, Albrook). When >=2 of the three are reachable per
ruin_map.compute_actual_areas_used(), each mapped sailor offers travel
to every other mapped port via a single dispatch event with a 2- or
3-choice prompt; with <2 mapped every sailor shows the disabled
message. The Albrook NPC is a generic NPC on map 0x14C (slot 0x22)
that we promote to a sailor sprite (54) and make visible via npc_bit
0x565 (set in albrook_wob.init_event_bits because fix_ferry_connections
runs before the init_event_bits loop).
Boat-trip animations are allocated in Bank.CA per ordered (src, dst)
pair using the existing airship-warp pattern.
https://claude.ai/code/session_01FgmThAwKE1KDLKqPNh4mhN
* Ferry boss first push
Adding K@N boss to ferry transition at 3/8 chance.
* Update claude reference docs
Update claude reference docs
* bugfixing ferry issues
still can't invoke a battle as a ship...
* Bugfix updated ferry with boss gate
- Boss gate now works (100% time first clear)
- still need to fix visuals on surround battles (goddess, etc.)
- Adds albrook as ferry destination.
* Update Albrook connections in rooms.py
Split Albrook exits in DungeonCrawl / ruination
* Fix formatting and add Albrook north entrances
Add albrook north entrances to dungeon_crawl_exit_destination_override. Part of allowing 2 exits from Albrook.
* Remove an ID from Albrook's room data
I think this is the right way to do 2 exits from Albrook...
* Make Albrook a conditional reward-time area in ruination
Albrook now has two exits, so it's no longer a dead end and was never
getting placed by the finalize_map ALL pass (which only handles single-
door rooms). Move Albrook out of CHARACTER_AREAS['ALL'] and add it
during process_rewards when at least two of the three branch
town_cooldowns are zeroed, so it lands at a quiet point in the mapping
run rather than too early or clustered with another town.
Generalize the existing inline DuncanHouse hook into a CONDITIONAL_AREAS
table keyed on area name with a predicate, plus a _add_conditional_areas
helper that process_rewards calls on every character recruit.
https://claude.ai/code/session_012ZPmA6FsAEfH38swE8hm9r
* Spread towns: route Albrook to branch with fewest mapped towns
Add a pre-dispatch step in distribute_areas that intercepts Albrook
when it's queued for distribution and assigns it to the branch with
the fewest mapped AREA_TYPES['TOWNS'] (random tiebreak). Falls back
to forced_same_branch if Albrook ever gains a partner there.
https://claude.ai/code/session_012ZPmA6FsAEfH38swE8hm9r
* Apply balanced town distribution to all standalone towns
Generalize the Albrook town-spread step so it runs for every town in
the new STANDALONE_TOWNS list (SouthFigaro, Kohlingen, Maranda, Tzen,
Albrook). Composite-town areas (Jidoor + Owzer's, Vector + Magitek)
and forced-same-branch towns (Thamasa, Nikeah) keep their existing
distribution path so they place with their larger area.
The town-count is recomputed after each placement so multiple towns
arriving in the same distribute_areas call actually spread.
https://claude.ai/code/session_012ZPmA6FsAEfH38swE8hm9r
* Fix Albrook WoR mapping to world map
* Update map_exit_extra.py
Update Albrook entrance
* Defer dead-end orphan warp rooms to finalize_map step 6
The warp rescue at the top of finalize_map could connect a single-exit
warp room into a downstream branch, consuming the only door and creating
an inescapable dead end. Now _connect_orphan_warp_room only accepts
hallway warps (>=2 unprotected exits), which is a no-op on the branch's
exit budget. Dead-end warps are deferred to step 6, where a new (6.0)
phase connects them against remaining_doors using the same
door-consuming pattern as regular dead-end connections, restoring the
>=2 connected-warp invariant safely.
https://claude.ai/code/session_01TQFDYeyXhnPAvUMve9aUTw
* Bugfixing ferry boss issues
- Boss pack now correctly forces BattleType.FRONT
- Shortened length of trips.
* Refine warp room exit count and step-6 dead-end filter
- Hallway filter now only counts doors + traps. Pits are entrances, not
exits, so a 1-door + 1-pit warp does not satisfy the no-op invariant
and gets deferred to step 6.
- Step 6.0 now uses Network.is_dead_end to gate which orphan warps it
will connect; non-dead-end warps left over (e.g. trap-only orphans
that the hallway pass cannot reach) are not yanked into the branch
here. Since is_dead_end guarantees count [1,0,0], the connection
collapses to a single door pop.
https://claude.ai/code/session_01TQFDYeyXhnPAvUMve9aUTw
* Use is_dead_end for warp rescue hallway filter
Replaces the explicit (doors + traps) >= 2 check with a symmetric
not is_dead_end gate, matching the step-6 logic. Same intent, less
code, easier to keep the two filters in lockstep if is_dead_end's
definition ever changes.
https://claude.ai/code/session_01TQFDYeyXhnPAvUMve9aUTw
* Refresh hub_id before step-6 warp room classification
Step 4's terminus connect() merges the terminus node into the hub,
producing a new compound node id. The local hub_id captured at line 2927
is now stale, so passing it to _classify_branch_warp_rooms() at step 6.0
made get_upstream_nodes() blow up with "node ... is not in the digraph".
Re-fetch hub_id immediately before the step-6.0 classifier call, and
again after each connect() inside the rescue loop (those connects can
also merge the warp into the hub).
* Add pre-boss flavor dialog to ruination ferry sailors
While event_bit.FINISHED_NARSHE_BATTLE is clear (sea boss undefeated), each
mapped sailor opens with a one-line teaser before the destination prompt:
one randomly chosen mapped port (TOWN1) reports its lost ship; the others
randomly pick from two alternative lines that name TOWN1.
* Make non-TOWN1 ferry flavor lines distinct when all 3 ports map
With all three ports on the network, draw the two non-TOWN1 lines via
random.sample so each sailor gets a different one. The 2-port case still
picks a single random line.
* bugfix "souvenir of the empire" dialog
return address was incorrectly formatted (0xca53eb, rather than just 0xa53eb). This led to some kind of overflow that produced the stray text. Amazing it wasn't more damaging!
* Fix infinite recursion in get_upstream/downstream_nodes
The "ignore simple 2-way doors" branch passed `visited` unchanged while
recursing across a bidirectional edge, so any uncompressed 2-cycle in
the network would blow the Python stack ("maximum recursion depth
exceeded"). Normally compress_loop merges 2-cycles immediately, but the
buggy fallback was tripping intermittently during finalize_map step (2)
on Umaro's-cave branches.
Rewrite both methods iteratively with proper visited tracking (still
preserves the original duplicate-emission semantics for nodes reachable
via path-disjoint chains). Wrap them with a NetworkRecursionError that
captures a snapshot of nodes/edges/2-cycles/map state, so the existing
finalize_map exception handler surfaces something useful instead of a
bare RecursionError. Also add a verbose-only post-compress_loop sanity
check in connect() that warns if a 2-cycle slipped through compression.
* Fix double-add of unlocked rewards when LockedRewards drains
When a character key (e.g. LOCKE) was both responsible for a banked
reward in LockedRewards and listed in CHARACTER_LOCKED_REWARDS, the
reward was added to branch_checks twice: once by apply_key() (via the
CHARACTER_LOCKED_REWARDS path at lines 4273-4292) and again by the
LockedRewards drainer in process_rewards. The recursive process_rewards
call only removes one copy, so the reward stuck around in branch_checks
and RewardsAvailable was left over-counted, causing the outer loop to
keep looking for an already-awarded reward on the same branch.
Guard both LockedRewards drainers (the character-key drainer and the
area-unlock scan) so they only append to branch_checks and bump
RewardsAvailable when the reward is not already there.
https://claude.ai/code/session_018WHcEXSF5knqeunpTNcr3i
* Apply -sli to all shops in ruination mode
Previously ruination mode only enabled limited inventory on
ruin_map.accessible_shops. Shops not tracked there (e.g. the phantom
train shop) shipped with vanilla unlimited inventory. Switch to the
full shop list so every shop reachable via door rando runs with
limited inventory.
* Update airship.py
Hide minimap on Falcon event (ruination mode)
* -sli only use accessible shops
Only use shops.shops in limited shops (there aren't enough memory slots for shops.all_shops, and many of them are inaccessible & unused).
* Update airship.py
Add airship controls space for ruination
* Wire Network.verbose to central -debug/-dv flag
Network had verbose=False as a class attribute, so the ~76 'if self.verbose:'
guards in walks.py suppressed the diagnostic vprints from connect_network()
even when the user passed -debug or -debug-verbose. Only the few unguarded
vprints in doors.py (e.g. 'Initial Count', 'starting room...') were visible,
so door-randomization timeouts were impossible to diagnose.
Make Network.verbose a property that returns log.verbose.is_enabled(),
matching the pattern Doors already uses. The setter is kept as a no-op so
existing callers (e.g. ruination.py's maze_net.verbose=True) don't break.
* Update doors.py
add "Ruination" to list of areas not randomized in door_randomize_each
* Update walks.py
clean up reports on output of classification check
* Move FERRY_FLAVOR_DIALOG out of WARP_DIALOG_IDS range
The Albrook/Nikeah/SouthFigaro flavor sailors used dialog IDs $0592-$0594
(1426-1428), which sit inside WARP_DIALOG_IDS (1426-1460). Because
fix_ferry_connections runs after WarpPoints.mod(), the ferry text silently
clobbered the warp prompts (Kefka Tower right warp got Albrook's "sailor
washed up" line). Move FERRY_FLAVOR_DIALOG to the free band 1471-1473 in
the same Maduin/Madonna esper-world block.
Document the full Maduin-block reservation table (1424-1496) in ARCHIVE.md
so future claims do not re-collide. Cross-reference comments added in
data/warps.py, event/narshe_wob.py, event/free_heals.py, and the
ruination_start_game_mod / FERRY_FLAVOR_DIALOG defs.
* Deconflict room data (ruination / door rando)
- rename ruination-specific room instances to deconflict usage in other door rando modes (restore 41a, add ruin-narshepeak)
- Add Albrook WoB to dungeon_crawl_split_exits, mirroring Albrook WoR (ms-wob-35, ms-wor-49)
* deconflict -maps, -mapx from -ruin
- fix shared_exits definition to correctly handle Albrook in both map shuffle & dungeon_crawl modes
- add door name for 1558 ("ancient cave")
- increase airship controls memory buffer
* bugfix -dre post -maps
Apparently this has been busted since map shuffle was added. MtZozo and Zozo-WOR need to use the mapsafe areas (this was originally why the mapsafe logic was added!) even though nothing else does.
* bugfix -maps
give the airship controls EVEN MORE MEMORY SPACE in -maps mode! Why!?
* Add -sli / --shop-limited-inventory flag
Shops sell items in limited packs. Each item slot can only be bought
once per game.
Extracted from the claude_ruination branch (with ruination coupling
stripped). The feature is self-contained:
- args/shops.py: -sli flag plumbing (argparse, flag summary, options table)
- data/shops.py: pack size computation, SRAM tracking allocation,
compact_init ASM subroutine, buy-menu hooks
- menus/buy.py: new module hooking the buy menu UI (qty labels, price
display, post-purchase redraw, all-items-bought exit)
- menus/menus.py: register BuyMenu
* Update items.py
add junk_weapons, junk_armor lists to constants.items
* Hide shop "Qty:" indicator while the order submenu is open
The limited-inventory buy menu added a "Qty: N" indicator under the
"Equipped:" row, but when the player clicks an item and the order
submenu opens, the indicator overlaps the submenu's window dressing and
duplicates the quantity already shown in the submenu.
Erase the "Qty:" label and value tiles when the order submenu is drawn,
and redraw them when control returns to the buy list. Coordination is
done via a new direct-page flag ($64) set by the BAAB label hook and
cleared by the B98F label hook; the qty-value hook at BCAB also honors
the flag so any subsequent equipped-count repaint during the submenu
doesn't restore the qty value.
* Move submenu flag to verified-safe DP byte $66
$64 is not on the ARCHIVE.md verified-safe DP list for shop menu
hooks; the entry between $63 and the next free byte is $66. Switch
SUBMENU_FLAG_DP from $64 to $66 to match the established convention
and avoid clobbering any unsurveyed direct-page state.
* Document SUBMENU_FLAG_DP ($66) in shop-menu DP table
Records the new direct-page byte added to menus/buy.py for hiding the
limited-inventory "Qty: N" indicator while the order submenu is open.
$66 was already on the verified-safe DP list, so no list change is
needed; this just adds the row in the usage table.
* Document the verified-safe DP byte list inline in buy.py
Adds a short comment near the shop-menu DP variable declarations that
enumerates the verified-safe direct-page bytes from ARCHIVE.md so future
hooks can pick a free slot without consulting the doc, and points
contributors at the doc table when adding a new entry.
* Update buy.py
Remove "Qty: N" label when opening the submenu.
* Show 24-bit pack prices in limited-inventory shop list
When a flag like -sprv inflates the base item price, multiplying it by
the limited-inventory pack size can push the total past 65,535 GP. The
buy list was capping the displayed price at $FFFF (HexToDec5 is 16-bit
only) AND C3/B7E6 shortcuts to "ample" whenever the player's GP high
byte is non-zero, so anyone carrying > 65,535 GP could open the order
submenu on a 297,040-GP pack and underflow their GP on confirm.
hook_price_display now computes the full 24-bit pack price. When it
overflows 16 bits, the hook routes through C3/0582 (24-bit→8-digit BCD)
and a new DrawNum6 helper that draws the bottom six digits at offset
$0018 from the row's BG1 base (one tile left of the standard column),
so the visible total lines up correctly. The original B9D2-B9E1
DrawNum5 setup is NOP'd because the hook now owns drawing for both
paths.
hook_buy_setup snapshots the player's GP and, if the actual 24-bit pack
price exceeds it, zeroes $7E1860-$7E1862 so B7E6 falls through to the
16-bit price-vs-GP compare ($FFFF vs 0 → "not enough GP").
hook_affordability_restore puts GP back regardless of which path B7E6
takes — the unaffordable path JMPs to $B87D which RTSs to the wrapper.
* Relocate Config4 ($1D4F) default behind a JSR trampoline
settings/config.py already relocates the Config2 ($1D54) and Config3
($1D4E) default writes from inline STZ instructions to JSR-reachable
subroutines so the defaults can be patched after the build. The boot
code has a third matching STZ at C3/70C8 -- STZ $1D4F, the "pad
assignments" byte -- that was left inline.
$1D4F's low nibble (----4321) records which battle characters player 2
controls when the Controller option is set to "multiple" (the in-game
submenu reached by pressing A on that row). Relocating it behind a JSR,
exactly like Config 2/3, makes that default reconfigurable too, without
changing behavior: the subroutine still writes 0 by default (player 1
controls everyone).
This lays the groundwork for setting the player-2 assignment default
from outside the build.
* Create ff6_bank_c2_partial.txt
* Create ff6_bank_c2.txt
* docs: document -nfh Coliseum inn/heal and Vector inn rework
Add the remove_coliseum_heal and modify_vector_inn sweepers (plus the
Coliseum inn addition to modify_inn_costs) to the No Free Heals section,
note the related caveats, and record the new dialog reservations:
Maduin-block 1474-1476 (Vector inn no-room / scaled-theft messages) and
vanilla 0x055A repurposed for the full-amount theft message.
https://claude.ai/code/session_01BpQXN41yKP1KRDDA7pyHxe
* nfh: sync claude_ruination with feature/no-free-heals
Port the -nfh capabilities that had diverged between claude_ruination
and the feature/no-free-heals branch (which is bound for upstream),
so the two implementations are consistent and a future upstream merge
stays clean.
- free_heals.py: add the Coliseum inn entry to modify_inn_costs plus the
remove_coliseum_heal() and modify_vector_inn() sweepers (file is now
identical to feature/no-free-heals; ruination had none of this code,
only the ARCHIVE.md docs describing it).
- events.py: import and invoke remove_coliseum_heal/modify_vector_inn from
no_free_heals_mod(); update the docstring accordingly.
- airship.py: add no_free_heals_mod() to charge GP for the WoB airship
"G'ho! Customers!" healer (was entirely absent in ruination).
- burning_house.py: guard the post-sleep "Nighty night" song and
HEAL_PARTY_HP_MP_STATUS behind `not no_free_heals` so the burning-house
sleep no longer grants a free full heal (inn pricing already matched).
https://claude.ai/code/session_01Tvbr7PfXazsR3SAPXUMKmc
* Fix Python 3.11+ incompatibility: don't size int-like values with len()
`-ruin` / `-drdc` builds crashed on Python 3.11+ with
`TypeError: 'NoneType' object cannot be interpreted as an integer` at the
final ROM write, while succeeding on 3.10.
Root cause: Python 3.11 added `__len__` to `IntFlag`, returning the number
of set flags (popcount) instead of raising `TypeError`. The byte-counting
logic in memory/space.py used `try: n += len(value) except: n += 1`,
relying on len() raising for scalar byte values. Instruction args that are
IntFlag/IntEnum members (e.g. `Flash.WHITE` = 224, three bits set) therefore
counted as 3 bytes instead of 1 on 3.11+. In `_parse_labels` this desynced
the running byte offset, so forward label pointers were written 2 bytes past
their placeholders, leaving unresolved `None` bytes in the ROM.
This was layout-dependent (hence "works on 3.10, fails on 3.12"): door
randomization places events differently across Python versions because the
string hash changed in 3.11 (SipHash-2-4 -> SipHash-1-3), so the desync only
surfaced when a multi-bit flag preceded a forward branch (e.g. the ruination
Phantom Train restaurant: FlashScreen(Flash.WHITE) before BranchChance).
Fix: treat `int` instances (which include IntEnum/IntFlag) as one byte in the
three byte-counting sites - `_parse_labels`, `clear`, and `Write` size - so
counts match the actual emitted bytes on every interpreter. No behaviour
change on 3.10; 3.11 and 3.12 now produce byte-identical output.
https://claude.ai/code/session_01Tvbr7PfXazsR3SAPXUMKmc
* Disable y-party switching on the floating continent (ruination)
Pressing y to switch parties while on the floating continent resets the
event's dynamic map edits and can softlock the player. As a temporary fix
(mirroring fanatics tower), disable y-party switching when landing on the
floating continent and restore it when leaving.
- Add create_y_party_switch_events(): save/disable and restore subroutines,
reusing the SAVED_Y_PARTY_SWITCHING event bit (uses cannot overlap).
- Disable at GO_TO_FC, the common point for both landing cases (fighting
boss #2 and, on a return visit, skipping it).
- Restore on the early path (warp back to the airship) and on the ending
event (escape after Nerapa).
https://claude.ai/code/session_01DDpYCkD5c7tpPW5T9PDtBs
* Randomize Floating Continent tube maze (ruination mode)
Self-contained, ruination-only randomization of the route through the FC
tube maze, all in event/floating_continent.py.
- Re-pairs all 12 tube endpoints into 6 new bidirectional connections, with
a keys-and-locks reachability solver guaranteeing every room is reachable
from FC1 and that FC8 stays reachable after a Save Room detour.
- Randomly assigns each of the 4 buttons to one of the 4 locks (3 fixed
walls + the Tube9 reveal), recomputing each button's camera pan to its
assigned wall.
- Tube9 is hidden until revealed: entering its partner tube before the
reveal bounces the party back to that tube; the reveal/lock bits use
cleared-on-map-load event bits so walls and bits stay in sync on reload.
- The Save Room (Tube12, map 0x166) is included in the shuffle via cross-map
transitions that reuse the vanilla save-room machinery, substituting only
the partner tube's graphics and FC-side landing position.
Generated event code re-points the vanilla tube/button event tiles and
reuses the vanilla open/close/wall subroutines by address.
* FC tube maze: resolve Save Room region conflict with save_point_hole_mod
save_point_hole_mod reserves 0xad951-0xad95c, which lies inside Tube12's
event range (0xad940-0xad979) that the tube-maze randomizer re-points.
- Skip save_point_hole_mod's patch in ruination mode (the Save Room is now
part of the randomized maze and Tube12's transition is rewritten).
- Fold the statue-light deletion (delete_lights_function) into the Save
Room -> partner transition so the vanilla behaviour is preserved.
* FC tube maze: tie tube exit animation to the destination tube
Tube11 is the only tube the party exits by stepping UP (jump up 3, out of
the FC7 save-room hole); every other tube is exited by stepping DOWN (the
generic CAD577 slide-out). Previously the exit animation was fixed per code
path, so exiting INTO Tube11 (down) and exiting the Save Room onto any tube
other than Tube11 (up) both dropped the party on an unwalkable tile and
softlocked.
Introduce exit_sequence(dst) keyed on the destination tube and use it from
both the standard transition and the Save Room return, so the emerge
direction always matches the tube being exited.
* FC tube maze: diagonal pan paths + save-room exit camera fix
- Save Room exit camera: centre the LoadMap on where the party actually
ends (y-1 for Tube11's up-hop, y+2 for every other tube's down slide-out)
instead of always assuming the upward Tube11 exit, which left the party
~3 tiles below the window centre on non-Tube11 partners.
- Replace the linear-only camera/party pan with pan_path: a near-straight,
symmetric path that minimizes distance travelled using 1:1 and 1:2/2:1
diagonal moves (MoveDiagonal, opcodes A0-AB) plus linear runs, with the
diagonal run split symmetrically around a central run. This shortens and
speeds up the tube rides (and button reveal pans) noticeably -- e.g. an
(8,21) move goes from a 29-tile L to ~22.5 (near the 22.5 straight line).
* FC tube maze: pan camera (not party) on transit; restore y-switch on airship return
Hardlock / wrong-exit fix: tube transits used to walk the hidden *party*
across the map, but scripted entity movement collides with terrain. On
randomized routes the party jammed against a wall mid-pan - either stranding
it on the wrong tile or hard-locking the event (camera frozen, exit never
runs). Now we hold the screen, pan the *camera* (which ignores terrain),
teleport the hidden party straight to the destination, then play the exit
animation. The party always reaches the right tile regardless of the route.
y-switch fix: the "do you wish to return?" airship-return tile (CA/5A6C ->
CA/5A96) left the floating continent via the switchyard without restoring
y-party switching. Restore it on that path, matching the warp/escape paths.
* FC tube maze: reclaim superseded vanilla event space; document in ARCHIVE
Instead of writing new tube/button animations into fresh free space and
stamping a Branch over each vanilla event entry, ruination_tube_maze_mod now:
- Free()s the superseded vanilla tube/button event bodies (~832 bytes) after
snapshotting the bytes it reuses. The open/close, slide-in/out and wall
subroutines those events called live outside these ranges and are kept.
- Writes the new (more compact) animations with Write(Bank.CA, ...), which
packs them into the reclaimed space first and spills into ordinary free
space only when it runs out. Net free-space cost drops ~1050 -> ~255 bytes.
- Re-points each event tile directly via
event.event_address = start - EVENT_CODE_START (same convention as
switchyard/maps) instead of a Branch trampoline. Tube12's tile is on the
Save Room map 0x166; all others on 0x18A.
Also adds an ARCHIVE.md section documenting the whole tube-maze feature and
its gotchas (camera-pan vs. terrain collision, per-destination exit
animation, $1B5, multipurpose_map reset bits, the space-reuse pattern).
* FC tube maze: Tube9 reject now animates a "bounce" round trip
When entering Tube9's partner before Tube9 is revealed, the party used to
drop in and shudder in place. Now the camera always travels toward Tube9
and the reveal is only checked at the arrival point: if Tube9 is open the
party pops out there, otherwise the camera travels back and the party
re-exits the tube it entered - a nicer "went in, bounced back" animation.
* Dream Maze (-maze iso): verify solvability instead of walking it out
_randomize_isolated_maze previously walked out a single connection via
Network.connect_network(), which could leave the Stooges Maze (rooms
421-429) uncompletable. Now it generates random door/trap matchings and
verifies the maze is solvable, retrying up to 20000 times (mirrors the
Floating Continent tube-maze approach; converges in a handful of tries).
A layout is valid when, treating doors as two-way and traps as one-way
(trap -> pit) edges between rooms:
- the ending room (429) is reachable from the entry room,
- both stooge/key rooms (423, 427) are reachable from 429, and
- 429 is reachable from each stooge room
so the party can reach the hub, round-trip to collect both stooge keys, and
return to unlock the boss door. Drops the old key-chain room_data hacks
(cd1_r/cd2_r/cd3_r) that only existed to coax connect_network.
Verified solvable across many seeds on a real ROM build.
* Dream Maze (-maze iso): require every room to reach the ending (no softlock)
Strengthen the solvability check so the party can never be stranded by a
one-way trap: instead of only requiring entry->429 and stooge<->429, now
EVERY maze room must be able to reach 429. Combined with "429 can reach
both stooge rooms," this means wherever a trap drops the party they can
always get to the hub and round-trip to both keys. Still converges in a
handful of tries (0 failures / 5000 seeds, mean ~10, max 70); verified
no-softlock across many real-ROM builds.
* Disable y-party switching during Doma WOB siege in ruination mode
The Doma siege event makes dynamic map edits that get reset if the player
y-switches parties mid-event, breaking the event. Mirror the fix already
used in Fanatics Tower and Floating Continent: save and clear
ENABLE_Y_PARTY_SWITCHING when the siege begins (enter_event_function) and
restore it once the boss is defeated (exit_function), reusing the
SAVED_Y_PARTY_SWITCHING event bit.
* Standardize Moogle Defense y-party switch handling
Bring the moogle defense y-switch disable/restore in line with the shared
convention used by doma wob, floating continent, and fanatics tower:
- Use the named SAVED_Y_PARTY_SWITCHING event bit instead of the hardcoded
raw bit 0x1ca.
- Factor disable and restore into two Call'd subroutines via a new
create_y_party_switch_events() helper, replacing the inlined restore
logic in after_battle_mod.
* Consolidate y-party-switch subroutines into a single shared write
Doma, Fanatics Tower, Floating Continent, and Moogle Defense each wrote
their own copy of the save/disable and restore y-party-switch subroutines.
Replace all four with a single write in event/ruination.py
(create_y_party_switch_subroutines), invoked once before the event mod loop
alongside create_party_interaction_scripts. Consumers lazily import the
shared DISABLE_Y_PARTY_SWITCH / RESTORE_Y_PARTY_SWITCH addresses and Call
them (Fanatics Tower uses them directly as map-event tile scripts), matching
the existing SET_PARTY_INTERACTION_POINTERS convention.
* Document shared y-party-switch subroutines
Add a CLAUDE.md module-map bullet and an ARCHIVE.md section for the new
DISABLE_Y_PARTY_SWITCH / RESTORE_Y_PARTY_SWITCH shared subroutines, mirroring
the SET_PARTY_INTERACTION_POINTERS documentation style.
* Add KT rooms & event exit data
data entry prior to randomizing KT paths
* Update map_exit_extra.py
Patch return from sealed gate vanilla destination (it was off by one, causing an inescapable loop; it is never used in the vanilla game)
* Add -rkt: randomize Kefka's Tower lanes in ruination mode
Adds an opt-in ruination flag that repartitions the KT* rooms into three
non-overlapping lanes (one entry + one 4-ton-switch-room ending each) and
shuffles their internal door/trap connections.
Following the isolated Dream Maze approach: pre-condition by splitting rooms
into lanes that satisfy cheap necessary constraints (forced crossings share a
lane, <=2 bosses per lane, equal one-way exits/entrances, even door count),
then make up to 100 random connection attempts per split (up to 20 splits) and
verify completability. Verification grows reachability from the three entries
while collecting the KT1/KT2 switch keys as their rooms become reachable
(fixpoint), requiring all three endings to be reached and that, with both keys
held, every reachable room can still reach its lane's ending (no one-way
strand).
Also fixes KTb3's pit encoding (917 -> 7108) so the door-as-trap fall from
KTb6 has a valid landing pit.
* Rework -rkt KT randomization to guarantee all rooms reachable
The first cut used random door/trap matching + verify (the Dream Maze
approach). That reliably produced *completable* layouts but almost never
connected every room (~0.012%): KT's door graph is deliberately sparse (~28
two-way door-edges for ~34 door-rooms), so lane connectivity must lean on the
one-way conveyor/pipe traps and the two gated platforms. Random matching
therefore orphaned rooms onto islands (e.g. stranding a boss or a switch).
Drive the existing constructive network walk (Network.connect_network, used by
the ruination branches) once per lane instead: unlock the switch platforms so
the walk can use the gated crossings for connectivity, force those crossings,
attach dead ends, and walk out a fully-connected layout; then strip the
platform ids (vanilla map features, not writable exits) and verify the
assembled three-lane map. Verification now requires EVERY room reachable (no
orphans) via a key-collecting reachability fixpoint, plus no one-way strand
with both keys held. Re-partition up to KT_MAX_SPLITS times on failure.
Validated across 40 seeds: 0 fallbacks, 0 invalid layouts, median 0.46s; and
full ROM compiles for several seeds produce all-reachable KT layouts with no
self-loops and no platform-id leakage.
Also fix a latent verbose-only crash in Network.connect_network (k.id on a
string room-id key) that the walk now exercises during KT generation.
* Document -rkt Kefka's Tower lane randomizer in ARCHIVE.md
Add an append-only section (plus a TOC link next to the sibling
tube-maze randomizer) covering the -rkt design: why it drives the
Network.connect_network walk instead of random matching (KT's sparse
door graph), the switch/platform coupling, the three-phase
propose/verify loop, and the gotchas (always call ForceConnections to
init .protected; platform traps live in locks and must be unlocked then
stripped; verbose suppression; the latent walks.py k.id fix). Notes the
shared-physical-map caveat.
* Add -rkt KT lane randomizer pointer to CLAUDE.md Module Map
* Update rooms.py
* Fix -rkt softlock: verify KT with a joint multi-party key-timing model
The previous verify() accepted layouts that can softlock: its 'no one-way
strand' pass assumed BOTH switch keys were already held, so it could not
see a party that rides a one-way (trap or conveyor) into a pocket whose
only exit is a gated crossing whose key the party can no longer collect
(e.g. the key sits in that party's own lane but now upstream of the
one-way it just took). A player hit exactly this.
Replace the optimistic single-flood check with an honest joint
state-space over (roomA, roomB, roomC, keychain): three parties moving
asynchronously over a shared, monotonic keychain (pressing KTb8/KTc10
sets KT1/KT2, opening a gated crossing possibly in another lane). Forward
-BFS the reachable joint states from the three entries, then accept iff
(1) every room is occupied by its lane's party in some reachable state
(no orphans) and (2) from EVERY reachable state the parties can still all
be herded to their endings (reverse-BFS the goal over forward edges and
require it covers the forward set). The state space is tiny (product of
lane sizes x 4 keychains); verify ~10ms.
Measured on 150 fully-connected candidates: 11/29 layouts the old check
accepted were actually softlockable; the new check rejects exactly those
and is strictly stronger (0 cases where it accepts what the old rejected).
Integrated across 40 seeds: 0 fallbacks, 0 invalid-or-softlockable (per an
independently-written joint dead-state detector), median 0.60s. Docs
updated in ARCHIVE.md and CLAUDE.md.
* Bugfix: escape to world map after Imperial Base fights
Imperial base fight "Chucked out!" wasn't correctly updating the world bit. Now fixed.
* Skip warp-room rescue on tiny ruination branches
Only attach remaining warp point rooms during finalize_map when the
branch has more than 3 connected rooms. For very small branches (just
the hub and terminus), the terminus now connects directly to the hub
instead of routing through warp point rooms.
* Update pregame_track.py
* Update ruin_preprocessor.py
Add "randomize Kefka's Tower" (-rkt) as a default flag
* Track KT Hallways & add functionality to simplify KT if desired
- Document 11 hallway rooms in KT map (only 2 doors, no chests/switches/bosses, etc.)
- Implement code hook to remove a number of random hallways on each compile. If number is in range [1, 11], that number of hallways is randomly removed before randomizing lanes.
Default value is 0. Tested & works when removing 11. Could add this as a feature if desired (-rkt minimal, -rkt simple, -rkt {1-11})
* Fix persistent raft graphic after re-riding Magitek minecart in door rando
The minecart outro (minecart_event_mod) has two alternate, fixed Vector
destinations (go_to_vector on DEFEATED_CRANES, go_to_mtek3_vector on
RODE_MINE_CART) taken once the event has progressed. These build their own
LoadMap + Return tail and therefore bypass the common en_patch that
Transitions.mod() appends only to the default (randomized) destination --
including the raft add/remove correction.
When the minecart's randomized destination is an on-raft location (e.g. the
Lete River / Returner's Hideout raft), the party can still carry the raft
graphic when re-riding the cart and getting routed to one of these Vector
branches, which never removed it -> party drawn persistently on a raft.
Vector is never an on-raft map, so unconditionally clear the raft graphic
(Call CB/04AA) in both branches. CB/04AA only sets the party's vehicle to
'none' and leaves visibility untouched, so it is safe even when not on a raft.
* Document persistent-raft minecart bug post-mortem in ARCHIVE.md
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RtaUPK1G6U7PQHwMxZkukC
* Update ruin_preprocessor.py
Add esper mastery icon (-emi) flag to defaults
* Bugfix Figaro Castle long exits
Overlapping definition of Fig Castle long exits caused problems with the exit events allowing loose Return to Parent Map. Making them non-overlapping should fix this.
* Fix remaining overlapping long exits (South Figaro WoB/WoR, Albrook WoB)
Following the Figaro Castle fix (6467c3e), swept all 416 maps for long
exits whose tile spans overlap on the same map. Overlaps cause
shared_map_exit_events to attach the wrong event to a shared tile,
producing a loose "Return to Parent Map".
Strays found (after existing patches), all in rooms used by ruination /
dungeon crawl:
- Map 74 South Figaro WoR: north exit 1164 overlapped verticals 1162
(x=0) and 1163 (x=56). Shrunk 1164 to x[1..55].
- Map 75 South Figaro WoB: north exit 1169 overlapped verticals 1167
(x=0) and 1168 (x=56). Shrunk 1169 to x[1..55].
- Map 323 Albrook WoB: west exit 1245 overlapped horizontals 1246 (y=1)
and 1247 (y=0). Shifted 1245 to y[2..21], mirroring the existing
Albrook WoR fix on 1249.
Verified zero remaining long-exit tile overlaps on any map. No identical
(fully stacked) long exits exist, and no overlaps remain in unused rooms.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GnMYULEYdH4rQsRy9cH1Zz
* Relocate unused Zozo Tower duplicate exits to (0,0)
Exits 638-641 duplicate the live Zozo Tower exits 634-637 on the same
tiles (documented in rooms.py but never tracked in code). They are
referenced by no room, so they are currently safe only because their
higher indices let the live exits win the runtime first-match. Mirror
the existing Nikeah 54/55 handling in door_rando_cleanup() and move them
to (0,0) so they can never shadow a randomized destination if exit
ordering changes.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GnMYULEYdH4rQsRy9cH1Zz
* Cross-reference Zozo duplicate-exit note with relocation code
Update the rooms.py note so it points at door_rando_cleanup(), where the
redundant Zozo Tower exits 638-641 are now relocated to (0,0).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GnMYULEYdH4rQsRy9cH1Zz
* Update map_exit_extra.py
Adjust length of edited long exits
* Ruination spoiler log: filter rewards by character-gating reachability
The Ruination Rewards section listed every reward whose room was
physically reachable from the hub, ignoring character gating. Rewards
sitting in a character-owned area (REWARD_OWNERS) or locked in-game
behind a character (REWARDS_LOCKED_BY_CHARACTER) were printed as
findable even when their gating character could never be obtained.
This surfaced most visibly with circularly-gated characters: e.g. Cyan
placed at Whelk (Terra's area), Terra at Mt. Kolts (Sabin's area), Sabin
at Doma WOB (Cyan's area), Relm at Phantom Train (Sabin's area). Each is
physically present and individually reachable, but the dependency cycle
means none of their gating characters ever enters the keychain, so none
can actually be obtained. They were still printed as available rewards.
Replace the pure physical-reachability filter with a fixpoint that
mirrors the generator's own _is_reward_accessible logic: seed the
keychain with the starting party, then repeatedly admit any
physically-reachable reward whose gates are satisfied, feeding
newly-obtained characters back into the keychain until no further reward
can be admitted. Only admitted rewards are printed. This also correctly
drops espers/items stranded behind unobtainable character gates.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FVcpQEAXXjsxyRn9jUwnm6
* Ruination: retry map generation on RuinationMappingError
Ruination map generation is randomized and fails on roughly 1 seed in
~25 with a RuinationMappingError. The failures all surface from the
topological close-out of a branch: finalize_map cannot balance a branch's
remaining free exits into a valid closed network (e.g. 'finalize_map hit
max iterations', 'Inescapable downstream node', 'terminus not merged'),
or a branch gets stuck mid-build with no reserve area left to unstick it
('No reserve areas available'). These are unlucky rolls of a randomized
process rather than unsatisfiable seed/flag configs, so re-rolling almost
always succeeds.
Wrap the call in a retry loop (up to 10 attempts). Each attempt
re-instantiates ruination_map, which re-rolls the requested counts,
planned characters, area distribution and the whole branch build from a
fresh RNG position. The generator's own per-instance state is discarded
with the instance; we only roll back the external mutable state it
consumes between attempts:
- characters.available_characters / character_paths
- espers.available_espers
- the shared ROOM_REWARD reward slots' (id, type)
Items aren't depleted (get_good_random samples with replacement). Reward
slot objects are captured by identity rather than ROOM_REWARD key, since
-maze iso moves a slot between keys during __init__.
Also make the one non-idempotent __init__ module mutation safe for
re-instantiation: WARP_ROOMS.remove(424) -> WARP_ROOMS.discard(424).
The attempt-0 path is unchanged (the baseline snapshot consumes no RNG
and mutates nothing), so seeds that don't need a retry produce
byte-identical output. Verified: 5 previously-failing deterministic seeds
now succeed; 120/120 deterministic + 60/60 real-world seeds generate
successfully with valid spoiler logs; a non-failing seed diffs identical
pre/post change.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FVcpQEAXXjsxyRn9jUwnm6
* Fix long-event pointer desync that broke exit 1264 world-bit update
get_short_event/get_long_event computed last_event_id = first + count and
passed it to get_event(), which searches events[first : last + 1]. That
slice overreaches by one event, so the search could match the first event
of the next populated map (always the case for maps with zero own events
whose neighbor's first event shares the queried coordinate).
When create_exit_event() probes an exit tile for a pre-existing event, this
false match leads it to call delete_event(). delete_*_event() decrements
every later map's event pointer before searching its (correctly narrower)
range, fails to find the event, and raises IndexError. create_exit_event()
swallows that IndexError, leaving the pointer table desynced by one entry
for all subsequent maps.
Concretely, exit 1264's "SetEventBit 0xA4" (WoB->WoR) long event was written
correctly to CC/1F9F but, due to the desync, registered on map 0x18C instead
of 0x180, leaving the real exit tile at (9,27) with no event so $A4 never
updated.
Fix: bound get_short_event/get_long_event to the map's own events by
subtracting 1 from last_event_id, making the get search symmetric with the
delete search. The delete paths already compensate via their decrement-first
ordering and are intentionally left unchanged.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XUhmuTmsoauGcWkXnBdH8p
* Honor forced connections for reserve rooms added during finalize_map
A room pulled from reserve during finalize_map (rescue/converter/hub rooms)
can carry forced connections - hard-coded physical jumps such as the Esper
Mountain 2nd-room bridge jumps (trap 2011 -> pit 3011), whose ROM exit tiles
are never rewritten. ForceConnections runs once at the start of finalize_map,
before these rooms exist, so:
- the forced exit's partner room is absent, so the forced connection is
never applied, yet
- ForceConnections still adds the forced exit to `protected`, so the
finalize logic skips it.
The exit is therefore left with its vanilla destination. A player landing in
such a rescue room (e.g. Esper Mountain West Section via a pit) could take the
unmodified bridge-jump trap and walk out through the vanilla, unrandomized map
to the world map.
Fix: when add_room pulls a room from reserve during finalization, transitively
pull its forced-connection partner rooms (a bridge-jump cluster shares one
physical map and must move together) from the same reserve, then re-run
ForceConnections. ForceConnections is idempotent on re-run because an
already-forced exit has been removed from its room, so only the newly added
cluster gets connected. Reserve is shared and consumed across branches, so a
partner is only pulled when still available (no cross-branch duplication);
logical-only forced connections (no ROM tile) whose partners aren't in reserve
are harmless and simply left alone.
Verified against the reported seed: the Esper Mountain dangling bridge jumps
(2011/2013) are eliminated, with no finalize failures or newly unconnected
reachable exits across 41 deterministic builds.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XUhmuTmsoauGcWkXnBdH8p
* Honor forced connections for forced traps unlocked after ForceConnections
Extends the reserve-room forced-connection handling to also cover forced
traps that only become accessible once a key is applied (e.g. the Lone Wolf
reward behind the lw1 key, or Baren Falls behind Sabin). ForceConnections
runs once at the start of finalize_map, while such traps are still locked, so
they are protected but never connected; when the key later unlocks the trap it
is reachable yet keeps its vanilla destination / leaves its reward room
orphaned.
Changes:
- data/walks.py ForceConnections: only force a connection when the partner
entrance is actually present, so the routine is safe to re-run after the
branch state changes (a live forced exit whose partner is gone no longer
crashes; it is simply retried when the partner appears).
- event/ruination.py: _honor_forced_connections now scans the branch's *live*
exits instead of a single room's static room_data. A forced exit is live
only while sitting in a placed room's exit lists, so this tracks a locked
forced trap exactly when its key makes it accessible and ignores it while
still locked (matching: held key -> must be completable; no key -> not
tracked). Absent partner rooms are pulled from the shared reserve when still
available. The pass runs when a reserve room is added, at the start of each
finalize iteration, and once more after the loop (a key applied in the final
iteration unlocks a protected trap without triggering another loop).
Verified on the reported seed across 46 deterministic builds: zero reachable
forced traps left unconnected (Esper Mountain bridge jumps and Lone Wolf
reward route all wired), unreachable forced traps correctly left alone, and no
finalize failures.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XUhmuTmsoauGcWkXnBdH8p
* Ruination: reject maps with character-gated softlocks
A branch could route its only escape from a region through an exit that
is locked in-game behind a character (e.g. the Thamasa Inn trapdoor needs
STRAGO, the Cave on the Veldt drop needs SHADOW). The branch mapper
unlocks these the moment the gating character is *planned* and then freely
relies on them, but in play a region can be entered (via two-way doors or
a one-way pit) long before its gating character is recruited on some other
branch. The player then gets stuck with no non-gated way back to the hub.
Add a post-generation verification pass. For each branch, build a "free"
traversal graph (two-way doors + one-way trap->pit edges) that omits every
exit gated by a character not in the starting party, resolving character
locks transitively through character-locked keys ('lw1', 'zr1'). A room is
a character-gated softlock when it is reachable from the hub with only the
starting party but cannot return to the hub without a recruited character;
comparing against the full graph excludes pre-existing one-way dead ends
and event-warp exits so only genuine character gates trigger a reroll. On
detection, raise RuinationMappingError, which the existing retry loop in
events.py catches and regenerates the map.
Resolves the open TODO in event/TODO.md about the character-gated exits.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YVdbBQU1u2x9xXPQBjj4Qx
* Ruination: fix softlock check to read topology from branch.map
The verification built its traversal graph from branch.net and
branch.rooms.get_room_from_element, but after finalization branch.net is
left edgeless and connected exits are removed from their Room objects (and
unindexed), so every lookup returned None and the graph had no edges -- the
check silently never fired on real maps (0 hits across 200 seeds).
Resolve each exit through a static room_data-derived owner map instead
(_branch_exit_owner_map), scoped to the branch's placed rooms and including
locked exits (the character-gated ones live in the locks dict, not the
door/trap lists), and build the graph from branch.map's connection pairs --
the only durable record of the final topology. The check now correctly
detects character-gated softlocks (e.g. a Serpent Trench entrance reachable
without GAU whose only progression is the GAU-gated trench drop) and the
existing retry loop regenerates a clean map.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YVdbBQU1u2x9xXPQBjj4Qx
* Update sealed_gate.py
Patch sealed gate lava bridge room so you can't use the bridge timer to override exit door events.
* Ruination: disable y-party switching during Imperial Camp event
The Imperial Camp event makes dynamic map edits that y-party sw…
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ref: AtmaTek#48