• Do not use Discord to host any images you post, these links expire quickly! You can learn how to add images to your posts here.
  • Reminder: AI-generated content is not allowed on the forums per the Rules and Regulations. Please contact us if you have any questions!
Resource icon

v21.1 Level Sync + Multi Select Menu Options 1.0.0

This resource pertains to version 21.1 of Pokémon Essentials.
Pokémon Essentials Version
v21.1 ✅
Also compatible with
  1. v21.1
  2. v21
  3. v20.1
Download: View: https://drive.google.com/file/d/1LgwJPSqEyuflcH2cbq7yVriooJVDVe0m/view?usp=sharing

A developer-configurable stat normalization framework for Essentials v21.1.

Intro:


Level Syncing is the temporary adjustment of your battlers’ stats to match a predefined value in order to add challenge to your game. Most level syncing in Pokemon games have been reserved through postgame simulation like Battle Frontier facilities, or PWT where your party’s pokemon are typically level 50. However, my system operates in a similar style to FFXIV’s level syncing system where the syncing applies to every pokemon at or above some limit configured by the developer. In the case of FFXIV, this is the level and equipment level best defined for a certain instance of a dungeon, raid, or whatever, to preserve game balance in lower level content. Movesets are even reduced. Due to how Pokemon is structured, I won’t force the player to change their mons’ moveset each time a level-synced battle happens; I’ll just sync the BPs with their moves to simulate the moveset reduction.

Please note that level sync can also be used for immersion. Most NPCs in the Pokemon world do not level their pokemon past 70 (battles against wild legendaries), 5,6 7-star raid battles (level 75), vs Red in the HGSS/GSC games (80/81). There are few, select instances of pokemon set beyond. If I remember correctly there are battle facilities in Emerald and Pt that sync stats to 100 but those are honestly exceptions. In the context of a story mode adventure, if you overlevel your pokemon it really does break immersion but it is also extremely hard not to happen since these games have an abundant availability of exp. HGSS/GSC tried to fix this by “flatting the level curve” in Kanto and Johto, but that also lead to a boring gameplay experience, especially since the route pokemon in Kanto were appropriate to their Kanto-generation games and not increased to accommodate the fact that most players won’t reset their teams upon travelling to a new region.

So my solution is the halfway point. I have a fully customizable suite of developer options for the Pokemon Essentials game dev to tinker with. Please note that when I say sync levels,
pokemon under the sync caps will not be synced. I have programmed battle ui to display synced stats as orange in their respective menus. If you don’t like that color you can change it to whatever your heart desires.


Version Info


Current version: 2.1.0
Ver 2.1.0 bug fixes and features

  • fixed a bug with the options menu that displayed a popup when the game double saved your data (which was also fixed)
  • added a metadata file so you can edit my configuration options without hard-coding them and having to reintegrate them every I time I update the plugin
  • added in a Badge Count Level Sync Mode that will sync your pokemon's level caps to the amount of badges you have. The caps are configured in the new metadata file ! :)
  • I added a python app that will recolor the sprite icons (since the numbers in the databox are spites and the sync icons are also sprites not rendered text) more documentation will be coming ...after I cure my pokopia addiction
  • put all my UI code apart from the settings menu into a new rb file, LSUI.rb
Ver. 2.0.0 Features and Bug Fixes:
  • Fixed stability issues for entire project
  • Added mega evolution stat handling and EXP capping
  • A sync icon will appear on level synced pokemons’ ui: In-battle DataBox, summary screen, pokemon party ui box
  • Text will turn yellow when affected by the summary screen. If you don’t like that color, the color’s RGB is saved in the file LSSettings under @LSTextColor.
  • Level sync applies to the entire party
  • Level sync animation is there upon battle start (can be altered to fit your game’s specific narrative/context. You can edit the message text in LSSettings under the variable @LSBattleMessage ||= _INTL("Level Sync is now in effect!"). Simply change the text inside the orange double quotes.
  • Sample event script code has been added to the file EventInfo.txt
  • Added a BOATLOAD of configurable debug messages; if you don’t want them printing to your terminal then comment them out with a # symbol at the beginning of the line.
  • RANDOM mode changed to choose only 1 pokemon on the enemy side to set level sync caps. I can readd the previous iteration of RANDOM mode should we need
  • Mega Evolution stat handling:
    • Mega evolved pokemon will break the base stat sync cap only by increase in their respective stats. For instance, Charizard gains 46 points in its attack stats upon mega evolving into Mega Charizard X. If Charizard's attack was synced to 70 pre-mega, Charizard-X's base attack will be 116
  • Bug with HP handling when not at full; HP now resets to the same ratio, rounded down to prevent overhealing or over punishment.
    • On developer demand I can do "set your hp to whatever it was post-sync"

Ver. 1.0.1 Bug Fixes
Bug Fixes:

  • LS Settings Menu item ordering updated
  • Separated Map lists so that the game can store independent level syncing map lists for wild battles and for trainer battles

Level Syncing Features

Primary Plugin Features + Usage Guide


> Developer options menu accessible via debug mode

About 14 different settings for the game to selectively level sync battles

  • Level Sync -> On/Off
    • Enables/Disables level syncing entirely
  • Global Level Sync -> Every Battle will be level synced
    • If Off, then it will ask you to choose between syncing trainer battles or wild battles)
  • Synced Stats
    • You can customize which stats can be synced.
    • If a trainer’s pokemon changes form mid-battle, stats on your pokemon will NOT recalculate based on its new form, e.g. your team will sync to match Korrina’s Lucario NOT Korrina’s Mega Lucario.
      • “Level”
        • Syncs to a specified level cap based on the mode chosen
      • “IVs”
        • Syncs to a specified IV value cap based on the mode chosen
      • “EVs”
        • Syncs to a specified EV value cap based on the mode chosen
      • “BaseStats”
        • Syncs to a specified Base Stat value cap based on the mode chosen.
        • Game Design note: My recommendation for this to be off unless you want your players in for a huge challenge.
      • “BP” -> Syncs to a specified move Base Power value cap based on the mode chosen
        • Moves with 0 BP (status moves) are unaffected.
        • Game Design note: This can bring in unique strategies but can be frustrating for players who are used to spamming High BP moves to cheese their way through challenges.
      • “Experience”
        • Will toggle EXP based on either their current level or synced level. Synced level 100 pokemon will still not receive EXP.
        • Game Design note: Nuzlockers tend to be frustrated with the newer games’ EXP share system, so this could be a viable way to deal with this frustration
  • Wild Battle Global (On, Off)
    • If enabled, all wild battles will be level synced, if off you can customize which battles will be synced by the following options that’ll appear.
    • Essentials v21.1 categorizes Fateful Encounters as wild battles, so all settings pertaining to wild battles also apply here.
  • Wild Battle Mode (Encounters, Maps)
    • If “encounters,” all pokemon of a specified encounter type will be synced (and it doesn’t matter where it happens)
      • Game Design Note: You can make copies of these encounters if you want the same encounter but with different behavior
    • If “maps” you will specify which map(s) you want all wild battles to be synced on.
      • Game Design Note: You may want to tuck in a warning message to the player to tell them if their pokemon will be synced upon entering an area. The safari zone could be a cool example of a situation that might need level synced wild battles!
  • Trainer Battle Global
    • If enabled all trainer battles will be level synced; if off, you can customize which battles will be synced by the following options that’ll appear
  • Trainer Battle Mode (Classes, Maps)
    • If “classes” all trainers of that trainer type class will be synced.
      • Game Design notes: e.g. all gym leaders, champion, Elite 4, rocket bosses, etc. It may be overkill to sync random map trainers but that’s up to you!
    • If “maps” all trainers of that map will be synced.
      • Game Design notes: battle frontier, gyms, victory road, indigo plateau are all great examples of possible use cases
  • Level Sync Mode
    • Default: Max.
    • If “Max” every time a battle is started on the opposing side, the program will find the pokemon in their roster with the highest value in all of the stats specified in “Synced Stats” and will determine the stats from those pokemon. (Example below)
    • If “Min” every time a battle is started on the opposing side, the program will find the pokemon in their roster with the lowest value in all of the stats specified in “Synced Stats” and will determine the stats from those pokemon. (Example below).
      • Due to how varied a pokemon’s stat spread can be this can be extremely punishing to the player if you aren’t careful about the your trainer’s roster
    • If “Random” every time a battle is started on the opposing side, the program will find a random pokemon in their roster for each of the stats specified in “Synced Stats” and will determine the stats from those pokemon. E.g. it will randomly pick a pokemon for each stat. I can adjust this later for future releases.
      • Game Design note: Nuzlockers may not like the stat unpredictability, but if you tune the battles correctly you can make it somewhat more predictable for the player to plan around.
    • If “User Value” is selected you will have the opportunity to fine tune the level caps on the selected substats from the “synced stats” option to whatever encounters/battles you specified
      • Game Design note: This will apply to every synced encounter, so if you have only really specific instances of syncing like at a Battle Frontier facility, or or a Smogon-like battle simulator
    • You cannot choose to mix picking min and maxes of individual stats; it is all MAX, RANDOM, or MIN values.

The following are visual examples of Level Syncing using Byron’s Pt team as an example:
(all sprites/Base stats sourced off BMG … and pretend we have modded the game to allow for mega evolution!)
(Trainer data sourced here:
https://nuzlockeforums.com/forum/threads/official-natures-movesets-and-stats.277/ )
Values highlighted in orange are chosen if MAX mode is present, and those highlighted in cyan are chosen if MIN mode is present:


Sprite
Pokemon
Steelix
Magnemite
Bastiodon
Level
38
37
41
Moves
Sandstorm (BP:0)
Flash Cannon (BP:80)
Earthquake (BP:100)
Ice Fang (BP:65)
Flash Cannon(BP: 80)
Thunderbolt(BP: 90)
TriAttack(BP: 80)
Metal Sound(BP: 0)
Metal Burst (BP:0)
Iron Defense (BP: 0)
Stone Edge (BP: 100)
Taunt: (BP:0)
IV
All 24
All 24
All 24
EV
All 0
All 0
All 0\
Base Stats
HP: 75
Atk: 85
Def: 200
Sp Atk: 55
Sp Def: 65
Spd: 30
HP: 60
Atk: 50
Def: 95
Sp Atk: 120
Sp Def: 70
Spd: 70
HP: 60
Atk: 52
Def: 168
Sp Atk: 47
Sp Def: 138
Spd: 30

So if I bring a Charizard (lv 50), Rapidash (lv 35), and a Magmortar (lv 40) each with random, non zero EVs and random IVs their stats will reflect the following ways (note I am using BPs from gen 4):
(Note: stats in orange will be synced to that value in MAX mode, and stats in cyan will be synced to that value in MIN mode, and stats not highlighted will not be synced since they’re under the cap.)


Pokemon
Charizard|
Mega Charizard X
Rapidash
Magmortar
Level
41 | 37
35​
40 | 37​
Moves
Fire Blast(BP: 100 | 65)
Fly (BP: 90 | 65)
Dragon Claw (BP:80 | 65 )
Shadow Claw (BP: 70 | 65 )
Megahorn(BP: 100 | 65)
Agility(BP: 0)
Take Down(BP: 80 | 65)
Flamethrower(BP: 95 | 65)
Thunderbolt (BP: 90 | 65)
Will-O-Wisp (BP: 0)
Flamethrower (BP: 95 | 65)
Hyper Beam: (BP: 100 | 65)
IV
All capped to 24
All capped to 24
All capped to 24
EV
All 0
All 0
All 0
Base Stats
HP: 75 | 60
Atk: 84 | 50
Def: 78
Sp Atk: 109 | 47
Sp Def: 85 | 65
Spd: 70 | 30
HP: 75 | 60 (+0)
Atk: 130 | 96 (+46)
Def: 111 (+33)
Sp. Atk: 130 | 68 (+21)
Sp. Def: 85 | 65 (+0)
Spd: 70 | 30 (+0)
HP: 65 | 60
Atk: 85 | 50
Def: 70
Sp Atk: 80 | 47
Sp Def: 80 | 65
Spd: 70 | 30
HP: 75 | 60
Atk: 85 | 50
Def: 67
Sp Atk: 120 | 47
Sp Def: 95 | 65
Spd: 70 | 30

Game Design tip: Don’t sync Base Stats on MIN mode as pokemon with extremes in base stats might cause the minimum values to be overly punishing to the player; but hey I’m not telling you how to design battles!

Known Bugs

Bugs in Ver. 2.0.0
  • No code for Max Moves. It may just cap them blindly, or not all, or crash the game.
  • No code for Dynamax, but Dynamax and Gigantamax only double base hp which woud be synced prior, meaning it should double the synced base hp value.

Bugs in Ver. 1.0.1:
  • The player’s Mega evolution or form changes’ base stats are not checked to be synced. If the base stats are changed, then the game may have unpredictable stability.
  • Experience capping functionality has not been programmed; it is a placeholder setting for now

Essentials Bug Fixes:


UI Fixes: Sliders displayed values whose min values > 0 incorrectly. They set values correctly but displayed the max value weirdly as the sum of min + max; logic now works for any set of values.

Since UI options are individual classes defined on their own respective UI menu class, this bug was unfortunately only fixed for my script and not the base essentials game.

Essentials UI Add-Ons


A custom made UI options menu that immediately updates conditional menu options without having to close the menu and reload it for it to appear.

Added a new menu option type of a multiselect tool.

Since UI options are individual classes defined on their own respective UI menu class, menu option is unfortunately only available for my script and not the base essentials game. You’ll have to rewrite a LOT of base code in the generic menu classes to incorporate the controls, and proper auto-updating behavior.


Planned Future Version Additions:

1) Gym badge based level syncing settings for Nuzlocke enthusiasts

2) Player-exposed commands for level sync (and obviously they'll be more limited than the developer's

Integration Notes for Other Plugin Developers

Stat Calculation Order

  • Determine cap values (based on mode)
  • Cap Level
  • Cap IV
  • Cap EV
  • Recalculate stats
  • Cap battler stats (if BaseStats enabled)
  • Cap Move BP
  • Apply EXP logic
Level Stat Capping
- The @pokemon object has been edited to allow storage of state and past level values.
Credits
juliorain
Author
juliorain
Views
1,212
First release
Last update

Ratings

0.00 star(s) 0 ratings

More resources from juliorain

Latest updates

  1. Patch 2.1

    fixed a bug with the options menu that displayed a popup when the game double saved your data...
  2. Ver. 2.0.0

    Complete rewrite of the code. Fixed stability issues for entire project Added mega evolution...
Back
Top