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; var seg = table.ElementContent.Single(segment => segment.Name == fieldName); if (seg is ArrayRunPointerSegment pointerSeg) { var destination = model.ReadPointer(valueAddress); if (model.GetNextRun(destination) is not ISpriteRun spriteRun) { IFormattedRun tempRun = new NoInfoRun(destination, new SortedSpan <int>(valueAddress)); model.FormatRunFactory.GetStrategy(pointerSeg.InnerFormat).TryParseData(model, string.Empty, destination, ref tempRun); spriteRun = tempRun as ISpriteRun; if (spriteRun == null) { return(null); } } return(spriteRun.GetPixels(model, 0)); } else { throw new NotImplementedException(); } }
public override void UpdateNewRunFromPointerFormat(IDataModel model, ModelDelta token, string name, IReadOnlyList <ArrayRunElementSegment> sourceSegments, int parentIndex, ref IFormattedRun run) { run = new OverworldSpriteListRun(model, sourceSegments, Hint, parentIndex, run.Start, run.PointerSources); // backup: we may get asked to make a pointer format even when it's not an overworld sprite list. // if that happens, fall back to a NoInfoRun. if (run.Length == 0) { run = new NoInfoRun(run.Start, run.PointerSources); } }
public override bool TryAddFormatAtDestination(IDataModel owner, ModelDelta token, int source, int destination, string name, IReadOnlyList <ArrayRunElementSegment> sourceSegments, int parentIndex) { IFormattedRun run = new NoInfoRun(destination, SortedSpan.One(source)); var result = TryParseData(owner, default, default, ref run);