LZA 1.0.2

Cumulative changes from the team.

Co-Authored-By: Matt <17801814+sora10pls@users.noreply.github.com>
Co-Authored-By: SciresM <8676005+SciresM@users.noreply.github.com>
Co-Authored-By: Lusamine <30205550+Lusamine@users.noreply.github.com>
This commit is contained in:
Kurt
2025-11-16 15:56:12 -06:00
parent 898f9d7708
commit 0936c08eb1
387 changed files with 19631 additions and 3503 deletions

View File

@@ -1,7 +1,7 @@
namespace pkNX.Structures.FlatBuffers.SV;
/// <summary>
/// Personal Info class with values from the <see cref="GameVersion.PLA"/> games.
/// Personal Info class with values from the <see cref="GameVersion.SV"/> games.
/// </summary>
public sealed class PersonalInfo9SV(PersonalInfo fb) : IPersonalInfo
{

View File

@@ -56,22 +56,27 @@ public byte[] GetData(ulong offset, ulong length)
return Reader.ReadBytes((int)length);
}
public void GetData(ulong offset, ulong length, Span<byte> data)
{
Reader.BaseStream.Seek((long)offset, SeekOrigin.Begin);
_ = Reader.Read(data[..(int)length]);
}
public TrinityPak GetPak(int index)
{
var data = GetPakData(index);
return TrinityPak.Serializer.Parse(data, FlatBufferDeserializationOption.GreedyMutable);
}
public ulong GetPakHash(int index) => FnvHash.HashFnv1a_64(GetPackPath(index));
public ulong GetPakLength(int index) => FileData.FileInfos[index].FileSize;
public ulong GetPakOffset(ulong hash) => Meta.GetFileOffset(hash);
public byte[] GetPakData(int index)
{
var path = GetPackPath(index);
var hash = FnvHash.HashFnv1a_64(path);
var offset = Meta.GetFileOffset(hash);
var info = FileData.FileInfos[index];
var size = info.FileSize;
//Debug.WriteLine($"Found {index} at 0x{offset:X12}, Size={info.FileSize:X}, SubFileCount={info.FileCount}");
var size = GetPakLength(index);
var hash = GetPakHash(index);
var offset = GetPakOffset(hash);
return GetData(offset, size);
}
@@ -80,7 +85,7 @@ public byte[] GetPackedFile(ulong hash)
var index = FileData.GetSubFileIndex(hash);
var pak = GetPak((int)index);
var file = pak.GetFileData(hash);
return file.GetUncompressedData();
return file.Decompress();
}
public byte[] GetPackedFile(string path) => GetPackedFile(FnvHash.HashFnv1a_64(path));

View File

@@ -1,5 +1,6 @@
using System.Diagnostics;
using pkNX.Containers;
using System.IO.Compression; // Added for Zlib support
namespace pkNX.Structures.FlatBuffers.SV.Trinity;
@@ -34,17 +35,39 @@ private int BinarySearch(ulong hash)
public partial class TrinityPakFileData
{
public byte[] GetUncompressedData() => CompressionType switch
{ // TODO: What specific ID is zlib?
3 => Oodle.Decompress(Data.Span, (long)UncompressedSize)!, // Oodle
0xFF => Data.ToArray(), // Uncompressed
public byte[] Decompress() => CompressionType switch
{
DataCompressionType.None => Data.ToArray(), // Uncompressed
DataCompressionType.Zlib => Zlib.Decompress(Data.Span, (int)UncompressedSize),
DataCompressionType.Lz4 => LZ4.Decode(Data.Span, (int)UncompressedSize),
>= DataCompressionType.OodleKraken and <= DataCompressionType.OodleHydra => Oodle.Decompress(Data.Span, (long)UncompressedSize)!, // Oodle
_ => throw new ArgumentException($"Unknown compression type {CompressionType}"),
};
public ReadOnlySpan<byte> GetUncompressedDataReadOnly() => CompressionType switch
{ // TODO: What specific ID is zlib?
3 => Oodle.Decompress(Data.Span, (long)UncompressedSize)!, // Oodle
0xFF => Data.ToArray(), // Uncompressed
_ => throw new ArgumentException($"Unknown compression type {CompressionType}"),
public void DecompressTo(Span<byte> result)
{
if (CompressionType == DataCompressionType.None)
Data.Span.CopyTo(result); // Uncompressed
else if (CompressionType == DataCompressionType.Zlib)
Zlib.Decompress(Data.Span, result);
else if (CompressionType == DataCompressionType.Lz4)
LZ4.Decode(Data.Span, result);
else if (CompressionType is >= DataCompressionType.OodleKraken and <= DataCompressionType.OodleHydra)
Oodle.TryDecompress(Data.Span, result, out _);
else
throw new ArgumentException($"Unknown compression type {CompressionType}");
}
public static ReadOnlySpan<byte> Compress(ReadOnlySpan<byte> data, DataCompressionType type, OodleCompressionLevel level = OodleCompressionLevel.Optimal2) => type switch
{
DataCompressionType.None => data,
DataCompressionType.Zlib => Zlib.Compress(data),
DataCompressionType.Lz4 => LZ4.Encode(data),
DataCompressionType.OodleKraken => Oodle.Compress(data, out _, OodleFormat.Kraken, level),
DataCompressionType.OodleLeviathan => Oodle.Compress(data, out _, OodleFormat.Leviathan, level),
DataCompressionType.OodleMermaid => Oodle.Compress(data, out _, OodleFormat.Mermaid, level),
DataCompressionType.OodleSelkie => Oodle.Compress(data, out _, OodleFormat.Selkie, level),
DataCompressionType.OodleHydra => Oodle.Compress(data, out _, OodleFormat.Hydra, level),
_ => throw new NotImplementedException($"Compression type {type} is not implemented."),
};
}

View File

@@ -1,5 +1,5 @@
using pkNX.Containers;
using static System.Buffers.Binary.BinaryPrimitives;
using System.Buffers;
namespace pkNX.Structures.FlatBuffers.SV.Trinity;
@@ -8,44 +8,69 @@ public static class TrinityPakExtractor
public const string DumpArchiveExtracted = "extracted";
private const string DumpArchivePak = "paks";
public static void DumpArchives(string pathRomFS, string outbasedir)
public static void DumpArchives(string pathRomFS, string dirRootDump)
{
var pathFs = Path.Combine(pathRomFS, "arc", "data.trpfs");
var pathFd = Path.Combine(pathRomFS, "arc", "data.trpfd");
var reader = new TrinityFileSystemManager(pathFs, pathFd);
Extract(outbasedir, reader);
Extract(dirRootDump, reader);
reader.Dispose();
}
private static void Extract(string outbasedir, TrinityFileSystemManager manager)
private static void Extract(string dirRoot, TrinityFileSystemManager manager)
{
var outpakdir = Path.Combine(outbasedir, DumpArchivePak);
var outexdir = Path.Combine(outbasedir, DumpArchiveExtracted);
Directory.CreateDirectory(outbasedir);
Directory.CreateDirectory(outpakdir);
Directory.CreateDirectory(outexdir);
Directory.CreateDirectory(dirRoot);
var dirPak = Path.Combine(dirRoot, DumpArchivePak);
Directory.CreateDirectory(dirPak);
var dirExtract = Path.Combine(dirRoot, DumpArchiveExtracted);
Directory.CreateDirectory(dirExtract);
var count = manager.FileCount;
for (var i = 0; i < count; i++)
ExportArc(manager, i, outpakdir, outexdir);
ExportArc(manager, i, dirPak, dirExtract);
}
private static void ExportArc(TrinityFileSystemManager reader, int packIndex, string outpakdir, string outexdir)
private static void ExportArc(TrinityFileSystemManager reader, int packIndex, string dirPak, string dirExtract)
{
var packFilePath = reader.GetPackPath(packIndex);
var outpakpath = Path.Combine(outpakdir, packFilePath);
var dirName = Path.GetDirectoryName(outpakpath);
var pool = ArrayPool<byte>.Shared;
var hash = reader.GetPakHash(packIndex);
var length = reader.GetPakLength(packIndex);
var offset = reader.GetPakOffset(hash);
var rent = pool.Rent((int)length);
var data = rent.AsMemory(0, (int)length);
try
{
reader.GetData(offset, length, data.Span);
var packFilePath = reader.GetPackPath(packIndex);
ExportPackFile(data.Span, dirPak, packFilePath);
ExportPackExtract(data, dirExtract, packFilePath);
}
finally
{
data.Span.Clear();
pool.Return(rent);
}
}
private static void ExportPackFile(ReadOnlySpan<byte> data, string dir, string pakFilePath)
{
var fileName = Path.Combine(dir, pakFilePath);
var dirName = Path.GetDirectoryName(fileName);
if (string.IsNullOrEmpty(dirName))
throw new Exception($"{outpakpath} directory name is null");
throw new Exception($"{fileName} directory name is null");
Directory.CreateDirectory(dirName);
var data = reader.GetPakData(packIndex);
File.WriteAllBytes(outpakpath, data);
File.WriteAllBytes(fileName, data);
}
var outexpakdir = Path.Combine(outexdir, packFilePath);
Directory.CreateDirectory(outexpakdir);
var trpak = FlatBufferConverter.DeserializeFrom<TrinityPak>(data);
ExtractPack(trpak, outexpakdir);
private static void ExportPackExtract(Memory<byte> data, string dir, string pakFilePath)
{
var folder = Path.Combine(dir, pakFilePath);
Directory.CreateDirectory(folder);
var obj = FlatBufferConverter.DeserializeFrom<TrinityPak>(data);
ExtractPack(obj, folder);
}
private static void ExtractPack(TrinityPak trpak, string outexpakdir)
@@ -54,33 +79,28 @@ private static void ExtractPack(TrinityPak trpak, string outexpakdir)
WriteFile(trpak.Files[i], trpak.Hashes[i], outexpakdir, i);
}
private static void WriteFile(TrinityPakFileData file, ulong hash, string outexpakdir, int fileIndex)
private static void WriteFile(TrinityPakFileData file, ulong hash, string dir, int fileIndex)
{
var decompressed = file.GetUncompressedDataReadOnly();
var ext = GuessExtension(decompressed);
if (file.CompressionType is DataCompressionType.None)
{
WriteFile(file.Data.Span, hash, dir, fileIndex);
return;
}
var filepath = Path.Combine(outexpakdir, $"{fileIndex:0000} - {hash:X16}.{ext}");
//Debug.WriteLine($" * File, CompressionType={file.CompressionType}, CompressedSize={file.Data.Length:X}, UncompressedSize={file.UncompressedSize}, Field_00={file.Field_00}, Field_01={file.Field_01}");
using var fs = File.Create(filepath);
fs.Write(decompressed);
var pool = ArrayPool<byte>.Shared;
var length = (int)file.UncompressedSize;
var rent = pool.Rent(length);
var decompressed = rent.AsSpan(0, length);
file.DecompressTo(decompressed);
WriteFile(decompressed, hash, dir, fileIndex);
decompressed.Clear();
pool.Return(rent);
}
private static string GuessExtension(ReadOnlySpan<byte> data)
private static void WriteFile(ReadOnlySpan<byte> decompressed, ulong hash, string dir, int fileIndex)
{
const string defaultExtension = "bin";
if (data.Length < 8)
return defaultExtension;
var u32 = ReadUInt32LittleEndian(data);
if (ReadUInt32LittleEndian(data[4..8]) == 0x53424642)
return "bfbs";
return u32 switch
{
AHTB.Magic => "ahtb",
0x43524153 => "sarc",
0x58544E42 => "bntx",
0x63726173 => "sarc",
_ => defaultExtension,
};
var ext = TrinityUtil.GuessExtension(decompressed);
var filepath = Path.Combine(dir, $"{fileIndex:0000} - {hash:X16}.{ext}");
File.WriteAllBytes(filepath, decompressed);
}
}

View File

@@ -259,8 +259,8 @@ private static void DumpParticleComponent(Memory<byte> data, TextWriter tw, int
{
var props = FlatBufferConverter.DeserializeFrom<TrinityParticleComponent>(data);
Write(tw, depth, $"{nameof(props.ParticleFile)}: {props.ParticleFile}");
Write(tw, depth, $"{nameof(props.ParticleName)}: {props.ParticleName}");
Write(tw, depth, $"{nameof(props.ParticleParent)}: {props.ParticleParent}");
Write(tw, depth, $"{nameof(props.ParticleName)}: {props.ParticleName} ({FnvHash.HashFnv1a_64(props.ParticleName):X16})");
Write(tw, depth, $"{nameof(props.ParticleParent)}: {props.ParticleParent} ({FnvHash.HashFnv1a_64(props.ParticleParent):X16})");
}
private static void DumpCollisionComponent(Memory<byte> data, TextWriter tw, int depth)
@@ -321,7 +321,7 @@ private static void DumpObjectSwitcher(Memory<byte> data, TextWriter tw, int dep
private static void DumpObjectTemplate(Memory<byte> data, TextWriter tw, int depth)
{
var props = FlatBufferConverter.DeserializeFrom<TrinitySceneObjectTemplateData>(data);
Write(tw, depth, $"{nameof(props.ObjectTemplateName)}: {props.ObjectTemplateName}");
Write(tw, depth, $"{nameof(props.ObjectTemplateName)}: {props.ObjectTemplateName} ({FnvHash.HashFnv1a_64(props.ObjectTemplateName):X16})");
Write(tw, depth, $"{nameof(props.ObjectTemplatePath)}: {props.ObjectTemplatePath}");
Write(tw, depth, $"{nameof(props.ObjectTemplateExtra)}: {props.ObjectTemplateExtra}");
Write(tw, depth, $"{nameof(props.Field03)}: {props.Field03}");
@@ -331,7 +331,7 @@ private static void DumpObjectTemplate(Memory<byte> data, TextWriter tw, int dep
private static void DumpScenePoint(Memory<byte> data, TextWriter tw, int depth)
{
var props = FlatBufferConverter.DeserializeFrom<TrinityScenePoint>(data);
Write(tw, depth, $"{nameof(props.Name)}: {props.Name}");
Write(tw, depth, $"{nameof(props.Name)}: {props.Name} ({FnvHash.HashFnv1a_64(props.Name):X16})");
Write(tw, depth, $"{nameof(props.Position)}: {props.Position}");
Write(tw, depth, $"{nameof(props.Field02)}: {props.Field02}");
}
@@ -339,7 +339,7 @@ private static void DumpScenePoint(Memory<byte> data, TextWriter tw, int depth)
private static void DumpSceneObject(Memory<byte> data, TextWriter tw, int depth)
{
var props = FlatBufferConverter.DeserializeFrom<TrinitySceneObject>(data);
Write(tw, depth, $"{nameof(props.ObjectName)}: {props.ObjectName}");
Write(tw, depth, $"{nameof(props.ObjectName)}: {props.ObjectName} ({FnvHash.HashFnv1a_64(props.ObjectName):X16})");
Write(tw, depth, $"{nameof(props.ObjectPosition)}:");
Dump(props.ObjectPosition, tw, depth + 1);
Write(tw, depth, $"{nameof(props.Field02)}: {props.Field02}");

View File

@@ -1,9 +1,10 @@
namespace pkNX.Structures.FlatBuffers.SV.Trinity;
attribute "fs_serializer";
enum CompressionType : ushort
enum DataCompressionType : byte
{
None = 0,
None = -1,
Invalid = 0,
Zlib = 1,
Lz4 = 2,
OodleKraken = 3,
@@ -15,8 +16,8 @@ enum CompressionType : ushort
table TrinityPakFileData {
Field_00:uint;
CompressionType:ubyte;
Field_02:ubyte;
CompressionType:DataCompressionType;
CompressionLevel:ubyte;
UncompressedSize:ulong;
Data:[ubyte] (required);
}

View File

@@ -0,0 +1,57 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_vector";
attribute "fs_serializer";
attribute "fs_valueStruct";
attribute "fs_nonVirtual";
attribute "fs_unsafeStructVector";
struct StealthRockDamageRatio {
DemonType_1:int;
DemonType_1_2:int;
DemonType_1_4:int;
DemonType_1_8:int;
DemonType_1_16:int;
DemonType_1_32:int;
DemonType_2:int;
DemonType_4:int;
DemonType_8:int;
DemonType_16:int;
DemonType_32:int;
}
struct DamagePerTypeAff {
PerType_1_8:int;
PerType_1_4:int;
PerType_1_2:int;
PerType_1:int;
PerType_2:int;
PerType_4:int;
PerType_8:int;
}
table BattleSetting (fs_serializer) {
Damage_Per_Mega_Aura:int;
Damage_Per_Random_Amplitude:int;
Damage_Per_Trainer_Battle:int;
Damage_Per_Wild_Battle:int;
Damage_Per_Weather_Advantage:int;
Damage_Per_Weather_Disadvantage:int;
Damage_Per_Critical:int;
Damage_Per_Critical_Plus:int;
Damage_Per_Type_Match:int;
Damage_Per_Type_Match_Plus:int;
Damage_Per_Mamoru_Through_Plus:int;
Damage_Per_Type_Aff:DamagePerTypeAff;
Damage_Per_Type_Aff_Plus:DamagePerTypeAff;
Damage_Per_Mega_Type_Aff:DamagePerTypeAff;
Damage_Per_Mega_Type_Aff_Plus:DamagePerTypeAff;
Reflector_Damage_Cut_Ratio:int;
Hikarinokabe_Damage_Cut_Ratio:int;
Needle_Guard_Damage_Demon:int;
Stealth_Rock_Damage_Demon:StealthRockDamageRatio;
Stealth_Rock_Damage_Demon_Plus:StealthRockDamageRatio;
Critical_Rank_Ratio:[int] (required);
}
root_type BattleSetting;

View File

@@ -0,0 +1,27 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
struct LockonDescRange {
Width:float;
Top:float;
Bottom:float;
Near:float;
Far:float;
}
struct LockonDescRangePreset {
Enter:LockonDescRange;
Change:LockonDescRange;
Leave:LockonDescRange;
}
table LockonDesc (fs_serializer) {
Presets:[LockonDescRangePreset] (required);
ReticleRange:float;
UpdateCycle:ubyte;
Target:ulong;
UnlockDelay:float;
}
root_type LockonDesc;

View File

@@ -0,0 +1,28 @@
include "Shared/DevID.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
struct WazaDamage {
WazaPower:uint;
Damage:uint;
}
struct PokemonDamageRatio {
TotalPower:uint;
Ratio:float;
}
table MegaPokemonRatio {
DevNo:DevID;
Ratio:float;
}
table PlayerDamage (fs_serializer) {
Move:[WazaDamage] (required);
PokemonRatio:[PokemonDamageRatio] (required);
MegaPokemon:[MegaPokemonRatio] (required);
}
root_type PlayerDamage;

View File

@@ -0,0 +1 @@
<Project Sdk="Microsoft.NET.Sdk" />

View File

@@ -0,0 +1,26 @@
<Project>
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)..\'))" />
<ItemGroup>
<ProjectReference Include="..\..\..\pkNX.Structures\pkNX.Structures.csproj" />
<ProjectReference Include="..\..\pkNX.Structures.FlatBuffers\pkNX.Structures.FlatBuffers.csproj" />
<FlatSharpSchema Include="Schemas\**\*.fbs">
<IncludePath>..\..\pkNX.Structures.FlatBuffers\Schemas\</IncludePath>
</FlatSharpSchema>
</ItemGroup>
<Choose>
<When Condition="'$(MSBuildProjectName)' != 'pkNX.Structures.FlatBuffers.ZA.Shared'">
<ItemGroup>
<ProjectReference Include="$(MSBuildThisFileDirectory)Shared\pkNX.Structures.FlatBuffers.ZA.Shared.csproj" />
<FlatSharpSchema Include="Schemas\**\*.fbs">
<IncludePath>..\Shared\Schemas\</IncludePath>
</FlatSharpSchema>
</ItemGroup>
</When>
<Otherwise>
<PropertyGroup>
</PropertyGroup>
</Otherwise>
</Choose>
</Project>

View File

@@ -0,0 +1,14 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum ItemType : int {
ITEMTYPE_0 = 0,
ITEMTYPE_1 = 1,
ITEMTYPE_2 = 2,
ITEMTYPE_3 = 3,
ITEMTYPE_4 = 4,
ITEMTYPE_5 = 5,
ITEMTYPE_6 = 6,
ITEMTYPE_7 = 7,
ITEMTYPE_8 = 8,
ITEMTYPE_9 = 9,
}

View File

@@ -0,0 +1,33 @@
include "Shared/ActivationConditionParam.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table ExtensionParam {
PokemonPopId:string (required);
ItemPopId:string;
QuestId:string;
WarpParamId:string;
ImpactAroundId:string;
}
table FieldWazaGimmickPrivate {
GroupId:string;
ObjectName:[string] (required);
GimmickId:string;
RepopInterval:int;
RepopOffset:int;
Spawner:bool;
Extension:ExtensionParam (required);
ActivationConditionParamList:[ActivationConditionParam];
}
table FieldWazaGimmickPrivateDB {
Table:[FieldWazaGimmickPrivate] (required);
}
table FieldWazaGimmickPrivateDBArray (fs_serializer) {
Table:[FieldWazaGimmickPrivateDB] (required);
}
root_type FieldWazaGimmickPrivateDBArray;

View File

@@ -0,0 +1,21 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table HudInventory {
Field00:uint;
Items:[uint] (required);
}
table HudLineup {
Name:string (required);
Field01:uint;
Field02:uint;
Inventory:[HudInventory] (required);
}
table HudLineupArray (fs_serializer) {
Table:[HudLineup] (required);
}
root_type HudLineupArray;

View File

@@ -0,0 +1,64 @@
include "Shared/WazaID.fbs";
include "Enums/ItemType.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table ItemData {
Id:int (key);
ItemType:ItemType;
InternalName:string (required);
IconName:string (required);
Price:int;
Pocket:int;
SlotMaxNum:int;
SortNum:int;
PriceMegaShard:int;
PriceColorfulScrew:int;
CanNotHold:bool;
MachineWaza:WazaID;
MachineIndex:int;
WorkRecvSleep:bool;
WorkRecvPoison:bool;
WorkRecvBurn:bool;
WorkRecvFreeze:bool;
WorkRecvParalyze:bool;
WorkRecvConfuse:bool;
WorkRecvMero:bool;
WorkAttack:int;
WorkDefense:int;
WorkSpAttack:int;
WorkSpDefense:int;
WorkSpeed:int;
WorkAccuracy:int;
WorkCritical:int;
WorkEffectGuard:int;
MintNature:int;
WorkRecvPower:int;
HealPercentage:int;
WorkRevival:int;
RevivePercentage:int;
ExpPointGain:int;
MaxUseLevel:int; // 100 for Rare Candy, otherwise 0
WorkFriendly1:int;
WorkFriendly2:int;
WorkFriendly3:int;
WorkEvolutional:bool;
WorkFormChange:bool;
WorkStatusHp:int;
WorkStatusAtk:int;
WorkStatusDef:int;
WorkStatusSpd:int;
WorkStatusSAtk:int;
WorkStatusSDef:int;
EquipPower:int;
AutoHealPriority:int;
CanUseInBattle:bool;
SwapIntoId:int; // only used for Pebble -> Zygardite
}
table ItemDataArray (fs_serializer) {
Table:[ItemData] (required);
}
root_type ItemDataArray;

View File

@@ -0,0 +1,27 @@
include "Shared/ActivationCondition.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table ItemLotteryData {
ItemId:string (required);
Weight:int;
MaxCount:int;
Type:int;
ActivationConditionArray:[ActivationCondition];
}
table ItemTableData {
Id:string (required);
ItemLotteryDataList:[ItemLotteryData] (required);
}
table ItemTableDataDB {
Data:[ItemTableData] (required);
}
table ItemTableDataDBArray (fs_serializer) {
Table:[ItemTableDataDB] (required);
}
root_type ItemTableDataDBArray;

View File

@@ -0,0 +1,35 @@
include "Shared/ActivationCondition.fbs";
include "Shared/AppearanceInfo.fbs";
include "Shared/CoolTimeInfo.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table RandomPopItemTableInfo {
TableId:string (required);
TableInfoActivationConditionArray:[ActivationCondition];
}
table AppearanceSpawnerObjectInfo {
ObjectName:string (required);
CreateScenePath:string;
AppearanceInfoData:AppearanceInfo;
}
table RandomPopItemSpawnerData {
Id:string (required);
AppearanceSpawnerObjectInfoList:[AppearanceSpawnerObjectInfo] (required);
CoolTime:CoolTimeInfo;
ActivationConditionArray:[ActivationCondition] (required);
TableInfoList:[RandomPopItemTableInfo] (required);
}
table RandomPopItemSpawnerDataDB {
Table:[RandomPopItemSpawnerData] (required);
}
table RandomPopItemSpawnerDataDBArray (fs_serializer) {
Table:[RandomPopItemSpawnerDataDB] (required);
}
root_type RandomPopItemSpawnerDataDBArray;

View File

@@ -0,0 +1,33 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table ShopLineupArray (fs_serializer) {
Table:[ShopLineup] (required);
}
table ShopLineup {
Name:string (required);
Inventory:[ShopInventory] (required);
}
table ShopInventory {
Item:uint;
DisplayIndex:uint;
Conditions:[ShopInventoryCondition] (required);
}
table ShopInventoryCondition {
Table:[ShopInventoryConditionHolder] (required);
}
table ShopInventoryConditionHolder {
Table:[ShopInventoryAppearConditionsHolder] (required);
}
table ShopInventoryAppearConditionsHolder {
Condition:string;
Comparison:uint;
Arguments:[string];
}
root_type ShopLineupArray;

View File

@@ -0,0 +1,22 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table ZARewardItem {
ItemID:string (required);
Quantity:uint;
Weight:uint;
}
table ZARewardItemData {
ID:string (required);
MinWinStreak:uint;
MaxWinStreak:uint;
Field03:byte;
RewardItem:[ZARewardItem] (required);
}
table ZARewardItemDataArray (fs_serializer) {
Table:[ZARewardItemData] (required);
}
root_type ZARewardItemDataArray;

View File

@@ -0,0 +1,2 @@
<Project Sdk="Microsoft.NET.Sdk">
</Project>

View File

@@ -0,0 +1,25 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table DressUpData {
MagicValue:uint;
Name:string (required);
Field02:uint;
Field03:string (required);
Field04:uint;
Field05:uint;
Color1:string (required); // color
Color2:string (required); // color
Flag08:bool;
Field09:uint;
Field10:uint;
Field11:string; // not required
Flag12:bool;
}
table DressUpDataArray (fs_serializer) {
Table:[DressUpData] (required);
}
root_type DressUpDataArray;

View File

@@ -0,0 +1,23 @@
include "Shared/ActivationCondition.fbs";
include "Shared/ActivationConditionElement.fbs";
include "Shared/ActivationConditionParam.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table DressUpEnsemble {
MagicValue:uint;
Condition:[ActivationCondition] (required);
}
table DressUpEnsembleData {
MagicValue:uint;
Ensemble:[DressUpEnsemble] (required);
}
table DressUpEnsembleDataArray (fs_serializer) {
Table:[DressUpEnsembleData] (required);
}
root_type DressUpEnsembleDataArray;

View File

@@ -0,0 +1,15 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table DressUpGroupData {
Name:string (required);
Value:uint;
Group:string (required);
}
table DressUpGroupDataArray (fs_serializer) {
Table:[DressUpGroupData] (required);
}
root_type DressUpGroupDataArray;

View File

@@ -0,0 +1,14 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table EventConst {
Name:string (required);
Value:string (required);
}
table EventConstArray (fs_serializer) {
Table:[EventConst] (required);
}
root_type EventConstArray;

View File

@@ -0,0 +1,36 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table EventControl {
Name:string (required);
Field01:uint;
Field02:bool;
Field03:bool;
Field04:bool; // unused?
Field05:bool;
Field06:bool;
Field07:bool;
Field08:string;
Field09:bool; // unused?
Field10:bool; // unused?
Field11:bool;
Field12:string;
Field13:bool;
Field14:bool;
Field15:bool;
Field16:bool;
Field17:bool;
Field18:string;
Field19:string;
Field20:bool;
Field21:bool;
Field22:bool;
Field23:bool;
}
table EventControlArray (fs_serializer) {
Table:[EventControl] (required);
}
root_type EventControlArray;

View File

@@ -0,0 +1,13 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table EventLabel {
Name:string (required);
}
table EventLabelArray (fs_serializer) {
Table:[EventLabel] (required);
}
root_type EventLabelArray;

View File

@@ -0,0 +1,100 @@
include "FieldWeatherType.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
enum FieldClimateType : int
{
None = -1,
Normal = 0,
Cold = 1,
Hot = 2,
}
enum StringForStruct : int
{
NONE = -1,
weather_table_main = 0,
desert = 1,
snowy = 2,
room = 3,
}
struct WeatherTimeZone {
From:float;
To:float;
}
table WeatherSoundParam {
SoundStateEventName:string;
SoundRTPCValue:float;
}
table WeatherSoundTable {
Sunny:WeatherSoundParam;
Cloudy:WeatherSoundParam;
Rain:WeatherSoundParam;
Storm:WeatherSoundParam;
Mist:WeatherSoundParam;
ClearSunny:WeatherSoundParam;
Rainbow:WeatherSoundParam;
}
struct WeatherReplace {
OrgWeather:FieldWeatherType;
ReplaceWeather:FieldWeatherType;
ValidTimeZone:[WeatherTimeZone:3];
}
struct FieldWeatherDefine {
Type:FieldWeatherType;
Prob:int;
}
struct FieldWeatherDefineSub {
MainWeather:FieldWeatherType;
SubWeather:[FieldWeatherDefine:9];
}
struct FieldWeatherSpecialTransition {
Type:FieldWeatherType;
TransitionFrom:FieldWeatherType;
TransitionTo:FieldWeatherType;
MinDuration:int;
MaxDuration:int;
}
struct FieldWeatherStructSub {
Tag:StringForStruct;
Climate:FieldClimateType;
MinDuration:int;
MaxDuration:int;
OutdoorWeatherTable:StringForStruct;
Weather:[FieldWeatherDefineSub:11];
SpecialTransition:[FieldWeatherSpecialTransition:4];
}
struct FieldWeatherStructSubList {
List:[FieldWeatherStructSub:8];
}
struct FieldWeatherStructMain {
Tag:StringForStruct;
Climate:FieldClimateType;
MinDuration:int;
MaxDuration:int;
Weather:[FieldWeatherDefine:9];
SpecialTransition:[FieldWeatherSpecialTransition:4];
Replace:[WeatherReplace:4];
}
table FieldWeatherTable (fs_serializer) {
TransitionSpan:float;
TransitionSpanForFix:float;
Main:FieldWeatherStructMain;
Sub:FieldWeatherStructSubList;
Sound:WeatherSoundTable;
}
root_type FieldWeatherTable;

View File

@@ -0,0 +1,19 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum FieldWeatherType : int
{
None = -1,
Sunny = 0,
Cloudy = 1,
Rain = 2,
Storm = 3,
Snow = 4,
SnowStorm = 5,
DiamondDust = 6,
SandStorm = 7,
Mist = 8,
ClearSunny = 9,
Rainbow = 10,
Count = 11,
RainToSunny = 12,
}

View File

@@ -0,0 +1,21 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table HairMakeData {
Value:uint;
Resource:string (required);
Type:uint;
Bool03:bool;
Color:string;
Name:string;
SortOrder:uint;
Pattern1:int;
Pattern2:int;
}
table HairMakeDataArray (fs_serializer) {
Table:[HairMakeData] (required);
}
root_type HairMakeDataArray;

View File

@@ -0,0 +1,29 @@
include "Shared/ActivationConditionElement.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table Medal {
Name:string;
Requirement:[ActivationConditionElement];
}
table Title {
Index:uint;
Name:string (required);
Text:string (required);
Count:string;
Complete:string;
Type:uint;
Requirement:[ActivationConditionElement] (required);
Bronze:Medal;
Silver:Medal;
Gold:Medal;
}
table TitleArray (fs_serializer) {
Table:[Title] (required);
}
root_type TitleArray;

View File

@@ -0,0 +1,17 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table TitleCount {
Index:string (required);
Type1:uint;
Type2:int;
Type3:uint;
Flag4:bool;
}
table TitleCountArray (fs_serializer) {
Table:[TitleCount] (required);
}
root_type TitleCountArray;

View File

@@ -0,0 +1,38 @@
include "FieldWeatherType.fbs";
include "Math/PackedVec3f.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
struct TimeZone {
From:int;
To:int;
}
table WeatherHappeningParam {
Name:string;
TemplatePath:string;
SceneName:string;
PrevWeather0:FieldWeatherType;
PrevWeather1:FieldWeatherType;
PrevWeather2:FieldWeatherType;
CurWeather0:FieldWeatherType;
CurWeather1:FieldWeatherType;
CurWeather2:FieldWeatherType;
TimeZone0:TimeZone;
TimeZone1:TimeZone;
TimeZone2:TimeZone;
Prob:int;
MinDuration:int;
MaxDuration:int;
FollowCamera:bool;
Offset:PackedVec3f;
FollowSun:bool;
}
table WeatherHappeningParamArray (fs_serializer) {
Table:[WeatherHappeningParam] (required);
}
root_type WeatherHappeningParamArray;

View File

@@ -0,0 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<Content Remove="Schemas\WeatherHappeningParamArray.fbs" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,379 @@
using pkNX.Containers;
namespace pkNX.Structures.FlatBuffers.ZA;
public class PersonalDumper9a
{
public const bool HasAbilities = true;
public required IReadOnlyList<string> Abilities { private get; init; }
public required IReadOnlyList<string> Types { private get; init; }
public required IReadOnlyList<string> Items { private get; init; }
public required IReadOnlyList<string> Colors { private get; init; }
public required IReadOnlyList<string> EggGroups { private get; init; }
public required IReadOnlyList<string> ExpGroups { private get; init; }
public required IReadOnlyList<string> Moves { protected get; init; }
public required IReadOnlyList<string> Species { private get; init; }
public required IReadOnlyList<string> ZukanA { private get; init; }
public required IReadOnlyList<string> ZukanB { private get; init; }
public required AHTB ZukanAHTB { private get; init; }
public static ReadOnlySpan<ushort> TMIndexes => PersonalInfo9ZA.TMIndexes;
private static readonly string[] AbilitySuffix = [" (1)", " (2)", " (H)"];
public IReadOnlyList<List<string>> MoveSpeciesLearn { get; private set; } = [];
public readonly PersonalDumperSettings Settings = new();
public List<string> Dump(PersonalTable9ZA table)
{
var lines = new List<string>();
var ml = new List<string>[Moves.Count];
for (int i = 0; i < ml.Length; i++)
ml[i] = [];
MoveSpeciesLearn = ml;
for (ushort species = 0; species <= table.MaxSpeciesID; species++)
{
var pi = table[species];
var specInternal = SpeciesConverterZA.GetInternal9(species);
for (byte form = 0; form < pi.FormCount; form++)
AddDump(lines, table, specInternal, species, form);
}
return lines;
}
private string GetSpeciesName(ushort internalIndex) => Species[internalIndex];
public void AddDump(List<string> lines, PersonalTable9ZA table, ushort speciesInternal, ushort species, byte form)
{
var index = table.GetFormIndex(species, form);
var entry = table[index];
string name = GetSpeciesName(speciesInternal);
if (form != 0)
name += $"-{form}";
name += $" #{entry.DexIndex:000}";
AddDump(lines, entry, index, name, speciesInternal, form);
}
private void AddDump(List<string> lines, PersonalInfo9ZA pi, int entry, string name, ushort speciesInternal, byte form)
{
if (pi is { IsPresentInGame: false })
return;
var specName = GetSpeciesName(speciesInternal);
var specCode = pi.FormCount > 1 ? $"{specName}-{form}" : $"{specName}";
if (Settings.Stats)
AddPersonalLines(lines, pi, entry, name, specCode);
if (pi.SpeciesClassMajor is not 0 || pi.SpeciesClassMinor is not 0)
{
var classification = pi.SpeciesClassMajor is not 0 && pi.SpeciesClassMinor is 0 ? $"Classifications: {GetClassificationDisplayNameMajor(pi.SpeciesClassMajor)}"
: pi.SpeciesClassMinor is not 0 && pi.SpeciesClassMajor is 0 ? $"Classifications: {GetClassificationDisplayNameMinor(pi.SpeciesClassMinor, speciesInternal)}"
: $"Classifications: {GetClassificationDisplayNameMajor(pi.SpeciesClassMajor)} / {GetClassificationDisplayNameMinor(pi.SpeciesClassMinor, speciesInternal)}";
lines.Add(classification);
}
lines.Add($"Alpha Move: {Moves[pi.AlphaMove]}");
if (!pi.FB.TechnicalMachine.Contains(pi.AlphaMove))
lines.Add("ALPHA MOVE NOT IN TM LIST");
if (Settings.Learn)
AddLearnsets(pi.FB, lines, specCode);
if (Settings.Evo)
AddEvolutions(pi.FB, lines);
if (Settings.Dex)
AddZukan(lines, ZukanA, speciesInternal, form);
lines.Add("");
}
private void AddZukan(List<string> lines, IReadOnlyList<string> zukanA, ushort speciesInternal, byte form)
{
if (speciesInternal >= Species.Count)
return;
var hash = FnvHash.HashFnv1a_64($"ZKN_COMMENT_A_{speciesInternal:000}_{form:000}"); // no need to check for B, only one version
var line = ZukanAHTB.GetString(hash, zukanA);
lines.Add(line.Replace("\\n", " "));
}
private void AddLearnsets(PersonalInfo fb, List<string> lines, string specCode)
{
var learn = fb.Learnset;
lines.Add("Level Up Moves:");
foreach (var x in learn)
{
var move = x.Move;
var level = x.Level switch
{
-3 => "EVO",
-2 => "RELEARN",
_ => $"{x.Level:00}",
};
lines.Add($"- [{level}] {Moves[move]} {{{x.LevelPlus}}}");
MoveSpeciesLearn[move].Add(specCode);
}
if (TMIndexes.Length != 0)
{
var tmMoveIDs = fb.TechnicalMachine;
if (tmMoveIDs.Count != 0)
{
lines.Add("TM Learn:");
foreach (var move in tmMoveIDs.OrderBy(z => TMIndexes.IndexOf(z)))
{
var tmID = TMIndexes.IndexOf(move);
if (tmID < 0)
continue;
lines.Add($"- [TM{tmID+1:000}] {Moves[move]}");
MoveSpeciesLearn[move].Add(specCode);
}
}
}
{
var egg = fb.EggMoves;
if (egg.Count != 0)
{
lines.Add("Egg Moves:");
foreach (var move in egg)
{
lines.Add($"- {Moves[move]}");
MoveSpeciesLearn[move].Add(specCode);
}
}
}
{
var tmMoveIDs = fb.ReminderMoves;
if (tmMoveIDs.Count != 0)
{
lines.Add("Reminder:");
foreach (var move in tmMoveIDs)
{
lines.Add($"- {Moves[move]}");
MoveSpeciesLearn[move].Add(specCode);
}
}
}
}
private void AddEvolutions(PersonalInfo fb, List<string> lines)
{
var evo = fb.Evolutions;
if (evo.Count == 0)
return;
foreach (var z in evo)
{
if (z.Reserved3 != 0 || z.Reserved4 != 0 || z.Reserved5 != 0)
throw new Exception("Reserved fields not 0");
var method = (EvolutionType)z.Method;
string arg = GetArgTypeDisplayValue(method, z.Argument);
var line = $"Evolves into {GetSpeciesName(z.SpeciesInternal)}-{z.Form} @ lv{z.Level} ({method}) [{arg}]";
lines.Add(line);
}
}
private string GetArgTypeDisplayValue(EvolutionType type, ushort value)
{
if (type.IsPlibUseItemType())
{
var item = Plib9.PlibToItem[value];
return Items[item];
}
var argType = type.GetArgType();
return GetArgTypeDisplayValue(argType, value);
}
private string GetArgTypeDisplayValue(EvolutionTypeArgumentType argType, ushort value) => argType switch
{
EvolutionTypeArgumentType.Level => value.ToString(),
EvolutionTypeArgumentType.NoArg => value.ToString(),
EvolutionTypeArgumentType.Items => Items[value],
EvolutionTypeArgumentType.Moves => Moves[value],
EvolutionTypeArgumentType.Species => GetSpeciesName(value),
EvolutionTypeArgumentType.Type => Types[value],
EvolutionTypeArgumentType.Stat => value.ToString(),
EvolutionTypeArgumentType.Version => value.ToString(),
_ => throw new ArgumentOutOfRangeException(nameof(argType), argType, null),
};
private string GetClassificationDisplayNameMajor(byte classification) => classification switch
{
(byte)SpeciesClassificationMajor.Legend => "Legendary",
(byte)SpeciesClassificationMajor.SubLegend => "Sub-Legendary",
(byte)SpeciesClassificationMajor.Mythical => "Mythical",
_ => throw new ArgumentOutOfRangeException(nameof(classification), classification, null),
};
private string GetClassificationDisplayNameMinor(uint classification, ushort species) => classification switch
{
(ushort)SpeciesClassificationMinor.UltraBeast => "Ultra Beast",
(ushort)SpeciesClassificationMinor.ParadoxPast => "Paradox (Past)",
(ushort)SpeciesClassificationMinor.ParadoxFuture => "Paradox (Future)",
(ushort)SpeciesClassificationMinor.SpecialBattleForm when species is 0382 or 0383 => "Primal Reversion",
(ushort)SpeciesClassificationMinor.SpecialBattleForm => "Mega Evolution",
_ => throw new ArgumentOutOfRangeException(nameof(classification), classification, null),
};
private void AddPersonalLines(List<string> lines, IPersonalInfo pi, int entry, string name, string specCode)
{
lines.Add("======");
lines.Add($"{entry:000} - {name} (Stage: {pi.EvoStage})");
lines.Add("======");
if (pi is IPersonalMisc_SWSH { IsPresentInGame: false })
lines.Add("Present: No");
lines.Add($"Base Stats: {pi.HP}.{pi.ATK}.{pi.DEF}.{pi.SPA}.{pi.SPD}.{pi.SPE} (BST: {pi.GetBaseStatTotal()})");
lines.Add($"EV Yield: {pi.EV_HP}.{pi.EV_ATK}.{pi.EV_DEF}.{pi.EV_SPA}.{pi.EV_SPD}.{pi.EV_SPE}");
lines.Add($"Gender Ratio: {pi.Gender}");
lines.Add($"Catch Rate: {pi.CatchRate}");
if (HasAbilities)
{
var abils = new int[pi.GetNumAbilities()];
pi.GetAbilities(abils);
var msg = string.Join(" | ", abils.Select((z, j) => Abilities[z] + AbilitySuffix[j]));
lines.Add($"Abilities: {msg}");
}
lines.Add(string.Format(pi.Type1 != pi.Type2
? "Type: {0} / {1}"
: "Type: {0}", Types[(int)pi.Type1], Types[(int)pi.Type2]));
lines.Add($"EXP Group: {ExpGroups[pi.EXPGrowth]}");
lines.Add(string.Format(pi.EggGroup1 != pi.EggGroup2
? "Egg Group: {0} / {1}"
: "Egg Group: {0}", EggGroups[pi.EggGroup1], EggGroups[pi.EggGroup2]));
lines.Add($"Height: {(decimal)pi.Height / 100:00.00}m, Weight: {(decimal)pi.Weight / 10:000.0}kg, Color: {Colors[pi.Color]}");
}
}
public static class Plib9
{
public static bool IsPlibUseItemType(this EvolutionType method) => method switch
{
EvolutionType.UseItem => true,
EvolutionType.UseItemMale => true,
EvolutionType.UseItemFemale => true,
EvolutionType.LevelUpHeldItemDay => true,
EvolutionType.LevelUpHeldItemNight => true,
//EvolutionType.UseItemWormhole => true,
//EvolutionType.UseItemFullMoon => true,
_ => false,
};
// plib_item_conversion_array
// inverted {a,b} => {b,a} so we can get the item ID from plib evo arg.
public static readonly Dictionary<ushort, ushort> PlibToItem = new()
{
{ 0001, 0080 }, // Sun Stone
{ 0002, 0081 }, // Moon Stone
{ 0003, 0082 }, // Fire Stone
{ 0004, 0083 }, // Thunder Stone
{ 0005, 0084 }, // Water Stone
{ 0006, 0085 }, // Leaf Stone
{ 0007, 0107 }, // Shiny Stone
{ 0008, 0108 }, // Dusk Stone
{ 0009, 0110 }, // Oval Stone
{ 0010, 1779 }, // Griseous Core
{ 0011, 0000 },
{ 0012, 0000 },
{ 0013, 0000 },
{ 0014, 0000 },
{ 0015, 0229 }, // Everstone
{ 0016, 0236 }, // Light Ball
{ 0017, 0000 },
{ 0018, 0000 },
{ 0019, 0280 }, // Destiny Knot
{ 0020, 0289 }, // Power Bracer
{ 0021, 0290 }, // Power Belt
{ 0022, 0291 }, // Power Lens
{ 0023, 0292 }, // Power Band
{ 0024, 0293 }, // Power Anklet
{ 0025, 0294 }, // Power Weight
{ 0026, 0298 }, // Flame Plate
{ 0027, 0299 }, // Splash Plate
{ 0028, 0300 }, // Zap Plate
{ 0029, 0301 }, // Meadow Plate
{ 0030, 0302 }, // Icicle Plate
{ 0031, 0303 }, // Fist Plate
{ 0032, 0304 }, // Toxic Plate
{ 0033, 0305 }, // Earth Plate
{ 0034, 0306 }, // Sky Plate
{ 0035, 0307 }, // Mind Plate
{ 0036, 0308 }, // Insect Plate
{ 0037, 0309 }, // Stone Plate
{ 0038, 0310 }, // Spooky Plate
{ 0039, 0311 }, // Draco Plate
{ 0040, 0312 }, // Dread Plate
{ 0041, 0313 }, // Iron Plate
{ 0042, 0000 },
{ 0043, 0000 },
{ 0044, 0000 },
{ 0045, 0000 },
{ 0046, 0000 },
{ 0047, 0000 },
{ 0048, 0000 },
{ 0049, 0326 }, // Razor Claw
{ 0050, 0327 }, // Razor Fang
{ 0051, 0644 }, // Pixie Plate
{ 0052, 0849 }, // Ice Stone
{ 0053, 0000 },
{ 0054, 0000 },
{ 0055, 0000 },
{ 0056, 0000 },
{ 0057, 0000 },
{ 0058, 0000 },
{ 0059, 0000 },
{ 0060, 0000 },
{ 0061, 0000 },
{ 0062, 0000 },
{ 0063, 0000 },
{ 0064, 0000 },
{ 0065, 0000 },
{ 0066, 0000 },
{ 0067, 0000 },
{ 0068, 0000 },
{ 0069, 0000 },
{ 0070, 1103 }, // Rusted Sword
{ 0071, 1104 }, // Rusted Shield
{ 0072, 1109 }, // Strawberry Sweet
{ 0073, 1110 }, // Love Sweet
{ 0074, 1111 }, // Berry Sweet
{ 0075, 1112 }, // Clover Sweet
{ 0076, 1113 }, // Flower Sweet
{ 0077, 1114 }, // Star Sweet
{ 0078, 1115 }, // Ribbon Sweet
{ 0079, 1116 }, // Sweet Apple
{ 0080, 1117 }, // Tart Apple
{ 0081, 1253 }, // Cracked Pot
{ 0082, 1254 }, // Chipped Pot
{ 0083, 1582 }, // Galarica Cuff
{ 0084, 1592 }, // Galarica Wreath
{ 0085, 2344 }, // Auspicious Armor
{ 0086, 1861 }, // Malicious Armor
{ 0087, 2345 }, // Leaders Crest
{ 0088, 1857 }, // Scroll of Darkness
{ 0089, 1858 }, // Scroll of Waters
{ 0090, 0000 },
{ 0091, 0000 },
{ 0092, 0218 }, // Soothe Bell
{ 0093, 0109 }, // Dawn Stone
{ 0094, 2403 }, // Unremarkable Teacup
{ 0095, 2404 }, // Masterpiece Teacup
{ 0096, 2402 }, // Syrupy Apple
{ 0111, 0537 }, // Prism Scale
{ 0112, 0325 }, // Reaper Cloth
{ 0113, 0252 }, // Upgrade
{ 0114, 0324 }, // Dubious Disc
{ 0115, 0322 }, // Electirizer
{ 0116, 0323 }, // Magmarizer
{ 0117, 0321 }, // Protector
{ 0118, 0235 }, // Dragon Scale
{ 0119, 2482 }, // Metal Alloy
};
}

View File

@@ -0,0 +1,3 @@
namespace pkNX.Structures.FlatBuffers.ZA;
public partial class PersonalInfoDex;

View File

@@ -0,0 +1,3 @@
namespace pkNX.Structures.FlatBuffers.ZA;
public partial class PersonalInfoEvolution;

View File

@@ -0,0 +1,24 @@
namespace pkNX.Structures.FlatBuffers.ZA;
public partial class PersonalInfoGender
{
public const int RatioMagicMale = 0;
public const int RatioMagicFemale = 254;
public const int RatioMagicGenderless = 255;
public byte RatioMagicEquivalent() => Group switch
{
0 => Ratio switch
{
12 => 0x1F, // 12.5%
25 => 0x3F, // 25%
50 => 0x7F, // 50%
75 => 0xBF, // 75%
89 => 0xE1, // 87.5%
_ => throw new ArgumentOutOfRangeException(nameof(Ratio)),
},
SexGroup.MALE => RatioMagicMale,
SexGroup.FEMALE => RatioMagicFemale,
SexGroup.UNKNOWN => RatioMagicGenderless,
_ => throw new ArgumentOutOfRangeException(nameof(Group)),
};
}

View File

@@ -0,0 +1,6 @@
namespace pkNX.Structures.FlatBuffers.ZA;
public partial class PersonalInfoStats
{
public ushort U16() => (ushort)((HP & 0b11) | ((ATK & 0b11) << 2) | ((DEF & 0b11) << 4) | ((SPE & 0b11) << 6) | ((SPA & 0b11) << 8) | ((SPD & 0b11) << 10));
}

View File

@@ -0,0 +1,148 @@
namespace pkNX.Structures.FlatBuffers.ZA;
/// <summary>
/// Personal Info class with values from the <see cref="GameVersion.ZA"/> games.
/// </summary>
public sealed class PersonalInfo9ZA(PersonalInfo fb) : IPersonalInfo
{
public PersonalInfo FB { get; } = fb;
public int HP { get => FB.Base.HP; set => FB.Base.HP = (byte)value; }
public int ATK { get => FB.Base.ATK; set => FB.Base.ATK = (byte)value; }
public int DEF { get => FB.Base.DEF; set => FB.Base.DEF = (byte)value; }
public int SPE { get => FB.Base.SPE; set => FB.Base.SPE = (byte)value; }
public int SPA { get => FB.Base.SPA; set => FB.Base.SPA = (byte)value; }
public int SPD { get => FB.Base.SPD; set => FB.Base.SPD = (byte)value; }
public Types Type1 { get => (Types)FB.Type1; set => FB.Type1 = (byte)value; }
public Types Type2 { get => (Types)FB.Type2; set => FB.Type2 = (byte)value; }
public int Ability1 { get => FB.Ability1; set => FB.Ability1 = (ushort)value; }
public int Ability2 { get => FB.Ability2; set => FB.Ability2 = (ushort)value; }
public int AbilityH { get => FB.AbilityH; set => FB.AbilityH = (ushort)value; }
public int CatchRate { get => FB.CatchRate; set => FB.CatchRate = (byte)value; }
public int EvoStage { get => FB.EvoStage; set => FB.EvoStage = (byte)value; }
public int EV_HP { get => FB.EVYield.HP; set => FB.EVYield.HP = (byte)value; }
public int EV_ATK { get => FB.EVYield.ATK; set => FB.EVYield.ATK = (byte)value; }
public int EV_DEF { get => FB.EVYield.DEF; set => FB.EVYield.DEF = (byte)value; }
public int EV_SPE { get => FB.EVYield.SPE; set => FB.EVYield.SPE = (byte)value; }
public int EV_SPA { get => FB.EVYield.SPA; set => FB.EVYield.SPA = (byte)value; }
public int EV_SPD { get => FB.EVYield.SPD; set => FB.EVYield.SPD = (byte)value; }
public byte GenderGroup { get => (byte)FB.Gender.Group; set => FB.Gender.Group = (SexGroup)value; }
public byte GenderRatio { get => FB.Gender.Ratio; set => FB.Gender.Ratio = value; }
public int Gender
{
get => FB.Gender.RatioMagicEquivalent();
set { }
}
public int BaseFriendship { get => FB.BaseFriendship; set => FB.BaseFriendship = (byte)value; }
public int EXPGrowth { get => FB.EXPGrowth; set => FB.EXPGrowth = (byte)value; }
public int EggGroup1 { get => FB.EggGroup1; set => FB.EggGroup1 = (byte)value; }
public int EggGroup2 { get => FB.EggGroup2; set => FB.EggGroup2 = (byte)value; }
public int Color { get => FB.Info.Color; set => FB.Info.Color = (byte)value; }
public bool IsPresentInGame { get => FB.IsPresentInGame; set => FB.IsPresentInGame = value; }
public int Height { get => FB.Info.Height; set => FB.Info.Height = (ushort)value; }
public int Weight { get => FB.Info.Weight; set => FB.Info.Weight = (ushort)value; }
public byte DebutVersion { get => FB.Info.DebutVersion; set => FB.Info.DebutVersion = value; }
public byte SpeciesClassMajor { get => FB.Info.SpeciesClassMajor; set => FB.Info.SpeciesClassMajor = value; }
public uint SpeciesClassMinor { get => FB.Info.SpeciesClassMinor; set => FB.Info.SpeciesClassMinor = value; }
public ushort HatchedSpecies { get => SpeciesConverterZA.GetNational9(FB.Hatch.SpeciesInternal); set => FB.Hatch.SpeciesInternal = SpeciesConverterZA.GetInternal9(value); }
public ushort LocalFormIndex { get => FB.Hatch.Form; set => FB.Hatch.Form = value; }
public bool RegionalFlags { get => FB.Hatch.RegionalFlags == 1; set => FB.Hatch.RegionalFlags = value ? (ushort)1 : (ushort)0; }
public ushort EverstoneForm { get => FB.Hatch.EverstoneForm; set => FB.Hatch.EverstoneForm = value; }
public ushort Form { get => FB.Info.Form; set => FB.Info.Form = value; }
public ushort DexIndex
{
get => FB.Dex;
set => FB.Dex = value;
}
public int Item1 { get => 0; set { } }
public int Item2 { get => 0; set { } }
public int Item3 { get => 0; set { } }
public int BaseEXP { get => 0; set { } }
public int EscapeRate { get => 0; set { } }
public int FormSprite { get => 0; set { } }
public int FormStatsIndex { get; set; }
public byte FormCount { get; set; } = 1;
public int BST => FB.Base.HP + FB.Base.ATK + FB.Base.DEF + FB.Base.SPE + FB.Base.SPA + FB.Base.SPD;
public ushort AlphaMove { get; set; }
public void Write(BinaryWriter bw)
{
bw.Write(FB.Base.HP);
bw.Write(FB.Base.ATK);
bw.Write(FB.Base.DEF);
bw.Write(FB.Base.SPE);
bw.Write(FB.Base.SPA);
bw.Write(FB.Base.SPD);
bw.Write(FB.Type1);
bw.Write(FB.Type2);
bw.Write(FB.CatchRate);
bw.Write(FB.EvoStage);
bw.Write(FB.EVYield.U16());
bw.Write(FB.Gender.RatioMagicEquivalent());
bw.Write(FB.HatchCycles);
bw.Write(FB.BaseFriendship);
bw.Write(FB.EXPGrowth);
bw.Write(FB.EggGroup1);
bw.Write(FB.EggGroup2);
bw.Write(FB.Ability1);
bw.Write(FB.Ability2);
bw.Write(FB.AbilityH);
bw.Write((ushort)FormStatsIndex);
bw.Write(FormCount);
bw.Write(FB.Info.Color);
bw.Write(FB.IsPresentInGame);
bw.Write((byte)0);
bw.Write((ushort)DexIndex);
bw.Write(FB.Info.Height);
bw.Write(FB.Info.Weight);
bw.Write(SpeciesConverterZA.GetNational9(FB.Hatch.SpeciesInternal));
bw.Write(FB.Hatch.Form);
bw.Write(FB.Hatch.RegionalFlags);
bw.Write(FB.Hatch.EverstoneForm);
// 0x2C
// TMs
byte[] tmFlags = new byte[0x1E];
if (IsPresentInGame)
{
foreach (ushort tm in FB.TechnicalMachine)
{
// Get the index within TMIndexes, then set the bitflag within tmFlags
var bitIndex = TMIndexes.IndexOf(tm);
if (bitIndex < 0)
continue;
tmFlags[bitIndex / 8] |= (byte)(1 << (bitIndex % 8));
}
}
bw.Write(tmFlags);
bw.Write((ushort)0); // align 0x50
bw.Write(GetEXP(BST, FB.EvoStage, FB.BaseEXPAddend));
bw.Write(AlphaMove); // align
}
private static ushort GetEXP(int bst, byte evoStage, short add)
=> (ushort)(Math.Ceiling(bst * (1 + (3 * evoStage)) / 20d) + add);
public static ReadOnlySpan<ushort> TMIndexes =>
[
// Bit Index order
029, 337, 473, 249, 046, 347, 092, 086, 812, 280,
339, 157, 058, 424, 423, 113, 182, 612, 408, 583,
422, 332, 009, 008, 242, 412, 129, 091, 007, 014,
115, 104, 034, 400, 203, 317, 446, 126, 435, 331,
352, 202, 019, 063, 282, 341, 097, 120, 196, 315,
219, 414, 188, 434, 416, 038, 261, 442, 428, 248,
421, 053, 094, 076, 444, 521, 085, 257, 089, 250,
304, 083, 057, 247, 406, 710, 398, 523, 542, 334,
404, 369, 417, 430, 164, 528, 231, 191, 390, 399,
174, 605, 200, 018, 269, 056, 377, 127, 118, 441,
527, 411, 526, 394, 059, 087, 370,
];
}

View File

@@ -0,0 +1,123 @@
using System.Collections;
using pkNX.Containers;
using FlatSharp;
namespace pkNX.Structures.FlatBuffers.ZA;
/// <summary>
/// Personal Table storing <see cref="PersonalInfo9ZA"/> used in <see cref="GameVersion.ZA"/>.
/// </summary>
public sealed class PersonalTable9ZA : IPersonalTable, IPersonalTable<PersonalInfo9ZA>
{
public PersonalInfo9ZA[] Table { get; }
private const ushort MaxSpecies = Legal.MaxSpeciesID_9a;
public int MaxSpeciesID => MaxSpecies;
private readonly IFileContainer File;
public PersonalTable Root { get; }
public PersonalTable9ZA(IFileContainer file)
{
File = file;
Root = PersonalTable.Serializer.Parse(file[0], FlatBufferDeserializationOption.GreedyMutable);
var baseForms = new PersonalInfo9ZA[MaxSpecies + 1];
var formTable = new List<PersonalInfo9ZA>();
var formGrouped = Root.Table
.GroupBy(x => x.Info.SpeciesNational)
.OrderBy(x => x.Key).ToArray();
for (int i = 0; i <= MaxSpecies; i++)
{
var item = formGrouped[i];
var forms = item.ToArray();
baseForms[i] = GetObj(forms[0], forms, MaxSpecies, formTable);
for (int f = 1; f < forms.Length; f++)
formTable.Add(GetObj(forms[f], forms, MaxSpecies, formTable, f));
}
Table = [.. baseForms, .. formTable];
}
private static PersonalInfo9ZA GetObj(PersonalInfo e, ICollection forms, ushort max, ICollection formTable, int f = 0)
{
return new PersonalInfo9ZA(e)
{
FormCount = (byte)forms.Count,
FormStatsIndex = (f != 0 ? 0 : forms.Count == 1 ? 0 : max + formTable.Count + 1),
};
}
public void Save()
{
var pool = System.Buffers.ArrayPool<byte>.Shared;
var serializer = PersonalTable.Serializer;
var size = serializer.GetMaxSize(Root);
var arr = pool.Rent(size);
var len = serializer.Write(arr, Root);
var data = arr.AsSpan(0, len).ToArray();
pool.Return(arr);
File[0] = data;
}
public PersonalInfo9ZA this[int index] => Table[(uint)index < Table.Length ? index : 0];
public PersonalInfo9ZA this[ushort species, byte form] => Table[GetFormIndex(species, form)];
public PersonalInfo9ZA GetFormEntry(ushort species, byte form) => Table[GetFormIndex(species, form)];
public int GetFormIndex(ushort species, byte form)
{
if ((uint)species <= MaxSpecies)
return Table[species].FormIndex(species, form);
return 0;
}
public bool IsSpeciesInGame(ushort species)
{
if ((uint)species > MaxSpecies)
return false;
var form0 = Table[species];
if (form0.IsPresentInGame)
return true;
var fc = form0.FormCount;
for (byte i = 1; i < fc; i++)
{
var entry = GetFormEntry(species, i);
if (entry.IsPresentInGame)
return true;
}
return false;
}
public bool IsPresentInGame(ushort species, byte form)
{
if ((uint)species > MaxSpecies)
return false;
var form0 = Table[species];
if (form == 0)
return form0.IsPresentInGame;
if (!form0.HasForm(form))
return false;
var entry = GetFormEntry(species, form);
return entry.IsPresentInGame;
}
IPersonalInfo[] IPersonalTable.Table => Table;
IPersonalInfo IPersonalTable.this[int index] => this[index];
IPersonalInfo IPersonalTable.this[ushort species, byte form] => this[species, form];
IPersonalInfo IPersonalTable.GetFormEntry(ushort species, byte form) => GetFormEntry(species, form);
public byte[] Write()
{
using var ms = new MemoryStream();
using var bw = new BinaryWriter(ms);
foreach (var entry in Table)
entry.Write(bw);
return ms.ToArray();
}
}

View File

@@ -0,0 +1,30 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_valueStruct";
enum SpeciesClassificationMajor : ubyte {
None = 0,
Legend = 1,
SubLegend = 2,
Mythical = 3,
}
enum SpeciesClassificationMinor : uint {
None = 0,
UltraBeast = 1,
ParadoxPast = 2,
ParadoxFuture = 4,
SpecialBattleForm = 8,
}
struct PersonalInfoDetail { // give me a class, not struct.
SpeciesInternal : ushort;
Form : ushort;
SpeciesNational : ushort;
Color : ubyte ;
BodyType : ubyte ;
Height : ushort;
Weight : ushort;
DebutVersion : ubyte ;
SpeciesClassMajor : ubyte ;
SpeciesClassMinor : uint ;
}

View File

@@ -0,0 +1,13 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_valueStruct";
struct PersonalInfoEvolution { // give me a class, not struct.
Level:ushort;
Method:ushort;
Argument:ushort;
Reserved3:ushort;
Reserved4:ushort;
Reserved5:ushort;
SpeciesInternal:ushort;
Form:ushort;
}

View File

@@ -0,0 +1,14 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_valueStruct";
enum SexGroup : ubyte {
BOTH = 0,
MALE = 1,
FEMALE = 2,
UNKNOWN = 3,
}
struct PersonalInfoGender { // give me a class, not struct.
Group:SexGroup = BOTH;
Ratio:ubyte; // {rand(100) < value} => gender.
}

View File

@@ -0,0 +1,9 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_valueStruct";
struct PersonalInfoHatch { // give me a class, not struct.
SpeciesInternal:ushort;
Form:ushort;
RegionalFlags:ushort;
EverstoneForm:ushort;
}

View File

@@ -0,0 +1,8 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_valueStruct";
struct PersonalInfoMove { // give me a class, not struct.
Move:ushort;
Level:byte;
LevelPlus:byte;
}

View File

@@ -0,0 +1,11 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_valueStruct";
struct PersonalInfoStats { // give me a class, not struct.
HP :ubyte;
ATK:ubyte;
DEF:ubyte;
SPA:ubyte;
SPD:ubyte;
SPE:ubyte;
}

View File

@@ -0,0 +1,47 @@
include "PersonalInfoDetail.fbs";
include "PersonalInfoEvolution.fbs";
include "PersonalInfoGender.fbs";
include "PersonalInfoHatch.fbs";
include "PersonalInfoMove.fbs";
include "PersonalInfoStats.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table PersonalInfo {
Info:PersonalInfoDetail (required);
IsPresentInGame:bool;
Dex:ushort; // No need to group. Changed from SV.
// Dex:PersonalInfoDex; // not required
// KitakamiDex:ushort; // NOT USED IN DATA
// BlueberryDex:ushort; // NOT USED IN DATA
Type1:ubyte;
Type2:ubyte;
Ability1:ushort;
Ability2:ushort;
AbilityH:ushort;
EXPGrowth:ubyte;
CatchRate:ubyte;
Gender:PersonalInfoGender (required);
EggGroup1:ubyte;
EggGroup2:ubyte;
Hatch:PersonalInfoHatch (required);
HatchCycles:ubyte;
BaseFriendship:ubyte;
BaseEXPAddend:short;
EvoStage:ubyte;
IsTypeChangeDisallowed:bool; // Silvally, Arceus (and Sylveon in 1.0.0, fixed)
EVYield:PersonalInfoStats (required);
Base:PersonalInfoStats (required);
Evolutions:[PersonalInfoEvolution] (required);
TechnicalMachine:[ushort] (required);
EggMoves:[ushort] (required);
ReminderMoves:[ushort] (required);
Learnset:[PersonalInfoMove] (required);
}
table PersonalTable (fs_serializer) {
Table:[PersonalInfo] (required);
}
root_type PersonalTable;

View File

@@ -0,0 +1,2 @@
<Project Sdk="Microsoft.NET.Sdk">
</Project>

View File

@@ -0,0 +1,8 @@
namespace pkNX.Structures.FlatBuffers.ZA;
public partial class ParamSet
{
public string SlashSeparated() => $"{HP}/{ATK}/{DEF}/{SPA}/{SPD}/{SPE}";
public int[] ToArray() => [HP, ATK, DEF, SPA, SPD, SPE];
}

View File

@@ -0,0 +1,26 @@
namespace pkNX.Structures.FlatBuffers.ZA;
public partial class PokeDataBattle
{
public void SerializePKHeX(BinaryWriter bw, sbyte captureLv)
{
// flag BallId if not none
if (BallId != BallID.BALL_NULL)
throw new ArgumentOutOfRangeException(nameof(BallId), BallId, $"No {nameof(BallId)} allowed!");
ushort species = SpeciesConverterZA.GetNational9((ushort)DevId);
byte form = species switch
{
//(ushort)Species.Vivillon or (ushort)Species.Spewpa or (ushort)Species.Scatterbug => 30,
(ushort)Species.Minior when FormId < 7 => (byte)(FormId + 7),
_ => (byte)FormId,
};
bw.Write(species);
bw.Write(form);
bw.Write((byte)Sex);
bw.Write((byte)Tokusei);
bw.Write((byte)RareType);
bw.Write((byte)captureLv);
}
}

View File

@@ -0,0 +1,88 @@
namespace pkNX.Structures.FlatBuffers.ZA;
/// <summary>
/// <see cref="DevID"/> does not match National Dex ID.
/// </summary>
public static class SpeciesConverterZA
{
public static T[] GetRearrangedAsNational<T>(T[] specNames)
{
var result = new T[specNames.Length];
for (ushort indexInternal = 0; indexInternal < specNames.Length; indexInternal++)
{
var indexNational = GetNational9(indexInternal);
if (indexNational >= specNames.Length) continue;
result[indexNational] = specNames[indexInternal];
}
return result;
}
/// <summary>
/// Converts a National Dex ID to Generation 9 internal species ID.
/// </summary>
/// <param name="species">National Dex ID</param>
/// <returns>Generation 9 species ID.</returns>
public static ushort GetInternal9(ushort species)
{
var shift = species - FirstUnalignedNational9;
var table = Table9NationalToInternal;
if ((uint)shift >= table.Length)
return species;
return (ushort)(species + table[shift]);
}
/// <summary>
/// Converts a Generation 9 internal species ID to National Dex ID.
/// </summary>
/// <param name="raw">Generation 9 species ID.</param>
/// <returns>National Dex ID.</returns>
public static ushort GetNational9(ushort raw)
{
var table = Table9InternalToNational;
var shift = raw - FirstUnalignedInternal9;
if ((uint)shift >= table.Length)
return raw;
return (ushort)(raw + table[shift]);
}
private const int FirstUnalignedNational9 = 917;
private const int FirstUnalignedInternal9 = FirstUnalignedNational9;
/// <summary>
/// Difference of National Dex IDs (index) and the associated Gen9 Species IDs (value)
/// </summary>
private static ReadOnlySpan<sbyte> Table9NationalToInternal =>
[
001, 001, 001,
001, 033, 033, 033, 021, 021, 044, 044, 007, 007,
007, 029, 031, 031, 031, 068, 068, 068, 002, 002,
017, 017, 030, 030, 024, 024, 028, 028, 058, 058,
012, -13, -13, -31, -31, -29, -29, 043, 043, 043,
-31, -31, -03, -30, -30, -23, -23, -14, -24, -03,
-03, -47, -47, -12, -27, -27, -44, -46, -26, 031,
029, -53, -65, 025, -06, -03, -07, -04, -04, -08,
-04, 001, -03, -03, -06, -04, -47, -47, -47, -23,
-23, -05, -07, -09, -07, -20, -13, -09, -09, -29,
-23, 001, 012, 012, 000, 000, 000, -06, 005, -06,
-03, -03, -02, -04, -03, -03,
];
/// <summary>
/// Difference of Gen9 Species IDs (index) and the associated National Dex IDs (value)
/// </summary>
private static ReadOnlySpan<sbyte> Table9InternalToNational =>
[
065, -01, -01,
-01, -01, 031, 031, 047, 047, 029, 029, 053, 031,
031, 046, 044, 030, 030, -07, -07, -07, 013, 013,
-02, -02, 023, 023, 024, -21, -21, 027, 027, 047,
047, 047, 026, 014, -33, -33, -33, -17, -17, 003,
-29, 012, -12, -31, -31, -31, 003, 003, -24, -24,
-44, -44, -30, -30, -28, -28, 023, 023, 006, 007,
029, 008, 003, 004, 004, 020, 004, 023, 006, 003,
003, 004, -01, 013, 009, 007, 005, 007, 009, 009,
-43, -43, -43, -68, -68, -68, -58, -58, -25, -29,
-31, 006, -01, 006, 000, 000, 000, 003, 003, 004,
002, 003, 003, -05, -12, -12,
];
}

View File

@@ -0,0 +1,8 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum CollisionShape : int {
NONE = 0,
SPHERE = 1,
BOX = 2,
CAPSULE = 3,
}

View File

@@ -0,0 +1,10 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum ComparisonOperatorType : int {
EQUAL = 0,
NOT_EQUAL = 1,
GREATER_THAN = 2,
GREATER_THAN_EQUAL = 3,
LESS_THAN = 4,
LESS_THAN_EQUAL = 5,
}

View File

@@ -0,0 +1,14 @@
include "PokemonTriggerID.fbs";
include "ComparisonOperatorType.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table ConditionSimpleAutoBattleHecklerAreaArray (fs_serializer) {
Table:[ConditionSimpleAutoBattleHecklerArea] (required);
}
table ConditionSimpleAutoBattleHecklerArea {
TriggerID:PokemonTriggerID;
ComparisonOperatorType:ComparisonOperatorType;
}

View File

@@ -0,0 +1,12 @@
include "../Shared/SexType.fbs";
include "../Shared/LangType.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table OwnerInfo {
TrainerId:int;
Sex:SexType;
LangId:LangType;
Name:string (required);
}

View File

@@ -0,0 +1,11 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table ParamSet {
HP:int;
ATK:int;
DEF:int;
SPA:int;
SPD:int;
SPE:int;
}

View File

@@ -0,0 +1,61 @@
include "../Shared/DevID.fbs";
include "Math/Vec3f.fbs";
include "CollisionShape.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table GrassCollision {
OffsetY:float;
Radius:float;
}
table CGemParam {
Pos:Vec3f (required);
Rot:Vec3f (required);
Scale:Vec3f (required);
}
table PokeParameter {
ReachDistance:float;
AcceleStartDistance:float;
DeceleStartDistance:float;
MoveAccele:float;
RotationSpeed:float;
MinWaterDepthThreshold:float;
MaxWaterDepthThreshold:float;
MinAltitudeThreshold:float;
MaxAltitudeThreshold:float;
}
table NamedFlatBuffer {
FileName:string (required);
}
table CharaCollision {
Shape:CollisionShape = NONE;
Pos:Vec3f (required);
Radius:float;
}
table BodyCollision {
Shape:CollisionShape = NONE;
Pos:Vec3f (required);
Radius:float;
}
table PokeObj {
DevId:DevID = DEV_NULL;
Body:BodyCollision;
Chara:CharaCollision;
Grass:GrassCollision;
FlatBuffer:NamedFlatBuffer;
GemParam:CGemParam;
Poke:PokeParameter;
}
table PokeObjArray (fs_serializer) {
Table:[PokeObj] (required);
}
root_type PokeObjArray;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,35 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
struct TimerBallData {
Count:uint;
Ratio:float;
}
table CaptureBallData (fs_serializer) {
Poke:float;
Great:float;
Ultra:float;
Net:float;
Repeat:float;
Timer:[TimerBallData];
Nest:float;
Luxury:float;
Heal:float;
Dive:float;
Quick:float;
Dusk:float;
Premier:float;
Beast:float;
Dream:float;
Fast:float;
Friend:float;
Heavy:[float];
Moon:float;
Love:float;
Lure:float;
Level:[float];
}
root_type CaptureBallData;

View File

@@ -0,0 +1,40 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table CaptureSick {
Koori:float;
Nemuri:float;
Doku:float;
Yakedo:float;
Mahi:float;
}
table CaptureBackStrike {
Cowardice:float;
NotCowardice:float;
}
table CaptureAiState {
Normal:float;
NotAware:float;
Eating:float;
Sleeping:float;
Resting:float;
}
table CaptureData (fs_serializer) {
Sick:CaptureSick;
Rare:float;
BackStrike:CaptureBackStrike;
Cowardice:CaptureAiState;
NotCowardice:CaptureAiState;
Chance:float;
Oyabun:float;
OyabunChance:float;
Coef:float;
backStrikeAngle:int;
backStrikeHeight:int;
}
root_type CaptureData;

View File

@@ -0,0 +1,32 @@
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
attribute "fs_valueStruct";
attribute "fs_nonVirtual";
table CaptureZARankData (fs_serializer) {
LevelThreshold:ZARankLevelThreshold (required);
ZRank:ZARankArray (required);
YRank:ZARankArray (required);
XRank:ZARankArray (required);
WRank:ZARankArray (required);
VRank:ZARankArray (required);
GRank:ZARankArray (required);
FRank:ZARankArray (required);
ERank:ZARankArray (required);
DRank:ZARankArray (required);
CRank:ZARankArray (required);
BRank:ZARankArray (required);
ARank:ZARankArray (required);
InfRank:ZARankArray (required);
}
struct ZARankLevelThreshold {
Level:[int:10] (fs_nonVirtual);
}
struct ZARankArray {
Ratio:[float:10] (fs_nonVirtual);
}
root_type CaptureZARankData;

View File

@@ -0,0 +1,21 @@
include "../Shared/DevID.fbs";
include "../Shared/ItemID.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
attribute "fs_serializer";
table MegaEvo {
Species:DevID;
Item:ItemID;
FromForm:uint;
ToForm:uint;
Type:string (required);
Short:string (required);
}
table MegaEvoArray (fs_serializer) {
Table:[MegaEvo] (required);
}
root_type MegaEvoArray;

View File

@@ -0,0 +1,34 @@
include "../Shared/DevID.fbs";
include "../Shared/SexType.fbs";
include "../Shared/ItemID.fbs";
include "../Shared/SeikakuType.fbs";
include "../Shared/TokuseiType.fbs";
include "../Shared/TalentType.fbs";
include "../Shared/RareType.fbs";
include "../Shared/SizeType.fbs";
include "../Shared/BallID.fbs";
include "../PokeData/WazaSetBattle.fbs";
include "../Entity/ParamSet.fbs";
include "../Shared/WazaType.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
table PokeDataBattle {
DevId:DevID;
FormId:short;
Sex:SexType;
Item:ItemID;
Level:int;
BallId:BallID;
Waza1:WazaSetBattle (required);
Waza2:WazaSetBattle (required);
Waza3:WazaSetBattle (required);
Waza4:WazaSetBattle (required);
Seikaku:SeikakuType;
Tokusei:TokuseiType;
TalentValue:ParamSet (required);
EffortValue:ParamSet (required);
RareType:RareType;
ScaleValue:short;
}

View File

@@ -0,0 +1,43 @@
include "../Shared/DevID.fbs";
include "../Shared/SexType.fbs";
include "../Shared/ItemID.fbs";
include "../Shared/SeikakuType.fbs";
include "../Shared/TokuseiType.fbs";
include "../Shared/TalentType.fbs";
include "../Shared/RareType.fbs";
include "../Shared/SizeType.fbs";
include "../Shared/BallID.fbs";
include "../Shared/RibbonType.fbs";
include "../Entity/ParamSet.fbs";
include "../PokeData/WazaSet.fbs";
include "../Shared/WazaType.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
table PokeDataDLCGift {
DevId:DevID = DEV_NULL;
FormId:short;
Level:int;
Sex:SexType;
Tokusei:TokuseiType;
RareType:RareType;
ScaleType:SizeType;
ScaleValue:short;
TalentType:TalentType;
TalentVnum:byte;
TalentValue:ParamSet;
EffortValue:ParamSet;
Item:ItemID = ITEMID_NONE;
Seikaku:SeikakuType;
SeikakuHosei:SeikakuType;
WazaType:WazaType;
Waza1:WazaSet;
Waza2:WazaSet;
Waza3:WazaSet;
Waza4:WazaSet;
BallId:BallID;
UseNickName:bool;
NicknameLabel:ulong;
ParentSex:SexType;
}

View File

@@ -0,0 +1,41 @@
include "../Shared/DevID.fbs";
include "../Shared/SexType.fbs";
include "../Shared/ItemID.fbs";
include "../Shared/SeikakuType.fbs";
include "../Shared/TokuseiType.fbs";
include "../Shared/TalentType.fbs";
include "../Shared/RareType.fbs";
include "../Shared/SizeType.fbs";
include "../Shared/RibbonType.fbs";
include "../PokeData/WazaSet.fbs";
include "../Entity/ParamSet.fbs";
include "../Shared/WazaType.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
table PokeDataEventBattle {
DevId:DevID = DEV_NULL;
FormId:short;
Sex:SexType;
Level:int;
RareType:RareType;
TalentType:TalentType;
TalentVnum:byte;
TalentValue:ParamSet (required);
EffortValue:ParamSet (required);
Item:ItemID = ITEMID_NONE;
DropItem:ItemID = ITEMID_NONE;
DropItemNum:byte;
Seikaku:SeikakuType;
SeikakuHosei:SeikakuType;
Tokusei:TokuseiType;
WazaType:WazaType;
Waza1:WazaSet (required);
Waza2:WazaSet (required);
Waza3:WazaSet (required);
Waza4:WazaSet (required);
ScaleType:SizeType;
ScaleValue:short;
SetRibbon:RibbonType;
}

View File

@@ -0,0 +1,64 @@
include "../Shared/DevID.fbs";
include "../Shared/SexType.fbs";
include "../Shared/ItemID.fbs";
include "../Shared/SeikakuType.fbs";
include "../Shared/TokuseiType.fbs";
include "../Shared/TalentType.fbs";
include "../Shared/RareType.fbs";
include "../Shared/SizeType.fbs";
include "../Entity/ParamSet.fbs";
include "../Shared/LangType.fbs";
include "../Shared/BallID.fbs";
include "../Shared/RibbonType.fbs";
include "../Shared/PokeMemoType.fbs";
include "../Shared/WazaType.fbs";
include "../PokeData/WazaSet.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
table PokeDataFull {
DevId:DevID = DEV_NULL;
FormId:short;
Item:ItemID = ITEMID_NONE;
Level:int;
Sex:SexType;
Seikaku:SeikakuType;
SeikakuHosei:SeikakuType;
Tokusei:TokuseiType;
RareType:RareType;
RareTryCount:int;
TalentType:TalentType;
TalentValue:ParamSet;
TalentVnum:byte;
EffortValue:ParamSet;
Friendship:int;
ScaleType:SizeType;
ScaleValue:short;
SetPersonalRand:bool;
PersonalRand:ulong;
SetRandSeed:bool;
RandSeed:ulong;
WazaType:WazaType;
Waza1:WazaSet;
Waza2:WazaSet;
Waza3:WazaSet;
Waza4:WazaSet;
UseNickName:bool;
NicknameLabel:ulong;
ParentNameLabel:ulong;
ParentSex:SexType;
ParentLangId:LangType;
ParentMemoryCode:int;
ParentMemoryData:int;
ParentMemoryFeel:int;
ParentMemoryLevel:int;
LangId:LangType;
BallId:BallID;
SetRibbon:RibbonType;
EventFlg:bool;
WazaConfirmLevel:byte;
PokeMemo:PokeMemoType;
PokeMemoPlace:int;
TrainerId:long;
}

View File

@@ -0,0 +1,31 @@
include "../Shared/DevID.fbs";
include "../Shared/SexType.fbs";
include "../Shared/RareType.fbs";
include "../Shared/TalentType.fbs";
include "../Shared/TokuseiType.fbs";
include "../Shared/SizeType.fbs";
include "../PokeData/WazaSet.fbs";
include "../Entity/ParamSet.fbs";
include "../Shared/WazaType.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
table PokeDataSymbol {
DevId:DevID = DEV_NULL;
FormId:short;
Level:int;
Sex:SexType;
RareType:RareType;
TalentType:TalentType;
TalentValue:ParamSet (required);
TalentVNum:byte;
WazaType:WazaType;
Waza1:WazaSet (required);
Waza2:WazaSet (required);
Waza3:WazaSet (required);
Waza4:WazaSet (required);
TokuseiIndex:TokuseiType;
ScaleType:SizeType;
ScaleValue:short;
}

View File

@@ -0,0 +1,45 @@
include "../Shared/DevID.fbs";
include "../Shared/SexType.fbs";
include "../Shared/ItemID.fbs";
include "../Shared/SeikakuType.fbs";
include "../Shared/TokuseiType.fbs";
include "../Shared/TalentType.fbs";
include "../Shared/RareType.fbs";
include "../Shared/SizeType.fbs";
include "../Shared/BallID.fbs";
include "../Shared/RibbonType.fbs";
include "../Entity/ParamSet.fbs";
include "../PokeData/WazaSet.fbs";
include "../Shared/WazaType.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
table PokeDataTrade {
DevId:DevID = DEV_NULL;
FormId:short;
Level:int;
Sex:SexType;
Tokusei:TokuseiType;
RareType:RareType;
ScaleType:SizeType;
ScaleValue:short;
TalentType:TalentType;
TalentVnum:byte;
TalentValue:ParamSet;
EffortValue:ParamSet;
Item:ItemID = ITEMID_NONE;
Seikaku:SeikakuType;
SeikakuHosei:SeikakuType;
WazaType:WazaType;
Waza1:WazaSet;
Waza2:WazaSet;
Waza3:WazaSet;
Waza4:WazaSet;
BallId:BallID;
UseNickName:bool;
NicknameLabel:ulong;
ParentNameLabel:ulong;
TrainerId:long;
ParentSex:SexType;
}

View File

@@ -0,0 +1,9 @@
include "../Shared/WazaID.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
table WazaSet {
WazaId:WazaID;
PointUp:byte;
IsPlusWaza:bool;
}

View File

@@ -0,0 +1,8 @@
include "../Shared/WazaID.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
table WazaSetBattle {
WazaId:WazaID;
IsPlusWaza:bool;
}

View File

@@ -0,0 +1,9 @@
include "../Shared/ActivationConditionElement.fbs";
include "../Shared/TriggerCommand.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
table ActivationCondition {
Element:[ActivationConditionElement];
Triggers:[TriggerCommand];
}

View File

@@ -0,0 +1,7 @@
include "../Shared/ActivationConditionParam.fbs";
namespace pkNX.Structures.FlatBuffers.ZA;
table ActivationConditionElement {
Param:[ActivationConditionParam];
}

View File

@@ -0,0 +1,7 @@
namespace pkNX.Structures.FlatBuffers.ZA;
table ActivationConditionParam {
Condition:string (required);
Op:int;
Param:[string]; // not required; null instead of count:0
}

View File

@@ -0,0 +1,6 @@
namespace pkNX.Structures.FlatBuffers.ZA;
table AppearanceInfo {
MinCount:int;
MaxCount:int;
}

View File

@@ -0,0 +1,43 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum BallID : ubyte
{
BALL_NULL = 0,
MASUTAABOORU = 1,
HAIPAABOORU = 2,
SUUPAABOORU = 3,
MONSUTAABOORU = 4,
SAFARIBOORU = 5,
NETTOBOORU = 6,
DAIBUBOORU = 7,
NESUTOBOORU = 8,
RIPIITOBOORU = 9,
TAIMAABOORU = 10,
GOOZYASUBOORU = 11,
PUREMIABOORU = 12,
DAAKUBOORU = 13,
HIIRUBOORU = 14,
KUIKKUBOORU = 15,
PURESYASUBOORU = 16,
SUPIIDOBOORU = 17,
REBERUBOORU = 18,
RUAABOORU = 19,
HEBIIBOORU = 20,
RABURABUBOORU = 21,
HURENDOBOORU = 22,
MUUNBOORU = 23,
KONPEBOORU = 24,
DORIIMUBOORU = 25,
URUTORABOORU = 26,
SUTORENZIBOORU = 27,
MONSUTAABOORU_HA = 28,
SUUPAABOORU_HA = 29,
HAIPAABOORU_HA = 30,
HUHEZAABOORU = 31,
UINGUBOORU = 32,
ZIHETOBOORU = 33,
HEBIIBOORU_HA = 34,
MEGATONBOORU = 35,
GIGANTOBOORU = 36,
ORIZINBOORU = 37,
}

View File

@@ -0,0 +1,7 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum BattleType : int {
SINGLE = 0,
DOUBLE = 1,
MULTI = 2,
}

View File

@@ -0,0 +1,6 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum ClerkType : int {
CLERK = 0,
NO_CLERK = 1,
}

View File

@@ -0,0 +1,8 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum CondEnum : int {
NONE = 0,
SYSTEM_FLAG = 1,
SCENARIO = 2,
GYMBADGENUM = 3,
}

View File

@@ -0,0 +1,5 @@
namespace pkNX.Structures.FlatBuffers.ZA;
table CoolTimeInfo {
Time:float;
}

View File

@@ -0,0 +1,8 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum DataType : int {
NORMAL = 0,
ITEM = 1,
WAZA = 2,
MULTI = 3,
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,5 @@
namespace pkNX.Structures.FlatBuffers.ZA;
table HoldItem {
ItemId:int;
}

View File

@@ -0,0 +1,571 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum ItemID : int
{
ITEMID_NONE = 0,
ITEMID_MASUTAABOORU = 1,
ITEMID_HAIPAABOORU = 2,
ITEMID_SUUPAABOORU = 3,
ITEMID_MONSUTAABOORU = 4,
ITEMID_SAFARIBOORU = 5,
ITEMID_NETTOBOORU = 6,
ITEMID_DAIBUBOORU = 7,
ITEMID_NESUTOBOORU = 8,
ITEMID_RIPIITOBOORU = 9,
ITEMID_TAIMAABOORU = 10,
ITEMID_GOOZYASUBOORU = 11,
ITEMID_PUREMIABOORU = 12,
ITEMID_DAAKUBOORU = 13,
ITEMID_HIIRUBOORU = 14,
ITEMID_KUIKKUBOORU = 15,
ITEMID_PURESYASUBOORU = 16,
ITEMID_KIZUGUSURI = 17,
ITEMID_DOKUKESI = 18,
ITEMID_YAKEDONAOSI = 19,
ITEMID_KOORINAOSI = 20,
ITEMID_NEMUKEZAMASI = 21,
ITEMID_MAHINAOSI = 22,
ITEMID_KAIHUKUNOKUSURI = 23,
ITEMID_MANTANNOKUSURI = 24,
ITEMID_SUGOIKIZUGUSURI = 25,
ITEMID_IIKIZUGUSURI = 26,
ITEMID_NANDEMONAOSI = 27,
ITEMID_GENKINOKAKERA = 28,
ITEMID_GENKINOKATAMARI = 29,
ITEMID_OISIIMIZU = 30,
ITEMID_SAIKOSOODA = 31,
ITEMID_MIKKUSUORE = 32,
ITEMID_MOOMOOMIRUKU = 33,
ITEMID_MAKKUSUAPPU = 45,
ITEMID_TAURIN = 46,
ITEMID_BUROMUHEKISIN = 47,
ITEMID_INDOMETASIN = 48,
ITEMID_RIZOTIUMU = 49,
ITEMID_HUSIGINAAME = 50,
ITEMID_KITOSAN = 52,
ITEMID_EFEKUTOGAADO = 55,
ITEMID_KURITHIKATTO = 56,
ITEMID_PURASUPAWAA = 57,
ITEMID_DHIFENDAA = 58,
ITEMID_SUPIIDAA = 59,
ITEMID_YOKUATAARU = 60,
ITEMID_SUPESYARUAPPU = 61,
ITEMID_SUPESYARUGAADO = 62,
ITEMID_SIRUBAASUPUREE = 76,
ITEMID_GOORUDOSUPUREE = 77,
ITEMID_MUSIYOKESUPUREE = 79,
ITEMID_TAIYOUNOISI = 80,
ITEMID_TUKINOISI = 81,
ITEMID_HONOONOISI = 82,
ITEMID_KAMINARINOISI = 83,
ITEMID_MIZUNOISI = 84,
ITEMID_RIIHUNOISI = 85,
ITEMID_TIISANAKINOKO = 86,
ITEMID_SINZYU = 88,
ITEMID_OOKINASINZYU = 89,
ITEMID_KINNOTAMA = 92,
ITEMID_HIMITUNOKOHAKU = 103,
ITEMID_HIKARINOISI = 107,
ITEMID_YAMINOISI = 108,
ITEMID_MEZAMEISI = 109,
ITEMID_KURABONOMI = 149,
ITEMID_KAGONOMI = 150,
ITEMID_MOMONNOMI = 151,
ITEMID_TIIGONOMI = 152,
ITEMID_NANASINOMI = 153,
ITEMID_ORENNOMI = 155,
ITEMID_KIINOMI = 156,
ITEMID_RAMUNOMI = 157,
ITEMID_OBONNOMI = 158,
ITEMID_FIRANOMI = 159,
ITEMID_UINOMI = 160,
ITEMID_MAGONOMI = 161,
ITEMID_BANZINOMI = 162,
ITEMID_IANOMI = 163,
ITEMID_ZAROKUNOMI = 169,
ITEMID_NEKOBUNOMI = 170,
ITEMID_TAPORUNOMI = 171,
ITEMID_ROMENOMI = 172,
ITEMID_UBUNOMI = 173,
ITEMID_MATOMANOMI = 174,
ITEMID_OKKANOMI = 184,
ITEMID_ITOKENOMI = 185,
ITEMID_SOKUNONOMI = 186,
ITEMID_RINDONOMI = 187,
ITEMID_YATHENOMI = 188,
ITEMID_YOPUNOMI = 189,
ITEMID_BIAANOMI = 190,
ITEMID_SYUKANOMI = 191,
ITEMID_BAKOUNOMI = 192,
ITEMID_UTANNOMI = 193,
ITEMID_TANGANOMI = 194,
ITEMID_YOROGINOMI = 195,
ITEMID_KASIBUNOMI = 196,
ITEMID_HABANNOMI = 197,
ITEMID_NAMONOMI = 198,
ITEMID_RIRIBANOMI = 199,
ITEMID_HOZUNOMI = 200,
ITEMID_TIIRANOMI = 201,
ITEMID_RYUGANOMI = 202,
ITEMID_KAMURANOMI = 203,
ITEMID_YATAPINOMI = 204,
ITEMID_ZUANOMI = 205,
ITEMID_SANNOMI = 206,
ITEMID_SUTAANOMI = 207,
ITEMID_MIKURUNOMI = 209,
ITEMID_IBANNOMI = 210,
ITEMID_HIKARINOKONA = 213,
ITEMID_SIROIHAABU = 214,
ITEMID_SENSEINOTUME = 217,
ITEMID_YASURAGINOSUZU = 218,
ITEMID_MENTARUHAABU = 219,
ITEMID_KODAWARIHATIMAKI = 220,
ITEMID_OUZYANOSIRUSI = 221,
ITEMID_GINNOKONA = 222,
ITEMID_OMAMORIKOBAN = 223,
ITEMID_KOKORONOSIZUKU = 225,
ITEMID_KIAINOHATIMAKI = 230,
ITEMID_SIAWASETAMAGO = 231,
ITEMID_PINTORENZU = 232,
ITEMID_METARUKOOTO = 233,
ITEMID_TABENOKOSI = 234,
ITEMID_DENKIDAMA = 236,
ITEMID_YAWARAKAISUNA = 237,
ITEMID_KATAIISI = 238,
ITEMID_KISEKINOTANE = 239,
ITEMID_KUROIMEGANE = 240,
ITEMID_KUROOBI = 241,
ITEMID_ZISYAKU = 242,
ITEMID_SINPINOSIZUKU = 243,
ITEMID_SURUDOIKUTIBASI = 244,
ITEMID_DOKUBARI = 245,
ITEMID_TOKENAIKOORI = 246,
ITEMID_NOROINOOHUDA = 247,
ITEMID_MAGATTASUPUUN = 248,
ITEMID_MOKUTAN = 249,
ITEMID_RYUUNOKIBA = 250,
ITEMID_SIRUKUNOSUKAAHU = 251,
ITEMID_KAIGARANOSUZU = 253,
ITEMID_KOUKAKURENZU = 265,
ITEMID_TIKARANOHATIMAKI = 266,
ITEMID_MONOSIRIMEGANE = 267,
ITEMID_TATUZINNOOBI = 268,
ITEMID_INOTINOTAMA = 270,
ITEMID_PAWAHURUHAABU = 271,
ITEMID_KIAINOTASUKI = 275,
ITEMID_METORONOOMU = 277,
ITEMID_KUROITEKKYUU = 278,
ITEMID_KOUKOUNOSIPPO = 279,
ITEMID_AKAIITO = 280,
ITEMID_KUROIHEDORO = 281,
ITEMID_TUMETAIIWA = 282,
ITEMID_SARASARAIWA = 283,
ITEMID_ATUIIWA = 284,
ITEMID_SIMETTAIWA = 285,
ITEMID_NEBARINOKAGIDUME = 286,
ITEMID_KODAWARISUKAAHU = 287,
ITEMID_KUTTUKIBARI = 288,
ITEMID_PAWAARISUTO = 289,
ITEMID_PAWAABERUTO = 290,
ITEMID_PAWAARENZU = 291,
ITEMID_PAWAABANDO = 292,
ITEMID_PAWAAANKURU = 293,
ITEMID_PAWAAUEITO = 294,
ITEMID_KIREINANUKEGARA = 295,
ITEMID_OOKINANEKKO = 296,
ITEMID_KODAWARIMEGANE = 297,
ITEMID_WAZAMASIN01 = 328,
ITEMID_WAZAMASIN02 = 329,
ITEMID_WAZAMASIN03 = 330,
ITEMID_WAZAMASIN04 = 331,
ITEMID_WAZAMASIN05 = 332,
ITEMID_WAZAMASIN06 = 333,
ITEMID_WAZAMASIN07 = 334,
ITEMID_WAZAMASIN08 = 335,
ITEMID_WAZAMASIN09 = 336,
ITEMID_WAZAMASIN10 = 337,
ITEMID_WAZAMASIN11 = 338,
ITEMID_WAZAMASIN12 = 339,
ITEMID_WAZAMASIN13 = 340,
ITEMID_WAZAMASIN14 = 341,
ITEMID_WAZAMASIN15 = 342,
ITEMID_WAZAMASIN16 = 343,
ITEMID_WAZAMASIN17 = 344,
ITEMID_WAZAMASIN18 = 345,
ITEMID_WAZAMASIN19 = 346,
ITEMID_WAZAMASIN20 = 347,
ITEMID_WAZAMASIN21 = 348,
ITEMID_WAZAMASIN22 = 349,
ITEMID_WAZAMASIN23 = 350,
ITEMID_WAZAMASIN24 = 351,
ITEMID_WAZAMASIN25 = 352,
ITEMID_WAZAMASIN26 = 353,
ITEMID_WAZAMASIN27 = 354,
ITEMID_WAZAMASIN28 = 355,
ITEMID_WAZAMASIN29 = 356,
ITEMID_WAZAMASIN30 = 357,
ITEMID_WAZAMASIN31 = 358,
ITEMID_WAZAMASIN32 = 359,
ITEMID_WAZAMASIN33 = 360,
ITEMID_WAZAMASIN34 = 361,
ITEMID_WAZAMASIN35 = 362,
ITEMID_WAZAMASIN36 = 363,
ITEMID_WAZAMASIN37 = 364,
ITEMID_WAZAMASIN38 = 365,
ITEMID_WAZAMASIN39 = 366,
ITEMID_WAZAMASIN40 = 367,
ITEMID_WAZAMASIN41 = 368,
ITEMID_WAZAMASIN42 = 369,
ITEMID_WAZAMASIN43 = 370,
ITEMID_WAZAMASIN44 = 371,
ITEMID_WAZAMASIN45 = 372,
ITEMID_WAZAMASIN46 = 373,
ITEMID_WAZAMASIN47 = 374,
ITEMID_WAZAMASIN48 = 375,
ITEMID_WAZAMASIN49 = 376,
ITEMID_WAZAMASIN50 = 377,
ITEMID_WAZAMASIN51 = 378,
ITEMID_WAZAMASIN52 = 379,
ITEMID_WAZAMASIN53 = 380,
ITEMID_WAZAMASIN54 = 381,
ITEMID_WAZAMASIN55 = 382,
ITEMID_WAZAMASIN56 = 383,
ITEMID_WAZAMASIN57 = 384,
ITEMID_WAZAMASIN58 = 385,
ITEMID_WAZAMASIN59 = 386,
ITEMID_WAZAMASIN60 = 387,
ITEMID_WAZAMASIN61 = 388,
ITEMID_WAZAMASIN62 = 389,
ITEMID_WAZAMASIN63 = 390,
ITEMID_WAZAMASIN64 = 391,
ITEMID_WAZAMASIN65 = 392,
ITEMID_WAZAMASIN66 = 393,
ITEMID_WAZAMASIN67 = 394,
ITEMID_WAZAMASIN68 = 395,
ITEMID_WAZAMASIN69 = 396,
ITEMID_WAZAMASIN70 = 397,
ITEMID_WAZAMASIN71 = 398,
ITEMID_WAZAMASIN72 = 399,
ITEMID_WAZAMASIN73 = 400,
ITEMID_WAZAMASIN74 = 401,
ITEMID_WAZAMASIN75 = 402,
ITEMID_WAZAMASIN76 = 403,
ITEMID_WAZAMASIN77 = 404,
ITEMID_WAZAMASIN78 = 405,
ITEMID_WAZAMASIN79 = 406,
ITEMID_WAZAMASIN80 = 407,
ITEMID_WAZAMASIN81 = 408,
ITEMID_WAZAMASIN82 = 409,
ITEMID_WAZAMASIN83 = 410,
ITEMID_WAZAMASIN84 = 411,
ITEMID_WAZAMASIN85 = 412,
ITEMID_WAZAMASIN86 = 413,
ITEMID_WAZAMASIN87 = 414,
ITEMID_WAZAMASIN88 = 415,
ITEMID_WAZAMASIN89 = 416,
ITEMID_WAZAMASIN90 = 417,
ITEMID_WAZAMASIN91 = 418,
ITEMID_WAZAMASIN92 = 419,
ITEMID_SUPIIDOBOORU = 492,
ITEMID_REBERUBOORU = 493,
ITEMID_RUAABOORU = 494,
ITEMID_HEBIIBOORU = 495,
ITEMID_RABURABUBOORU = 496,
ITEMID_HURENDOBOORU = 497,
ITEMID_MUUNBOORU = 498,
ITEMID_KONPEBOORU = 499,
ITEMID_SINKANOKISEKI = 538,
ITEMID_KARUISI = 539,
ITEMID_GOTUGOTUMETTO = 540,
ITEMID_HUUSEN = 541,
ITEMID_REDDOKAADO = 542,
ITEMID_NERAINOMATO = 543,
ITEMID_SIMETUKEBANDO = 544,
ITEMID_KYUUKON = 545,
ITEMID_ZYUUDENTI = 546,
ITEMID_DASSYUTUBOTAN = 547,
ITEMID_NOOMARUZYUERU = 564,
ITEMID_TAIRYOKUNOHANE = 565,
ITEMID_KINRYOKUNOHANE = 566,
ITEMID_TEIKOUNOHANE = 567,
ITEMID_TIRYOKUNOHANE = 568,
ITEMID_SEISINNOHANE = 569,
ITEMID_SYUNPATUNOHANE = 570,
ITEMID_KIREINAHANE = 571,
ITEMID_DORIIMUBOORU = 576,
ITEMID_DEKAIKINNOTAMA = 581,
ITEMID_ODANGOSINZYU = 582,
ITEMID_WAZAMASIN93 = 618,
ITEMID_WAZAMASIN94 = 619,
ITEMID_WAZAMASIN95 = 620,
ITEMID_HIKARUOMAMORI = 632,
ITEMID_ZYAKUTENHOKEN = 639,
ITEMID_TOTUGEKITYOKKI = 640,
ITEMID_TOKUSEIKAPUSERU = 645,
ITEMID_HOIPPUPOPPU = 646,
ITEMID_NIOIBUKURO = 647,
ITEMID_HIKARIGOKE = 648,
ITEMID_YUKIDAMA = 649,
ITEMID_BOUZINGOOGURU = 650,
ITEMID_GENGANAITO = 656,
ITEMID_SAANAITONAITO = 657,
ITEMID_DENRYUUNAITO = 658,
ITEMID_HUSIGIBANAITO = 659,
ITEMID_RIZAADONAITOx = 660,
ITEMID_KAMEKKUSUNAITO = 661,
ITEMID_MYUUTUNAITOx = 662,
ITEMID_MYUUTUNAITOy = 663,
ITEMID_BASYAAMONAITO = 664,
ITEMID_TYAAREMUNAITO = 665,
ITEMID_HERUGANAITO = 666,
ITEMID_BOSUGODORANAITO = 667,
ITEMID_ZYUPETTANAITO = 668,
ITEMID_BANGIRASUNAITO = 669,
ITEMID_HASSAMUNAITO = 670,
ITEMID_KAIROSUNAITO = 671,
ITEMID_PUTERANAITO = 672,
ITEMID_RUKARIONAITO = 673,
ITEMID_YUKINOONAITO = 674,
ITEMID_GARUURANAITO = 675,
ITEMID_GYARADOSUNAITO = 676,
ITEMID_ABUSORUNAITO = 677,
ITEMID_RIZAADONAITOy = 678,
ITEMID_HUUDHINAITO = 679,
ITEMID_HERAKUROSUNAITO = 680,
ITEMID_KUTIITONAITO = 681,
ITEMID_RAIBORUTONAITO = 682,
ITEMID_GABURIASUNAITO = 683,
ITEMID_RATHIASUNAITO = 684,
ITEMID_RATHIOSUNAITO = 685,
ITEMID_ROZERUNOMI = 686,
ITEMID_WAZAMASIN96 = 690,
ITEMID_WAZAMASIN97 = 691,
ITEMID_WAZAMASIN98 = 692,
ITEMID_WAZAMASIN99 = 693,
ITEMID_EREBEETANOKII = 700,
ITEMID_MIAREGARETTO = 708,
ITEMID_AGONOKASEKI = 710,
ITEMID_HIRENOKASEKI = 711,
ITEMID_RAGURAAZINAITO = 752,
ITEMID_ZYUKAINNAITO = 753,
ITEMID_YAMIRAMINAITO = 754,
ITEMID_TIRUTARISUNAITO = 755,
ITEMID_ERUREIDONAITO = 756,
ITEMID_TABUNNENAITO = 757,
ITEMID_METAGUROSUNAITO = 758,
ITEMID_SAMEHADANAITO = 759,
ITEMID_YADORANNAITO = 760,
ITEMID_HAGANEERUNAITO = 761,
ITEMID_PIZYOTTONAITO = 762,
ITEMID_ONIGOORINAITO = 763,
ITEMID_DHIANSINAITO = 764,
ITEMID_IMASIMENOTUBO = 765,
ITEMID_BAKUUDANAITO = 767,
ITEMID_MIMIROPPUNAITO = 768,
ITEMID_BOOMANDANAITO = 769,
ITEMID_SUPIANAITO = 770,
ITEMID_GINNOOUKAN = 795,
ITEMID_KINNOOUKAN = 796,
ITEMID_BIBIRIDAMA = 846,
ITEMID_ZIGARUDEKYUUBU = 847,
ITEMID_KOORINOISI = 849,
ITEMID_URUTORABOORU = 851,
ITEMID_GURANDOKOOTO = 879,
ITEMID_BOUGOPATTO = 880,
ITEMID_EREKISIIDO = 881,
ITEMID_SAIKOSIIDO = 882,
ITEMID_MISUTOSIIDO = 883,
ITEMID_GURASUSIIDO = 884,
ITEMID_NODOAME = 1118,
ITEMID_DASSYUTUPAKKU = 1119,
ITEMID_ATUZOKOBUUTU = 1120,
ITEMID_KARABURIHOKEN = 1121,
ITEMID_RUUMUSAABISU = 1122,
ITEMID_BANNOUGASA = 1123,
ITEMID_KEIKENTIAME_1 = 1124,
ITEMID_KEIKENTIAME_2 = 1125,
ITEMID_KEIKENTIAME_3 = 1126,
ITEMID_KEIKENTIAME_4 = 1127,
ITEMID_KEIKENTIAME_5 = 1128,
ITEMID_SAMISIGARIMINTO = 1231,
ITEMID_IZIPPARIMINTO = 1232,
ITEMID_YANTYAMINTO = 1233,
ITEMID_YUKANMINTO = 1234,
ITEMID_ZUBUTOIMINTO = 1235,
ITEMID_WANPAKUMINTO = 1236,
ITEMID_NOUTENKIMINTO = 1237,
ITEMID_NONKIMINTO = 1238,
ITEMID_HIKAEMEMINTO = 1239,
ITEMID_OTTORIMINTO = 1240,
ITEMID_UKKARIMINTO = 1241,
ITEMID_REISEIMINTO = 1242,
ITEMID_ODAYAKAMINTO = 1243,
ITEMID_OTONASIIMINTO = 1244,
ITEMID_SINTYOUMINTO = 1245,
ITEMID_NAMAIKIMINTO = 1246,
ITEMID_OKUBYOUMINTO = 1247,
ITEMID_SEKKTIMINTO = 1248,
ITEMID_YOUKIMINTO = 1249,
ITEMID_MUJYAKIMINTO = 1250,
ITEMID_MAZIMEMINTO = 1251,
ITEMID_GARANATUBURESU = 1582,
ITEMID_AKASINOOMAMORI = 1589,
ITEMID_GARANATURIISU = 1592,
ITEMID_TOKUSEIPATTI = 1606,
ITEMID_SENTOUBAFFA1 = 1881,
ITEMID_SENTOUBAFFA2 = 1882,
ITEMID_SENTOUBAFFA3 = 1883,
ITEMID_SENTOUBAFFA4 = 1884,
ITEMID_SENTOUBAFFA5 = 1885,
ITEMID_SENTOUBAFFA6 = 1886,
ITEMID_WAZAMASIN100 = 2160,
ITEMID_WAZAMASIN101 = 2161,
ITEMID_WAZAMASIN102 = 2162,
ITEMID_WAZAMASIN103 = 2163,
ITEMID_WAZAMASIN104 = 2164,
ITEMID_WAZAMASIN105 = 2165,
ITEMID_WAZAMASIN106 = 2166,
ITEMID_WAZAMASIN107 = 2167,
ITEMID_WAZAMASIN108 = 2168,
ITEMID_WAZAMASIN109 = 2169,
ITEMID_WAZAMASIN110 = 2170,
ITEMID_WAZAMASIN111 = 2171,
ITEMID_WAZAMASIN112 = 2172,
ITEMID_WAZAMASIN113 = 2173,
ITEMID_WAZAMASIN114 = 2174,
ITEMID_WAZAMASIN115 = 2175,
ITEMID_WAZAMASIN116 = 2176,
ITEMID_WAZAMASIN117 = 2177,
ITEMID_WAZAMASIN118 = 2178,
ITEMID_WAZAMASIN119 = 2179,
ITEMID_WAZAMASIN120 = 2180,
ITEMID_WAZAMASIN121 = 2181,
ITEMID_WAZAMASIN122 = 2182,
ITEMID_WAZAMASIN123 = 2183,
ITEMID_WAZAMASIN124 = 2184,
ITEMID_WAZAMASIN125 = 2185,
ITEMID_WAZAMASIN126 = 2186,
ITEMID_WAZAMASIN127 = 2187,
ITEMID_WAZAMASIN128 = 2188,
ITEMID_WAZAMASIN129 = 2189,
ITEMID_WAZAMASIN130 = 2190,
ITEMID_WAZAMASIN131 = 2191,
ITEMID_WAZAMASIN132 = 2192,
ITEMID_WAZAMASIN133 = 2193,
ITEMID_WAZAMASIN134 = 2194,
ITEMID_WAZAMASIN135 = 2195,
ITEMID_WAZAMASIN136 = 2196,
ITEMID_WAZAMASIN137 = 2197,
ITEMID_WAZAMASIN138 = 2198,
ITEMID_WAZAMASIN139 = 2199,
ITEMID_WAZAMASIN140 = 2200,
ITEMID_WAZAMASIN141 = 2201,
ITEMID_WAZAMASIN142 = 2202,
ITEMID_WAZAMASIN143 = 2203,
ITEMID_WAZAMASIN144 = 2204,
ITEMID_WAZAMASIN145 = 2205,
ITEMID_WAZAMASIN146 = 2206,
ITEMID_WAZAMASIN147 = 2207,
ITEMID_WAZAMASIN148 = 2208,
ITEMID_WAZAMASIN149 = 2209,
ITEMID_WAZAMASIN150 = 2210,
ITEMID_WAZAMASIN151 = 2211,
ITEMID_WAZAMASIN152 = 2212,
ITEMID_WAZAMASIN153 = 2213,
ITEMID_WAZAMASIN154 = 2214,
ITEMID_WAZAMASIN155 = 2215,
ITEMID_WAZAMASIN156 = 2216,
ITEMID_WAZAMASIN157 = 2217,
ITEMID_WAZAMASIN158 = 2218,
ITEMID_WAZAMASIN159 = 2219,
ITEMID_WAZAMASIN160 = 2220,
ITEMID_WAZAMASIN161 = 2221,
ITEMID_WAZAMASIN162 = 2222,
ITEMID_WAZAMASIN163 = 2223,
ITEMID_WAZAMASIN164 = 2224,
ITEMID_WAZAMASIN165 = 2225,
ITEMID_WAZAMASIN166 = 2226,
ITEMID_WAZAMASIN167 = 2227,
ITEMID_WAZAMASIN168 = 2228,
ITEMID_WAZAMASIN169 = 2229,
ITEMID_WAZAMASIN170 = 2230,
ITEMID_WAZAMASIN171 = 2231,
ITEMID_YOUSEINOHANE = 2401,
ITEMID_KAIDENNOTANE = 2558,
ITEMID_PIKUSINAITO = 2559,
ITEMID_UTUBOTTONAITO = 2560,
ITEMID_STAAMIINAITO = 2561,
ITEMID_KAIRYUNAITO = 2562,
ITEMID_MEGANIUMUNAITO = 2563,
ITEMID_OODAIRUNAITO = 2564,
ITEMID_EAAMUDONAITO = 2565,
ITEMID_YUKIMENOKONAITO = 2566,
ITEMID_HIIDORANAITO = 2567,
ITEMID_DAAKURANAITO = 2568,
ITEMID_ENBUONAITO = 2569,
ITEMID_DORYUUZUNAITO = 2570,
ITEMID_PENDORANAITO = 2571,
ITEMID_ZURUZUKINAITO = 2572,
ITEMID_SIBIRUDONAITO = 2573,
ITEMID_SYANDERANAITO = 2574,
ITEMID_BURIGARONAITO = 2575,
ITEMID_MAFOKUSINAITO = 2576,
ITEMID_GEKKOUGANAITO = 2577,
ITEMID_KAENZISINAITO = 2578,
ITEMID_HURAETTENAITO = 2579,
ITEMID_KARAMANERONAITO = 2580,
ITEMID_GAMENODESUNAITO = 2581,
ITEMID_DORAMIDORONAITO = 2582,
ITEMID_RUTYABURUNAITO = 2583,
ITEMID_ZIGARUDENAITO = 2584,
ITEMID_ZIZIIRONAITO = 2585,
ITEMID_ZERAORANAITO = 2586,
ITEMID_TAIREETUNAITO = 2587,
ITEMID_202GOUSITUNOKAGI = 2588,
ITEMID_SUGOIMIAREGARETTO = 2589,
ITEMID_RABONOKAADOKIIA = 2590,
ITEMID_RABONOKAADOKIIB = 2591,
ITEMID_RABONOKAADOKIIC = 2592,
ITEMID_RABONOKAADOKIIM = 2593,
ITEMID_RABONOKAADOKIIX = 2594,
ITEMID_ISHIKORO = 2595,
ITEMID_OMOIDENOYUBIWA = 2596,
ITEMID_SAINIRINONUI = 2597,
ITEMID_OISHIIGOMI = 2598,
ITEMID_GENKINOKOEDA = 2599,
ITEMID_DEURONOWASUREMONO = 2600,
ITEMID_DAIZINAMONO14 = 2601,
ITEMID_DAIZINAMONO15 = 2602,
ITEMID_DAIZINAMONO16 = 2603,
ITEMID_DAIZINAMONO17 = 2604,
ITEMID_DAIZINAMONO18 = 2605,
ITEMID_DAIZINAMONO19 = 2606,
ITEMID_DAIZINAMONO20 = 2607,
ITEMID_DAIZINAMONO21 = 2608,
ITEMID_DAIZINAMONO22 = 2609,
ITEMID_DAIZINAMONO23 = 2610,
ITEMID_DAIZINAMONO24 = 2611,
ITEMID_DAIZINAMONO25 = 2612,
ITEMID_DAIZINAMONO26 = 2613,
ITEMID_DAIZINAMONO27 = 2614,
ITEMID_DAIZINAMONO28 = 2615,
ITEMID_DAIZINAMONO29 = 2616,
ITEMID_DAIZINAMONO30 = 2617,
ITEMID_MEGAKAKERA = 2618,
ITEMID_OMAMORISOZAI = 2619,
ITEMID_AKANOKANARYINUI1 = 2620,
ITEMID_AKANOKANARYINUI2 = 2621,
ITEMID_AKANOKANARYINUI3 = 2622,
ITEMID_KINNOKANARYINUI1 = 2623,
ITEMID_KINNOKANARYINUI2 = 2624,
ITEMID_KINNOKANARYINUI3 = 2625,
ITEMID_PINKUNOKANARYINUI1 = 2626,
ITEMID_PINKUNOKANARYINUI2 = 2627,
ITEMID_PINKUNOKANARYINUI3 = 2628,
ITEMID_MIDORINOKANARYINUI1 = 2629,
ITEMID_MIDORINOKANARYINUI2 = 2630,
ITEMID_MIDORINOKANARYINUI3 = 2631,
ITEMID_AONOKANARYINUI1 = 2632,
ITEMID_AONOKANARYINUI2 = 2633,
ITEMID_AONOKANARYINUI3 = 2634,
}

View File

@@ -0,0 +1,14 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum LangType : int {
ROM_LANG = 0,
JAPAN = 1,
ENGLISH = 2,
FRANCE = 3,
ITALY = 4,
GERMANY = 5,
SPAIN = 6,
KOREA = 7,
SIMPLIFIED_CHINESE = 8,
TRADITIONAL_CHINESE = 9,
}

View File

@@ -0,0 +1,11 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum MahoippuViewID : int {
STRAWBERRY = 0,
BERRY = 1,
HEART = 2,
STAR = 3,
CLOVER = 4,
FLOWER = 5,
RIBBON = 6,
}

View File

@@ -0,0 +1,23 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum MoveType : byte {
Normal = 0,
Kakutou = 1,
Hikou = 2,
Doku = 3,
Jimen = 4,
Iwa = 5,
Mushi = 6,
Ghost = 7,
Hagane = 8,
Honoo = 9,
Mizu = 10,
Kusa = 11,
Denki = 12,
Esper = 13,
Koori = 14,
Dragon = 15,
Aku = 16,
Fairy = 17,
Null = 18,
}

View File

@@ -0,0 +1,7 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum PayType : int {
OKOZUKAI = 0,
LP = 1,
BP = 2,
}

View File

@@ -0,0 +1,14 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum PokeMemoType : byte { NONE = 0,
Capture = 1,
EventGet = 2,
EventCapture = 3,
InnerTrade = 4,
NetTrade = 5,
EggHatch = 6,
Bank = 7,
MysteryGift = 8,
EggTakenFirst = 9,
EggTakenTrade = 10,
}

View File

@@ -0,0 +1,6 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum RareType : int { DEFAULT = 0,
NO_RARE = 1,
RARE = 2,
}

View File

@@ -0,0 +1,116 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum RibbonType : int
{ NONE = 0,
CAROS_CHAMP = 1,
HOUEN_CHAMP = 2,
SINOU_CHAMP = 3,
KAWAIGARI = 4,
TRAINING = 5,
SUPER_BATTLE = 6,
MASTER_BATTLE = 7,
GANBA = 8,
SYAKKIRI = 9,
DOKKIRI = 10,
SYONBORI = 11,
UKKARI = 12,
SUKKIRI = 13,
GUSSURI = 14,
NIKKORI = 15,
GORGEOUS = 16,
ROYAL = 17,
GORGEOUS_ROYAL = 18,
BROMIDE = 19,
ASHIATO = 20,
RECORD = 21,
LEGEND = 22,
COUNTRY = 23,
NATIONAL = 24,
EARTH = 25,
WORLD = 26,
CLASSIC = 27,
PREMIERE = 28,
EVENT = 29,
BIRTHDAY = 30,
SPECIAL = 31,
MEMORIAL = 32,
WISH = 33,
BATTLE_CHAMP = 34,
AREA_CHAMP = 35,
NATIONAL_CHAMP = 36,
WORLD_CHAMP = 37,
LUMPING_CONTEST = 38,
LUMPING_TOWER = 39,
SANGO_CHAMP = 40,
CONTEST_STAR = 41,
STYLE_MASTER = 42,
BEAUTIFUL_MASTER = 43,
CUTE_MASTER = 44,
CLEVER_MASTER = 45,
STRONG_MASTER = 46,
NIJI_CROWN = 47,
NIJI_ROYAL = 48,
NIJI_BTLTOWER = 49,
NIJI_MASTER = 50,
ORION_GARAL = 51,
ORION_MASTER_TOWER = 52,
ORION_MASTER_RANK = 53,
ORION_NOON = 54,
ORION_MIDNIGHT = 55,
ORION_TWILIGHT = 56,
ORION_DAYBREAK = 57,
ORION_CLOUDY_WEATHER = 58,
ORION_RAIN = 59,
ORION_THUNDER = 60,
ORION_SNOWFALL = 61,
ORION_HEAVY_SONWFALL = 62,
ORION_DRYING = 63,
ORION_SAND_DUST = 64,
ORION_DENSE_FOG = 65,
ORION_FATE = 66,
ORION_FISH = 67,
ORION_CURRY = 68,
ORION_SOMETIMES = 69,
ORION_NOTLOOKING = 70,
ORION_NAUGHTINESS = 71,
ORION_CAREFREE = 72,
ORION_TENSION = 73,
ORION_EXPECTATION = 74,
ORION_CHARISMA = 75,
ORION_CALM = 76,
ORION_PASSION = 77,
ORION_CARELESSNESS = 78,
ORION_EUPHORIA = 79,
ORION_FURY = 80,
ORION_SMILE = 81,
ORION_SAD = 82,
ORION_GOOD_CONDITION = 83,
ORION_EMERGENCY = 84,
ORION_REASON = 85,
ORION_INSTINCT = 86,
ORION_CUNNING = 87,
ORION_STRENGTH = 88,
ORION_WEAK = 89,
ORION_UPSET = 90,
ORION_ELEVATION = 91,
ORION_FATIGUE = 92,
ORION_CONFIDENCE = 93,
ORION_DISTRUST = 94,
ORION_ARTLESSNESS = 95,
ORION_IMPURITY = 96,
ORION_VIM = 97,
ORION_SLUMP = 98,
PIONEER = 99,
TWINKLE_STAR = 100,
TITAN_PALDEA_CHAMP = 101,
TITAN_HUGE = 102,
TITAN_TINY = 103,
TITAN_PICKING_UP_THINGS = 104,
TITAN_PARTNER = 105,
TITAN_GOURM = 106,
TITAN_ONE_CHANCE_IN_A_MILLION = 107,
TITAN_OYABUN = 108,
TITAN_STRONGEST = 109,
TITAN_NUSHI = 110,
SUDACHI_PARTNER = 111,
}

View File

@@ -0,0 +1,30 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum SeikakuType : int
{ DEFAULT = 0,
GANBARIYA = 1,
SAMISIGARIYA = 2,
YUUKAN = 3,
IJIPPARI = 4,
YANTYA = 5,
ZUBUTOI = 6,
SUNAO = 7,
NONKI = 8,
WANPAKU = 9,
NOUTENKI = 10,
OKUBYOU = 11,
SEKKATI = 12,
MAJIME = 13,
YOUKI = 14,
MUJYAKI = 15,
HIKAEME = 16,
OTTORI = 17,
REISEI = 18,
TEREYA = 19,
UKKARIYA = 20,
ODAYAKA = 21,
OTONASII = 22,
NAMAIKI = 23,
SINNTYOU = 24,
KIMAGURE = 25,
}

View File

@@ -0,0 +1,6 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum SellType : int {
SELL_BUY = 0,
BUY_ONLY = 1,
}

View File

@@ -0,0 +1,8 @@
namespace pkNX.Structures.FlatBuffers.ZA;
/// Actual Gender
enum Sex : int {
MALE = 0,
FEMALE = 1,
UNKNOWN = 2,
}

View File

@@ -0,0 +1,8 @@
namespace pkNX.Structures.FlatBuffers.ZA;
/// Gender Spec
enum SexType : int {
DEFAULT = 0,
MALE = 1,
FEMALE = 2,
}

View File

@@ -0,0 +1,22 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum ShopKind : int {
NONE = 0,
FRIENDLYSHOP = 1,
RESTAURANT = 2,
HAIRMAKE = 3,
WAZAMACHINEMACHINE = 4,
DRESSUP = 5,
LUXURYRESTAURANT = 6,
DELIBIRD = 7,
DELICATESSEN = 8,
DRUG_STORE = 9,
KANZUME = 10,
BAKERY = 11,
SUPERMARKET = 12,
KOUBAI = 13,
PICNIC = 14,
SYOUTEN = 15,
BBKOUBAI = 16,
BBZIHANKI = 17,
}

View File

@@ -0,0 +1,11 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum SizeType : int {
RANDOM = 0,
XS = 1,
S = 2,
M = 3,
L = 4,
XL = 5,
VALUE = 6,
}

View File

@@ -0,0 +1,7 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum TalentType : int {
RANDOM = 0,
V_NUM = 1,
VALUE = 2,
}

View File

@@ -0,0 +1,311 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum TokuseiID : ushort {
TOKUSEI_NULL = 0,
TOKUSEI_AKUSYUU = 1,
TOKUSEI_AMEHURASI = 2,
TOKUSEI_KASOKU = 3,
TOKUSEI_KABUTOAAMAA = 4,
TOKUSEI_GANZYOU = 5,
TOKUSEI_SIMERIKE = 6,
TOKUSEI_ZYUUNAN = 7,
TOKUSEI_SUNAGAKURE = 8,
TOKUSEI_SEIDENKI = 9,
TOKUSEI_TIKUDEN = 10,
TOKUSEI_TYOSUI = 11,
TOKUSEI_DONKAN = 12,
TOKUSEI_NOOTENKI = 13,
TOKUSEI_HUKUGAN = 14,
TOKUSEI_HUMIN = 15,
TOKUSEI_HENSYOKU = 16,
TOKUSEI_MENEKI = 17,
TOKUSEI_MORAIBI = 18,
TOKUSEI_RINPUN = 19,
TOKUSEI_MAIPEESU = 20,
TOKUSEI_KYUUBAN = 21,
TOKUSEI_IKAKU = 22,
TOKUSEI_KAGEHUMI = 23,
TOKUSEI_SAMEHADA = 24,
TOKUSEI_HUSIGINAMAMORI = 25,
TOKUSEI_HUYUU = 26,
TOKUSEI_HOUSI = 27,
TOKUSEI_SINKURO = 28,
TOKUSEI_KURIABODHI = 29,
TOKUSEI_SIZENKAIHUKU = 30,
TOKUSEI_HIRAISIN = 31,
TOKUSEI_TENNOMEGUMI = 32,
TOKUSEI_SUISUI = 33,
TOKUSEI_YOURYOKUSO = 34,
TOKUSEI_HAKKOU = 35,
TOKUSEI_TOREESU = 36,
TOKUSEI_TIKARAMOTI = 37,
TOKUSEI_DOKUNOTOGE = 38,
TOKUSEI_SEISINRYOKU = 39,
TOKUSEI_MAGUMANOYOROI = 40,
TOKUSEI_MIZUNOBEERU = 41,
TOKUSEI_ZIRYOKU = 42,
TOKUSEI_BOUON = 43,
TOKUSEI_AMEUKEZARA = 44,
TOKUSEI_SUNAOKOSI = 45,
TOKUSEI_PURESSYAA = 46,
TOKUSEI_ATUISIBOU = 47,
TOKUSEI_HAYAOKI = 48,
TOKUSEI_HONOONOKARADA = 49,
TOKUSEI_NIGEASI = 50,
TOKUSEI_SURUDOIME = 51,
TOKUSEI_KAIRIKIBASAMI = 52,
TOKUSEI_MONOHIROI = 53,
TOKUSEI_NAMAKE = 54,
TOKUSEI_HARIKIRI = 55,
TOKUSEI_MEROMEROBODHI = 56,
TOKUSEI_PURASU = 57,
TOKUSEI_MAINASU = 58,
TOKUSEI_TENKIYA = 59,
TOKUSEI_NENTYAKU = 60,
TOKUSEI_DAPPI = 61,
TOKUSEI_KONZYOU = 62,
TOKUSEI_HUSIGINAUROKO = 63,
TOKUSEI_HEDOROEKI = 64,
TOKUSEI_SINRYOKU = 65,
TOKUSEI_MOUKA = 66,
TOKUSEI_GEKIRYUU = 67,
TOKUSEI_MUSINOSIRASE = 68,
TOKUSEI_ISIATAMA = 69,
TOKUSEI_HIDERI = 70,
TOKUSEI_ARIZIGOKU = 71,
TOKUSEI_YARUKI = 72,
TOKUSEI_SIROIKEMURI = 73,
TOKUSEI_YOGAPAWAA = 74,
TOKUSEI_SHERUAAMAA = 75,
TOKUSEI_EAROKKU = 76,
TOKUSEI_TIDORIASI = 77,
TOKUSEI_DENKIENZIN = 78,
TOKUSEI_TOUSOUSIN = 79,
TOKUSEI_HUKUTUNOKOKORO = 80,
TOKUSEI_YUKIGAKURE = 81,
TOKUSEI_KUISINBOU = 82,
TOKUSEI_IKARINOTUBO = 83,
TOKUSEI_KARUWAZA = 84,
TOKUSEI_TAINETU = 85,
TOKUSEI_TANZYUN = 86,
TOKUSEI_KANSOUHADA = 87,
TOKUSEI_DAUNROODO = 88,
TOKUSEI_TETUNOKOBUSI = 89,
TOKUSEI_POIZUNHIIRU = 90,
TOKUSEI_TEKIOURYOKU = 91,
TOKUSEI_SUKIRURINKU = 92,
TOKUSEI_URUOIBODHI = 93,
TOKUSEI_SANPAWAA = 94,
TOKUSEI_HAYAASI = 95,
TOKUSEI_NOOMARUSUKIN = 96,
TOKUSEI_SUNAIPAA = 97,
TOKUSEI_MAZIKKUGAADO = 98,
TOKUSEI_NOOGAADO = 99,
TOKUSEI_ATODASI = 100,
TOKUSEI_TEKUNISYAN = 101,
TOKUSEI_RIIHUGAADO = 102,
TOKUSEI_BUKIYOU = 103,
TOKUSEI_KATAYABURI = 104,
TOKUSEI_KYOUUN = 105,
TOKUSEI_YUUBAKU = 106,
TOKUSEI_KIKENYOTI = 107,
TOKUSEI_YOTIMU = 108,
TOKUSEI_TENNEN = 109,
TOKUSEI_IROMEGANE = 110,
TOKUSEI_FIRUTAA = 111,
TOKUSEI_SUROOSUTAATO = 112,
TOKUSEI_KIMOTTAMA = 113,
TOKUSEI_YOBIMIZU = 114,
TOKUSEI_AISUBODHI = 115,
TOKUSEI_HAADOROKKU = 116,
TOKUSEI_YUKIHURASI = 117,
TOKUSEI_MITUATUME = 118,
TOKUSEI_OMITOOSI = 119,
TOKUSEI_SUTEMI = 120,
TOKUSEI_MARUTITAIPU = 121,
TOKUSEI_HURAWAAGIHUTO = 122,
TOKUSEI_NAITOMEA = 123,
TOKUSEI_WARUITEGUSE = 124,
TOKUSEI_TIKARAZUKU = 125,
TOKUSEI_AMANOZYAKU = 126,
TOKUSEI_KINTYOUKAN = 127,
TOKUSEI_MAKENKI = 128,
TOKUSEI_YOWAKI = 129,
TOKUSEI_NOROWAREBODHI = 130,
TOKUSEI_IYASINOKOKORO = 131,
TOKUSEI_HURENDOGAADO = 132,
TOKUSEI_KUDAKERUYOROI = 133,
TOKUSEI_HEVHIMETARU = 134,
TOKUSEI_RAITOMETARU = 135,
TOKUSEI_MARUTISUKEIRU = 136,
TOKUSEI_DOKUBOUSOU = 137,
TOKUSEI_NETUBOUSOU = 138,
TOKUSEI_SYUUKAKU = 139,
TOKUSEI_TEREPASII = 140,
TOKUSEI_MURAKKE = 141,
TOKUSEI_BOUZIN = 142,
TOKUSEI_DOKUSYU = 143,
TOKUSEI_SAISEIRYOKU = 144,
TOKUSEI_HATOMUNE = 145,
TOKUSEI_SUNAKAKI = 146,
TOKUSEI_MIRAKURUSUKIN = 147,
TOKUSEI_ANARAIZU = 148,
TOKUSEI_IRYUUZYON = 149,
TOKUSEI_KAWARIMONO = 150,
TOKUSEI_SURINUKE = 151,
TOKUSEI_MIIRA = 152,
TOKUSEI_ZISINKAZYOU = 153,
TOKUSEI_SEIGINOKOKORO = 154,
TOKUSEI_BIBIRI = 155,
TOKUSEI_MAZIKKUMIRAA = 156,
TOKUSEI_SOUSYOKU = 157,
TOKUSEI_ITAZURAGOKORO = 158,
TOKUSEI_SUNANOTIKARA = 159,
TOKUSEI_TETUNOTOGE = 160,
TOKUSEI_DARUMAMOODO = 161,
TOKUSEI_SYOURINOHOSI = 162,
TOKUSEI_TAABOBUREIZU = 163,
TOKUSEI_TERABORUTEEZI = 164,
TOKUSEI_AROMABEERU = 165,
TOKUSEI_HURAWAABEERU = 166,
TOKUSEI_HOOBUKURO = 167,
TOKUSEI_HENGENZIZAI = 168,
TOKUSEI_FAAKOOTO = 169,
TOKUSEI_MAZISYAN = 170,
TOKUSEI_BOUDAN = 171,
TOKUSEI_KATIKI = 172,
TOKUSEI_GANZYOUAGO = 173,
TOKUSEI_HURIIZUSUKIN = 174,
TOKUSEI_SUIITOBEERU = 175,
TOKUSEI_BATORUSUITTI = 176,
TOKUSEI_HAYATENOTUBASA = 177,
TOKUSEI_MEGARANTYAA = 178,
TOKUSEI_KUSANOKEGAWA = 179,
TOKUSEI_KYOUSEI = 180,
TOKUSEI_KATAITUME = 181,
TOKUSEI_FEARIISUKIN = 182,
TOKUSEI_NUMENUME = 183,
TOKUSEI_SUKAISUKIN = 184,
TOKUSEI_OYAKOAI = 185,
TOKUSEI_DAAKUOORA = 186,
TOKUSEI_FEARIIOORA = 187,
TOKUSEI_OORABUREIKU = 188,
TOKUSEI_HAZIMARINOUMI = 189,
TOKUSEI_OWARINODAITI = 190,
TOKUSEI_DERUTASUTORIIMU = 191,
TOKUSEI_ZIKYUURYOKU = 192,
TOKUSEI_NIGEGOSI = 193,
TOKUSEI_KIKIKAIHI = 194,
TOKUSEI_MIZUGATAME = 195,
TOKUSEI_HITODENASI = 196,
TOKUSEI_RIMITTOSIIRUDO = 197,
TOKUSEI_HARIKOMI = 198,
TOKUSEI_SUIHOU = 199,
TOKUSEI_HAGANETUKAI = 200,
TOKUSEI_GYAKUZYOU = 201,
TOKUSEI_YUKIKAKI = 202,
TOKUSEI_ENKAKU = 203,
TOKUSEI_URUOIBOISU = 204,
TOKUSEI_HIIRINGUSIHUTO = 205,
TOKUSEI_EREKISUKIN = 206,
TOKUSEI_SAAHUTEERU = 207,
TOKUSEI_GYOGUN = 208,
TOKUSEI_BAKENOKAWA = 209,
TOKUSEI_KIZUNAHENGE = 210,
TOKUSEI_SUWAAMUTHENZI = 211,
TOKUSEI_HUSYOKU = 212,
TOKUSEI_ZETTAINEMURI = 213,
TOKUSEI_ZYOOUNOIGEN = 214,
TOKUSEI_TOBIDASUNAKAMI = 215,
TOKUSEI_ODORIKO = 216,
TOKUSEI_BATTERII = 217,
TOKUSEI_MOHUMOHU = 218,
TOKUSEI_BIBIDDOBODHI = 219,
TOKUSEI_SOURUHAATO = 220,
TOKUSEI_KAARIIHEAA = 221,
TOKUSEI_RESIIBAA = 222,
TOKUSEI_KAGAKUNOTIKARA = 223,
TOKUSEI_BIISUTOBUUSUTO = 224,
TOKUSEI_arSISUTEMU = 225,
TOKUSEI_EREKIMEIKAA = 226,
TOKUSEI_SAIKOMEIKAA = 227,
TOKUSEI_MISUTOMEIKAA = 228,
TOKUSEI_GURASUMEIKAA = 229,
TOKUSEI_METARUPUROTEKUTO = 230,
TOKUSEI_FANTOMUGAADO = 231,
TOKUSEI_PURIZUMUAAMAA = 232,
TOKUSEI_BUREINFOOSU = 233,
TOKUSEI_HUTOUNOTURUGI = 234,
TOKUSEI_HUKUTUNOTATE = 235,
TOKUSEI_RIBERO = 236,
TOKUSEI_TAMAHIROI = 237,
TOKUSEI_WATAGE = 238,
TOKUSEI_SUKURYUUOBIRE = 239,
TOKUSEI_MIRAAAAMAA = 240,
TOKUSEI_UNOMISAIRU = 241,
TOKUSEI_SUZIGANEIRI = 242,
TOKUSEI_ZYOUKIKIKAN = 243,
TOKUSEI_PANKUROKKU = 244,
TOKUSEI_SUNAHAKI = 245,
TOKUSEI_KOORINORINPUN = 246,
TOKUSEI_ZYUKUSEI = 247,
TOKUSEI_AISUFEISU = 248,
TOKUSEI_PAWAASUPOTTO = 249,
TOKUSEI_GITAI = 250,
TOKUSEI_BARIAHURII = 251,
TOKUSEI_HAGANENOSEISIN = 252,
TOKUSEI_HOROBINOBODHI = 253,
TOKUSEI_SAMAYOUTAMASII = 254,
TOKUSEI_GORIMUTYUU = 255,
TOKUSEI_KAGAKUHENKAGASU = 256,
TOKUSEI_PASUTERUBEERU = 257,
TOKUSEI_HARAPEKOSUITTI = 258,
TOKUSEI_KUIKKUDOROU = 259,
TOKUSEI_HUKASINOKOBUSI = 260,
TOKUSEI_KIMYOUNAKUSURI = 261,
TOKUSEI_TORANZISUTA = 262,
TOKUSEI_RYUUNOAGITO = 263,
TOKUSEI_SIRONOINANAKI = 264,
TOKUSEI_KURONOINANAKI = 265,
TOKUSEI_ZINBAITTAISIRO = 266,
TOKUSEI_ZINBAITTAIKURO = 267,
TOKUSEI_TORENAINIOI = 268,
TOKUSEI_KOBOREDANE = 269,
TOKUSEI_NETUKOUKAN = 270,
TOKUSEI_IKARINOKOURA = 271,
TOKUSEI_KIYOMENOSIO = 272,
TOKUSEI_KONGARIBODHI = 273,
TOKUSEI_KAZENORI = 274,
TOKUSEI_BANKEN = 275,
TOKUSEI_IWAHAKOBI = 276,
TOKUSEI_HUURYOKUDENKI = 277,
TOKUSEI_MAITHITHENZI = 278,
TOKUSEI_SIREITOU = 279,
TOKUSEI_DENKINIKAERU = 280,
TOKUSEI_KODAIKASSEI = 281,
TOKUSEI_KWOOKUTYAAZI = 282,
TOKUSEI_OUGONNOKARADA = 283,
TOKUSEI_WAZAWAINOUTUWA = 284,
TOKUSEI_WAZAWAINOTURUGI = 285,
TOKUSEI_WAZAWAINOOHUDA = 286,
TOKUSEI_WAZAWAINOTAMA = 287,
TOKUSEI_HIHIIRONOKODOU = 288,
TOKUSEI_HADORONENZIN = 289,
TOKUSEI_BINZYOU = 290,
TOKUSEI_HANSUU = 291,
TOKUSEI_KIREAZI = 292,
TOKUSEI_SOUDAISYOU = 293,
TOKUSEI_KYOUEN = 294,
TOKUSEI_DOKUGESYOU = 295,
TOKUSEI_TEIRUAAMAA = 296,
TOKUSEI_DOSYOKU = 297,
TOKUSEI_KINSINOTIKARA = 298,
TOKUSEI_MOTENASHINOKOKORO = 299,
TOKUSEI_HISUINOHITOMI = 300,
TOKUSEI_KAMENNOSHINKAMIDORI = 301,
TOKUSEI_KAMENNOSHINKAKAMADO = 302,
TOKUSEI_KAMENNOSHINKAIDO = 303,
TOKUSEI_KAMENNOOSHINKAISHIZUE = 304,
TOKUSEI_KUSARIEN = 305,
TOKUSEI_KANRONAMITUAME = 306,
}

View File

@@ -0,0 +1,9 @@
namespace pkNX.Structures.FlatBuffers.ZA;
enum TokuseiType : int {
RANDOM_12 = 0,
RANDOM_123 = 1,
SET_1 = 2,
SET_2 = 3,
SET_3 = 4,
}

Some files were not shown because too many files have changed in this diff Show More