コード例 #1
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            var        myBuilding       = CompMachine.cachedMachinesPawns[pawn].myBuilding;
            var        buildingPosition = myBuilding.Position;
            Need_Power power            = pawn.needs.TryGetNeed <Need_Power>();

            if (power == null || power.CurLevelPercentage > maxLevelPercentage)
            {
                return(null);
            }

            if (myBuilding.Spawned && myBuilding.Map == pawn.Map && pawn.CanReserveAndReach(myBuilding, PathEndMode.OnCell, Danger.Deadly))
            {
                if (pawn.Position != buildingPosition)
                {
                    return(JobMaker.MakeJob(JobDefOf.Goto, buildingPosition));
                }
                else
                {
                    pawn.Rotation = Rot4.South;
                    if (myBuilding.TryGetComp <CompPowerTrader>().PowerOn)
                    {
                        return(JobMaker.MakeJob(VFEDefOf.VFE_Mechanoids_Recharge, myBuilding));
                    }
                }
            }
            return(JobMaker.MakeJob(JobDefOf.Wait, 300));
        }
コード例 #2
0
        public bool TryAddPawnForModification(Pawn pawn, RecipeDef recipeDef)
        {
            if ((!pawn.IsHacked() || (pawn.IsHacked() && pawn.Faction != Faction.OfPlayer)))
            {
                Bill_Medical bill = new Bill_Medical(recipeDef);
                IEnumerable <BodyPartRecord> bodyparts = RecipeUtility.GetPartsToApplyOn(pawn, bill.recipe);
                if (bodyparts.Count() == 0)
                {
                    return(false);
                }
                if (pawn.health.surgeryBills.FirstShouldDoNow == null || pawn.health.surgeryBills.FirstShouldDoNow.recipe != WTH_DefOf.WTH_HackMechanoid)
                {
                    pawn.health.surgeryBills.AddBill(bill);
                    bill.Part = bodyparts.First();
                }
            }
            Need_Power powerNeed = pawn.needs.TryGetNeed <Need_Power>();

            if (powerNeed != null)
            {
                //discharge mech battery so pawns can work safely.
                powerNeed.CurLevel = 0;
            }

            pawn.jobs.TryTakeOrderedJob(new Job(WTH_DefOf.WTH_Mechanoid_Rest, this));
            if (pawn.jobs.curDriver != null)
            {
                pawn.jobs.posture = PawnPosture.LayingInBed;
            }
            return(true);
        }
コード例 #3
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            var buildingPosition = CompMachine.cachedMachinesPawns[pawn].myBuilding.Position;

            if (pawn.Position != buildingPosition)
            {
                return(JobMaker.MakeJob(JobDefOf.Goto, buildingPosition));
            }
            else
            {
                pawn.Rotation = Rot4.South;
                Need_Power power = pawn.needs.TryGetNeed <Need_Power>();
                if (power == null || power.CurLevelPercentage > maxLevelPercentage)
                {
                    return(null);
                }
                var building = CompMachine.cachedMachinesPawns[pawn].myBuilding;
                if (building.TryGetComp <CompPowerTrader>().PowerOn)
                {
                    return(JobMaker.MakeJob(VFEDefOf.VFE_Mechanoids_Recharge, building));
                }
                else
                {
                    return(JobMaker.MakeJob(JobDefOf.Wait, 300));
                }
            }
        }
コード例 #4
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            Need_Power power = pawn.needs.TryGetNeed <Need_Power>();

            if (power == null || power.CurLevelPercentage > maxLevelPercentage)
            {
                return(null);
            }
            if (pawn.CurJobDef != VFEDefOf.VFE_Mechanoids_Recharge && power.CurCategory <= minCategory)
            {
                return(null);
            }
            var building = CompMachine.cachedMachinesPawns[pawn].myBuilding;

            if (building.Spawned && building.Map == pawn.Map && pawn.CanReserveAndReach(building, PathEndMode.OnCell, Danger.Deadly))
            {
                if (building.TryGetComp <CompPowerTrader>().PowerOn)
                {
                    return(JobMaker.MakeJob(VFEDefOf.VFE_Mechanoids_Recharge, building));
                }
                else if (building.Position != pawn.Position)
                {
                    return(JobMaker.MakeJob(JobDefOf.Goto, building));
                }
            }

            return(null);
        }
コード例 #5
0
        private static IEnumerable <Gizmo> AddHackedPawnGizmos(Pawn __instance, ExtendedDataStorage store)
        {
            ExtendedPawnData pawnData = store.GetExtendedDataFor(__instance);

            yield return(CreateGizmo_SearchAndDestroy(__instance, pawnData));

            Need_Power       powerNeed       = __instance.needs.TryGetNeed <Need_Power>();
            Need_Maintenance maintenanceNeed = __instance.needs.TryGetNeed <Need_Maintenance>();

            if (powerNeed != null)
            {
                yield return(CreateGizmo_AutoRecharge(__instance, powerNeed));
            }
            HediffSet hediffSet = __instance.health.hediffSet;

            if (!__instance.IsColonistPlayerControlled)
            {
                if (__instance.apparel != null)
                {
                    foreach (Gizmo apparelGizmo in __instance.apparel.GetGizmos())
                    {
                        yield return(apparelGizmo);
                    }
                }
            }
            if (__instance.workSettings != null)
            {
                yield return(CreateGizmo_Work(__instance, pawnData));

                if (powerNeed != null)
                {
                    yield return(CreateGizmo_WorkThreshold(__instance, powerNeed));
                }
            }
            if (maintenanceNeed != null)
            {
                yield return(CreateGizmo_MaintenanceThreshold(__instance, maintenanceNeed));
            }
            if (hediffSet.HasHediff(WTH_DefOf.WTH_SelfDestruct))
            {
                yield return(CreateGizmo_SelfDestruct(__instance, pawnData));
            }
            if (hediffSet.HasHediff(WTH_DefOf.WTH_RepairModule))
            {
                yield return(CreateGizmo_SelfRepair(__instance, pawnData));
            }
            if (hediffSet.HasHediff(WTH_DefOf.WTH_RepairModule) && hediffSet.HasHediff(WTH_DefOf.WTH_RepairArm))
            {
                yield return(CreateGizmo_Repair(__instance, pawnData));
            }
            if (hediffSet.HasHediff(WTH_DefOf.WTH_BeltModule))
            {
                yield return(CreateGizmo_EquipBelt(__instance, pawnData));
            }
            if (hediffSet.HasHediff(WTH_DefOf.WTH_OverdriveModule))
            {
                yield return(CreateGizmo_Overdrive(__instance, pawnData));
            }
        }
コード例 #6
0
        private static Gizmo CreateGizmo_SearchAndDestroy(Pawn __instance, ExtendedPawnData pawnData)
        {
            string disabledReason = "";
            bool   disabled       = false;

            if (__instance.Downed)
            {
                disabled       = true;
                disabledReason = "WTH_Reason_MechanoidDowned".Translate();
            }
            else if (pawnData.shouldAutoRecharge)
            {
                Need_Power powerNeed = __instance.needs.TryGetNeed(WTH_DefOf.WTH_Mechanoid_Power) as Need_Power;
                if (powerNeed != null && powerNeed.CurCategory >= PowerCategory.LowPower)
                {
                    disabled       = true;
                    disabledReason = "WTH_Reason_PowerLow".Translate();
                }
            }
            Gizmo gizmo = new Command_Toggle
            {
                defaultLabel   = "WTH_Gizmo_SearchAndDestroy_Label".Translate(),
                defaultDesc    = "WTH_Gizmo_SearchAndDestroy_Description".Translate(),
                disabled       = disabled,
                disabledReason = disabledReason,
                icon           = ContentFinder <Texture2D> .Get(("UI/" + "Enable_SD"), true),
                isActive       = () => pawnData.isActive,
                toggleAction   = () =>
                {
                    pawnData.isActive = !pawnData.isActive;
                    if (pawnData.isActive)
                    {
                        if (__instance.GetLord() == null || __instance.GetLord().LordJob == null)
                        {
                            LordMaker.MakeNewLord(Faction.OfPlayer, new LordJob_SearchAndDestroy(), __instance.Map, new List <Pawn> {
                                __instance
                            });
                        }
                        __instance.jobs.EndCurrentJob(JobCondition.InterruptForced);
                        if (__instance.relations == null) //Added here to fix existing saves.
                        {
                            __instance.relations = new Pawn_RelationsTracker(__instance);
                        }
                    }
                    else
                    {
                        __instance.jobs.EndCurrentJob(JobCondition.InterruptForced);
                        Building_BaseMechanoidPlatform closestAvailablePlatform = Utilities.GetAvailableMechanoidPlatform(__instance, __instance);
                        if (closestAvailablePlatform != null)
                        {
                            Job job = new Job(WTH_DefOf.WTH_Mechanoid_Rest, closestAvailablePlatform);
                            __instance.jobs.TryTakeOrderedJob(job);
                        }
                    }
                }
            };

            return(gizmo);
        }
コード例 #7
0
        public static void SpawnHackedMechanoids(ref List <Pawn> list, IncidentParms parms)
        {
            if (list.Count == 0 || !(parms.raidArrivalMode == PawnsArrivalModeDefOf.EdgeWalkIn))
            {
                return;
            }
            if (parms.faction == Faction.OfMechanoids)
            {
                return;
            }
            Random rand = new Random(DateTime.Now.Millisecond);

            if (rand.Next(0, 100) > Base.hackedMechChance)
            {
                return;
            }

            int   minHackedMechPoints = Math.Min(Base.minHackedMechPoints, Base.maxHackedMechPoints);
            float maxMechPoints       = parms.points * ((float)rand.Next(minHackedMechPoints, Base.maxHackedMechPoints)) / 100; //TODO: no magic numbers
            float cumulativePoints    = 0;
            Map   map = parms.target as Map;

            while (cumulativePoints < maxMechPoints)
            {
                PawnKindDef pawnKindDef = null;
                (from a in DefDatabase <PawnKindDef> .AllDefs
                 where a.RaceProps.IsMechanoid &&
                 cumulativePoints + a.combatPower < maxMechPoints &&
                 Utilities.IsAllowedInModOptions(a.race.defName, parms.faction)
                 //&& IsMountableUtility.isAllowedInModOptions(a.defName)
                 select a).TryRandomElement(out pawnKindDef);

                if (pawnKindDef != null)
                {
                    Pawn    mechanoid = PawnGenerator.GeneratePawn(pawnKindDef, parms.faction);
                    IntVec3 loc       = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, map, 8, null);
                    GenSpawn.Spawn(mechanoid, loc, map, parms.spawnRotation);
                    mechanoid.health.AddHediff(WTH_DefOf.WTH_TargetingHacked);
                    mechanoid.health.AddHediff(WTH_DefOf.WTH_BackupBattery);
                    Need_Power powerNeed = (Need_Power)mechanoid.needs.TryGetNeed(WTH_DefOf.WTH_Mechanoid_Power);
                    powerNeed.CurLevel = powerNeed.MaxLevel;
                    list.Add(mechanoid);
                    cumulativePoints += pawnKindDef.combatPower;
                }
                else
                {
                    break;
                }
            }

            foreach (Pawn pawn in list)
            {
                if (pawn.equipment == null)
                {
                    pawn.equipment = new Pawn_EquipmentTracker(pawn);
                }
            }
        }
コード例 #8
0
        private static Gizmo CreateGizmo_SelfRepair(Pawn __instance, ExtendedPawnData pawnData)
        {
            CompRefuelable          compRefuelable = __instance.GetComp <CompRefuelable>();
            Need_Power              powerNeed      = __instance.needs.TryGetNeed <Need_Power>();
            JobDef                  jobDef         = WTH_DefOf.WTH_Ability_Repair;
            DefModExtension_Ability modExt         = jobDef.GetModExtension <DefModExtension_Ability>();

            bool   alreadyRepairing = __instance.health.hediffSet.HasHediff(WTH_DefOf.WTH_Repairing);
            bool   needsMorePower   = powerNeed.CurLevel < modExt.powerDrain;
            bool   needsMoreFuel    = compRefuelable.Fuel < modExt.fuelDrain;
            bool   notActicated     = !__instance.IsActivated();
            bool   noDamage         = !__instance.health.hediffSet.HasNaturallyHealingInjury();
            bool   isDisabled       = alreadyRepairing || needsMorePower || needsMoreFuel || notActicated || noDamage;
            string disabledReason   = "";

            if (isDisabled)
            {
                if (alreadyRepairing)
                {
                    disabledReason = "WTH_Reason_AlreadyRepairing".Translate();
                }
                else if (notActicated)
                {
                    disabledReason = "WTH_Reason_NotActivated".Translate();
                }
                else if (noDamage)
                {
                    disabledReason = "WTH_Reason_NoDamage".Translate();
                }
                else if (needsMorePower)
                {
                    disabledReason = "WTH_Reason_NeedsMorePower".Translate(new object[] { modExt.powerDrain });
                }
                else if (needsMoreFuel)
                {
                    disabledReason = "WTH_Reason_NeedsMoreFuel".Translate(new object[] { modExt.fuelDrain });
                }
            }

            Gizmo gizmo = new Command_Action
            {
                defaultLabel   = "WTH_Gizmo_SelfRepair_Label".Translate(),
                defaultDesc    = "WTH_Gizmo_SelfRepair_Description".Translate(),
                icon           = ContentFinder <Texture2D> .Get(("Things/" + "Mote_HealingCrossGreen"), true),
                disabled       = isDisabled,
                disabledReason = disabledReason,
                action         = delegate
                {
                    Job job = new Job(WTH_DefOf.WTH_Ability_Repair, __instance);
                    __instance.jobs.StartJob(job, JobCondition.InterruptForced);
                }
            };

            return(gizmo);
        }
コード例 #9
0
        static void Postfix(ref Pawn_JobTracker __instance, ref ThinkResult __result)
        {
            Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>();

            if (!pawn.RaceProps.IsMechanoid)
            {
                return;
            }

            ExtendedDataStorage store = Base.Instance.GetExtendedDataStorage();

            if (store != null)
            {
                //de-activate if should auto recharge and power is very low.
                ExtendedPawnData pawnData  = store.GetExtendedDataFor(pawn);
                Need_Power       powerNeed = pawn.needs.TryGetNeed(WTH_DefOf.WTH_Mechanoid_Power) as Need_Power;
                if (powerNeed != null &&
                    powerNeed.CurCategory >= PowerCategory.LowPower &&
                    pawnData.shouldAutoRecharge &&
                    pawn.IsActivated()
                    )
                {
                    pawn.drafter.Drafted = false;
                    pawnData.isActive    = false;
                }
            }

            if (pawn.Faction == Faction.OfPlayer && pawn.IsHacked() && !pawn.IsActivated() && pawn.OnBaseMechanoidPlatform() && pawn.CanReserve(pawn.CurrentBed()))
            {
                Job job = new Job(WTH_DefOf.WTH_Mechanoid_Rest, pawn.CurrentBed());
                job.count = 1;
                __result  = new ThinkResult(job, __result.SourceNode, __result.Tag, false);
            }

            if (pawn.Downed)
            {
                return;
            }


            if (pawn.IsHacked() && pawn.IsActivated() && pawn.health.hediffSet.HasHediff(WTH_DefOf.WTH_TargetingHackedPoorly))
            {
                HackedPoorlyEvent(pawn);
            }
            if (pawn.Faction == Faction.OfPlayer && pawn.IsHacked() && !pawn.IsActivated() && !pawn.OnBaseMechanoidPlatform() && __result.Job.def != WTH_DefOf.WTH_Mechanoid_Rest)
            {
                Building_BaseMechanoidPlatform closestAvailablePlatform = Utilities.GetAvailableMechanoidPlatform(pawn, pawn);
                if (closestAvailablePlatform != null && pawn.CanReserve(closestAvailablePlatform))
                {
                    Job job = new Job(WTH_DefOf.WTH_Mechanoid_Rest, closestAvailablePlatform);
                    __result = new ThinkResult(job, __result.SourceNode, __result.Tag, false);
                }
            }
        }
コード例 #10
0
        public static bool ShouldRecharge(this Pawn pawn)
        {
            Need_Power powerNeed = pawn.needs.TryGetNeed(WTH_DefOf.WTH_Mechanoid_Power) as Need_Power;

            if (powerNeed != null &&
                powerNeed.CurCategory >= PowerCategory.LowPower &&
                powerNeed.shouldAutoRecharge
                )
            {
                return(true);
            }
            return(false);
        }
コード例 #11
0
ファイル: Pawn.cs プロジェクト: rheirman/WhatTheHack
        private static Gizmo CreateGizmo_Repair(Pawn __instance, ExtendedPawnData pawnData)
        {
            CompRefuelable compRefuelable = __instance.GetComp <CompRefuelable>();
            Need_Power     powerNeed      = __instance.needs.TryGetNeed <Need_Power>();

            JobDef jobDef = WTH_DefOf.WTH_Ability_Repair;
            DefModExtension_Ability modExt = jobDef.GetModExtension <DefModExtension_Ability>();
            bool alreadyRepairing          = __instance.health.hediffSet.HasHediff(WTH_DefOf.WTH_Repairing);
            bool needsMorePower            = powerNeed.CurLevel < modExt.powerDrain;
            bool needsMoreFuel             = compRefuelable.Fuel < modExt.fuelDrain;
            bool notActicated = !__instance.IsActivated();

            bool   isDisabled     = needsMorePower || needsMoreFuel || notActicated;
            string disabledReason = "";

            if (isDisabled)
            {
                if (needsMorePower)
                {
                    disabledReason = "WTH_Reason_NeedsMorePower".Translate(new object[] { modExt.powerDrain });
                }
                else if (needsMoreFuel)
                {
                    disabledReason = "WTH_Reason_NeedsMoreFuel".Translate(new object[] { modExt.fuelDrain });
                }
                else if (notActicated)
                {
                    disabledReason = "WTH_Reason_NotActivated".Translate();
                }
            }

            Gizmo gizmo = new Command_Target
            {
                defaultLabel    = "WTH_Gizmo_Mech_Repair_Label".Translate(),
                defaultDesc     = "WTH_Gizmo_Mech_Repair_Description".Translate(),
                icon            = ContentFinder <Texture2D> .Get(("Things/" + "Mote_HealingCrossBlue"), true), //TODO: other icon
                disabled        = isDisabled,
                targetingParams = GetTargetingParametersForRepairing(),
                disabledReason  = disabledReason,
                action          = delegate(LocalTargetInfo target)
                {
                    if (target.HasThing && target.Thing is Pawn mech)
                    {
                        Job job = new Job(WTH_DefOf.WTH_Ability_Repair, target);
                        __instance.jobs.StartJob(job, JobCondition.InterruptForced);
                    }
                }
            };

            return(gizmo);
        }
コード例 #12
0
        private static void DisableCommandIfMechanoidPowerLow(Pawn_DraftController __instance, Command_Toggle toggleCommand)
        {
            Need_Power          powerNeed = __instance.pawn.needs.TryGetNeed(WTH_DefOf.WTH_Mechanoid_Power) as Need_Power;
            ExtendedDataStorage store     = Base.Instance.GetExtendedDataStorage();

            if (powerNeed != null && store != null)
            {
                ExtendedPawnData pawnData = store.GetExtendedDataFor(__instance.pawn);
                if (pawnData.shouldAutoRecharge && powerNeed.CurCategory >= PowerCategory.LowPower)
                {
                    toggleCommand.Disable("WTH_Reason_PowerLow".Translate());
                }
            }
        }
コード例 #13
0
ファイル: Pawn.cs プロジェクト: marcosfvc/WhatTheHack
        private static void AddHackedPawnGizmos(Pawn __instance, ref List <Gizmo> gizmoList, ExtendedDataStorage store)
        {
            ExtendedPawnData pawnData = store.GetExtendedDataFor(__instance);

            gizmoList.Add(CreateGizmo_SearchAndDestroy(__instance, pawnData));
            Need_Power powerNeed = __instance.needs.TryGetNeed <Need_Power>();

            if (powerNeed != null)
            {
                gizmoList.Add(CreateGizmo_AutoRecharge(__instance, powerNeed));
            }
            HediffSet hediffSet = __instance.health.hediffSet;

            if (!__instance.IsColonistPlayerControlled)
            {
                if (__instance.apparel != null)
                {
                    foreach (Gizmo apparelGizmo in __instance.apparel.GetGizmos())
                    {
                        gizmoList.Add(apparelGizmo);
                    }
                }
            }
            if (__instance.workSettings != null)
            {
                gizmoList.Add(CreateGizmo_Work(__instance, pawnData));
                if (powerNeed != null)
                {
                    gizmoList.Add(CreateGizmo_WorkThreshold(__instance, powerNeed));
                }
            }
            if (hediffSet.HasHediff(WTH_DefOf.WTH_SelfDestruct))
            {
                gizmoList.Add(CreateGizmo_SelfDestruct(__instance, pawnData));
            }
            if (hediffSet.HasHediff(WTH_DefOf.WTH_RepairModule))
            {
                gizmoList.Add(CreateGizmo_SelfRepair(__instance, pawnData));
            }
            if (hediffSet.HasHediff(WTH_DefOf.WTH_RepairModule) && hediffSet.HasHediff(WTH_DefOf.WTH_RepairArm))
            {
                gizmoList.Add(CreateGizmo_Repair(__instance, pawnData));
            }
            if (hediffSet.HasHediff(WTH_DefOf.WTH_BeltModule))
            {
                gizmoList.Add(CreateGizmo_EquipBelt(__instance, pawnData));
            }
        }
コード例 #14
0
        private static Gizmo CreateGizmo_AutoRecharge(Pawn __instance, Need_Power powerNeed)
        {
            Gizmo gizmo = new Command_Toggle
            {
                defaultLabel = "WTH_Gizmo_AutoRecharge_Label".Translate(),
                defaultDesc  = "WTH_Gizmo_AutoRecharge_Description".Translate(),
                icon         = ContentFinder <Texture2D> .Get(("UI/" + "AutoRecharge"), true),
                isActive     = () => powerNeed.shouldAutoRecharge,
                toggleAction = () =>
                {
                    powerNeed.shouldAutoRecharge = !powerNeed.shouldAutoRecharge;
                }
            };

            return(gizmo);
        }
コード例 #15
0
        private static Gizmo CreateGizmo_WorkThreshold(Pawn __instance, Need_Power powerNeed)
        {
            string disabledReason = "";
            bool   disabled       = false;
            Gizmo  gizmo          = new Command_SetWorkThreshold
            {
                powerNeed      = powerNeed,
                defaultLabel   = "WTH_Gizmo_WorkThreshold_Label".Translate(),
                defaultDesc    = "WTH_Gizmo_WorkThreshold_Description".Translate(),
                disabled       = disabled,
                disabledReason = disabledReason,
                icon           = ContentFinder <Texture2D> .Get(("UI/" + "MechanoidWorkThreshold"), true),
            };

            return(gizmo);
        }
コード例 #16
0
        private static Gizmo CreateGizmo_Overdrive(Pawn __instance, ExtendedPawnData pawnData)
        {
            Need_Power powerNeed = __instance.needs.TryGetNeed <Need_Power>();

            JobDef jobDef = WTH_DefOf.WTH_Ability_Overdrive;
            DefModExtension_Ability modExt = jobDef.GetModExtension <DefModExtension_Ability>();
            bool alreadyOverdriving        = __instance.health.hediffSet.HasHediff(WTH_DefOf.WTH_Overdrive);
            bool needsMorePower            = powerNeed.CurLevel < modExt.powerDrain;
            bool notActicated = !__instance.IsActivated();

            bool   isDisabled     = needsMorePower || notActicated || alreadyOverdriving;
            string disabledReason = "";

            if (isDisabled)
            {
                if (alreadyOverdriving)
                {
                    disabledReason = "WTH_Reason_AlreadyOverdriving".Translate();
                }
                else if (needsMorePower)
                {
                    disabledReason = "WTH_Reason_NeedsMorePower".Translate(new object[] { modExt.powerDrain });
                }
                else if (notActicated)
                {
                    disabledReason = "WTH_Reason_NotActivated".Translate();
                }
            }

            Gizmo gizmo = new Command_Action
            {
                defaultLabel   = "WTH_Gizmo_Overdrive_Label".Translate(),
                defaultDesc    = "WTH_Gizmo_Overdrive_Description".Translate(),
                icon           = ContentFinder <Texture2D> .Get(("Things/" + "OverdriveModule"), true),
                disabled       = isDisabled,
                disabledReason = disabledReason,
                action         = delegate
                {
                    Job job = new Job(WTH_DefOf.WTH_Ability_Overdrive, __instance);
                    __instance.jobs.StartJob(job, JobCondition.InterruptForced);
                }
            };

            return(gizmo);
        }
コード例 #17
0
        private static Gizmo CreateGizmo_SelfDestruct(Pawn pawn, ExtendedPawnData pawnData)
        {
            Need_Power powerNeed = pawn.needs.TryGetNeed <Need_Power>();

            float  powerDrain     = 10f;
            bool   needsMorePower = powerNeed.CurLevel < powerDrain;
            bool   notActicated   = !pawn.IsActivated();
            bool   isDisabled     = needsMorePower || notActicated;
            string disabledReason = "";

            if (isDisabled)
            {
                if (notActicated)
                {
                    disabledReason = "WTH_Reason_NotActivated".Translate();
                }
                else if (needsMorePower)
                {
                    disabledReason = "WTH_Reason_NeedsMorePower".Translate(new object[] { powerDrain });
                }
            }

            Gizmo gizmo = new Command_Action
            {
                defaultLabel   = "WTH_Gizmo_SelfDestruct_Label".Translate(),
                defaultDesc    = "WTH_Gizmo_SelfDestruct_Description".Translate(),
                icon           = ContentFinder <Texture2D> .Get(("UI/" + "Detonate"), true),
                disabled       = isDisabled,
                disabledReason = disabledReason,
                action         = delegate
                {
                    Job job = new Job(WTH_DefOf.WTH_Ability, pawn)
                    {
                        count        = 150,
                        playerForced = true
                    };
                    pawn.jobs.StartJob(job, JobCondition.InterruptForced);
                    pawn.jobs.curDriver.AddFinishAction(delegate
                    {
                        if (pawn.jobs.curDriver is JobDriver_Ability jobDriver && !pawn.Dead && jobDriver.finished)
                        {
                            powerNeed.CurLevel       -= powerDrain;
                            pawnData.shouldExplodeNow = true;
                        }
                    });
コード例 #18
0
        public override float GetPriority(Pawn pawn)
        {
            Need_Power power = pawn.needs.TryGetNeed <Need_Power>();

            if (power == null)
            {
                return(0f);
            }
            if ((int)power.CurCategory < (int)minCategory)
            {
                return(0f);
            }
            if (power.CurLevelPercentage > maxLevelPercentage)
            {
                return(0f);
            }
            return(8f);
        }
コード例 #19
0
        public static bool CanStartWorkNow(this Pawn pawn)
        {
            ExtendedDataStorage store = Base.Instance.GetExtendedDataStorage();

            if (store != null)
            {
                Need_Power powerNeed = pawn.needs.TryGetNeed <Need_Power>();
                if (pawn.Downed ||
                    pawn.ShouldRecharge() ||
                    (pawn.OnBaseMechanoidPlatform() && powerNeed.CurLevelPercentage <= powerNeed.canStartWorkThreshold) ||
                    pawn.OnHackingTable())
                {
                    return(false);
                }
                ExtendedPawnData pawnData = store.GetExtendedDataFor(pawn);
                return(pawnData.canWorkNow);
            }
            return(false);
        }
コード例 #20
0
        private static Gizmo CreateGizmo_SelfDestruct(Pawn pawn, ExtendedPawnData pawnData)
        {
            Need_Power powerNeed = pawn.needs.TryGetNeed <Need_Power>();

            JobDef jobDef = WTH_DefOf.WTH_Ability_SelfDestruct;
            DefModExtension_Ability modExt = jobDef.GetModExtension <DefModExtension_Ability>();

            bool   needsMorePower = powerNeed.CurLevel < modExt.powerDrain;
            bool   notActicated   = !pawn.IsActivated();
            bool   isDisabled     = needsMorePower || notActicated;
            string disabledReason = "";

            if (isDisabled)
            {
                if (notActicated)
                {
                    disabledReason = "WTH_Reason_NotActivated".Translate();
                }
                else if (needsMorePower)
                {
                    disabledReason = "WTH_Reason_NeedsMorePower".Translate(new object[] { modExt.powerDrain });
                }
            }

            Gizmo gizmo = new Command_Action
            {
                defaultLabel   = "WTH_Gizmo_SelfDestruct_Label".Translate(),
                defaultDesc    = "WTH_Gizmo_SelfDestruct_Description".Translate(),
                icon           = ContentFinder <Texture2D> .Get(("UI/" + "Detonate"), true),
                disabled       = isDisabled,
                disabledReason = disabledReason,
                action         = delegate
                {
                    Job job = new Job(WTH_DefOf.WTH_Ability_SelfDestruct, pawn);
                    pawn.jobs.StartJob(job, JobCondition.InterruptForced);
                }
            };

            return(gizmo);
        }
コード例 #21
0
        //returns pawns for compatibility reasons.
        public static void SpawnHackedMechanoids(List <Pawn> pawns, IncidentParms parms)
        {
            if (pawns.Count == 0)
            {
                return;
            }
            if (parms.faction == Faction.OfMechanoids)
            {
                return;
            }
            Random rand = new Random(DateTime.Now.Millisecond);

            if (rand.Next(0, 100) > Base.hackedMechChance)
            {
                return;
            }

            int         minHackedMechPoints = Math.Min(Base.minHackedMechPoints, Base.maxHackedMechPoints);
            float       maxMechPoints       = parms.points * ((float)rand.Next(minHackedMechPoints, Base.maxHackedMechPoints)) / 100f; //TODO: no magic numbers
            float       cumulativePoints    = 0;
            Map         map        = parms.target as Map;
            List <Pawn> addedPawns = new List <Pawn>();

            while (cumulativePoints < maxMechPoints)
            {
                PawnKindDef pawnKindDef = null;
                IEnumerable <PawnKindDef> selectedPawns = (from a in DefDatabase <PawnKindDef> .AllDefs
                                                           where a.RaceProps.IsMechanoid &&
                                                           cumulativePoints + a.combatPower < maxMechPoints &&
                                                           Utilities.IsAllowedInModOptions(a.race.defName, parms.faction) &&
                                                           (parms.raidArrivalMode == PawnsArrivalModeDefOf.EdgeWalkIn || a.RaceProps.baseBodySize <= 1) //Only allow small mechs to use drop pods
                                                           select a);

                if (selectedPawns != null)
                {
                    selectedPawns.TryRandomElement(out pawnKindDef);
                }
                if (pawnKindDef != null)
                {
                    Pawn mechanoid = PawnGenerator.GeneratePawn(pawnKindDef, parms.faction);
                    if (parms.raidArrivalMode == PawnsArrivalModeDefOf.EdgeWalkIn)
                    {
                        IntVec3 loc = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, map, 8, null);
                        GenSpawn.Spawn(mechanoid, loc, map, parms.spawnRotation);
                    }
                    mechanoid.health.AddHediff(WTH_DefOf.WTH_TargetingHacked);
                    mechanoid.health.AddHediff(WTH_DefOf.WTH_BackupBattery);
                    Need_Power powerNeed = (Need_Power)mechanoid.needs.TryGetNeed(WTH_DefOf.WTH_Mechanoid_Power);
                    powerNeed.CurLevel = powerNeed.MaxLevel;
                    addedPawns.Add(mechanoid);
                    cumulativePoints += pawnKindDef.combatPower;
                    AddModules(mechanoid);
                }
                else
                {
                    break;
                }
            }
            if (addedPawns.Count > 0 && !addedPawns[0].Spawned)
            {
                parms.raidArrivalMode.Worker.Arrive(addedPawns, parms);
            }
            pawns.AddRange(addedPawns);

            foreach (Pawn pawn in pawns)
            {
                if (pawn.equipment == null)
                {
                    pawn.equipment = new Pawn_EquipmentTracker(pawn);
                }
            }
        }