예제 #1
0
 public void SetSegmentData(SegmentData data)
 {
     if (data != segmentData)
     {
         if (segmentData)
         {
             if (segmentData.validationListener == OnValidate)
             {
                 segmentData.validationListener = null;
             }
         }
         segmentData = data;
         if (data)
         {
             data.validationListener = OnValidate;
             UpdateAppearanceForCurrentValues();
         }
     }
 }
예제 #2
0
        public bool CanCopySegmentToLocation(SegmentData segment, int location, out int?suggestedLocation)
        {
            suggestedLocation = null;

            if (location < 0)
            {
                return(false);
            }
            if (location + segment.segmentLength > CurrentEnd)
            {
                var earliestEndStart = segments[segments.Count - 1].PositionAfter;
                if (CurrentEnd - earliestEndStart > segment.segmentLength)
                {
                    suggestedLocation = CurrentEnd - segment.segmentLength;
                }
                return(false);
            }

            var enclosingSegments = SegmentsSurroundingLocation(location);

            // Debug.Log($"Enclosing Segments: {enclosingSegments[0]} - {location} - {enclosingSegments[1]}");
            if (enclosingSegments[0] && enclosingSegments[0].PositionAfter > location)
            {
                return(false);
            }
            if (enclosingSegments[1] && enclosingSegments[1].location < location + segment.segmentLength)
            {
                if (!enclosingSegments[0] || (enclosingSegments[1].location - enclosingSegments[0].PositionAfter) >= segment.segmentLength)
                {
                    int potentialLocation = enclosingSegments[1].location - segment.segmentLength;
                    if (potentialLocation >= 0)
                    {
                        suggestedLocation = potentialLocation;
                    }
                }
                return(false);
            }

            return(true);
        }
예제 #3
0
        public FileData(Level level, int fileID, int fileLength)
        {
            this.fileID     = fileID;
            this.fileLength = fileLength;
            this.level      = level;
            segments        = new List <SegmentData>();

            int segmentIndex    = 0;
            int remainingLength = fileLength;

            while (remainingLength > 0)
            {
                int segmentLength = Random.Range(1, System.Math.Min(remainingLength, level.width - 8));
                if (segmentLength == remainingLength && segmentIndex == 0)
                {
                    segmentLength = Random.Range(1, segmentLength - 1);
                }
                SegmentData segment = new SegmentData();
                segment.fileNumber    = fileID;
                segment.segmentNumber = segmentIndex + 1;
                segment.segmentLength = segmentLength;
                segment.level         = level;
                if (segmentIndex == 0)
                {
                    segment.partType = SegmentDataPartType.Start;
                }
                else if (remainingLength == segmentLength)
                {
                    segment.partType = SegmentDataPartType.End;
                }
                else
                {
                    segment.partType = SegmentDataPartType.Middle;
                }
                segments.Add(segment);

                segmentIndex    += 1;
                remainingLength -= segmentLength;
            }
        }
예제 #4
0
        public List <SegmentData> SegmentsSurroundingLocation(int location)
        {
            List <SegmentData> result = new List <SegmentData> {
                null, null
            };
            int segmentCount = segments.Count;

            for (int index = 0; index < segmentCount; index++)
            {
                SegmentData segment = segments[index];
                if (segment.location < location)
                {
                    result[0] = segment;
                }
                if (segment.location >= location)
                {
                    result[1] = segment;
                    break;
                }
            }
            return(result);
        }
예제 #5
0
 // TODO: make it take time and give a progress callback
 public void CopySegmentToLocation(SegmentData segment, int location)
 {
     segment.location = location;
     SortSegments();
 }