public override void Write(Data data) { if (!(data is DataNest)) { return; } DataNest dataNest = data as DataNest; bool exist = false; int index = 0; foreach (DataNest d in nests) { if (d.nest == dataNest.nest) { exist = true; break; } ++index; } if (exist) { if (dataNest.RegistrationDate >= nests[index].RegistrationDate) { Replace(new DataNest(dataNest), index); } } else { nests.Add(new DataNest(dataNest)); } }
public override float CalculateDesirability(Agent agent, bool requested) { DesirabilitiesConfig desirabilitiesConfig = GameManager.Instance.DesirabilitiesConfig; DataNest dataNest = agent.Memory.Nests.Read().FirstOrDefault(data => data.nest.SpecieID == agent.Creature.SpecieID); if (dataNest == null) { return(0); } float distanceFromNest = Vector3.Distance(agent.transform.position, dataNest.nest.transform.position); if (distanceFromNest > desirabilitiesConfig.ReachNestConsiderationMaxDistance) { distanceFromNest = desirabilitiesConfig.ReachNestConsiderationMaxDistance; } float desirability = desirabilitiesConfig.ReachNestDesirabilityByDistance.Evaluate(distanceFromNest / desirabilitiesConfig.ReachNestConsiderationMaxDistance) * desirabilitiesConfig.ReachNestDesirabilityTwicker; if (agent.Thinking.ActiveGoal?.GetType() == typeof(GoalEvade)) { desirability *= desirabilitiesConfig.ReachNestConfirmationBias; } return(desirability); }
public void RemoveByKey(Nest key) { DataNest element = nests.Find(data => data.nest == key); if (element != null) { nests.Remove(element); } }
public override void Activate() { base.Activate(); DataNest dataNest = owner.Memory.Nests.Read().FirstOrDefault(data => data.nest.SpecieID == owner.Creature.SpecieID); if (dataNest == null) { status = GoalStatus.Failed; return; } Vector3 nestPos = dataNest.nest.transform.position; Vector2 randPos = Random.insideUnitCircle; AddSubgoal(new GoalSeek(owner, nestPos + new Vector3(randPos.x, 0, randPos.y) * 10)); }
public override void Activate() { base.Activate(); DataNest dataNest = owner.Memory.Nests.Read().FirstOrDefault(data => data.nest.SpecieID == owner.Creature.SpecieID); if (dataNest == null) { status = GoalStatus.Failed; return; } DesirabilitiesConfig desirabilitiesConfig = GameManager.Instance.DesirabilitiesConfig; float distWithNest = dataNest != null?Vector3.Distance(owner.transform.position, dataNest.nest.transform.position) : 0; float wantDistWithNest = desirabilitiesConfig.SlepConsiderationMinNestDistance + (desirabilitiesConfig.SlepConsiderationMaxNestDistance - desirabilitiesConfig.SlepConsiderationMinNestDistance) * desirabilitiesConfig.SleepToNestDesirabilityBySociability.Evaluate(owner.Creature.Traits.Sociability.Value); wantDistWithNest = Random.Range(desirabilitiesConfig.SlepConsiderationMinNestDistance, wantDistWithNest); Vector2 randPos = Random.insideUnitCircle; AddSubgoal(new GoalSeek(owner, dataNest.nest.transform.position + new Vector3(randPos.x, 0, randPos.y) * wantDistWithNest)); }
public override void Process() { IReadOnlyCollection <DataNest> nests = owner.Memory.Nests.Read(); DataNest nestData = null; float distanceToNest = Mathf.Infinity; foreach (DataNest data in nests) { if (!data.nest) { continue; } Nest nest = data.nest; if (visited.Contains(nest)) { continue; } if (!nest.gameObject.activeSelf) { continue; } if (!speciesSeeked.Contains(nest.SpecieID)) { continue; } //ne pas prendre en compte les nest food imédiatement vue. //if(Time.time - data.RegistrationDate > 1f) continue; float distanceToSource = Vector3.Distance(owner.transform.position, nest.transform.position); if (distanceToSource < distanceToNest) { nestData = data; distanceToNest = distanceToSource; } } if (nestData != null) { if (target != nestData.nest) { target = nestData.nest; owner.Steering.SetDestination(target.transform.position); owner.Steering.Behavior = eSteeringBehavior.Seek; } else if (owner.Steering.IsArrivedToDestination) { visited.Add(target); target = null; } else if (target == null) { status = GoalStatus.Failed; } } else { status = GoalStatus.Failed; } }
public DataNest(DataNest dataNest) : base(expirationTime - (Time.time - dataNest.RegistrationDate)) { this.nest = dataNest.nest; }