Example #1
0
    /// <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);
    }
Example #2
0
    /// <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;
    }
Example #4
0
 public LocationMemory(LocationMemory copyLocationMemory) : base(copyLocationMemory)
 {
     objectMemories    = new List <ObjectMemory>(copyLocationMemory.objectMemories);
     locationSubjectID = copyLocationMemory.locationSubjectID;
     lastTimeSeen      = copyLocationMemory.LastTimeSeen;
 }
Example #5
0
    /// <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");
        }
    }