LADXHD/InGame/Overlay/Sequences/MariaBeachSequence.cs
2023-12-14 17:21:22 -05:00

183 lines
7.1 KiB
C#

using Microsoft.Xna.Framework;
using ProjectZ.InGame.Things;
using System;
namespace ProjectZ.InGame.Overlay.Sequences
{
class MarinBeachSequence : GameSequence
{
struct Seagull
{
public SeqAnimation Animation;
public Vector2 Position;
public Vector2 Direction;
public float GlideCounter;
}
private readonly Seagull[] _seagulls = new Seagull[2];
private readonly Seagull[] _smallSeagulls = new Seagull[5];
private SeqAnimation _aniLink;
private SeqAnimation _aniMarin;
private Vector2 _seagullCenter;
private float _shoreSoundCounter;
private float _birdSoundCounter;
public MarinBeachSequence()
{
_sequenceWidth = 320;
_sequenceHeight = 128 + 48;
}
public override void OnStart()
{
Sprites.Clear();
SpriteDict.Clear();
var top = 48;
var center = 160;
// sky background
Sprites.Add(new SeqColor(new Rectangle(0, 0, _sequenceWidth, top), new Color(66, 89, 254), 0));
// beach
Sprites.Add(new SeqSprite("beach_background", new Vector2(0, top), 0));
Sprites.Add(new SeqSprite("beach_palm", new Vector2(56, top + 32), 2));
Sprites.Add(new SeqSprite("beach_palm", new Vector2(208, top + 32), 2));
// waves
for (int i = 0; i < 20; i++)
{
Sprites.Add(new SeqAnimation("Sequences/beach_water", "top", new Vector2(i * 16, top + 56), 1));
Sprites.Add(new SeqAnimation("Sequences/beach_water", "bottom", new Vector2(i * 16, top + 72), 1));
}
// link and marin
_aniLink = new SeqAnimation("link0", "ocean_sit", new Vector2(center - 14, top + 92), 1) { Shader = Resources.ColorShader, Color = Game1.GameManager.CloakColor };
AddDrawable("link", _aniLink);
_aniMarin = new SeqAnimation("NPCs/marin", "ocean_sit", new Vector2(center + 1, top + 92), 1);
AddDrawable("marin", _aniMarin);
_seagulls[0] = new Seagull()
{
Position = new Vector2(center - 90, top - 48),
Direction = new Vector2(0.5f, 0.25f),
GlideCounter = 1500,
};
_seagulls[1] = new Seagull()
{
Position = new Vector2(center + 64, top),
Direction = new Vector2(-0.5f, 0.2f),
GlideCounter = 2500,
};
Sprites.Add(_seagulls[0].Animation = new SeqAnimation("Sequences/seagull", "glide", _seagulls[0].Position, 1));
Sprites.Add(_seagulls[1].Animation = new SeqAnimation("Sequences/seagull", "glide", _seagulls[1].Position, 1));
_seagullCenter = new Vector2(center, top + 38);
for (int i = 0; i < _smallSeagulls.Length; i++)
{
var posX = Game1.RandomNumber.Next(0, 32) - 16;
var posY = Game1.RandomNumber.Next(0, 12);
_smallSeagulls[i] = new Seagull()
{
Position = new Vector2(_seagullCenter.X + posX, _seagullCenter.Y + posY),
Direction = new Vector2(0.5f, 0.25f),
//GlideCounter = Game1.RandomNumber.Next(0, 5000),
};
Sprites.Add(_smallSeagulls[i].Animation = new SeqAnimation("Sequences/seagull small", "idle", _smallSeagulls[i].Position, i + 1) { RoundPosition = true });
_smallSeagulls[i].Animation.Animator.SetTime(Game1.RandomNumber.Next(0, _smallSeagulls[i].Animation.Animator.CurrentFrame.FrameTime));
}
// start the sequence path
Game1.GameManager.SaveManager.SetString("seq_beach", "0");
Game1.GameManager.StartDialogPath("seq_beach");
base.OnStart();
}
public override void Update()
{
base.Update();
UpdateSeagulls();
}
private void UpdateSeagulls()
{
_birdSoundCounter -= Game1.DeltaTime;
if (_birdSoundCounter < 0)
{
_birdSoundCounter += Game1.RandomNumber.Next(1000, 3500);
Game1.GameManager.PlaySoundEffect("D360-33-21");
}
_shoreSoundCounter -= Game1.DeltaTime;
if (_shoreSoundCounter < 0)
{
_shoreSoundCounter += 3500;
Game1.GameManager.PlaySoundEffect("D378-15-0F");
}
// update the seagulls far away
for (int i = 0; i < _smallSeagulls.Length; i++)
{
_smallSeagulls[i].GlideCounter -= Game1.DeltaTime;
if (_smallSeagulls[i].GlideCounter < 0)
{
_smallSeagulls[i].GlideCounter = Game1.RandomNumber.Next(500, 1250);
// glide down
if (Game1.RandomNumber.Next(0, 4) == 0)
{
_smallSeagulls[i].Direction.X *= 0.25f;
_smallSeagulls[i].Direction.Y = 0.1f;
_smallSeagulls[i].Animation.Animator.Play("glide");
}
else
{
var centerDirection = _seagullCenter - _smallSeagulls[i].Position;
if (centerDirection != Vector2.Zero)
{
var distance = MathHelper.Clamp(1 - centerDirection.Length() / 48, 0, 1);
var radiant = MathF.Atan2(centerDirection.Y, centerDirection.X) + (MathF.PI - Game1.RandomNumber.Next(0, 628) / 100f) * distance;
_smallSeagulls[i].Direction = new Vector2(MathF.Cos(radiant), MathF.Sin(radiant)) * (Game1.RandomNumber.Next(8, 15) / 100f);
}
_smallSeagulls[i].Animation.Animator.Play("idle");
}
}
_smallSeagulls[i].Direction.X *= (float)Math.Pow(0.99f, Game1.TimeMultiplier);
_smallSeagulls[i].Position += _smallSeagulls[i].Direction * Game1.TimeMultiplier;
_smallSeagulls[i].Animation.Position = _smallSeagulls[i].Position;
}
// update the closer seagulls
for (int i = 0; i < _seagulls.Length; i++)
{
if (_seagulls[i].GlideCounter > 0)
{
_seagulls[i].GlideCounter -= Game1.DeltaTime;
if (_seagulls[i].GlideCounter <= 0)
{
_seagulls[i].Direction.Y = -_seagulls[i].Direction.Y;
_seagulls[i].Animation.Animator.Play("idle");
}
}
_seagulls[i].Position += _seagulls[i].Direction * Game1.TimeMultiplier;
_seagulls[i].Animation.Position = _seagulls[i].Position;
}
}
}
}