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); } } }
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; } }
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); }
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))); } } } }
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); } }