From ad69eae1a3c5442a11067fe050d407cb2bbbf814 Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 21 Aug 2026 23:10:19 -0500 Subject: [PATCH] Add legality rule tweak for Battle Tower rsbox illegal by default, opt in It's an extremely precise exploit that can even apply ribbons to eggs; RSBOX allows mutating the party when it should be "locked" in the brief moment before the ribbons are awarded. Permitting this exploit is generally against community consensus, so it's an opt-in. Eggs will be flagged, even though the exploit can be used to get ribbons on the eggs. ty C87H176 via pporg: https://projectpokemon.org/home/forums/topic/68163-how-to-give-ribbons-to-legendary-pok%C3%A9mon-using-pok%C3%A9mon-box-ruby-sapphire/ I considered making this an enum setting like the others, but the ribbon API doesn't support non-boolean verdicts at this time. also translate the new batch editor controls from the previous pull request --- .../Settings/Specialized/GameSpecificSettings.cs | 14 ++++++++++++++ .../Legality/Verifiers/Ribbons/RibbonRules.cs | 9 +++++++-- PKHeX.WinForms/Resources/text/lang_de.txt | 7 ++++++- PKHeX.WinForms/Resources/text/lang_en.txt | 7 ++++++- PKHeX.WinForms/Resources/text/lang_es-419.txt | 7 ++++++- PKHeX.WinForms/Resources/text/lang_es.txt | 7 ++++++- PKHeX.WinForms/Resources/text/lang_fr.txt | 7 ++++++- PKHeX.WinForms/Resources/text/lang_it.txt | 7 ++++++- PKHeX.WinForms/Resources/text/lang_ja.txt | 7 ++++++- PKHeX.WinForms/Resources/text/lang_ko.txt | 7 ++++++- PKHeX.WinForms/Resources/text/lang_zh-Hans.txt | 7 ++++++- PKHeX.WinForms/Resources/text/lang_zh-Hant.txt | 7 ++++++- 12 files changed, 81 insertions(+), 12 deletions(-) diff --git a/PKHeX.Core/Legality/Settings/Specialized/GameSpecificSettings.cs b/PKHeX.Core/Legality/Settings/Specialized/GameSpecificSettings.cs index b54cce2bf..9d4ae367f 100644 --- a/PKHeX.Core/Legality/Settings/Specialized/GameSpecificSettings.cs +++ b/PKHeX.Core/Legality/Settings/Specialized/GameSpecificSettings.cs @@ -5,10 +5,24 @@ namespace PKHeX.Core; [TypeConverter(typeof(ExpandableObjectConverter))] public sealed class GameSpecificSettings { + public GameSpecificSettings3 Gen3 { get; set; } = new(); public GameSpecificSettings7 Gen7 { get; set; } = new(); public GameSpecificSettings8 Gen8 { get; set; } = new(); } +[TypeConverter(typeof(ExpandableObjectConverter))] +public sealed class GameSpecificSettings3 +{ + /// + /// Pokemon Box: Ruby & Sapphire allows swapping of teams at a precise time, which can put Mythicals/Legends/Over-leveled into the team slots before the ribbon award sequence. + /// + /// + /// https://projectpokemon.org/home/forums/topic/68163-how-to-give-ribbons-to-legendary-pok%C3%A9mon-using-pok%C3%A9mon-box-ruby-sapphire/ + /// + [LocalizedDescription("Rule-tweak to allow the Pokemon Box: Ruby & Sapphire exploit to obtain Battle Tower ribbons illegitimately.")] + public bool AllowBattleTowerTeamSwap { get; set; } +} + [TypeConverter(typeof(ExpandableObjectConverter))] public sealed class GameSpecificSettings7 { diff --git a/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonRules.cs b/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonRules.cs index 6e31e7582..c0a6ed29a 100644 --- a/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonRules.cs +++ b/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonRules.cs @@ -197,6 +197,9 @@ public static bool IsRibbonValidWinning(PKM pk, IEncounterTemplate enc, Evolutio { if (!evos.HasVisitedGen3) return false; + if (ParseSettings.Settings.Game.Gen3.AllowBattleTowerTeamSwap) + return true; + if (!IsAllowedBattleFrontier(evos.Gen3[0].Species)) return false; @@ -217,7 +220,7 @@ public static bool IsRibbonValidWinning(PKM pk, IEncounterTemplate enc, Evolutio public static bool IsRibbonValidVictory(EvolutionHistory evos) { if (evos.HasVisitedGen3) - return IsAllowedBattleFrontier(evos.Gen3[0].Species); + return IsAllowedBattleFrontier(evos.Gen3[0].Species) || ParseSettings.Settings.Game.Gen3.AllowBattleTowerTeamSwap; return false; } @@ -294,7 +297,9 @@ public static (byte Contest, byte Battle) GetMaxMemoryCounts(EvolutionHistory ev { var head = evos.Gen3[0]; // Checking contest with Gen3 head is fine; all false cases cannot evolve (evolution chain is same Gen3/Gen4). var contest = IsAllowedContest4(head.Species, head.Form) ? MaxContestBoth : MaxContest3; - var battle = IsAllowedBattleFrontier(head.Species) ? IsRibbonValidWinning(pk, enc, evos) ? MaxBattleBoth : MaxBattleBothNoWinning : (byte)0; + var battle = !IsAllowedBattleFrontier(head.Species) + ? ParseSettings.Settings.Game.Gen3.AllowBattleTowerTeamSwap ? MaxBattle3 : (byte)0 + : IsRibbonValidWinning(pk, enc, evos) ? MaxBattleBoth : MaxBattleBothNoWinning; return (contest, battle); } if (evos.HasVisitedGen4) diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index fb7649757..9c2d0e4b4 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -122,7 +122,11 @@ BatchEdit.mnu_≤=≤ BatchEdit.mnu_≥=≥ BatchEdit.mnu_Set=&Set BatchEditor.B_Add=Hinzufügen -BatchEditor.B_Go=Ausführen +BatchEditor.B_Cancel=Abbrechen +BatchEditor.B_Reset=Zurücksetzen +BatchEditor.B_Run=Ausführen +BatchEditor.B_Save=Speichern +BatchEditor.L_Count=Übereinstimmungen: {0} / {1} BatchEditor.RB_Boxes=Boxen BatchEditor.RB_Party=Team BatchEditor.RB_Path=Ordner... @@ -373,6 +377,7 @@ KChart.DGV_SpecName=Name KChart.DGV_Sprite=Sprite KChart.DGV_Type1=Typ1 KChart.DGV_Type2=Typ2 +LocalizedDescription.AllowBattleTowerTeamSwap=Regeländerung, um den Pokémon Box: Rubin & Saphir-Exploit zu erlauben, mit dem Battle Tower-Bänder unrechtmäßig erhalten werden können. LocalizedDescription.AllowBoxDataDrop=Ermöglicht das Drag-and-Drop von Box-Binärdateien aus der Benutzeroberfläche über den Box-Tab. LocalizedDescription.AllowGen1Tradeback=Erlaube Gen 1 Rücktausch LocalizedDescription.AllowGuessRejuvenateHOME=Erlaube der PKM Konvertierung, legale Begegnungs Daten, welche nicht im vorherigen Format gespeichert sind, zu erraten. diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index e8afc10a0..5f6451fd7 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -122,7 +122,11 @@ BatchEdit.mnu_≤=≤ BatchEdit.mnu_≥=≥ BatchEdit.mnu_Set=&Set BatchEditor.B_Add=Add -BatchEditor.B_Go=Run +BatchEditor.B_Cancel=Cancel +BatchEditor.B_Reset=Reset +BatchEditor.B_Run=Run +BatchEditor.B_Save=Save +BatchEditor.L_Count=Matching: {0} / {1} BatchEditor.RB_Boxes=Boxes BatchEditor.RB_Party=Party BatchEditor.RB_Path=Folder... @@ -373,6 +377,7 @@ KChart.DGV_SpecName=Name KChart.DGV_Sprite=Sprite KChart.DGV_Type1=Type1 KChart.DGV_Type2=Type2 +LocalizedDescription.AllowBattleTowerTeamSwap=Allow the Pokemon Box: Ruby & Sapphire exploit to obtain Battle Tower ribbons illegitimately. LocalizedDescription.AllowBoxDataDrop=Allow drag and drop of boxdata binary files from the GUI via the Box tab. LocalizedDescription.AllowGen1Tradeback=GB: Allow Generation 2 tradeback learnsets LocalizedDescription.AllowGuessRejuvenateHOME=Allow PKM file conversion paths to guess the legal original encounter data that is not stored in the format that it was converted from. diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index dc537da95..bd204527c 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -122,7 +122,11 @@ BatchEdit.mnu_≤=≤ BatchEdit.mnu_≥=≥ BatchEdit.mnu_Set=&Set BatchEditor.B_Add=Añadir -BatchEditor.B_Go=Ejecutar +BatchEditor.B_Cancel=Cancelar +BatchEditor.B_Reset=Restablecer +BatchEditor.B_Run=Ejecutar +BatchEditor.B_Save=Guardar +BatchEditor.L_Count=Coincidencias: {0} / {1} BatchEditor.RB_Boxes=Cajas BatchEditor.RB_Party=Equipo BatchEditor.RB_Path=Carpeta... @@ -373,6 +377,7 @@ KChart.DGV_SpecName=Nombre KChart.DGV_Sprite=Sprite KChart.DGV_Type1=Tipo1 KChart.DGV_Type2=Tipo2 +LocalizedDescription.AllowBattleTowerTeamSwap=Ajuste de reglas para permitir la explotación de Pokémon Box: Rubí y Zafiro para obtener cintas de la Torre Batalla de forma ilegítima. LocalizedDescription.AllowBoxDataDrop=Permitir arrastrar y soltar archivos binarios de datos de cajas desde la GUI mediante la pestaña Caja. LocalizedDescription.AllowGen1Tradeback=GB: Permitir intercambio de movimientos desde la Generación 2. LocalizedDescription.AllowGuessRejuvenateHOME=Permitir adivinar a la ruta de conversión de archivos PKM los datos del encuentro original que no estén almacenados en el formato origen. diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index e181637a2..53f167e90 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -122,7 +122,11 @@ BatchEdit.mnu_≤=≤ BatchEdit.mnu_≥=≥ BatchEdit.mnu_Set=&Set BatchEditor.B_Add=Añadir -BatchEditor.B_Go=Ejecutar +BatchEditor.B_Cancel=Cancelar +BatchEditor.B_Reset=Restablecer +BatchEditor.B_Run=Ejecutar +BatchEditor.B_Save=Guardar +BatchEditor.L_Count=Coincidencias: {0} / {1} BatchEditor.RB_Boxes=Cajas BatchEditor.RB_Party=Equipo BatchEditor.RB_Path=Carpeta... @@ -373,6 +377,7 @@ KChart.DGV_SpecName=Nombre KChart.DGV_Sprite=Sprite KChart.DGV_Type1=Tipo1 KChart.DGV_Type2=Tipo2 +LocalizedDescription.AllowBattleTowerTeamSwap=Ajuste de reglas para permitir el exploit de Pokémon Box: Rubí y Zafiro para obtener cintas de la Torre Batalla de forma ilegítima. LocalizedDescription.AllowBoxDataDrop=Permitir arrastrar y soltar archivos binarios de datos de cajas desde la GUI mediante la pestaña Caja. LocalizedDescription.AllowGen1Tradeback=GB: Permitir intercambio de movimientos desde la Generación 2. LocalizedDescription.AllowGuessRejuvenateHOME=Permitir adivinar a la ruta de conversión de archivos PKM los datos del encuentro original que no estén almacenados en el formato origen. diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index 27693dd5d..4d96efb90 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -122,7 +122,11 @@ BatchEdit.mnu_≤=≤ BatchEdit.mnu_≥=≥ BatchEdit.mnu_Set=Régler BatchEditor.B_Add=Ajouter -BatchEditor.B_Go=Exécuter +BatchEditor.B_Cancel=Annuler +BatchEditor.B_Reset=Réinitialiser +BatchEditor.B_Run=Exécuter +BatchEditor.B_Save=Enregistrer +BatchEditor.L_Count=Correspondances : {0} / {1} BatchEditor.RB_Boxes=Boîtes BatchEditor.RB_Party=Équipe BatchEditor.RB_Path=Dossier... @@ -373,6 +377,7 @@ KChart.DGV_SpecName=Nom KChart.DGV_Sprite=Sprite KChart.DGV_Type1=Type1 KChart.DGV_Type2=Type2 +LocalizedDescription.AllowBattleTowerTeamSwap=Ajustement de règle pour autoriser l'exploit de Pokémon Box : Rubis et Saphir afin d'obtenir illégitimement des rubans de la Tour de Combat. LocalizedDescription.AllowBoxDataDrop=Permet de glisser-déposer les données de boîte au format binaire depuis l'interface en utilisant l'onglet Boîte. LocalizedDescription.AllowGen1Tradeback=GB : Autorise les attaques de revenants de la 2ème génération LocalizedDescription.AllowGuessRejuvenateHOME=Autorise les chemins de conversion des fichiers PKM de deviner les données de rencontre originales légales qui ne sont pas stockées dans le format à partir duquel elles ont été converties. diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index 8676e2e52..6745b48c6 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -122,7 +122,11 @@ BatchEdit.mnu_≤=≤ BatchEdit.mnu_≥=≥ BatchEdit.mnu_Set=&Set BatchEditor.B_Add=Aggiungi -BatchEditor.B_Go=Avvia +BatchEditor.B_Cancel=Annulla +BatchEditor.B_Reset=Reimposta +BatchEditor.B_Run=Esegui +BatchEditor.B_Save=Salva +BatchEditor.L_Count=Corrispondenze: {0} / {1} BatchEditor.RB_Boxes=Box BatchEditor.RB_Party=Squadra BatchEditor.RB_Path=Cartella... @@ -373,6 +377,7 @@ KChart.DGV_SpecName=Nome KChart.DGV_Sprite=Sprite KChart.DGV_Type1=Tipo1 KChart.DGV_Type2=Tipo2 +LocalizedDescription.AllowBattleTowerTeamSwap=Modifica della regola per consentire l'exploit di Pokémon Box: Rubino e Zaffiro per ottenere illegittimamente nastri della Torre Lotta. LocalizedDescription.AllowBoxDataDrop=Consente il trascinamento dei file binari boxdata dall'interfaccia grafica tramite la scheda Box. LocalizedDescription.AllowGen1Tradeback=GB:Consenti insieme di mosse tradeback da 2° Generazione. LocalizedDescription.AllowGuessRejuvenateHOME=Prova ad indovinare dati di incontro originali legali, quando questi non sono contenuti all'interno del file di origine. diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index ffc8724a8..1cdd57c29 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -122,7 +122,11 @@ BatchEdit.mnu_≤=≤ BatchEdit.mnu_≥=≥ BatchEdit.mnu_Set=&Set BatchEditor.B_Add=追加 -BatchEditor.B_Go=実行 +BatchEditor.B_Cancel=キャンセル +BatchEditor.B_Reset=リセット +BatchEditor.B_Run=実行 +BatchEditor.B_Save=保存 +BatchEditor.L_Count=一致: {0} / {1} BatchEditor.RB_Boxes=ボックス BatchEditor.RB_Party=パーティ BatchEditor.RB_Path=フォルダ @@ -373,6 +377,7 @@ KChart.DGV_SpecName=名前 KChart.DGV_Sprite=スプライト KChart.DGV_Type1=タイプ1 KChart.DGV_Type2=タイプ2 +LocalizedDescription.AllowBattleTowerTeamSwap=ルール調整:『ポケモンボックス ルビー・サファイア』のエクスプロイトを許可してバトルタワーのリボンを不正に入手できるようにします。 LocalizedDescription.AllowBoxDataDrop=ボックスタブから、GUI経由で boxdata バイナリファイルのドラッグ&ドロップを許可します。 LocalizedDescription.AllowGen1Tradeback=GB: 第2世代からの逆輸入による技構成を許可します。 LocalizedDescription.AllowGuessRejuvenateHOME=PKMファイル変換時、変換元形式に保存されていない正規な元の出会い情報を推測することを許可します。 diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index da2d4c8ef..2f885ee70 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -122,7 +122,11 @@ BatchEdit.mnu_≤=≤ BatchEdit.mnu_≥=≥ BatchEdit.mnu_Set=&Set BatchEditor.B_Add=추가 -BatchEditor.B_Go=실행 +BatchEditor.B_Cancel=취소 +BatchEditor.B_Reset=재설정 +BatchEditor.B_Run=실행 +BatchEditor.B_Save=저장 +BatchEditor.L_Count=일치: {0} / {1} BatchEditor.RB_Boxes=박스 BatchEditor.RB_Party=파티 BatchEditor.RB_Path=폴더... @@ -373,6 +377,7 @@ KChart.DGV_SpecName=이름 KChart.DGV_Sprite=스프라이트 KChart.DGV_Type1=타입1 KChart.DGV_Type2=타입2 +LocalizedDescription.AllowBattleTowerTeamSwap=규칙 조정: Pokémon Box: 루비·사파이어의 익스플로잇을 허용하여 배틀 타워 리본을 부정하게 획득할 수 있도록 합니다. LocalizedDescription.AllowBoxDataDrop=박스 탭을 통해 GUI에서 박스 데이터 바이너리 파일을 드래그 앤 드롭 허용. LocalizedDescription.AllowGen1Tradeback=GB: 2세대에서 옮겨온 1세대 기술 허용 LocalizedDescription.AllowGuessRejuvenateHOME=변환된 형식에 저장되지 않은 합법적인 원래 출현 데이터를 PKM 파일 변환 경로가 추측하도록 허용. diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index f0103058b..35ec229e4 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -122,7 +122,11 @@ BatchEdit.mnu_≤=≤ BatchEdit.mnu_≥=≥ BatchEdit.mnu_Set=设置 BatchEditor.B_Add=增加 -BatchEditor.B_Go=运行 +BatchEditor.B_Cancel=取消 +BatchEditor.B_Reset=重置 +BatchEditor.B_Run=运行 +BatchEditor.B_Save=保存 +BatchEditor.L_Count=匹配:{0} / {1} BatchEditor.RB_Boxes=盒子 BatchEditor.RB_Party=队伍 BatchEditor.RB_Path=文件夹... @@ -373,6 +377,7 @@ KChart.DGV_SpecName=名称 KChart.DGV_Sprite=图标 KChart.DGV_Type1=属性1 KChart.DGV_Type2=属性2 +LocalizedDescription.AllowBattleTowerTeamSwap=规则调整:允许使用《宝可梦盒子:红宝石与蓝宝石》的漏洞以非法获取对战塔缎带。 LocalizedDescription.AllowBoxDataDrop=允许通过GUI的Box标签拖放boxdata二进制文件。 LocalizedDescription.AllowGen1Tradeback=GB 允许二代传回的招式组合 LocalizedDescription.AllowGuessRejuvenateHOME=允许在PKM文件转换中猜测那些未在文件中存储的合法原始相遇数据。 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index b0cae3fcd..cf57f90e8 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -122,7 +122,11 @@ BatchEdit.mnu_≤=≤ BatchEdit.mnu_≥=≥ BatchEdit.mnu_Set=設置 BatchEditor.B_Add=增加 -BatchEditor.B_Go=運行 +BatchEditor.B_Cancel=取消 +BatchEditor.B_Reset=重設 +BatchEditor.B_Run=執行 +BatchEditor.B_Save=儲存 +BatchEditor.L_Count=匹配:{0} / {1} BatchEditor.RB_Boxes=盒子 BatchEditor.RB_Party=隊伍 BatchEditor.RB_Path=資料夾... @@ -373,6 +377,7 @@ KChart.DGV_SpecName=名稱 KChart.DGV_Sprite=圖標 KChart.DGV_Type1=屬性1 KChart.DGV_Type2=屬性2 +LocalizedDescription.AllowBattleTowerTeamSwap=規則調整:允許使用《寶可夢盒子:紅寶石與藍寶石》的漏洞以非法取得對戰塔緞帶。 LocalizedDescription.AllowBoxDataDrop=允許透過GUI的Box標籤拖放boxdata二進位檔案。 LocalizedDescription.AllowGen1Tradeback=GB 允許從第二世代傳回之招式組合 LocalizedDescription.AllowGuessRejuvenateHOME=允許 PKM 檔轉換時猜測未於轉換格式存儲的合法原始遇見數據。