/// <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)); }
/// <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; } } }
/// <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); }