예제 #1
0
    //讀取每行
    IEnumerator ReadEachLine_coro(Action finish)
    {
        yield return(new WaitForEndOfFrame());

        ReadArgs(ref Lines[0].args);         //story's setting
        line_index = 1;
        while (line_index < Lines.Count - 1) //略結尾</story>
        {
            yield return(new WaitForFixedUpdate());

            //對話框處理
            if (isReadingTags == null)
            {
                UpdateDialog();
            }

            yield return(new WaitUntil(() => { return Input.GetKeyDown(next_line_key) || forceEnd; }));

            forceEnd = false;
        }

        Debug.Log("對話結束");
        //清空暫時紀錄
        RPGCore.Clear_Temp_StoryRecord();


        isReading = null;
        finish();

        Destroy(gameObject);
    }
예제 #2
0
    public void StartConversation(string data, Action finish)
    {
        PrePareGameObject(data);
        //string path_with_lang = RPGCore.lang + "/" + text_file_path;

        //更新:改直接接收文檔內容
        Lines = RPGCore.ReadLines(data);
        if (isReading == null)
        {
            isReading = StartCoroutine(ReadEachLine_coro(finish));
        }
    }
예제 #3
0
    public void ReadText(string text)
    {
        if (dialogText != null)
        {
            //放回跳脫字元
            text = RPGCore.Put_Back_EscChar(text);
            //自定義變數
            text = RPGCore.ReadCustomVariables(text);

            dialogText.text = text;
        }
    }
예제 #4
0
    //close ans start next level
    public void NextLv()
    {
        LevelManager.instance.StartNextLevel();
        merchantObj.SetActive(false);

        //destory all unpicked loot
        Loot[] unpickedLoot = FindObjectsOfType <Loot>();
        for (int i = 0; i < unpickedLoot.Length; i++)
        {
            Destroy(unpickedLoot[i].gameObject);
        }

        RPGCore.SetDictionaryValue("talk", LevelManager.instance.current_lv.ToString());
        //TODO:effect
    }
예제 #5
0
    public static List <GameObject> temp_preparedList = new List <GameObject>(); //會用到的gameObject清單

    void Start()
    {
        RPGCore.Dict_Init();
    }
예제 #6
0
    //參數設定
    public void ReadArgs(ref string args)
    {
        if (args == "")
        {
            return;
        }

        //跳脫字元
        args = RPGCore.Put_Back_EscChar(args);
        //自定義變數
        args = RPGCore.ReadCustomVariables(args);

        //title
        foreach (Match match in GetMatch(args, RPGCore.REGEX_ARGS_TITLE))
        {
            title.text = match.Groups["title"].Value;
        }

        //by
        foreach (Match match in GetMatch(args, RPGCore.REGEX_ARGS_BY))
        {
            //找到說話的物件,計算位置,將UI放置在該物件旁 (UI座標)
            GameObject talk_by = GameObject.Find(match.Groups["by"].Value);
            if (talk_by != null)
            {
                Vector3 target_top_pos = talk_by.transform.position;

                //在物件上方
                Renderer rend = talk_by.GetComponent <Renderer>();
                if (rend != null)
                {
                    target_top_pos.y += rend.bounds.size.y * 1.5f;
                }
                else
                {
                    target_top_pos.y += 2.5f;
                }

                Vector2 ui_pos = Camera.main.WorldToScreenPoint(target_top_pos);

                //ui_pos.y+=100;

                Wrapper.transform.position = ui_pos;
            }
            else
            {
                Debug.LogError("talk by not found.");
            }
        }

        #region

        //img
        foreach (Match match in GetMatch(args, RPGCore.REGEX_ARGS_IMG))
        {
            SetPortraitImg(match.Groups["side"].Value, match.Groups["imgPath"].Value);
        }

        //animation
        foreach (Match match in GetMatch(args, RPGCore.REGEX_ARGS_ANIMATION))
        {
            GameObject target = GameObject.Find((match.Groups["objectName"].Value));
            if (target != null)
            {
                Animator animator = target.GetComponent <Animator>();
                if (animator != null)
                {
                    animator.Play((match.Groups["clipName"].Value));
                }
                else
                {
                    Debug.LogError("<animation arg error> animator not found");
                }
            }
        }

        //audio
        foreach (Match match in GetMatch(args, RPGCore.REGEX_ARGS_AUDIO))
        {
            string     operation = (match.Groups["operation"].Value);
            GameObject target    = GameObject.Find((match.Groups["objectName"].Value));
            if (target != null)
            {
                AudioSource audioSource = target.GetComponent <AudioSource>();
                if (audioSource != null)
                {
                    if (operation == "play")
                    {
                        audioSource.Play();
                    }
                    else if (operation == "pause")
                    {
                        audioSource.Pause();
                    }
                    else if (operation == "stop")
                    {
                        audioSource.Stop();
                    }
                }
                else
                {
                    Debug.LogError("<audio arg error> audioSource not found");
                }
            }
        }

        //set
        foreach (Match match in GetMatch(args, RPGCore.REGEX_ARGS_SET))
        {
            Debug.Log("SET");
            string _key      = Regex.Replace(match.Groups["key"].Value, @"['""]", "");;
            string _value    = match.Groups["value"].Value;
            string _operator = match.Groups["operator"].Value; //optional
            string _value2   = match.Groups["value2"].Value;   //optional

            //判斷value是字典key或值
            bool v1_is_key = Regex.IsMatch(_value, @"['""].*?['""]");
            bool v2_is_key = Regex.IsMatch(_value2, @"['""].*?['""]");

            string v1 = _value, v2 = _value2;
            if (v1_is_key)
            {
                v1 = RPGCore.GetDictValue(Regex.Replace(_value, @"['""]", ""));
            }
            if (v2_is_key)
            {
                v2 = RPGCore.GetDictValue(Regex.Replace(_value2, @"['""]", ""));
            }
            //先做運算
            if (_operator != "")
            {
                int v1_num = int.Parse(v1);
                int v2_num = int.Parse(v2);
                if (_operator == "+")
                {
                    RPGCore.SetDictionaryValue(_key, (v1_num + v2_num).ToString());
                }
                if (_operator == "-")
                {
                    RPGCore.SetDictionaryValue(_key, (v1_num - v2_num).ToString());
                }
                if (_operator == "*")
                {
                    RPGCore.SetDictionaryValue(_key, (v1_num * v2_num).ToString());
                }
                if (_operator == "/")
                {
                    RPGCore.SetDictionaryValue(_key, (v1_num / v2_num).ToString());
                }
            }
            else
            {
                //不做運算直接給值
                RPGCore.SetDictionaryValue(_key, v1);
            }
        }


        //其他 (可刪除,或去補齊方法cs檔): 用括號的參數改用統一regex拆解
        foreach (Match match in GetMatch(args, RPGCore.REGEX_FUNC_PARA))
        {
            //方法名稱
            string functionName = match.Groups["func"].Value;
            Debug.Log(functionName);
            string[] paras = match.Groups["para"].Value.Split(',');
            //enable /disable
            if (functionName == "enable")
            {
                foreach (string objName in paras)
                {
                    GameObject target = temp_preparedList.Find(x => x.name.Equals(objName));
                    if (target != null)
                    {
                        target.SetActive(true);
                    }
                }
            }
            if (functionName == "disable")
            {
                foreach (string objName in paras)
                {
                    GameObject target = temp_preparedList.Find(x => x.name.Equals(objName));
                    if (target != null)
                    {
                        target.SetActive(false);
                    }
                }
            }

            //**************** YOUR OWN SCRIPT FUNCTION *****************************
            //Effect 特效
            if (functionName == "effect")
            {
                foreach (string effect_name in paras)
                {
                    if (effect_name == "shake")
                    {
                        //Effecter.cs
                        StartCoroutine(Effecter.Shake(Wrapper, 5, 10, 0.25f));
                        Debug.Log("Do SHAKE");
                    }
                }
            }
            //changeScene(scenetoLoad ) 換場景
            if (functionName == "changeScene")
            {
                //load場景
                string scene_to_load = paras[0];
                SceneManager.LoadScene(scene_to_load);
            }
        }
        #endregion
    }
예제 #7
0
    //tag設定
    public IEnumerator ReadTags(string tag)
    {
        Debug.Log(line_index + " " + "TAG " + tag + Lines[line_index].args + " " + Lines[line_index].text);

        //l=line 基本單行對話
        if (tag == "l")
        {
            //開啟對話框
            if (dialogText != null)
            {
                dialogText.gameObject.SetActive(true);
            }
            ReadArgs(ref Lines[line_index].args);
            ReadText(Lines[line_index].text);

            //line_index = Lines[line_index].endLine + 1; //下一句
            GoNextLine(Lines[line_index].endLine + 1);
        }

        //select 選單 內含opt數個
        else if (tag == "select")
        {
            //開啟選單
            if (selectPanel != null)
            {
                selectPanel.gameObject.SetActive(true);
                //清除舊選項
                foreach (Transform child in selectPanel.transform)
                {
                    GameObject.Destroy(child.gameObject);
                }
            }

            ReadArgs(ref Lines[line_index].args);
            ReadText(Lines[line_index].text);

            //select開始的index
            int select_start_index = line_index;
            line_index++;

            //在選單創建選項 (tag=opt)
            Debug.Log("select end line " + Lines[select_start_index].endLine);
            List <RPGCore.Line> _opts = new List <RPGCore.Line>();
            for (int i = line_index; i < Lines[select_start_index].endLine;)
            {
                if (option_btn_prefab != null)
                {
                    GameObject opt = Instantiate(option_btn_prefab, selectPanel.transform.position, Quaternion.identity, selectPanel.transform);
                    opt.name = _opts.Count.ToString();
                    //設定text
                    //opt.GetComponentInChildren<Text>().text = Lines[i].text;
                    opt.GetComponentInChildren <TextMeshProUGUI>().text = Lines[i].text;
                    Debug.Log(line_index + " " + "TAG " + tag + Lines[i].args + " " + Lines[i].text);
                }

                _opts.Add(Lines[i]);

                i = Lines[i].endLine + 1;
            }

            //等待選擇:
            while (input == "")
            {
                yield return(new WaitForFixedUpdate());
            }
            Debug.Log("<color=green> 選擇: " + input + " " + _opts[int.Parse(input)].args + "</color>");

            //使用選擇的結果
            ReadArgs(ref _opts[int.Parse(input)].args);

            //從select結尾+1開始
            GoNextLine(Lines[select_start_index].endLine + 1);
            UpdateDialog();
        }

        //if 條件式
        //  true=> 跳至下一行
        //  false=> 跳至endline+1
        else if (tag == "if")
        {
            ReadArgs(ref Lines[line_index].args);
            if (RPGCore.if_compare(Lines[line_index].args))
            {
                GoNextLine(line_index + 1);
            }
            else
            {
                GoNextLine(Lines[line_index].endLine + 1);
            }
            UpdateDialog();
        }
        else if (tag.StartsWith("/")) //FOR:[bug] if、select結尾後沒有其他段落會直接跳到story tag後解讀失敗
        {
            //line_index++;
            forceEnd = true;
        }
        else
        {
            Debug.LogError("未知tag " + tag);
        }

        yield return(new WaitForFixedUpdate());

        isReadingTags = null;
    }
예제 #8
0
    //參數設定
    public void ReadArgs(ref string args)
    {
        if (args == "")
        {
            return;
        }

        //跳脫字元
        args = RPGCore.Put_Back_EscChar(args);
        //自定義變數
        args = RPGCore.ReadCustomVariables(args);

        //title
        foreach (Match match in GetMatch(args, RPGCore.REGEX_ARGS_TITLE))
        {
            title.text = match.Groups["title"].Value;
        }

        //by
        foreach (Match match in GetMatch(args, RPGCore.REGEX_ARGS_BY))
        {
            //找到說話的物件,計算位置,將UI放置在該物件旁 (UI座標)
            GameObject talk_by = GameObject.Find(match.Groups["by"].Value);
            if (talk_by != null)
            {
                Vector3 target_top_pos = talk_by.transform.position;

                //在物件上方
                Renderer rend = talk_by.GetComponent <Renderer>();
                if (rend != null)
                {
                    target_top_pos.y += rend.bounds.size.y * 1.5f;
                }
                else
                {
                    target_top_pos.y += 2.5f;
                }

                Vector2 ui_pos = Camera.main.WorldToScreenPoint(target_top_pos);

                //ui_pos.y+=100;

                Wrapper.transform.position = ui_pos;
            }
            else
            {
                Debug.LogError("talk by not found.");
            }
        }

        #region

        //img
        foreach (Match match in GetMatch(args, RPGCore.REGEX_ARGS_IMG))
        {
            SetPortraitImg(match.Groups["side"].Value, match.Groups["imgPath"].Value);
        }

        //animation
        foreach (Match match in GetMatch(args, RPGCore.REGEX_ARGS_ANIMATION))
        {
            GameObject target = GameObject.Find((match.Groups["objectName"].Value));
            if (target != null)
            {
                Animator animator = target.GetComponent <Animator>();
                if (animator != null)
                {
                    animator.Play((match.Groups["clipName"].Value));
                }
                else
                {
                    Debug.LogError("<animation arg error> animator not found");
                }
            }
        }

        //audio
        foreach (Match match in GetMatch(args, RPGCore.REGEX_ARGS_AUDIO))
        {
            string     operation = (match.Groups["operation"].Value);
            GameObject target    = GameObject.Find((match.Groups["objectName"].Value));
            if (target != null)
            {
                AudioSource audioSource = target.GetComponent <AudioSource>();
                if (audioSource != null)
                {
                    if (operation == "play")
                    {
                        audioSource.Play();
                    }
                    else if (operation == "pause")
                    {
                        audioSource.Pause();
                    }
                    else if (operation == "stop")
                    {
                        audioSource.Stop();
                    }
                }
                else
                {
                    Debug.LogError("<audio arg error> audioSource not found");
                }
            }
        }

        //set
        foreach (Match match in GetMatch(args, RPGCore.REGEX_ARGS_SET))
        {
            Debug.Log("SET");
            string _key      = Regex.Replace(match.Groups["key"].Value, @"['""]", "");;
            string _value    = match.Groups["value"].Value;
            string _operator = match.Groups["operator"].Value; //optional
            string _value2   = match.Groups["value2"].Value;   //optional

            //判斷value是字典key或值
            bool v1_is_key = Regex.IsMatch(_value, @"['""].*?['""]");
            bool v2_is_key = Regex.IsMatch(_value2, @"['""].*?['""]");

            string v1 = _value, v2 = _value2;
            if (v1_is_key)
            {
                v1 = RPGCore.GetDictValue(Regex.Replace(_value, @"['""]", ""));
            }
            if (v2_is_key)
            {
                v2 = RPGCore.GetDictValue(Regex.Replace(_value2, @"['""]", ""));
            }
            //先做運算
            if (_operator != "")
            {
                int v1_num = int.Parse(v1);
                int v2_num = int.Parse(v2);
                if (_operator == "+")
                {
                    RPGCore.SetDictionaryValue(_key, (v1_num + v2_num).ToString());
                }
                if (_operator == "-")
                {
                    RPGCore.SetDictionaryValue(_key, (v1_num - v2_num).ToString());
                }
                if (_operator == "*")
                {
                    RPGCore.SetDictionaryValue(_key, (v1_num * v2_num).ToString());
                }
                if (_operator == "/")
                {
                    RPGCore.SetDictionaryValue(_key, (v1_num / v2_num).ToString());
                }
            }
            else
            {
                //不做運算直接給值
                RPGCore.SetDictionaryValue(_key, v1);
            }
        }

        //Init
        foreach (Match match in GetMatch(args, RPGCore.REGEX_ARGS_INIT))
        {
            Debug.Log("Init");
            string _key      = Regex.Replace(match.Groups["key"].Value, @"['""]", "");;
            string _value    = match.Groups["value"].Value;
            string _operator = match.Groups["operator"].Value; //optional
            string _value2   = match.Groups["value2"].Value;   //optional

            //判斷value是字典key或值
            bool v1_is_key = Regex.IsMatch(_value, @"['""].*?['""]");
            bool v2_is_key = Regex.IsMatch(_value2, @"['""].*?['""]");

            string v1 = _value, v2 = _value2;

            bool key_is_inDict = false;
            RPGCore.GetDictValue(_key, out key_is_inDict);
            //已經在字典裡就不用設值
            if (key_is_inDict)
            {
                return;
            }


            if (v1_is_key)
            {
                v1 = RPGCore.GetDictValue(Regex.Replace(_value, @"['""]", ""));
            }
            if (v2_is_key)
            {
                v2 = RPGCore.GetDictValue(Regex.Replace(_value2, @"['""]", ""));
            }

            //先做運算
            if (_operator != "")
            {
                int v1_num = int.Parse(v1);
                int v2_num = int.Parse(v2);
                if (_operator == "+")
                {
                    RPGCore.SetDictionaryValue(_key, (v1_num + v2_num).ToString());
                }
                if (_operator == "-")
                {
                    RPGCore.SetDictionaryValue(_key, (v1_num - v2_num).ToString());
                }
                if (_operator == "*")
                {
                    RPGCore.SetDictionaryValue(_key, (v1_num * v2_num).ToString());
                }
                if (_operator == "/")
                {
                    RPGCore.SetDictionaryValue(_key, (v1_num / v2_num).ToString());
                }
            }
            else
            {
                //不做運算直接給值
                RPGCore.SetDictionaryValue(_key, v1);
            }
        }


        //其他 (可刪除,或去補齊方法cs檔): 用括號的參數改用統一regex拆解
        foreach (Match match in GetMatch(args, RPGCore.REGEX_FUNC_PARA))
        {
            //方法名稱
            string functionName = match.Groups["func"].Value;
            Debug.Log(functionName);
            string[] paras = match.Groups["para"].Value.Split(',');
            //enable /disable
            if (functionName == "enable")
            {
                foreach (string objName in paras)
                {
                    GameObject target = temp_preparedList.Find(x => x.name.Equals(objName));
                    if (target != null)
                    {
                        target.SetActive(true);
                    }
                }
            }
            if (functionName == "disable")
            {
                foreach (string objName in paras)
                {
                    GameObject target = temp_preparedList.Find(x => x.name.Equals(objName));
                    if (target != null)
                    {
                        target.SetActive(false);
                    }
                }
            }

            //**************** YOUR OWN SCRIPT FUNCTION *****************************
            //Effect 特效
            if (functionName == "effect")
            {
                foreach (string effect_name in paras)
                {
                    if (effect_name == "shake")
                    {
                        //Effecter.cs
                        //StartCoroutine(Effecter.Shake(Wrapper, 5, 10, 0.25f));
                        Debug.Log("Do SHAKE");
                    }
                }
            }
            //changeScene(scenetoLoad ) 換場景
            if (functionName == "changeScene")
            {
                //load場景
                string scene_to_load = paras[0];
                SceneManager.LoadScene(scene_to_load);
            }

            if (functionName == "price")
            {
                string   _item    = paras[0].Trim();
                Merchant merchant = FindObjectOfType <Merchant>();
                if (_item.Equals("wep"))
                {
                    RPGCore.SetDictionaryValue("temp_wep_cost", merchant.selling_weapon.cost.ToString());
                }
                else if (_item.Equals("ammo"))
                {
                    RPGCore.SetDictionaryValue("temp_ammo_cost", merchant.selling_ammo.cost.ToString());
                }
            }

            //buy(item)
            if (functionName == "buy")
            {
                string bought_item = paras[0];
                Debug.Log("BUY " + bought_item);
                if (bought_item.Equals("hp"))
                {
                    int _cost = int.Parse(RPGCore.temp_StoryRecord["temp_hp_cost"]);
                    if (ScoreManager.instance.UsePoint(_cost))
                    {
                        FindObjectOfType <PlayerControl>().Heal(100);
                    }
                    else
                    {
                        RPGCore.temp_StoryRecord["temp_buy_res"] = "0";
                    }
                }
                else if (bought_item.Equals("weapon"))
                {
                    Debug.Log("BUY weapon");
                    if (!FindObjectOfType <Merchant>().BuyWeapon())
                    {
                        RPGCore.temp_StoryRecord["temp_buy_res"] = "0";
                    }
                }
                else if (bought_item.Equals("ammo"))
                {
                    if (!FindObjectOfType <Merchant>().BuyAmmo())
                    {
                        RPGCore.temp_StoryRecord["temp_buy_res"] = "0";
                    }
                }
                else if (bought_item.Equals("nextlv"))
                {
                    FindObjectOfType <Merchant>().NextLv();
                }
                else if (bought_item.Equals("money"))
                {
                    //int _cost = int.Parse(RPGCore.temp_StoryRecord["temp_money_cost"]);

                    BlackScreenEffect bke = FindObjectOfType <BlackScreenEffect>();
                    bke.SetMagnitude(bke.mask_magnitude * 2);
                    ScoreManager.instance.AddScore(500);
                }
            }
        }
        #endregion
    }
예제 #9
0
 void Start()
 {
     instance = this;
     InitializeServices ();
 }