예제 #1
0
        public void Run()
        {
            var camera     = Origin.GetCamera();
            var nemesis    = Origin.GetBehavior <BehaviorNemesis>();
            var neighbor   = Tile;
            var orientable = Origin.GetBehavior <BehaviorOrientable>();
            var angle      = Util.VectorToAngle(Tile.GetVisualTarget() - Origin.GetVisualTarget());

            if (neighbor != null && !neighbor.IsSolid())
            {
                SoundFly.Play(1, 0, 0);
                nemesis.WingsOpen.Set(1, LerpHelper.ExponentialIn, 30);
                Origin.MoveTo(neighbor, LerpHelper.Linear, this);
                camera?.MoveTo(neighbor, LerpHelper.Linear, this);
                orientable.OrientVisual(angle, LerpHelper.Quadratic, Frame);
            }
        }
예제 #2
0
        public void Run()
        {
            Random random = new Random();
            var    world  = Target.GetWorld();

            SkillUtil.CreateBloodCircle(world, Target.GetVisualTarget(), 60, 64, Random);
            SkillUtil.CreateSpatter(world, Target.GetVisualTarget(), 5, Vector2.Zero, 1, Random);
            if (Score > 0)
            {
                world.AddWorldScore(Score, Target.GetVisualTarget(), ScoreType.Small);
            }
            if (Origin == world.PlayerCurio)
            {
                world.RunStats.Gibs += 1;
            }
            Splat.Play(1.0f, Random.NextFloat(-0.5f, +0.5f), 0);
            Behavior.Apply(new BehaviorGib(Target));
        }
예제 #3
0
        public void Run()
        {
            var world = Origin.GetWorld();
            var sword = Origin.GetBehavior <BehaviorSword>();
            var alive = Origin.GetBehavior <BehaviorAlive>();

            if (HasHeart && alive != null)
            {
                alive.HealDamage(Heal);
                world.AddWorldScore(Score, Origin.GetVisualTarget(), ScoreType.Small);
                RemoveHeart();
                if (Origin == world.PlayerCurio)
                {
                    world.RunStats.HeartsEaten += 1;
                }
                Eat.Play(1, 0, 0);
                Blood.Play(0.5f, -0.5f, 0);
                Jingle.Play(1, 0, 0);
            }
        }
예제 #4
0
 public void Tick(SceneGame scene)
 {
     if (Curio.IsAlive() && !Upswing.Done)
     {
         Upswing += scene.TimeModCurrent;
         var lastAngle = UpswingAngle;
         UpswingAngle += scene.TimeModCurrent * (float)LerpHelper.QuadraticOut(MathHelper.TwoPi * 0.01, MathHelper.TwoPi * 0.2, Upswing.Slide);
         var deltaSwing = Math.Abs(Math.Floor(UpswingAngle / MathHelper.Pi) - Math.Floor(lastAngle / MathHelper.Pi));
         if (deltaSwing >= 1)
         {
             SoundSwish.Play(1, Upswing.Slide - 0.5f, 0);
         }
     }
     //else
     //    Upswing.Time = Upswing.EndTime;
     if (!MaceReturn.Done)
     {
         MaceReturn += scene.TimeModCurrent;
     }
 }
예제 #5
0
        public void Run()
        {
            var world = Origin.GetWorld();

            Origin.GetFlashHelper()?.AddFlash(ColorMatrix.Flat(Color.White), 20);
            Origin.GetShakeHelper()?.AddShakeRandom(3, LerpHelper.QuadraticOut, 30);
            SoundImpact.Play(1, Random.NextFloat(-0.5f, +0.5f), 0);
            var alive  = Origin.GetBehavior <BehaviorAlive>();
            var damage = 1;

            if (Collision.IsSpiky())
            {
                SoundSpikes.Play(1, Random.NextFloat(-0.5f, +0.5f), 0);
                damage = 2;
            }
            if (alive != null)
            {
                alive.TakeDamage(damage);
            }
        }
예제 #6
0
 public void Tick(SceneGame scene)
 {
     BellTime += scene.TimeModCurrent;
     if (BellTime.Done && BellTolls < 12)
     {
         new ScreenGlitchFlash(scene, slide => Params.WithIntensity(slide), 10);
         new ScreenFlashSimple(scene, ColorMatrix.Tint(Color.Red), LerpHelper.Flick, 10);
         SoundBell.Play(1, Random.NextFloat(0.5f, 0.0f), 0);
         BellTolls += 1;
         BellTime.Reset();
         if (BellTolls >= 12)
         {
             new ScreenBellWraiths(Curio.GetWorld(), this, 60, 300);
             foreach (var wraithEmitter in Manager.GetBehaviors().OfType <BehaviorWraithEmitter>())
             {
                 wraithEmitter.Activated = true;
             }
             SoundSummon.Play(1, 0, 0);
         }
     }
 }
예제 #7
0
        public void Run()
        {
            Random random = new Random();
            var    world  = Origin.GetWorld();
            var    alive  = Target.GetBehavior <BehaviorAlive>();
            var    sword  = Origin.GetBehavior <BehaviorSword>();

            Target.GetFlashHelper()?.AddFlash(ColorMatrix.Flat(Color.White), 20);
            Target.GetShakeHelper()?.AddShakeRandom(3, LerpHelper.QuadraticOut, 30);
            new HitStop(world, 0, 5);
            HitSound.Play(1f, Random.NextFloat(-0.3f, +0.3f), 0);
            SkillUtil.CreateSpatter(world, Target.GetVisualTarget(), Blood, Vector2.Zero, 1, Random);
            if (Score > 0)
            {
                world.AddWorldScore(Score, Target.GetVisualTarget(), ScoreType.Small);
            }

            if (Blood > 0)
            {
                SkillUtil.CreateBloodCircle(world, Target.GetVisualTarget(), 30, 32, Random);
            }

            alive.TakeDamage(Damage);

            if (alive.CurrentDead)
            {
                //DeathSound.Play(1, 0, 0);
                if (Origin == world.PlayerCurio)
                {
                    world.RunStats.Kills += 1;
                }
            }

            if (sword != null && Blood > 0)
            {
                sword.HasBlood = true;
            }
        }
        public void Tick(SceneGame scene)
        {
            var tile = Origin.GetMainTile();
            var mace = Origin.GetBehavior <BehaviorMace>();

            IFrameCollection.Tick(scene.TimeModCurrent);

            bool upswingSlash = FrameUpswingSlash.Done;

            if (Origin.IsAlive() && FrameUpswingSlash.Time > FrameUpswingSlash.EndTime - 5 && !mace.Upswing.Done)
            {
                if (FrameUpswingVisual.Done)
                {
                    float size      = 0.3f + 0.3f * Random.NextFloat();
                    float bigSize   = 1.5f + Random.NextFloat();
                    int   totaltime = 5 + Random.Next(10);
                    new CutterParticle(scene, SpriteLoader.Instance.AddSprite("content/effect_cutter"), Origin.GetVisualTarget(), 10)
                    {
                        RotationStart = -MathHelper.TwoPi / totaltime,
                        RotationEnd   = -(MathHelper.TwoPi / totaltime) * 0.5f,
                        RotationLerp  = LerpHelper.Linear,
                        SizeStart     = size,
                        SizeEnd       = size * bigSize,
                        ScaleLerp     = LerpHelper.CircularOut,
                        Angle         = Random.NextAngle(),
                        Color         = Color.Lerp(Color.Red, Color.DarkRed, Random.NextFloat()),
                        DrawPass      = DrawPass.EffectAdditive,
                    };
                    size      = 0.3f + 0.3f * Random.NextFloat();
                    bigSize   = 1.5f + Random.NextFloat();
                    totaltime = 5 + Random.Next(10);
                    new CutterParticle(scene, SpriteLoader.Instance.AddSprite("content/effect_cutter"), Origin.GetVisualTarget(), 10)
                    {
                        RotationStart = -MathHelper.TwoPi / totaltime,
                        RotationEnd   = -(MathHelper.TwoPi / totaltime) * 0.5f,
                        RotationLerp  = LerpHelper.Linear,
                        SizeStart     = size,
                        SizeEnd       = size * bigSize,
                        ScaleLerp     = LerpHelper.CircularOut,
                        Angle         = Random.NextAngle(),
                        Color         = Color.Lerp(Color.Black, Color.DarkRed, Random.NextFloat()),
                        DrawPass      = DrawPass.Effect,
                    };
                    FrameUpswingVisual.Time = 0;
                }
                FrameUpswingVisual += scene.TimeModCurrent;
                if (FrameUpswingSlash.Done)
                {
                    DamageAreaUpswing();
                }
            }

            FrameUpswingSlash += scene.TimeModCurrent;

            if (mace.Upswing.Done)
            {
                if (!Swinging)
                {
                    SoundSwish.Play(1.0f, Random.NextFloat(-1.0f, 0f), 0);
                    Swinging = true;
                }
                bool shouldAttack = !Frame.Done;
                Frame += scene.TimeModCurrent;
                if (Frame.Done && shouldAttack)
                {
                    var target = GetTarget();
                    mace.Mace(target.VisualTarget, 20);
                    SoundImpact.Play(1, Random.NextFloat(-0.5f, +0.5f), 0);
                    DamageArea();
                }
            }
            else
            {
                Retarget();
            }
        }
예제 #9
0
        public void Tick(SceneGame scene)
        {
            var active     = Curio.GetActionHolder(ActionSlot.Active);
            var lastSeen   = Curio.GetBehavior <BehaviorLastSeen>();
            var pathfinder = Curio.GetBehavior <BehaviorPathfinder>();
            var orientable = Curio.GetBehavior <BehaviorOrientable>();
            var tile       = Curio.GetMainTile();
            var map        = Curio.GetMap();

            if (Curio.IsDead())
            {
                Decay += scene.TimeModCurrent;
            }

            if (Decay.Done)
            {
                var actions = new List <ActionWrapper>();
                actions.Add(new ActionRatGib(scene.PlayerCurio, Curio, 2000, SoundLoader.AddSound("content/sound/splat.wav")).InSlot(ActionSlot.Active));
                actions.Apply(Curio);
            }

            if (active.Done && Curio.IsAlive())
            {
                if (lastSeen.LastSeenTile != null)
                {
                    var nextMove = pathfinder.GetNextMove(new Point(tile.X, tile.Y));
                    if (!pathfinder.HasPath)
                    {
                        var positions = map.EnumerateTiles().Shuffle(Random);
                        foreach (var escapeTile in positions)
                        {
                            if (Vector2.Distance(escapeTile.VisualTarget, tile.VisualTarget) < 300)
                            {
                                continue;
                            }
                            if (escapeTile.IsChasm() || escapeTile.IsSolid())
                            {
                                continue;
                            }
                            pathfinder.FindPath(escapeTile);
                            SoundRat.Play(1, Random.NextFloat(-0.5f, +0.5f), 0);
                            break;
                        }
                    }
                    else if (nextMove.HasValue)
                    {
                        var angleCurrent = orientable.Angle;
                        var angleTarget  = Util.PointToAngle(nextMove.Value);
                        var angleDelta   = MathHelper.WrapAngle(angleTarget - angleCurrent);

                        var movement = new List <ActionWrapper>();
                        if (Math.Abs(angleDelta) < 0.0001)
                        {
                            movement.Add(new ActionMoveForward(Curio, nextMove.Value.ToVector2(), 4).InSlot(ActionSlot.Active));
                        }
                        else if (angleDelta < 0)
                        {
                            movement.Add(new ActionTurn(Curio, -MathHelper.PiOver4, 5).InSlot(ActionSlot.Active));
                        }
                        else if (angleDelta > 0)
                        {
                            movement.Add(new ActionTurn(Curio, MathHelper.PiOver4, 5).InSlot(ActionSlot.Active));
                        }
                        movement.Apply(Curio);
                    }
                    else
                    {
                        var actions = new List <ActionWrapper>();
                        actions.Add(new ActionRatGib(scene.PlayerCurio, Curio, 2000, SoundLoader.AddSound("content/sound/splat.wav")).InSlot(ActionSlot.Active));
                        actions.Apply(Curio);
                    }
                }
            }
        }