public void FinishPowerRerouting()
        {
            this.SetFaction(Faction.OfColony);

            string eventText = "   You have successfully rerouted the power network of the mechanoid terraformer.\n\n"
                               + "Remember that you need some batteries to stock the brief surges of energy generated by the thunderstorms.";

            Find.LetterStack.ReceiveLetter("Rerouting", eventText, LetterType.Good, this.Position);
            this.reverseEngineeringState = Building_MechanoidTerraformer.ReverseEngineeringState.PowerRerouted;
        }
        // ===================== Initialization and save/load functions =====================

        public override void SpawnSetup()
        {
            base.SpawnSetup();

            // Case where this is not the first terraformer to land.
            if (Building_MechanoidTerraformer.studyIsCompleted &&
                (this.reverseEngineeringState == ReverseEngineeringState.BuildingNotApproched))
            {
                this.reverseEngineeringState = ReverseEngineeringState.StudyCompleted;
            }

            // Pylons initialization.
            GetPylonsPositions();

            // Components initialization.
            this.powerComp = base.GetComp <CompPowerTrader>();

            // Drawing and icons.
            generatorTexture       = MaterialPool.MatFrom("Things/Building/Generator", ShaderDatabase.Transparent);
            displayStudyReportIcon = ContentFinder <Texture2D> .Get("Ui/Commands/CommandButton_DisplayStudyReport");
        }
        public override IEnumerable<FloatMenuOption> GetFloatMenuOptions(Pawn pawn)
        {
            List<FloatMenuOption> list = new List<FloatMenuOption>();

            if (pawn.Dead
                || pawn.Downed
                || pawn.IsBurning())
            {
                FloatMenuOption item = new FloatMenuOption("Cannot use (incapacitated)", null);
                yield return item;
                yield break;
            }

            if (pawn.CanReserve(this) == false)
            {
                FloatMenuOption item = new FloatMenuOption("Cannot use (reserved)", null);
                yield return item;
                yield break;
            }
            else if (pawn.CanReach(this, PathEndMode.ClosestTouch, Danger.Some) == false)
            {
                FloatMenuOption item = new FloatMenuOption("Cannot use (no path)", null);
                yield return item;
                yield break;
            }
            else
            {
                switch (this.reverseEngineeringState)
                {
                    case ReverseEngineeringState.BuildingNotApproched:
                        Action action = delegate
                        {
                            Job job = new Job(DefDatabase<JobDef>.GetNamed(Util_MechanoidTerraformer.JobDefName_ScoutStrangeArtifact), this);
                            pawn.drafter.TakeOrderedJob(job);
                        };
                        FloatMenuOption item = new FloatMenuOption("Scout strange artifact", action);
                        yield return item;
                        break;

                    case ReverseEngineeringState.BuildingNotSecured:
                        Action action2 = delegate
                        {
                            Job job = new Job(DefDatabase<JobDef>.GetNamed(Util_MechanoidTerraformer.JobDefName_SecureStrangeArtifact), this);
                            pawn.drafter.TakeOrderedJob(job);
                        };
                        FloatMenuOption item2 = new FloatMenuOption("Secure strange artifact", action2);
                        yield return item2;
                        break;

                    case ReverseEngineeringState.Studying:
                        if (pawn.drafter.Drafted)
                        {
                            yield break;
                        }
                        if (this.studyIsPaused)
                        {
                            Action action3 = delegate
                            {
                                this.studyIsPaused = false;
                                if ((pawn.skills.GetSkill(SkillDefOf.Research).TotallyDisabled == false)
                                    && (pawn.skills.GetSkill(SkillDefOf.Research).level >= minResearchLevelToStudyArtifact))
                                {
                                    Job job = new Job(DefDatabase<JobDef>.GetNamed(Util_MechanoidTerraformer.JobDefName_StudyStrangeArtifact), this);
                                    pawn.drafter.TakeOrderedJob(job);
                                } 
                                else
                                {
                                    Messages.Message(pawn.Name.ToStringShort + " is not skilled enough to study the strange artifact (research level " + minResearchLevelToStudyArtifact + " is required).", MessageSound.RejectInput);
                                    pawn.jobs.StopAll(true);
                                }
                            };
                            FloatMenuOption item3 = new FloatMenuOption("Start study", action3);
                            yield return item3;
                        }
                        else
                        {
                            Action action4 = delegate
                            {
                                this.studyIsPaused = true;
                                pawn.jobs.StopAll(true);
                            };
                            FloatMenuOption item4 = new FloatMenuOption("Pause study", action4);
                            yield return item4;
                        }
                        break;

                    case ReverseEngineeringState.StudyCompleted:
                        if (pawn.drafter.Drafted)
                        {
                            yield break;
                        }
                        Action action5 = delegate
                        {
                            this.reroutingIsPaused = false;
                            this.reverseEngineeringState = ReverseEngineeringState.ReroutingPower;
                            if ((pawn.skills.GetSkill(SkillDefOf.Research).TotallyDisabled == false)
                                && (pawn.skills.GetSkill(SkillDefOf.Research).level >= minResearchLevelToReroutePower))
                            {
                                Job job = new Job(DefDatabase<JobDef>.GetNamed(Util_MechanoidTerraformer.JobDefName_ReroutePower), this);
                                pawn.drafter.TakeOrderedJob(job);
                            }
                            else
                            {
                                Messages.Message(pawn.Name.ToStringShort + " is not skilled enough to reroute the terraformer power network (research level " + minResearchLevelToReroutePower + " is required).", MessageSound.RejectInput);
                                pawn.jobs.StopAll(true);
                            }
                        };
                        FloatMenuOption item5 = new FloatMenuOption("1) Reroute power network OR", action5);
                        yield return item5;

                        Action action6 = delegate
                        {
                            this.extractionIsPaused = false;
                            this.reverseEngineeringState = ReverseEngineeringState.ExtractingWeatherController;
                            if ((pawn.skills.GetSkill(SkillDefOf.Research).TotallyDisabled == false)
                                && (pawn.skills.GetSkill(SkillDefOf.Research).level >= minResearchLevelToExtractWeatherController))
                            {
                                Job job = new Job(DefDatabase<JobDef>.GetNamed(Util_MechanoidTerraformer.JobDefName_ExtractWeatherController), this);
                                pawn.drafter.TakeOrderedJob(job);
                            }
                            else
                            {
                                Messages.Message(pawn.Name.ToStringShort + " is not skilled enough to extract the terraformer weather controller (research level " + minResearchLevelToExtractWeatherController + " is required).", MessageSound.RejectInput);
                                pawn.jobs.StopAll(true);
                            }
                        };
                        FloatMenuOption item6 = new FloatMenuOption("2) Extract weather controller", action6);
                        yield return item6;
                        break;

                    case ReverseEngineeringState.ReroutingPower:
                        if (pawn.drafter.Drafted)
                        {
                            yield break;
                        }
                        if (this.reroutingIsPaused)
                        {
                            Action action7 = delegate
                            {
                                this.reroutingIsPaused = false;
                                if ((pawn.skills.GetSkill(SkillDefOf.Research).TotallyDisabled == false)
                                    && (pawn.skills.GetSkill(SkillDefOf.Research).level >= minResearchLevelToReroutePower))
                                {
                                    Job job = new Job(DefDatabase<JobDef>.GetNamed(Util_MechanoidTerraformer.JobDefName_ReroutePower), this);
                                    pawn.drafter.TakeOrderedJob(job);
                                }
                                else
                                {
                                    Messages.Message(pawn.Name.ToStringShort + " is not skilled enough to reroute the terraformer power network (research level " + minResearchLevelToReroutePower + " is required).", MessageSound.RejectInput);
                                    pawn.jobs.StopAll(true);
                                }
                            };
                            FloatMenuOption item7 = new FloatMenuOption("Reroute power network", action7);
                            yield return item7;
                        }
                        else
                        {
                            Action action8 = delegate
                            {
                                this.reroutingIsPaused = true;
                                pawn.jobs.StopAll(true);
                            };
                            FloatMenuOption item8 = new FloatMenuOption("Pause power rerouting", action8);
                            yield return item8;
                        }
                        break;

                    case ReverseEngineeringState.ExtractingWeatherController:
                        if (pawn.drafter.Drafted)
                        {
                            yield break;
                        }
                        if (this.extractionIsPaused)
                        {
                            Action action9 = delegate
                            {
                                this.extractionIsPaused = false;
                                if ((pawn.skills.GetSkill(SkillDefOf.Research).TotallyDisabled == false)
                                    && (pawn.skills.GetSkill(SkillDefOf.Research).level >= minResearchLevelToExtractWeatherController))
                                {
                                    Job job = new Job(DefDatabase<JobDef>.GetNamed(Util_MechanoidTerraformer.JobDefName_ReroutePower), this);
                                    pawn.drafter.TakeOrderedJob(job);
                                }
                                else
                                {
                                    Messages.Message(pawn.Name.ToStringShort + " is not skilled enough to extract the terraformer weather controller (research level " + minResearchLevelToExtractWeatherController + " is required).", MessageSound.RejectInput);
                                    pawn.jobs.StopAll(true);
                                }
                            };
                            FloatMenuOption item9 = new FloatMenuOption("Extract weather controller", action9);
                            yield return item9;
                        }
                        else
                        {
                            Action action10 = delegate
                            {
                                this.extractionIsPaused = true;
                                pawn.jobs.StopAll(true);
                            };
                            FloatMenuOption item10 = new FloatMenuOption("Pause weather controller extraction", action10);
                            yield return item10;
                        }
                        break;
                }

                if ((this.reverseEngineeringState >= ReverseEngineeringState.StudyCompleted)
                    && (this.invasionIsDone == false))
                {
                    Action action11 = delegate
                    {
                        Job job = new Job(DefDatabase<JobDef>.GetNamed(Util_MechanoidTerraformer.JobDefName_DisableBeacon), this);
                        pawn.drafter.TakeOrderedJob(job);
                    };
                    FloatMenuOption item11 = new FloatMenuOption("Disable beacon", action11);
                    yield return item11;
                }
            }
            yield break;
        }
        public void FinishPowerRerouting()
        {
            this.SetFaction(Faction.OfColony);

            string eventText = "   You have successfully rerouted the power network of the mechanoid terraformer.\n\n"
                + "Remember that you need some batteries to stock the brief surges of energy generated by the thunderstorms.";
            Find.LetterStack.ReceiveLetter("Rerouting", eventText, LetterType.Good, this.Position);
            this.reverseEngineeringState = Building_MechanoidTerraformer.ReverseEngineeringState.PowerRerouted;
        }
        // ===================== Initialization and save/load functions =====================

        public override void SpawnSetup()
        {
            base.SpawnSetup();

            // Case where this is not the first terraformer to land.
            if (Building_MechanoidTerraformer.studyIsCompleted
                && (this.reverseEngineeringState == ReverseEngineeringState.BuildingNotApproched))
            {
                this.reverseEngineeringState = ReverseEngineeringState.StudyCompleted;
            }

            // Pylons initialization.
            GetPylonsPositions();

            // Components initialization.
            this.powerComp = base.GetComp<CompPowerTrader>();

            // Drawing and icons.
            generatorTexture = MaterialPool.MatFrom("Things/Building/Generator", ShaderDatabase.Transparent);
            displayStudyReportIcon = ContentFinder<Texture2D>.Get("Ui/Commands/CommandButton_DisplayStudyReport");
        }
        public override IEnumerable <FloatMenuOption> GetFloatMenuOptions(Pawn pawn)
        {
            List <FloatMenuOption> list = new List <FloatMenuOption>();

            if (pawn.Dead ||
                pawn.Downed ||
                pawn.IsBurning())
            {
                FloatMenuOption item = new FloatMenuOption("Cannot use (incapacitated)", null);
                yield return(item);

                yield break;
            }

            if (pawn.CanReserve(this) == false)
            {
                FloatMenuOption item = new FloatMenuOption("Cannot use (reserved)", null);
                yield return(item);

                yield break;
            }
            else if (pawn.CanReach(this, PathEndMode.ClosestTouch, Danger.Some) == false)
            {
                FloatMenuOption item = new FloatMenuOption("Cannot use (no path)", null);
                yield return(item);

                yield break;
            }
            else
            {
                switch (this.reverseEngineeringState)
                {
                case ReverseEngineeringState.BuildingNotApproched:
                    Action action = delegate
                    {
                        Job job = new Job(DefDatabase <JobDef> .GetNamed(Util_MechanoidTerraformer.JobDefName_ScoutStrangeArtifact), this);
                        pawn.drafter.TakeOrderedJob(job);
                    };
                    FloatMenuOption item = new FloatMenuOption("Scout strange artifact", action);
                    yield return(item);

                    break;

                case ReverseEngineeringState.BuildingNotSecured:
                    Action action2 = delegate
                    {
                        Job job = new Job(DefDatabase <JobDef> .GetNamed(Util_MechanoidTerraformer.JobDefName_SecureStrangeArtifact), this);
                        pawn.drafter.TakeOrderedJob(job);
                    };
                    FloatMenuOption item2 = new FloatMenuOption("Secure strange artifact", action2);
                    yield return(item2);

                    break;

                case ReverseEngineeringState.Studying:
                    if (pawn.drafter.Drafted)
                    {
                        yield break;
                    }
                    if (this.studyIsPaused)
                    {
                        Action action3 = delegate
                        {
                            this.studyIsPaused = false;
                            if ((pawn.skills.GetSkill(SkillDefOf.Research).TotallyDisabled == false) &&
                                (pawn.skills.GetSkill(SkillDefOf.Research).level >= minResearchLevelToStudyArtifact))
                            {
                                Job job = new Job(DefDatabase <JobDef> .GetNamed(Util_MechanoidTerraformer.JobDefName_StudyStrangeArtifact), this);
                                pawn.drafter.TakeOrderedJob(job);
                            }
                            else
                            {
                                Messages.Message(pawn.Name.ToStringShort + " is not skilled enough to study the strange artifact (research level " + minResearchLevelToStudyArtifact + " is required).", MessageSound.RejectInput);
                                pawn.jobs.StopAll(true);
                            }
                        };
                        FloatMenuOption item3 = new FloatMenuOption("Start study", action3);
                        yield return(item3);
                    }
                    else
                    {
                        Action action4 = delegate
                        {
                            this.studyIsPaused = true;
                            pawn.jobs.StopAll(true);
                        };
                        FloatMenuOption item4 = new FloatMenuOption("Pause study", action4);
                        yield return(item4);
                    }
                    break;

                case ReverseEngineeringState.StudyCompleted:
                    if (pawn.drafter.Drafted)
                    {
                        yield break;
                    }
                    Action action5 = delegate
                    {
                        this.reroutingIsPaused       = false;
                        this.reverseEngineeringState = ReverseEngineeringState.ReroutingPower;
                        if ((pawn.skills.GetSkill(SkillDefOf.Research).TotallyDisabled == false) &&
                            (pawn.skills.GetSkill(SkillDefOf.Research).level >= minResearchLevelToReroutePower))
                        {
                            Job job = new Job(DefDatabase <JobDef> .GetNamed(Util_MechanoidTerraformer.JobDefName_ReroutePower), this);
                            pawn.drafter.TakeOrderedJob(job);
                        }
                        else
                        {
                            Messages.Message(pawn.Name.ToStringShort + " is not skilled enough to reroute the terraformer power network (research level " + minResearchLevelToReroutePower + " is required).", MessageSound.RejectInput);
                            pawn.jobs.StopAll(true);
                        }
                    };
                    FloatMenuOption item5 = new FloatMenuOption("1) Reroute power network OR", action5);
                    yield return(item5);

                    Action action6 = delegate
                    {
                        this.extractionIsPaused      = false;
                        this.reverseEngineeringState = ReverseEngineeringState.ExtractingWeatherController;
                        if ((pawn.skills.GetSkill(SkillDefOf.Research).TotallyDisabled == false) &&
                            (pawn.skills.GetSkill(SkillDefOf.Research).level >= minResearchLevelToExtractWeatherController))
                        {
                            Job job = new Job(DefDatabase <JobDef> .GetNamed(Util_MechanoidTerraformer.JobDefName_ExtractWeatherController), this);
                            pawn.drafter.TakeOrderedJob(job);
                        }
                        else
                        {
                            Messages.Message(pawn.Name.ToStringShort + " is not skilled enough to extract the terraformer weather controller (research level " + minResearchLevelToExtractWeatherController + " is required).", MessageSound.RejectInput);
                            pawn.jobs.StopAll(true);
                        }
                    };
                    FloatMenuOption item6 = new FloatMenuOption("2) Extract weather controller", action6);
                    yield return(item6);

                    break;

                case ReverseEngineeringState.ReroutingPower:
                    if (pawn.drafter.Drafted)
                    {
                        yield break;
                    }
                    if (this.reroutingIsPaused)
                    {
                        Action action7 = delegate
                        {
                            this.reroutingIsPaused = false;
                            if ((pawn.skills.GetSkill(SkillDefOf.Research).TotallyDisabled == false) &&
                                (pawn.skills.GetSkill(SkillDefOf.Research).level >= minResearchLevelToReroutePower))
                            {
                                Job job = new Job(DefDatabase <JobDef> .GetNamed(Util_MechanoidTerraformer.JobDefName_ReroutePower), this);
                                pawn.drafter.TakeOrderedJob(job);
                            }
                            else
                            {
                                Messages.Message(pawn.Name.ToStringShort + " is not skilled enough to reroute the terraformer power network (research level " + minResearchLevelToReroutePower + " is required).", MessageSound.RejectInput);
                                pawn.jobs.StopAll(true);
                            }
                        };
                        FloatMenuOption item7 = new FloatMenuOption("Reroute power network", action7);
                        yield return(item7);
                    }
                    else
                    {
                        Action action8 = delegate
                        {
                            this.reroutingIsPaused = true;
                            pawn.jobs.StopAll(true);
                        };
                        FloatMenuOption item8 = new FloatMenuOption("Pause power rerouting", action8);
                        yield return(item8);
                    }
                    break;

                case ReverseEngineeringState.ExtractingWeatherController:
                    if (pawn.drafter.Drafted)
                    {
                        yield break;
                    }
                    if (this.extractionIsPaused)
                    {
                        Action action9 = delegate
                        {
                            this.extractionIsPaused = false;
                            if ((pawn.skills.GetSkill(SkillDefOf.Research).TotallyDisabled == false) &&
                                (pawn.skills.GetSkill(SkillDefOf.Research).level >= minResearchLevelToExtractWeatherController))
                            {
                                Job job = new Job(DefDatabase <JobDef> .GetNamed(Util_MechanoidTerraformer.JobDefName_ReroutePower), this);
                                pawn.drafter.TakeOrderedJob(job);
                            }
                            else
                            {
                                Messages.Message(pawn.Name.ToStringShort + " is not skilled enough to extract the terraformer weather controller (research level " + minResearchLevelToExtractWeatherController + " is required).", MessageSound.RejectInput);
                                pawn.jobs.StopAll(true);
                            }
                        };
                        FloatMenuOption item9 = new FloatMenuOption("Extract weather controller", action9);
                        yield return(item9);
                    }
                    else
                    {
                        Action action10 = delegate
                        {
                            this.extractionIsPaused = true;
                            pawn.jobs.StopAll(true);
                        };
                        FloatMenuOption item10 = new FloatMenuOption("Pause weather controller extraction", action10);
                        yield return(item10);
                    }
                    break;
                }

                if ((this.reverseEngineeringState >= ReverseEngineeringState.StudyCompleted) &&
                    (this.invasionIsDone == false))
                {
                    Action action11 = delegate
                    {
                        Job job = new Job(DefDatabase <JobDef> .GetNamed(Util_MechanoidTerraformer.JobDefName_DisableBeacon), this);
                        pawn.drafter.TakeOrderedJob(job);
                    };
                    FloatMenuOption item11 = new FloatMenuOption("Disable beacon", action11);
                    yield return(item11);
                }
            }
            yield break;
        }