예제 #1
0
        private void DoEvent()
        {
            IntVec3 rndTarg = new IntVec3(Rand.Range(16, this.SingleMap.Size.x - 16), 0, Rand.Range(16, this.SingleMap.Size.z - 16));

            if (Rand.Chance(.1f * eventDifficulty))
            {
                rndTarg = FindEnemyPawnOrBuilding(rndTarg);
            }
            IntVec3 rndPos   = rndTarg;
            int     accuracy = 5 - eventDifficulty;

            rndPos.x += Rand.Range(-accuracy, accuracy);
            rndPos.z += Rand.Range(-accuracy, accuracy);
            if (rndPos.IsValid && rndPos.InBounds(this.SingleMap) && rndPos.DistanceToEdge(this.SingleMap) > 6)
            {
                if (eventDifficulty > 2 && Rand.Chance(eventDifficulty * .05f))
                {
                    SkyfallerMaker.SpawnSkyfaller(TorannMagicDefOf.TM_Firestorm_Large, rndPos, this.SingleMap);
                }
                else if (eventDifficulty > 1 && Rand.Chance(eventDifficulty * .1f))
                {
                    SkyfallerMaker.SpawnSkyfaller(TorannMagicDefOf.TM_Firestorm_Small, rndPos, this.SingleMap);
                }
                else
                {
                    SkyfallerMaker.SpawnSkyfaller(TorannMagicDefOf.TM_Firestorm_Tiny, rndPos, this.SingleMap);
                }
            }
        }
예제 #2
0
        private void StartChargeAttack(IntVec3 t)
        {
            this.nextChargeAttack = this.Props.chargeCooldownTicks + Find.TickManager.TicksGame;
            bool flag = t != null && t.DistanceToEdge(this.Pawn.Map) > 6;

            if (flag && t.InBounds(this.Pawn.Map) && t.IsValid && t.Walkable(this.Pawn.Map) && Pawn.Position.DistanceTo(t) <= 60)
            {
                this.castingCompleteTick = Find.TickManager.TicksGame + this.Props.chargeAttackDelay;
                this.flightTarget        = t;
                TM_Action.PawnActionDelay(this.Pawn, this.Props.chargeAttackDelay, t, this.Pawn.meleeVerbs.TryGetMeleeVerb(this.rangedTarget.Thing));
            }
            else
            {
                this.flightTarget = null;
            }
        }
예제 #3
0
        private bool IsGoodLocationForStrike(IntVec3 loc)
        {
            bool flag1 = loc.InBounds(base.Map);
            bool flag2 = loc.IsValid;
            bool flag3 = !loc.Fogged(base.Map);
            bool flag4 = loc.DistanceToEdge(base.Map) > 2;

            if (flag1 && flag2 && flag3 && flag4)
            {
                if (loc.Roofed(base.Map))
                {
                    return(false);
                }
                return(true);
            }
            return(false);
        }
예제 #4
0
        private void DoThunderStrike(Vector3 directionOffset)
        {
            IntVec3 currentPos = default(IntVec3);

            if (directionOffset != default(Vector3))
            {
                currentPos = (this.origin + directionOffset).ToIntVec3();
                if (currentPos != default(IntVec3) && currentPos.IsValid && currentPos.InBounds(base.Map) && currentPos.Walkable(base.Map) && currentPos.DistanceToEdge(base.Map) > 3)
                {
                    CellRect cellRect = CellRect.CenteredOn(currentPos, 1);
                    //cellRect.ClipInsideMap(base.Map);
                    IntVec3 rndCell = cellRect.RandomCell;
                    if (rndCell != null && rndCell != default(IntVec3) && rndCell.IsValid && rndCell.InBounds(base.Map) && rndCell.Walkable(base.Map) && rndCell.DistanceToEdge(base.Map) > 3)
                    {
                        Map.weatherManager.eventHandler.AddEvent(new TM_WeatherEvent_MeshFlash(base.Map, rndCell, TM_MatPool.chiLightning, TMDamageDefOf.DamageDefOf.TM_ChiBurn, this.launcher, Mathf.RoundToInt(Rand.Range(8, 14) * (1 + (.12f * pwrVal)) * this.arcaneDmg), Rand.Range(1.5f, 2f)));
                    }
                }
            }
        }
예제 #5
0
        protected override void Impact(Thing hitThing)
        {
            base.Impact(hitThing);

            ThingDef def = this.def;

            if (!this.initialized)
            {
                this.pawn = this.launcher as Pawn;
                this.map  = this.pawn.Map;
                CompAbilityUserMagic   comp        = pawn.GetComp <CompAbilityUserMagic>();
                MagicPowerSkill        pwr         = pawn.GetComp <CompAbilityUserMagic>().MagicData.MagicPowerSkill_Scorn.FirstOrDefault((MagicPowerSkill x) => x.label == "TM_Scorn_pwr");
                MagicPowerSkill        ver         = pawn.GetComp <CompAbilityUserMagic>().MagicData.MagicPowerSkill_Scorn.FirstOrDefault((MagicPowerSkill x) => x.label == "TM_Scorn_ver");
                ModOptions.SettingsRef settingsRef = new ModOptions.SettingsRef();
                pwrVal         = pwr.level;
                verVal         = ver.level;
                this.arcaneDmg = comp.arcaneDmg;
                if (settingsRef.AIHardMode && !pawn.IsColonist)
                {
                    pwrVal = 1;
                    verVal = 1;
                }
                this.radius = this.def.projectile.explosionRadius + verVal;
                //this.duration = Mathf.RoundToInt(this.radius * this.strikeDelay);
                this.initialized = true;
            }

            if (!launchedFlag)
            {
                ModOptions.Constants.SetPawnInFlight(true);
                if (ModCheck.Validate.GiddyUp.Core_IsInitialized())
                {
                    ModCheck.GiddyUp.ForceDismount(pawn);
                }
                skyfaller = SkyfallerMaker.SpawnSkyfaller(ThingDef.Named("TM_ScornLeaving"), pawn.Position, this.map);
                if (base.Position.x < pawn.Position.x)
                {
                    this.angle = Rand.Range(20, 40);
                }
                else
                {
                    this.angle = Rand.Range(-40, -20);
                }
                skyfaller.angle = this.angle;
                launchedFlag    = true;
                pawn.DeSpawn();
            }
            if (skyfaller.DestroyedOrNull() && !pivotFlag)
            {
                safePos = base.Position;
                if (safePos.x > this.map.Size.x - 5)
                {
                    safePos.x = this.map.Size.x - 5;
                }
                else if (safePos.x < 5)
                {
                    safePos.x = 5;
                }

                if (safePos.z > this.map.Size.z - 5)
                {
                    safePos.z = this.map.Size.z - 5;
                }
                else if (safePos.z < 5)
                {
                    safePos.z = 5;
                }
                skyfaller2       = SkyfallerMaker.SpawnSkyfaller(ThingDef.Named("TM_ScornIncoming"), safePos, this.map);
                skyfaller2.angle = this.angle;
                pivotFlag        = true;
            }

            if (skyfaller2.DestroyedOrNull() && pivotFlag && launchedFlag && !landedFlag)
            {
                landedFlag = true;
                GenSpawn.Spawn(pawn, safePos, this.map);
                if (pawn.drafter != null)
                {
                    pawn.drafter.Drafted = true;
                }
                ModOptions.Constants.SetPawnInFlight(false);
                if (verVal == 0)
                {
                    HealthUtility.AdjustSeverity(pawn, TorannMagicDefOf.TM_DemonScornHD, 60f + (pwrVal * 15));
                }
                else if (verVal == 1)
                {
                    HealthUtility.AdjustSeverity(pawn, TorannMagicDefOf.TM_DemonScornHD_I, 60f + (pwrVal * 15));
                }
                else if (verVal == 2)
                {
                    HealthUtility.AdjustSeverity(pawn, TorannMagicDefOf.TM_DemonScornHD_II, 60f + (pwrVal * 15));
                }
                else
                {
                    HealthUtility.AdjustSeverity(pawn, TorannMagicDefOf.TM_DemonScornHD_III, 60f + (pwrVal * 15));
                }
            }
            if (landedFlag)
            {
                if (Find.TickManager.TicksGame % strikeDelay == 0)
                {
                    if (safePos.DistanceToEdge(this.map) > strikeNum)
                    {
                        IEnumerable <IntVec3> targets;
                        if (strikeNum == 1)
                        {
                            targets = GenRadial.RadialCellsAround(safePos, this.strikeNum, false);
                        }
                        else
                        {
                            IEnumerable <IntVec3> oldTargets = GenRadial.RadialCellsAround(base.Position, this.strikeNum - 1, false);
                            targets = GenRadial.RadialCellsAround(safePos, this.strikeNum, false).Except(oldTargets);
                        }
                        foreach (var cell in targets)
                        {
                            IntVec3 curCell = cell;
                            if (this.map != null && curCell.IsValid && curCell.InBounds(this.map))
                            {
                                GenExplosion.DoExplosion(curCell, this.Map, .4f, TMDamageDefOf.DamageDefOf.TM_Shadow, this.pawn, (int)(this.def.projectile.GetDamageAmount(1, null) * (1 + (.15 * pwrVal)) * this.arcaneDmg * Rand.Range(.75f, 1.25f)), 0, TorannMagicDefOf.TM_SoftExplosion, def, null, null, null, 0f, 1, false, null, 0f, 1, 0f, false);
                            }
                        }
                        this.strikeNum++;
                    }
                    else
                    {
                        strikeNum = (int)this.radius + 1;
                    }
                }
            }
            if (this.strikeNum > this.radius)
            {
                this.age = this.duration;
                this.Destroy(DestroyMode.Vanish);
            }
        }