public IEnumerable <Wait> Fracture(MineEvent mine) { int traitLvl = mine.Miner.GetTrait(this); if (mine.Mineable is Tile tile && mine.ReactionLevel <= (traitLvl - 1) && mine.Success) { yield return(new WaitTime(3)); new SeismSmall(mine.Miner.World, tile, 15); List <Wait> waitForMining = new List <Wait>(); foreach (var neighbor in tile.GetAdjacentNeighbors()) { if (neighbor is IMineable mineable && MineEvent.Random.NextDouble() < 0.7 + (traitLvl - 1) * 0.1) { new SeismSmall(neighbor.World, neighbor, 10); MineEvent fracture = new MineEvent(mine.Miner, mine.Pickaxe, 1000) { Fault = this, ReactionLevel = mine.ReactionLevel + 1 }; waitForMining.Add(mineable.Mine(fracture)); } } mine.AddWait(new WaitAll(waitForMining)); } yield return(Wait.NoWait); }
private IEnumerable <Wait> RoutineExplode(Creature attacker, Tile explosionTarget, int radius, int reactionLevel) { yield return(new WaitTime(5 + Random.Next(5))); new FireExplosion(attacker.World, explosionTarget.VisualTarget, Vector2.Zero, 0, 15); new ScreenShakeRandom(attacker.World, 6, 30, LerpHelper.Linear); var waitForDamage = new List <Wait>(); foreach (var explosionTile in SkillUtil.GetCircularArea(explosionTarget, radius)) { foreach (var targetCreature in explosionTile.Creatures) { waitForDamage.Add(attacker.Attack(targetCreature, SkillUtil.SafeNormalize(targetCreature.VisualTarget - explosionTarget.VisualTarget), (a, b) => ExplosionAttack(a, b, reactionLevel + 1))); } if (explosionTile is IMineable mineable) { MineEvent fracture = new MineEvent(attacker, null, 100) { Fault = this, ReactionLevel = reactionLevel + 1 }; waitForDamage.Add(mineable.Mine(fracture)); } } yield return(new WaitAll(waitForDamage)); }
public IEnumerable <Wait> Pulverize(MineEvent mine) { var miningLevel = mine.Miner.GetStat(Stat.MiningLevel); double delta = miningLevel - mine.ReactionLevel; mine.LootFunction = (miner) => { }; yield return(Wait.NoWait); }
public IEnumerable <Wait> Crumble(MineEvent mine) { int traitLvl = mine.Miner.GetTrait(this); var miningLevel = mine.Miner.GetStat(Stat.MiningLevel); double delta = miningLevel - mine.ReactionLevel; mine.Speed *= (1 + traitLvl * 0.15 * Math.Max(delta, 0)); yield return(Wait.NoWait); }
public IEnumerable <Wait> SoftyHeal(MineEvent mine) { int traitLvl = mine.Miner.GetTrait(this); if (mine.Mineable is Tile tile) { if (mine.RequiredMiningLevel <= traitLvl && mine.Success) { mine.Miner.Heal(5 * traitLvl); } } yield return(Wait.NoWait); }
public IEnumerable <Wait> ExplodeMine(MineEvent mine) { int traitLvl = mine.Miner.GetTrait(this); if (mine.Success && mine.Fault != this && Random.NextDouble() < traitLvl * 0.3 && mine.Mineable is Tile tile) { IEnumerable <Tile> targetTiles = GetExplosionTiles(tile); if (targetTiles.Any()) { var explosionTarget = targetTiles.Shuffle(Random).First(); yield return(Scheduler.Instance.RunAndWait(RoutineExplode(mine.Miner, explosionTarget, 1, mine.ReactionLevel))); } } yield return(Wait.NoWait); }
public Wait Run() { var waitForDamage = new List <Wait>(); foreach (var explosionTile in Tiles) { foreach (var targetCreature in explosionTile.Creatures.Where(x => !x.Dead)) { waitForDamage.Add(Attacker.Attack(targetCreature, SkillUtil.SafeNormalize(targetCreature.VisualTarget - Origin), Attack)); } if (explosionTile is IMineable mineable) { MineEvent fracture = new MineEvent(Attacker, null, 100) { Fault = Fault, ReactionLevel = ReactionLevel + 1 }; waitForDamage.Add(mineable.Mine(fracture)); } } return(new WaitAll(waitForDamage)); }
public static Wait OnMine(this IEffectHolder holder, MineEvent mine) { return(Scheduler.Instance.RunAndWait(holder.PushEvent <MineEvent, OnMine>(mine))); }