Extend duplicate mega stone checker -> unique

Now covers primal orbs too.
Update translations, enhanced to show the item ID that they're duplicate (less to check when inspecting an output)
This commit is contained in:
Kurt 2025-12-29 14:11:35 -06:00
parent d6cb992d11
commit e1f6847ed9
27 changed files with 94 additions and 82 deletions

View File

@ -171,6 +171,8 @@ public static InventoryType GetInventoryPouch(ushort itemIndex)
}
public static bool IsMegaStone(ushort item) => MegaStones.Contains(item);
public static bool IsUniqueHeldItem(ushort item) => IsMegaStone(item) || item is (0534 or 0535); // Primal Orbs
public static ushort[] GetAllUniqueHeldItems() => [..MegaStones, 0534, 0535];
/// <summary>
/// Retrieves the expected Mega Stone or Primal Orb item ID for a given Pokémon species and form.

View File

@ -100,7 +100,7 @@ private static bool IsEmptyData(SlotCache obj)
private static readonly List<IBulkAnalyzer> SaveAnalyzers =
[
new DuplicateFusionChecker(),
new DuplicateMegaChecker(),
new DuplicateUniqueItemChecker(),
];
private void ScanAll()

View File

@ -4,7 +4,7 @@
namespace PKHeX.Core.Bulk;
public sealed class DuplicateMegaChecker : IBulkAnalyzer
public sealed class DuplicateUniqueItemChecker : IBulkAnalyzer
{
private const CheckIdentifier Identifier = CheckIdentifier.HeldItem;
@ -20,7 +20,7 @@ private static void AnalyzeInventory(BulkAnalysis input, SAV9ZA za)
{
var items = za.Items;
// Rule: Only 1 Mega Stone of a given Item ID may be held across all Pokémon, or present in the bag.
// Rule: Only 1 of a unique Item ID may be held across all Pokémon, or present in the bag.
Dictionary<ushort, int> seenStones = []; // ushort item, int index
for (var i = 0; i < input.AllData.Count; i++)
{
@ -28,39 +28,39 @@ private static void AnalyzeInventory(BulkAnalysis input, SAV9ZA za)
var pk = slot.Entity;
var stone = (ushort)pk.HeldItem;
if (!ItemStorage9ZA.IsMegaStone(stone))
if (!ItemStorage9ZA.IsUniqueHeldItem(stone))
continue;
var item = items.GetItem(stone);
if (item.Count == 0) // Not acquired by the save file, thus not able to be held.
input.AddLine(slot, Identifier, BulkCheckResult.NoIndex, BulkNotAcquiredMegaStoneInventory, stone);
input.AddLine(slot, Identifier, BulkCheckResult.NoIndex, BulkHeldItemInventoryNotAcquired_0, stone);
else if (!item.IsHeld) // Not marked as held, so it's still "in the bag" (not given).
input.AddLine(slot, Identifier, BulkCheckResult.NoIndex, BulkDuplicateMegaStoneInventory, stone);
input.AddLine(slot, Identifier, BulkCheckResult.NoIndex, BulkHeldItemInventoryUnassigned_0, stone);
else if (seenStones.TryGetValue(stone, out var otherIndex)) // Already given to another slot.
input.AddLine(slot, input.AllData[otherIndex], Identifier, i, index2: otherIndex, BulkDuplicateMegaStoneSlot, stone);
else // First time seeing this Mega Stone, all good.
input.AddLine(slot, input.AllData[otherIndex], Identifier, i, index2: otherIndex, BulkHeldItemInventoryMultipleSlots_0, stone);
else // First time seeing this item, all good.
seenStones[stone] = i;
}
CheckOtherUnassigned(input, items, ItemStorage9ZA.MegaStones, seenStones);
CheckOtherUnassigned(input, items, ItemStorage9ZA.GetAllUniqueHeldItems(), seenStones);
}
private static void CheckOtherUnassigned(BulkAnalysis input, MyItem9a items, ReadOnlySpan<ushort> megaStones, IReadOnlyDictionary<ushort, int> seenStones)
private static void CheckOtherUnassigned(BulkAnalysis input, MyItem9a items, ReadOnlySpan<ushort> uniqueItems, IReadOnlyDictionary<ushort, int> seenItems)
{
// Check that all other un-assigned stones are not marked as assigned.
foreach (var stone in megaStones)
foreach (var item in uniqueItems)
{
if (seenStones.ContainsKey(stone))
if (seenItems.ContainsKey(item))
continue;
var item = items.GetItem(stone);
if (item.IsHeld)
input.AddMessage(string.Empty, CheckResult.Get(Severity.Invalid, CheckIdentifier.HeldItem, BulkAssignedMegaStoneNotFound_0, stone));
var entry = items.GetItem(item);
if (entry.IsHeld)
input.AddMessage(string.Empty, CheckResult.Get(Severity.Invalid, CheckIdentifier.HeldItem, BulkHeldItemInventoryAssignedNoneHeld_0, item));
}
}
private static void AnalyzeNoInventory(BulkAnalysis input)
{
// Rule: Only 1 Mega Stone of a given Item ID may be held across all Pokémon, or present in the bag.
// Rule: Only 1 of a unique Item ID may be held across all Pokémon, or present in the bag.
Dictionary<ushort, int> seenStones = []; // ushort item, int index
for (var i = 0; i < input.AllData.Count; i++)
{
@ -68,12 +68,12 @@ private static void AnalyzeNoInventory(BulkAnalysis input)
var pk = slot.Entity;
var stone = (ushort)pk.HeldItem;
if (!ItemStorage9ZA.IsMegaStone(stone))
if (!ItemStorage9ZA.IsUniqueHeldItem(stone))
continue;
if (seenStones.TryGetValue(stone, out var otherIndex)) // Already given to another slot.
input.AddLine(slot, input.AllData[otherIndex], Identifier, i, index2: otherIndex, BulkDuplicateMegaStoneSlot, stone);
else // First time seeing this Mega Stone, all good.
input.AddLine(slot, input.AllData[otherIndex], Identifier, i, index2: otherIndex, BulkHeldItemInventoryMultipleSlots_0, stone);
else // First time seeing this item, all good.
seenStones[stone] = i;
}
}

View File

@ -455,11 +455,11 @@ public sealed class LegalityCheckLocalization
public string BulkSharingTrainerID { get; set; } = "Detected sharing of Trainer ID across multiple trainer names.";
public string BulkSharingTrainerVersion { get; set; } = "Detected sharing of Trainer ID across multiple versions.";
public string BulkDuplicateFusionSlot { get; set; } = "Detected multiple fusions of the same fusion stored slot species.";
public string BulkDuplicateMegaStoneSlot { get; set; } = "Detected multiple Pokémon holding the same Mega Stone.";
public string BulkDuplicateMegaStoneInventory { get; set; } = "Detected Pokémon holding a Mega Stone still stored in player inventory.";
public string BulkNotAcquiredMegaStoneInventory { get; set; } = "Mega Stone held by Pokémon has not been acquired in player inventory.";
public string BulkAssignedMegaStoneNotFound_0 { get; set; } = "{0} is marked as held by Pokémon but none found in slots checked.";
public string BulkFusionSourceInvalid { get; set; } = "The consumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot.";
public string BulkHeldItemInventoryAssignedNoneHeld_0 { get; set; } = "{0} is marked as held player inventory, but no Pokémon found in slots checked.";
public string BulkHeldItemInventoryMultipleSlots_0 { get; set; } = "{0} is a unique item and cannot be held by multiple Pokémon.";
public string BulkHeldItemInventoryNotAcquired_0 { get; set; } = "{0} has not been acquired in player inventory.";
public string BulkHeldItemInventoryUnassigned_0 { get; set; } = "{0} is not marked as assigned in player inventory.";
public string BulkFusionSourceInvalid { get; set; } = "The subsumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot.";
}
[JsonSerializable(typeof(LegalityCheckLocalization))]

View File

@ -421,10 +421,10 @@ public static class LegalityCheckResultCodeExtensions
BulkSharingPIDEncounterType => localization.BulkSharingPIDRNGType,
BulkDuplicateMysteryGiftEggReceived => localization.BulkDuplicateMysteryGiftEggReceived,
BulkDuplicateFusionSlot => localization.BulkDuplicateFusionSlot,
BulkDuplicateMegaStoneSlot => localization.BulkDuplicateMegaStoneSlot,
BulkDuplicateMegaStoneInventory => localization.BulkDuplicateMegaStoneInventory,
BulkNotAcquiredMegaStoneInventory => localization.BulkNotAcquiredMegaStoneInventory,
BulkAssignedMegaStoneNotFound_0 => localization.BulkAssignedMegaStoneNotFound_0,
BulkHeldItemInventoryAssignedNoneHeld_0 => localization.BulkHeldItemInventoryAssignedNoneHeld_0,
BulkHeldItemInventoryMultipleSlots_0 => localization.BulkHeldItemInventoryMultipleSlots_0,
BulkHeldItemInventoryNotAcquired_0 => localization.BulkHeldItemInventoryNotAcquired_0,
BulkHeldItemInventoryUnassigned_0 => localization.BulkHeldItemInventoryUnassigned_0,
BulkFusionSourceInvalid => localization.BulkFusionSourceInvalid,
BulkSharingTrainerIDs => localization.BulkSharingTrainerID,
BulkSharingTrainerVersion => localization.BulkSharingTrainerVersion,

View File

@ -380,9 +380,6 @@ public enum LegalityCheckResultCode : ushort
BulkSharingPIDEncounterType,
BulkDuplicateFusionSlot,
BulkDuplicateMysteryGiftEggReceived,
BulkDuplicateMegaStoneSlot,
BulkDuplicateMegaStoneInventory,
BulkNotAcquiredMegaStoneInventory,
BulkFusionSourceInvalid,
BulkSharingTrainerIDs,
BulkSharingTrainerVersion,
@ -429,7 +426,10 @@ public enum LegalityCheckResultCode : ushort
// Single Argument: Item ID
FirstWithItem,
BulkAssignedMegaStoneNotFound_0 = FirstWithItem, // item ID
BulkHeldItemInventoryAssignedNoneHeld_0 = FirstWithItem, // item ID
BulkHeldItemInventoryMultipleSlots_0,
BulkHeldItemInventoryNotAcquired_0,
BulkHeldItemInventoryUnassigned_0,
// One Argument: Language
FirstWithLanguage,

View File

@ -24,7 +24,7 @@ public static class TradeRestrictions
public static bool IsUntradableHeld(EntityContext context, int item) => context switch
{
EntityContext.Gen7 => ItemStorage7USUM.ZCrystalHeld.Contains((ushort)item),
EntityContext.Gen9a => ItemStorage9ZA.IsMegaStone((ushort)item) || item is (0534 or 0535), // Primal Orbs
EntityContext.Gen9a => ItemStorage9ZA.IsUniqueHeldItem((ushort)item),
_ => false,
};

View File

@ -367,9 +367,9 @@
"BulkSharingTrainerID": "Detected sharing of Trainer ID across multiple trainer names.",
"BulkSharingTrainerVersion": "Detected sharing of Trainer ID across multiple versions.",
"BulkDuplicateFusionSlot": "Detected multiple fusions of the same fusion stored slot species.",
"BulkDuplicateMegaStoneSlot": "Detected multiple Pokémon holding the same Mega Stone.",
"BulkDuplicateMegaStoneInventory": "Detected Pokémon holding a Mega Stone still stored in player inventory.",
"BulkNotAcquiredMegaStoneInventory": "Mega Stone held by Pokémon has not been acquired in player inventory.",
"BulkAssignedMegaStoneNotFound_0": "{0} is marked as held by Pokémon but none found in slots checked.",
"BulkFusionSourceInvalid": "The consumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
"BulkHeldItemInventoryAssignedNoneHeld_0": "{0} is marked as held player inventory, but no Pokémon found in slots checked.",
"BulkHeldItemInventoryMultipleSlots_0": "{0} is a unique item and cannot be held by multiple Pokémon.",
"BulkHeldItemInventoryNotAcquired_0": "{0} has not been acquired in player inventory.",
"BulkHeldItemInventoryUnassigned_0": "{0} is not marked as assigned in player inventory.",
"BulkFusionSourceInvalid": "The subsumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
}

View File

@ -367,9 +367,9 @@
"BulkSharingTrainerID": "Detected sharing of Trainer ID across multiple trainer names.",
"BulkSharingTrainerVersion": "Detected sharing of Trainer ID across multiple versions.",
"BulkDuplicateFusionSlot": "Detected multiple fusions of the same fusion stored slot species.",
"BulkDuplicateMegaStoneSlot": "Detected multiple Pokémon holding the same Mega Stone.",
"BulkDuplicateMegaStoneInventory": "Detected Pokémon holding a Mega Stone still stored in player inventory.",
"BulkNotAcquiredMegaStoneInventory": "Mega Stone held by Pokémon has not been acquired in player inventory.",
"BulkAssignedMegaStoneNotFound_0": "{0} is marked as held by Pokémon but none found in slots checked.",
"BulkFusionSourceInvalid": "The consumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
"BulkHeldItemInventoryAssignedNoneHeld_0": "{0} is marked as held player inventory, but no Pokémon found in slots checked.",
"BulkHeldItemInventoryMultipleSlots_0": "{0} is a unique item and cannot be held by multiple Pokémon.",
"BulkHeldItemInventoryNotAcquired_0": "{0} has not been acquired in player inventory.",
"BulkHeldItemInventoryUnassigned_0": "{0} is not marked as assigned in player inventory.",
"BulkFusionSourceInvalid": "The subsumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
}

View File

@ -367,9 +367,9 @@
"BulkSharingTrainerID": "Detected sharing of Trainer ID across multiple trainer names.",
"BulkSharingTrainerVersion": "Detected sharing of Trainer ID across multiple versions.",
"BulkDuplicateFusionSlot": "Detected multiple fusions of the same fusion stored slot species.",
"BulkDuplicateMegaStoneSlot": "Detected multiple Pokémon holding the same Mega Stone.",
"BulkDuplicateMegaStoneInventory": "Detected Pokémon holding a Mega Stone still stored in player inventory.",
"BulkNotAcquiredMegaStoneInventory": "Mega Stone held by Pokémon has not been acquired in player inventory.",
"BulkAssignedMegaStoneNotFound_0": "{0} is marked as held by Pokémon but none found in slots checked.",
"BulkFusionSourceInvalid": "The consumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
"BulkHeldItemInventoryAssignedNoneHeld_0": "{0} is marked as held player inventory, but no Pokémon found in slots checked.",
"BulkHeldItemInventoryMultipleSlots_0": "{0} is a unique item and cannot be held by multiple Pokémon.",
"BulkHeldItemInventoryNotAcquired_0": "{0} has not been acquired in player inventory.",
"BulkHeldItemInventoryUnassigned_0": "{0} is not marked as assigned in player inventory.",
"BulkFusionSourceInvalid": "The subsumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
}

View File

@ -367,9 +367,9 @@
"BulkSharingTrainerID": "Detected sharing of Trainer ID across multiple trainer names.",
"BulkSharingTrainerVersion": "Detected sharing of Trainer ID across multiple versions.",
"BulkDuplicateFusionSlot": "Detected multiple fusions of the same fusion stored slot species.",
"BulkDuplicateMegaStoneSlot": "Detected multiple Pokémon holding the same Mega Stone.",
"BulkDuplicateMegaStoneInventory": "Detected Pokémon holding a Mega Stone still stored in player inventory.",
"BulkNotAcquiredMegaStoneInventory": "Mega Stone held by Pokémon has not been acquired in player inventory.",
"BulkAssignedMegaStoneNotFound_0": "{0} is marked as held by Pokémon but none found in slots checked.",
"BulkFusionSourceInvalid": "The consumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
"BulkHeldItemInventoryAssignedNoneHeld_0": "{0} is marked as held player inventory, but no Pokémon found in slots checked.",
"BulkHeldItemInventoryMultipleSlots_0": "{0} is a unique item and cannot be held by multiple Pokémon.",
"BulkHeldItemInventoryNotAcquired_0": "{0} has not been acquired in player inventory.",
"BulkHeldItemInventoryUnassigned_0": "{0} is not marked as assigned in player inventory.",
"BulkFusionSourceInvalid": "The subsumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
}

View File

@ -367,9 +367,9 @@
"BulkSharingTrainerID": "ID Dresseur partagé détecté entre plusieurs noms de dresseur.",
"BulkSharingTrainerVersion": "ID Dresseur partagé détecté entre plusieurs versions.",
"BulkDuplicateFusionSlot": "Detected multiple fusions of the same fusion stored slot species.",
"BulkDuplicateMegaStoneSlot": "Detected multiple Pokémon holding the same Mega Stone.",
"BulkDuplicateMegaStoneInventory": "Detected Pokémon holding a Mega Stone still stored in player inventory.",
"BulkNotAcquiredMegaStoneInventory": "Mega Stone held by Pokémon has not been acquired in player inventory.",
"BulkAssignedMegaStoneNotFound_0": "{0} is marked as held by Pokémon but none found in slots checked.",
"BulkFusionSourceInvalid": "The consumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
"BulkHeldItemInventoryAssignedNoneHeld_0": "{0} is marked as held player inventory, but no Pokémon found in slots checked.",
"BulkHeldItemInventoryMultipleSlots_0": "{0} is a unique item and cannot be held by multiple Pokémon.",
"BulkHeldItemInventoryNotAcquired_0": "{0} has not been acquired in player inventory.",
"BulkHeldItemInventoryUnassigned_0": "{0} is not marked as assigned in player inventory.",
"BulkFusionSourceInvalid": "The subsumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
}

View File

@ -367,9 +367,9 @@
"BulkSharingTrainerID": "Detected sharing of Trainer ID across multiple trainer names.",
"BulkSharingTrainerVersion": "Detected sharing of Trainer ID across multiple versions.",
"BulkDuplicateFusionSlot": "Detected multiple fusions of the same fusion stored slot species.",
"BulkDuplicateMegaStoneSlot": "Detected multiple Pokémon holding the same Mega Stone.",
"BulkDuplicateMegaStoneInventory": "Detected Pokémon holding a Mega Stone still stored in player inventory.",
"BulkNotAcquiredMegaStoneInventory": "Mega Stone held by Pokémon has not been acquired in player inventory.",
"BulkAssignedMegaStoneNotFound_0": "{0} is marked as held by Pokémon but none found in slots checked.",
"BulkFusionSourceInvalid": "The consumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
"BulkHeldItemInventoryAssignedNoneHeld_0": "{0} is marked as held player inventory, but no Pokémon found in slots checked.",
"BulkHeldItemInventoryMultipleSlots_0": "{0} is a unique item and cannot be held by multiple Pokémon.",
"BulkHeldItemInventoryNotAcquired_0": "{0} has not been acquired in player inventory.",
"BulkHeldItemInventoryUnassigned_0": "{0} is not marked as assigned in player inventory.",
"BulkFusionSourceInvalid": "The subsumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
}

View File

@ -367,9 +367,9 @@
"BulkSharingTrainerID": "Detected sharing of Trainer ID across multiple trainer names.",
"BulkSharingTrainerVersion": "Detected sharing of Trainer ID across multiple versions.",
"BulkDuplicateFusionSlot": "Detected multiple fusions of the same fusion stored slot species.",
"BulkDuplicateMegaStoneSlot": "Detected multiple Pokémon holding the same Mega Stone.",
"BulkDuplicateMegaStoneInventory": "Detected Pokémon holding a Mega Stone still stored in player inventory.",
"BulkNotAcquiredMegaStoneInventory": "Mega Stone held by Pokémon has not been acquired in player inventory.",
"BulkAssignedMegaStoneNotFound_0": "{0} is marked as held by Pokémon but none found in slots checked.",
"BulkFusionSourceInvalid": "The consumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
"BulkHeldItemInventoryAssignedNoneHeld_0": "{0} is marked as held player inventory, but no Pokémon found in slots checked.",
"BulkHeldItemInventoryMultipleSlots_0": "{0} is a unique item and cannot be held by multiple Pokémon.",
"BulkHeldItemInventoryNotAcquired_0": "{0} has not been acquired in player inventory.",
"BulkHeldItemInventoryUnassigned_0": "{0} is not marked as assigned in player inventory.",
"BulkFusionSourceInvalid": "The subsumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
}

View File

@ -367,9 +367,9 @@
"BulkSharingTrainerID": "Detected sharing of Trainer ID across multiple trainer names.",
"BulkSharingTrainerVersion": "Detected sharing of Trainer ID across multiple versions.",
"BulkDuplicateFusionSlot": "Detected multiple fusions of the same fusion stored slot species.",
"BulkDuplicateMegaStoneSlot": "Detected multiple Pokémon holding the same Mega Stone.",
"BulkDuplicateMegaStoneInventory": "Detected Pokémon holding a Mega Stone still stored in player inventory.",
"BulkNotAcquiredMegaStoneInventory": "Mega Stone held by Pokémon has not been acquired in player inventory.",
"BulkAssignedMegaStoneNotFound_0": "{0} is marked as held by Pokémon but none found in slots checked.",
"BulkFusionSourceInvalid": "The consumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
"BulkHeldItemInventoryAssignedNoneHeld_0": "{0} is marked as held player inventory, but no Pokémon found in slots checked.",
"BulkHeldItemInventoryMultipleSlots_0": "{0} is a unique item and cannot be held by multiple Pokémon.",
"BulkHeldItemInventoryNotAcquired_0": "{0} has not been acquired in player inventory.",
"BulkHeldItemInventoryUnassigned_0": "{0} is not marked as assigned in player inventory.",
"BulkFusionSourceInvalid": "The subsumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
}

View File

@ -367,9 +367,9 @@
"BulkSharingTrainerID": "检测到在多个训练家名称之间共享训练家ID。",
"BulkSharingTrainerVersion": "检测到在多个版本间共享训练家ID。",
"BulkDuplicateFusionSlot": "检测到同一融合槽位的宝可梦被重复融合。",
"BulkDuplicateMegaStoneSlot": "检测到多个宝可梦持有同一枚超级石。",
"BulkDuplicateMegaStoneInventory": "检测到宝可梦持有的超级石仍存放于玩家腰包中。",
"BulkNotAcquiredMegaStoneInventory": "宝可梦所持的超级石尚未在玩家腰包中获得。",
"BulkAssignedMegaStoneNotFound_0": "{0} 标记为由宝可梦持有,但在已检查的槽位中未找到。",
"BulkHeldItemInventoryAssignedNoneHeld_0": "{0} is marked as held player inventory, but no Pokémon found in slots checked.",
"BulkHeldItemInventoryMultipleSlots_0": "{0} is a unique item and cannot be held by multiple Pokémon.",
"BulkHeldItemInventoryNotAcquired_0": "{0} has not been acquired in player inventory.",
"BulkHeldItemInventoryUnassigned_0": "{0} is not marked as assigned in player inventory.",
"BulkFusionSourceInvalid": "存档中记录的被消耗“种族-形态”与该融合槽位应有的“种族-形态”不一致。"
}

View File

@ -367,9 +367,9 @@
"BulkSharingTrainerID": "Detected sharing of Trainer ID across multiple trainer names.",
"BulkSharingTrainerVersion": "Detected sharing of Trainer ID across multiple versions.",
"BulkDuplicateFusionSlot": "Detected multiple fusions of the same fusion stored slot species.",
"BulkDuplicateMegaStoneSlot": "Detected multiple Pokémon holding the same Mega Stone.",
"BulkDuplicateMegaStoneInventory": "Detected Pokémon holding a Mega Stone still stored in player inventory.",
"BulkNotAcquiredMegaStoneInventory": "Mega Stone held by Pokémon has not been acquired in player inventory.",
"BulkAssignedMegaStoneNotFound_0": "{0} is marked as held by Pokémon but none found in slots checked.",
"BulkFusionSourceInvalid": "The consumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
"BulkHeldItemInventoryAssignedNoneHeld_0": "{0} is marked as held player inventory, but no Pokémon found in slots checked.",
"BulkHeldItemInventoryMultipleSlots_0": "{0} is a unique item and cannot be held by multiple Pokémon.",
"BulkHeldItemInventoryNotAcquired_0": "{0} has not been acquired in player inventory.",
"BulkHeldItemInventoryUnassigned_0": "{0} is not marked as assigned in player inventory.",
"BulkFusionSourceInvalid": "The subsumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot."
}

View File

@ -2544,6 +2544,7 @@ SAV_Trainer9a.L_R=Rotation:
SAV_Trainer9a.L_RoyaleRegularTicketPoints=Regular:
SAV_Trainer9a.L_RoyaleTicketPointsInfinite=Infinite:
SAV_Trainer9a.L_Seconds=Sec:
SAV_Trainer9a.L_StreetName=Street Name:
SAV_Trainer9a.L_TrainerName=Trainer Name:
SAV_Trainer9a.L_X=X Coordinate:
SAV_Trainer9a.L_Y=Y Coordinate:

View File

@ -2544,6 +2544,7 @@ SAV_Trainer9a.L_R=Rotation:
SAV_Trainer9a.L_RoyaleRegularTicketPoints=Regular:
SAV_Trainer9a.L_RoyaleTicketPointsInfinite=Infinite:
SAV_Trainer9a.L_Seconds=Sec:
SAV_Trainer9a.L_StreetName=Street Name:
SAV_Trainer9a.L_TrainerName=Trainer Name:
SAV_Trainer9a.L_X=X Coordinate:
SAV_Trainer9a.L_Y=Y Coordinate:

View File

@ -2544,6 +2544,7 @@ SAV_Trainer9a.L_R=Rotation:
SAV_Trainer9a.L_RoyaleRegularTicketPoints=Regular:
SAV_Trainer9a.L_RoyaleTicketPointsInfinite=Infinite:
SAV_Trainer9a.L_Seconds=Sec:
SAV_Trainer9a.L_StreetName=Street Name:
SAV_Trainer9a.L_TrainerName=Trainer Name:
SAV_Trainer9a.L_X=X Coordinate:
SAV_Trainer9a.L_Y=Y Coordinate:

View File

@ -2544,6 +2544,7 @@ SAV_Trainer9a.L_R=Rotacion:
SAV_Trainer9a.L_RoyaleRegularTicketPoints=Regular:
SAV_Trainer9a.L_RoyaleTicketPointsInfinite=Infinito:
SAV_Trainer9a.L_Seconds=Segs.:
SAV_Trainer9a.L_StreetName=Street Name:
SAV_Trainer9a.L_TrainerName=Nombre Entrenador:
SAV_Trainer9a.L_X=Coord. X:
SAV_Trainer9a.L_Y=Coord. Y:

View File

@ -2544,6 +2544,7 @@ SAV_Trainer9a.L_R=Rotation:
SAV_Trainer9a.L_RoyaleRegularTicketPoints=Regular:
SAV_Trainer9a.L_RoyaleTicketPointsInfinite=Infinite:
SAV_Trainer9a.L_Seconds=Sec:
SAV_Trainer9a.L_StreetName=Street Name:
SAV_Trainer9a.L_TrainerName=Trainer Name:
SAV_Trainer9a.L_X=X Coordinate:
SAV_Trainer9a.L_Y=Y Coordinate:

View File

@ -2544,6 +2544,7 @@ SAV_Trainer9a.L_R=Rotation:
SAV_Trainer9a.L_RoyaleRegularTicketPoints=Regular:
SAV_Trainer9a.L_RoyaleTicketPointsInfinite=Infinite:
SAV_Trainer9a.L_Seconds=Sec:
SAV_Trainer9a.L_StreetName=Street Name:
SAV_Trainer9a.L_TrainerName=Trainer Name:
SAV_Trainer9a.L_X=X Coordinate:
SAV_Trainer9a.L_Y=Y Coordinate:

View File

@ -2544,6 +2544,7 @@ SAV_Trainer9a.L_R=Rotation:
SAV_Trainer9a.L_RoyaleRegularTicketPoints=通常:
SAV_Trainer9a.L_RoyaleTicketPointsInfinite=∞:
SAV_Trainer9a.L_Seconds=秒:
SAV_Trainer9a.L_StreetName=Street Name:
SAV_Trainer9a.L_TrainerName=トレーナー名:
SAV_Trainer9a.L_X=X Coordinate:
SAV_Trainer9a.L_Y=Y Coordinate:

View File

@ -2544,6 +2544,7 @@ SAV_Trainer9a.L_R=Rotation:
SAV_Trainer9a.L_RoyaleRegularTicketPoints=Regular:
SAV_Trainer9a.L_RoyaleTicketPointsInfinite=Infinite:
SAV_Trainer9a.L_Seconds=Sec:
SAV_Trainer9a.L_StreetName=Street Name:
SAV_Trainer9a.L_TrainerName=Trainer Name:
SAV_Trainer9a.L_X=X Coordinate:
SAV_Trainer9a.L_Y=Y Coordinate:

View File

@ -2544,6 +2544,7 @@ SAV_Trainer9a.L_R=旋转角度:
SAV_Trainer9a.L_RoyaleRegularTicketPoints=常规:
SAV_Trainer9a.L_RoyaleTicketPointsInfinite=无限:
SAV_Trainer9a.L_Seconds=秒:
SAV_Trainer9a.L_StreetName=Street Name:
SAV_Trainer9a.L_TrainerName=训练家名字:
SAV_Trainer9a.L_X=X坐标:
SAV_Trainer9a.L_Y=Y坐标:

View File

@ -2544,6 +2544,7 @@ SAV_Trainer9a.L_R=Rotation:
SAV_Trainer9a.L_RoyaleRegularTicketPoints=Regular:
SAV_Trainer9a.L_RoyaleTicketPointsInfinite=Infinite:
SAV_Trainer9a.L_Seconds=Sec:
SAV_Trainer9a.L_StreetName=Street Name:
SAV_Trainer9a.L_TrainerName=Trainer Name:
SAV_Trainer9a.L_X=X Coordinate:
SAV_Trainer9a.L_Y=Y Coordinate: