iso2/scene/ScenePlayerWake.cs
using Sandbox.Audio;
using Sandbox.Utility;

public class PlayerWake : Component {
	[Property] public BasePlayer Player {get; set;}
	[Property] public SkinnedModelRenderer Body {get; set;}
	[Property] public SkinnedModelRenderer Bulb {get; set;}
	[Property] public NpcAnimator Dog {get; set;}
	[Property] public GameObject DogTargetA {get; set;}
	[Property] public GameObject DogTargetB {get; set;}
	[Property] public GameObject DarkLight {get; set;}
	[Property] public GameObject BulbLight {get; set;}
	[Property] public SoundPointComponent Score {get; set;}
	[Property] public PacViewNode ExitTo {get; set;}
	[Property] public bool Play {get; set;}
	[Property, ReadOnly] public bool Playing {get; set;}
	[Property, ReadOnly] public bool Done {get; set;}

	protected override void OnStart() {
		PlayDelay = 2f;
		base.OnStart();
	}

	private TimeUntil PlayDelay {get; set;}
	private TimeUntil StartDelay {get; set;}
	private TimeUntil Finished;
	protected override void OnUpdate() {
		if (PlayDelay)
			Play = true;
		base.OnUpdate();
		Playing = Playing && Play;
		Done = Done && Play;
		if (Done)
			return;
		Player.WorldTransform = Body.GetAttachment("camera").Value;
		if (!Playing && !Play) {
			Mixer.FindMixerByName("Game").Volume = 0f;
			Dog.GameObject.WorldTransform = DogTargetA.WorldTransform;
			Body.UseAnimGraph = true;
			Body.Set("play", false);
			Bulb.UseAnimGraph = true;
			Bulb.Set("play", false);
			BulbLight.Enabled = false;
			DarkLight.Enabled = true;
			Bulb.MaterialGroup = "off";
			Dog.Activity = "sleep";
			Body.Enabled = true;
			Player.Isometric = false;
			StartDelay = 5.1f;
			if (Player.PacCamera.IsValid()) {
				Player.PacCamera.RenderCamera.FieldOfView = 80f;
				Player.PacCamera.Fade = -1;
			}
		}
		if (Play && !Playing) {
			Score.StartSound();
			Player.PacCamera.Fade = -(StartDelay.Relative*0.25f).Clamp(0,1);
			Mixer.FindMixerByName("Game").Volume = Easing.EaseIn(StartDelay.Fraction);
			Player.PacCamera.FullScreenFMV = true;
			if (!StartDelay)
				return;
			Body.Set("play", true);
			Bulb.Set("play", true);
			Sound.Play("sounds/choreo/player_wake_foley.sound");
			Finished = 18.5f;
			Bulb.OnGenericEvent = (SceneModel.GenericEvent evt) => {
				if (evt.Type == "WAKE_DOG")
					Dog.Activity = "lie";
				if (evt.Type == "DOG_SIT") {
					Dog.Activity = "sit";
					Dog.GameObject.WorldTransform = DogTargetB.WorldTransform;
				}
				if (evt.Type == "LIGHT_ON") {
					BulbLight.Enabled = true;
					DarkLight.Enabled = false;
					Bulb.MaterialGroup = "Default";
				}
			};
			Playing = true;
		} else if (Play && Playing) {
			if (Player.PacCamera.IsValid())
				Player.PacCamera.RenderCamera.FieldOfView = 80f;
			if (!Finished)
				return;
			Playing = false;
			Done = true;
			if (!BulbLight.Enabled)
				BulbLight.Enabled = true;
			DarkLight.Enabled = false;
			Bulb.MaterialGroup = "Default";
			Body.Enabled = false;
			ExitTo.ConnectToNode(0, PlayerPacCamera.TransitionType.None);
			BulbLight.Parent.WorldPosition = Vector3.Zero;
		}
	}
}