示例#1
0
        private Meme IsTargetAlive(MemeController c)
        {
            var closest = m_VisionMemory.Query().Closest(transform.position,
                                                         LayerMask.NameToLayer("Animal"));

            return(closest != default && closest.GetComponent <Health>().dead ? Memes["Wander"] : null);
        }
示例#2
0
 private Meme IsCloseEnoughForBreeding(MemeController c)
 {
     return(Vector3.Distance(transform.position, _target.transform.position) <
            1
         ? Memes["Breed"]
         : null);
 }
示例#3
0
        private Meme PartnerAround(MemeController c)
        {
            // Look for partner
            if (Time.time > LastBreed + reproductionDelay && health.currentHealth > reproductionThreshold)
            {
                // TODO: closest with enough life to breed
                // No animal to breed with around
                var layerMask = 1 << LayerMask.NameToLayer("Animal");

                // Any matching object around ? Try to get the closest if any
                var closest = gameObject.Closest(sightRange, layerMask);
                // No animal to breed with around
                if (closest == default)
                {
                    return(null);
                }
                m_Target = closest;

                // Stop current movement
                // movement.navMeshAgent.destination = transform.position;

                return(memes["ReachPartner"]);
            }

            return(null);
        }
示例#4
0
 private void ReachFood(MemeController c)
 {
     // if (movement.remainingDistance <= movement.stoppingDistance)
     // {
     movement.MoveTo(m_Target.transform.position);
     // }
 }
示例#5
0
 private Meme IsCloseEnoughForDrinking(MemeController c)
 {
     return(Vector3.Distance(transform.position, _target.transform.position) <
            characteristics.AnimalCharacteristics.EatRange
         ? Memes["Drink"]
         : null);
 }
示例#6
0
 protected void RandomMovement(MemeController _)
 {
     if (movement.remainingDistance <= movement.stoppingDistance + 1)
     {
         // Try to find a random position on map, otherwise will just go to zero
         var p = transform.position.Spray(
             characteristics.AnimalCharacteristics.RandomMovementRange,
示例#7
0
        private Meme FoodAround(MemeController c)
        {
            // TODO: params
            if (health.currentHealth > 90f)
            {
                return(null);
            }

            // Any matching object around ? Try to get the closest if any
            var closest = gameObject.Closest(characteristics.AnimalCharacteristics.SightRange, _foodLayer /*,
                                                                                                           * filter: go => !go.GetComponent<Health>().dead*/);

            // No food around OR target is dead / too weak
            if (closest == default)
            {
                return(null);
            }
            // Debug.Log($"found food {closest}");

            _target = closest;

            // Stop current movement
            // movement.navMeshAgent.destination = transform.position;

            return(Memes["ReachFood"]);
        }
示例#8
0
        private Meme FoodAround(MemeController c)
        {
            // TODO: params
            if (health.currentHealth > 90f)
            {
                return(memes["Wander"]);
            }

            var layerMask = 1 << LayerMask.NameToLayer("Vegetation");

            // Any matching object around ? Try to get the closest if any
            var closest = gameObject.Closest(sightRange, layerMask);

            // No food around OR target is dead / too weak
            if (closest == default || closest.GetComponent <Health>().dead)
            {
                return(null);
            }
            m_Target = closest;

            // Stop current movement
            // movement.navMeshAgent.destination = transform.position;

            return(memes["ReachFood"]);
        }
示例#9
0
        private void Reproduce(MemeController c)
        {
            if (!CanBreed())
            {
                return;
            }

            // Spawning a child around
            var p = transform.position.Spray(5,
                                             LayerMask.GetMask("Plant"),
                                             3);

            // Couldn't find free position
            if (p.Equals(Vector3.positiveInfinity))
            {
                return;
            }
            var childHost = Hm.instance.SpawnPlantSync(p,
                                                       Quaternion.identity,
                                                       characteristics,
                                                       characteristicsMin,
                                                       characteristicsMax);

            characteristics.Energy -= characteristics.ReproductionCost;

            // TODO: mutate should handle asexual reproduction
            childHost.characteristics.Mutate(characteristics,
                                             characteristics,
                                             characteristicsMin,
                                             characteristicsMax,
                                             new [] { "Descriptor", "Parser", "Carnivorous", "ReproductionDelay", "Life", "Energy" });
            LastBreed = Time.time;
        }
示例#10
0
 private void Eat(MemeController c)
 {
     // Stop moving
     movement.isStopped = true;
     attack.EatTarget(_target);
     // The more energy, the more damage to food ?
     _target.GetComponent <Health>().AddHealth(-characteristics.Energy / 10); // TODO: ?
     characteristics.Energy += characteristics.EatEnergyGain;
 }
示例#11
0
 private Meme CanBreed(MemeController c)
 {
     if (Time.time > LastBreed + reproductionDelay &&
         health.currentHealth > reproductionThreshold)
     {
         return(memes["Breed"]);
     }
     return(memes["Grow"]);
 }
示例#12
0
        public void Post_Creates_New_Meme()
        {
            var meme      = new Meme();
            var repo      = Substitute.For <IMemeRepository>();
            var underTest = new MemeController(repo);

            underTest.Post(meme);

            repo.Received().Create(meme);
        }
示例#13
0
 private void Eat(MemeController c)
 {
     // Stop moving
     movement.isStopped = true;
     attack.EatTarget(m_Target);
     m_Target.GetComponent <Health>().ChangeHealth(-Time.deltaTime * 30);          // TODO: store params
     // +metabolism (10) *Time.deltaTime*0.5f // seems balanced
     // TODO: maybe age reduce life gain on eat ?
     health.ChangeHealth(+metabolism * Time.deltaTime * 50f);
 }
示例#14
0
        private Meme IsCloseEnoughForEating(MemeController c)
        {
            var closest = m_VisionMemory.Query().Closest(transform.position,
                                                         LayerMask.NameToLayer("Vegetation"));

            if (closest != default && Vector3.Distance(transform.position, closest.transform.position) < eatRange)
            {
                return(memes["Eat"]);
            }
            return(null);
        }
示例#15
0
        private void Reproduce(MemeController c)
        {
            var closest = m_VisionMemory.Query().Closest(transform.position,
                                                         LayerMask.NameToLayer("Animal"));

            if (closest == default)
            {
                return;
            }
            BreedAndMutate(closest);
        }
示例#16
0
        private Meme IsCloseEnoughForBreeding(MemeController c)
        {
            var closest = m_VisionMemory.Query().Closest(transform.position,
                                                         LayerMask.NameToLayer("Animal"));

            if (closest != default && Vector3.Distance(transform.position, closest.transform.position) < 1)
            {
                return(Memes["Breed"]);
            }
            return(null);
        }
示例#17
0
        private Meme IsCloseEnoughForEating(MemeController c)
        {
            var closest = m_VisionMemory.Query().Closest(transform.position,
                                                         LayerMask.NameToLayer("Plant"));

            if (closest != default && Vector3.Distance(transform.position, closest.transform.position) <
                characteristics.AnimalCharacteristics.EatRange)
            {
                return(Memes["Eat"]);
            }
            return(null);
        }
示例#18
0
 private void ReachPartner(MemeController c)
 {
     if (movement.remainingDistance <= movement.stoppingDistance)
     {
         var closest = m_VisionMemory.Query().Closest(transform.position,
                                                      LayerMask.NameToLayer("Animal"));
         if (closest != default)
         {
             movement.MoveTo(closest.transform.position);
         }
     }
 }
示例#19
0
文件: Host.cs 项目: akridge/niwrad
        // Do plants and animals share senses ? like:
        // protected Sense<GameObject> feel;
        // protected Memory<GameObject> feelMemory;

        protected void OnEnable()
        {
            health             = GetComponent <Health>();
            health.initialLife = initialLife;
            attack             = GetComponent <Attack>();
            controller         = GetComponent <MemeController>();
            Age = 0;

            // Not sure required, maybe could be useful to prevent hosts forgetting to implement breeding meme
            var n = "Breed";

            memes[n] = new Meme(n, null, null);
        }
示例#20
0
        protected void Awake()
        {
            _age       = 0;
            health     = GetComponent <Health>();
            attack     = GetComponent <Attack>();
            controller = GetComponent <MemeController>();
            // Not sure required, maybe could be useful to prevent hosts forgetting to implement breeding meme
            var n = "Breed";

            Memes[n]       = new Meme(n, null, null);
            _renderer      = GetComponent <Renderer>();
            _originalColor = _renderer.material.color;
        }
示例#21
0
        public async Task TestPutMemeItemUpdate()
        {
            using (var context = new MemeApiContext(options))
            {
                // Given
                string   title     = "putMeme";
                MemeItem memeItem1 = context.MemeItem.Where(x => x.Title == memeTitles[0]).Single();
                memeItem1.Title = title;

                // When
                MemeController memeController = new MemeController(context, configuration);
                IActionResult  result         = await memeController.PutMemeItem(memeItem1.Id, memeItem1) as IActionResult;

                // Then
                memeItem1 = context.MemeItem.Where(x => x.Title == title).Single();
            }
        }
示例#22
0
        private void Eat(MemeController c)
        {
            // Stop moving
            movement.isStopped = true;
            var closest = m_VisionMemory.Query().Closest(transform.position,
                                                         LayerMask.NameToLayer("Plant"));

            if (closest == default)
            {
                return;
            }
            attack.EatTarget(closest);
            closest.GetComponent <Health>().AddHealth(-Time.deltaTime * 30); // TODO: store params
            // +metabolism (10) *Time.deltaTime*0.5f // seems balanced
            // TODO: maybe age reduce life gain on eat ?
            health.AddHealth(+characteristics.AnimalCharacteristics.Metabolism * Time.deltaTime * 50f);
        }
示例#23
0
        public async Task TestPutMemeItemNoContentStatusCode()
        {
            using (var context = new MemeApiContext(options))
            {
                // Given
                string   title     = "putMeme";
                MemeItem memeItem1 = context.MemeItem.Where(x => x.Title == memeTitles[0]).Single();
                memeItem1.Title = title;

                // When
                MemeController memeController = new MemeController(context, configuration);
                IActionResult  result         = await memeController.PutMemeItem(memeItem1.Id, memeItem1) as IActionResult;

                // Then
                Assert.IsNotNull(result);
                Assert.IsInstanceOfType(result, typeof(NoContentResult));
            }
        }
示例#24
0
        private Meme WaterAround(MemeController c)
        {
            // Any matching object around ? Try to get the closest if any
            var closest = gameObject.Closest(characteristics.AnimalCharacteristics.SightRange, WaterLayer);

            // No water around
            if (closest == default)
            {
                return(null);
            }

            _target = closest;

            // Stop current movement
            // movement.navMeshAgent.destination = transform.position;

            return(Memes["ReachFood"]);
        }
示例#25
0
        private Meme PartnerAround(MemeController c)
        {
            // Look for partner
            if (Time.time > LastBreed + reproductionDelay && health.currentHealth > reproductionThreshold)
            {
                var closest = m_VisionMemory.Query().Closest(transform.position,
                                                             LayerMask.NameToLayer("Animal"));
                // TODO: closest with enough life to breed
                // No animal to breed with around
                if (closest == default)
                {
                    return(null);
                }

                // Stop current movement
                // movement.navMeshAgent.destination = transform.position;

                return(memes["ReachPartner"]);
            }

            return(null);
        }
示例#26
0
        private Meme FoodAround(MemeController c)
        {
            // TODO: params
            if (health.currentHealth > 90f)
            {
                return(Memes["Wander"]);
            }

            var closest = m_VisionMemory.Query().Closest(transform.position,
                                                         LayerMask.NameToLayer("Plant"));

            // No food around OR target is dead / too weak
            if (closest == default || closest.GetComponent <Health>().dead)
            {
                return(null);
            }

            // Stop current movement
            // movement.navMeshAgent.destination = transform.position;

            return(Memes["ReachFood"]);
        }
示例#27
0
        private Meme PartnerAround(MemeController c)
        {
            // Look for partner
            if (characteristics.Energy > characteristics.ReproductionCost)
            {
                var closest = m_VisionMemory.Query().Closest(transform.position,
                                                             LayerMask.NameToLayer("Animal"));
                // TODO: closest with enough life to breed
                // No animal to breed with around
                if (closest == default)
                {
                    return(null);
                }

                // Stop current movement
                // movement.navMeshAgent.destination = transform.position;

                return(Memes["ReachPartner"]);
            }

            return(null);
        }
示例#28
0
        private void Reproduce(MemeController c)
        {
            return;             // off now

            // There is a probability of reproduction
            if (Random.value * 100 > reproductionProbability)
            {
                return;
            }

            // Spawning a child around
            var p = transform.position.RandomPositionAroundAboveGroundWithDistance(reproductionSprayRadius,
                                                                                   LayerMask.GetMask("Vegetation"),
                                                                                   reproductionDistanceBetween);

            // Couldn't find free position
            if (p == Vector3.zero)
            {
                return;
            }
            var childHost = HostManager.instance.SpawnTree(p, Quaternion.identity);
            var mutate    = new Func <float, float, float>((a, mutationDegree) =>
            {
                var md = Mathf.Abs(mutationDegree) > 1 ? 1 : Mathf.Abs(mutationDegree);
                return(a * (1 + Random.Range(-md, md)));
            });
            var r = ReflectionExtension.GetRange(GetType(), nameof(initialLife));

            childHost.initialLife = Mathf.Clamp(mutate(initialLife, 1f), r.min, r.max);

            r = ReflectionExtension.GetRange(GetType(), nameof(robustness));
            childHost.robustness = Mathf.Clamp(mutate(robustness, 1f), r.min, r.max);

            // go.GetComponent<MeshFilter>().mesh.Mutation();

            // TODO: the new host should have its memes tweaked by meme controller (mutation ...)
            LastBreed = Time.time;
        }
示例#29
0
        private Meme PartnerAround(MemeController c)
        {
            // Look for partner
            if (!CanBreed())
            {
                return(null);
            }
            // Any matching object around ? Try to get the closest if any
            var closest = gameObject.Closest(characteristics.AnimalCharacteristics.SightRange, _specieLayer /*,
                                                                                                             * filter: go => go.GetComponent<SimpleAnimal>().characteristics.Energy > characteristics.ReproductionCost*/);

            // No animal to breed with around, TODO: move the canbreed filter to Closest()
            if (closest == default || !closest.GetComponent <Host>().CanBreed())
            {
                return(null);
            }
            _target = closest;

            // Stop current movement
            // movement.navMeshAgent.destination = transform.position;

            return(Memes["ReachPartner"]);
        }
示例#30
0
 private Meme Timeout(MemeController c)
 {
     // Could be improved
     return(c.lastTransition + 10f > Time.time ? memes["Wander"] : null);
 }