From a55b2b18e80a49a56a4d3c585da7117e3ed171f1 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Wed, 29 Oct 2025 23:27:03 +0100 Subject: [PATCH] [UI/UX][Beta] Adjustments to display of ribbons (#6709) * Introduce custom ordering of ribbons * Displaying classic ribbon for mons that have at least one classic win --------- Co-authored-by: damocleas --- src/ui/containers/ribbon-tray-container.ts | 15 ++++++-- src/utils/ribbon-utils.ts | 44 ++++++++++++++++++++++ 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/ui/containers/ribbon-tray-container.ts b/src/ui/containers/ribbon-tray-container.ts index 0f2e5137c06..038e03f5ef4 100644 --- a/src/ui/containers/ribbon-tray-container.ts +++ b/src/ui/containers/ribbon-tray-container.ts @@ -1,11 +1,11 @@ import { globalScene } from "#app/global-scene"; import type { PokemonSpecies } from "#data/pokemon-species"; import { Button } from "#enums/buttons"; -import type { RibbonData, RibbonFlag } from "#system/ribbons/ribbon-data"; +import { RibbonData, type RibbonFlag } from "#system/ribbons/ribbon-data"; import { ribbonFlagToAssetKey } from "#system/ribbons/ribbon-methods"; import type { MessageUiHandler } from "#ui/message-ui-handler"; import { addWindow } from "#ui/ui-theme"; -import { getAvailableRibbons, getRibbonKey } from "#utils/ribbon-utils"; +import { getAvailableRibbons, getRibbonKey, orderedRibbons } from "#utils/ribbon-utils"; import i18next from "i18next"; export class RibbonTray extends Phaser.GameObjects.Container { @@ -111,8 +111,15 @@ export class RibbonTray extends Phaser.GameObjects.Container { this.trayIcons = []; let index = 0; - for (const ribbon of getAvailableRibbons(species)) { - const hasRibbon = this.ribbonData.has(ribbon); + + const availableRibbons = getAvailableRibbons(species); + const availableOrderedRibbons = orderedRibbons.filter(r => availableRibbons.includes(r)); + + const hasWonClassic = globalScene.gameData.starterData[species.speciesId]?.classicWinCount > 0; + + for (const ribbon of availableOrderedRibbons) { + const hasRibbon = this.ribbonData.has(ribbon) || (ribbon === RibbonData.CLASSIC && hasWonClassic); + if (!hasRibbon && !globalScene.dexForDevs && !globalScene.showMissingRibbons) { continue; } diff --git a/src/utils/ribbon-utils.ts b/src/utils/ribbon-utils.ts index f45cfef80d8..20c0e755be7 100644 --- a/src/utils/ribbon-utils.ts +++ b/src/utils/ribbon-utils.ts @@ -170,3 +170,47 @@ export function getRibbonKey(flag: RibbonFlag): string { return ""; } } + +/** + * This list is used to determined the display order of ribbons in the Pokédex. + */ +export const orderedRibbons: RibbonFlag[] = [ + RibbonData.CLASSIC, + RibbonData.FRIENDSHIP, + RibbonData.FRESH_START, + RibbonData.HARDCORE, + RibbonData.LIMITED_CATCH, + RibbonData.NUZLOCKE, + RibbonData.NO_HEAL, + RibbonData.NO_SHOP, + RibbonData.NO_SUPPORT, + RibbonData.MONO_GEN_1, + RibbonData.MONO_GEN_2, + RibbonData.MONO_GEN_3, + RibbonData.MONO_GEN_4, + RibbonData.MONO_GEN_5, + RibbonData.MONO_GEN_6, + RibbonData.MONO_GEN_7, + RibbonData.MONO_GEN_8, + RibbonData.MONO_GEN_9, + RibbonData.MONO_NORMAL, + RibbonData.MONO_FIGHTING, + RibbonData.MONO_FLYING, + RibbonData.MONO_POISON, + RibbonData.MONO_GROUND, + RibbonData.MONO_ROCK, + RibbonData.MONO_BUG, + RibbonData.MONO_GHOST, + RibbonData.MONO_STEEL, + RibbonData.MONO_FIRE, + RibbonData.MONO_WATER, + RibbonData.MONO_GRASS, + RibbonData.MONO_ELECTRIC, + RibbonData.MONO_PSYCHIC, + RibbonData.MONO_ICE, + RibbonData.MONO_DRAGON, + RibbonData.MONO_DARK, + RibbonData.MONO_FAIRY, + RibbonData.INVERSE, + RibbonData.FLIP_STATS, +];