コード例 #1
0
ファイル: Traits.cs プロジェクト: DaedalusGame/7DRL_2020
        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);
        }
コード例 #2
0
ファイル: Traits.cs プロジェクト: DaedalusGame/7DRL_2020
        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));
        }
コード例 #3
0
ファイル: Traits.cs プロジェクト: DaedalusGame/7DRL_2020
        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);
        }
コード例 #4
0
ファイル: Traits.cs プロジェクト: DaedalusGame/7DRL_2020
        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);
        }
コード例 #5
0
ファイル: Traits.cs プロジェクト: DaedalusGame/7DRL_2020
        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);
        }
コード例 #6
0
ファイル: Traits.cs プロジェクト: DaedalusGame/7DRL_2020
        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);
        }
コード例 #7
0
        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));
        }
コード例 #8
0
 public static Wait OnMine(this IEffectHolder holder, MineEvent mine)
 {
     return(Scheduler.Instance.RunAndWait(holder.PushEvent <MineEvent, OnMine>(mine)));
 }