freeslot(
"MT_MAGICSHAPES",
"MT_MAGICSHAPES2",
"MT_MAGICSHAPES3",
"MT_MAGICSHAPES4",
"MT_MAGICSHAPESR",
"MT_MAGICSHAPESB",
"MT_KAMEKBALL",
"MT_KAMEKSPELL",
"MT_KMAGICDUST",
"S_KMGS",
"S_KMGT",
"S_MGSH",
"S_KTIR",
"S_KDED",
"S_KMRB",
"S_KMSW",
"S_KMTP1",
"S_KMTP2",
"S_KMTP3",
"S_KMTP4",
"S_KMTP5",
"S_KMTP6",
"S_KMTP7",
"S_KMTP8",
"S_KMSF",
"S_MPMP",
"S_KPTP",
"S_KBOL",
"S_KDST",
"SPR_KTIR",
"SPR_KMGS",
"SPR_MGSH",
"SPR_KDED",
"SPR_KMSW",
"SPR_KMTP",
"SPR_KMSF",
"SPR_MPMP",
"SPR_KPTP",
"SPR_KDST",
"sfx_kmd2",
"sfx_kmks",
"sfx_kjij",
"sfx_khya",
"sfx_klol",
"sfx_kspl",
"sfx_rocks0"
)

mobjinfo[MT_MAGICSHAPES] = {
	spawnstate = S_KMGS,
	spawnhealth = 1000,
	seesound = sfx_kspl,
	deathstate = S_KDST,
	speed = 20<<FRACBITS,
	radius = 12*FRACUNIT,
	height = 12*FRACUNIT,
	mass = 0,
	damage = 1*TICRATE,
	flags = MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY
}

mobjinfo[MT_MAGICSHAPES2] = {
	spawnstate = S_MGSH,
	spawnhealth = 1000,
	seesound = sfx_nxitem,
	deathstate = S_KDST,
	speed = 36<<FRACBITS,
	radius = 16*FRACUNIT,
	height = 21*FRACUNIT,
	mass = 0,
	damage = 1*TICRATE,
	flags = MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY
}

mobjinfo[MT_MAGICSHAPES3] = {
	spawnstate = S_KMGT,
	spawnhealth = 1000,
	seesound = sfx_nxitem,
	deathstate = S_NULL,
	speed = 0<<FRACBITS,
	radius = 16*FRACUNIT,
	height = 21*FRACUNIT,
	mass = 0,
	damage = 1*TICRATE,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY
}

mobjinfo[MT_MAGICSHAPES4] = {
	spawnstate = S_MGSH,
	spawnhealth = 1000,
	seesound = sfx_nxitem,
	deathstate = S_KDST,
	speed = 36<<FRACBITS,
	radius = 16*FRACUNIT,
	height = 21*FRACUNIT,
	mass = 0,
	damage = 1*TICRATE,
	flags = MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY
}

mobjinfo[MT_MAGICSHAPESR] = {
	spawnstate = S_MGSH,
	spawnhealth = 1000,
	seesound = sfx_nxitem,
	deathstate = S_KDST,
	speed = 36<<FRACBITS,
	radius = 16*FRACUNIT,
	height = 21*FRACUNIT,
	mass = 0,
	damage = 1*TICRATE,
	flags = MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY
}

mobjinfo[MT_MAGICSHAPESB] = {
	spawnstate = S_MGSH,
	spawnhealth = 1000,
	seesound = sfx_nxitem,
	deathstate = S_KDST,
	speed = 36<<FRACBITS,
	radius = 16*FRACUNIT,
	height = 21*FRACUNIT,
	mass = 0,
	damage = 1*TICRATE,
	flags = MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY
}

mobjinfo[MT_KAMEKBALL] = {
	spawnstate = S_KBOL,
	spawnhealth = 1000,
	seesound = sfx_kmks,
	deathstate = S_NULL,
	speed = 36<<FRACBITS,
	radius = 25*FRACUNIT,
	height = 25*FRACUNIT,
	mass = 0,
	damage = 1*TICRATE,
	flags = MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY,
}

mobjinfo[MT_KAMEKSPELL] = {
	spawnstate = S_MPMP,
	spawnhealth = 1000,
	seesound = sfx_kmks,
	deathstate = S_KDST,
	speed = 50<<FRACBITS,
	radius = 25*FRACUNIT,
	height = 25*FRACUNIT,
	mass = 0,
	damage = 1*TICRATE,
	flags = MF_SPECIAL|MF_PAPERCOLLISION|MF_NOGRAVITY,
}

mobjinfo[MT_KMAGICDUST] = {
	spawnstate = S_KDST,
	spawnhealth = 1000,
	deathstate = S_NULL,
	speed = 0<<FRACBITS,
	radius = 16*FRACUNIT,
	height = 21*FRACUNIT,
	mass = 0,
	damage = 1*TICRATE,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY,
}

states[S_KMGS] = {
	sprite = SPR_KMGS,
	frame = FF_ANIMATE|A,
	tics = 96,
	var1 = 23,
	var2 = 2,
	nextstate = S_DEATHSTATE
}

states[S_KMGT] = {
	sprite = SPR_KMGS,
	frame = FF_ANIMATE|A,
	tics = 30,
	var1 = 23,
	var2 = 2,
	nextstate = S_DEATHSTATE
}

states[S_MGSH] = {
	sprite = SPR_MGSH,
	frame = FF_ANIMATE|A,
	tics = 96,
	var1 = 23,
	var2 = 1,
	nextstate = S_DEATHSTATE
}

states[S_KTIR] = {
	sprite = SPR_KTIR,
	frame = A,
	tics = 90,
	nextstate = S_KTIR
}

states[S_KDED] = {
	sprite = SPR_KDED,
	frame = A,
	tics = 16,
	nextstate = S_INVISIBLE
}

states[S_KMRB] = {
	sprite = SPR_NULL,
	frame = A,
	tics = 60,
	nextstate = S_KMRB
}

states[S_KMSW] = {
	sprite = SPR_KMSW,
	frame = A,
	tics = 10,
	nextstate = S_PLAY_STND
}

states[S_KMTP1] = {
	sprite = SPR_KMTP,
	frame = C,
	tics = 2,
	nextstate = S_KMTP2
}

states[S_KMTP2] = {
	sprite = SPR_KMTP,
	frame = FF_ADD|FF_TRANS20|D,
	tics = 2,
	nextstate = S_KMTP3
}

states[S_KMTP3] = {
	sprite = SPR_KMTP,
	frame = FF_ADD|FF_TRANS40|C,
	tics = 2,
	nextstate = S_KMTP4
}

states[S_KMTP4] = {
	sprite = SPR_KMTP,
	frame = FF_ADD|FF_TRANS60|B,
	tics = 1,
	nextstate = S_KMTP5
}

states[S_KMTP5] = {
	sprite = SPR_KMTP,
	frame = FF_ADD|FF_TRANS80|A,
	tics = 2,
	nextstate = S_KMTP6
}

states[S_KMTP6] = {
	sprite = SPR_NULL,
	frame = A,
	tics = 25,
	nextstate = S_KMTP7
}

states[S_KMTP7] = {
	sprite = SPR_NULL,
	frame = A,
	tics = 1,
	nextstate = S_PLAY_WALK
}

states[S_KMSF] = {
	sprite = SPR_KMSF,
	frame = FF_ANIMATE|A,
	tics = 23,
	var1 = 7,
	var2 = 3,
	nextstate = S_PLAY_WALK
}

states[S_MPMP] = {
	sprite = SPR_MPMP,
	frame = FF_PAPERSPRITE|A,
	tics = -1,
	nextstate = S_NULL
}

states[S_KPTP] = {
	sprite = SPR_KPTP,
	frame = A,
	tics = 90,
	nextstate = S_KPTP
}

states[S_KBOL] = {
	sprite = SPR_KDST,
	frame = FF_ANIMATE|A,
	tics = 2,
	var1 = 1,
	var2 = 1,
	nextstate = S_DEATHSTATE
}

states[S_KDST] = {
	sprite = SPR_KDST,
	frame = FF_ADD|FF_ANIMATE|A,
	tics = 23,
	var1 = 5,
	var2 = 4,
	nextstate = S_NULL
}
//Used Simon_T Bomb Throw Ability lua as reference
//TY Simon!

addHook("ThinkFrame", do
	for player in players.iterate
		if player.mo and player.mo.skin == "kamek"
			if not player.exiting
				if player.mo.state != S_KPTP 
				and player.playerstate != PST_DEAD
//Magic Shapes
					if (player.cmd.buttons & BT_ATTACK)
					and not (player.tossdelay)
					and (player.mo.state != S_PLAY_PAIN)
					and (player.mo.state != S_PLAY_FLY_TIRED)
					and (player.powers[pw_carry] != CR_ROLLOUT)
					and (player.panim != PA_ETC)
					and not((player.cmd.buttons & BT_SPIN) and not (player.panim == PA_ABILITY))
						if not (gametyperules & GTR_TEAMS)
							P_SpawnPlayerMissile (player.mo, MT_MAGICSHAPES2) 
							P_SpawnPlayerMissile (player.mo, MT_SPARK)
							if (player.panim == PA_ABILITY)
								player.mo.state = S_PLAY_GLIDE
							else
								player.mo.state = S_KMSW
							end
							if (player.superkamek == true)
								player.tossdelay = TICRATE/9*7
							else
								player.tossdelay = TICRATE*1
							end
						end
						if player.ctfteam == 1
						and (player.powers[pw_carry] != CR_ROLLOUT)
							P_SpawnPlayerMissile (player.mo, MT_MAGICSHAPESR) 
							P_SpawnPlayerMissile (player.mo, MT_SPARK)
							if (player.panim == PA_ABILITY)
								player.mo.state = S_PLAY_GLIDE
							else
								player.mo.state = S_KMSW
							end
							if (player.superkamek == true)
								player.tossdelay = TICRATE/9*7
							else
								player.tossdelay = TICRATE*1
							end
						end
						if player.ctfteam == 2
						and (player.powers[pw_carry] != CR_ROLLOUT)
							P_SpawnPlayerMissile (player.mo, MT_MAGICSHAPESB) 
							P_SpawnPlayerMissile (player.mo, MT_SPARK)
							if (player.panim == PA_ABILITY)
								player.mo.state = S_PLAY_GLIDE
							else
								player.mo.state = S_KMSW
							end
							if (player.superkamek == true)
								player.tossdelay = TICRATE/9*7
							else
								player.tossdelay = TICRATE*1
							end
						end
					end
					if (player.cmd.buttons & BT_ATTACK) 
					and not (player.tossdelay)
					and player.powers[pw_carry] == CR_ROLLOUT
					and not (player.cmd.buttons & BT_SPIN)
						player.tossdelay = TICRATE*1
						player.mo.state = S_PLAY_FIRE
						P_SpawnPlayerMissile (player.mo, MT_MAGICSHAPES4)
						P_SpawnPlayerMissile (player.mo, MT_SPARK)
					end
//Fireball
					if (player.cmd.buttons & BT_FIRENORMAL)
					and not (player.tossdelay)
					and (player.mo.state != S_PLAY_PAIN)
					and (player.mo.state != S_PLAY_FLY_TIRED)
					and (player.powers[pw_carry] != CR_ROLLOUT)
					and (player.panim != PA_ETC)
					and not((player.cmd.buttons & BT_SPIN) and not (player.panim == PA_ABILITY))
						S_StartSound(player.mo, sfx_nxitem)
						S_StartSound(player.mo, sfx_alart)
						P_SpawnPlayerMissile (player.mo, MT_KAMEK_FIREBALL)
						if (player.panim == PA_ABILITY)
							player.mo.state = S_PLAY_GLIDE
						else
							player.mo.state = S_KMSW
						end
						if (player.superkamek == true)
							player.tossdelay = TICRATE/8*5
						else
							player.tossdelay = TICRATE*1
						end
					end
//Rollball
					if (player.cmd.buttons & BT_CUSTOM3)
					and player.mo.scale != FRACUNIT*2
					and P_IsObjectOnGround(player.mo)
					and not (player.cmd.buttons & BT_SPIN)
					and not (player.pflags & PF_WPNDOWN)
					and not (player.tossdelay)
						S_StartSound(player.mo, sfx_kmks)
						P_SPMAngle(player.mo, MT_KAMEKBALL, player.mo.angle, 0)
						player.mo.state = S_PLAY_FIRE
						player.tossdelay = TICRATE*2
					end
					if (player.mo.state == S_KMSW)
					or (player.mo.state == S_PLAY_FIRE)
					or (player.mo.state == S_PLAY_FIRE_FINISH)
					or (player.charflags & SF_FASTEDGE)
						player.drawangle = player.mo.angle
					end
				end
			end
		end
	end
end)

addHook("MobjRemoved", function(mobj)
	if mobj and mobj.valid
		P_SpawnMobj(mobj.x, mobj.y, mobj.z, MT_KMAGICDUST)
		P_SpawnMobj(mobj.x, mobj.y, mobj.z, MT_ROLLOUTROCK)
	end
end, MT_KAMEKBALL)