public override void GameConditionTick() { if (Find.TickManager.TicksGame % 37 == 0) { Pawn p = this.SingleMap.mapPawns.AllPawnsSpawned.RandomElement(); if (p.def != TorannMagicDefOf.TM_GiantSkeletonR && p.def != TorannMagicDefOf.TM_SkeletonLichR && p.def != TorannMagicDefOf.TM_SkeletonR && p.def != TorannMagicDefOf.TM_DemonR && p.def != TorannMagicDefOf.TM_LesserDemonR && p.health != null && !p.Downed && p.health.hediffSet != null && !TM_Calc.IsUndead(p)) { HealthUtility.AdjustSeverity(p, TorannMagicDefOf.TM_DeathMarkCurse, Rand.Range(6, 10)); TM_MoteMaker.ThrowGenericMote(TorannMagicDefOf.Mote_Disease, p.DrawPos, p.Map, 1.4f, .7f, .1f, 1f, Rand.Range(-20, 20), .2f, Rand.Range(-20, 20), Rand.Range(0, 360)); TM_MoteMaker.ThrowGenericMote(TorannMagicDefOf.Mote_Disease, p.DrawPos, p.Map, 1f, .5f, .1f, .5f, Rand.Range(-20, 20), .3f, Rand.Range(-30, 30), Rand.Range(0, 360)); } } base.GameConditionTick(); }
private void DoSummoningCircle() { if (Find.TickManager.TicksGame % 2 == 0) { IntVec3 randomCircleCell = this.summoningCircle.RandomElement(); TM_MoteMaker.ThrowGenericMote(ThingDef.Named("Mote_Demon_Flame"), randomCircleCell.ToVector3Shifted(), this.SingleMap, Rand.Range(.5f, .9f), Rand.Range(.2f, .3f), .05f, Rand.Range(.2f, .4f), Rand.Range(-400, 400), Rand.Range(.8f, 1.2f) * (randomCircleCell - this.centerLocation.ToIntVec3).LengthHorizontal, (Quaternion.AngleAxis(90, Vector3.up) * TM_Calc.GetVector(randomCircleCell.ToVector3Shifted(), this.centerLocation.ToIntVec3.ToVector3Shifted())).ToAngleFlat(), Rand.Range(0, 359)); } if (this.nextBlackLightning > this.summoningDuration) { DoLightningStrike(); this.nextBlackLightning = this.summoningDuration - Rand.Range(25, 50); } }
public override void GameConditionTick() { base.GameConditionTick(); if (!initialized) { initialized = true; TM_MoteMaker.ThrowGenericMote(ThingDef.Named("Mote_SummoningCircle"), this.summoningCircle[0].ToVector3Shifted(), this.SingleMap, 3f, 2f, 1f, 2f, 0, 0, 0, Rand.Range(0, 360)); } if (summoningDuration > 0) { summoningDuration--; DoSummoningCircle(); if (summoningDuration == 0) { SpawnDemons(); } } if (Find.TickManager.TicksGame % 60 == 0) { if (spawnedThings != null) { bool anySpawnedThingsRemaining = false; if (spawnedThings.Any(p => (!p.DestroyedOrNull() && !p.Dead && !p.Downed))) { anySpawnedThingsRemaining = true; } if (!anySpawnedThingsRemaining) { this.End(); } } if (this.nextEventTick <= Find.TickManager.TicksGame) { this.nextEventTick = Find.TickManager.TicksGame + this.ticksBetweenEvents; } } if (doEventAction && Find.TickManager.TicksGame % 10 == 0 && Find.TickManager.TicksGame > nextEventTick) { nextEventTick = Find.TickManager.TicksGame + ticksBetweenEvents; DoEvent(); } }
private static void DoBlink(Pawn caster, IntVec3 targetCell, Thing carriedThing) { JobDef retainJobDef = caster.CurJobDef; int retainCount = 1; LocalTargetInfo retainTargetA = caster.CurJob.targetA; if (retainTargetA.Thing != null && retainTargetA.Thing.stackCount != 1) { retainCount = retainTargetA.Thing.stackCount; } LocalTargetInfo retainTargetB = caster.CurJob.targetB; LocalTargetInfo retainTargetC = caster.CurJob.targetC; Pawn p = caster; Thing cT = carriedThing; if (cT != null && cT.stackCount != 1) { retainCount = cT.stackCount; } Map map = caster.Map; IntVec3 casterCell = caster.Position; bool selectCaster = false; if (Find.Selector.FirstSelectedObject == caster) { selectCaster = true; } try { ThingDef moteThrown = null; Vector3 moteVector = TM_Calc.GetVector(casterCell, targetCell); float angle = moteVector.ToAngleFlat(); if (angle >= -135 && angle < -45) //north { moteThrown = ThingDef.Named("Mote_DWPhase_North"); } else if (angle >= 45 && angle < 135) //south { moteThrown = ThingDef.Named("Mote_DWPhase_South"); } else if (angle >= -45 && angle < 45) //east { moteThrown = ThingDef.Named("Mote_DWPhase_East"); } else //west { moteThrown = ThingDef.Named("Mote_DWPhase_West"); } for (int i = 0; i < 3; i++) { TM_MoteMaker.ThrowGenericMote(ThingDefOf.Mote_Smoke, caster.DrawPos, caster.Map, Rand.Range(.6f, 1f), .2f, .1f, .5f, 0, Rand.Range(2, 3), Rand.Range(-30, 30), 0); } TM_MoteMaker.ThrowGenericMote(moteThrown, caster.DrawPos, caster.Map, 1.4f, .1f, 0f, .4f, 0, 5f, (Quaternion.AngleAxis(90, Vector3.up) * moteVector).ToAngleFlat(), 0); bool drafted = caster.drafter.Drafted; caster.DeSpawn(); GenSpawn.Spawn(p, targetCell, map); if (carriedThing != null) { carriedThing.DeSpawn(); GenPlace.TryPlaceThing(cT, targetCell, map, ThingPlaceMode.Near); //GenSpawn.Spawn(cT, targetCell, map); } if (selectCaster) { Find.Selector.Select(caster, false, true); } for (int i = 0; i < 3; i++) { TM_MoteMaker.ThrowGenericMote(ThingDefOf.Mote_Smoke, caster.DrawPos, caster.Map, Rand.Range(.6f, 1f), .4f, .1f, Rand.Range(.8f, 1.2f), 0, Rand.Range(2, 3), Rand.Range(-30, 30), 0); //TM_MoteMaker.ThrowGenericMote(TorannMagicDefOf.Mote_Casting, caster.DrawPos, caster.Map, Rand.Range(1.4f, 2f), .2f, .05f, Rand.Range(.4f, .6f), Rand.Range(-200, 200), 0, 0, 0); } Vector3 drawPos = caster.DrawPos + (-2 * moteVector); TM_MoteMaker.ThrowGenericMote(moteThrown, drawPos, caster.Map, 1.4f, .1f, .3f, 0f, 0, 8f, (Quaternion.AngleAxis(90, Vector3.up) * moteVector).ToAngleFlat(), 0); if (caster.drafter == null) { caster.drafter = new Pawn_DraftController(caster); } if (drafted) { caster.drafter.Drafted = true; } Job job = new Job(retainJobDef, retainTargetA, retainTargetB, retainTargetC) { count = retainCount }; //caster.jobs.TryTakeOrderedJob(job, JobTag.Misc); caster.jobs.StartJob(job); } catch { if (!caster.Spawned) { GenSpawn.Spawn(p, casterCell, map); } } }
private static void DoPhase(Pawn caster, IntVec3 targetCell, PawnAbility ability, Thing carriedThing) { JobDef retainJobDef = caster.CurJobDef; LocalTargetInfo retainTargetA = caster.CurJob.targetA; int retainCount = 1; if (retainTargetA.Thing != null && retainTargetA.Thing.stackCount != 1) { retainCount = retainTargetA.Thing.stackCount; } LocalTargetInfo retainTargetB = caster.CurJob.targetB; LocalTargetInfo retainTargetC = caster.CurJob.targetC; Pawn p = caster; Thing cT = carriedThing; if (cT != null && cT.stackCount != 1) { retainCount = cT.stackCount; } Map map = caster.Map; IntVec3 casterCell = caster.Position; bool selectCaster = false; if (Find.Selector.FirstSelectedObject == caster) { selectCaster = true; } try { for (int i = 0; i < 3; i++) { TM_MoteMaker.ThrowGenericMote(ThingDefOf.Mote_Smoke, caster.DrawPos, caster.Map, Rand.Range(.6f, 1f), .4f, .1f, Rand.Range(.8f, 1.2f), 0, Rand.Range(2, 3), Rand.Range(-30, 30), 0); TM_MoteMaker.ThrowGenericMote(TorannMagicDefOf.Mote_Enchanting, caster.DrawPos, caster.Map, Rand.Range(1.4f, 2f), .2f, .05f, Rand.Range(.4f, .6f), Rand.Range(-200, 200), 0, 0, 0); } caster.DeSpawn(); GenSpawn.Spawn(p, targetCell, map); if (carriedThing != null) { carriedThing.DeSpawn(); GenPlace.TryPlaceThing(cT, targetCell, map, ThingPlaceMode.Near); //GenSpawn.Spawn(cT, targetCell, map); } caster.GetComp <CompAbilityUserMight>().MightUserXP -= 50; ability.PostAbilityAttempt(); if (selectCaster) { Find.Selector.Select(caster, false, true); } for (int i = 0; i < 3; i++) { TM_MoteMaker.ThrowGenericMote(ThingDefOf.Mote_Smoke, caster.DrawPos, caster.Map, Rand.Range(.6f, 1f), .4f, .1f, Rand.Range(.8f, 1.2f), 0, Rand.Range(2, 3), Rand.Range(-30, 30), 0); TM_MoteMaker.ThrowGenericMote(TorannMagicDefOf.Mote_Enchanting, caster.DrawPos, caster.Map, Rand.Range(1.4f, 2f), .2f, .05f, Rand.Range(.4f, .6f), Rand.Range(-200, 200), 0, 0, 0); } Job job = new Job(retainJobDef, retainTargetA, retainTargetB, retainTargetC) { count = retainCount, playerForced = false }; //caster.jobs.TryTakeOrderedJob(); caster.jobs.StartJob(job); } catch { if (!caster.Spawned) { GenSpawn.Spawn(p, casterCell, map); } } }