public IActivity <PhysicalActor>?Interpret(IVerbalAI <PhysicalActor> ai, string input) { var lookupTable = Parser.Match(input); if (lookupTable == null) { return(null); } return(BuildActivity(ai, lookupTable)); }
protected override IActivity <PhysicalActor>?BuildActivity(IVerbalAI <PhysicalActor> ai, Dictionary <string, string> lookup) { List <GameObject> targets = ai.ObjectsWithName(lookup["TARGET"]).ToList(); if (targets.Count == 0) { return(new AutoFailAction <PhysicalActor>( ai.Actor, new FailedOutcome($"There is no {lookup["TARGET"]} here") )); } List <TAction>?activities = null; List <TAction>?validActivities = null; while (validActivities == null || validActivities.Count > 1) { IEnumerable <TAction> query = from target in targets select new TAction { Actor = ai.Actor, Target = target, }; activities = new List <TAction>(query); validActivities = activities.Where(x => x.IsValid()).ToList(); IEnumerable <GameObject> validTargets = from act in validActivities select act.Target; var uniqueTargets = new HashSet <GameObject>(validTargets); if (uniqueTargets.Count > 1) { GameObject?definiteTarget = ai.ChooseObject(lookup["TARGET"], uniqueTargets); if (definiteTarget == null) { targets = new List <GameObject>(); // empty } else { targets = new List <GameObject>() { definiteTarget }; } } } // activities cannot be null here, because the above loop only exits if it is non-null if (activities !.Count == 0) { return(null); }
protected override IActivity <PhysicalActor> BuildActivity(IVerbalAI <PhysicalActor> ai, Dictionary <string, string> lookup) { return(new TAction { Actor = ai.Actor }); }
protected abstract IActivity <PhysicalActor>?BuildActivity(IVerbalAI <PhysicalActor> ai, Dictionary <string, string> lookup);