new const NINTENDOMOD_TOAD_PLUGIN[] = "Nintendo Mod - Toad"
new const NINTENDOMOD_TOAD_VERSION[] = "1.0"
new const NINTENDOMOD_TOAD_AUTHOR[] = "Soloist"

/*
	Passive: Reinforcements
		* Chance of reviving with all equipments from past round.
	Skill 1: Theft
		* Steals money when attacks an enemy.
	Skill 2: Vampirism
		* Gains health when damaging enemy.
	Skill 3: Spores
		* Chance of blinding the enemy for a quick period of time.
	PowerUp: Mushroom Cap
		* Immunity for a period of time.

	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:TOAD_REINFORCEMENTS[11] = {0.05, 0.10, 0.20, 0.30, 0.40, 0.50, 0.60, 0.70, 0.80, 0.90, 1.0};
new const Float:TOAD_VAMPIRISMPROB[3] = {0.333, 0.455, 0.666};
new const Float:TOAD_VAMPIRISMPREC[3] = {0.2, 0.3, 0.4};
new const Float:TOAD_THEFTPROB[3] = {0.333, 0.455, 0.666};
new const TOAD_THEFTMONEY[3] = {100, 200, 300};
new const TOAD_SPORESDMG[3] = {75, 65, 55};

new charName[] = "Toad";
new passiveName[] = "Reinforcements";
new skill1Name[] = "Theft";
new skill2Name[] = "Vampirism";
new skill3Name[] = "Spores";
new powerupName[] = "Mushroom Cap";
new initName[] = "Toad_Init";
new keyDownName[] = "Toad_MushroomCap";

new passiveHelp[] = "Chance of reviving with all equipments from past round.";
new skill1Help[] = "Steals money when attacks an enemy.";
new skill2Help[] = "Gains health when damaging enemy.";
new skill3Help[] = "Chance of blinding the enemy for a quick period of time.";
new powerupHelp[] = "Immunity for a period of time.";

new PlayerLevel[33];
new PlayerSkill1[33];
new PlayerSkill2[33];
new PlayerSkill3[33];
new PlayerPowerUp[33];

new prevWeapons[33][32];
new prevNvg[33];
new prevShield[33];

new bool:diedLastRound[33];
new bool:Blinded[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_TOAD_PLUGIN, NINTENDOMOD_TOAD_VERSION, NINTENDOMOD_TOAD_AUTHOR);

	register_cvar("NintendoMod_Toad_Version", NINTENDOMOD_TOAD_VERSION, FCVAR_SERVER|FCVAR_SPONLY);

	register_event("ResetHUD", "ResetHUD", "b");

	register_event("Damage", "Toad_Damage", "b", "2!0");
	register_event("DeathMsg", "Toad_PassiveDeath", "ae");

	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 Toad_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;
		}
	}

	return PLUGIN_CONTINUE;
}

public ResetHUD(id)
{
	if(!Nintendo_Active() || !Nintendo_HasChar(id, charName) || !Nintendo_IsValidPlayer(id))
		return PLUGIN_HANDLED;

	Blinded[id] = false;

	if(diedLastRound[id])
		set_task(0.1, "Toad_Passive", id);

	return PLUGIN_CONTINUE;
}

public Toad_Damage(id)
{
	if(!Nintendo_Active() || !Nintendo_IsValidPlayer(id))
		return PLUGIN_HANDLED;

	new attacker = get_user_attacker(id);
	new damage = read_data(2);

	if(!Nintendo_IsValidPlayer(attacker))
		return PLUGIN_HANDLED;

	if(Nintendo_HasChar(id, charName))
	{
		Toad_GetWeapons(id);
		Toad_Spores(id, attacker, damage);
	}
	if(Nintendo_HasChar(attacker, charName))
	{
		Toad_Theft(id, attacker, damage);
		Toad_Vampirism(id, attacker, damage);
	}

	return PLUGIN_CONTINUE;
}

public Toad_Passive(id) // Passive
{
	if(!Nintendo_Active() || !Nintendo_HasChar(id, charName) || !Nintendo_IsValidPlayer(id))
		return PLUGIN_HANDLED;

	new Float:randomnumber = random_float(0.0, 1.0);
	if(randomnumber <= TOAD_REINFORCEMENTS[PlayerLevel[id]])
	{
		Toad_GiveWeapons(id);

		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(0);
		write_byte(255);
		write_byte(0);
		write_byte(100);
		message_end();
	}

	diedLastRound[id] = false;

	return PLUGIN_CONTINUE;
}

public Toad_PassiveDeath()
{
	new id = read_data(2);

	if(!Nintendo_Active() || !Nintendo_HasChar(id, charName) || !is_user_connected(id))
		return PLUGIN_HANDLED;

	diedLastRound[id] = true;

	return PLUGIN_CONTINUE;
}

public Toad_GetWeapons(id)
{
	if(!Nintendo_Active() || !Nintendo_HasChar(id, charName) || !Nintendo_IsValidPlayer(id))
		return PLUGIN_HANDLED;

	new numWeapons;
	get_user_weapons(id, prevWeapons[id], numWeapons);

	prevNvg[id] = cs_get_user_nvg(id);
	prevShield[id] = cs_get_user_shield(id);

	return PLUGIN_CONTINUE;
}

public Toad_GiveWeapons(id)
{
	if(!Nintendo_Active() || !Nintendo_HasChar(id, charName) || !Nintendo_IsValidPlayer(id))
		return PLUGIN_HANDLED;

	new bool:userHasC4
	if(user_has_weapon(id, CSW_C4))
		userHasC4 = true;
	else
		userHasC4 = false;

	strip_user_weapons(id);

	if(prevNvg[id])
		cs_set_user_nvg(id, prevNvg[id]);

	if(cs_get_user_team(id) == CS_TEAM_CT)
		set_task(0.1, "give_defuse", id);

	give_item(id, "weapon_knife");
	set_pev(id, pev_armortype, "CS_ARMOR_VESTHELM");
	set_pev(id, pev_armorvalue, 100);

	new weaponName[32], ammoname[32];
	for(new i = 0; i < 32; i++)
	{
		new weapon = prevWeapons[id][i];

		if(weapon)
		{
			switch(weapon)
			{
				case CSW_USP, CSW_MAC10, CSW_UMP45, CSW_MP5NAVY: ammoname="ammo_45acp";
				case CSW_ELITE, CSW_GLOCK18, CSW_TMP: ammoname="ammo_9mm";
				case CSW_FIVESEVEN, CSW_P90: ammoname="ammo_57mm";
				case CSW_DEAGLE: ammoname="ammo_50ae";
				case CSW_P228: ammoname="ammo_357sig";
				case CSW_SCOUT, CSW_G3SG1, CSW_AK47: ammoname="ammo_762nato";
				case CSW_XM1014, CSW_M3: ammoname="ammo_buckshot";
				case CSW_AUG, CSW_SG550, CSW_GALIL, CSW_FAMAS, CSW_M4A1, CSW_SG552: ammoname="ammo_556nato";
				case CSW_M249: ammoname="ammo_556natobox";
				case CSW_AWP: ammoname="ammo_338magnum";
				case CSW_HEGRENADE, CSW_FLASHBANG, CSW_SMOKEGRENADE: ammoname="";
			}

			get_weaponname(weapon, weaponName, 31);
			give_item(id, weaponName);
			give_item(id, ammoname);
			give_item(id, ammoname);
			give_item(id, ammoname);
			give_item(id, ammoname);
			give_item(id, ammoname);
			give_item(id, ammoname);
			give_item(id, ammoname);
		}
	}

	if(prevShield[id])
		give_item(id,"weapon_shield");

	if(userHasC4)
	{
		get_weaponname(CSW_C4, weaponName, 31);
		give_item(id, weaponName);
	}

	return PLUGIN_CONTINUE;
}

public give_defuse(id)
	cs_set_user_defuse(id, 1);

public Toad_Theft(victim, attacker, damage) // Skill 1
{
	if(!Nintendo_Active() || !Nintendo_HasChar(attacker, charName) || !Nintendo_IsValidPlayer(victim) || !Nintendo_IsValidPlayer(attacker))
		return PLUGIN_HANDLED;

	if(PlayerSkill1[attacker] > 0)
	{
		if(victim != attacker)
		{
			new Float:randomnumber = random_float(0.0, 1.0);
			if(randomnumber <= TOAD_THEFTPROB[PlayerSkill2[attacker] - 1])
			{
				new curVicMoney, newVicMoney, curAttMoney, newAttMoney

				curVicMoney = cs_get_user_money(victim);
				curAttMoney = cs_get_user_money(attacker);

				newVicMoney = curVicMoney - TOAD_THEFTMONEY[PlayerSkill1[attacker] - 1];
				newAttMoney = curAttMoney + TOAD_THEFTMONEY[PlayerSkill1[attacker] - 1];

				if(newVicMoney < 0) newVicMoney = 0;
				if(newAttMoney > 16000) newAttMoney = 16000;

				cs_set_user_money(victim, newVicMoney);
				cs_set_user_money(attacker, newAttMoney);
			}
		}
	}

	return PLUGIN_CONTINUE;
}

public Toad_Vampirism(id, attacker, damage) // Skill 2
{
	if(!Nintendo_Active() || !Nintendo_HasChar(attacker, charName) || !Nintendo_IsValidPlayer(id) || !Nintendo_IsValidPlayer(attacker))
		return PLUGIN_HANDLED;

	if(PlayerSkill2[attacker] > 0)
	{
		new Float:randomnumber = random_float(0.0, 1.0);
		if(randomnumber <= TOAD_VAMPIRISMPROB[PlayerSkill2[attacker] - 1])
		{
			new curHealth = pev(attacker, pev_health);
			new Float:newHealth = float(curHealth + floatround(TOAD_VAMPIRISMPREC[PlayerSkill2[attacker] - 1] * damage));

			if(newHealth > 100.0) newHealth = 100.0;

			Nintendo_SetHealth(attacker, newHealth, false);
		}
	}

	return PLUGIN_CONTINUE;
}

public Toad_Spores(id, attacker, damage) // Skill 3
{
	if(!Nintendo_Active() || !Nintendo_HasChar(id, charName) || !Nintendo_IsValidPlayer(id) || !Nintendo_IsValidPlayer(attacker))
		return PLUGIN_HANDLED;

	if(PlayerSkill3[id] > 0)
	{
		if(!Blinded[attacker] && id != attacker)
		{
			if(damage >= TOAD_SPORESDMG[PlayerSkill3[id] - 1])
			{
				message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, attacker);
				write_short(~0);
				write_short(~0);
				write_short(1<<12);
				write_byte(0);
				write_byte(0);
				write_byte(0);
				write_byte(255);
				message_end();

				Blinded[attacker] = true;
			}
		}
	}

	return PLUGIN_CONTINUE;
}

public Toad_MushroomCap()
{
	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);

		set_pev(id, pev_takedamage, 0.0);
		set_user_rendering(id, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 25);

		set_task(5.0, "Toad_RemoveGod", id);
	}

	return PLUGIN_CONTINUE;
}

public Toad_RemoveGod(id)
{
	if(!Nintendo_Active())
		return PLUGIN_HANDLED;

	set_pev(id, pev_takedamage, 2.0);
	set_user_rendering(id);

	return PLUGIN_CONTINUE;
}
