예제 #1
0
        /// <summary>
        /// Attempts to parse a modification.
        /// </summary>
        static public bool TryParse(StringSlice inData, out VariantModification outModification)
        {
            inData = inData.Trim();

            VariantModifyOperator op = default(VariantModifyOperator);
            int operatorIdx          = -1;
            int operatorLength       = 0;

            VariantUtils.TryFindOperator(inData, '=', VariantModifyOperator.Set, ref operatorIdx, ref op, ref operatorLength);
            VariantUtils.TryFindOperator(inData, '+', VariantModifyOperator.Add, ref operatorIdx, ref op, ref operatorLength);
            VariantUtils.TryFindOperator(inData, '-', VariantModifyOperator.Subtract, ref operatorIdx, ref op, ref operatorLength);
            VariantUtils.TryFindOperator(inData, '*', VariantModifyOperator.Multiply, ref operatorIdx, ref op, ref operatorLength);
            VariantUtils.TryFindOperator(inData, '/', VariantModifyOperator.Divide, ref operatorIdx, ref op, ref operatorLength);

            if (operatorIdx < 0)
            {
                outModification = default(VariantModification);
                return(false);
            }

            outModification.Operator = op;

            StringSlice key     = inData.Substring(0, operatorIdx);
            StringSlice operand = inData.Substring(operatorIdx + 1);

            if (!TableKeyPair.TryParse(key, out outModification.VariableKey))
            {
                outModification = default(VariantModification);
                return(false);
            }

            return(VariantOperand.TryParse(operand, out outModification.Operand));
        }
예제 #2
0
        /// <summary>
        /// Modify a value on the table.
        /// </summary>
        public void Modify(StringHash32 inId, VariantModifyOperator inOperator, Variant inOperand)
        {
            int idx = IndexOf(inId);

            switch (inOperator)
            {
            case VariantModifyOperator.Set:
            {
                SetAt(idx, inId, inOperand);
                break;
            }

            case VariantModifyOperator.Add:
            {
                Variant current = GetAt(idx);
                SetAt(idx, inId, current + inOperand);
                break;
            }

            case VariantModifyOperator.Subtract:
            {
                Variant current = GetAt(idx);
                SetAt(idx, inId, current - inOperand);
                break;
            }

            case VariantModifyOperator.Multiply:
            {
                Variant current = GetAt(idx);
                SetAt(idx, inId, current * inOperand);
                break;
            }

            case VariantModifyOperator.Divide:
            {
                Variant current = GetAt(idx);
                SetAt(idx, inId, current / inOperand);
                break;
            }
            }
        }
예제 #3
0
        /// <summary>
        /// Attempts to apply a modification.
        /// </summary>
        static public bool TryModify(this IVariantResolver inResolver, object inContext, TableKeyPair inKey, VariantModifyOperator inOperator, Variant inVariant)
        {
            inResolver.RemapKey(ref inKey);

            VariantTable table;
            bool         bRetrieved = inResolver.TryGetTable(inContext, inKey.TableId, out table);

            if (!bRetrieved || table == null)
            {
                UnityEngine.Debug.LogErrorFormat("[IVariantResolver] Unable to retrieve table with id '{0}'", inKey.TableId.ToDebugString());
                return(false);
            }

            table.Modify(inKey.VariableId, inOperator, inVariant);
            return(true);
        }