Esempio n. 1
0
        private void RunUpdate(ref SensorDetectingTemplate template)
        {
            var sensor = template.Sensor;

            sensor.DetectedCells.Clear();
            var start = template.Position.Value;

            sensor.LastDetectedCenter = start;
            var fwd = template.Tr.ForwardDirection2D();
            var ls  = World.Get <LineOfSightSystem>();

            for (int i = 0; i < DirectionsExtensions.Length2D; i++)
            {
                var dir            = (Directions)i;
                var maxRowDistance = dir == fwd ? sensor.MaxVisionDistance : sensor.MaxHearDistance;
                var adjacent       = dir.Adjacent();
                ShadowFloodFill.CheckRow(
                    ref sensor.DetectedCells, start, start,
                    maxRowDistance, new[] { adjacent[0].ToPoint3(), adjacent[1].ToPoint3() }, dir.ToPoint3());
            }
            for (int i = 0; i < _occupyTemplates.Max; i++)
            {
                if (_occupyTemplates.IsInvalid(i))
                {
                    continue;
                }
                var visible = _occupyTemplates[i];
                if (visible.Entity == template.Entity)
                {
                    continue;
                }
                if (!sensor.DetectedCells.Contains(visible.Position))
                {
                    continue;
                }
                var isVision = true;
                if (CheckVision)
                {
                    ls.CanSeeOrHear(template.Entity, visible.Entity, out isVision);
                }
                sensor.AddWatch(visible.Entity, isVision);
            }
            for (int w = sensor.WatchTargets.Count - 1; w >= 0; w--)
            {
                if (sensor.WatchTargets[w].Target == null)
                {
                    sensor.RemoveWatch(sensor.WatchTargets[w]);
                    continue;
                }
                sensor.WatchTargets[w].LastSensedTurnCount++;
                if (sensor.WatchTargets[w].LastSensedTurnCount > MaxTurnsNpcVisible)
                {
                    sensor.RemoveWatch(sensor.WatchTargets[w]);
                }
            }
        }
Esempio n. 2
0
 public bool MoveNext()
 {
     while (true)
     {
         unchecked {
             _position++;
         }
         if (_position >= _array.Max)
         {
             return(false);
         }
         if (!_array.IsInvalid(_position))
         {
             return(true);
         }
     }
 }