Files
aibis-dream/Assets/Scripts/FixSystemNew/FixSceneDirector.cs
T

128 lines
4.4 KiB
C#

using System.Collections;
using AibisDream.Framework;
using UnityEngine;
namespace AibisDream.FixSystem
{
/// <summary>
/// Directs Fix scene mode transitions. This is a scene cue board, not a gameplay state machine:
/// cues orchestrate cameras, timelines, UI masks, bubbles and interaction setup.
/// </summary>
public class FixSceneDirector
{
public FixSceneMode CurrentMode { get; private set; }
public bool HasMode { get; private set; }
public bool IsTransitioning { get; private set; }
private readonly FixSystemData _data;
private IFixSceneCue _currentCue;
public FixSceneDirector(FixSystemData data)
{
_data = data;
}
public IEnumerator Init(FixSceneMode initMode)
{
_data.curMode = initMode;
_data.args = "";
yield return TransitionInternal(initMode, "", FixTransitionMode.Animated);
}
public IEnumerator TransitionTo(FixSceneMode nextMode, string args = "")
{
yield return TransitionInternal(nextMode, args, FixTransitionMode.Animated);
}
public IEnumerator TransitionToImmediate(FixSceneMode nextMode, string args = "")
{
yield return TransitionInternal(nextMode, args, FixTransitionMode.Immediate);
}
public IEnumerator QuitCurrentMode()
{
if (_currentCue != null)
{
var transition = new FixTransition(CurrentMode, FixSceneMode.Default, "", FixTransitionMode.Animated);
yield return _currentCue.Exit(transition);
}
_data.curMode = FixSceneMode.Default;
_data.args = "";
_currentCue = null;
CurrentMode = FixSceneMode.Default;
HasMode = false;
IsTransitioning = false;
}
private IEnumerator TransitionInternal(FixSceneMode nextMode, string args, FixTransitionMode mode)
{
if (IsTransitioning && mode == FixTransitionMode.Animated)
{
Debug.LogWarning($"[FixSceneDirector] Transition ignored while another transition is running: {CurrentMode} -> {nextMode}");
yield break;
}
if (HasMode && CurrentMode.Equals(nextMode))
{
yield break;
}
IsTransitioning = true;
var transition = new FixTransition(HasMode ? CurrentMode : null, nextMode, args, mode);
if (mode == FixTransitionMode.Animated && _currentCue != null)
{
yield return _currentCue.Exit(transition);
}
_currentCue = CreateCue(nextMode, args);
CurrentMode = nextMode;
HasMode = true;
_data.curMode = nextMode;
_data.args = args ?? "";
EnumEventSystem.Global.Send(EventEnum.FixSceneModeChanged, nextMode);
if (mode == FixTransitionMode.Immediate)
{
yield return _currentCue.EnterImmediate(transition);
}
else
{
yield return _currentCue.Enter(transition);
}
IsTransitioning = false;
}
private static IFixSceneCue CreateCue(FixSceneMode nextMode, string args)
{
IFixSceneCue res = nextMode switch
{
FixSceneMode.Default => new DefaultCue(),
FixSceneMode.Clinic => new ClinicCue(),
FixSceneMode.BodyModule => new BodyModuleCue(),
FixSceneMode.Memory => new MemoryCue(),
FixSceneMode.Eye => new EyeCue(),
FixSceneMode.UF => new UfCue(),
FixSceneMode.Expression => new ExpressionCue(),
FixSceneMode.Emo => new EmoCue(),
FixSceneMode.Op => new OpCue(),
FixSceneMode.EmoCut => new EmoCutCue(),
FixSceneMode.MemoryCut => new MemoryCutCue(),
FixSceneMode.LogicCut => new LogicCutCue(),
FixSceneMode.Dream => new DreamCue(),
FixSceneMode.AnalysisMode => new AnalysisModeCue(),
FixSceneMode.Sales => new SalesCue(),
FixSceneMode.BlockPuzzle => new BlockPuzzleCue(),
_ => new DefaultCue()
};
res.SetArgs(args);
return res;
}
}
}