Ejemplo n.º 1
0
        public override PipelineReturnData pushThrough(List <EntityOnMap <SickEntity> > currentSick, List <EntityOnMap <HealthyEntity> > currentHealthy, ulong timeDeltaMs)
        {
            // Make entities sick if they need to

            /*
             * NOTE: Because the timeScale parameter removes "frames"
             * and possible intersections (no interpolation is being
             * done as it's quite intensive to do at real time),
             * the code tries to compensate by increasing the radius.
             * Because we don't want everyone to become sick immediately,
             * then linear scaling is not possible. Using this
             * (https://www.desmos.com/calculator/7agyg8rqqz) for
             * trying out some things.
             */
            var toBeSick = currentHealthy
                           .Where(h =>
            {
                // Only keep entries that are intersecting with sick people
                return(currentSick
                       .Any(s => EntityOnMap <SickEntity> .IsIntersecting(
                                s.location, radius,
                                h.location, radius)
                            ));
            })
                           .Select((x, idx) =>
            {
                // Covert to sick entities
                var sickEntity  = SickEntity.ConvertToSick(x.entity);
                var sickMapItem = EntityConverterUtility <HealthyEntity, SickEntity> .ConvertInnerEntities(x, sickEntity);
                return(sickMapItem);
            })
                           .Aggregate((new List <ulong>(), new List <EntityOnMap <SickEntity> >()), (aggregate, item) =>
            {
                aggregate.Item1.Add(item.ID);
                aggregate.Item2.Add(item);
                return(aggregate);
            })
                           .ToTuple();

            return(new PipelineReturnData
            {
                newHealthy = currentHealthy.Where(x => !toBeSick.Item1.Contains(x.ID)).ToList(),
                newSick = currentSick.Concat(toBeSick.Item2).ToList(),
            });
        }
        public override PipelineReturnData pushThrough(List <EntityOnMap <SickEntity> > currentSick, List <EntityOnMap <HealthyEntity> > currentHealthy, ulong timeDeltaMs)
        {
            var newHealthy = currentSick
                             .Where(x => ((SickEntity)x.entity).recovery >= 1f)
                             .Aggregate(new Tuple <List <EntityOnMap <HealthyEntity> >, List <ulong> >(new List <EntityOnMap <HealthyEntity> >(), new List <ulong>()), (aggregate, x) =>
            {
                var healthyEntity = SickEntity.ConvertToHealthy(x.entity);
                var sickMapItem   = EntityConverterUtility <SickEntity, HealthyEntity> .ConvertInnerEntities(x, healthyEntity);
                aggregate.Item1.Add(sickMapItem);
                aggregate.Item2.Add(sickMapItem.ID);
                return(aggregate);
            }).ToValueTuple();

            return(new PipelineReturnData
            {
                newHealthy = currentHealthy.Concat(newHealthy.Item1).ToList(),
                newSick = currentSick.Where(x => !newHealthy.Item2.Contains(x.ID)).ToList(),
            });
        }