예제 #1
0
        public TaskViewModel(TaskModel task, WorldNavigation navigation, EntityModel doer)
        {
            Contract.Requires<ArgumentNullException>(task != null);
            Contract.Requires<ArgumentNullException>(navigation != null);

            _task = task;
            _doer = doer;
            _entityNavigation = navigation;
        }
예제 #2
0
 public void EventApplication()
 {
     var mission = new MissionModel(0, EnumMissionAction.Move, entity.Id, DateTime.Now, SetModule.Empty<int>(), DateTime.Now, entity.Position, 1);
     var task = new TaskModel(0, 0, new Vector3D(), null);
     world.Apply(new EntityUpdateEvent(entity, "Test entity event"));
     world.Apply(new MissionUpdateEvent(mission, "Test mission event"));
     world.Apply(new TaskUpdateEvent(task, "Test task event"));
     world.Apply(new TaskCompleteEvent(task, null, "Test task complete event"));
     world.Apply(new MissionCompleteEvent(mission, "Test task complete event"));
     world.Apply(new EntityUpdateEvent(entity, "Test entity event"));
     world.Apply(new SkillEvent(entity, EnumSkill.AcidBlast, entity, true, true, false, "Test skill event"));
 }
예제 #3
0
 public void Add(TaskModel task) { _recordedWorld.Head = _recordedWorld.Head.Add(task); }
 void Process(TaskModel m)
 {
     History.Add(m);
 }
예제 #5
0
 public bool Matches(TaskModel task)
 {
     return task.MissionId == MissionId
         && task.Finish == Finish;
 }
예제 #6
0
 public void SetSelected(TaskModel task) { SetSelectedTask(task.Id); }
예제 #7
0
 public bool IsSelected(TaskModel task) { return IsSelectedTask(task.Id); }
 public TaskAssignmentEvent(TaskModel task, int doerId, string description)
 {
     Task = task;
     DoerId = doerId;
     Description = description;
 }
예제 #9
0
 public void AddSelected(TaskModel task) { AddSelectedTask(task.Id); }
예제 #10
0
 public TaskUpdateEvent(TaskModel task, string description)
 {
     Task = task;
     Description = description;
 }
예제 #11
0
 void AssignTaskToNearestEntity(TaskModel task)
 {
     var world = History.Head;
     var mission = world.Missions[task.MissionId];
     if (mission.DoerIds.IsEmpty)
     {
         // TODO: find an appropriate entity
     }
     else
     {
         var doer = mission.DoerIds
             .Select(z => world.Entities[z])
             .Aggregate((x, y) => ClosestToTask(task, x, y));
         Apply(new TaskAssignmentEvent(task, doer.Id, "Task " + task + " assigned to " + doer));
     }
 }
예제 #12
0
 EntityModel ClosestToTask(TaskModel task, EntityModel e1, EntityModel e2)
 {
     return (e1.Position - task.Finish).Length <= (e2.Position - task.Finish).Length
         ? e1
         : e2;
 }
예제 #13
0
 bool IsTaskComplete(TaskModel task, EntityModel doer)
 {
     return (doer.Position - task.Finish).Length <= 1;
 }
예제 #14
0
        void UpdateMission(MissionModel mission)
        {
            var world = History.Head;
            var doers = mission.DoerIds.Select(x => world.Entities[x]);

            // Has this mission been completed?
            if (doers.Any(d => IsMissionComplete(mission, d)))
            {
                Apply(new MissionCompleteEvent(mission, "Finished " + mission));
                return;
            }

            // What task chains exist to satisfy this mission?
            // Build a graph of connections from current state to final state

            // Which task chain should I choose?
            // Shortest path search of the graph

            var tasks = new List<TaskModel>();
            var task = new TaskModel(Global.Rand.Next(), mission.Id, mission.Destination, null);
            tasks.Add(task);

            // Does this match my current task allocation?
            // Only change if there is a significant reason to
            IEnumerable<TaskModel> old;
            var TaskIds = world.MissionRequiresTasks.ValueOrDefault(mission.Id);

            if (TaskIds == null)
                old = Enumerable.Empty<TaskModel>();
            else
            {
                old = TaskIds.Select(id => world.Tasks[id]);
                foreach (var t in old.Where(x => !tasks.Any(y => y.Matches(x))))
                    Apply(new TaskCompleteEvent(t, null, "Remove task " + t + " of " + mission));
            }
            foreach (var t in tasks.Where(x => !old.Any(y => y.Matches(x))))
                Apply(new TaskUpdateEvent(t, "Added task " + t + " of " + mission));
        }
예제 #15
0
 public void Assign(TaskModel task, int doerId) { _recordedWorld.Head = _recordedWorld.Head.Assign(task.Id, doerId); }
예제 #16
0
 public void RemoveSelected(TaskModel task) { RemoveSelectedTask(task.Id); }
예제 #17
0
 public void Complete(TaskModel task, EntityModel entity) { _recordedWorld.Head = _recordedWorld.Head.Complete(task, entity); }
예제 #18
0
 public TaskCompleteEvent(TaskModel task, EntityModel doer, string description)
 {
     Task = task;
     Doer = doer;
     Description = description;
 }