Пример #1
0
        // Update is called once per frame
        void Update()
        {
            if (inLineFuncComplete == false)
            {
                return;
            }
            if (LineComplete == true)
            {
                return;
            }
            if (currentLine == null || String.Equals(currentLine, ""))
            {
                return;
            }

            if (strPos < currentLine.Length)
            {
                strPos += TextSpeed * TextSpeedMultiplier * Time.deltaTime;
            }

            if (Mathf.Floor(strPos) > currStrPos)
            {
                if (currStrPos < currentLine.Length)
                {
                    string substr = currentLine.Substring(currStrPos, 1);

                    if (substr.Equals("{"))
                    {
                        substr = currentLine.Substring(currStrPos, 2);
                        if (substr.Equals("{{"))
                        {
                            //inline function!
                            string function;
                            int    pos = currentLine.IndexOf("}}");
                            function = currentLine.Substring(currStrPos + 2, pos - currStrPos - 2);
                            M22.line_c tempLineC = M22.ScriptCompiler.CompileLine(ref function, -1);
                            currStrPos += pos - currStrPos + 2;
                            substr      = currentLine.Substring(currStrPos, 1);
                            scriptMaster.SetCurrentInlineFunction(tempLineC);
                            scriptMaster.ExecuteFunction(tempLineC, true);
                            inLineFuncComplete = false;
                            return;
                        }
                    }

                    page.text += substr;
                    currStrPos++;
                }
            }

            if (currStrPos == currentLine.Length)
            {
                page.text   += '\n';
                LineComplete = true;
            }
        }
Пример #2
0
        static public M22.Script.Script CompileScript(string filename)
        {
            var result = new M22.Script.Script();

            LoadedVariables loadedVars = LoadVariablesFile();

            //var file = File.ReadAllText(filename, Encoding.UTF8);
            var file = UnityWrapper.LoadTextFileAsString(filename);

            if (file.Length == 0)
            {
                UnityWrapper.LogError("Failed to load script file: " + filename);
                return(result);
            }

            var scriptLines = SplitByChar('\n', ref file);

            file = "";

            //List<string> CURRENT_LINE_SPLIT = new List<string>();
            int scriptPos = 0;

            for (int i = 0; i < scriptLines.Count; i++)
            {
                string currScriptLine = scriptLines[i];

                for (int n = 0; n < loadedVars.variables.Length; n++)
                {
                    if (loadedVars.variables[n] != null)
                    {
                        string tempStr = "[[" + loadedVars.variables[n] + "]]";
                        currScriptLine = currScriptLine.Replace(tempStr, loadedVars.variableData[n]);
                    }
                }

                M22.line_c tempLine_c = CompileLine(ref currScriptLine, i); // ref can't be an index so have to copy then copy back
                scriptLines[i] = currScriptLine;
                //if(tempLine_c.m_lineType == LINETYPE.NULL_OPERATOR)
                result.AddLine(tempLine_c);
                scriptPos++;
            }

            result.ClearNullOperators();

            return(result);
        }
Пример #3
0
        static public M22.line_c CompileLine(ref string func, int _scriptPos)
        {
            List <string> CURRENT_LINE_SPLIT = new List <string>();

            M22.line_c tempLine_c = new M22.line_c();
            func = func.Trim('\t');
            if (func == "\r\n" || func == "\n")
            {
                return(tempLine_c);
            }
            else if (func.Length == 0 || (func[0] == '/' && func[1] == '/'))
            {
                return(tempLine_c);
            }
            SplitString(func, CURRENT_LINE_SPLIT, ' ');
            if (CURRENT_LINE_SPLIT.Count == 0)
            {
                return(tempLine_c);
            }
            tempLine_c.m_origScriptPos = _scriptPos + 1;
            tempLine_c.m_lineType      = CheckLineType(CURRENT_LINE_SPLIT[0]);

            if (tempLine_c.m_lineType == M22.LINETYPE.NARRATIVE)
            {
                func = func.Replace("\\n", "\n");
                tempLine_c.m_lineContents = func;
            }
            else if (tempLine_c.m_lineType == M22.LINETYPE.DIALOGUE)
            {
                tempLine_c.m_lineContents = func;
                tempLine_c.m_lineContents = tempLine_c.m_lineContents.Substring(CURRENT_LINE_SPLIT[0].Length + 1);
                CharacterNames.TryGetValue(CalculateHash(CURRENT_LINE_SPLIT[0]), out tempLine_c.m_speaker);
            }
            else
            {
                CompileLine(ref tempLine_c, CURRENT_LINE_SPLIT, ref currentScript_checkpoints, _scriptPos);
            }
            return(tempLine_c);
        }
Пример #4
0
        static public void CompileLine(ref M22.line_c _lineC, List <string> _splitStr, ref List <M22.script_checkpoint> _chkpnt, int _scriptPos)
        {
            for (int i = 0; i < _splitStr.Count; i++)
            {
                _splitStr[i] = _splitStr[i].Trim('\r', '\n', '\t');
            }
            switch (_lineC.m_lineType)
            {
            case M22.LINETYPE.CHECKPOINT:
                _lineC.m_parameters_txt = new List <string>();
                _splitStr[0]            = _splitStr[0].Substring(2).TrimEnd('\r', '\n');
                _lineC.m_parameters_txt.Add(_splitStr[0]);
                _chkpnt.Add(new M22.script_checkpoint(_scriptPos, _splitStr[0]));
                break;

            case M22.LINETYPE.ANIMATION_TYPE:
                if (_splitStr.Count > 1)
                {
                    _lineC.m_parameters = new List <int>();
                    _splitStr[1]        = _splitStr[1].ToLower();
                    if (_splitStr[1].Equals("lerp"))
                    {
                        _lineC.m_parameters.Add((int)ANIMATION_TYPES.LERP);
                    }
                    else if (_splitStr[1].Equals("smooth"))
                    {
                        _lineC.m_parameters.Add((int)ANIMATION_TYPES.SMOOTH);
                    }
                    else
                    {
                        UnityWrapper.LogErrorFormat("Invalid animation type at line {0}!", _lineC.m_origScriptPos);
                        _lineC.m_parameters.Add(0);
                    }
                }
                break;

            case M22.LINETYPE.TEXT_SPEED:
            case M22.LINETYPE.MOVEMENT_SPEED:
                if (_splitStr.Count > 1)
                {
                    _lineC.m_parameters_txt = new List <string>();
                    _lineC.m_parameters_txt.Add(_splitStr[1]);
                }
                break;

            case M22.LINETYPE.SET_ACTIVE_TRANSITION:
                if (_splitStr.Count > 1)
                {
                    _lineC.m_parameters_txt = new List <string>();
                    _splitStr[1]            = _splitStr[1].TrimEnd('\r', '\n');
                    _lineC.m_parameters_txt.Add(_splitStr[1]);
                }
                break;

            case M22.LINETYPE.GOTO:
                if (_splitStr.Count > 1)
                {
                    _lineC.m_parameters_txt = new List <string>();
                    _splitStr[1]            = _splitStr[1].TrimEnd('\r', '\n');
                    _lineC.m_parameters_txt.Add(_splitStr[1]);
                }
                break;

            case M22.LINETYPE.NEW_PAGE:
                break;

            case M22.LINETYPE.DRAW_CHARACTER:
                if (_splitStr.Count > 1)
                {
                    if (_splitStr.Count < 4)
                    {
                        UnityWrapper.LogError("Not enough parameters for DrawCharacter @ Line " + _lineC.m_origScriptPos.ToString());
                    }
                    _lineC.m_parameters_txt = new List <string>();
                    _lineC.m_parameters_txt.Add(_splitStr[1]);
                    _lineC.m_parameters_txt.Add(_splitStr[2]);
                    _lineC.m_parameters = new List <int>();
                    _lineC.m_parameters.Add(Int32.Parse(_splitStr[3]));
                    if (_splitStr.Count >= 5)
                    {
                        if (_splitStr[4].Equals("true"))
                        {
                            _lineC.m_parameters.Add(1);
                        }
                        else
                        {
                            _lineC.m_parameters.Add(0);
                        }
                    }
                    else
                    {
                        _lineC.m_parameters.Add(0);
                    }

                    if (!M22.VNHandler.LoadCharacter(_lineC.m_parameters_txt[0], _lineC.m_parameters_txt[1]))
                    {
                        UnityWrapper.LogErrorFormat("Failed to load character \"{0}\" at line {1}!", (_lineC.m_parameters_txt[0] + " - " + _lineC.m_parameters_txt[1]), _lineC.m_origScriptPos);
                    }
                    ;
                }
                break;

            case M22.LINETYPE.WAIT:
                _lineC.m_parameters = new List <int>();
                if (_splitStr.Count > 1)
                {
                    _lineC.m_parameters.Add(Int32.Parse(_splitStr[1]));
                }
                else
                {
                    _lineC.m_parameters.Add(1000);
                }
                break;

            case M22.LINETYPE.CLEAR_CHARACTERS:
                _lineC.m_parameters = new List <int>();
                if (_splitStr.Count > 1 && _splitStr[1].Equals("true"))
                {
                    _lineC.m_parameters.Add(1);
                }
                else
                {
                    _lineC.m_parameters.Add(0);
                }
                if (_splitStr.Count > 2 && _splitStr[2].Equals("true"))
                {
                    _lineC.m_parameters.Add(1);
                }
                else
                {
                    _lineC.m_parameters.Add(0);
                }
                break;

            case M22.LINETYPE.PLAY_STING:
                if (_splitStr.Count > 1)
                {
                    _lineC.m_parameters_txt = new List <string>();
                    _splitStr[1]            = _splitStr[1].TrimEnd('\r', '\n');
                    _lineC.m_parameters_txt.Add(_splitStr[1]);

                    if (!M22.AudioMaster.LoadSting(_lineC.m_parameters_txt[0]))
                    {
                        UnityWrapper.LogError("Failed to load sting! - " + _lineC.m_parameters_txt[0]);
                    }
                    ;
                }
                break;

            case M22.LINETYPE.PLAY_MUSIC:
                if (_splitStr.Count > 1)
                {
                    _lineC.m_parameters_txt = new List <string>();
                    _splitStr[1]            = _splitStr[1].TrimEnd('\r', '\n');
                    _lineC.m_parameters_txt.Add(_splitStr[1]);

                    if (!M22.AudioMaster.LoadMusic(_lineC.m_parameters_txt[0]))
                    {
                        UnityWrapper.LogErrorFormat("Failed to load music file \"{0}\" at line {1}!", _lineC.m_parameters_txt[0], _lineC.m_origScriptPos);
                    }
                    ;
                }
                break;

            case M22.LINETYPE.EXECUTE_FUNCTION:
                if (_splitStr.Count > 1)
                {
                    // heart_throb 4.0 2.0
                    //            |
                    _lineC.m_parameters_txt = new List <string>();
                    for (int i = 1; i < _splitStr.Count; i++)
                    {
                        _lineC.m_parameters_txt.Add(_splitStr[i]);
                    }
                    _splitStr[_splitStr.Count - 1] = _splitStr[_splitStr.Count - 1].TrimEnd('\r', '\n');
                    // _lineC.m_parameters_txt.Add(_splitStr[_splitStr.Count - 1]);

                    // should be 4
                    while (_lineC.m_parameters_txt.Count < 4)
                    {
                        _lineC.m_parameters_txt.Add("");
                    }

                    if (RegisteredCustomFunctions.TryGetValue(_splitStr[0], out _lineC.m_custFunc) == false)
                    {
                        UnityWrapper.LogErrorFormat("Custom function \"{0}\" does not exist at line {1}!", _lineC.m_parameters_txt[0], _lineC.m_origScriptPos);
                    }
                }
                break;

            case M22.LINETYPE.STOP_MUSIC:
                if (_splitStr.Count > 1)
                {
                    _lineC.m_parameters_txt = new List <string>();
                    //_splitStr[1] = _splitStr[1].TrimEnd('\r', '\n');
                    _lineC.m_parameters_txt.Add(_splitStr[1]);
                }
                // we store the float value as a string for later use, if provided.
                // otherwise, just continue
                break;

            case M22.LINETYPE.TRANSITION:
                if (_splitStr.Count > 1)
                {       //Transition other_iwanako tr_eyes 0
                    _lineC.m_parameters_txt = new List <string>();
                    for (int i = 1; i < _splitStr.Count; i++)
                    {
                        _lineC.m_parameters_txt.Add(_splitStr[i]);
                    }

                    if (!M22.BackgroundMaster.LoadBackground(_lineC.m_parameters_txt[0]))
                    {
                        UnityWrapper.LogErrorFormat("Failed to load background - \"{0}\"", _lineC.m_parameters_txt[0]);
                        // failed to load bg!
                    }
                    ;
                }
                break;

            case M22.LINETYPE.DRAW_BACKGROUND:
                if (_splitStr.Count >= 2)
                {
                    _lineC.m_parameters     = new List <int>();
                    _lineC.m_parameters_txt = new List <string>();
                    _lineC.m_parameters_txt.Add(_splitStr[1]);
                    if (_splitStr.Count >= 3)
                    {
                        _lineC.m_parameters.Add(Int32.Parse(_splitStr[2]));
                        if (_splitStr.Count >= 4)
                        {
                            _lineC.m_parameters.Add(Int32.Parse(_splitStr[3]));
                        }
                        if (_splitStr.Count >= 5)
                        {
                            _lineC.m_parameters_txt.Add(_splitStr[4]);
                        }
                        if (_splitStr.Count >= 6)
                        {
                            _lineC.m_parameters_txt.Add(_splitStr[5]);
                        }
                    }
                    else
                    {
                        _lineC.m_parameters.Add(0);
                        _lineC.m_parameters.Add(0);
                        _lineC.m_parameters_txt.Add("1.0");
                        _lineC.m_parameters_txt.Add("1.0");
                    }

                    if (_splitStr[_splitStr.Count - 1].Equals("true"))
                    {
                        _lineC.m_parameters.Add(1);
                    }
                    else
                    {
                        _lineC.m_parameters.Add(0);
                    }

                    if (!M22.BackgroundMaster.LoadBackground(_lineC.m_parameters_txt[0]))
                    {
                        UnityWrapper.LogErrorFormat("Failed to load background \"{0}\" at line {1}", _lineC.m_parameters_txt[0], _lineC.m_origScriptPos);
                    }
                    ;
                }
                else
                {
                    UnityWrapper.LogErrorFormat("Not enough parameters on DrawBackground at line {0}", _lineC.m_origScriptPos);
                }
                break;

            case M22.LINETYPE.ENABLE_NOVEL_MODE:
                break;

            case M22.LINETYPE.DISABLE_NOVEL_MODE:
                break;

            case M22.LINETYPE.PLAY_VIDEO:
                if (_splitStr.Count > 1)
                {
                    _lineC.m_parameters_txt = new List <string>();
                    _lineC.m_parameters_txt.Add(_splitStr[1]);

                    if (M22.ScriptMaster.LoadVideoFile(_splitStr[1]) == false)
                    {
                        UnityWrapper.LogError("Failed to load video file: " + _splitStr[1]);
                    }
                }
                break;

            case M22.LINETYPE.CLEAR_CHARACTER:
                if (_splitStr.Count >= 2)
                {
                    _lineC.m_parameters     = new List <int>();
                    _lineC.m_parameters_txt = new List <string>();
                    _lineC.m_parameters_txt.Add(_splitStr[1]);
                    if (_splitStr.Count >= 3)
                    {
                        if (_splitStr[2].Equals("true"))
                        {
                            _lineC.m_parameters.Add(1);
                        }
                        else
                        {
                            _lineC.m_parameters.Add(0);
                        }
                    }
                    else
                    {
                        _lineC.m_parameters.Add(0);
                    }
                }
                break;

            case M22.LINETYPE.LOAD_SCRIPT:
            case M22.LINETYPE.HIDE_WINDOW:
            case M22.LINETYPE.SHOW_WINDOW:
                if (_splitStr.Count > 1)
                {
                    _lineC.m_parameters_txt = new List <string>();
                    _lineC.m_parameters_txt.Add(_splitStr[1]);
                }
                break;

            case M22.LINETYPE.SET_FLAG:
                if (_splitStr.Count > 1)
                {
                    _lineC.m_parameters_txt = new List <string>();
                    _splitStr[1]            = _splitStr[1].TrimEnd('\r', '\n');
                    _lineC.m_parameters_txt.Add(_splitStr[1]);
                }
                break;

            case M22.LINETYPE.IF_STATEMENT:
                // m22IF _flag_to_check_if_true Command [params]
                //
                if (_splitStr.Count > 1)
                {
                    _lineC.m_parameters_txt = new List <string>();
                    _lineC.m_parameters_txt.Add(_splitStr[1]);

                    line_c        tempCompiledLine = new line_c();
                    List <string> functionSplit    = new List <string>();
                    for (int i = 2; i < _splitStr.Count; i++)
                    {
                        functionSplit.Add(_splitStr[i]);
                    }
                    tempCompiledLine.m_lineType = CheckLineType(_splitStr[2]);
                    CompileLine(ref tempCompiledLine, functionSplit, ref _chkpnt, _scriptPos);
                    if (tempCompiledLine.m_lineContents == null)
                    {
                        tempCompiledLine.m_lineContents = "";
                        for (int i = 2; i < _splitStr.Count; i++)
                        {
                            tempCompiledLine.m_lineContents += _splitStr[i] + " ";
                        }
                    }
                    tempCompiledLine.m_lineContents = tempCompiledLine.m_lineContents.Replace("\\n", "\n");
                    _lineC.m_lineContents           = tempCompiledLine.m_lineContents;
                    _lineC.m_lineTypeSecondary      = tempCompiledLine.m_lineType;

                    if (tempCompiledLine.m_parameters_txt != null)
                    {
                        for (int i = 0; i < tempCompiledLine.m_parameters_txt.Count; i++)
                        {
                            _lineC.m_parameters_txt.Add(tempCompiledLine.m_parameters_txt[i]);
                        }
                    }

                    if (tempCompiledLine.m_parameters != null)
                    {
                        _lineC.m_parameters = new List <int>();
                        for (int i = 0; i < tempCompiledLine.m_parameters.Count; i++)
                        {
                            _lineC.m_parameters.Add(tempCompiledLine.m_parameters[i]);
                        }
                    }
                }
                break;

            case M22.LINETYPE.PLAY_SFX_LOOPED:
                if (_splitStr.Count > 1)
                {
                    _lineC.m_parameters_txt = new List <string>();
                    _lineC.m_parameters_txt.Add(_splitStr[1]);

                    if (_splitStr.Count > 3)
                    {
                        _lineC.m_parameters_txt.Add(_splitStr[2]);
                        _lineC.m_parameters_txt.Add(_splitStr[3]);
                    }
                    else
                    {
                        _lineC.m_parameters_txt.Add("1.0");
                        _lineC.m_parameters_txt.Add("1.0");
                    }

                    if (!M22.AudioMaster.LoadSting(_lineC.m_parameters_txt[0]))
                    {
                        UnityWrapper.LogError("Failed to load sting! - " + _lineC.m_parameters_txt[0]);
                    }
                    ;
                }
                break;

            case M22.LINETYPE.STOP_SFX_LOOPED:
                if (_splitStr.Count > 1)
                {
                    _lineC.m_parameters_txt = new List <string>();
                    _lineC.m_parameters_txt.Add(_splitStr[1]);

                    if (AudioMaster.IsAudioLoaded(_splitStr[1]) == false)
                    {
                        UnityWrapper.LogWarningFormat("Stopping a looped SFX that isn't played/loaded yet at line {0}; this shouldn't happen!", _lineC.m_origScriptPos);
                    }

                    if (_splitStr.Count > 2)
                    {
                        _lineC.m_parameters_txt.Add(_splitStr[2]);
                    }
                    else
                    {
                        _lineC.m_parameters_txt.Add("1.0");
                    }
                }
                break;

            case M22.LINETYPE.MAKE_DECISION:
                if (_splitStr.Count > 1)
                {
                    _lineC.m_parameters_txt = new List <string>();
                    string reconstructed = "";
                    for (int i = 0; i < _splitStr.Count; i++)
                    {
                        reconstructed += _splitStr[i] + " ";
                    }
                    List <string> splitByQuote = new List <string>();
                    SplitString(ref reconstructed, ref splitByQuote, '\"');

                    // Should be 5 or 7
                    if (splitByQuote.Count != 5 && splitByQuote.Count != 7)
                    {
                        UnityWrapper.LogError("MakeDecision error; mismatched number of quotemarks!");
                    }

                    for (int i = 1; i < splitByQuote.Count; i++)
                    {
                        //splitByQuote[i] = _splitStr[i].TrimEnd(' ');
                        //splitByQuote[i] = _splitStr[i].TrimStart(' ');
                        splitByQuote[i] = splitByQuote[i].Trim(' ', '\"');
                        _lineC.m_parameters_txt.Add(splitByQuote[i]);
                    }

                    // up to 6 parameters
                    // flags do not use "" but the text string does
                    // i.e. MakeDecision "Choice 1" choice_1 "Choice 2" choice_2 "Choice 3" choice_3
                    // if(num of quotemarks != 6) mismatch error
                    //
                    // This means splitStr is useless cus of spaces, and will need to be re-split in terms of " marks
                    // i.e. splitStr[0] == "MakeDecision ";
                    // splitStr[1] == "Choice 1";
                    // splitStr[2] == " choice_1 ";
                }
                break;
            }
            return;
        }