int CScriptBind_GameToken::SetToken( IFunctionHandler *pH)
{
	SCRIPT_CHECK_PARAMETERS(2);
	const char* tokenName = 0;
	if (pH->GetParams(tokenName) == false)
	{
		GameWarning("[GameToken.SetToken] Usage: GameToken.SetToken TokenName TokenValue]");
		return pH->EndFunction();
	}
	ScriptAnyValue val;
	TFlowInputData data;

	if (pH->GetParamAny( 2, val) == false)
	{
		GameWarning("[GameToken.SetToken(%s)] Usage: GameToken.SetToken TokenName TokenValue]", tokenName);
		return pH->EndFunction();
	}
	switch (val.type)
	{
	case ANY_TBOOLEAN:
		{ 
			bool v; 
			val.CopyTo(v); 	
			data.Set(v);
		}
		break;
	case ANY_TNUMBER:
		{ 
			float v; 
			val.CopyTo(v); 		
			data.Set(v);
		}
		break;
	case ANY_TSTRING:
		{ 
			const char* v;
			val.CopyTo(v); 		
			data.Set(string(v));
		}
		break;
	case ANY_TVECTOR:
		{ 
			Vec3 v; 
			val.CopyTo(v); 		
			data.Set(v);
		}
	case ANY_TTABLE:
		{
			float x,y,z;
			IScriptTable * pTable = val.table;
			assert (pTable != 0);
			if (pTable->GetValue( "x", x ) && pTable->GetValue( "y", y ) && pTable->GetValue( "z", z ))
			{
				data.Set(Vec3(x,y,z));
			}
			else
			{
				GameWarning("[GameToken.SetToken(%s)] Cannot convert parameter type '%s' to Vec3", tokenName, ScriptAnyTypeToString(val.type));
				return pH->EndFunction();
			}
		}
		break;
	case ANY_THANDLE:
		{
			ScriptHandle handle;
			val.CopyTo(handle);
			data.Set((EntityId)handle.n);
		}
		break;
	default:
		GameWarning("[GameToken.SetToken(%s)] Cannot convert parameter type '%s'", tokenName, ScriptAnyTypeToString(val.type));
		return pH->EndFunction();
		break; // dummy ;-)
	}
#ifdef SCRIPT_GAMETOKEN_ALWAYS_CREATE
	m_pTokenSystem->SetOrCreateToken(tokenName, data);
#else
	IGameToken *pToken = m_pTokenSystem->FindToken(tokenName);
	if (!pToken)
		GameWarning("[GameToken.SetToken] Cannot find token '%s'", tokenName);
	else
	{
		pToken->SetValue(data);
	}
#endif
	return pH->EndFunction();
}
bool CTweakMetadataGameToken::ChangeValue(bool bIncrement)
{
	// Get delta
	double fDelta = m_fDelta;
	if (!bIncrement)
		fDelta *= -1.0f;

	// Get and check CVAR
	IGameToken* pGameToken = GetGameToken();
	if(!pGameToken)
		return false;

	string sValue;

	// Deal with appropriate type
	switch (pGameToken->GetType())
	{
	case eFDT_Bool:
		{
			bool value = false;
			pGameToken->GetValueAs(value);
			TFlowInputData newValue;
			newValue.SetValueWithConversion(!value);
			pGameToken->SetValue(newValue);
		}
		break;
	case eFDT_Int:
		{
			int value = 0;
			pGameToken->GetValueAs(value);
			TFlowInputData newValue;
			newValue.SetValueWithConversion((int)ClampToLimits(value + fDelta));
			pGameToken->SetValue(newValue);
		}
		break;
	case eFDT_Float:
		{
			float value = 0.0f;
			pGameToken->GetValueAs(value);
			TFlowInputData newValue;
			newValue.SetValueWithConversion((float)ClampToLimits(value + fDelta));
			pGameToken->SetValue(newValue);
		}
		break;
	case eFDT_String:
		{
			// bools pretending to be strings
			string value = pGameToken->GetValueAsString();
			if(!value.compareNoCase("true"))
				pGameToken->SetValueAsString("false");
			else if(!value.compareNoCase("false"))
				pGameToken->SetValueAsString("true");

			// other strings are non-obvious
		}
		break;
	default:
		break;
	}

	return true;
}