// --------------------------------------
// Lua_Sword
// Sword ability!
// --------------------------------------
rawset(_G, "K_Sword", function(checkflags, destroy, late, player)
	if(checkflags)
		if(player.kvars.ablstate)
			return AF_NOFLOAT|AF_NODUCK|AF_NOJUMP|AF_NOSWIM|AF_NODROP
		end
		return 0
	end
	if(destroy)
		return
	end
	if(late)
		return
	end
	
	if(player.cmd.buttons & BT_USE)
		and not(player.kvars.prevcmd & BT_USE)
		and not(player.kvars.ducking)
		and not(player.kvars.floating)
		and not(player.pflags & PF_SLIDING)
		and not(player.powers[pw_carry] or player.kvars.prevcarry)
		and not(player.exiting)
		and not(player.pflags & PF_STASIS)
		and not(player.powers[pw_nocontrol])
		and not(player.kvars.industdevil)
		and not(player.kvars.ablstate)
		if(P_IsObjectOnGround(player.mo))
			player.mo.state = S_KIRBY_SWORD1
			player.kvars.ablstate = 1
			player.kvars.ablvar1 = 0
		else
			player.mo.state = S_KIRBY_SWORDSPIN
			S_StartSound(player.mo, sfx_swords)
			player.kvars.ablstate = 2
			player.kvars.ablvar1 = 0
		end
	end
	
	if(player.pflags & PF_SLIDING)
		or(player.powers[pw_carry])
		or(player.kvars.industdevil)
		player.kvars.ablstate = 0
	end
	
	if(player.mo.state == S_KIRBY_SWORD3)
		S_StartSound(player.mo, sfx_sword)
	end
	
	if(player.kvars.ablstate == 1)
		if not(player.mo.state >= S_KIRBY_SWORD1 and player.mo.state <= S_KIRBY_SWORD7)
			player.mo.state = S_KIRBY_SWORD1+player.kvars.ablvar1
		end
		player.kvars.ablvar1 = $1 + 1
		if(player.kvars.ablvar1 > 7)
			player.kvars.ablstate = 0
		end
		P_SPMAngle(player.mo, MT_KIRBYSWORD, player.drawangle, 0)
	elseif(player.kvars.ablstate == 2)
		if(P_IsObjectOnGround(player.mo))
			or(player.kvars.ablvar1 >= 16)
			player.kvars.ablstate = 0
			if not(P_IsObjectOnGround(player.mo))
				player.mo.state = S_PLAY_FALL
			end
		else
			player.mo.state = S_KIRBY_SWORDSPIN
			player.mo.frame = 7+(player.kvars.ablvar1%8)
			player.kvars.ablvar1 = $1 + 1
		end
	elseif(P_IsObjectOnGround(player.mo))
		and(player.mo.state == S_KIRBY_SWORD7)
		and(player.cmd.forwardmove or player.cmd.sidemove)
		player.mo.state = S_PLAY_WALK
	end
end)

// Stab enemies
addHook("TouchSpecial", function(enemy, mobj)
	if(enemy == nil)
		or(mobj == nil)
		or not((enemy.flags & MF_ENEMY) or (enemy.flags & MF_BOSS))
		or not(mobj.player and mobj.player.valid)
		or not(mobj.state == S_KIRBY_SWORDSPIN)
		return
	end
	
	P_DamageMobj(enemy, mobj, mobj)
	if not(mobj.player.powers[pw_flashing])
		mobj.player.powers[pw_flashing] = 1
	end
end)

// Stab monitors
addHook("MobjMoveCollide", function(mobj, enemy)
	if(enemy == nil)
		or(mobj == nil)
		or not(mobj.player and mobj.player.valid)
		or not(mobj.state == S_KIRBY_SWORDSPIN)
		return
	end
	
	// Stab players!
	if(enemy.type == MT_PLAYER)
		and(mobj.z <= enemy.z+enemy.height)
		and(mobj.z+mobj.height >= enemy.z)
		P_DamageMobj(enemy, mobj, mobj)
		if not(mobj.player.powers[pw_flashing])
			mobj.player.powers[pw_flashing] = 1
		end
		return
	end
	
	// Stab monitors
	if(enemy.flags & MF_MONITOR)
		and(mobj.z-(10*enemy.scale) <= enemy.z+enemy.height)
		and(mobj.z+mobj.height >= enemy.z-(10*enemy.scale))
		P_DamageMobj(enemy, mobj, mobj)
		if not(mobj.player.powers[pw_flashing])
			mobj.player.powers[pw_flashing] = 1
		end
	end
end, MT_PLAYER)
