Posted November 26, 2025 by Ash Born Interactive LLC
In this update, ABI_ShinySpawn grew up from “works great, but a bit predictable” into a proper, production-ready shiny system that feels fair, exciting, and flexible.
Old behavior:
When multiple enemies in a troop had <Shiny: x, y>, the plugin checked them in a fixed order (left-to-right in the troop).
With 100% odds, the same slot would always become shiny (e.g., Slime A was always the shiny, Slime B never was).
New behavior in v2.0:
On battle setup, the plugin now:
Takes the troop member list.
Makes a copy.
Shuffles that list using a proper Fisher–Yates shuffle.
Decides shinies based on this randomized order.
Result:
With two Green Slimes and <Shiny: 511, 100%>, only one will be shiny per battle (same as before)…
but which one it is changes from battle to battle.
Even at lower odds, shiny choices feel more natural and less “scripted.”
The original design intention was “one shiny per battle” to keep encounters special. That’s still the default:
The plugin picks the first eligible enemy (in the shuffled order) whose roll succeeds.
Once one shiny is chosen, later rolls are skipped, so you don’t end up with a full field of shinies by accident.
But for testing or special events, there’s now:
Force Shiny Switch ID (plugin parameter)
If that switch is ON:
The one-shiny limit is ignored.
Every enemy with <Shiny: x, y> is evaluated normally.
You can do “all-shiny” showcase battles or test graphics without editing the database.
The plugin’s odds system was cleaned up and clarified. It now supports:
<Shiny: 511, 128> <!-- 1 in 128 chance --> <Shiny: 511, 1> <!-- 1 in 1, always shiny -->
<Shiny: 511, 1:4096>
<Shiny: 511, 3%> <!-- 3% chance --> <Shiny: 511, 0.5%> <!-- 0.5% chance --> <Shiny: 511, 100%> <!-- Always shiny -->
Clarification:
<Shiny: 511, 100> = 1 in 100 chance (1%), not 100%.
Use:
1
1:1
100%
for guaranteed shinies.
If odds parse to 0 or an invalid format, the tag is quietly ignored and logged in Debug Mode.
To make the plugin play nicely with battle events and other systems, there’s a new parameter:
Shiny Found Switch ID
Behavior:
At the start of each battle, that switch is set to OFF.
If at least one enemy becomes shiny, the switch is set to ON.
You can now:
Use Turn 0 / Span: Battle battle events
Condition: Switch [ShinyFound] == ON
Show animations, messages, or do anything else you want.
This switch is also what makes the new companion plugin ABI_EnemySpawnAnimation feel so powerful when combined with shinies.
Shiny messages have been polished:
The message string is configurable:
A shiny %1 has appeared!
(%1 = enemy name)
If multiple shinies share the same name (e.g., two Shiny Green Slimes), the message is only shown once per unique name, not spammed.
Messages are injected after battle starts, once sprites and UI are ready.
You can toggle the message system on/off in the plugin parameters.
Debug Mode has been kept and enhanced to help you tune odds and confirm behavior.
When DebugMode = ON, the console will show:
Which enemy’s <Shiny: x, y> tag was parsed
How odds were interpreted (rawOdds → chance)
The randomized troop order used for shiny selection
Each roll, compared against the calculated chance
Which enemy actually became shiny
When the ShinyFound switch is flipped
Perfect for balancing rare encounter rates or making sure your tags are set up correctly.
This version is built to be:
Friendly with VisuStella Battle Core
Friendly with event battles and random encounters
Friendly with spawn animation plugins and battle events
Recommended workflow:
Base enemy (e.g., Green Slime) gets:
<Shiny: 511, 1:512>
Shiny enemy (e.g., Shiny Green Slime) is a separate database entry with:
Its own graphic
Its own stats/drops
Optional <SpawnAnimation: x> (via companion plugin)
Optional:
Use ShinyFoundSwitchId to trigger special events or visuals.
✅ Randomized shiny target selection (no more fixed order)
✅ Stronger, clearer odds parsing (integer, fraction, percentage)
✅ ShinyFound switch integration with clean ON/OFF behavior
✅ One-shiny-per-battle logic preserved, with an override switch for “force all shiny”
✅ Debug logs expanded and clarified
✅ Help text and parameters updated and fully documented
If you’re updating from an older version:
Replace your old ABI_ShinySpawn.js with v2.0.
Double-check your plugin parameters in Plugin Manager (especially ShinyFoundSwitchId and ForceShinySwitchId).
Confirm your notetags—no syntax changes, just more flexibility and less predictability in who becomes shiny.