Beispiel #1
0
        public override void UpdateNewRunFromPointerFormat(IDataModel model, ModelDelta token, string name, IReadOnlyList <ArrayRunElementSegment> sourceSegments, int parentIndex, ref IFormattedRun run)
        {
            var newRun = new TilemapRun(model, run.Start, format, run.PointerSources);

            model.ClearFormat(token, newRun.Start, newRun.Length);
            run = newRun;
        }
Beispiel #2
0
        public override void UpdateNewRunFromPointerFormat(IDataModel model, ModelDelta token, string name, ref IFormattedRun run)
        {
            var runAttempt = new TrainerPokemonTeamRun(model, run.Start, run.PointerSources);

            model.ClearFormat(token, run.Start, runAttempt.Length);
            run = runAttempt;
        }
Beispiel #3
0
        public override void UpdateNewRunFromPointerFormat(IDataModel model, ModelDelta token, string name, IReadOnlyList <ArrayRunElementSegment> sourceSegments, int parentIndex, ref IFormattedRun run)
        {
            var runAttempt = new TrainerPokemonTeamRun(model, run.Start, run.PointerSources);

            model.ClearFormat(token, run.Start, runAttempt.Length);
            run = runAttempt;
        }
Beispiel #4
0
 public override void UpdateNewRunFromPointerFormat(IDataModel model, ModelDelta token, string name, ref IFormattedRun run)
 {
     if (!TableStreamRun.TryParseTableStream(model, run.Start, run.PointerSources, name, Format, null, out var runAttempt))
     {
         return;
     }
     model.ClearFormat(token, run.Start, runAttempt.Length);
     run = runAttempt;
 }
 public override void UpdateNewRunFromPointerFormat(IDataModel model, ModelDelta token, string name, IReadOnlyList <ArrayRunElementSegment> sourceSegments, int parentIndex, ref IFormattedRun run)
 {
     if (!TableStreamRun.TryParseTableStream(model, run.Start, run.PointerSources, name, Format, null, out var runAttempt))
     {
         return;
     }
     model.ClearFormat(token, run.Start, runAttempt.Length);
     run = runAttempt;
 }
Beispiel #6
0
        public override void UpdateNewRunFromPointerFormat(IDataModel model, ModelDelta token, string name, IReadOnlyList <ArrayRunElementSegment> sourceSegments, int parentIndex, ref IFormattedRun run)
        {
            var runAttempt = new PLMRun(model, run.Start);

            if (runAttempt.Length > 0)
            {
                run = runAttempt.MergeAnchor(run.PointerSources);
                model.ClearFormat(token, run.Start, run.Length);
            }
        }
Beispiel #7
0
        public override bool TryAddFormatAtDestination(IDataModel owner, ModelDelta token, int source, int destination, string name, IReadOnlyList <ArrayRunElementSegment> sourceSegments, int parentIndex)
        {
            var run = new ASERun(destination, new SortedSpan <int>(source));

            if (run.Length < 1)
            {
                return(false);
            }
            owner.ClearFormat(token, run.Start, run.Length);
            owner.ObserveRunWritten(token, run);
            return(true);
        }
Beispiel #8
0
        public override void UpdateNewRunFromPointerFormat(IDataModel model, ModelDelta token, string name, ref IFormattedRun run)
        {
            var length = PCSString.ReadString(model, run.Start, true);

            if (length > 0)
            {
                var newRun = new PCSRun(model, run.Start, length, run.PointerSources);
                if (!newRun.Equals(run))
                {
                    model.ClearFormat(token, newRun.Start, newRun.Length);
                }
                run = newRun;
            }
        }
Beispiel #9
0
        public override void UpdateNewRunFromPointerFormat(IDataModel model, ModelDelta token, string name, IReadOnlyList <ArrayRunElementSegment> sourceSegments, int parentIndex, ref IFormattedRun run)
        {
            var length = PCSString.ReadString(model, run.Start, true);

            if (length > 0)
            {
                var newRun = new PCSRun(model, run.Start, length, run.PointerSources);
                if (!newRun.Equals(run))
                {
                    model.ClearFormat(token, newRun.Start, newRun.Length);
                }
                run = newRun;
            }
        }
        public TableStreamRun UpdateFromParentStream(TableStreamRun run, ModelDelta token, int parentSegmentIndex)
        {
            var parentAddress = GetParentIndex(run.PointerSources);
            var parent        = model.GetNextRun(parentAddress) as ITableRun;

            if (parent == null)
            {
                return(run);
            }
            var segmentIndex = GetSegmentIndex(parent.ElementContent, parentFieldForLength);

            if (segmentIndex == -1 || segmentIndex != parentSegmentIndex)
            {
                return(run);
            }
            var segmentOffset = parent.ElementContent.Take(segmentIndex).Sum(segment => segment.Length);
            var offsets       = parent.ConvertByteOffsetToArrayOffset(parentAddress);

            var newElementCount = model.ReadMultiByteValue(parent.Start + offsets.ElementIndex * parent.ElementLength + segmentOffset, parent.ElementContent[segmentIndex].Length);

            var newRun = run;

            if (newElementCount != newRun.ElementCount)
            {
                var endOfCurrentRun     = run.Start + run.Length;
                var nextRunMinimumStart = newRun.Start + newRun.ElementLength * newElementCount;
                if (
                    TableStreamRun.DataMatches(model, newRun, newElementCount) &&
                    model.GetNextRun(nextRunMinimumStart).Start >= nextRunMinimumStart &&
                    run.ElementCount <= 1
                    )
                {
                    // no need to repoint: the next data matches
                    // this is important for when we're pasting pointers to existing formats before pasting those formats' lengths.
                    // example: paste ^newanchor <pointer> count, where pointer points to existing data. We don't want writing the 'count' to cause a repoint
                    model.ClearFormat(token, endOfCurrentRun, nextRunMinimumStart - endOfCurrentRun);
                    UpdateParents(token, parent, segmentIndex, newElementCount, newRun.PointerSources);
                    newRun = new TableStreamRun(model, newRun.Start, newRun.PointerSources, newRun.FormatString, newRun.ElementContent, this);
                }
                else
                {
                    newRun = (TableStreamRun)newRun.Append(token, newElementCount - newRun.ElementCount);
                    UpdateParents(token, parent, segmentIndex, newElementCount, newRun.PointerSources);
                }
            }

            return(newRun);
        }
Beispiel #11
0
 public override bool TryAddFormatAtDestination(IDataModel owner, ModelDelta token, int source, int destination, string name, IReadOnlyList <ArrayRunElementSegment> sourceSegments, int parentIndex)
 {
     if (TableStreamRun.TryParseTableStream(owner, destination, new SortedSpan <int>(source), name, Format, sourceSegments, out var tsRun))
     {
         if (token is not NoDataChangeDeltaModel)
         {
             // we know that the data format matches, but there may already be a run there that starts sooner
             if (owner.GetNextRun(tsRun.Start) is ITableRun existingTable && existingTable.Start < tsRun.Start)
             {
                 // there is already a format that starts sooner: do nothing, but return true because the format matches
             }
             else
             {
                 owner.ClearFormat(token, tsRun.Start + 1, tsRun.Length - 1);
                 owner.ObserveRunWritten(token, tsRun);
             }
         }
         return(true);
     }