示例#1
0
        public void PerformChannelingTreatment()
        {
            this.channelingTicksCounter++;

            if (this.channelingTicksCounter == 1)
            {
                Find.WeatherManager.TransitionTo(Util_MechanoidTerraformer.TerraformingThunderstormDef);
            }
            else if ((this.channelingTicksCounter >= channelingWithoutStrikesTicks) &&
                     (this.channelingTicksCounter < channelingWithoutStrikesTicks + channelingWithStrikesTicks))
            {
                if (Rand.Value < chanceToStrikePerTick)
                {
                    IntVec3 strikePosition = new IntVec3();
                    if (Rand.Value < 0.5f)
                    {
                        // Strike on a nearby pawn.
                        List <Pawn> nearbyPawns = new List <Pawn>();
                        foreach (Pawn pawn in Find.ListerPawns.AllPawns)
                        {
                            if (pawn.Position.InHorDistOf(base.forcedTarget.Cell, this.areaOfEffectRadius))
                            {
                                nearbyPawns.Add(pawn);
                            }
                        }
                        if (nearbyPawns.Count > 0)
                        {
                            strikePosition = nearbyPawns.RandomElement <Pawn>().Position;
                            WeatherEvent_LightningStrike lightningStrike = new WeatherEvent_LightningStrike(strikePosition);
                            Find.WeatherManager.eventHandler.AddEvent(lightningStrike);
                        }
                    }
                    else
                    {
                        Predicate <IntVec3> validator = (IntVec3 cell) =>
                                                        cell.Walkable() &&
                                                        (Find.RoofGrid.Roofed(cell) == false) &&
                                                        cell.InHorDistOf(base.forcedTarget.Cell, this.def.building.turretGunDef.Verbs[0].projectileDef.projectile.explosionRadius);
                        strikePosition = CellFinderLoose.RandomCellWith(validator);
                        WeatherEvent_LightningStrike lightningStrike = new WeatherEvent_LightningStrike(strikePosition);
                        Find.WeatherManager.eventHandler.AddEvent(lightningStrike);
                    }
                }
            }
            else if (this.channelingTicksCounter == channelingWithoutStrikesTicks + channelingWithStrikesTicks)
            {
                Find.WeatherManager.TransitionTo(WeatherDef.Named("Clear"));
            }
            else if (this.channelingTicksCounter == 2 * channelingWithoutStrikesTicks + channelingWithStrikesTicks)
            {
                this.charge = 0;
                this.channelingTicksCounter = 0;
                this.skywrathState          = SkywrathState.Charging;
            }
        }
示例#2
0
        // ===================== Main treatments functions =====================

        public override void Tick()
        {
            // Redo the base tick treatment to avoid ticking the fake turret gun's verb.
            base.powerComp.CompTick();
            base.mannableComp.CompTick();
            this.explosiveComp.CompTick();
            this.stunner.StunHandlerTick();

            if (this.stunner.Stunned)
            {
                return;
            }

            if ((base.powerComp.PowerOn == false) ||
                base.stunner.Stunned)
            {
                this.skywrathState = SkywrathState.Offline;
            }
            else
            {
                switch (this.skywrathState)
                {
                case SkywrathState.Offline:
                    this.powerComp.powerOutputInt = this.powerOutputDuringCharge;
                    this.skywrathState            = SkywrathState.Charging;
                    break;

                case SkywrathState.Charging:
                    this.charge++;
                    this.powerComp.powerOutputInt = this.powerOutputDuringCharge;
                    if (this.charge >= chargeTargetValue)
                    {
                        this.charge        = chargeTargetValue;
                        this.skywrathState = SkywrathState.Ready;
                    }
                    break;

                case SkywrathState.Ready:
                    this.powerComp.powerOutputInt = this.powerOutputDuringCharge / 5f;
                    // Wait for an attack order.
                    break;

                case SkywrathState.Channeling:
                    this.powerComp.powerOutputInt = this.powerOutputDuringCharge / 5f;
                    PerformChannelingTreatment();
                    break;
                }
            }
        }
示例#3
0
        // ===================== Interraction functions =====================

        public override void OrderAttack(TargetInfo targ)
        {
            if (this.skywrathState != SkywrathState.Ready)
            {
                Messages.Message("The skywrath controller is not ready.", MessageSound.RejectInput);
                return;
            }
            if (Find.FogGrid.IsFogged(targ.Cell))
            {
                Messages.Message("Cannot target a fogged position.", MessageSound.RejectInput);
                return;
            }
            if (this.mannableComp.MannedNow)
            {
                Pawn supervizor = this.mannableComp.ManningPawn;
                if (supervizor.skills.GetSkill(SkillDefOf.Research).TotallyDisabled ||
                    (supervizor.skills.GetSkill(SkillDefOf.Research).level < 10))
                {
                    Messages.Message("The skywrath controller is not supervized by a skilled scientist (level 10 research).", MessageSound.RejectInput);
                    return;
                }
            }
            else
            {
                Messages.Message("The skywrath controller is not supervized.", MessageSound.RejectInput);
                return;
            }
            if ((targ.Cell - this.Position).LengthHorizontal < this.GunCompEq.PrimaryVerb.verbProps.minRange)
            {
                Messages.Message("MessageTargetBelowMinimumRange".Translate(), MessageSound.Silent);
                return;
            }
            if ((targ.Cell - base.Position).LengthHorizontal > this.GunCompEq.PrimaryVerb.verbProps.range)
            {
                Messages.Message("MessageTargetBeyondMaximumRange".Translate(), MessageSound.Silent);
                return;
            }
            base.forcedTarget  = targ;
            this.skywrathState = SkywrathState.Channeling;
        }
示例#4
0
        public string GetStateAsString(SkywrathState state)
        {
            string stateAsString = "";

            switch (state)
            {
            case SkywrathState.Offline:
                stateAsString = "offline";
                break;

            case SkywrathState.Charging:
                stateAsString = "charging";
                break;

            case SkywrathState.Ready:
                stateAsString = "ready";
                break;

            case SkywrathState.Channeling:
                stateAsString = "channeling";
                break;
            }
            return(stateAsString);
        }
        // ===================== Main treatments functions =====================

        public override void Tick()
        {
            // Redo the base tick treatment to avoid ticking the fake turret gun's verb.
            base.powerComp.CompTick();
            base.mannableComp.CompTick();
            this.explosiveComp.CompTick();
            this.stunner.StunHandlerTick();

            if (this.stunner.Stunned)
            {
                return;
            }

            if ((base.powerComp.PowerOn == false)
                || base.stunner.Stunned)
            {
                this.skywrathState = SkywrathState.Offline;
            }
            else
            {
                switch (this.skywrathState)
                {
                    case SkywrathState.Offline:
                        this.powerComp.powerOutputInt = this.powerOutputDuringCharge;
                        this.skywrathState = SkywrathState.Charging;
                        break;
                    case SkywrathState.Charging:
                        this.charge++;
                        this.powerComp.powerOutputInt = this.powerOutputDuringCharge;
                        if (this.charge >= chargeTargetValue)
                        {
                            this.charge = chargeTargetValue;
                            this.skywrathState = SkywrathState.Ready;
                        }
                        break;
                    case SkywrathState.Ready:
                        this.powerComp.powerOutputInt = this.powerOutputDuringCharge / 5f;
                        // Wait for an attack order.
                        break;
                    case SkywrathState.Channeling:
                        this.powerComp.powerOutputInt = this.powerOutputDuringCharge / 5f;
                        PerformChannelingTreatment();
                        break;
                }
            }
        }
        public string GetStateAsString(SkywrathState state)
        {
            string stateAsString = "";

            switch (state)
            {
                case SkywrathState.Offline:
                    stateAsString = "offline";
                    break;
                case SkywrathState.Charging:
                    stateAsString = "charging";
                    break;
                case SkywrathState.Ready:
                    stateAsString = "ready";
                    break;
                case SkywrathState.Channeling:
                    stateAsString = "channeling";
                    break;
            }
            return stateAsString;
        }
        // ===================== Interraction functions =====================

        public override void OrderAttack(TargetInfo targ)
        {
            if (this.skywrathState != SkywrathState.Ready)
            {
                Messages.Message("The skywrath controller is not ready.", MessageSound.RejectInput);
                return;
            }
            if (Find.FogGrid.IsFogged(targ.Cell))
            {
                Messages.Message("Cannot target a fogged position.", MessageSound.RejectInput);
                return;
            }
            if (this.mannableComp.MannedNow)
            {
                Pawn supervizor = this.mannableComp.ManningPawn;
                if (supervizor.skills.GetSkill(SkillDefOf.Research).TotallyDisabled
                    || (supervizor.skills.GetSkill(SkillDefOf.Research).level < 10))
                {
                    Messages.Message("The skywrath controller is not supervized by a skilled scientist (level 10 research).", MessageSound.RejectInput);
                    return;
                }
            }
            else
            {
                Messages.Message("The skywrath controller is not supervized.", MessageSound.RejectInput);
                return;
            }
            if ((targ.Cell - this.Position).LengthHorizontal < this.GunCompEq.PrimaryVerb.verbProps.minRange)
            {
                Messages.Message("MessageTargetBelowMinimumRange".Translate(), MessageSound.Silent);
                return;
            }
            if ((targ.Cell - base.Position).LengthHorizontal > this.GunCompEq.PrimaryVerb.verbProps.range)
            {
                Messages.Message("MessageTargetBeyondMaximumRange".Translate(), MessageSound.Silent);
                return;
            }
            base.forcedTarget = targ;
            this.skywrathState = SkywrathState.Channeling;
        }
        public void PerformChannelingTreatment()
        {
            this.channelingTicksCounter++;

            if (this.channelingTicksCounter == 1)
            {
                Find.WeatherManager.TransitionTo(Util_MechanoidTerraformer.TerraformingThunderstormDef);
            }
            else if ((this.channelingTicksCounter >= channelingWithoutStrikesTicks)
                && (this.channelingTicksCounter < channelingWithoutStrikesTicks + channelingWithStrikesTicks))
            {
                if (Rand.Value < chanceToStrikePerTick)
                {
                    IntVec3 strikePosition = new IntVec3();
                    if (Rand.Value < 0.5f)
                    {
                        // Strike on a nearby pawn.
                        List<Pawn> nearbyPawns = new List<Pawn>();
                        foreach (Pawn pawn in Find.ListerPawns.AllPawns)
                        {
                            if (pawn.Position.InHorDistOf(base.forcedTarget.Cell, this.areaOfEffectRadius))
                            {
                                nearbyPawns.Add(pawn);
                            }
                        }
                        if (nearbyPawns.Count > 0)
                        {
                            strikePosition = nearbyPawns.RandomElement<Pawn>().Position;
                            WeatherEvent_LightningStrike lightningStrike = new WeatherEvent_LightningStrike(strikePosition);
                            Find.WeatherManager.eventHandler.AddEvent(lightningStrike);
                        }
                    }
                    else
                    {
                        Predicate<IntVec3> validator = (IntVec3 cell) =>
                            cell.Walkable()
                            && (Find.RoofGrid.Roofed(cell) == false)
                            && cell.InHorDistOf(base.forcedTarget.Cell, this.def.building.turretGunDef.Verbs[0].projectileDef.projectile.explosionRadius);
                        strikePosition = CellFinderLoose.RandomCellWith(validator);
                        WeatherEvent_LightningStrike lightningStrike = new WeatherEvent_LightningStrike(strikePosition);
                        Find.WeatherManager.eventHandler.AddEvent(lightningStrike);
                    }
                }
            }
            else if (this.channelingTicksCounter == channelingWithoutStrikesTicks + channelingWithStrikesTicks)
            {
                Find.WeatherManager.TransitionTo(WeatherDef.Named("Clear"));
            }
            else if (this.channelingTicksCounter == 2 * channelingWithoutStrikesTicks + channelingWithStrikesTicks)
            {
                this.charge = 0;
                this.channelingTicksCounter = 0;
                this.skywrathState = SkywrathState.Charging;
            }
        }