Esempio n. 1
0
        /**
         * <summary>The default Constructor.</summary>
         * <param name = "_speaker">The speaking character. If null, the line is considered a narration</param>
         * <param name = "_message">The subtitle text to display</param>
         * <param name = "lineID">The unique ID number of the line, as generated by the Speech Manager</param>
         * <param name = "_language">The currently-selected language</param>
         * <param name = "_isBackground">True if the line should play in the background, and not interrupt Actions or gameplay</param>
         * <param name = "_noAnimation">True if the speaking character should not play a talking animation</param>
         * <param name = "_runActionListInBackground">True if the ActionList that contains the call is set to Run In Background</param>
         */
        public Speech(Char _speaker, string _message, int lineID, string _language, bool _isBackground, bool _noAnimation, bool _runActionListInBackground = false)
        {
            // Clear rich text
            boldTagIndex = italicTagIndex = sizeTagIndex = colorTagIndex = -1;
            closingTags  = "";

            log.Clear();
            isBackground = _isBackground;
            runActionListInBackground = _runActionListInBackground;

            if (_speaker)
            {
                speaker           = _speaker;
                speaker.isTalking = !_noAnimation;
                log.speakerName   = _speaker.name;

                if (_speaker.GetComponent <Player>())
                {
                    if (KickStarter.settingsManager.playerSwitching == PlayerSwitching.Allow || !KickStarter.speechManager.usePlayerRealName)
                    {
                        log.speakerName = "Player";
                    }
                }

                if (_speaker.GetComponent <Hotspot>())
                {
                    if (_speaker.GetComponent <Hotspot>().hotspotName != "")
                    {
                        log.speakerName = _speaker.GetComponent <Hotspot>().hotspotName;
                    }
                }

                _speaker.ClearExpression();

                if (!_noAnimation)
                {
                    if (KickStarter.speechManager.lipSyncMode == LipSyncMode.Off)
                    {
                        speaker.isLipSyncing = false;
                    }
                    else if (KickStarter.speechManager.lipSyncMode == LipSyncMode.Salsa2D || KickStarter.speechManager.lipSyncMode == LipSyncMode.FromSpeechText || KickStarter.speechManager.lipSyncMode == LipSyncMode.ReadPamelaFile || KickStarter.speechManager.lipSyncMode == LipSyncMode.ReadSapiFile || KickStarter.speechManager.lipSyncMode == LipSyncMode.ReadPapagayoFile)
                    {
                        speaker.StartLipSync(KickStarter.dialog.GenerateLipSyncShapes(KickStarter.speechManager.lipSyncMode, lineID, speaker.name, _language, _message));
                    }
                    else if (KickStarter.speechManager.lipSyncMode == LipSyncMode.RogoLipSync)
                    {
                        RogoLipSyncIntegration.Play(_speaker, speaker.name, lineID, _language);
                    }
                }
            }
            else
            {
                if (speaker)
                {
                    speaker.isTalking = false;
                }
                speaker         = null;
                log.speakerName = "Narrator";
            }

            _message = DetermineGaps(_message);
            if (speechGaps.Count > 0)
            {
                gapIndex = 0;

                /*foreach (SpeechGap gap in speechGaps)
                 * {
                 *      if (gap.expressionID < 0)
                 *      {
                 *              displayDuration += (float) gap.waitTime;
                 *      }
                 * }*/
            }
            else
            {
                gapIndex = -1;
            }

            if (lineID > -1)
            {
                log.lineID = lineID;
            }

            // Play sound and time displayDuration to it
            if (lineID > -1 && log.speakerName != "" && KickStarter.speechManager.searchAudioFiles)
            {
                AudioClip clipObj = null;

                if (KickStarter.speechManager.autoNameSpeechFiles)
                {
                    string fullFilename = "Speech/";
                    string filename     = KickStarter.speechManager.GetLineFilename(lineID);
                    if (_language != "" && KickStarter.speechManager.translateAudio)
                    {
                        // Not in original language
                        fullFilename += _language + "/";
                    }
                    if (KickStarter.speechManager.placeAudioInSubfolders)
                    {
                        fullFilename += filename + "/";
                    }
                    fullFilename += filename + lineID;

                    clipObj = Resources.Load(fullFilename) as AudioClip;

                    if (clipObj == null && KickStarter.speechManager.fallbackAudio && Options.GetLanguage() > 0)
                    {
                        fullFilename = "Speech/";
                        if (KickStarter.speechManager.placeAudioInSubfolders)
                        {
                            fullFilename += filename + "/";
                        }
                        fullFilename += filename + lineID;
                        clipObj       = Resources.Load(fullFilename) as AudioClip;
                    }

                    if (clipObj == null)
                    {
                        ACDebug.Log("Cannot find audio file: " + fullFilename);
                    }
                }
                else
                {
                    clipObj = KickStarter.speechManager.GetLineCustomAudioClip(lineID, Options.GetLanguage());

                    if (clipObj == null && KickStarter.speechManager.fallbackAudio && Options.GetLanguage() > 0)
                    {
                        clipObj = KickStarter.speechManager.GetLineCustomAudioClip(lineID, 0);
                    }
                }

                if (clipObj)
                {
                    AudioSource audioSource = null;

                    if (_speaker != null)
                    {
                        if (!_noAnimation)
                        {
                            if (KickStarter.speechManager.lipSyncMode == LipSyncMode.FaceFX)
                            {
                                FaceFXIntegration.Play(speaker, log.speakerName + lineID, clipObj);
                            }
                        }

                        if (_speaker.speechAudioSource)
                        {
                            audioSource = _speaker.speechAudioSource;

                            if (_speaker.speechAudioSource.GetComponent <Sound>())
                            {
                                _speaker.speechAudioSource.GetComponent <Sound>().SetVolume(Options.optionsData.speechVolume);
                            }
                            else
                            {
                                _speaker.speechAudioSource.volume = Options.optionsData.speechVolume;
                            }
                        }
                        else
                        {
                            ACDebug.LogWarning(_speaker.name + " has no audio source component!");
                        }
                    }
                    else if (KickStarter.player && KickStarter.player.speechAudioSource)
                    {
                        KickStarter.player.speechAudioSource.volume = Options.optionsData.speechVolume;
                        audioSource = KickStarter.player.speechAudioSource;
                    }
                    else
                    {
                        audioSource = KickStarter.dialog.GetDefaultAudioSource();
                    }

                    if (audioSource != null)
                    {
                        audioSource.clip = clipObj;
                        audioSource.loop = false;
                        audioSource.Play();
                        hasAudio = true;
                    }

                    displayDuration = clipObj.length;
                }
                else
                {
                    displayDuration += KickStarter.speechManager.screenTimeFactor * GetLengthWithoutRichText(_message);
                    displayDuration  = Mathf.Max(displayDuration, KickStarter.speechManager.minimumDisplayTime);
                }
            }
            else
            {
                displayDuration += KickStarter.speechManager.screenTimeFactor * GetLengthWithoutRichText(_message);
                displayDuration  = Mathf.Max(displayDuration, KickStarter.speechManager.minimumDisplayTime);
            }

            log.fullText = _message;
            KickStarter.eventManager.Call_OnStartSpeech(_speaker, log.fullText, lineID);

            if (!CanScroll())
            {
                if (continueIndex > 0)
                {
                    continueTime = (continueIndex / KickStarter.speechManager.textScrollSpeed);
                }

                if (speechGaps.Count > 0)
                {
                    displayText = log.fullText.Substring(0, speechGaps[0].characterIndex);
                }
                else
                {
                    displayText = log.fullText;
                }
            }
            else
            {
                displayText = "";
                KickStarter.eventManager.Call_OnStartSpeechScroll(_speaker, log.fullText, lineID);
            }

            isAlive     = true;
            isSkippable = true;
            pauseGap    = false;
            endTime     = displayDuration;
            minSkipTime = KickStarter.speechManager.skipThresholdTime;
        }