#include "munga.h"
#pragma hdrstop

#include "scnrole.h"
#include "app.h"
#include "notation.h"

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
ScenarioRole::ScenarioRole(const CString &role_name)
{
	damageReceivedModifier = 0.0f;
	damageInflictedModifier = 0.0f;
	damageBias = 0.0f;
	friendlyFirePenalty = 0.0f;
	killBonus = 0.0f;
	roleName = role_name;
   returnFromDeath = 0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
ScenarioRole::ScenarioRole(const CString &role_name, const CString &model_file)
{
	Check_Pointer(&role_name);
	Check_Pointer(&model_file);

	roleName = role_name;
	//
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Truncate the Role:: from roleName
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	//
	ResourceFile
		*res = application->GetResourceFile();
	ResourceDescription
		*player_res_des;

	player_res_des = res->FindResourceDescription(
		model_file,
		ResourceDescription::GameModelResourceType
	);

	if (player_res_des)
	{
		player_res_des->Lock();
		ModelResource
			*player_data = (ModelResource *)player_res_des->
				resourceAddress;

		killBonus = player_data->killBonus;
		returnFromDeath = player_data->returnFromDeath;
		damageReceivedModifier = player_data->damageReceivedModifier;
		damageInflictedModifier = player_data->damageInflictedModifier;
		damageBias = player_data->damageBias;
		friendlyFirePenalty = player_data->friendlyFirePenalty;
		player_res_des->Unlock();
	}
	else
	{
		Tell(role_name);
		Warn(" does not exists in resource! ");
		damageReceivedModifier = 0.0f;
		damageInflictedModifier = 0.0f;
		damageBias = 0.0f;
		friendlyFirePenalty = 0.0f;
		killBonus = 0.0f;
		returnFromDeath = 0;
	}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Scalar
	ScenarioRole::CalcDamageReceivedScore(const Scalar  &damage_received)
{
	Check(this);
//                                                ]
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Calculate modified score for the player receiving damage
// damageReceived * damageReceivedModifier
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
	Check(this);

	Check_Fpu();
	return -(damage_received * GetDamageReceivedModifier());
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
ScenarioRole::~ScenarioRole()
{

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
ResourceDescription::ResourceID
	ScenarioRole::CreateModelResource(
#if DEBUG_LEVEL>0
		ResourceFile *resource_file,
		const char* model_name,
		NotationFile * model_file,
		const ResourceDirectories *directories,
		ModelResource *model
#else
		ResourceFile *resource_file,
		const char* model_name,
		NotationFile * model_file,
		const ResourceDirectories *,
		ModelResource *model
#endif
	)
{
	Check(resource_file);
	Check_Pointer(model_name);
	Check_Pointer(directories);

	//
	// If we were not provided a buffer to write the model data into, we must
	// create it ourselves.  Then make sure that the model stuff is read in
	//
	ModelResource *local_model = model;
	if (!local_model)
	{
		local_model = new ModelResource;
		Register_Pointer(local_model);
	}

	//----------------------------------------
	//  Read in the data from notation file
	//----------------------------------------
	//
	// Get PointValue assigned to this ScoreZone
	//

	if(
	!model_file->GetEntry(
		"gamedata",
		"KillBonus",
		&local_model->killBonus
		)
	)
	{
		std::cerr << model_name <<  "Missing KillBonus" <<  std::endl;
Dump_And_Die:
		if (!model)
		{
			Unregister_Pointer(local_model);
			delete local_model;
		}
		return -1;
	}

	if(
	!model_file->GetEntry(
		"gamedata",
		"DamageReceivedModifier",
		&local_model->damageReceivedModifier
		)
	)
	{
		std::cerr << model_name <<  "Missing DamageReceivedModifier" <<  std::endl;
		goto Dump_And_Die;
	}

	if(
	!model_file->GetEntry(
		"gamedata",
		"DamageInflictedModifier",
		&local_model->damageInflictedModifier
		)
	)
	{
		std::cerr << model_name <<  "Missing DamageInflictedModifier" <<  std::endl;
		goto Dump_And_Die;
	}
   if(
	!model_file->GetEntry(
		"gamedata",
		"ReturnFromDeath",
		&local_model->returnFromDeath
		)
	)
	{
		std::cerr << model_name <<  "Missing ReturnFromDeath" <<  std::endl;
		goto Dump_And_Die;
	}
	if(
	!model_file->GetEntry(
		"gamedata",
		"DamageBias",
		&local_model->damageBias
		)
	)
	{
		std::cerr << model_name <<  "Missing DamageBias" <<  std::endl;
		goto Dump_And_Die;
	}

	if(
	!model_file->GetEntry(
		"gamedata",
		"FriendlyFirePenalty",
		&local_model->friendlyFirePenalty
		)
	)
	{
		std::cerr << model_name <<  "Missing FriendlyFirePenalty" <<  std::endl;
		goto Dump_And_Die;
	}


	if (!model)
	{
		ResourceDescription *new_res =
			resource_file->AddResource(
				model_name,
				ResourceDescription::GameModelResourceType,
				1,
				ResourceDescription::Preload,
				local_model,
				sizeof(*local_model)
			);
		Unregister_Pointer(local_model);
		delete local_model;
		Check_Fpu();
		Check(new_res);
		return new_res->resourceID;
	}
	else
	{
		Check_Fpu();
		return 0;
	}
}
