public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            Building_TMPortal          portal          = t as Building_TMPortal;
            Building_TMArcaneCapacitor arcaneCapacitor = t as Building_TMArcaneCapacitor;
            Building_TM_DMP            dmp             = t as Building_TM_DMP;
            CompAbilityUserMagic       comp            = pawn.GetComp <CompAbilityUserMagic>();

            if (comp != null && portal != null && comp.IsMagicUser && comp.Mana.CurLevelPercentage >= .7f && portal.IsPaired && portal.ArcaneEnergyCur < .7f)
            {
                if (pawn != null && pawn.RaceProps.Humanlike && pawn.workSettings.WorkIsActive(TorannMagicDefOf.TM_Magic) && pawn.health.capacities.GetLevel(TorannMagicDefOf.MagicManipulation) > 0 && pawn.IsColonist && pawn.Awake() && !pawn.Drafted && !pawn.Downed && pawn.CanReserveAndReach(portal, PathEndMode.InteractionCell, Danger.Some))
                {
                    return(true);
                }
            }
            if (comp != null && arcaneCapacitor != null && comp.IsMagicUser && comp.Mana.CurLevelPercentage >= .9f && arcaneCapacitor.ArcaneEnergyCur < arcaneCapacitor.TargetArcaneEnergyPct && arcaneCapacitor.CapacitorIsOn)
            {
                if (pawn != null && pawn.RaceProps.Humanlike && pawn.workSettings.WorkIsActive(TorannMagicDefOf.TM_Magic) && pawn.health.capacities.GetLevel(TorannMagicDefOf.MagicManipulation) > 0 && pawn.IsColonist && pawn.Awake() && !pawn.Drafted && !pawn.Downed && pawn.CanReserveAndReach(arcaneCapacitor, PathEndMode.InteractionCell, Danger.Some))
                {
                    return(true);
                }
            }
            if (comp != null && dmp != null && comp.IsMagicUser && comp.Mana.CurLevelPercentage >= .9f && dmp.ArcaneEnergyCur < dmp.TargetArcaneEnergyPct && dmp.IsOn)
            {
                if (pawn != null && pawn.RaceProps.Humanlike && pawn.workSettings.WorkIsActive(TorannMagicDefOf.TM_Magic) && pawn.health.capacities.GetLevel(TorannMagicDefOf.MagicManipulation) > 0 && pawn.IsColonist && pawn.Awake() && !pawn.Drafted && !pawn.Downed && pawn.CanReserveAndReach(dmp, PathEndMode.InteractionCell, Danger.Some))
                {
                    return(true);
                }
            }
            return(false);
        }
示例#2
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            this.FailOnDestroyedOrNull(building);
            Toil reserveTargetA = Toils_Reserve.Reserve(building);

            yield return(reserveTargetA);

            comp            = this.pawn.GetComp <CompAbilityUserMagic>();
            portalBldg      = TargetA.Thing as Building_TMPortal;
            arcaneCapacitor = TargetA.Thing as Building_TMArcaneCapacitor;
            dmp             = TargetA.Thing as Building_TM_DMP;
            bldg            = TargetA.Thing as Building;

            Toil gotoPortal = new Toil()
            {
                initAction = () =>
                {
                    //pawn.pather.StartPath(portalBldg.InteractionCell, PathEndMode.OnCell);
                    if (pawn.pather != null && bldg.InteractionCell != null)
                    {
                        pawn.pather.StartPath(bldg.InteractionCell, PathEndMode.OnCell);
                    }
                },
                defaultCompleteMode = ToilCompleteMode.PatherArrival
            };

            yield return(gotoPortal);

            Toil chargePortal = new Toil()
            {
                initAction = () =>
                {
                    if (age > duration)
                    {
                        this.EndJobWith(JobCondition.Succeeded);
                    }
                    if (comp != null && comp.Mana != null && comp.Mana.CurLevel < .01f)
                    {
                        this.EndJobWith(JobCondition.Succeeded);
                    }
                    else if (bldg.def.defName == "TM_DimensionalManaPocket")
                    {
                        this.duration = 220;
                    }
                },
                tickAction = () =>
                {
                    if (age > (effectsAge + ticksTillEffects))
                    {
                        this.effectsAge = this.age;
                        TM_MoteMaker.ThrowCastingMote(pawn.DrawPos, pawn.Map, Rand.Range(1.2f, 2f));
                        Vector3 moteDirection = TM_Calc.GetVector(this.pawn.Position, bldg.Position);
                        TM_MoteMaker.ThrowGenericMote(TorannMagicDefOf.Mote_Shadow, pawn.DrawPos, pawn.Map, Rand.Range(.4f, .6f), Rand.Range(.1f, .2f), .04f, Rand.Range(.1f, .2f), 300, 5f, (Quaternion.AngleAxis(90, Vector3.up) * moteDirection).ToAngleFlat(), 0);
                    }
                    if (age > (chargeAge + ticksTillCharge))
                    {
                        if (bldg.def.defName == "TM_Portal")
                        {
                            comp.Mana.CurLevel         -= .01f;
                            portalBldg.ArcaneEnergyCur += .01f;
                            xpNum += 3;
                        }
                        else if (bldg.def.defName == "TM_ArcaneCapacitor")
                        {
                            comp.Mana.CurLevel -= .01f;
                            arcaneCapacitor.ArcaneEnergyCur += 1f;
                        }
                        else if (bldg.def.defName == "TM_DimensionalManaPocket")
                        {
                            comp.Mana.CurLevel  -= .05f;
                            dmp.ArcaneEnergyCur += 4f;
                            age += 4;
                        }
                        else
                        {
                            age = duration;
                        }
                        chargeAge = age;
                    }
                    age++;
                    if (age > duration)
                    {
                        AttributeXP(comp);
                        this.EndJobWith(JobCondition.Succeeded);
                    }
                    if (comp.Mana.CurLevel < .1f)
                    {
                        AttributeXP(comp);
                        this.EndJobWith(JobCondition.Succeeded);
                    }
                    if (comp.Mana.CurLevel < .05f && bldg.def.defName == "TM_DimensionalManaPocket")
                    {
                        //AttributeXP(comp);
                        this.EndJobWith(JobCondition.Succeeded);
                    }
                    if (portalBldg != null && portalBldg.ArcaneEnergyCur >= 1f)
                    {
                        AttributeXP(comp);
                        this.EndJobWith(JobCondition.Succeeded);
                    }
                    if (arcaneCapacitor != null && arcaneCapacitor.ArcaneEnergyCur >= arcaneCapacitor.TargetArcaneEnergyPct)
                    {
                        //AttributeXP(comp);
                        this.EndJobWith(JobCondition.Succeeded);
                    }
                    if (dmp != null && dmp.ArcaneEnergyCur >= dmp.TargetArcaneEnergyPct)
                    {
                        //AttributeXP(comp);
                        this.EndJobWith(JobCondition.Succeeded);
                    }
                },
                defaultCompleteMode = ToilCompleteMode.Never
            };

            yield return(chargePortal);
        }
示例#3
0
        public override void DrawGhost(ThingDef def, IntVec3 center, Rot4 rot, Color ghostCol, Thing thing = null)
        {
            Map visibleMap = Find.CurrentMap;

            GenDraw.DrawFieldEdges(Building_TM_DMP.PortableCellsAround(center, visibleMap));
        }