예제 #1
0
 public static void AddLocalVariables(StackLevel locals)
 {
     lock (s_variables)
     {
         s_locals.Push(locals);
         s_lastExecutionLevel = locals;
     }
 }
예제 #2
0
        protected override Variable Evaluate(ParsingScript script)
        {
            List <Variable> args = script.GetFunctionArgs();

            script.MoveBackIf(Constants.START_GROUP);

            if (args.Count != m_args.Length)
            {
                throw new ArgumentException("Function [" + m_name + "] arguments mismatch: " +
                                            m_args.Length + " declared, " + args.Count + " supplied");
            }

            // 1. Add passed arguments as local variables to the Parser.
            StackLevel stackLevel = new StackLevel(m_name);

            for (int i = 0; i < m_args.Length; i++)
            {
                stackLevel.Variables[m_args[i]] = new GetVarFunction(args[i]);
            }

            ParserFunction.AddLocalVariables(stackLevel);

            // 2. Execute the body of the function.
            Variable      result     = null;
            ParsingScript tempScript = new ParsingScript(m_body);

            tempScript.ScriptOffset = m_parentOffset;
            if (m_parentScript != null)
            {
                tempScript.Char2Line      = m_parentScript.Char2Line;
                tempScript.Filename       = m_parentScript.Filename;
                tempScript.OriginalScript = m_parentScript.OriginalScript;
            }

            while (tempScript.Pointer < m_body.Length - 1 &&
                   (result == null || !result.IsReturn))
            {
                result = tempScript.ExecuteTo();
                tempScript.GoToNextStatement();
            }

            ParserFunction.PopLocalVariables();
            //script.MoveForwardIf(Constants.END_ARG);
            //script.MoveForwardIf(Constants.END_STATEMENT);

            if (result == null)
            {
                result = Variable.EmptyInstance;
            }
            else
            {
                result.IsReturn = false;
            }

            return(result);
        }
예제 #3
0
    private static StackLevel GetCurrentLevel()
    {
        StackLevel result = null;

        if (TriggersStack.Count > 0)
        {
            result = TriggersStack[TriggersStack.Count - 1];
        }
        return(result);
    }
예제 #4
0
        public void RegisterArguments(List <Variable> args)
        {
            StackLevel stackLevel = new StackLevel(m_name);

            for (int i = 0; i < m_args.Length; i++)
            {
                stackLevel.Variables[m_args [i]] = new GetVarFunction(args [i]);
            }

            ParserFunction.AddLocalVariables(stackLevel);
        }
예제 #5
0
    public static void ResolveTriggers(TriggerTypes triggerType, Action callBack = null)
    {
        if (callBack != null)
        {
            Console.Write(triggerType.ToString(), LogTypes.Triggers, true, "yellow");
        }
        else
        {
            Console.Write(triggerType + " is resolved again", LogTypes.Triggers, false, "yellow");
        }

        if (triggerType == TriggerTypes.OnDamageIsDealt && callBack != null)
        {
            DamageNumbers.UpdateSavedHP();
        }

        StackLevel currentLevel = GetCurrentLevel();

        if (currentLevel == null || currentLevel.IsActive)
        {
            CreateNewLevelOfStack(triggerType, callBack);
            currentLevel = GetCurrentLevel();
        }

        if (!currentLevel.IsActive)
        {
            SetStackLevelCallBack(callBack);

            List <Trigger>   currentTriggersList = currentLevel.GetTriggersByPlayer(Phases.PlayerWithInitiative);
            Players.PlayerNo currentPlayer       = (currentTriggersList.Count > 0) ? Phases.PlayerWithInitiative : Roster.AnotherPlayer(Phases.PlayerWithInitiative);
            currentTriggersList = currentLevel.GetTriggersByPlayer(currentPlayer);

            if (currentTriggersList.Count != 0)
            {
                currentLevel.IsActive = true;
                if ((currentTriggersList.Count == 1) || (IsAllSkippable(currentTriggersList)))
                {
                    FireTrigger(currentTriggersList[0]);
                }
                else
                {
                    RunDecisionSubPhase();
                }
            }
            else
            {
                if (triggerType == TriggerTypes.OnDamageIsDealt)
                {
                    DamageNumbers.ShowChangedHP();
                }
                DoCallBack();
            }
        }
    }
예제 #6
0
    public static void ResolveTriggers(TriggerTypes triggerType, Action callBack = null)
    {
        if (DebugManager.DebugTriggers)
        {
            Debug.Log("Triggers are resolved: " + triggerType);
        }

        if (triggerType == TriggerTypes.OnDamageIsDealt && callBack != null)
        {
            DamageNumbers.UpdateSavedHP();
        }

        StackLevel currentLevel = GetCurrentLevel();

        if (currentLevel == null || currentLevel.IsActive)
        {
            CreateNewLevelOfStack(callBack);
            currentLevel = GetCurrentLevel();
        }

        if (!currentLevel.IsActive)
        {
            SetStackLevelCallBack(callBack);

            List <Trigger>   currentTriggersList = currentLevel.GetTriggersByPlayer(Phases.PlayerWithInitiative);
            Players.PlayerNo currentPlayer       = (currentTriggersList.Count > 0) ? Phases.PlayerWithInitiative : Roster.AnotherPlayer(Phases.PlayerWithInitiative);
            currentTriggersList = currentLevel.GetTriggersByPlayer(currentPlayer);

            if (currentTriggersList.Count != 0)
            {
                currentLevel.IsActive = true;
                if ((currentTriggersList.Count == 1) || (IsAllSkippable(currentTriggersList)))
                {
                    FireTrigger(currentTriggersList[0]);
                }
                else
                {
                    RunDecisionSubPhase();
                }
            }
            else
            {
                if (triggerType == TriggerTypes.OnDamageIsDealt)
                {
                    DamageNumbers.ShowChangedHP();
                }
                DoCallBack();
            }
        }
    }
예제 #7
0
    public static void FinishTrigger()
    {
        StackLevel currentStackLevel = GetCurrentLevel();
        Trigger    currentTrigger    = currentStackLevel.GetCurrentTrigger();

        if (DebugManager.DebugTriggers)
        {
            Debug.Log("Trigger is finished: " + currentTrigger.Name);
        }

        currentStackLevel.RemoveTrigger(currentTrigger);
        currentStackLevel.IsActive = false;

        ResolveTriggers(currentTrigger.TriggerType);
    }
예제 #8
0
        // Add Local Variable
        public static void AddLocalVariable(ParserFunction local)
        {
            StackLevel locals = null;

            if (_locals.Count == 0)
            {
                locals = new StackLevel();
                _locals.Push(locals);
            }
            else
            {
                locals = _locals.Peek();
            }

            locals.Variables[local.Name] = local;
        }
예제 #9
0
    static int get_stackLevel(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            UISystem   obj = (UISystem)o;
            StackLevel ret = obj.stackLevel;
            ToLua.Push(L, ret);
            return(1);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o, "attempt to index stackLevel on a nil value"));
        }
    }
예제 #10
0
    static int set_stackLevel(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            UISystem   obj  = (UISystem)o;
            StackLevel arg0 = (StackLevel)ToLua.CheckObject(L, 2, typeof(StackLevel));
            obj.stackLevel = arg0;
            return(0);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o, "attempt to index stackLevel on a nil value"));
        }
    }
예제 #11
0
    public static void FinishTrigger()
    {
        StackLevel currentStackLevel = GetCurrentLevel();

        if (currentStackLevel.GetTrigersList().Count == 0)
        {
            Debug.Log("Ooops, you want to finish trigger, but new empty level of stack was created!");
        }

        Trigger currentTrigger = currentStackLevel.GetCurrentTrigger();

        Console.Write(currentTrigger.Name + " is finished", LogTypes.Triggers);

        currentStackLevel.RemoveTrigger(currentTrigger);
        currentStackLevel.IsActive = false;

        ResolveTriggers(currentTrigger.TriggerType);
    }
예제 #12
0
        public static void AddLocalVariable(ParserFunction local)
        {
            local.m_isGlobal = false;
            StackLevel locals = null;

            if (s_locals.Count == 0)
            {
                locals = new StackLevel();
                s_locals.Push(locals);
            }
            else
            {
                locals = s_locals.Peek();
            }

            locals.Variables[local.Name] = local;
            Translation.AddTempKeyword(local.Name);
        }
예제 #13
0
    public static void FinishTrigger()
    {
        StackLevel currentStackLevel = GetCurrentLevel();

        if (currentStackLevel == null || currentStackLevel.GetTrigersList() == null || currentStackLevel.GetTrigersList().Count == 0)
        {
            Debug.Log("Ooops! You want to finish trigger, but it is already finished");
        }

        Trigger currentTrigger = currentStackLevel.GetCurrentTrigger();

        Console.Write(currentTrigger.Name + " is finished", LogTypes.Triggers);

        currentStackLevel.RemoveTrigger(currentTrigger);
        currentStackLevel.IsActive = false;

        ResolveTriggers(currentTrigger.TriggerType);
    }
예제 #14
0
        public static void AddNamespace(string namespaceName)
        {
            if (!string.IsNullOrWhiteSpace(s_namespace))
            {
                throw new ArgumentException("Already inside of namespace [" + s_namespace + "].");
            }

            StackLevel level;

            if (!s_namespaces.TryGetValue(namespaceName, out level))
            {
                level = new StackLevel(namespaceName, true);;
            }

            s_locals.Push(level);
            s_namespaces[namespaceName] = level;

            s_namespace       = namespaceName;
            s_namespacePrefix = namespaceName + ".";
        }
예제 #15
0
        public static void AddLocalVariable(ParserFunction local)
        {
            NormalizeValue(local);
            local.m_isGlobal = false;
            StackLevel locals = null;

            if (s_locals.Count == 0)
            {
                locals = new StackLevel();
                s_locals.Push(locals);
            }
            else
            {
                locals = s_locals.Peek();
            }

            var name = Constants.ConvertName(local.Name);

            local.Name             = Constants.GetRealName(name);
            locals.Variables[name] = local;
#if UNITY_EDITOR == false && UNITY_STANDALONE == false && __ANDROID__ == false && __IOS__ == false
            Translation.AddTempKeyword(name);
#endif
        }
예제 #16
0
        protected override Variable Evaluate(string data, ref int from)
        {
            bool            isList;
            List <Variable> functionArgs = Utils.GetArgs(data, ref from,
                                                         Constants.START_ARG, Constants.END_ARG, out isList);

            Utils.MoveBackIf(data, ref from, Constants.START_GROUP);
            if (functionArgs.Count != _args.Length)
            {
                throw new ArgumentException("Функция [" + _name + "] аргументи несъответствие: " +
                                            _args.Length + " обявен, " + functionArgs.Count + " доставен");
            }

            // 1. Добавете предаваните аргументи като локални променливи към анализатора.
            StackLevel stackLevel = new StackLevel(_name);

            for (int i = 0; i < _args.Length; i++)
            {
                stackLevel.Variables[_args[i]] = new GetVarFunction(functionArgs[i]);
            }

            ParserFunction.AddLocalVariables(stackLevel);

            // 2. Изпълнете тялото на функцията.
            int      temp   = 0;
            Variable result = null;

            while (temp < _body.Length - 1)
            {
                result = Parser.LoadAndCalculate(_body, ref temp, Constants.END_PARSE_ARRAY);
                Utils.GoToNextStatement(_body, ref temp);
            }

            ParserFunction.PopLocalVariables();
            return(result);
        }
예제 #17
0
 /// <summary>
 /// Initializes a new instance of the <see cref="StackedRequestParams"/> class.
 /// </summary>
 /// <param name="stackInfo">The stack witch contains the level to switch to.</param>
 /// <param name="stackLevel">The stack level to switch to.</param>
 public StackedRequestParams(StackInfo stackInfo, StackLevel stackLevel)
 {
     this.StackInfo  = stackInfo;
     this.StackLevel = stackLevel;
 }
예제 #18
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SwitchToStackRequestParams"/> class.
 /// </summary>
 /// <param name="stackInfo">The stack witch contains the level to switch to.</param>
 /// <param name="stackLevel">The stack level to switch to.</param>
 public SwitchToStackRequestParams(StackInfo stackInfo, StackLevel stackLevel)
 {
     this.StackInfo  = stackInfo;
     this.StackLevel = stackLevel;
 }
예제 #19
0
 /// <summary>
 /// Initializes a new instance of the <see cref="GetLevelDetailsResponse"/> class.
 /// </summary>
 /// <param name="stackLevel">An instance of <see cref="StackLevel"/> sent in the response.</param>
 public GetLevelDetailsResponse(StackLevel stackLevel)
 {
     this.StackLevel = stackLevel;
 }
예제 #20
0
 /// <summary>
 /// Initializes a new instance of the <see cref="GetLevelDetailsRequestParams"/> class.
 /// </summary>
 /// <param name="stackLevel">The stack level to switch to.</param>
 public GetLevelDetailsRequestParams(StackLevel stackLevel)
 {
     this.StackLevel = stackLevel;
 }
예제 #21
0
 // Add Local Variables
 public static void AddLocalVariables(StackLevel locals)
 {
     _locals.Push(locals);
 }