Пример #1
0
        private IEnumerable <Pair <PrimitiveValue, SubstitutionSet> > GetEmotionsForEntity(IEmotionalState state,
                                                                                           Name emotionName, KB kb, Name perspective, IEnumerable <SubstitutionSet> constraints)
        {
            if (emotionName.IsVariable)
            {
                foreach (var emotion in state.GetAllEmotions())
                {
                    var sub = new Substitution(emotionName, (Name)emotion.EmotionType);
                    foreach (var c in constraints)
                    {
                        if (c.Conflicts(sub))
                        {
                            continue;
                        }

                        var newConstraints = new SubstitutionSet(c);
                        newConstraints.AddSubstitution(sub);
                        yield return(Tuples.Create((PrimitiveValue)emotion.Intensity, newConstraints));
                    }
                }
            }
            else
            {
                foreach (var resultPair in kb.AskPossibleProperties(emotionName, perspective, constraints))
                {
                    string         emotionKey = resultPair.Item1.ToString();
                    var            emotion    = state.GetEmotionsByType(emotionKey).OrderByDescending(e => e.Intensity).FirstOrDefault();
                    PrimitiveValue value      = emotion == null ? 0 : emotion.Intensity;
                    foreach (var c in resultPair.Item2)
                    {
                        yield return(Tuples.Create(value, c));
                    }
                }
            }
        }
Пример #2
0
        private IEnumerable <Pair <PrimitiveValue, SubstitutionSet> > EmotionIntensityPropertyCalculator(KB kb, Name perspective, IDictionary <string, Name> args, IEnumerable <SubstitutionSet> constraints)
        {
            List <Pair <PrimitiveValue, SubstitutionSet> > result = new List <Pair <PrimitiveValue, SubstitutionSet> >();

            if (perspective != Name.SELF_SYMBOL)
            {
                return(result);
            }

            Name entity      = args["x"];
            Name emotionName = args["y"];

            if (entity.IsVariable)
            {
                var newSub = new Substitution(entity, kb.Perspective);
                var newC   = constraints.Where(c => c.AddSubstitution(newSub));
                if (newC.Any())
                {
                    result.AddRange(GetEmotionsForEntity(m_emotionalState, emotionName, kb, perspective, newC));
                }
            }
            else
            {
                foreach (var resultPair in kb.AskPossibleProperties(entity, perspective, constraints))
                {
                    result.AddRange(GetEmotionsForEntity(m_emotionalState, emotionName, kb, perspective, resultPair.Item2));
                }
            }
            return(result);
        }
Пример #3
0
        private IEnumerable <Pair <PrimitiveValue, SubstitutionSet> > MoodPropertyCalculator(KB kb, Name perspective, IDictionary <string, Name> args, IEnumerable <SubstitutionSet> constraints)
        {
            if (perspective != Name.SELF_SYMBOL)
            {
                yield break;
            }

            Name arg = args["x"];

            if (arg.IsVariable)
            {
                var sub = new Substitution(arg, kb.Perspective);
                foreach (var c in constraints)
                {
                    if (c.AddSubstitution(sub))
                    {
                        yield return(Tuples.Create((PrimitiveValue)m_emotionalState.Mood, c));
                    }
                }
            }
            else
            {
                foreach (var resultPair in kb.AskPossibleProperties(arg, perspective, constraints))
                {
                    var v = (PrimitiveValue)m_emotionalState.Mood;
                    foreach (var c in resultPair.Item2)
                    {
                        yield return(Tuples.Create(v, c));
                    }
                }
            }
        }
 public IEnumerable <Pair <PrimitiveValue, SubstitutionSet> > Retrive(KB kb, Name perspective, IEnumerable <SubstitutionSet> constraints)
 {
     foreach (var pair in kb.AskPossibleProperties(m_name, perspective, constraints))
     {
         foreach (var s in pair.Item2)
         {
             yield return(Tuples.Create(pair.Item1, s));
         }
     }
 }
        /// <summary>
        /// Appraises a set of event strings.
        ///
        /// Durring appraisal, the events will be recorded in the asset's autobiographical memory,
        /// and Property Change Events will update the asset's knowledge about the world, allowing
        /// the asset to use the new information derived from the events to appraise the correspondent
        /// emotions.
        /// </summary>
        /// <param name="eventNames">A set of string representation of the events to appraise</param>
        public void AppraiseEvents(IEnumerable <Name> eventNames, Name perspective, IEmotionalState emotionalState, AM am, KB kb)
        {
            var appraisalFrame = new InternalAppraisalFrame();

            appraisalFrame.Perspective = kb.Perspective;

            foreach (var n in eventNames)
            {
                var evt     = am.RecordEvent(n, am.Tick);
                var propEvt = evt as IPropertyChangedEvent;
                if (propEvt != null)
                {
                    var fact  = propEvt.Property;
                    var value = Name.BuildName("-");
                    if (propEvt.NewValue.IsPrimitive)
                    {
                        value = propEvt.NewValue;
                        if (value.ToString() == "-")
                        {
                            var remove = kb.GetAllBeliefs().Where(x => x.Name == fact);
                            kb.removeBelief(fact);
                        }
                        else
                        {
                            kb.Tell(fact, value, perspective);
                        }
                    }
                    else // new value is not grounded
                    {
                        var values =
                            kb.AskPossibleProperties(propEvt.NewValue, perspective, new List <SubstitutionSet>());
                        if (values.Count() == 1)
                        {
                            kb.Tell(fact, values.FirstOrDefault().Item1.Value, perspective);
                        }
                        else
                        {
                            throw new Exception("Multiple possible values for " + propEvt.NewValue);
                        }
                    }
                }

                appraisalFrame.Reset(evt);
                var componentFrame = appraisalFrame.RequestComponentFrame(m_appraisalDerivator, m_appraisalDerivator.AppraisalWeight);
                m_appraisalDerivator.Appraisal(kb, evt, componentFrame);
                UpdateEmotions(appraisalFrame, emotionalState, am);
            }
        }
Пример #6
0
        private IEnumerable <Pair <PrimitiveValue, SubstitutionSet> > EventAgePropertyCalculator(KB kb, Name perspective, IDictionary <string, Name> args, IEnumerable <SubstitutionSet> constraints)
        {
            if (!perspective.Match(Name.SELF_SYMBOL))
            {
                yield break;
            }

            Name idName = args["id"];

            if (idName.IsVariable)
            {
                foreach (var record in m_registry.Values)
                {
                    var idSub = new Substitution(idName, Name.BuildName(record.Id));
                    foreach (var c in constraints)
                    {
                        if (c.Conflicts(idSub))
                        {
                            continue;
                        }

                        var newSet = new SubstitutionSet(c);
                        newSet.AddSubstitution(idSub);

                        var value = Tick - record.Timestamp;
                        yield return(Tuples.Create((PrimitiveValue)value, newSet));
                    }
                }
                yield break;
            }

            foreach (var pair in kb.AskPossibleProperties(idName, perspective, constraints))
            {
                var idValue = pair.Item1;
                if (!idValue.TypeCode.IsUnsignedNumeric())
                {
                    continue;
                }

                var record = m_registry[idValue];
                var value  = (PrimitiveValue)(Tick - record.Timestamp);
                foreach (var c in pair.Item2)
                {
                    yield return(Tuples.Create(value, c));
                }
            }
        }
        private IEnumerable <Pair <PrimitiveValue, SubstitutionSet> > SIPropertyCalculator(KB kb, Name perspective, IDictionary <string, Name> args, IEnumerable <SubstitutionSet> constraints)
        {
            Name target;

            if (!args.TryGetValue("target", out target))
            {
                yield break;
            }

            foreach (var t in kb.AskPossibleProperties(target, perspective, constraints))
            {
                var si = GetSocialImportance(Name.BuildName(t.Item1), perspective);
                foreach (var s in t.Item2)
                {
                    yield return(new Pair <PrimitiveValue, SubstitutionSet>(si, s));
                }
            }
        }
Пример #8
0
        private IEnumerable <Pair <PrimitiveValue, SubstitutionSet> > StrongestEmotionCalculator(KB kb, Name perspective, IDictionary <string, Name> args, IEnumerable <SubstitutionSet> constraints)
        {
            if (perspective != Name.SELF_SYMBOL)
            {
                yield break;
            }

            Name arg = args["x"];
            var  emo = m_emotionalState.GetStrongestEmotion();

            if (emo == null)
            {
                yield break;
            }

            var emoValue = (PrimitiveValue)emo.EmotionType;

            if (arg.IsVariable)
            {
                var sub = new Substitution(arg, kb.Perspective);
                foreach (var c in constraints)
                {
                    if (c.AddSubstitution(sub))
                    {
                        yield return(Tuples.Create(emoValue, c));
                    }
                }
            }
            else
            {
                foreach (var resultPair in kb.AskPossibleProperties(arg, perspective, constraints))
                {
                    foreach (var c in resultPair.Item2)
                    {
                        yield return(Tuples.Create(emoValue, c));
                    }
                }
            }
        }
Пример #9
0
        //public List<int> UnequipapbleTorches;

        //public PreWorldState(KB knowledgeBase, List<int> guidTorches, Pair<string, int> equipped)
        public PreWorldState(KB knowledgeBase)
        {
            //this.UnequipapbleTorches = guidTorches;
            this.KnowledgeBase = knowledgeBase;
            this.Entities      = new List <ObjectProperties>();
            this.Inventory     = new List <Tuple <string, int, int> >();
            this.Equipped      = new List <Pair <string, int> >();
            this.Fuel          = new List <Tuple <string, int, int> >();
            this.Fire          = new List <Tuple <string, int, int> >();

            //Getting Character Stats

            var hp = knowledgeBase.AskProperty((Name)"Health(Walter)");
            int HP = int.Parse(hp.Value.ToString());

            var hunger = knowledgeBase.AskProperty((Name)"Hunger(Walter)");
            //Console.WriteLine(hunger);
            int Hunger = int.Parse(hunger.Value.ToString());
            //Console.WriteLine(Hunger);

            var sanity = knowledgeBase.AskProperty((Name)"Sanity(Walter)");
            int Sanity = int.Parse(sanity.Value.ToString());

            var posx = knowledgeBase.AskProperty((Name)"PosX(Walter)");
            var PosX = int.Parse(posx.Value.ToString());

            var posz = knowledgeBase.AskProperty((Name)"PosZ(Walter)");
            var PosZ = int.Parse(posz.Value.ToString());

            this.Walter = new Character(HP, Hunger, Sanity, PosX, PosZ);

            //Getting Day Properties

            var cycle = knowledgeBase.AskProperty((Name)"World(CurrentSegment)");

            this.Cycle = float.Parse(cycle.Value.ToString());

            var cycleinfo1 = knowledgeBase.AskProperty((Name)"World(PhaseLenght, day)");
            var Cycleinfo1 = int.Parse(cycleinfo1.Value.ToString());

            var cycleinfo2 = knowledgeBase.AskProperty((Name)"World(PhaseLenght, dusk)");
            var Cycleinfo2 = int.Parse(cycleinfo2.Value.ToString());

            var cycleinfo3 = knowledgeBase.AskProperty((Name)"World(PhaseLenght, night)");
            var Cycleinfo3 = int.Parse(cycleinfo3.Value.ToString());

            this.CycleInfo    = new int[3];
            this.CycleInfo[0] = Cycleinfo1;
            this.CycleInfo[1] = Cycleinfo2;
            this.CycleInfo[2] = Cycleinfo3;

            //Getting Entities + Inventory + Equipped

            var subset = new List <SubstitutionSet> {
                new SubstitutionSet()
            };

            //Getting Equipped

            var equippeditems = knowledgeBase.AskPossibleProperties((Name)"IsEquipped([GUID])", Name.SELF_SYMBOL, subset);

            //if (equipped.Item1 != "" && equipped.Item2 == 0)
            //{
            //    foreach (var item in equippeditems)
            //    {
            //        string strEntGuid = item.Item2.FirstOrDefault().FirstOrDefault().SubValue.Value.ToString();
            //        int entGuid = int.Parse(strEntGuid);
            //        string entPrefab = knowledgeBase.AskProperty((Name)("Entity(" + strEntGuid + ")")).Value.ToString();

            //        if (entPrefab == equipped.Item1)
            //        {
            //            string strEntQuantity = "Quantity(" + strEntGuid + ")";
            //            var quantity = knowledgeBase.AskProperty((Name)strEntQuantity);
            //            int entQuantity = int.Parse(quantity.Value.ToString());

            //            Pair<string, int> tuple = new Pair<string, int>(entPrefab, entGuid);
            //            this.Equipped.Add(tuple);
            //            break;
            //        }
            //    }
            //}
            //else if (equipped.Item2 != 0)
            //{
            //    this.Equipped.Add(equipped);
            //}

            foreach (var item in equippeditems)
            {
                string strEntGuid = item.Item2.FirstOrDefault().FirstOrDefault().SubValue.Value.ToString();
                int    entGuid    = int.Parse(strEntGuid);
                string entPrefab  = knowledgeBase.AskProperty((Name)("Entity(" + strEntGuid + ")")).Value.ToString();

                Pair <string, int> pair = new Pair <string, int>(entPrefab, entGuid);
                this.Equipped.Add(pair);
            }

            //Getting Inventory

            var inventory = knowledgeBase.AskPossibleProperties((Name)"InInventory([GUID])", Name.SELF_SYMBOL, subset);

            foreach (var item in inventory)
            {
                string strEntGuid = item.Item2.FirstOrDefault().FirstOrDefault().SubValue.Value.ToString();
                int    entGuid    = int.Parse(strEntGuid);
                string entPrefab  = knowledgeBase.AskProperty((Name)("Entity(" + strEntGuid + ")")).Value.ToString();

                string strEntQuantity = "Quantity(" + strEntGuid + ")";
                var    quantity       = knowledgeBase.AskProperty((Name)strEntQuantity);
                int    entQuantity    = int.Parse(quantity.Value.ToString());

                Tuple <string, int, int> tuple = new Tuple <string, int, int>(entPrefab, entGuid, entQuantity);
                this.Inventory.Add(tuple);

                if (IsFuel(strEntGuid))
                {
                    this.Fuel.Add(tuple);
                }
            }

            //Getting Entities

            var entities = knowledgeBase.AskPossibleProperties((Name)"Entity([GUID])", Name.SELF_SYMBOL, subset);

            foreach (var entity in entities)
            {
                Boolean b             = false;
                string  strEntGuid    = entity.Item2.FirstOrDefault().FirstOrDefault().SubValue.Value.ToString();
                int     entGuid       = int.Parse(strEntGuid);
                string  entPrefab     = entity.Item1.Value.ToString();
                string  realEntPrefab = RealEntityPrefab(entPrefab);

                if (IsFire(entPrefab))
                {
                    string strEntPosx = "PosX(" + strEntGuid + ")";
                    var    POSx       = knowledgeBase.AskProperty((Name)strEntPosx);
                    int    entPosx    = int.Parse(POSx.Value.ToString());

                    string strEntPosz = "PosZ(" + strEntGuid + ")";
                    var    POSz       = knowledgeBase.AskProperty((Name)strEntPosz);
                    int    entPosz    = int.Parse(POSz.Value.ToString());

                    Tuple <string, int, int> tuple = new Tuple <string, int, int>(entPrefab, entPosx, entPosz);
                    this.Fire.Add(tuple);
                }
                else if (realEntPrefab != "" && DistanceCalculator(strEntGuid) > 0)
                {
                    string  strEntIsCollectable = "IsCollectable(" + strEntGuid + ")";
                    var     isCollectable       = knowledgeBase.AskProperty((Name)strEntIsCollectable);
                    Boolean entIsCollectable    = Boolean.Parse(isCollectable.Value.ToString());

                    string  strEntIsPickable = "IsPickable(" + strEntGuid + ")";
                    var     isPickable       = knowledgeBase.AskProperty((Name)strEntIsPickable);
                    Boolean entIsPickable    = Boolean.Parse(isPickable.Value.ToString());

                    string  strEntIsMineable = "IsMineable(" + strEntGuid + ")";
                    var     isMineable       = knowledgeBase.AskProperty((Name)strEntIsMineable);
                    Boolean entIsMineable    = Boolean.Parse(isMineable.Value.ToString());

                    string  strEntIsChoppable = "IsChoppable(" + strEntGuid + ")";
                    var     isChoppable       = knowledgeBase.AskProperty((Name)strEntIsChoppable);
                    Boolean entIsChoppable    = Boolean.Parse(isChoppable.Value.ToString());

                    if (entIsPickable || entIsCollectable || entIsMineable || entIsChoppable)
                    {
                        string strEntQuantity = "Quantity(" + strEntGuid + ")";
                        var    quantity       = knowledgeBase.AskProperty((Name)strEntQuantity);
                        int    entQuantity    = int.Parse(quantity.Value.ToString());

                        string strEntPosx = "PosX(" + strEntGuid + ")";
                        var    POSx       = knowledgeBase.AskProperty((Name)strEntPosx);
                        int    entPosx    = int.Parse(POSx.Value.ToString());

                        string strEntPosz = "PosZ(" + strEntGuid + ")";
                        var    POSz       = knowledgeBase.AskProperty((Name)strEntPosz);
                        int    entPosz    = int.Parse(POSz.Value.ToString());

                        foreach (ObjectProperties objectproperty in this.Entities)
                        {
                            if (objectproperty.Prefab == realEntPrefab)
                            {
                                objectproperty.Add(entQuantity, entPrefab, entGuid, entPosx, entPosz, this.Walter);
                                b = true;
                                break;
                            }
                        }
                        if (!b)
                        {
                            ObjectProperties newObjectproperty = new ObjectProperties(realEntPrefab, entPrefab, entGuid, entQuantity, entPosx, entPosz, entIsCollectable, entIsPickable, entIsMineable, entIsChoppable);
                            this.Entities.Add(newObjectproperty);
                        }
                    }
                }
            }
        }