using Fie.Utility; using Fie.Voice; using GameDataEditor; using System.Collections.Generic; namespace Fie.Manager { public class FieDialogManager : FieManagerBehaviour { public delegate void FieDialogManagerDialogChangedCallback(FieGameCharacter actor, GDEWordScriptsListData dialogData); private Queue> _dialogQueues = new Queue>(); private FieGameCharacter _currentActor; private GDEWordScriptsListData _currentWordScript; public bool _isEnableDialog = true; public bool isEnableDialg { get { return _isEnableDialog; } set { if (_isEnableDialog != value) { if (!isEnableDialg) { this.dialogEndEvent(null, null); } _isEnableDialog = value; } } } public event FieDialogManagerDialogChangedCallback dialogStartEvent; public event FieDialogManagerDialogChangedCallback dialogEndEvent; public void RequestDialog(FieGameCharacter actor, GDEWordScriptsListData dialogData) { if (!(actor == null) && !(actor.voiceController == null) && dialogData != null && actor.isSpeakable && (!(_currentActor != null) || !(_currentActor.voiceController != null) || !_currentActor.voiceController.isPlaying || _currentWordScript == null || dialogData.Trigger.enableStaking || dialogData.Trigger.priority < _currentWordScript.Trigger.priority)) { _dialogQueues.Enqueue(new KeyValuePair(dialogData, actor)); if (_dialogQueues.Count == 1) { SetDialogFromQueue(); } } } public void RequestDialog(GDEWordScriptTriggerTypeData triggerTypeData, GDEGameCharacterTypeData gameCharacterTypeData = null) { if (triggerTypeData != null) { List list = FieMasterData.FindMasterDataList(delegate(GDEWordScriptsListData wordScriptData) { if (triggerTypeData.Key != wordScriptData.Trigger.Key) { return false; } if (gameCharacterTypeData != null && gameCharacterTypeData.Key != wordScriptData.Actor.Key) { return false; } return true; }); if (list != null && list.Count > 0) { GDEWordScriptsListData gDEWordScriptsListData = null; Lottery lottery = new Lottery(); lottery.InitializeFromListData(list); if (lottery.IsExecutable()) { gDEWordScriptsListData = lottery.Lot(); FieGameCharacter existingGameCharacterRandom = FieManagerBehaviour.I.GetExistingGameCharacterRandom(gDEWordScriptsListData.Actor); RequestDialog(existingGameCharacterRandom, gDEWordScriptsListData); } } } } private void VoiceController_startEvent(FieVoiceController controller) { FieManagerBehaviour.I.ChangeMixerVolume(-1f, 0.2f, FieAudioManager.FieAudioMixerType.BGM, FieAudioManager.FieAudioMixerType.SE); } private void VoiceController_endEvent(FieVoiceController controller) { FieManagerBehaviour.I.ChangeMixerVolume(0f, 0.2f, FieAudioManager.FieAudioMixerType.BGM, FieAudioManager.FieAudioMixerType.SE); if (_currentWordScript != null && _currentWordScript.Next != null) { GDEGameCharacterTypeData actor = _currentWordScript.Next.Actor; if (actor != null) { FieGameCharacter existingGameCharacterRandom = FieManagerBehaviour.I.GetExistingGameCharacterRandom(actor); if (existingGameCharacterRandom != null) { RequestDialog(existingGameCharacterRandom, _currentWordScript.Next); } } } if (this.dialogEndEvent != null) { this.dialogEndEvent(_currentActor, _currentWordScript); } _currentActor = null; _currentWordScript = null; SetDialogFromQueue(); } private void SetDialogFromQueue() { if (_dialogQueues.Count > 0) { KeyValuePair keyValuePair = _dialogQueues.Dequeue(); _currentWordScript = keyValuePair.Key; _currentActor = keyValuePair.Value; if (_currentActor == null) { if (_dialogQueues.Count <= 0) { return; } SetDialogFromQueue(); } if (_isEnableDialog) { _currentActor.voiceController.startEvent += VoiceController_startEvent; _currentActor.voiceController.endEvent += VoiceController_endEvent; _currentActor.voiceController.Play(_currentWordScript.Key, isForceSet: true); if (this.dialogStartEvent != null) { this.dialogStartEvent(_currentActor, _currentWordScript); } } } } } }