new const NINTENDOMOD_KOOPATROOPA_PLUGIN[] = "Nintendo Mod - KoopaTroopa"
new const NINTENDOMOD_KOOPATROOPA_VERSION[] = "1.0"
new const NINTENDOMOD_KOOPATROOPA_AUTHOR[] = "Soloist"

/*
	Passive: Hard Back
		* Increased armor.
	Skill 1: Mindless Wandering
		* Evade attacks just alittle bit more per level.
	Skill 2: Reinforcments
		* Chance to revive non Koopa Troopa on your team.
	Skill 3: Single Minded
		* Randomly respawn after death.
	PowerUp: Shell Slide
		* Hit the opponent for damage of 75% of the player's armor. Lose all your armor.

	Future Plans
		Add CVARS for values

	Written By Soloist
	Version 1.0
	Last Updated On 08/26/06

	*************************************************************************************

	Changelog
		Version 1.0
			* Release of the plugin
*/

#include <amxmodx>
#include <cstrike>
#include <fun>
#include <fakemeta>
#include <nintendomod>

new const Float:KOOPATROOPA_ARMORNUM[11] = {100.0, 110.0, 120.0, 130.0, 140.0, 150.0, 160.0, 170.0, 180.0, 190.0, 200.0};
new const Float:KOOPATROOPA_MINDLESSPROB[3] = {0.20, 0.30, 0.40};

new charName[] = "KoopaTroopa";
new passiveName[] = "Hard Back";
new skill1Name[] = "Mindless Wandering";
new skill2Name[] = "Reinforcments";
new skill3Name[] = "Single Minded";
new powerupName[] = "Shell Slide";
new initName[] = "KoopaTroopa_Init";
new keyDownName[] = "KoopaTroopa_ShellSlide";

new passiveHelp[] = "Increased armor.";
new skill1Help[] = "Evade attacks just alittle bit more per level.";
new skill2Help[] = "Chance to revive non Koopa Troopa on your team.";
new skill3Help[] = "Randomly respawn after death.";
new powerupHelp[] = "Hit the opponent for damage of 75% of the player's armor. Lose all your armor.";

new PlayerLevel[33];
new PlayerSkill1[33];
new PlayerSkill2[33];
new PlayerSkill3[33];
new PlayerPowerUp[33];

new bool:BetweenRounds;

new bool:PlayerReinforcmentsUsed[33], bool:PlayerSingleMindedUsed[33], bool:shellSlide[33];

public plugin_init()
{
	if(is_plugin_loaded("Nintendo Mod") == -1)
	{
		server_print("**********************************");
		server_print("*** Nintendo Mod is not loaded ***");
		server_print("**********************************");
		pause("ae");
		return;
	}
	
	register_plugin(NINTENDOMOD_KOOPATROOPA_PLUGIN, NINTENDOMOD_KOOPATROOPA_VERSION, NINTENDOMOD_KOOPATROOPA_AUTHOR);

	register_cvar("NintendoMod_KoopaTroopa_Version", NINTENDOMOD_KOOPATROOPA_VERSION, FCVAR_SERVER|FCVAR_SPONLY);

	register_event("ResetHUD", "ResetHUD", "b");
	register_logevent("RoundStart", 2, "1=Round_Start");
	register_logevent("RoundEnd", 2, "1=Round_End");

	register_event("Damage", "KoopaTroopa_MindlessWandering", "b", "2!0");
	register_event("DeathMsg", "KoopaTroopa_DeathMsg", "ae");
	register_forward(FM_Touch, "KoopaTroopa_ShellSlideTouch");

	Nintendo_RegisterChar(charName, passiveName, skill1Name, skill2Name, skill3Name, powerupName, initName);
	Nintendo_RegisterHelp(charName, passiveHelp, skill1Help, skill2Help, skill3Help, powerupHelp);
	Nintendo_RegisterKeyDown(charName, keyDownName);

	register_srvcmd(initName, initName);
	register_srvcmd(keyDownName, keyDownName);
}

public client_connect(id)
{
	if(!Nintendo_Active() || !Nintendo_IsValidPlayer(id))
		return PLUGIN_HANDLED;

	InitPlayer(id);

	return PLUGIN_CONTINUE;
}

public client_disconnect(id)
{
	if(!Nintendo_Active() || !Nintendo_IsValidPlayer(id))
		return PLUGIN_HANDLED;

	InitPlayer(id);
	remove_task(id);

	return PLUGIN_CONTINUE;
}

public InitPlayer(id)
{
	if(!Nintendo_Active() || !Nintendo_IsValidPlayer(id))
		return PLUGIN_HANDLED;

	PlayerLevel[id] = 0;
	PlayerSkill1[id] = 0;
	PlayerSkill2[id] = 0;
	PlayerSkill3[id] = 0;
	PlayerPowerUp[id] = 0;

	return PLUGIN_CONTINUE;
}

public KoopaTroopa_Init()
{
	new temp[33];
	read_argv(1, temp, 32);
	new id = str_to_num(temp);

	if(!Nintendo_Active() || !Nintendo_IsValidPlayer(id))
		return PLUGIN_HANDLED;

	read_argv(2, temp, 32);
	new index  = str_to_num(temp);

	if(index == 0)
	{
		read_argv(3, temp, 32);
		new level = str_to_num(temp);
		read_argv(4, temp, 32);
		new skill1 = str_to_num(temp);
		read_argv(5, temp, 32);
		new skill2 = str_to_num(temp);
		read_argv(6, temp, 32);
		new skill3 = str_to_num(temp);
		read_argv(7, temp, 32);
		new powerup = str_to_num(temp);

		PlayerLevel[id] = level;
		PlayerSkill1[id] = skill1;
		PlayerSkill2[id] = skill2;
		PlayerSkill3[id] = skill3;
		PlayerPowerUp[id] = powerup;
	}
	else
	{
		read_argv(3, temp, 32);
		new value = str_to_num(temp);

		switch(index)
		{
			case 1: PlayerLevel[id] = value;
			case 2: PlayerSkill1[id] = value;
			case 3: PlayerSkill2[id] = value;
			case 4: PlayerSkill3[id] = value;
			case 5: PlayerPowerUp[id] = value;
		}
	}

	ResetHUD(id);

	return PLUGIN_CONTINUE;
}

public RoundStart()
{
	if(!Nintendo_Active())
		return PLUGIN_HANDLED;

	BetweenRounds = false;

	return PLUGIN_CONTINUE;
}

public RoundEnd()
{
	if(!Nintendo_Active())
		return PLUGIN_HANDLED;

	BetweenRounds = true;

	return PLUGIN_CONTINUE;
}

public ResetHUD(id)
{
	if(!Nintendo_Active() || !Nintendo_HasChar(id, charName) || !Nintendo_IsValidPlayer(id))
		return PLUGIN_HANDLED;

	PlayerReinforcmentsUsed[id] = false;
	PlayerSingleMindedUsed[id] = false;

	KoopaTroopa_Passive(id);

	return PLUGIN_CONTINUE;
}

public KoopaTroopa_Passive(id) // Passive
{
	if(!Nintendo_Active() || !Nintendo_HasChar(id, charName) || !Nintendo_IsValidPlayer(id))
		return PLUGIN_HANDLED;

	Nintendo_SetArmor(id, KOOPATROOPA_ARMORNUM[PlayerLevel[id]]);

	return PLUGIN_CONTINUE;
}

public KoopaTroopa_MindlessWandering(id) // Skill 1
{
	if(!Nintendo_Active() || !Nintendo_HasChar(id, charName) || !Nintendo_IsValidPlayer(id))
		return PLUGIN_HANDLED;

	if(PlayerSkill1[id] > 0)
	{
		new damage = read_data(2);
		new attacker = get_user_attacker(id);

		if(!Nintendo_IsValidPlayer(attacker))
			return PLUGIN_HANDLED;

		if(attacker != id)
		{
			new Float:randomnumber = random_float(0.0, 1.0);
			if(randomnumber <= KOOPATROOPA_MINDLESSPROB[PlayerSkill1[id] - 1])
			{
				new curHealth = pev(id, pev_health);
				new Float:newHealth = float(curHealth + damage);

				Nintendo_SetHealth(id, newHealth, false);

				message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id)
				write_short(1<<0);
				write_short(1<<10);
				write_short(1<<12);
				write_byte(255);
				write_byte(204);
				write_byte(51);
				write_byte(100);
				message_end();
			}
		}
	}

	return PLUGIN_CONTINUE;
}

public KoopaTroopa_DeathMsg() // Skill 2 and 3
{
	new id = read_data(2);

	if(!Nintendo_Active() || !is_user_connected(id) || is_user_alive(id))
		return PLUGIN_HANDLED;

	if(Nintendo_HasChar(id, charName))
	{
		if(!PlayerSingleMindedUsed[id])
			set_task(1.0, "KoopaTroopa_SingleMinded", id);
	}
	else
	{
		new players[32], num, player;
		get_players(players, num);

		for(new i = 0; i <= num; i++)
		{
			player = players[i];
			if(Nintendo_IsValidPlayer(player) && !PlayerReinforcmentsUsed[player])
			{
				new parm[2];
				parm[0] = id;
				parm[1] = player;
				set_task(1.0, "KoopaTroopa_Reinforcments", 0, parm, 2);
			}
		}
	}
	return PLUGIN_CONTINUE;
}

public KoopaTroopa_Reinforcments(parm[]) // Skill 2
{
	new dead = parm[0];
	new player = parm[1];

	if(!Nintendo_Active() || !Nintendo_HasChar(player, charName) || !Nintendo_IsValidPlayer(player))
		return PLUGIN_HANDLED;

	if(PlayerSkill2[player] > 0)
	{
		if(get_user_team(dead) == get_user_team(player) && player != dead)
		{
			if(!BetweenRounds)
			{
				new playername[33], tmp[54];
				get_user_name(player, playername, 32);
				PlayerReinforcmentsUsed[player] = true;
				format(tmp, 54, "[Koopa Troopa] You were respawned by %s", playername)
				Nintendo_StatusHUD(dead, tmp);

				spawn(dead);
				spawn(dead);
				give_item(dead, "weapon_knife");
			}
		}
	}

	return PLUGIN_CONTINUE;
}

public KoopaTroopa_SingleMinded(id) // Skill 3
{
	if(PlayerSkill3[id] > 0)
	{
		if(!BetweenRounds)
		{
			Nintendo_StatusHUD(id, "[Koopa Troopa] You respawned yourself");

			PlayerSingleMindedUsed[id] = true;

			spawn(id);
			spawn(id);
			give_item(id, "weapon_knife");
		}
	}

	return PLUGIN_CONTINUE;
}

public KoopaTroopa_ShellSlide()
{
	new temp[6]
	read_argv(1, temp, 5)
	new id = str_to_num(temp)

	if(!Nintendo_Active() || !Nintendo_HasChar(id, charName) || !Nintendo_IsValidPlayer(id))
		return PLUGIN_HANDLED;

	if(PlayerPowerUp[id] == 1)
	{
		Nintendo_PowerUpUsed(id, 1, 30);

		new Float:idVelocity[3];
		pev(id, pev_velocity, idVelocity);
		if(idVelocity[0] > 0) idVelocity[0] = 2000.0;
		else if(idVelocity[0] < 0) idVelocity[0] = -2000.0;
		else idVelocity[0] = 2000.0;

		if(idVelocity[1] > 0) idVelocity[1] = 2000.0;
		else if(idVelocity[1] < 0) idVelocity[0] = -2000.0;
		else idVelocity[1] = 2000.0;

		idVelocity[2] = 0.0;

		set_pev(id, pev_friction, 1.0);
		set_pev(id, pev_friction, 0.001)

		set_pev(id, pev_velocity, idVelocity);
		new parm[21];
		parm[0] = id;

		shellSlide[id] = true;

		Nintendo_StatusHUD(id, "Shell Slide On");
		set_task(5.0, "KoopaTroopa_ShellSlideReset", 0, parm, 1);
	}

	return PLUGIN_CONTINUE;
}

public KoopaTroopa_ShellSlideTouch(victim, attacker)
{
	if(!Nintendo_Active() || !Nintendo_HasChar(attacker, charName) || !Nintendo_IsValidPlayer(victim) || !Nintendo_IsValidPlayer(attacker))
		return PLUGIN_HANDLED;

	if(shellSlide[attacker])
	{
		if(Nintendo_TeamKill(victim, attacker))
			Nintendo_ExtraDamage(attacker, victim, 200, "Shell Slide", 0);
	}

	return PLUGIN_CONTINUE;
}

public KoopaTroopa_ShellSlideReset(parm[])
{
	new id = parm[0];
	if(!Nintendo_Active() || !Nintendo_HasChar(id, charName) || !Nintendo_IsValidPlayer(id))
		return PLUGIN_HANDLED;

	Nintendo_StatusHUD(id, "Shell Slide Off");
	set_pev(id, pev_friction, 1.0);

	shellSlide[id] = false;

	return PLUGIN_CONTINUE;
}
