Ejemplo n.º 1
0
        public void submit_jobs(Job.AbstractJob[] newJobs, entities.Dwarf to_instance = null)
        {
            GD.Print("Submit new jobs: ", newJobs, " -> ", to_instance != null);

            if (to_instance != null && to_instance.HasMethod("set_personal_jobs"))
            {
                foreach (var j in newJobs)
                {
                    j.Personal  = true;
                    j.Owner     = to_instance;
                    j.jobSystem = this;
                }
                to_instance.set_personal_jobs(newJobs);
            }
            else
            {
                foreach (var j in newJobs)
                {
                    if (!j.Personal)
                    {
                        j.Owner     = null;
                        j.jobSystem = this;
                        _AddJob(j);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        private Job.WalkJob getWalkToJob(Job.BuildTunnelJob job, entities.Dwarf caller)
        {
            var walk = new Job.WalkJob(job.navigation, new Vector3(job.get_cell_pos().x * 2, job.get_cell_pos().y * 2, 0));

            walk.Personal = true;
            walk.Owner    = caller;
            return(walk);
        }
Ejemplo n.º 3
0
        public Job.AbstractJob[] request_jobs(Vector2 pos, entities.Dwarf caller)
        {
            GD.Print("Request jobs, ", pos, " -> ", caller);
            // Vector2 pos = new Vector2(x, y);
            // KinematicBody caller = null;
            Job.AbstractJob nearest = null;
            int             lastPos = 500;

            foreach (var j in jobs)
            {
                if (j.distance_from_cell(pos).Length < lastPos && j.distance_from_cell(pos).Length > 0 && j.Owner == null)
                {
                    lastPos = j.distance_from_cell(pos).Length;
                    nearest = j;
                }
            }

            if (nearest != null)
            {
                GD.Print(pos, " -> ", lastPos, " ", nearest, " ", nearest.get_cell_pos(), " ", GD.Str(nearest.Owner), " ", caller);
                nearest.Owner = caller;

                var path = nearest.distance_from_cell(pos);
                if (path.Length > 0)
                {
                    var walk = new Job.WalkJob(((Job.BuildTunnelJob)nearest).navigation, path[path.Length - 1]);
                    walk.Personal = true;
                    walk.Owner    = caller;

                    var jobs = new List <Job.AbstractJob>();
                    jobs.Add(walk);

                    foreach (var item in _GetArrayOfConnectedTunnelJobs((Job.BuildTunnelJob)nearest, caller))
                    {
                        jobs.Add(item);
                    }

                    return(jobs.ToArray()); //new Job.AbstractJob[] { walk, nearest };
                }
                else
                {
                    return(_GetArrayOfConnectedTunnelJobs((Job.BuildTunnelJob)nearest, caller));//new Job.AbstractJob[] { nearest };
                }
            }
            else
            {
                // GD.Print(pos, " -> ", lastPos);
            }
            return(new Job.AbstractJob[0]);
        }
Ejemplo n.º 4
0
        private Job.AbstractJob[] _GetArrayOfConnectedTunnelJobs(Job.BuildTunnelJob startJob, entities.Dwarf caller)
        {
            GD.Print("_GetArrayOfConnectedTunnelJobs ", startJob, " ", caller);

            var startPos  = startJob.get_cell_pos();
            var direction = _GetTunnelDirection(startPos);

            GD.Print("Add jobs in direction: ", direction, " starting from: ", startPos);
            if (direction.Length() == 0)
            {
                return(new Job.BuildTunnelJob[] { startJob });
            }
            else
            {
                var jobs    = new List <Job.AbstractJob>();
                var nextPos = startPos + direction;
                var nextJob = get_tunnel_job_on_cell(nextPos);

                GD.Print("Add Jobs: ", nextPos, " -> ", nextJob);

                jobs.Add(startJob);
                int iteration = 0;
                while (nextJob != null)
                {
                    nextJob.Owner = caller;
                    jobs.Add(getWalkToJob(nextJob, caller));
                    jobs.Add(nextJob);

                    nextPos = nextPos + direction;
                    nextJob = get_tunnel_job_on_cell(nextPos);
                    GD.Print("(", iteration, ") Add Jobs: ", nextPos, " -> ", GD.Str(nextJob));
                    iteration++;
                    if (iteration > 10)
                    {
                        GD.PrintErr("Exceted iteration for tunnel jobs: ", iteration);
                        break;
                    }
                }
                return(jobs.ToArray());
            }
        }