/* 
 * Tactic is the legal property of its developers, whose names are too numerous 
 * to list here.  Please refer to the COPYRIGHT file distributed with this 
 * source distribution. 
 * 
 * This library is free software; you can redistribute it and/or 
 * modify it under the terms of the GNU Lesser General Public 
 * License as published by the Free Software Foundation; either 
 * version 2.1 of the License, or (at your option) any later version. 
 * 
 * This library is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
 * Lesser General Public License for more details. 
 * 
 * You should have received a copy of the GNU Lesser General Public 
 * License along with this library; if not, write to the Free Software 
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
 *
 * See README for more informations
 *
 * Fight.cpp
 *
 * ...
 * Date 22/02/06
 *
 */

#include "Evaluation.h"
#include "Fight.h"
#include "Flee.h"
#include "Move.h"
#include "Obey.h"
#include "ErrorState.h"


Fight::Fight (GroupAI* groupAI,std::vector<FuzzyRule>* rules) : State(groupAI, rules) {
	DebugAI::trace('a', "Creating Fight State");

	evaluationState = NULL;
	fleeState = NULL;
	moveState = NULL;
	obeyState = NULL;
	errorState = NULL;
	type = FIGHT;
}

Fight::~Fight()
{
	DebugAI::trace('a', "Destructing Fight State");
}

State* Fight::change (Order* order)
{
	State* newState;

	switch (order->getType())
	{
		case ORDER_EVALUATION:
			DebugAI::trace('a', "Transition Fight -> Evaluation");
			newState = evaluationState;
			break;

		case ORDER_ATTACK:
			DebugAI::trace('a', "Transition Fight -> Fight");
			newState = this;
			break;

		case ORDER_FLEE:
			DebugAI::trace('a', "Transition Fight -> Flee");
			newState = fleeState;
			break;

		default:
			DebugAI::trace('a', "Transition Fight -> ErrorState");
			newState = errorState;
	}

	return newState;
}

std::string Fight::toString ()
{
	std::string thisState;

	// The type of the state
	thisState = "Fight";

	return thisState;
}

void Fight::setStates (Evaluation* evaluation, Flee* flee, Move* move,
							Obey* obey, ErrorState* error) {
	DebugAI::trace('a', "Setting States of Fight State");
	evaluationState = evaluation;
	fleeState = flee;
	moveState = move;
	obeyState = obey;
	errorState = error;
}
