/// <summary> /// Find the nearest location where subjectToFind can be found. /// </summary> /// <param name="SubjectToFind">The subject to search for.</param> /// <param name="CurrentPosition">The current position of this game object.</param> /// <param name="ExcludeLocationIDs">The locations to exclude from the results.</param> /// <returns>The found locations or null if no locations were found.</returns> internal List <LocationSubject> FindObject(Subject SubjectToFind, Vector3 CurrentPosition, List <int> ExcludeLocationIDs = null) { List <LocationSubject> foundObjects = new List <LocationSubject>(); foreach (SubjectMemory subMem in definition.Memories) { if (subMem.GetType() == typeof(LocationMemory)) { LocationMemory locMem = subMem as LocationMemory; if (locMem.ObjectMemories.Count > 0) { foreach (ObjectMemory objMem in locMem.ObjectMemories) { if (objMem.SubjectID == SubjectToFind.SubjectID) { if (ExcludeLocationIDs != null) { if (ExcludeLocationIDs.Contains(subMem.SubjectID)) { continue; } } foundObjects.Add(db.GetSubject(locMem.SubjectID) as LocationSubject); } } } } } // sort by distance foundObjects = foundObjects.OrderBy(o => Vector3.Distance(o.Coordinates, CurrentPosition)).ToList(); return(foundObjects); }
/// <summary> /// Copy and existing Definition. /// </summary> /// <param name="newDefinition">Definition to copy.</param> public NpcDefinition(NpcDefinition newDefinition) { Nest = (newDefinition.Nest == null) ? null : new LocationMemory(newDefinition.Nest); Memories = new List <SubjectMemory>(newDefinition.Memories); NpcCharacterTraits newTraits = new NpcCharacterTraits(newDefinition.Traits.Traits); Traits = newTraits; MetabolizeInterval = newDefinition.MetabolizeInterval; HealthRegen = newDefinition.HealthRegen; StarvingDamage = newDefinition.StarvingDamage; HealthDanger = newDefinition.HealthDanger; HealthMax = newDefinition.HealthMax; FoodHungry = newDefinition.FoodHungry; FoodMax = newDefinition.FoodMax; FoodMetabolizeRate = newDefinition.FoodMetabolizeRate; SafetyDeadly = newDefinition.SafetyDeadly; SafetyHigh = newDefinition.SafetyHigh; MoveSpeed = newDefinition.MoveSpeed; SightRangeNear = newDefinition.SightRangeNear; SightRangeFar = newDefinition.SightRangeFar; AttackDamage = newDefinition.AttackDamage; }
internal void TeachNpc(NpcCore npc) { subject.TeachNpc(npc); LocationMemory locationMemory = npc.Definition.Memories.Find(o => o.SubjectID == Subject.SubjectID) as LocationMemory; locationMemory.LastTimeSeen = DateTime.Now; locationMemory.ObjectMemories = localObjects; }
public LocationMemory(LocationMemory copyLocationMemory) : base(copyLocationMemory) { objectMemories = new List <ObjectMemory>(copyLocationMemory.objectMemories); locationSubjectID = copyLocationMemory.locationSubjectID; lastTimeSeen = copyLocationMemory.LastTimeSeen; }
/// <summary> /// Change attitude about a subject based on an event. /// </summary> /// <param name="memoryChangeEvent">The event that has occured.</param> /// <param name="definition">The NPC to effect.</param> /// <param name="subject">The subject to adjust attitude towards.</param> internal void UpdateMemory(NpcMemoryChangeEvent memoryChangeEvent, Subject subject) { switch (memoryChangeEvent) { case NpcMemoryChangeEvent.HealthDamage: if (IsSubjectKnown(subject)) { //known hurts, bad. definition.Memories.Find(o => o.SubjectID == subject.SubjectID).AddSafety(-1); } else { //new thing hurts me, bad. definition.Memories.Add(new SubjectMemory(subject.SubjectID, -1, 0)); } break; case NpcMemoryChangeEvent.FoodEaten: if (IsSubjectKnown(subject)) { //known food, good. definition.Memories.Find(o => o.SubjectID == subject.SubjectID).AddFood(1); } else { //new food, good. definition.Memories.Add(new SubjectMemory(subject.SubjectID, 1, 1)); } break; case NpcMemoryChangeEvent.LocationFound: // look at everything in this location and decide how to effect attitude for this location. if (IsSubjectKnown(subject)) { // known location LocationMemory locationMemory = definition.Memories.Find(o => o.SubjectID == subject.SubjectID) as LocationMemory; int foodValue = 0; int safetyValue = 0; foreach (ObjectMemory objMem in locationMemory.ObjectMemories) { if (definition.Memories.Find(o => o.SubjectID == objMem.SubjectID).Food > 0) { foodValue += objMem.Quantity; } if (definition.Memories.Find(o => o.SubjectID == objMem.SubjectID).Safety > 0) { safetyValue += objMem.Quantity; } } locationMemory.SetValues((sbyte)foodValue, (sbyte)safetyValue); } else { //unknown location definition.Memories.Add(new SubjectMemory(subject.SubjectID, 0, 0)); } break; default: throw new Exception("Invalid NpcAttitudeChangeEvent"); } }