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
This commit is contained in:
Kurt
2026-08-21 23:10:19 -05:00
parent c0e1cc86b8
commit ad69eae1a3
12 changed files with 81 additions and 12 deletions

View File

@@ -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
{
/// <summary>
/// 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.
/// </summary>
/// <remarks>
/// https://projectpokemon.org/home/forums/topic/68163-how-to-give-ribbons-to-legendary-pok%C3%A9mon-using-pok%C3%A9mon-box-ruby-sapphire/
/// </remarks>
[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
{

View File

@@ -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)

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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ファイル変換時、変換元形式に保存されていない正規な元の出会い情報を推測することを許可します。

View File

@@ -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 파일 변환 경로가 추측하도록 허용.

View File

@@ -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文件转换中猜测那些未在文件中存储的合法原始相遇数据。

View File

@@ -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 檔轉換時猜測未於轉換格式存儲的合法原始遇見數據。