IAssignment IJobSource.FindAssignment(ILivingObject living) { var tick = this.Environment.World.TickNumber; var designations = m_map .Where(kvp => kvp.Value.Job == null && kvp.Value.ReachableSimple && kvp.Value.NextReacahbleCheck <= tick) .OrderBy(kvp => (kvp.Key - living.Location).Length); foreach (var d in designations) { var p = d.Key; var dt = d.Value; var ds = GetDesignationPositioning(p, dt.Type); // XXX we should pass the found path to the job, to avoid re-pathing bool canreach = AStar.CanReach(this.Environment, living.Location, p, ds); if (!canreach) { dt.NextReacahbleCheck = tick + 10; continue; } IAssignment job; switch (dt.Type) { case DesignationType.Mine: case DesignationType.CreateStairs: MineActionType mat = DesignationTypeToMineActionType(dt.Type); job = new Jobs.AssignmentGroups.MoveMineAssignment(this, this.Environment, p, mat); break; case DesignationType.FellTree: job = new Jobs.AssignmentGroups.MoveFellTreeAssignment(this, this.Environment, p); break; default: throw new Exception(); } this.Environment.World.Jobs.Add(job); dt.Job = job; return(job); } return(null); }
IAssignment IJobSource.FindAssignment(ILivingObject living) { var designations = m_map .Where(kvp => kvp.Value.Reachable && kvp.Value.Job == null) .OrderBy(kvp => (kvp.Key - living.Location).Length); foreach (var d in designations) { var p = d.Key; var dt = d.Value; IAssignment job; switch (dt.Type) { case DesignationType.Mine: case DesignationType.CreateStairs: case DesignationType.Channel: MineActionType mat; switch (dt.Type) { case DesignationType.Mine: mat = MineActionType.Mine; break; case DesignationType.CreateStairs: mat = MineActionType.Stairs; break; case DesignationType.Channel: mat = MineActionType.Channel; break; default: throw new Exception(); } job = new Jobs.AssignmentGroups.MoveMineAssignment(this, this.Environment, p, mat); break; case DesignationType.FellTree: job = new Jobs.AssignmentGroups.MoveFellTreeAssignment(this, this.Environment, p); break; default: throw new Exception(); } this.Environment.World.Jobs.Add(job); dt.Job = job; return job; } return null; }
IAssignment IJobSource.FindAssignment(ILivingObject living) { var tick = this.Environment.World.TickNumber; var designations = m_map .Where(kvp => kvp.Value.Job == null && kvp.Value.ReachableSimple && kvp.Value.NextReacahbleCheck <= tick) .OrderBy(kvp => (kvp.Key - living.Location).Length); foreach (var d in designations) { var p = d.Key; var dt = d.Value; var ds = GetDesignationPositioning(p, dt.Type); // XXX we should pass the found path to the job, to avoid re-pathing bool canreach = AStar.CanReach(this.Environment, living.Location, p, ds); if (!canreach) { dt.NextReacahbleCheck = tick + 10; continue; } IAssignment job; switch (dt.Type) { case DesignationType.Mine: case DesignationType.CreateStairs: MineActionType mat = DesignationTypeToMineActionType(dt.Type); job = new Jobs.AssignmentGroups.MoveMineAssignment(this, this.Environment, p, mat); break; case DesignationType.FellTree: job = new Jobs.AssignmentGroups.MoveFellTreeAssignment(this, this.Environment, p); break; default: throw new Exception(); } this.Environment.World.Jobs.Add(job); dt.Job = job; return job; } return null; }