From e376d6d664a88b2cc404d1728d5d66abb98839d8 Mon Sep 17 00:00:00 2001 From: Haven1433 Date: Sun, 11 Sep 2022 14:04:07 -0500 Subject: [PATCH] Write a serialize routine for ModelTable Lets you do stuff like table['data.pokemon.moves.levelup'][4].Serialize('movesFromLevel') --- src/HexManiac.Core/Models/ModelTable.cs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/HexManiac.Core/Models/ModelTable.cs b/src/HexManiac.Core/Models/ModelTable.cs index 0cf1ebe0..d8e5d96d 100644 --- a/src/HexManiac.Core/Models/ModelTable.cs +++ b/src/HexManiac.Core/Models/ModelTable.cs @@ -86,6 +86,26 @@ namespace HavenSoft.HexManiac.Core.Models { } } + public string Serialize(string fieldName) { + var elementOffset = table.ElementContent.Until(segment => segment.Name == fieldName).Sum(segment => segment.Length); + var valueAddress = table.Start + table.ElementLength * arrayIndex + elementOffset; + var seg = table.ElementContent.Single(segment => segment.Name == fieldName); + if (seg.Type == ElementContentType.Pointer) { + var destination = model.ReadPointer(valueAddress); + if (destination == Pointer.NULL) return "null"; + var run = model.GetNextRun(destination); + if (run is ArrayRun tRun) { + run = new TableStreamRun(model, run.Start, run.PointerSources, run.FormatString, + tRun.ElementContent, new FixedLengthStreamStrategy(tRun.ElementCount)); + } + if (run is IStreamRun sRun) return sRun.SerializeRun(); + return destination.ToAddress(); + } + if (seg.Type == ElementContentType.PCS) return GetStringValue(fieldName); + if (seg is ArrayRunEnumSegment) return GetEnumValue(fieldName); + return GetValue(fieldName).ToString(); + } + public int[,] GetSprite(string fieldName) { var elementOffset = table.ElementContent.Until(segment => segment.Name == fieldName).Sum(segment => segment.Length); var valueAddress = table.Start + table.ElementLength * arrayIndex + elementOffset;