Ejemplo n.º 1
0
        public override void Update()
        {
            base.Update();
            if (_preset.Alive)
            {
                if (touching != Touching.NONE)
                {
                    walk_t = 0;
                }

                Vector2 grid = MapUtilities.GetInGridPosition(Position);
                if ((grid.X < 5 && velocity.X < 0) || (grid.X + width > 155 && velocity.X > 0) ||
                    (grid.Y < 5 && velocity.Y < 0) || (grid.Y + height > 155 && velocity.Y > 0))
                {
                    walk_t = 0;
                }

                walk_t -= GameTimes.DeltaTime;
                if (walk_t <= 0)
                {
                    (velocity.X, velocity.Y) = (velocity.Y, -velocity.X);
                    FaceTowards(Position + velocity);
                    PlayFacing("walk");
                    walk_t = walk_t_max;
                }
            }
            else if (_curAnim.Finished && !blood.exists)
            {
                SpawnBlood();
            }
        }
Ejemplo n.º 2
0
        IEnumerator CutSceneState()
        {
            while (!GlobalState.LastDialogueFinished)
            {
                yield return("wait");
            }

            GlobalState.disable_menu = true;
            _player.BeIdle();
            _player.state = PlayerState.INTERACT;

            velocity = -Vector2.UnitY * 40;
            Play("walk_u");

            while (MapUtilities.GetInGridPosition(Position).Y > 6 * 16)
            {
                yield return("move up");
            }

            velocity = Vector2.UnitX * 40;
            Play("walk_r");

            while (MapUtilities.GetInGridPosition(Position).X > 10) //wraps around when on next screen
            {
                yield return("move right");
            }

            exists = false;
            GlobalState.disable_menu = false;
            _player.state            = PlayerState.GROUND;

            yield break;
        }
Ejemplo n.º 3
0
        IEnumerator <string> StateLogic()
        {
            while (MapUtilities.GetInGridPosition(_p.Position).X > 80)
            {
                volume.Update();
                yield return("Waiting");
            }
            Sounds.SoundManager.StopSong();
            var sound = Sounds.SoundManager.PlaySoundEffect("red_cave_rise");

            GlobalState.Dialogue = Dialogue.DialogueManager.GetDialogue("happy_npc", "briar");
            while (!GlobalState.LastDialogueFinished || sound.State == Microsoft.Xna.Framework.Audio.SoundState.Playing)
            {
                GlobalState.screenShake.Shake(0.02f, 0.1f);
                _p.dontMove = true;
                yield return("Dialogue");
            }
            _p.dontMove = false;
            GlobalState.events.IncEvent("HappyStarted");

            GlobalState.flash.Flash(1f, Color.Red, () => {
                ((Map)GlobalState.Map).ReloadSettings(_p);
                GlobalState.darkness.ForceAlpha(1);
            });

            yield break;
        }
Ejemplo n.º 4
0
 public virtual void Draw()
 {
     if (exists)
     {
         if (visible)
         {
             Rectangle srect = sprite.GetRect(_curAnim.Frame);
             srect.Height -= (int)y_push;
             SpriteDrawer.DrawSprite(sprite.Tex,
                                     MathUtilities.CreateRectangle(Position.X - offset.X * scale, Position.Y - offset.Y * scale + (int)y_push, srect.Width * scale, srect.Height * scale),
                                     srect,
                                     color * opacity,
                                     rotation,
                                     _flip,
                                     DrawingUtilities.GetDrawingZ(layer, MapUtilities.GetInGridPosition(Position).Y + height));
         }
         if (shadow != null)
         {
             shadow.Draw();
         }
         if (GlobalState.draw_hitboxes && HasVisibleHitbox)
         {
             SpriteDrawer.DrawSprite(ResourceManager.GetTexture("hitbox"), Hitbox, color: Color.Red, Z: DrawingUtilities.GetDrawingZ(DrawOrder.HITBOX, 0));
         }
     }
 }
Ejemplo n.º 5
0
        public PlayerDieDummy(Vector2 pos, string textureName)
            : base(MapUtilities.GetInGridPosition(pos), textureName, 16, 16, DrawOrder.PLAYER_DIE_DUMMY)
        {
            Position.Y += 20;
            AddAnimation("die", CreateAnimFrameArray(25, 26, 27, 24, 25, 26, 27, 24, 25, 26, 27, 32), 12, false);

            Play("die");
        }
Ejemplo n.º 6
0
 public override void Collided(Entity other)
 {
     if (other is Player p && !disable_player_hit)
     {
         SoundManager.PlaySoundEffect("player_hit_1");
         Vector2 targetInGrid = new(16, 8 * 16);
         Vector2 target       = p.Position + (targetInGrid - MapUtilities.GetInGridPosition(p.Position));
         p.AutoJump(1, target, 50, -500);
         disable_player_hit = true;
     }
 }
Ejemplo n.º 7
0
        public override void Update()
        {
            base.Update();
            if (_curAnim.Finished)
            {
                velocity = Vector2.Zero;
                exists   = false;
                return;
            }

            if (MapUtilities.GetInGridPosition(Position).X < 32)
            {
                Play("fall");
            }
        }
Ejemplo n.º 8
0
        public override void Draw()
        {
            if (visible && exists)
            {
                float draw_y = MapUtilities.GetInGridPosition(Position).Y;
                if (!is_behind_player)
                {
                    float player_y = MapUtilities.GetInGridPosition(_root.Position).Y;
                    draw_y = player_y + 0.5f;
                }
                SpriteDrawer.DrawSprite(Texture, MathUtilities.CreateRectangle(Position.X - offset.X, Position.Y - offset.Y, frameWidth, frameHeight), spriteRect, rotation: rotation, Z: DrawingUtilities.GetDrawingZ(layer, draw_y));

                wide_attack.Draw();
                long_attack.Draw();
            }
        }
Ejemplo n.º 9
0
        IEnumerator CutSceneState()
        {
            while (!GlobalState.LastDialogueFinished)
            {
                yield return("wait");
            }

            GlobalState.disable_menu = true;
            _player.BeIdle();
            _player.state = PlayerState.INTERACT;

            GlobalState.events.IncEvent("icky.rescued");

            velocity = Vector2.UnitX * 20;
            Play("walk_r");

            while (MapUtilities.GetInGridPosition(Position).X < 85)
            {
                yield return("move right");
            }

            velocity = Vector2.Zero;
            Play("walk_d");

            GlobalState.disable_menu = false;
            _player.state            = PlayerState.GROUND;

            GlobalState.Dialogue = DialogueManager.GetDialogue("goldman", "etc", 3);

            while (!GlobalState.LastDialogueFinished)
            {
                yield return("say thanks");
            }

            velocity = Vector2.UnitX * 20;
            Play("walk_r");

            while (MapUtilities.GetInGridPosition(Position).X < 6 * 16)
            {
                yield return("move to final position");
            }

            velocity = Vector2.Zero;
            Play("walk_d");

            yield break;
        }
Ejemplo n.º 10
0
        IEnumerator <CutsceneEvent> Entrance()
        {
            VolumeEvent volume = new(0, 0.6f);

            yield return(new EntityEvent(Enumerable.Repeat(volume, 1)));

            while (!volume.ReachedTarget)
            {
                yield return(null);
            }

            Play("walk_d");
            opacity = 0;
            visible = true;
            Sounds.SoundManager.StopSong();

            while (!MathUtilities.MoveTo(ref opacity, 0.4f, appearance_vel))
            {
                yield return(null);
            }

            velocity.Y = 20;
            Sounds.SoundManager.PlaySong("go", 0.4f);
            volume.SetTarget(1f);
            volume.speed = appearance_vel;

            water_anim = CoroutineUtils.OnceEvery(WaterAnim.DoWaterAnim(Position), 0.3f);

            while (MapUtilities.GetInGridPosition(Position).Y < 44)
            {
                MathUtilities.MoveTo(ref opacity, 1f, appearance_vel);
                yield return(null);
            }

            opacity  = 1f;
            velocity = 20 * Vector2.UnitX;
            Play("walk_r");
            while (MapUtilities.GetInGridPosition(Position).X > 20) //wraps around when off screen
            {
                yield return(null);
            }

            exists = preset.Alive = false;
            GlobalState.events.IncEvent("HappyDone");
        }
Ejemplo n.º 11
0
        public virtual void Draw()
        {
            if (visible && exists)
            {
                SpriteDrawer.DrawSprite(Texture,
                                        MathUtilities.CreateRectangle(Position.X - offset.X * scale, Position.Y - offset.Y * scale, frameWidth * scale, frameHeight * scale),
                                        spriteRect,
                                        Color.White * _opacity,
                                        rotation,
                                        _flip,
                                        DrawingUtilities.GetDrawingZ(layer, MapUtilities.GetInGridPosition(Position).Y));

                if (shadow != null)
                {
                    shadow.Draw();
                }
            }
        }
Ejemplo n.º 12
0
        IEnumerator <CutsceneEvent> Exit()
        {
            yield return(new DialogueEvent(DialogueManager.GetDialogue("misc", "any", "mitra", 3)));

            bike.exists = false;
            OnBike();

            velocity.X = 37;
            Solid      = false;                                     //disable collisions to not push player out of the screen

            while (MapUtilities.GetInGridPosition(Position).X > 10) //until wrap around from exiting the screen
            {
                yield return(null);
            }

            _preset.Alive = exists = false;
            GlobalState.SpawnEntity(new FadeSwitchSong("cliff"));

            yield break;
        }
Ejemplo n.º 13
0
        public override void Draw()
        {
            if (visible && exists)
            {
                float draw_y = MapUtilities.GetInGridPosition(Position).Y;
                if (!is_behind_player)
                {
                    float player_y = MapUtilities.GetInGridPosition(_root.Position).Y + _root.height;
                    draw_y = player_y + 0.5f;
                }
                SpriteDrawer.DrawSprite(sprite.Tex, MathUtilities.CreateRectangle(Position.X - offset.X, Position.Y - offset.Y, sprite.Width, sprite.Height), sprite.GetRect(_curAnim.Frame), rotation: rotation, Z: DrawingUtilities.GetDrawingZ(layer, draw_y));

                wide_attack.Draw();
                long_attack.Draw();

                //Draw hitbox, but not yourself
                visible = false;
                base.Draw();
                visible = true;
            }
        }
Ejemplo n.º 14
0
 public IEnumerator Stomp()
 {
     stomp_parabola.ResetTime();
     velocity.X     = -30;
     shadow.visible = true;
     while (true)
     {
         if ((velocity.X < 0 && MapUtilities.GetInGridPosition(Position).X < 16) ||
             (velocity.X > 0 && MapUtilities.GetInGridPosition(Position).X > 16 * 9 - width))
         {
             velocity *= -1;
         }
         if (stomp_parabola.Tick())
         {
             SoundManager.PlaySoundEffect("wb_tap_ground");
             SpawnExplosion();
             stomp_parabola.ResetTime();
         }
         yield return(null);
     }
 }
Ejemplo n.º 15
0
        public override void Update()
        {
            base.Update();
            if (_player.state == PlayerState.AIR)
            {
                player_jumped = true;
            }

            Vector2 player_grid_pos = MapUtilities.GetInGridPosition(_player.Position);

            if (!visible && player_grid_pos.Y > 50)
            {
                Position = MapUtilities.GetRoomUpperLeftPos(GlobalState.CurrentMapGrid) + new Vector2(180, 80);
                visible  = true;
                GlobalState.StartCutscene = Entrance();
            }
            else if (!exiting && visible && (player_grid_pos.X > 135 || player_grid_pos.Y < 49))
            {
                exiting = true;
                GlobalState.StartCutscene = Exit();
            }
        }
Ejemplo n.º 16
0
        public IEnumerator Attack()
        {
            Play("charge");
            Flicker(1.3f);
            SoundManager.PlaySoundEffect("sun_guy_charge");
            while (_flickering)
            {
                yield return(null);
            }

            Play("attack");

            velocity.Y = 50;
            while (MapUtilities.GetInGridPosition(Position).Y < 16 * 6 + 11)
            {
                yield return(null);
            }

            velocity.Y = -65;
            while (MapUtilities.GetInGridPosition(Position).Y > 45)
            {
                yield return(null);
            }

            velocity.Y = 80;
            while (MapUtilities.GetInGridPosition(Position).Y < 16 * 6 + 11)
            {
                yield return(null);
            }

            velocity = Vector2.Zero;
            while (!MathUtilities.MoveTo(ref Position.Y, start_loc.Y, 110))
            {
                yield return(null);
            }

            yield break;
        }
Ejemplo n.º 17
0
        public override void Update()
        {
            base.Update();
            if (_curAnim.Finished)
            {
                if (_curAnim.name == "fall")
                {
                    velocity = Vector2.Zero;
                    exists   = false;
                    return;
                }
                else //rise
                {
                    Launch();
                }
            }

            if (MapUtilities.GetInGridPosition(Position).X < 32)
            {
                Play("fall");
                disable_player_hit = true;
            }
        }
Ejemplo n.º 18
0
            public override void Update()
            {
                base.Update();
                if (_curAnim.Finished || opacity == 0)
                {
                    exists = false;
                }

                if (_flickering)
                {
                    Flicker(0.05f);
                }

                if (opacity != 1f)
                {
                    MathUtilities.MoveTo(ref opacity, 0, 0.3f);
                }

                if (opacity == 1f && MapUtilities.GetInGridPosition(Position).Y > 8 * 16)
                {
                    Play("fizzle");
                }
            }
Ejemplo n.º 19
0
        IEnumerator State()
        {
            y_push = sprite.Height;
            player.grid_entrance = MapUtilities.GetRoomUpperLeftPos(GlobalState.CurrentMapGrid) + Vector2.One * 20;

            GlobalState.SpawnEntity(new VolumeEvent(0, 3));

            while (MapUtilities.GetInGridPosition(player.Position).X < 48)
            {
                yield return(null);
            }

            GlobalState.Dialogue = Dialogue.DialogueManager.GetDialogue("redboss", "before_fight");

            float push_timer = 0f;

            loopSFX = true;
            while (!GlobalState.LastDialogueFinished)
            {
                push_timer += GameTimes.DeltaTime;
                if (push_timer >= push_tick_max)
                {
                    push_timer = 0f;
                    if (y_push > 0)
                    {
                        GlobalState.screenShake.Shake(0.021f, 0.1f);
                        y_push--;
                    }
                }
                yield return(null);
            }
            loopSFX = false;

            SoundManager.PlaySong("redcave-boss");
            Play("bob");

            IState state = new StateMachineBuilder()
                           .State <SplashState>("Splash")
                           .Enter((s) => amp = 5)
                           .Event("Splash", (s) =>
            {
                splash_bullets.Spawn(b => b.Spawn(), 4);
            })
                           .Event("Tentacles", (s) =>
            {
                SpawnTentacles();
                if (proximity_hits != Touching.NONE)
                {
                    s.got_too_close++;
                    if (s.got_too_close == 2)
                    {
                        s.got_too_close = 0;
                        s.Parent.ChangeState("Stun");
                    }
                }
            })
                           .End()
                           .State <DashState>("Dash")
                           .Enter((s) =>
            {
                amp      = 0;
                velocity = new Vector2(30, 20);
                Play("bob");
            })
                           .Update((s, _) =>
            {
                Drawing.Effects.ScreenShake.Directions dirs = new();
                Vector2 tl = MapUtilities.GetInGridPosition(Position);
                Vector2 br = MapUtilities.GetInGridPosition(Position + new Vector2(width, height));
                if (tl.Y < 2 * 16)
                {
                    velocity.Y = 60;
                    dirs      |= Drawing.Effects.ScreenShake.Directions.Vertical;
                }
                else if (br.Y > 16 * 8)
                {
                    velocity.Y = -60;
                    dirs      |= Drawing.Effects.ScreenShake.Directions.Vertical;
                }

                if (tl.X < 2 * 16)
                {
                    velocity.X = 60;
                    dirs      |= Drawing.Effects.ScreenShake.Directions.Horizontal;
                }
                else if (br.X > 16 * 8)
                {
                    velocity.X = -60;
                    dirs      |= Drawing.Effects.ScreenShake.Directions.Horizontal;
                }
                GlobalState.screenShake.Shake(0.05f, 0.1f, dirs);
            })
                           .Event("Tentacles", (s) =>
            {
                SpawnTentacles();
                if (proximity_hits != Touching.NONE)
                {
                    s.got_too_close++;
                    if (s.got_too_close == 2)
                    {
                        s.got_too_close = 0;
                        s.Parent.ChangeState("Splash");
                    }
                }
            })
                           .Event("EndDash", (s) =>
            {
                s.Parent.ChangeState("Stun");
            })
                           .Exit((s) => velocity = Vector2.Zero)
                           .End()
                           .State <StunState>("Stun")
                           .Enter((s) => s.stateLogic = StunStateLogic())
                           .Update((s, _) =>
            {
                if (!s.stateLogic.MoveNext())
                {
                    s.Parent.ChangeState("Dash");
                }
            })
                           .End()
                           .Build();

            state.ChangeState("Splash");
            state.TriggerEvent("Splash"); //First time instantly fires splash bullets

            while (health > 0)
            {
                state.Update(GameTimes.DeltaTime);

                pushdown_timer += GameTimes.DeltaTime * 3;
                y_push          = (int)(amp + MathF.Sin(pushdown_timer) * amp);
                yield return(null);
            }

            velocity = Vector2.Zero;

            SoundManager.StopSong();
            GlobalState.Dialogue = Dialogue.DialogueManager.GetDialogue("redboss", "after_fight");
            GlobalState.screenShake.Shake(0.05f, 0.1f);
            GlobalState.flash.Flash(1f, Color.Red);

            while (!GlobalState.LastDialogueFinished)
            {
                yield return(null);
            }

            Play("die");
            SoundManager.PlaySoundEffect("redboss_death");
            GlobalState.wave.active = true;

            y_push = 0;

            while (y_push < sprite.Height)
            {
                MathUtilities.MoveTo(ref ripple.opacity, 0, 0.3f);

                push_timer += GameTimes.DeltaTime;
                if (push_timer >= push_tick_max)
                {
                    push_timer = 0f;
                    y_push++;
                }
                yield return(null);
            }

            float final_timer = 2f;

            while (final_timer > 0f)
            {
                final_timer -= GameTimes.DeltaTime;
                yield return(null);
            }

            preset.Alive            = exists = false;
            GlobalState.wave.active = false;
            SoundManager.PlaySong("redcave");
            GlobalState.events.BossDefeated.Add("REDCAVE");
            yield break;
        }
Ejemplo n.º 20
0
        protected IEnumerator <string> StateLogic()
        {
            //s_invisible ctr -1
            while (GlobalState.IsDungeon && !GlobalState.events.BossDefeated.Contains(GlobalState.CURRENT_MAP_NAME))
            {
                yield return("WaitForBoss");
            }

            Vector2 targetPos = MapUtilities.GetInGridPosition(_sentinel.Position);

            visible = true;
            Play("fly");

            _chirp = true;

            //s_animating ctr -1
            while (!(MathUtilities.MoveTo(ref Position.X, targetPos.X, Movement) & MathUtilities.MoveTo(ref Position.Y, targetPos.Y + 20, Movement)))
            {
                yield return("FlyToStart");
            }

            _sentinel.Activated = true;
            Play("idle");

            //s_visible ctr 0
            while (!_sentinel.PlayerCollided)
            {
                if (_sentinel.PlayerAway)
                {
                    Play("fly");
                    velocity.Y = -100;

                    //s_visible crt 1
                    while (!MathUtilities.MoveTo(ref opacity, 0, 1.2f))
                    {
                        yield return("FlyAway");
                    }

                    _sentinel.exists = false;

                    yield break;
                }

                yield return("WaitForPlayer");
            }

            float timer = 0;

            _player.BeIdle();
            _player.state            = PlayerState.INTERACT;
            GlobalState.disable_menu = true;

            Play("fly");

            //s_animating ctr 0
            while (GlobalState.CUR_HEALTH < GlobalState.MAX_HEALTH)
            {
                timer += GameTimes.DeltaTime;

                if (timer > 0.5f)
                {
                    timer = 0;
                    SoundManager.PlaySoundEffect("get_small_health");

                    GlobalState.CUR_HEALTH++;
                }

                yield return("HealPlayer");
            }

            //TODO hp up achievement?

            targetPos = HealthBar.GetHealthPiecePos(GlobalState.MAX_HEALTH);
            _chirp    = false;

            //s_animating ctr 1
            while (!(MathUtilities.MoveTo(ref Position.X, targetPos.X - 4, Movement) & MathUtilities.MoveTo(ref Position.Y, targetPos.Y - 4, Movement)))
            {
                yield return("FlyToHealth");
            }

            Play("gnaw");
            int gnaws = 0;

            //First one is instant
            timer = 2f;

            while (gnaws < 3)
            {
                timer += GameTimes.DeltaTime;

                if (timer > 1.7f)
                {
                    timer = 0;
                    gnaws++;
                    SoundManager.PlaySoundEffect("4sht_pop");
                    foreach (var box in _particles)
                    {
                        box.Spawn(Position);
                    }
                }

                yield return("Gnaw");
            }

            GlobalState.MAX_HEALTH++;
            GlobalState.CUR_HEALTH++;

            Play("fly");
            velocity.Y    = -40;
            _preset.Alive = false;

            while (!MathUtilities.MoveTo(ref opacity, 0, 0.6f))
            {
                yield return("FadingOut");
            }

            _player.state            = PlayerState.GROUND;
            GlobalState.disable_menu = false;

            while (_particles.Any(p => p.exists))
            {
                yield return("WaitingForBoxes");
            }

            _sentinel.exists = false;

            yield break;
        }