Allow adding entries to SymbolBehave

This commit is contained in:
Jelle
2022-10-13 14:15:30 +02:00
parent 6498f3c8eb
commit 95b0b70d4d
7 changed files with 75 additions and 29 deletions

View File

@@ -7,6 +7,7 @@ public class PokeEditor8a : IDataEditor
{
public IPersonalTable Personal { get; set; }
public TableCache<PokeMiscTable8a, PokeMisc8a> PokeMisc { get; set; }
public TableCache<PokeAIArchive8a, PokeAI8a> SymbolBehave { get; set; }
public TableCache<EvolutionTable8, EvolutionSet8a> Evolve { get; set; }
public TableCache<Learnset8a, Learnset8aMeta> Learn { get; set; }
public TableCache<PokeDropItemArchive8a, PokeDropItem8a> FieldDropTables { get; set; }
@@ -21,6 +22,7 @@ public void Save()
{
Personal.Save();
PokeMisc.Save();
SymbolBehave.Save();
Learn.Save();
Evolve.Save();
FieldDropTables.Save();

View File

@@ -1,4 +1,4 @@
using pkNX.Structures;
using pkNX.Structures;
using pkNX.Structures.FlatBuffers;
namespace pkNX.Game;
@@ -7,6 +7,7 @@ public class GameData8a
{
public IPersonalTable PersonalData { get; internal set; }
public TableCache<PokeMiscTable8a, PokeMisc8a> PokeMiscData { get; internal set; }
public TableCache<PokeAIArchive8a, PokeAI8a> SymbolBehaveData { get; internal set; }
public DataCache<Waza8a> MoveData { get; internal set; }
public TableCache<EvolutionTable8, EvolutionSet8a> EvolutionData { get; internal set; }

View File

@@ -51,6 +51,7 @@ private void ResetData()
// Single Files
PersonalData = new PersonalTable8LA(GetFile(GameFile.PersonalStats)),
PokeMiscData = new(GetFile(GameFile.PokeMisc)),
SymbolBehaveData = new(GetFile(GameFile.SymbolBehave)),
LevelUpData = new(GetFile(GameFile.Learnsets)),
EvolutionData = new(GetFile(GameFile.Evolutions)),

View File

@@ -1,5 +1,7 @@
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using FlatSharp.Attributes;
// ReSharper disable UnusedAutoPropertyAccessor.Global
@@ -17,6 +19,30 @@ public class PokeAIArchive8a : IFlatBufferArchive<PokeAI8a>
public byte[] Write() => FlatBufferConverter.SerializeFrom(this);
[FlatBufferItem(0)] public PokeAI8a[] Table { get; set; } = Array.Empty<PokeAI8a>();
public PokeAI8a GetEntry(ushort species, ushort form)
{
return Table.FirstOrDefault(z => z.Species == species && z.Form == form) ??
new PokeAI8a { };
}
public bool HasEntry(ushort species, ushort form, bool isAlpha)
{
return Table.Any(x => x.Species == species && x.Form == form && x.IsAlpha == isAlpha);
}
public PokeAI8a AddEntry(ushort species, ushort form, bool isAlpha)
{
Debug.Assert(!HasEntry(species, form, isAlpha), "The symbol behave table already contains an entry for the same species + form!");
var entry = new PokeAI8a { Species = species, Form = form, IsAlpha = isAlpha };
Table = Table.Append(entry)
.OrderBy(x => x.Species)
.ThenBy(x => x.Form)
.ThenBy(x => x.IsAlpha)
.ToArray();
return entry;
}
}
[FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))]
@@ -29,16 +55,16 @@ public class PokeAI8a
[FlatBufferItem(04)] public string Behavior2 { get; set; } = string.Empty;
[FlatBufferItem(05)] public string Behavior3 { get; set; } = string.Empty;
[FlatBufferItem(06)] public bool Field_06 { get; set; } // bool
[FlatBufferItem(07)] public ulong Field_07 { get; set; } // ulong
[FlatBufferItem(08)] public bool Field_08 { get; set; } // bool, always true
[FlatBufferItem(07)] public ulong Field_07 { get; set; } // ulong 2458747221614355867
[FlatBufferItem(08)] public bool Field_08 { get; set; } = true; // bool, always true
[FlatBufferItem(09)] public PokeAI8a_F09 Field_09 { get; set; } = new();
[FlatBufferItem(10)] public bool Field_10 { get; set; } // bool, always true
[FlatBufferItem(10)] public bool Field_10 { get; set; } = true; // bool, always true
[FlatBufferItem(11)] public PokeAI8a_F09 Field_11 { get; set; } = new();
[FlatBufferItem(12)] public bool Field_12 { get; set; } // bool, always true except for Darkrai
[FlatBufferItem(12)] public bool Field_12 { get; set; } = true; // bool, always true except for Darkrai
[FlatBufferItem(13)] public PokeAI8a_F09 Field_13 { get; set; } = new();
[FlatBufferItem(14)] public bool Field_14 { get; set; } // bool, always true
[FlatBufferItem(14)] public bool Field_14 { get; set; } = true; // bool, always true
[FlatBufferItem(15)] public PokeAI8a_F09 Field_15 { get; set; } = new();
[FlatBufferItem(16)] public bool Field_16 { get; set; } // bool, always true
[FlatBufferItem(16)] public bool Field_16 { get; set; } = true; // bool, always true
[FlatBufferItem(17)] public PokeAI8a_F09 Field_17 { get; set; } = new();
[FlatBufferItem(18)] public PokeAI8a_F18 Field_18 { get; set; } = new(); // only used by Kleavor-1
[FlatBufferItem(19)] public PokeAI8a_F18 Field_19 { get; set; } = new(); // assumed same as above, none use
@@ -47,14 +73,14 @@ public class PokeAI8a
[FlatBufferItem(22)] public string MoveEffect1 { get; set; } = string.Empty;
[FlatBufferItem(23)] public string MoveEffect2 { get; set; } = string.Empty;
[FlatBufferItem(24)] public PokeAI8a_F24 Field_24 { get; set; } = new();
[FlatBufferItem(25)] public float Field_25 { get; set; } // float
[FlatBufferItem(26)] public float Field_26 { get; set; } // float
[FlatBufferItem(27)] public PlacementV3f8a Field_27 { get; set; } = new();
[FlatBufferItem(28)] public PlacementV3f8a Field_28 { get; set; } = new();
[FlatBufferItem(29)] public PlacementV3f8a Field_29 { get; set; } = new();
[FlatBufferItem(30)] public PlacementV3f8a Field_30 { get; set; } = new();
[FlatBufferItem(25)] public float Field_25 { get; set; } = 20; // float
[FlatBufferItem(26)] public float Field_26 { get; set; } = 30; // float
[FlatBufferItem(27)] public PlacementV3f8a Field_27 { get; set; } = new(20, 50, 100);
[FlatBufferItem(28)] public PlacementV3f8a Field_28 { get; set; } = new(20, 50, 100);
[FlatBufferItem(29)] public PlacementV3f8a Field_29 { get; set; } = new(20, 50, 100);
[FlatBufferItem(30)] public PlacementV3f8a Field_30 { get; set; } = new(15, 10, 15);
[FlatBufferItem(31)] public int Field_31 { get; set; } // int
[FlatBufferItem(32)] public int Field_32 { get; set; } // int
[FlatBufferItem(32)] public int Field_32 { get; set; } = -1;// int
[FlatBufferItem(33)] public int Field_33 { get; set; } // int
[FlatBufferItem(34)] public float Field_34 { get; set; } // cascoon/silcoon
}
@@ -62,7 +88,7 @@ public class PokeAI8a
[FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))]
public class PokeAI8a_F24
{
[FlatBufferItem(00)] public float Field_00 { get; set; }
[FlatBufferItem(00)] public float Field_00 { get; set; } = 7;
}
[FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))]
@@ -78,20 +104,26 @@ public class PokeAI8a_F18
[FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))]
public class PokeAI8a_F09
{
[FlatBufferItem(00)] public PokeAI8_F08 Field_00 { get; set; } = new();
[FlatBufferItem(01)] public PokeAI8_F08 Field_01 { get; set; } = new();
[FlatBufferItem(02)] public PokeAI8_F08 Field_02 { get; set; } = new();
[FlatBufferItem(03)] public PokeAI8_F08 Field_03 { get; set; } = new();
[FlatBufferItem(04)] public PokeAI8_F08 Field_04 { get; set; } = new();
[FlatBufferItem(05)] public PokeAI8_F08 Field_05 { get; set; } = new();
[FlatBufferItem(06)] public PokeAI8_F08 Field_06 { get; set; } = new();
[FlatBufferItem(07)] public PokeAI8_F08 Field_07 { get; set; } = new();
[FlatBufferItem(08)] public PokeAI8_F08 Field_08 { get; set; } = new();
[FlatBufferItem(00)] public PokeAIBehaviour Field_00 { get; set; } = new();
[FlatBufferItem(01)] public PokeAIBehaviour Field_01 { get; set; } = new();
[FlatBufferItem(02)] public PokeAIBehaviour Field_02 { get; set; } = new();
[FlatBufferItem(03)] public PokeAIBehaviour Field_03 { get; set; } = new();
[FlatBufferItem(04)] public PokeAIBehaviour Field_04 { get; set; } = new PokeAIBehaviour { Hash = 1234775724179408742, Parameters = new string[] { "3", "5", "60", "90", "4", "run", "Normal" } };
[FlatBufferItem(05)] public PokeAIBehaviour Field_05 { get; set; } = new();
[FlatBufferItem(06)] public PokeAIBehaviour Field_06 { get; set; } = new();
[FlatBufferItem(07)] public PokeAIBehaviour Field_07 { get; set; } = new();
[FlatBufferItem(08)] public PokeAIBehaviour Field_08 { get; set; } = new();
}
[FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))]
public class PokeAI8_F08
public class PokeAIBehaviour
{
[FlatBufferItem(00)] public ulong Hash { get; set; }
[FlatBufferItem(01)] public string[] Field_01 { get; set; } = Array.Empty<string>();
// Hash 9252365659083253459 = new string[] { "0.2", "35" };
// Hash 17205188591700921149 = new string[] { "10", "3", "run", "Normal" };
// Hash 17205188591700921149 = new string[] { "10", "0.5", "run", "Normal" };
// Hash 1234775724179408742 = new string[] { "3", "5", "60", "90", "4", "run", "Normal" };
[FlatBufferItem(00)] public ulong Hash { get; set; } = 9252365659083253459;
[FlatBufferItem(01)] public string[] Parameters { get; set; } = new string[] { "0.2", "35" };
}

View File

@@ -36,7 +36,10 @@ public PokeMisc8a AddEntry(ushort species, ushort form)
Debug.Assert(!HasEntry(species, form), "The misc table already contains an entry for the same species + form!");
var entry = new PokeMisc8a { Species = species, Form = form };
Table = Table.Append(entry);
Table = Table.Append(entry)
.OrderBy(x => x.Species)
.ThenBy(x => x.Form)
.ToArray();
return entry;
}
}

View File

@@ -141,6 +141,7 @@ public void EditPokemon()
{
Personal = Data.PersonalData,
PokeMisc = Data.PokeMiscData,
SymbolBehave = Data.SymbolBehaveData,
Evolve = Data.EvolutionData,
Learn = Data.LevelUpData,
FieldDropTables = Data.FieldDrops,
@@ -166,7 +167,7 @@ public void EditMiscSpeciesInfo()
public void EditSymbolBehave()
{
var names = ROM.GetStrings(TextName.SpeciesNames);
PopFlat<PokeAIArchive8a, PokeAI8a>(GameFile.SymbolBehave, "Symbol Behavior Editor", z => $"{names[z.Species]}{(z.Form != 0 ? $"-{z.Form}" : "")}");
PopFlat<PokeAIArchive8a, PokeAI8a>(GameFile.SymbolBehave, "Symbol Behavior Editor", z => $"{names[z.Species]}{(z.IsAlpha ? "*" : "")}{(z.Form != 0 ? $"-{z.Form}" : "")}");
}
[EditorCallable(EditorCategory.Pokemon)]

View File

@@ -846,6 +846,12 @@ private void CHK_IsPresentInGame_CheckedChanged(object sender, EventArgs e)
// Reload entry with correct misc data
LoadMisc(entry);
}
if (!Editor.SymbolBehave.Root.HasEntry(cPersonal.DexIndexNational, cPersonal.Form, false))
{
Editor.SymbolBehave.Root.AddEntry(cPersonal.DexIndexNational, cPersonal.Form, false);
Editor.SymbolBehave.Root.AddEntry(cPersonal.DexIndexNational, cPersonal.Form, true);
}
}
}