コード例 #1
0
        public override Job JobOnThing(Pawn pawn, Thing thing, bool forced = false)
        {
            Pawn targetPawn = thing as Pawn;

            //Get closest consumable source we can find.
            Thing closestEnergySource = TryFindBestEnergySource(pawn);

            if (closestEnergySource != null)
            {
                Need_Energy needEnergy = targetPawn.needs.TryGetNeed <Need_Energy>();

                EnergySourceComp energySourceComp = closestEnergySource.TryGetComp <EnergySourceComp>();

                //Consume for pawn.
                int thingCount = (int)Math.Ceiling((needEnergy.MaxLevel - needEnergy.CurLevel) / energySourceComp.EnergyProps.energyWhenConsumed);
                thingCount = Math.Min(thingCount, closestEnergySource.stackCount);

                if (thingCount > 0)
                {
                    return new Job(JobDefOf.ChJAndroidRechargeEnergyComp, new LocalTargetInfo(closestEnergySource), new LocalTargetInfo(targetPawn))
                           {
                               count = thingCount
                           }
                }
                ;
            }

            return(null);
        }
コード例 #2
0
ファイル: EnergySourceComp.cs プロジェクト: kampangs/Androids
        public override IEnumerable <FloatMenuOption> CompFloatMenuOptions(Pawn selPawn)
        {
            Need_Energy energyNeed = selPawn.needs.TryGetNeed <Need_Energy>();

            if (EnergyProps.isConsumable)
            {
                if (energyNeed != null)
                {
                    //Consume for self.
                    int thingCount = (int)Math.Ceiling((energyNeed.MaxLevel - energyNeed.CurLevel) / EnergyProps.energyWhenConsumed);

                    if (thingCount > 0)
                    {
                        FloatMenuOption floatMenuOption = new FloatMenuOption("AndroidConsumeEnergySource".Translate(parent.LabelCap),
                                                                              () => selPawn.jobs.TryTakeOrderedJob(
                                                                                  new Verse.AI.Job(JobDefOf.ChJAndroidRechargeEnergyComp, new LocalTargetInfo(parent))
                        {
                            count = thingCount
                        }),
                                                                              MenuOptionPriority.Default,
                                                                              null,
                                                                              parent);

                        yield return(floatMenuOption);
                    }
                }
            }
        }
コード例 #3
0
        public override void RechargeEnergyNeed(Pawn targetPawn)
        {
            bool isNight = GenLocalDate.DayPercent(targetPawn) < 0.2f || GenLocalDate.DayPercent(targetPawn) > 0.7f;

            if (isNight)
            {
                return;
            }

            if (targetPawn.InContainerEnclosed)
            {
                return;
            }

            if (!targetPawn.IsCaravanMember() && targetPawn.Position.Roofed(targetPawn.Map))
            {
                return;
            }

            Need_Energy energyNeed = targetPawn.needs.TryGetNeed <Need_Energy>();

            if (energyNeed != null)
            {
                energyNeed.CurLevel += EnergyProps.passiveEnergyGeneration;
            }
        }
コード例 #4
0
        public override void PostSpawnSetup(bool respawningAfterLoad)
        {
            pawn = parent as Pawn;

            if (pawn != null)
            {
                energyNeed = pawn.needs.TryGetNeed <Need_Energy>();
            }
        }
コード例 #5
0
        public override void Notify_Starting()
        {
            base.Notify_Starting();

            energyNeed = GetActor().needs.TryGetNeed <Need_Energy>();

            if (startTick == Find.TickManager.TicksGame && TargetThingAIsCarriedOrInInventory())
            {
                isUsedFromInventory = true;
            }
        }
コード例 #6
0
        public override float GetPriority(Pawn pawn)
        {
            Need_Energy energy = pawn.needs.TryGetNeed <Need_Energy>();

            if (energy == null)
            {
                return(0f);
            }

            if (energy.CurLevelPercentage < Need_Energy.rechargePercentage)
            {
                return(11.5f);
            }

            return(0f);
        }
コード例 #7
0
ファイル: EnergySourceComp.cs プロジェクト: kampangs/Androids
        public virtual void RechargeEnergyNeed(Pawn targetPawn)
        {
            Need_Energy energyNeed = targetPawn.needs.TryGetNeed <Need_Energy>();

            if (energyNeed != null)
            {
                if (EnergyProps.isConsumable)
                {
                    float finalEnergyGain = parent.stackCount * EnergyProps.energyWhenConsumed;
                    energyNeed.CurLevel += finalEnergyGain;
                }
                else
                {
                    energyNeed.CurLevel += EnergyProps.passiveEnergyGeneration;
                }
            }
        }
コード例 #8
0
        public override void RechargeEnergyNeed(Pawn targetPawn)
        {
            base.RechargeEnergyNeed(targetPawn);

            //Deduct fuel.
            if (fuelAmountLoaded > 0d)
            {
                fuelAmountLoaded -= FuelUsedPerInterval * FuelUsageModifier();

                //Recharge.
                Need_Energy energyNeed = targetPawn.needs.TryGetNeed <Need_Energy>();

                if (energyNeed != null)
                {
                    energyNeed.CurLevel += EnergyProps.activeEnergyGeneration;
                }
            }

            //Cap fuel amount.
            if (fuelAmountLoaded < 0d)
            {
                fuelAmountLoaded = 0d;
            }

            //Attempt refilling in caravan if possible.
            if (targetPawn.IsCaravanMember() && MissingFuelPercentage > 0.8f)
            {
                Caravan caravan         = targetPawn.GetCaravan();
                Thing   validFuelSource =
                    caravan.Goods.FirstOrDefault(
                        fuelThing => EnergyProps.fuels.Any(req => req.thingDef == fuelThing.def));
                if (validFuelSource != null)
                {
                    int refillAmount = CalculateFuelNeededToRefill(validFuelSource);
                    if (refillAmount > 0)
                    {
                        Thing takenFuel = validFuelSource.SplitOff(refillAmount);
                        if (takenFuel != null)
                        {
                            LoadFuel(takenFuel);
                        }
                    }
                }
            }
        }
コード例 #9
0
        // Token: 0x060000F0 RID: 240 RVA: 0x00009888 File Offset: 0x00007A88
        public override void ApplyOnPawn(Pawn pawn, BodyPartRecord part, Pawn billDoer, List <Thing> ingredients, Bill bill)
        {
            Need_Energy       need_Energy       = pawn.needs.TryGetNeed <Need_Energy>();
            EnergyTrackerComp energyTrackerComp = pawn.TryGetComp <EnergyTrackerComp>();
            bool flag = need_Energy != null;

            if (flag)
            {
                need_Energy.CurLevelPercentage = 0f;
            }
            bool flag2 = energyTrackerComp != null;

            if (flag2)
            {
                energyTrackerComp.energy = 0f;
            }
            ButcherUtility.SpawnDrops(pawn, pawn.Position, pawn.Map);
            pawn.Kill(null, null);
        }
コード例 #10
0
        // Token: 0x06000087 RID: 135 RVA: 0x000056D0 File Offset: 0x000038D0
        public override void RechargeEnergyNeed(Pawn targetPawn)
        {
            bool flag  = GenLocalDate.DayPercent(targetPawn) < 0.2f || GenLocalDate.DayPercent(targetPawn) > 0.7f;
            bool flag2 = flag;

            if (!flag2)
            {
                bool inContainerEnclosed = targetPawn.InContainerEnclosed;
                if (!inContainerEnclosed)
                {
                    bool flag3 = !targetPawn.IsCaravanMember() && targetPawn.Position.Roofed(targetPawn.Map);
                    if (!flag3)
                    {
                        Need_Energy need_Energy = targetPawn.needs.TryGetNeed <Need_Energy>();
                        need_Energy.CurLevel += base.EnergyProps.passiveEnergyGeneration;
                    }
                }
            }
        }
コード例 #11
0
        public override void ApplyOnPawn(Pawn pawn, BodyPartRecord part, Pawn billDoer, List <Thing> ingredients, Bill bill)
        {
            //Set the power Need and EnergyTrackerComp to 0.
            Need_Energy       needEnergy        = pawn.needs.TryGetNeed <Need_Energy>();
            EnergyTrackerComp energyTrackerComp = pawn.TryGetComp <EnergyTrackerComp>();

            if (needEnergy != null)
            {
                needEnergy.CurLevelPercentage = 0f;
            }

            if (energyTrackerComp != null)
            {
                energyTrackerComp.energy = 0f;
            }

            //Spawn extra butcher products.
            ButcherUtility.SpawnDrops(pawn, pawn.Position, pawn.Map);

            pawn.Kill(null);
        }
        // Token: 0x06000028 RID: 40 RVA: 0x00002E68 File Offset: 0x00001068
        public override Job JobOnThing(Pawn pawn, Thing thing, bool forced = false)
        {
            Pawn  pawn2  = thing as Pawn;
            Thing thing2 = this.TryFindBestEnergySource(pawn);
            bool  flag   = thing2 != null;

            if (flag)
            {
                Need_Energy      need_Energy      = pawn2.needs.TryGetNeed <Need_Energy>();
                EnergySourceComp energySourceComp = thing2.TryGetComp <EnergySourceComp>();
                int num = (int)Math.Ceiling((double)((need_Energy.MaxLevel - need_Energy.CurLevel) / energySourceComp.EnergyProps.energyWhenConsumed));
                num = Math.Min(num, thing2.stackCount);
                bool flag2 = num > 0;
                if (flag2)
                {
                    return(new Job(JobDefOf.ChJAndroidRechargeEnergyComp, new LocalTargetInfo(thing2), new LocalTargetInfo(pawn2))
                    {
                        count = num
                    });
                }
            }
            return(null);
        }
コード例 #13
0
        // Token: 0x06000019 RID: 25 RVA: 0x00002430 File Offset: 0x00000630
        public override float GetPriority(Pawn pawn)
        {
            Need_Energy need_Energy = pawn.needs.TryGetNeed <Need_Energy>();
            bool        flag        = need_Energy == null;
            float       result;

            if (flag)
            {
                result = 0f;
            }
            else
            {
                bool flag2 = need_Energy.CurLevelPercentage < Need_Energy.rechargePercentage;
                if (flag2)
                {
                    result = 11.5f;
                }
                else
                {
                    result = 0f;
                }
            }
            return(result);
        }
        // Token: 0x06000027 RID: 39 RVA: 0x00002CB8 File Offset: 0x00000EB8
        public override bool HasJobOnThing(Pawn pawn, Thing thing, bool forced = false)
        {
            bool downed = pawn.Downed;
            bool result;

            if (downed)
            {
                result = false;
            }
            else
            {
                bool flag = thing.IsForbidden(pawn) || !thing.Position.InAllowedArea(pawn);
                if (flag)
                {
                    bool flag2 = !pawn.CanReach(new LocalTargetInfo(thing), PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn);
                    if (flag2)
                    {
                        return(false);
                    }
                }
                bool flag3 = HealthAIUtility.ShouldSeekMedicalRest(pawn);
                if (flag3)
                {
                    result = false;
                }
                else
                {
                    Pawn pawn2 = thing as Pawn;
                    bool flag4 = pawn2 == null;
                    if (flag4)
                    {
                        result = false;
                    }
                    else
                    {
                        bool flag5 = !pawn.CanReserve(new LocalTargetInfo(pawn2), 1, -1, null, false);
                        if (flag5)
                        {
                            result = false;
                        }
                        else
                        {
                            bool?flag6;
                            if (pawn2 == null)
                            {
                                flag6 = null;
                            }
                            else
                            {
                                Faction faction = pawn2.Faction;
                                flag6 = ((faction != null) ? new bool?(!faction.IsPlayer) : null);
                            }
                            bool flag7 = flag6 ?? true;
                            if (flag7)
                            {
                                result = false;
                            }
                            else
                            {
                                bool flag8 = !pawn2.InBed() || !pawn2.Downed;
                                if (flag8)
                                {
                                    result = false;
                                }
                                else
                                {
                                    bool flag9 = !HealthAIUtility.ShouldSeekMedicalRest(pawn2);
                                    if (flag9)
                                    {
                                        result = false;
                                    }
                                    else
                                    {
                                        Need_Energy need_Energy = pawn2.needs.TryGetNeed <Need_Energy>();
                                        bool        flag10      = need_Energy == null;
                                        if (flag10)
                                        {
                                            result = false;
                                        }
                                        else
                                        {
                                            bool flag11 = !forced && need_Energy.CurLevelPercentage > 0.5f;
                                            if (flag11)
                                            {
                                                result = false;
                                            }
                                            else
                                            {
                                                Thing thing2 = this.TryFindBestEnergySource(pawn);
                                                bool  flag12 = thing2 == null;
                                                if (flag12)
                                                {
                                                    result = false;
                                                }
                                                else
                                                {
                                                    bool flag13 = !pawn.CanReserve(new LocalTargetInfo(thing2), 1, -1, null, false);
                                                    result = !flag13;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return(result);
        }
コード例 #15
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (pawn.Downed)
            {
                return(null);
            }

            Need_Energy energy = pawn.needs.TryGetNeed <Need_Energy>();

            if (energy == null)
            {
                return(null);
            }

            if (energy.CurLevelPercentage >= Need_Energy.rechargePercentage)
            {
                return(null);
            }

            if (Find.TickManager.TicksGame < GetLastTryTick(pawn) + 2500)
            {
                return(null);
            }
            SetLastTryTick(pawn, Find.TickManager.TicksGame);

            //See if we got a nearby powernet to tap into.
            Thing closestPowerSource = EnergyNeedUtility.ClosestPowerSource(pawn);

            if (closestPowerSource != null)
            {
                Building building = closestPowerSource as Building;
                if (closestPowerSource != null && building != null && building.PowerComp != null && building.PowerComp.PowerNet.CurrentStoredEnergy() > 50f)
                {
                    //Find a suitable spot to drain from.
                    IntVec3 drainSpot = closestPowerSource.Position;

                    //Give out job to go out and tap it.
                    if (drainSpot.Walkable(pawn.Map) && drainSpot.InAllowedArea(pawn) && pawn.CanReserve(new LocalTargetInfo(drainSpot)) && pawn.CanReach(drainSpot, PathEndMode.OnCell, Danger.Deadly))
                    {
                        return(new Job(JobDefOf.ChJAndroidRecharge, closestPowerSource));
                    }

                    //Check surrounding cells.
                    foreach (IntVec3 adjCell in GenAdj.CellsAdjacentCardinal(building).OrderByDescending(selector => selector.DistanceTo(pawn.Position)))
                    {
                        if (adjCell.Walkable(pawn.Map) && adjCell.InAllowedArea(pawn) && pawn.CanReserve(new LocalTargetInfo(adjCell)) && pawn.CanReach(adjCell, PathEndMode.OnCell, Danger.Deadly))
                        {
                            return(new Job(JobDefOf.ChJAndroidRecharge, closestPowerSource, adjCell));
                        }
                    }
                }
            }

            //No power source? Try looking for a consumable resource.

            //In the inventory. (Or being carried)
            if (pawn.carryTracker is Pawn_CarryTracker carryTracker && carryTracker.CarriedThing is Thing carriedThing && carriedThing.TryGetComp <EnergySourceComp>() is EnergySourceComp carriedThingComp && carriedThingComp.EnergyProps.isConsumable)
            {
                if (carriedThing.stackCount > 0)
                {
                    return(new Job(JobDefOf.ChJAndroidRechargeEnergyComp, new LocalTargetInfo(carriedThing))
                    {
                        count = carriedThing.stackCount
                    });
                }
            }
            if (pawn.inventory is Pawn_InventoryTracker inventory && inventory.innerContainer.Any(thing => thing.TryGetComp <EnergySourceComp>() is EnergySourceComp comp && comp.EnergyProps.isConsumable))
            {
                Thing validEnergySource =
                    inventory.innerContainer.FirstOrDefault(
                        thing =>
                        thing.TryGetComp <EnergySourceComp>() is EnergySourceComp energySource &&
                        energySource.EnergyProps.isConsumable
                        );
                if (validEnergySource != null)
                {
                    //Use enough to get satisfied.
                    EnergySourceComp energySourceComp = validEnergySource.TryGetComp <EnergySourceComp>();

                    int thingCount = (int)Math.Ceiling((energy.MaxLevel - energy.CurLevel) / energySourceComp.EnergyProps.energyWhenConsumed);
                    thingCount = Math.Min(thingCount, validEnergySource.stackCount);

                    if (thingCount > 0)
                    {
                        return(new Job(JobDefOf.ChJAndroidRechargeEnergyComp, new LocalTargetInfo(validEnergySource))
                        {
                            count = thingCount
                        });
                    }
                }
            }

            //On the map.
            Thing closestConsumablePowerSource =
                GenClosest.ClosestThingReachable(
                    pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.HaulableEver), PathEndMode.OnCell, TraverseParms.For(pawn), 9999f,
                    thing => thing.TryGetComp <EnergySourceComp>() != null && !thing.IsForbidden(pawn) && pawn.CanReserve(new LocalTargetInfo(thing)) && thing.Position.InAllowedArea(pawn) && pawn.CanReach(new LocalTargetInfo(thing), PathEndMode.OnCell, Danger.Deadly));

            if (closestConsumablePowerSource != null)
            {
                EnergySourceComp energySourceComp = closestConsumablePowerSource.TryGetComp <EnergySourceComp>();
                if (energySourceComp != null)
                {
                    int thingCount = (int)Math.Ceiling((energy.MaxLevel - energy.CurLevel) / energySourceComp.EnergyProps.energyWhenConsumed);
                    if (thingCount > 0)
                    {
                        return(new Job(JobDefOf.ChJAndroidRechargeEnergyComp, new LocalTargetInfo(closestConsumablePowerSource))
                        {
                            count = thingCount
                        });
                    }
                }
            }

            return(null);
        }
コード例 #16
0
        public override void Notify_Starting()
        {
            base.Notify_Starting();

            energyNeed = GetActor().needs.TryGetNeed <Need_Energy>();
        }
コード例 #17
0
        public override bool HasJobOnThing(Pawn pawn, Thing thing, bool forced = false)
        {
            if (pawn.Downed)
            {
                return(false);
            }

            if (thing.IsForbidden(pawn) || !thing.Position.InAllowedArea(pawn))
            {
                if (!pawn.CanReach(new LocalTargetInfo(thing), PathEndMode.ClosestTouch, Danger.Deadly))
                {
                    return(false);
                }
            }

            if (HealthAIUtility.ShouldSeekMedicalRest(pawn))
            {
                return(false);
            }

            Pawn targetPawn = thing as Pawn;

            if (targetPawn == null)
            {
                return(false);
            }

            if (!pawn.CanReserve(new LocalTargetInfo(targetPawn)))
            {
                return(false);
            }

            if (!targetPawn?.Faction?.IsPlayer ?? true)
            {
                return(false);
            }

            if (/*!targetPawn.InBed() || */ !targetPawn.Downed)
            {
                return(false);
            }

            if (!HealthAIUtility.ShouldSeekMedicalRest(targetPawn))
            {
                return(false);
            }

            Need_Energy needEnergy = targetPawn.needs.TryGetNeed <Need_Energy>();

            if (needEnergy == null)
            {
                return(false);
            }

            if (!forced && needEnergy.CurLevelPercentage > 0.5f)
            {
                return(false);
            }

            Thing closestEnergySource = TryFindBestEnergySource(pawn);

            if (closestEnergySource == null)
            {
                return(false);
            }

            if (closestEnergySource.Spawned && !pawn.CanReserve(new LocalTargetInfo(closestEnergySource)))
            {
                return(false);
            }

            return(true);
        }
コード例 #18
0
        // Token: 0x0600001A RID: 26 RVA: 0x0000247C File Offset: 0x0000067C
        protected override Job TryGiveJob(Pawn pawn)
        {
            bool downed = pawn.Downed;
            Job  result;

            if (downed)
            {
                result = null;
            }
            else
            {
                Need_Energy need_Energy = pawn.needs.TryGetNeed <Need_Energy>();
                bool        flag        = need_Energy == null;
                if (flag)
                {
                    result = null;
                }
                else
                {
                    bool flag2 = need_Energy.CurLevelPercentage >= Need_Energy.rechargePercentage;
                    if (flag2)
                    {
                        result = null;
                    }
                    else
                    {
                        Thing thing3 = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.BuildingArtificial), PathEndMode.ClosestTouch, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, (Thing thing) => this.BestClosestPowerSource(pawn, thing), null, 0, -1, false, RegionType.Set_Passable, false);
                        bool  flag3  = thing3 != null;
                        if (flag3)
                        {
                            Building building = thing3 as Building;
                            bool     flag4    = thing3 != null && building != null && building.PowerComp != null && building.PowerComp.PowerNet.CurrentStoredEnergy() > 50f;
                            if (flag4)
                            {
                                IntVec3 position = thing3.Position;
                                bool    flag5    = position.Walkable(pawn.Map) && position.InAllowedArea(pawn) && pawn.CanReserve(new LocalTargetInfo(position), 1, -1, null, false) && pawn.CanReach(position, PathEndMode.OnCell, Danger.Deadly, false, TraverseMode.ByPawn);
                                if (flag5)
                                {
                                    return(new Job(JobDefOf.ChJAndroidRecharge, thing3));
                                }
                                IEnumerable <IntVec3> source = GenAdj.CellsAdjacentCardinal(building);
                                Func <IntVec3, float> < > 9__1;
                                Func <IntVec3, float> keySelector;
                                if ((keySelector = < > 9__1) == null)
                                {
                                    keySelector = (< > 9__1 = ((IntVec3 selector) => selector.DistanceTo(pawn.Position)));
                                }
                                foreach (IntVec3 intVec in source.OrderByDescending(keySelector))
                                {
                                    bool flag6 = intVec.Walkable(pawn.Map) && intVec.InAllowedArea(pawn) && pawn.CanReserve(new LocalTargetInfo(intVec), 1, -1, null, false) && pawn.CanReach(intVec, PathEndMode.OnCell, Danger.Deadly, false, TraverseMode.ByPawn);
                                    if (flag6)
                                    {
                                        return(new Job(JobDefOf.ChJAndroidRecharge, thing3, intVec));
                                    }
                                }
                            }
                        }
                        Thing thing2 = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.HaulableEver), PathEndMode.ClosestTouch, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, (Thing thing) => thing.TryGetComp <EnergySourceComp>() != null && !thing.IsForbidden(pawn) && pawn.CanReserve(new LocalTargetInfo(thing), 1, -1, null, false) && thing.Position.InAllowedArea(pawn) && pawn.CanReach(new LocalTargetInfo(thing), PathEndMode.OnCell, Danger.Deadly, false, TraverseMode.ByPawn), null, 0, -1, false, RegionType.Set_Passable, false);
                        bool  flag7  = thing2 != null;
                        if (flag7)
                        {
                            EnergySourceComp energySourceComp = thing2.TryGetComp <EnergySourceComp>();
                            bool             flag8            = energySourceComp != null;
                            if (flag8)
                            {
                                int  num   = (int)Math.Ceiling((double)((need_Energy.MaxLevel - need_Energy.CurLevel) / energySourceComp.EnergyProps.energyWhenConsumed));
                                bool flag9 = num > 0;
                                if (flag9)
                                {
                                    return(new Job(JobDefOf.ChJAndroidRechargeEnergyComp, new LocalTargetInfo(thing2))
                                    {
                                        count = num
                                    });
                                }
                            }
                        }
                        result = null;
                    }
                }
            }
            return(result);
        }