public TaskViewModel(TaskModel task, WorldNavigation navigation, EntityModel doer) { Contract.Requires<ArgumentNullException>(task != null); Contract.Requires<ArgumentNullException>(navigation != null); _task = task; _doer = doer; _entityNavigation = navigation; }
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")); }
public void Add(TaskModel task) { _recordedWorld.Head = _recordedWorld.Head.Add(task); }
void Process(TaskModel m) { History.Add(m); }
public bool Matches(TaskModel task) { return task.MissionId == MissionId && task.Finish == Finish; }
public void SetSelected(TaskModel task) { SetSelectedTask(task.Id); }
public bool IsSelected(TaskModel task) { return IsSelectedTask(task.Id); }
public TaskAssignmentEvent(TaskModel task, int doerId, string description) { Task = task; DoerId = doerId; Description = description; }
public void AddSelected(TaskModel task) { AddSelectedTask(task.Id); }
public TaskUpdateEvent(TaskModel task, string description) { Task = task; Description = description; }
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)); } }
EntityModel ClosestToTask(TaskModel task, EntityModel e1, EntityModel e2) { return (e1.Position - task.Finish).Length <= (e2.Position - task.Finish).Length ? e1 : e2; }
bool IsTaskComplete(TaskModel task, EntityModel doer) { return (doer.Position - task.Finish).Length <= 1; }
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)); }
public void Assign(TaskModel task, int doerId) { _recordedWorld.Head = _recordedWorld.Head.Assign(task.Id, doerId); }
public void RemoveSelected(TaskModel task) { RemoveSelectedTask(task.Id); }
public void Complete(TaskModel task, EntityModel entity) { _recordedWorld.Head = _recordedWorld.Head.Complete(task, entity); }
public TaskCompleteEvent(TaskModel task, EntityModel doer, string description) { Task = task; Doer = doer; Description = description; }