Ejemplo n.º 1
0
    public IEnumerator ExecuteCommand(List <Tuple <string, Transform, List <object> > > commands, bool child = true)
    {
        Debug.Log("enter");
        gameVariableLists.Add(new Dictionary <string, object>());
        int local = gameVariableLists.Count - 1;

        if (!child)
        {
            gameStarted = true;
            gameLoopCoroutines.Clear();
            score_time       = 0;
            loopBreakTrigger = false;
            gameBreakTrigger = false;
        }

        WaitForSeconds wait = new WaitForSeconds(0.75f);

        foreach (Tuple <string, Transform, List <object> > command in commands)
        {
            bool waited = false;

            if (command.Item3.Count >= 2 && command.Item3[0] == null && command.Item3[1].GetType() == typeof(string))
            {
                foreach (Image img in command.Item2.GetComponentsInChildren <Image>())
                {
                    img.material = matRedHighLight;
                }
                Debug.Log(command.Item3[1].ToString());
                gameBreakTrigger = true;
            }
            if (!gameBreakTrigger)
            {
                foreach (Image img in command.Item2.GetComponentsInChildren <Image>())
                {
                    img.material = matHighLight;
                }

                string variableName = "";
                string value        = "";
                int    layer;
                double num;

                switch (command.Item1)
                {
                case "start":
                    break;

                case "define":
                    variableName = command.Item3[0].ToString();
                    value        = command.Item3[1].ToString();

                    if (value.StartsWith("&"))
                    {
                        value = value.Substring(1);
                        if ((layer = findVariableInLists(value, local)) != -1)
                        {
                            value = gameVariableLists[layer][value].ToString();
                        }
                        else
                        {
                            foreach (Image img in command.Item2.GetComponentsInChildren <Image>())
                            {
                                img.material = matRedHighLight;
                            }
                            Debug.LogWarning("variable \"" + value + "\" doesn't exsit!");
                            gameBreakTrigger = true;
                            break;
                        }
                    }

                    if (!gameVariableLists[local].ContainsKey(variableName))
                    {
                        if (double.TryParse(value, out num))
                        {
                            gameVariableLists[local].Add(variableName, num);
                        }
                        else
                        {
                            gameVariableLists[local].Add(variableName, value);
                        }
                    }
                    else
                    {
                        if (double.TryParse(value, out num))
                        {
                            gameVariableLists[local][variableName] = num;
                        }
                        else
                        {
                            gameVariableLists[local][variableName] = value;
                        }
                    }
                    break;

                case "set":
                    variableName = command.Item3[0].ToString();

                    value = command.Item3[1].ToString();

                    if (value.StartsWith("&"))
                    {
                        value = value.Substring(1);
                        if ((layer = findVariableInLists(value, local)) != -1)
                        {
                            value = gameVariableLists[layer][value].ToString();
                        }
                        else
                        {
                            foreach (Image img in command.Item2.GetComponentsInChildren <Image>())
                            {
                                img.material = matRedHighLight;
                            }
                            Debug.LogWarning("variable \"" + value + "\" doesn't exsit!");
                            gameBreakTrigger = true;
                            break;
                        }
                    }

                    if ((layer = findVariableInLists(variableName, local)) != -1)
                    {
                        if (double.TryParse(value, out num))
                        {
                            gameVariableLists[layer][variableName] = num;
                        }
                        else
                        {
                            gameVariableLists[layer][variableName] = value;
                        }
                        Debug.Log("variable \"" + variableName + "\" exsit!");
                    }
                    else
                    {
                        foreach (Image img in command.Item2.GetComponentsInChildren <Image>())
                        {
                            img.material = matRedHighLight;
                        }
                        Debug.LogWarning("variable \"" + variableName + "\" doesn't exsit!");
                        gameBreakTrigger = true;
                        break;
                    }

                    break;

                case "for":
                    yield return(StartCoroutine(ExecuteCommand((List <Tuple <string, Transform, List <object> > >)command.Item3[0])));

                    break;

                case "if":
                    foreach (Image img in ((Transform)command.Item3[5]).GetComponentsInChildren <Image>())
                    {
                        img.material = null;
                    }
                    foreach (Image img in ((Transform)command.Item3[6]).GetComponentsInChildren <Image>())
                    {
                        img.material = null;
                    }

                    value = command.Item3[0].ToString();

                    if (value.StartsWith("&"))
                    {
                        value = value.Substring(1);
                        if ((layer = findVariableInLists(value, local)) != -1)
                        {
                            value = gameVariableLists[layer][value].ToString();
                        }
                        else
                        {
                            foreach (Image img in command.Item2.GetComponentsInChildren <Image>())
                            {
                                img.material = matRedHighLight;
                            }
                            Debug.LogWarning("variable \"" + value + "\" doesn't exsit!");
                            gameBreakTrigger = true;
                            break;
                        }
                    }
                    string value2 = command.Item3[1].ToString();

                    if (value2.StartsWith("&"))
                    {
                        value2 = value2.Substring(1);
                        if ((layer = findVariableInLists(value2, local)) != -1)
                        {
                            value2 = gameVariableLists[layer][value2].ToString();
                        }
                        else
                        {
                            foreach (Image img in command.Item2.GetComponentsInChildren <Image>())
                            {
                                img.material = matRedHighLight;
                            }
                            Debug.LogWarning("variable \"" + value2 + "\" doesn't exsit!");
                            gameBreakTrigger = true;
                            break;
                        }
                    }
                    Debug.Log(value + value2);
                    bool enter = false;

                    if (command.Item3[2].ToString() == "==")
                    {
                        enter = value == value2;
                    }
                    else if (command.Item3[2].ToString() == "!=")
                    {
                        enter = value != value2;
                    }
                    else
                    {
                        if (double.TryParse(value, out num) && double.TryParse(value2, out double num2))
                        {
                            if (command.Item3[2].ToString() == ">")
                            {
                                enter = num > num2;
                            }
                            else if (command.Item3[2].ToString() == "<")
                            {
                                enter = num < num2;
                            }
                            else if (command.Item3[2].ToString() == ">=")
                            {
                                enter = num >= num2;
                            }
                            else if (command.Item3[2].ToString() == "<=")
                            {
                                enter = num <= num2;
                            }
                        }
                        else if (GameUtility.OptionTextToNumber(value, out int num3) && GameUtility.OptionTextToNumber(value2, out int num4))
                        {
                            Debug.Log(num3 + num4);
                            foreach (MiniGameObject mini in GameVariable.gamePiece[num3])
                            {
                                if (command.Item3[2].ToString() == "面向")
                                {
                                    enter = mini.IsFacing(num4);
                                }
                                else if (command.Item3[2].ToString() == "沒有面向")
                                {
                                    enter = !mini.IsFacing(num4);
                                }
                                else if (command.Item3[2].ToString() == "腳下有")
                                {
                                    enter = mini.IsOn(num4);
                                }
                                else if (command.Item3[2].ToString() == "腳下沒有")
                                {
                                    enter = !mini.IsOn(num4);
                                }
                            }
                        }
                    }

                    yield return(Wait(wait));

                    waited = true;
                    if (enter)
                    {
                        yield return(StartCoroutine(ExecuteCommand((List <Tuple <string, Transform, List <object> > >)command.Item3[3])));
                    }
                    else
                    {
                        yield return(StartCoroutine(ExecuteCommand((List <Tuple <string, Transform, List <object> > >)command.Item3[4])));
                    }

                    //Transform t = (Transform)command.Item3[2];
                    //StartCoroutine( ExecuteCommand( (List<Tuple<string, Transform, List<object>>>)command.Item3[0] ) );
                    //StartCoroutine( ExecuteCommand( (List<Tuple<string, Transform, List<object>>>)command.Item3[1] ) );
                    break;

                case "repeat":

                    foreach (Image img in ((Transform)command.Item3[2]).GetComponentsInChildren <Image>())
                    {
                        img.material = null;
                    }

                    int time = 0;
                    if (command.Item3[0].GetType() == typeof(int))
                    {
                        time = (int)command.Item3[0];
                    }
                    else
                    {
                        variableName = command.Item3[0].ToString();
                        if (variableName.StartsWith("&"))
                        {
                            variableName = variableName.Substring(1);

                            Debug.Log(variableName);

                            if ((layer = findVariableInLists(variableName, local)) != -1)
                            {
                                time = (int)(double)gameVariableLists[layer][variableName];
                                Debug.Log(time);
                            }
                            else
                            {
                                Debug.LogWarning("variable \"" + variableName + "\" doesn't exsit!");
                            }
                        }
                    }

                    yield return(Wait(wait));

                    waited = true;

                    int x = 0;
                    if (variableName == "infinity")
                    {
                        while (true)
                        {
                            gameLoopCoroutines.Add(StartCoroutine(ExecuteCommand((List <Tuple <string, Transform, List <object> > >)command.Item3[1])));
                            x = gameLoopCoroutines.Count - 1;
                            yield return(gameLoopCoroutines[x]);

                            if (loopBreakTrigger || gameBreakTrigger)
                            {
                                loopBreakTrigger = false;
                                break;
                            }
                        }
                    }
                    else
                    {
                        for (int i = 0; i < time; i++)
                        {
                            gameLoopCoroutines.Add(StartCoroutine(ExecuteCommand((List <Tuple <string, Transform, List <object> > >)command.Item3[1])));
                            x = gameLoopCoroutines.Count - 1;
                            yield return(gameLoopCoroutines[x]);

                            if (loopBreakTrigger || gameBreakTrigger)
                            {
                                loopBreakTrigger = false;
                                break;
                            }
                        }
                    }

                    //StartCoroutine( ExecuteCommand( (List<Tuple<string, Transform, List<object>>>)command.Item3[0] ) );
                    break;

                case "move":
                    if (double.TryParse(command.Item3[0].ToString(), out num))
                    {
                        MiniGameObject playerMini = player.GetComponent <MiniGameObject>();
                        playerMini.Move((int)num);
                    }
                    break;

                case "turn":
                    if (double.TryParse(command.Item3[0].ToString(), out num))
                    {
                        MiniGameObject playerMini = player.GetComponent <MiniGameObject>();
                        playerMini.Turn((int)num);
                    }
                    break;

                case "add":
                    variableName = command.Item3[0].ToString();

                    value = command.Item3[1].ToString();

                    if (value.StartsWith("&"))
                    {
                        value = value.Substring(1);
                        if ((layer = findVariableInLists(value, local)) != -1)
                        {
                            value = gameVariableLists[layer][value].ToString();
                        }
                        else
                        {
                            foreach (Image img in command.Item2.GetComponentsInChildren <Image>())
                            {
                                img.material = matRedHighLight;
                            }
                            Debug.LogWarning("variable \"" + value + "\" doesn't exsit!");
                            gameBreakTrigger = true;
                            break;
                        }
                    }

                    if ((layer = findVariableInLists(variableName, local)) != -1)
                    {
                        if (gameVariableLists[layer][variableName] is double)
                        {
                            if (double.TryParse(value, out num))
                            {
                                gameVariableLists[layer][variableName] = (double)gameVariableLists[layer][variableName] + num;
                            }
                            else
                            {
                                Debug.Log($"can't add (number) and (string) together!");
                            }
                        }
                        else
                        {
                            gameVariableLists[layer][variableName] = gameVariableLists[layer][variableName] as string + value;
                        }
                    }
                    else
                    {
                        foreach (Image img in command.Item2.GetComponentsInChildren <Image>())
                        {
                            img.material = matRedHighLight;
                        }
                        Debug.LogWarning("variable \"" + variableName + "\" doesn't exsit!");
                        gameBreakTrigger = true;
                        break;
                    }
                    break;

                case "break":
                    loopBreakTrigger = true;
                    break;
                }
            }

            if (!waited)
            {
                yield return(Wait(wait));
            }


            foreach (List <MiniGameObject> list in gameEnv2d)
            {
                foreach (MiniGameObject mgo in list)
                {
                    //if ( mgo.containObject( mgo.posInEnv.x, mgo.posInEnv.y, 5 ).Count >= 0 ) {
                    //    mgo.fallToDead = true;
                    //    mgo.moveAnimationType = 2;
                    //    mgo.moveAnimationStart = Time.time;
                    //}
                    if (mgo.objectType == 2 || mgo.objectType == 3)
                    {
                        if (mgo.containObject(mgo.posInEnv.x, mgo.posInEnv.y, 5).Count > 0)
                        {
                            mgo.fallToDead         = true;
                            mgo.moveAnimationType  = 2;
                            mgo.moveAnimationStart = Time.time;
                            if (mgo.objectType == 2)
                            {
                                gameBreakTrigger = true;
                            }
                        }
                    }
                }
            }

            foreach (Image img in command.Item2.GetComponentsInChildren <Image>())
            {
                img.material = null;
            }


            if (gameBreakTrigger)
            {
                StopGame();
                yield break;
            }
            else if (player.GetComponent <MiniGameObject>().IsOnFlag())
            {
                StopGame(true);
                yield break;
            }
        }



        if (!child)
        {
            StopGame(player.GetComponent <MiniGameObject>().IsOnFlag());
        }
    }