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

            if (tile != null && active.Done && Curio.IsAlive())
            {
                var map   = tile.Map;
                var mace  = Curio.GetBehavior <BehaviorMace>();
                var delta = scene.PlayerCurio.GetVisualTarget() - Curio.GetVisualTarget();
                if (mace != null && mace.IsInArea(scene.PlayerCurio) && map.CanSee(Curio.GetVisualTarget(), scene.PlayerCurio.GetVisualTarget()))
                {
                    var angleCurrent = orientable.Angle;
                    var angleTarget  = Enumerable.Range(0, 8).Select(x => MathHelper.PiOver4 * x).GetClosestAngle(Util.VectorToAngle(delta));
                    var angleDelta   = MathHelper.WrapAngle(angleTarget - angleCurrent);
                    var attack       = new List <ActionWrapper>()
                    {
                        //new ActionMaceAttack(Curio, scene.PlayerCurio, 20f, 5f).InSlot(ActionSlot.Active),
                        new ActionMaceGoreAttack(Curio, scene.PlayerCurio, 40f, 20f, 5f).InSlot(ActionSlot.Active),
                        new ActionTurn(Curio, angleDelta, 3).InSlot(ActionSlot.Active),
                    };
                    attack.Apply(Curio);
                }
                else if (lastSeen.LastSeenTile != null)
                {
                    var nextMove = pathfinder.GetNextMove(new Point(tile.X, tile.Y));
                    if (lastSeen.LastSeenTile != pathfinder.GetDestination() || !nextMove.HasValue)
                    {
                        pathfinder.FindPath(lastSeen.LastSeenTile);
                    }
                    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(), 8).InSlot(ActionSlot.Active));
                        }
                        else if (angleDelta < 0)
                        {
                            movement.Add(new ActionTurn(Curio, -MathHelper.PiOver4, 4).InSlot(ActionSlot.Active));
                        }
                        else if (angleDelta > 0)
                        {
                            movement.Add(new ActionTurn(Curio, MathHelper.PiOver4, 4).InSlot(ActionSlot.Active));
                        }
                        movement.Apply(Curio);
                    }
                }
            }
        }
Example #2
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();

            if (active.Done && Curio.IsAlive())
            {
                var delta    = scene.PlayerCurio.GetVisualTarget() - Curio.GetVisualTarget();
                var distance = delta.Length();
                if (distance < 24f)
                {
                    var angleCurrent = orientable.Angle;
                    var angleTarget  = Enumerable.Range(0, 8).Select(x => MathHelper.PiOver4 * x).GetClosestAngle(Util.VectorToAngle(delta));
                    var angleDelta   = MathHelper.WrapAngle(angleTarget - angleCurrent);
                    var attack       = new List <ActionWrapper>()
                    {
                        new ActionDaggerAttack(Curio, Util.ToTileOffset(Util.AngleToVector(angleTarget)), 5f, 2.5f).InSlot(ActionSlot.Active),
                        new ActionTurn(Curio, angleDelta, 3).InSlot(ActionSlot.Active),
                    };
                    attack.Apply(Curio);
                }
                else if (lastSeen.LastSeenTile != null)
                {
                    var nextMove = pathfinder.GetNextMove(new Point(tile.X, tile.Y));
                    if (lastSeen.LastSeenTile != pathfinder.GetDestination() || !nextMove.HasValue)
                    {
                        pathfinder.FindPath(lastSeen.LastSeenTile);
                    }
                    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(), 10).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);
                    }
                }
            }
        }
Example #3
0
        public override void Draw(ICurio curio, SceneGame scene, DrawPass pass)
        {
            var spriteHelmet      = SpriteLoader.Instance.AddSprite("content/nemesis_helmet");
            var spriteBodyForward = SpriteLoader.Instance.AddSprite("content/nemesis_forward");
            var spriteBodyBack    = SpriteLoader.Instance.AddSprite("content/nemesis_back");
            var spriteWings       = SpriteLoader.Instance.AddSprite("content/nemesis_wings");
            var spriteParry       = SpriteLoader.Instance.AddSprite("content/nemesis_parry");

            var alive   = curio.GetBehavior <BehaviorAlive>();
            var nemesis = curio.GetBehavior <BehaviorNemesis>();

            if (alive.Armor > 0)
            {
                spriteBodyForward = SpriteLoader.Instance.AddSprite("content/nemesis_forward_armor");
                spriteBodyBack    = SpriteLoader.Instance.AddSprite("content/nemesis_back_armor");
            }

            var center    = curio.GetVisualPosition() + new Vector2(8, 8);
            var offset    = curio.GetOffset();
            var color     = curio.GetColor();
            var angleBody = curio.GetVisualAngle();

            scene.PushSpriteBatch(shader: scene.Shader, shaderSetup: (transform, projection) =>
            {
                scene.SetupColorMatrix(color);
            });
            SpriteReference spriteBody;
            float           headPos = MathHelper.Lerp(-4, 4, nemesis.ForwardBack);

            if (nemesis.ForwardBack > 0.5f)
            {
                spriteBody = spriteBodyForward;
            }
            else
            {
                spriteBody = spriteBodyBack;
            }
            scene.DrawSpriteExt(spriteBody, 0, center + offset - spriteBody.Middle, spriteBody.Middle, angleBody, new Vector2(1), SpriteEffects.None, Color.White, 0);
            scene.DrawSpriteExt(spriteHelmet, 0, center + offset + Util.AngleToVector(angleBody) * headPos - spriteHelmet.Middle, spriteHelmet.Middle, angleBody, new Vector2(1), SpriteEffects.None, Color.White, 0);
            if (nemesis.State == NemesisState.Parry)
            {
                scene.DrawSpriteExt(spriteParry, 0, center + offset - spriteParry.Middle, spriteParry.Middle, angleBody, new Vector2(1), SpriteEffects.None, Color.White, 0);
            }
            if (nemesis.ForwardBack > 0.5f && nemesis.WingsOpen > 0f)
            {
                Color wingColor = Color.Lerp(Color.Red, Color.Black, nemesis.WingsOpen);
                scene.DrawSpriteExt(spriteWings, 0, center + offset - spriteWings.Middle, spriteWings.Middle, angleBody, new Vector2(1), SpriteEffects.None, wingColor, 0);
            }

            scene.PopSpriteBatch();
        }
        public void Tick(SceneGame scene)
        {
            var active   = Curio.GetActionHolder(ActionSlot.Active);
            var lastSeen = Curio.GetBehavior <BehaviorLastSeen>();

            if (active?.Done ?? true && Curio.IsAlive())
            {
                bool specialAction = PerformSpecialAction();

                if (!specialAction && lastSeen.LastSeenTile != null)
                {
                    PerformMovement(lastSeen);
                }
            }
        }
Example #5
0
        private void DrawMace(ICurio curio, SceneGame scene, DrawPass pass)
        {
            var center    = curio.GetVisualPosition() + new Vector2(8, 8);
            var offset    = curio.GetOffset();
            var angleBody = curio.GetVisualAngle();
            var mace      = curio.GetBehavior <BehaviorMace>();

            if (mace != null && (!mace.Upswing.Done || !mace.MaceReturn.Done))
            {
                var weaponAngle    = (float)LerpHelper.QuadraticOut(0, 1, mace.Upswing.Slide);
                var weaponScale    = (float)LerpHelper.QuadraticOut(0.5, 1.0, mace.Upswing.Slide);
                var weaponStartPos = Util.AngleToVector(angleBody + MathHelper.PiOver4 * 2) * 8;
                var weaponEndPos   = Util.AngleToVector(angleBody + MathHelper.PiOver4 * 3) * 10;
                var weaponPos      = center + offset + Vector2.Lerp(weaponStartPos, weaponEndPos, (float)LerpHelper.QuadraticOut(0, 1, mace.Upswing.Slide));
                scene.DrawSpriteExt(SpriteWeapon, 0, weaponPos - SpriteWeapon.Middle, SpriteWeapon.Middle, angleBody + weaponAngle, new Vector2(weaponScale), SpriteEffects.None, Color.White, 0);
                if (!mace.Upswing.Done)
                {
                    mace.DrawMace(scene, weaponPos, Util.AngleToVector(mace.UpswingAngle) * (float)LerpHelper.QuadraticOut(0, 12, mace.MaceReturn.Slide), 2);
                }
                if (!mace.MaceReturn.Done)
                {
                    var maceOffset = mace.MacePosition - weaponPos;
                    mace.DrawMace(scene, weaponPos, Vector2.Lerp(maceOffset, Vector2.Zero, (float)LerpHelper.QuadraticOut(0, 1, mace.MaceReturn.Slide)), 8);
                }
            }
        }
 public void Fire(ICurio shooter, Vector2 direction, float moveTime, float lifeTime)
 {
     Shooter   = shooter;
     Direction = direction;
     MoveFrame = new Slider(moveTime, moveTime);
     LifeTime  = new Slider(lifeTime);
     Curio.GetBehavior <BehaviorOrientable>().OrientTo(Util.VectorToAngle(Direction));
 }
Example #7
0
        public static void DelayDecay(this ICurio curio, float time)
        {
            var decay = curio.GetBehavior <BehaviorDecay>();

            if (decay != null)
            {
                decay.Decay.Time -= time;
            }
        }
Example #8
0
        public static ShakeHelper GetShakeHelper(this ICurio curio)
        {
            var drawable = curio.GetBehavior <BehaviorDrawable>();

            if (drawable != null)
            {
                return(drawable.ShakeHelper);
            }
            return(null);
        }
Example #9
0
        public static float GetAngle(this ICurio curio)
        {
            var orientable = curio.GetBehavior <BehaviorOrientable>();

            if (orientable != null)
            {
                return(orientable.Angle);
            }
            return(0);
        }
Example #10
0
        public static ICurio GetCamera(this ICurio curio)
        {
            var cameraFollow = curio.GetBehavior <BehaviorFollowCamera>();

            if (cameraFollow != null)
            {
                return(cameraFollow.Camera);
            }
            return(null);
        }
Example #11
0
        public static bool IsDead(this ICurio curio)
        {
            var alive = curio.GetBehavior <BehaviorAlive>();

            if (alive != null)
            {
                return(alive.CurrentDead);
            }
            return(false);
        }
Example #12
0
        public static Mask GetMask(this ICurio curio)
        {
            var movable = curio.GetBehavior <BehaviorMovable>();

            if (movable != null)
            {
                return(movable.Mask);
            }
            return(null);
        }
Example #13
0
        public static bool TeleportVisual(this ICurio curio, Vector2 newPosition)
        {
            var movable = curio.GetBehavior <BehaviorMovable>();

            if (movable != null)
            {
                movable.TeleportVisual(newPosition);
                return(true);
            }
            return(false);
        }
Example #14
0
        public static bool MoveTo(this ICurio curio, MapTile tile, LerpHelper.Delegate lerp, ISlider slider)
        {
            var movable = curio.GetBehavior <BehaviorMovable>();

            if (movable != null)
            {
                movable.MoveTo(tile, lerp, slider);
                return(true);
            }
            return(false);
        }
Example #15
0
        public static bool MoveVisual(this ICurio curio, Vector2 newPosition, LerpHelper.Delegate lerp, ISlider slider)
        {
            var movable = curio.GetBehavior <BehaviorMovable>();

            if (movable != null)
            {
                movable.MoveVisual(newPosition, lerp, slider);
                return(true);
            }
            return(false);
        }
Example #16
0
        public void AddDefaultStab(List <ActionWrapper> actions)
        {
            var sword      = Curio.GetBehavior <BehaviorSword>();
            var orientable = Curio.GetBehavior <BehaviorOrientable>();

            if (actions.Any(x => x.Action is ActionMoveForward) && sword != null && sword.Position == 0 && IsAngleAlmostEqual(Util.VectorToAngle(Momentum.Direction), orientable.Angle))
            {
                actions.Add(new ActionSwordStab(Curio, Momentum.Direction).InSlot(ActionSlot.Passive));
            }
        }
Example #17
0
        public static Vector2 GetVisualTarget(this ICurio curio)
        {
            var movable = curio.GetBehavior <BehaviorMovable>();

            if (movable != null)
            {
                return(movable.VisualPosition() + new Vector2(8, 8));
            }
            MapTile tile = curio.GetMainTile();

            return(tile?.VisualTarget ?? Vector2.Zero);
        }
Example #18
0
        public IEnumerable <Wait> RoutineStartLevel()
        {
            var tile        = PlayerCurio.GetMainTile();
            var movable     = PlayerCurio.GetBehavior <BehaviorMovable>();
            var orientation = PlayerCurio.GetBehavior <BehaviorOrientable>();
            var start       = tile.GetBehavior <BehaviorLevelStart>();
            var player      = PlayerCurio.GetBehavior <BehaviorPlayer>();

            player.LevelTransition = true;
            orientation.OrientTo(Util.PointToAngle(start.Direction) + MathHelper.Pi);
            var pos = tile.VisualPosition;

            CameraCurio.TeleportVisual(GetOutsidePosition(pos, start.Direction, 150));
            PlayerCurio.TeleportVisual(GetOutsidePosition(pos, start.Direction, 200));
            player.Fade.Set(0);
            yield return(new WaitTime(100));

            CameraCurio.MoveVisual(tile.VisualPosition, LerpHelper.QuadraticOut, new SliderScene(this, 150));
            yield return(new WaitTime(100));

            CurrentTheme?.Stop();
            CurrentTheme = new MusicEffect(Theme);
            CurrentTheme.Volume.Set(0, 1, LerpHelper.QuadraticIn, 20);
            CurrentTheme.Play();
            SoundIngress.Play(1f, 0f, 0f);
            player.Fade.Set(1, LerpHelper.QuarticOut, 70);
            PlayerCurio.MoveVisual(tile.VisualPosition, LerpHelper.QuarticOut, new SliderScene(this, 100));
            yield return(new WaitTime(70));

            player.LevelTransition = false;
            yield return(new WaitTime(30));
        }
Example #19
0
        public static void DrawIcon(this ICurio curio, SceneGame scene, Vector2 pos)
        {
            var behavior = curio.GetBehavior <BehaviorDrawable>();

            if (behavior != null)
            {
                behavior.DrawIcon(scene, pos);
            }
            else if (curio is IDrawableIcon drawable)
            {
                drawable.DrawIcon(scene, pos);
            }
        }
Example #20
0
        public static void Apply(Behavior behavior, ICurio original)
        {
            IOrigin origin;
            var     template = original.GetBehavior <BehaviorTemplate>();

            if (template != null)
            {
                origin = new OriginCopyTemplate(template.Template);
            }
            else
            {
                origin = new OriginCopy(original);
            }
            Apply(behavior, origin);
        }
Example #21
0
        public void OnAction(EventAction e)
        {
            var hits  = e.Actions.GetEffectsTargetting <ActionEnemyHit>(Curio).ToList();
            var alive = Curio.GetBehavior <BehaviorAlive>();

            foreach (var hit in hits)
            {
                if (alive.Armor <= 0)
                {
                    e.Actions.Add(new ActionPlayerDamage(hit.Origin, hit.Target, 1, hit.HitSound).InSlot(ActionSlot.Active));
                }
                else
                {
                    e.Actions.Add(new ActionDestroyArmor(hit.Origin, hit.Target, 1, 0).InSlot(ActionSlot.Active));
                }
            }
        }
Example #22
0
        private void DrawDagger(ICurio curio, SceneGame scene, DrawPass pass)
        {
            var center    = curio.GetVisualPosition() + new Vector2(8, 8);
            var offset    = curio.GetOffset();
            var angleBody = curio.GetVisualAngle();
            var dagger    = curio.GetBehavior <BehaviorDagger>();

            if (dagger != null && !dagger.Upswing.Done)
            {
                var weaponAngle    = (float)LerpHelper.QuadraticOut(0, 1, dagger.Upswing.Slide);
                var weaponScale    = (float)LerpHelper.QuadraticOut(0.5, 1.0, dagger.Upswing.Slide);
                var weaponStartPos = Util.AngleToVector(angleBody + MathHelper.PiOver4 * 2) * 8;
                var weaponEndPos   = Util.AngleToVector(angleBody + MathHelper.PiOver4 * 3) * 10;
                var weaponPos      = center + offset + Vector2.Lerp(weaponStartPos, weaponEndPos, (float)LerpHelper.QuadraticOut(0, 1, dagger.Upswing.Slide));
                scene.DrawSpriteExt(SpriteWeapon, 0, weaponPos - SpriteWeapon.Middle, SpriteWeapon.Middle, angleBody + weaponAngle, new Vector2(weaponScale), SpriteEffects.None, Color.White, 0);
            }
        }
Example #23
0
        public override void Draw(ICurio curio, SceneGame scene, DrawPass pass)
        {
            var spriteHead   = SpriteLoader.Instance.AddSprite("content/lich_head");
            var spriteBody   = SpriteLoader.Instance.AddSprite("content/lich_body");
            var spriteHeart  = SpriteLoader.Instance.AddSprite("content/lich_heart");
            var spriteWeapon = SpriteLoader.Instance.AddSprite("content/lich_weapon");

            var center    = curio.GetVisualPosition() + new Vector2(8, 8);
            var offset    = curio.GetOffset();
            var color     = curio.GetColor();
            var angleBody = curio.GetVisualAngle();
            var lich      = curio.GetBehavior <BehaviorLich>();

            scene.PushSpriteBatch(shader: scene.Shader, shaderSetup: (transform, projection) =>
            {
                scene.SetupColorMatrix(color);
            });

            if (pass == DrawPass.EffectLow)
            {
                scene.DrawSpriteExt(spriteBody, 0, center - spriteBody.Middle, spriteBody.Middle, scene.Frame * 0.1f, new Vector2(1), SpriteEffects.None, Color.Red, 0);
                scene.DrawSpriteExt(spriteBody, 0, center - spriteBody.Middle, spriteBody.Middle, scene.Frame * 0.2f, new Vector2(0.8f), SpriteEffects.None, Color.DarkRed, 0);

                var weaponMiddle = new Vector2(spriteWeapon.Width / 2, spriteWeapon.Height * 2 / 3);
                var weaponOffset = Util.AngleToVector(lich.SwordAngle);
                scene.DrawSpriteExt(spriteWeapon, 0, center + Util.AngleToVector(angleBody) + weaponOffset * 8 - weaponMiddle, weaponMiddle, lich.SwordAngle, new Vector2(lich.SwordScale), SpriteEffects.None, Color.White, 0);

                scene.DrawSpriteExt(spriteBody, 0, center - spriteBody.Middle, spriteBody.Middle, scene.Frame * 0.3f, new Vector2(0.6f), SpriteEffects.None, Color.Black, 0);
            }
            if (pass == DrawPass.Creature)
            {
                if (!curio.IsHeartless())
                {
                    scene.DrawSpriteExt(spriteHeart, 0, center + offset - spriteHeart.Middle, spriteHeart.Middle, 0, new Vector2(1), SpriteEffects.None, Color.White, 0);
                }
            }
            if (pass == DrawPass.Effect)
            {
                var headOffset = Util.AngleToVector(angleBody) * -8;
                scene.DrawSpriteExt(spriteHead, 0, center + headOffset + offset - spriteHead.Middle, spriteHead.Middle, angleBody, new Vector2(1), SpriteEffects.None, Color.White, 0);
            }

            scene.PopSpriteBatch();
        }
        public void OnMove(EventMove.Finish e)
        {
            if (e.Curio != Curio)
            {
                return;
            }

            var orientable = Curio.GetBehavior <BehaviorOrientable>();

            var trail = new Curio(Template.BloodThornTrail);

            trail.MoveTo(e.Source);
            trail.GetBehavior <BehaviorTrailBloodThorn>().Shooter = Projectile.Shooter;
            new TrailParticle(Curio.GetWorld(), SpriteLoader.Instance.AddSprite("content/bloodthorn"), Curio.GetVisualTarget(), 30)
            {
                Angle    = orientable.Angle,
                FadeLerp = LerpHelper.QuadraticIn,
            };
        }
Example #25
0
        public override void Draw(ICurio curio, SceneGame scene, DrawPass pass)
        {
            var spriteIdle = SpriteLoader.Instance.AddSprite("content/rat_idle");
            var spriteMove = SpriteLoader.Instance.AddSprite("content/rat_move");
            var center     = curio.GetVisualPosition() + new Vector2(8, 8);
            var offset     = curio.GetOffset();
            var color      = curio.GetColor();
            var angleBody  = curio.GetVisualAngle();
            var pathfinder = curio.GetBehavior <BehaviorPathfinder>();

            scene.PushSpriteBatch(shader: scene.Shader, shaderSetup: (transform, projection) =>
            {
                scene.SetupColorMatrix(color);
            });
            var spriteBody = pathfinder.HasPath ? spriteMove : spriteIdle;

            scene.DrawSpriteExt(spriteBody, 0, center + offset - spriteBody.Middle, spriteBody.Middle, angleBody, new Vector2(1), SpriteEffects.None, Color.White, 0);
            scene.PopSpriteBatch();
        }
        public void OnAction(EventAction e)
        {
            var hits  = e.Actions.GetEffectsTargetting <IWeaponHit>(Curio).ToList();
            var alive = Curio.GetBehavior <BehaviorAlive>();

            foreach (var hit in hits)
            {
                if (hit is ActionEnemyHit)
                {
                    continue;
                }

                if (hit is ActionStabHit stab)
                {
                    if (alive.Armor <= 0)
                    {
                        e.Actions.Add(new ActionDamage(hit.Origin, hit.Target, 1, 50, 3, SoundLoader.AddSound("content/sound/stab.wav")).InSlot(ActionSlot.Active));
                        e.Actions.Add(new ActionStabStuck(hit.Origin, hit.Target).InSlot(ActionSlot.Active));
                        e.Actions.Add(new ActionAlignGrid(hit.Origin, 2).InSlot(ActionSlot.Active));
                    }
                    else
                    {
                        e.Actions.Add(new ActionParrySword(hit.Origin, hit.Target).InSlot(ActionSlot.Active));
                    }
                }
                else
                {
                    if (alive.Armor <= 0)
                    {
                        e.Actions.Add(new ActionDamage(hit.Origin, hit.Target, 1, 50, 3, SoundLoader.AddSound("content/sound/hit.wav")).InSlot(ActionSlot.Active));
                    }
                    else
                    {
                        e.Actions.Add(new ActionDestroyArmor(hit.Origin, hit.Target, 1, 50).InSlot(ActionSlot.Active));
                    }
                }
            }
        }
Example #27
0
        public void OnAction(EventAction e)
        {
            var hits  = e.Actions.GetEffectsTargetting <IWeaponHit>(Curio).ToList();
            var alive = Curio.GetBehavior <BehaviorAlive>();

            foreach (var hit in hits)
            {
                if (hit is ActionEnemyHit)
                {
                    continue;
                }

                if (hit is ActionStabHit stab)
                {
                    e.Actions.Add(new ActionHitVisual(hit.Origin, hit.Target, SoundLoader.AddSound("content/sound/stab.wav")).InSlot(ActionSlot.Active));
                    e.Actions.Add(new ActionStabStuck(hit.Origin, hit.Target).InSlot(ActionSlot.Active));
                }
                else
                {
                    //Crickets
                }
            }
        }
Example #28
0
        public override void Draw(ICurio curio, SceneGame scene, DrawPass pass)
        {
            var body  = SpriteBody;
            var alive = curio.GetBehavior <BehaviorAlive>();

            if (alive.Armor > 0)
            {
                body = SpriteLoader.Instance.AddSprite($"{SpriteBody.FileName}_armor");
            }
            var center    = curio.GetVisualPosition() + new Vector2(8, 8);
            var offset    = curio.GetOffset();
            var color     = curio.GetColor();
            var angleBody = curio.GetVisualAngle();

            scene.PushSpriteBatch(shader: scene.Shader, shaderSetup: (transform, projection) =>
            {
                scene.SetupColorMatrix(color);
            });
            scene.DrawSpriteExt(body, 0, center + offset - SpriteBody.Middle, SpriteBody.Middle, angleBody, new Vector2(1), SpriteEffects.None, Color.White, 0);
            DrawDagger(curio, scene, pass);
            DrawMace(curio, scene, pass);
            scene.PopSpriteBatch();
        }
Example #29
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 alive      = Curio.GetBehavior <BehaviorAlive>();
            var tile       = Curio.GetMainTile();

            var enemyDistance = Vector2.Distance(scene.PlayerCurio.GetVisualTarget(), Curio.GetVisualTarget());
            var isEnemyFar    = enemyDistance > 200;
            var isEnemyClose  = enemyDistance < 100;
            var isEnemyArmed  = scene.PlayerCurio.HasBehaviors <BehaviorSword>();


            WingsOpen.Update();
            ForwardBack.Update();

            if (active.Done && alive.CurrentDead)
            {
                var actions = new List <ActionWrapper>();
                actions.Add(new ActionNemesisRevive(Curio, 120).InSlot(ActionSlot.Active));
                actions.Apply(Curio);
                if (!actions.Any(x => x.Action is ActionNemesisRevive))
                {
                    scene.GameOver(GameOverType.NemesisKill);
                }
            }

            if (active.Done && Curio.IsAlive())
            {
                if (ForwardBack.End > 0 && State != NemesisState.Forward)
                {
                    ForwardBack.Set(0, LerpHelper.Quadratic, 30);
                }
                if (ForwardBack.End < 1 && State == NemesisState.Forward)
                {
                    ForwardBack.Set(1, LerpHelper.Quadratic, 30);
                }

                if (State == NemesisState.Back)
                {
                    if (isEnemyArmed)
                    {
                        ParryTimer += scene.TimeModCurrent;
                        if (ParryTimer.Done)
                        {
                            State           = NemesisState.Parry;
                            ParryTimer.Time = 0;
                        }
                    }
                    if (isEnemyFar)
                    {
                        ChaseTimer += scene.TimeModCurrent;
                        if (ChaseTimer.Done)
                        {
                            State           = NemesisState.Forward;
                            ChaseTimer.Time = 0;
                        }
                    }
                }
                if (State == NemesisState.Parry)
                {
                    if (!isEnemyArmed || isEnemyFar)
                    {
                        ParryTimer += scene.TimeModCurrent;
                        if (ParryTimer.Done)
                        {
                            State           = NemesisState.Back;
                            ParryTimer.Time = 0;
                        }
                    }
                }
                if (State == NemesisState.Forward)
                {
                    if (isEnemyClose)
                    {
                        State = NemesisState.Back;
                    }

                    ChaseTimer += 1;

                    if (lastSeen.LastSeenTile != null)
                    {
                        var nextMove = pathfinder.GetNextMove(new Point(tile.X, tile.Y));
                        if (lastSeen.LastSeenTile != pathfinder.GetDestination() || !nextMove.HasValue)
                        {
                            pathfinder.FindPath(lastSeen.LastSeenTile);
                        }
                        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 (ChaseTimer.Done)
                            {
                                var randomPath     = pathfinder.Path.Pick(Random);
                                var randomPathTile = Curio.GetMap().GetTileOrNull(randomPath.X, randomPath.Y);
                                if (randomPathTile != tile)
                                {
                                    var dist = Vector2.Distance(randomPathTile.VisualTarget, Curio.GetVisualTarget());
                                    movement.Add(new ActionMoveNemesis(Curio, scene.PlayerCurio, randomPathTile, dist / 8f + 10).InSlot(ActionSlot.Active));
                                    ChaseTimer.Time = 0;
                                }
                            }
                            else if (Math.Abs(angleDelta) < 0.0001)
                            {
                                movement.Add(new ActionMoveForward(Curio, nextMove.Value.ToVector2(), 5).InSlot(ActionSlot.Active));
                            }
                            else if (angleDelta < 0)
                            {
                                movement.Add(new ActionTurn(Curio, -MathHelper.PiOver4, 3).InSlot(ActionSlot.Active));
                            }
                            else if (angleDelta > 0)
                            {
                                movement.Add(new ActionTurn(Curio, MathHelper.PiOver4, 3).InSlot(ActionSlot.Active));
                            }
                            movement.Apply(Curio);
                        }
                    }
                }
            }
        }
Example #30
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);
                    }
                }
            }
        }