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)); } } } }
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); }
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); } }
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)); } } }
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)); } } } }
//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); } } } } }