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); }
private Meme IsCloseEnoughForBreeding(MemeController c) { return(Vector3.Distance(transform.position, _target.transform.position) < 1 ? Memes["Breed"] : null); }
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); }
private void ReachFood(MemeController c) { // if (movement.remainingDistance <= movement.stoppingDistance) // { movement.MoveTo(m_Target.transform.position); // } }
private Meme IsCloseEnoughForDrinking(MemeController c) { return(Vector3.Distance(transform.position, _target.transform.position) < characteristics.AnimalCharacteristics.EatRange ? Memes["Drink"] : null); }
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,
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"]); }
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"]); }
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; }
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; }
private Meme CanBreed(MemeController c) { if (Time.time > LastBreed + reproductionDelay && health.currentHealth > reproductionThreshold) { return(memes["Breed"]); } return(memes["Grow"]); }
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); }
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); }
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); }
private void Reproduce(MemeController c) { var closest = m_VisionMemory.Query().Closest(transform.position, LayerMask.NameToLayer("Animal")); if (closest == default) { return; } BreedAndMutate(closest); }
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); }
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); }
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); } } }
// 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); }
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; }
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(); } }
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); }
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)); } }
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"]); }
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); }
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"]); }
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); }
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; }
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"]); }
private Meme Timeout(MemeController c) { // Could be improved return(c.lastTransition + 10f > Time.time ? memes["Wander"] : null); }