/**
	* Returns all the mental states for a creature.
	*
	* @param env		    Java environment
	* @param self		    class calling this function
	* @param mob	    id of creature to access
	*
	* @return the mental states for the creature
*/
jobjectArray JNICALL ScriptMethodsMentalStatesNamespace::getMentalStates(JNIEnv *env, jobject self, jlong mob)
{
	UNREF(self);

	CreatureObject * creature = 0;
	if (!JavaLibrary::getObject(mob, creature))
		return 0;

	// create the array of mental states
	LocalObjectArrayRefPtr attribs = createNewObjectArray(
		MentalStates::NumberOfMentalStates, JavaLibrary::getClsMentalState());
	if (env->ExceptionCheck())
	{
		env->ExceptionDescribe();
		return 0;
	}

	// set the array elements
	for (int i = 0; i < MentalStates::NumberOfMentalStates; ++i)
	{
		LocalRefPtr mentalState = createNewObject(JavaLibrary::getClsMentalState(), JavaLibrary::getMidMentalState(),
			i, creature->getMentalState(static_cast<MentalStates::Enumerator>(i)));
		if (env->ExceptionCheck())
		{
			env->ExceptionDescribe();
			return 0;
		}
		setObjectArrayElement(*attribs, i, *mentalState);
	}
	return attribs->getReturnValue();
}	// JavaLibrary::getMentalStates
/**
* Returns a creature's mental state.
*
* @param env		    Java environment
* @param self		    class calling this function
* @param mob	    id of creature to access
* @param mental state		mental state we are interested in
*
* @return the mental state value, or MENTAL_STATE_ERROR on error
*/
jfloat JNICALL ScriptMethodsMentalStatesNamespace::getMentalState(JNIEnv *env, jobject self, jlong mob, jint mentalState)
{
	UNREF(self);

	if (mentalState < 0 || mentalState >= MentalStates::NumberOfMentalStates)
		return MENTAL_STATE_ERROR;

	CreatureObject * creature = 0;
	if (!JavaLibrary::getObject(mob, creature))
		return MENTAL_STATE_ERROR;

	return creature->getMentalState(static_cast<MentalStates::Enumerator>(mentalState));
}	// JavaLibrary::getMentalState
	/**
	* Adds a value to a creature's mental state.
	*
	* @param env		    Java environment
	* @param self		    class calling this function
	* @param mob	    id of creature to access
	* @param mentalState		mental state we are interested in
	* @param value			value to add to the mental state
	*
	* @return true on success, false on fail
*/
jboolean JNICALL ScriptMethodsMentalStatesNamespace::addToMentalState(JNIEnv *env, jobject self, jlong mob, jint mentalState, jfloat value)
{
	UNREF(self);

	if (mentalState < 0 || mentalState >= MentalStates::NumberOfMentalStates)
		return JNI_FALSE;

	CreatureObject * creature = 0;
	if (!JavaLibrary::getObject(mob, creature))
		return JNI_FALSE;

	creature->setMentalState(static_cast<MentalStates::Enumerator>(mentalState),
		static_cast<MentalStates::Value>((creature->getMentalState(
		static_cast<MentalStates::Enumerator>(mentalState)) + value)));
	return JNI_TRUE;
}	// JavaLibrary::addToMentalState
	/**
	* Adds values to the mental states for a creature.
	*
	* @param env		    Java environment
	* @param self		    class calling this function
	* @param mob	    id of creature to access
	* @param values		mental state/value pairs to add
	*
	* @return true on success, false on fail
*/
jboolean JNICALL ScriptMethodsMentalStatesNamespace::addToMentalStates(JNIEnv *env, jobject self, jlong mob, jobjectArray values)
{
	UNREF(self);

	CreatureObject * creature = 0;
	if (!JavaLibrary::getObject(mob, creature))
		return JNI_FALSE;

	int count = env->GetArrayLength(values);
	for (int i = 0; i < count; ++i)
	{
		LocalRefPtr mentalState = getObjectArrayElement(LocalObjectArrayRefParam(values), i);
		if (mentalState == LocalRef::cms_nullPtr)
			return JNI_FALSE;
		int type = getIntField(*mentalState, JavaLibrary::getFidMentalStateType());
		if (type < 0 || type >= MentalStates::NumberOfMentalStates)
			return JNI_FALSE;
		MentalStates::Value value = creature->getMentalState(static_cast<MentalStates::Enumerator>(type));
		value += getFloatField(*mentalState, JavaLibrary::getFidMentalStateValue());
		creature->setMentalState(static_cast<MentalStates::Enumerator>(type),
			static_cast<MentalStates::Value>(value));
	}
	return JNI_TRUE;
}	// JavaLibrary::addToMentalStates