Hotspot.cs
namespace NiuLai;

public sealed class Hotspot : Component
{
	[Property] public string Id { get; set; }
	[Property] public string LabelCn { get; set; }
	[Property] public string LabelEn { get; set; }
	[Property] public float Radius { get; set; } = 80f;

	public bool InRange( Vector3 pos ) =>
		(WorldPosition.WithZ( 0 ) - pos.WithZ( 0 )).Length < Radius;

	public void Use()
	{
		GameAudio.PlayForHotspot( Id );
		Trophies.OnUsed( Id );
		switch ( Id )
		{
			case "mom":
				if ( GameState.Beat == Beat.Canyon && !GameState.MomGone )
					GameState.HearMom();
				else if ( GameState.Beat == Beat.Night && !GameState.HasMilk && !GameState.GaveMilk )
					GameState.GiveMilk();
				else if ( !GameState.MomGone )
					Chatter.Say( "牛妈妈 / Mama", Chatter.Pick( Lines.MomIntro ), 3.0f );
				else
					Chatter.Say( "牛妈妈 / Mama", new Line( "风还在。", "Wind still here." ) );
				break;

			case "lark":
				if ( GameState.Beat == Beat.Migrate && !GameState.HeardLikeHere )
					GameState.HearLikeHere();
				else if ( GameState.Beat == Beat.Migrate )
					FilmCut.Play( CutId.LarkBack );
				else if ( GameState.Beat == Beat.Farewell )
					FilmCut.Play( CutId.Ng );
				else if ( GameState.Beat == Beat.Wake )
					GameState.Talk( "云玎 / Yun Ding", new[] { new Line( "跟着我飞的线。", "Follow my fly line." ) } );
				else
					GameState.Talk( "云玎 / Yun Ding", Lines.Dream );
				break;

			case "snake":
				GameState.GetBitten();
				break;

			case "creek":
				GameState.JumpCreek();
				break;

			case "leopard":
				if ( GameState.FedLeopard && GameState.Beat == Beat.Ban )
					GameState.BanBaoLa();
				else if ( GameState.FedLeopard && GameState.ShareAgain() )
					break;
				else if ( GameState.FedLeopard )
					GameState.Talk( "豹拉 / Bao La", new[] { new Line( "我还在。他们不信我。急什么。", "I still here. They not believe me. Rush what." ) } );
				else if ( !GameState.TryLeopardMeet() )
					GameState.Talk( "豹拉 / Bao La", new[] { new Line( "先去吃草。再分给我。", "First go eat grass. Then share to me." ) } );
				break;

			case "rock":
				GameState.Talk( "三只狼 / Three wolves", Lines.RockStare );
				if ( GameState.Beat == Beat.Wolves )
					GameState.FirstWolfWave();
				break;

			case "niuer":
				if ( GameState.Beat == Beat.Suspect )
					GameState.HearSuspect();
				else if ( GameState.Beat == Beat.Ban )
					GameState.BanBaoLa();
				else
					Chatter.Say( "牛二 / Niu Er", Chatter.Pick( Lines.Suspect ), 3.0f );
				break;

			case "dad":
				if ( GameState.Beat is Beat.Wake or Beat.Reunion )
					GameState.MeetDad();
				else
					GameState.Talk( "牛爸爸 / Cow Father", new[] { new Line( "先走完你的路。", "First finish your road." ) } );
				break;

			case "cart":
				if ( GameState.Beat == Beat.Cart )
					GameState.MooCart();
				else
					Chatter.Say( "台车 / The Cart", new Line( "它还会更大。现在只是预习。", "It will more big. Now only rehearsal." ) );
				break;

			case "grass":
				var tuft = GameObject.Components.Get<GrassTuft>();
				if ( tuft.IsValid() )
					tuft.Eat();
				else
					GameState.EatGrass();
				break;

			case "orb":
				GameState.EatGrass();
				GameState.CourageBoost( 1 );
				Chatter.Say( "树球 / Tree ball", Chatter.Pick( Lines.Orb ) );
				GameObject.Destroy();
				break;

			case "mask":
				Chatter.Say( "口罩牛 / Mask cow", Chatter.Pick( Lines.MaskCow ), 3.2f );
				GameAudio.PlayClip( GameAudio.Stand, 0.8f );
				break;
		}
	}
}