Releases: Secludedly/FusionBot
Release list
FusionBot v8.2.6
v8.2.6
- Added OT/TID in BotController while leaving the IP during console connection.
LINUX:
- Added OT/TID in BotController while leaving the IP during console connection.
- Resized BotController to fit.
- Minor titlebar panel font modifications.
FusionBot v8.2.5
Update PKHeX.Core.dll
v8.2.5
Updated PKHeX selectively up to 07-01-2026.
-
Add Champions Ver. 1.1.0 assets
-
PA8: fix ExtraBytes unused-offset typos
0x018 -> 0x108: 0x18 is the MarkingValue offset (an actively-used
field), so listing it among the "unused" ExtraBytes exposed it in the
byte editor and let edits there clobber the low marking byte (markings
0-3). 0x108 is the byte actually intended in the 0x100-0x10F run.
0xE9 -> 0xEB: the "0xDE-0xEB unused" range listed 0xE9 twice and omitted
0xEB. -
HOME: handle BD/SP -1 same as disassembly
BD/SP => HOME sanitizes -1=>0 and 0=>658. HOME is therefore "clean" so the other side-data do not need to know about BD/SP goofiness. -
Add support for game specific fonts
Future pull requests may be added with other font files to add game-specific font files (such as Gen1/2 having JPN/KOR/INT in the pixelated style like SciresM/Rhydon)
For now, the Control provides via EntityContext. If we need to provide different granularity, maybe another enum would be OK. Possibly add that as a property to IStringConverter.
FusionBot v8.2.3
Further Enhanced Themes, New Themes Added, Main Form Updates
v8.2.1
- Themes now have the ability to color more separate entities across the UI (Logs text color, title text colors, icon colors, Min/Max/Exit colors, Bot Controller text color)
- 6 new themes added (Crimson Veil, Matte Lime, Baby Pink, Arctic White, Emerald Noir, Sunset Ember)
- 4 themes deleted (Winter Void, WTF, Violet Mist, Indigo Shroud)
- 3 themes updated (Silver & Cold, Frostbite, Blue Eclipse)
- Top and left-side border panels are removed from all themes.
THEME EXAMPLES: https://i.imgur.com/Nv6F8NK.gif
Generating an Egg now Allows Batch Commands & Ball Customization
v8.2.2
There was a bug that had the bot ignore some batch commands and the customization of balls due to ALM ignoring and applying its own logic over the requested template, after the fact. Issue has been corrected. In addition, I've also added the Scale line in the embed for eggs as my previous code was ignoring the method of displaying the information.
Update Dependencies + PJCS Garchomp Added
v8.2.3
Updated PKHeX selectively up to 06-11-2026.
-
Minor casting perf improvement moves the cast to the return, registers are 32-bit and overflow is OK.
-
Add highdpi text/control setting, detect dark
Detects for system dark mode on startup since many users don't know about dark mode. Won't override any existing setting, just detects if no cfg existsnew(). Text/control dpi scaling is opt-in for high dpi users, reduces font blurriness.
#4458 (reply in thread). The hover-preview was rewritten in the past year to directly paint instead of updating many controls, so it works fine withDpiUnawareGdiScaled. I've not checked extensively to see if anything becomes broken, so user beware 💫 -
Update SpeciesName.cs
-
enc->pk: Minor perf improvement
Move the %25 into the Criteria check method; only done in 1 method rather than across a few dozen.
can potentially skip % operations depending on inputs. Also inline some gender calls where gender isn't needed further in the generation pattern, so it can be skipped. -
pk3.Korean always false
even if language ID is hacked to Korean, don't return true (since it doesn't exist). -
Sanity check criteria ability before generating
no more stunlocking the generator by requesting hidden ability mons from wild encounter slots -
Label SV block for current location ID
-
Restore preview card on system wake
pc went to sleep, hover preview was missing (minimized?) this workaround works, maybe I can deduplicate the dllimport in PokePreview, or make this more abstract for future hover card previews like encounters? -
Gen5: fix basculin-blue reckless ability handling
so many spots needing updating:
ability verifier (legality check)
encounter template=>pk5 (generating)
editor load abilities (show the ability in list)
editor save ability (acknowledge ability index) -
PJCS Garchomp
Co-authored-by: 9B1td0 157295620+9B1td0@users.noreply.github.com
Co-authored-by: Lusamine 30205550+Lusamine@users.noreply.github.com
FusionBot v8.2.0
Translated the Bot Menu for all languages
v8.1.9
- Bot Menu renamed to Menu, and listed options shortened.
- Applied translation for every language.
UI Themes Now Color All Child Forms & Controllers + Misc UI Edits
v8.2.0
- Themes now recolor the entire program, including each childform (Bots/Hub/Logs).
- Repositioned the title text on in the titlebar.
- Force the icon in the titlebar next to the title text to always remain white in color.
- BotController inside the BotsForm is also themed accordingly, as well as the Menu.
- Changed the new update text to simply show the version number.
- Removed two themes that did not work with updated modifications (Black & White/Arctic Halo.)
EXAMPLE: https://i.imgur.com/7bOWDS6.png
FusionBot v8.1.8
Properly apply user-requested trainer info when converting
v8.1.4
Fixes the bug in the AutoLegality extension for Discord that ignores user-requested trainer info.
AutoOT/Convert & Logging Updates & Enhancements
v8.1.5
- Slight modification to the AutoOT pipeline.
- Fixed the legality conversion string.
- Enhanced logging, detailing the AutoOT process.
MetDate Restrictions Added
v8.1.6
MetDates were able to go beyond the current date without error, so a block was added to restrict the MetDate to maintain leniency for two days in the future to be considerate all time zones. The MetDates can no longer legally be set to more than two days into the future.
Finalized Logging for AutoOT & Custom Trainer Info
v8.1.7
Added a log entry for each game, that reads the finalized trainer information applied to the PKM before it is actually sent to the user requesting it, in order to help debugging any future AutoOT or trainer information problems.
Update/Add Translations for All UI Languages + Cleanup Text Sizes
v8.1.8
- Added missing translations in the Hub and Bot.
- Updated a few translations.
- Modified UI text size in all buttons to be compatible with each language.
- Routine & Protocol updated to have translations added.
FusionBot v8.1.3
Update PKHeX.Core.dll
v8.1.3
Updated PKHeX selectively with 4 commits up to 05-27-2026.
-
MysteryGift: Gen5+=>pk* respect criteria IVs
Extract a common IV generator method that has considerations for over-specified and under-specified criteria, rather than deadlocking/returning invalid IV spreads. -
Slot9a: overqwil defer, ignore hasTracker
https://projectpokemon.org/home/forums/topic/57375-pkhex-new-update-legality-errors-contribution-page/page/36/#findComment-300382
ZA origin can't travel to adjacent games to explore those evolution methods, so the formarg evo verification fails. Exert more preference for an exact species-match, don't settle for a Qwilfish just cuz it has a tracker. -
WA9: check all IVs if all specified
-
swsh: another use of exeggutor static
https://projectpokemon.org/home/forums/topic/57375-pkhex-new-update-legality-errors-contribution-page/page/36/#findComment-300436
https://bulbapedia.bulbagarden.net/wiki/Workout_Sea#Wanderers
FusionBot v8.1.2
Multi-Language UI Support
v8.1.2
- "Language" option added to the hub to change the UI language of the program.
- Supports English, Japanese, Korean, ChineseS, ChineseT, French, Italian, Spanish, German.
Will eventually enhance translations and complete translating other elements of the UI. Will also be fixing font and text size elements per language. This is just a start and may be somewhat inaccurate. It will take time, as I will be focusing on accuracy. This is just a first pass, more like a placemarker to continue editing.
EXAMPLE: imgur (Japanese)
FusionBot v8.1.1
Updated & Enhanced Ditto Trade Command
v8.0.9
- LinkCode argument removed. Code always comes from TradeCodeStorage.
- Game keywords to determine the origin game. (SV, Violet, Scarlet, SLVL, SL, VL, BDSP, BD, Brilliant Diamond, Shining Pearl, SP, BS, SWSH, SW, Sword, SS, Shield, SH)
- All Languages supported as a single word string.
- All Natures supported as a single word string.
- Queued with ignoreAutoOT set to true so the trade-partner AutoOT swap doesn't overwrite the requested/default OT info that can cause issues with IVs and Languages.
- Formatting is now
$dt <IVs> <Language> <Nature> <Shiny> <OT/TID/SID> <OriginGame> - IV formatting is 31/31/31/31/31/31.
- Adding the word "Shiny" makes it shiny, but excluding it makes it non-shiny.
- OT/TID/SID/OTGender written as Name/123456/1234/Female.
- OriginGame written as any keyword above.
- Strings in the Ditto trade command can be excluded. Not all options need to be satisfied. Default values from the set below will be implemented for ignored strings and will attach the appropriate game versioning.
Ditto @ Destiny Knot
Level: 100
Shiny: Yes
Timid Nature
Language: Japanese
OT: Ditto
TID: 143319
SID: 2551
OTGender: Male
.IV_HP=31
.IV_ATK=31
.IV_DEF=31
.IV_SPA=31
.IV_SPD=31
.IV_SPE=31
EXAMPLES
$dt 31/0/31/31/31/31 Japanese Adamant Shiny Meep/221133/3333/Female Scarlet
- CREATES: Ditto, 0 Atk IV, Japanese, Adamant Nature, Shiny, Custom trainer info added, from Scarlet.$dt English Sword
- CREATES: Ditto, Default 6IV, English, Default Timid Nature, Non-Shiny, Default Ditto/112233/1212/Male trainer info, from Sword.$dt Adamant
- CREATES: Ditto, everything default except the nature being Adamant, the bot will generate from the native game.$dt(with no options attached)
- CREATES: Ditto, everything default and from the native game, and it will be shiny.
Moved Battle-Ready & Events in Hub to Folders
v8.1.0
Will need to re-add the folder paths.
Fix Shiny Being Exponged by TID/SID Overwriting the PID/XOR with AutoOT.
v8.1.1
TryApplyEarlyAutoOT was silently stripping shiny status. There is a second place AutoOT runs that the first fix didn't touch: TryApplyEarlyAutoOT in TradeModule.cs. This is called right after the PKM is generated and before the trade is queued, so it can mutate the new shiny PKM generation back to non-shiny.
So basically...
pk.OriginalTrainerName = cachedTrainerDetails.OT;
pk.TrainerTID7 = (uint)cachedTrainerDetails.TID; // <-- TID16 changed here, which reset the shiny PID.
pk.TrainerSID7 = (uint)cachedTrainerDetails.SID; // <-- SID16 changed here, which reset the shiny PID.
Then after that...
if (pk.IsShiny) // <-- Checks IsShiny AFTER TID/SID change. No good.
{
var shinyXor = pk.ShinyXor; // <-- Same bug
pk.PID = (uint)((pk.TID16 ^ pk.SID16 ^ (pk.PID & 0xFFFF) ^ shinyXor) << 16) | (pk.PID & 0xFFFF);
}
So pk.IsShiny returns false, the recompute block is skipped, and the PKM keeps the new TID/SID but with a mismatched PID that's non-shiny. The legality check doesn't catch it because a non-shiny PKM with the user's OT/TID/SID is perfectly legal.
So my initial v8.0.8 commit was right about the diagnosis direction but only patched one of the two spots that needed it. The same bad pattern also exists in AutoLegalityWrapper.GetLegal, but there it's hidden because the downstream (set.Shiny && !pk.IsShiny) block immediately retries/forces shiny. TryApplyEarlyAutoOT has no fallback, so the bug is fully visible.
To fix it...
I captured the original shiny state before mutating.
var originalPk = pk.Clone();
bool wasShiny = originalPk.IsShiny; // <-- Was it shiny originally before passing the AutoOT?
uint origShinyXor = originalPk.ShinyXor; // <-- Yup, so let's grab a valid shiny XOR on the clone.
Now we pull from cache as we apply the trainer info...
pk.OriginalTrainerName = cachedTrainerDetails.OT;
pk.TrainerTID7 = (uint)cachedTrainerDetails.TID;
pk.TrainerSID7 = (uint)cachedTrainerDetails.SID;
Now we pass it through AutoOT with the properly and previously applied XOR for a shiny...
if (wasShiny)
pk.PID = (uint)((pk.TID16 ^ pk.SID16 ^ (pk.PID & 0xFFFF) ^ origShinyXor) << 16) | (pk.PID & 0xFFFF);
After refreshing the checksum, the Pokémon should be finalized as intended.
FusionBot v8.0.8
Fix Priority Methods that Interfere w/ Shiny Variables
v8.0.8
Typically, when the user requests Shiny: Yes but the encounter ALM picks is shiny-locked, ALM returns the Pokemon non-shiny without trying any other encounter using its SetShinyBoolean. Then in APILegality, ALM checks legality and returns a successful encounter that's non-shiny. A non-shiny PKM on a shiny-locked encounter is legally valid, so ALM just stops and returns it as Regenerated without it being shiny. No retry, no error. Just a silent push, ignoring the shiny request.
Some people running FusionBot would use the default GameVersionPriority & PrioritizeEncounters, which prioritized Static encounters over Egg and Mystery. With Static set higher in the priority list, ALM accepts it using the logic stated above, forcing users to receive non-shiny requests.
GameVersionPriority should follow the PriorityOrder over anything else, relying on the bot host to set the PriorityOrder in the Hub/Config, setting the order from top-to-bottom for each bot with your personal preference.
PrioritizeEncounters should also order the encounters to be more free and open to accept more variables by following the order:
- Slot
- Egg
- Trade
- Mystery
- Static
To fix it for those not running in the same Priority cases, TryGetAsShiny was implemented next to TryGetAsWildOrEgg. The bot will now temporarily set PriorityList = [Slot, Egg, Mystery, Trade, Static] AND temporarily sets APILegality's GameVersionPriority = PriorityOrder (so the user's custom priority list is respected even if they picked NewestFirst). The call to GetLegal will return the PKM instance only if it's both shiny AND legal.
Added a re-entry guard so the GetLegal call doesn't infinitely retry.
Basically, no matter how a user configures PrioritizeEncounters or GameVersionPriority, shiny requests for species capable of being shiny will keep working, because the bot always has a backup search path that's good for a shiny result.
- By default, the PrioritySettings in FusionBot for encounters is set as Slot -> Egg -> Trade -> Mystery -> Static.
- By default, the GameVersionPriority in FusionBot is set as PriorityOrder.
- By default, the Timeout in FusionBot is set to 20.
- PriorityOrder should be set by the bot's use case on an individual basis.
As an example, my Z-A bot's order is:
- ZA
- SL
- VL
- LA
- BD
- SP
- SW
- SH
- GE
- GO
- US
- UM
- S
- M
etc.
Basically, I prioritize the game my bot is running as the first in the list, then set the best fitting order to my own needs in a similar way as above. I mostly try to keep a majority of it going down by generation.
FusionBot v8.0.7
New PPUps Command Handles Adding/Removing Custom PP Up Levels
v8.0.4
PP Up values go from 0-3 and only accept True/False. Anything else gets rejected and uses the ALM default of maxing out the PPs for all moves. This command is ignored in games that do not use PPs, such as Z-A.
- PPUps: False → No PP Ups will be applied and the default base PP value will be used.
- PPUps: 0 → No PP Ups will be applied and the default base PP value will be used (same as above.)
- PPUps: True → PP Ups will be maxed out, as usual, using the same default ALM logic.
- PPUps: 1 → Adds 1 PP Up to every move.
- PPUps: 2 → Adds 2 PP Up to every move.
- PPUps: 3 → PP Ups will be maxed out, as usual, using the same default ALM logic.
Update Dependencies
v8.0.5
Updated custom PKHeX & ALM dependencies.
Added Item Batch Trading Command & Embed
v8.0.6
To request more than one item via batch, you would use the "ibt" or "itembatchtrade" command, followed by the item name, then a number indicating how many of the selected item sent to you.
For example...
$ibt Life Orb 6
The bot will begin a batch trade to send the Life Orb 6 times. It will get delivered by what you set as the Default Item Trade Species in your Hub. The command is also limited by "Maximum Pokemon per Trade" and follows the rules of "Allow Batch Trade."
The embed displays the item being sent in the Discord channel with the Pokemon sending the item to you, as well as a custom message detailing what you are receiving.
Very handy and easy to use for bulk item requests.
Mystery Mon & Mystery Egg Batch Trading Commands
v8.0.7
You can now request batch trades of a Mystery Mon or a Mystery Egg, in supported games.
For Mystery Mon, the command is "$btmm" followed by the number of trades you want to initialize.
For Mystery Egg, the command is "$btme" followed by the number of eggs you want traded to you.
Example: "$btmm 5" will send a user 5 randomly generated Pokemon with completely random stats that follow the standard batch trade flow. The same method is used for Mystery Eggs' "$btme" command.
Embeds for the Mystery Egg command appears once and tells you how many eggs you are getting.
Embeds for the Mystery Mon command appears as normal, with a new embed for each random Pokemon being generated.