// ------------------------------------------
// Lua_Link
// EEE-PONAAAAAAA
// ------------------------------------------
freeslot("MT_LINKEPONADUMMY", "MT_FALLINGLINK",
"S_EPONA_IDLE",

"S_EPONA_RUN1", "S_EPONA_RUN2", "S_EPONA_RUN3", "S_EPONA_RUN4", "S_EPONA_RUN5",
"S_EPONA_RUN6", "S_EPONA_RUN7", "S_EPONA_RUN8", "S_EPONA_RUN9", "S_EPONA_RUN10", "S_EPONA_RUN11",

"S_EPONA_SQUISH",

"SPR_LNEP",

"S_EPONA_DASH1", "S_EPONA_DASH2", "S_EPONA_DASH3", "S_EPONA_DASH4", "S_EPONA_DASH5",
"S_EPONA_DASH6", "S_EPONA_DASH7", "S_EPONA_DASH8", "S_EPONA_DASH9", "S_EPONA_DASH10", "S_EPONA_DASH11",
"S_EPONA_DASH12", "S_EPONA_DASH13", "S_EPONA_DASH14", "S_EPONA_DASH15", "S_EPONA_DASH16",
"S_EPONA_DASH17", "S_EPONA_DASH18", "S_EPONA_DASH19", "S_EPONA_DASH20", "S_EPONA_DASH21", "S_EPONA_DASH22",

"SPR_LNED",

"S_EPONA_HURT1", "S_EPONA_HURT2", "S_EPONA_HURT3", "S_EPONA_HURT4", "S_EPONA_HURT5", "S_EPONA_HURT6", "S_EPONA_HURT7", "S_EPONA_HURT8",
"S_EPONA_HURT9", "S_EPONA_HURT10", "S_EPONA_HURT11", "S_EPONA_HURT12", "S_EPONA_HURT13", "S_EPONA_HURT14", "S_EPONA_HURT15", "S_EPONA_HURT16",

"SPR_LNEH",

"S_EPONA_WALK1", "S_EPONA_WALK2", "S_EPONA_WALK3", "S_EPONA_WALK4", "S_EPONA_WALK5",
"S_EPONA_WALK6", "S_EPONA_WALK7", "S_EPONA_WALK8", "S_EPONA_WALK9", "S_EPONA_WALK10", "S_EPONA_WALK11",

"SPR_LNEW",

"S_LINKFALL_1", "S_LINKFALL_2", "S_LINKFALL_3", "S_LINKGROUND_1", "S_LINKGROUND_2", "S_LINKGROUND_3",
"SPR_LNKF",

"sfx_epona1", "sfx_epona2", "sfx_epona3", "sfx_epona4", "sfx_epona5", "sfx_epona6", "sfx_epona7" ,"sfx_epona8",
"sfx_linkb1", "sfx_linkb2", "sfx_linkh1", "sfx_linkh2", "sfx_linkfl", "sfx_linkf1", "sfx_linkf2", "sfx_linkf3")

local function LinkStopHorseEngine(mobj)
	local stopsound = sfx_krta00
	while(stopsound <= sfx_krti12)
		while(S_SoundPlaying(mobj, stopsound))
			S_StopSoundByID(mobj, stopsound)
		end
		stopsound = $1 + 1
	end
	
	while(S_SoundPlaying(mobj, sfx_screec))
		S_StopSoundByID(mobj, sfx_screec)
	end
	while(S_SoundPlaying(mobj, sfx_drift))
		S_StopSoundByID(mobj, sfx_drift)
	end
	while(S_SoundPlaying(mobj, sfx_ruburn))
		S_StopSoundByID(mobj, sfx_ruburn)
	end
	while(S_SoundPlaying(mobj, sfx_ddash))
		S_StopSoundByID(mobj, sfx_ddash)
	end
	while(S_SoundPlaying(mobj, sfx_cdfm00))
		S_StopSoundByID(mobj, sfx_cdfm00)
	end
	while(S_SoundPlaying(mobj, sfx_s224))
		S_StopSoundByID(mobj, sfx_s224)
	end
end

addHook("ThinkFrame", function()
	for player in players.iterate
		if(player.linkprevboost == nil)
			or(leveltime == 0)
			player.linkprevboost = player.kartstuff[k_sneakertimer]
			player.linkprevspinout = player.kartstuff[k_spinouttimer]
		//	player.linkprevhealth = player.health	// Should use player.mo.health, but we dont know if the mobj is valid and i'm lazo so
			player.linkprevdead = (player.pflags & PF_TIMEOVER)
		end
		
		if(player.mo and player.mo.valid and player.mo.skin == "linkandepona")
			LinkStopHorseEngine(player.mo)
			
			if not(player.linkdummy and player.linkdummy.valid)
				player.linkdummy = P_SpawnMobj(player.mo.x, player.mo.y, player.mo.z, MT_LINKEPONADUMMY)
			end
			P_TeleportMove(player.linkdummy, player.mo.x, player.mo.y, player.mo.z)
			player.linkdummy.angle = player.frameangle
			player.linkdummy.color = player.mo.color
			player.linkdummy.scale = player.mo.scale
			player.mo.frame = B	// Invisible without changing our flags or state
			player.linkdummy.colorized = player.mo.colorized
			
			if(player.linkprevstate == nil)
				or(leveltime == 0)
				player.linkprevstate = player.linkdummy.state
				player.linkidletimer = 0
				player.linkprevground = P_IsObjectOnGround(player.mo)
				player.linkprevangle = player.mo.angle
			end
			
			player.linkdummy.skin = player.mo.skin
			
			if(player.mo.flags2 & MF2_DONTDRAW)
				player.linkdummy.flags2 = $1|MF2_DONTDRAW
			else
				player.linkdummy.flags2 = $1 & !MF2_DONTDRAW
			end
			
			local speed = FixedDiv(R_PointToDist2(player.cmomx, player.cmomy, player.mo.momx, player.mo.momy), player.mo.scale)
			
			local turning = false
			if not(player.mo.angle == player.linkprevangle)
				turning = true
			end
			
			if(player.mo.state == S_KART_PAIN)
				or(player.mo.state == S_KART_SPIN)
				if not(player.linkdummy.state >= S_EPONA_HURT1 and player.linkdummy.state <= S_EPONA_HURT16)
					player.linkdummy.state = S_EPONA_HURT1
				end
				player.linkprevboostanim = false
			elseif(player.mo.state == S_KART_SQUISH)
				player.linkdummy.state = S_EPONA_SQUISH
				player.linkprevboostanim = false
			elseif(speed or turning)
				and not(player.kartstuff[k_pogospring])
				if not(player.linkdummy.state >= S_EPONA_RUN1 and player.linkdummy.state <= S_EPONA_DASH22)
					and not(player.linkdummy.state >= S_EPONA_WALK1 and player.linkdummy.state <= S_EPONA_WALK11)
					player.linkdummy.state = S_EPONA_RUN1
				end
				
				if(speed < 10*FRACUNIT)
					if(player.linkdummy.state >= S_EPONA_RUN1 and player.linkdummy.state <= S_EPONA_RUN11)
						local oldtics = player.linkdummy.tics
						player.linkdummy.state = $1 + (S_EPONA_WALK1 - S_EPONA_RUN1)
						player.linkdummy.tics = oldtics
					end
				else
					if(player.linkdummy.state >= S_EPONA_WALK1 and player.linkdummy.state <= S_EPONA_WALK11)
						local oldtics = player.linkdummy.tics
						player.linkdummy.state = $1 - (S_EPONA_WALK1 - S_EPONA_RUN1)
						player.linkdummy.tics = oldtics
					end
				end
				
				if(player.kartstuff[k_sneakertimer])
					or(player.kartstuff[k_driftboost] or player.kartstuff[k_startboost])
					if not(player.linkprevboostanim)
						player.linkdummy.state = S_EPONA_DASH1
						S_StartSound(player.mo, sfx_epona3)
						if(P_RandomByte() & 1)
							S_StartSound(player.mo, sfx_linkb1)
						else
							S_StartSound(player.mo, sfx_linkb2)
						end
					end
					player.linkprevboostanim = true
					if(player.linkdummy.tics > 1)
						and(player.linkdummy.state >= S_EPONA_RUN1 and player.linkdummy.state <= S_EPONA_RUN11)
						player.linkdummy.tics = 1
					end
				else
					player.linkprevboostanim = false
				end
			else
				player.linkdummy.state = S_EPONA_IDLE
				player.linkprevboostanim = false
			end
			
			if not(player.linkprevstate == player.linkdummy.state)
				if(player.linkdummy.state == S_EPONA_RUN1 or player.linkdummy.state == S_EPONA_DASH1 or player.linkdummy.state == S_EPONA_DASH12)
					and(P_IsObjectOnGround(player.mo))
					S_StartSound(player.mo, sfx_epona2)
				elseif(player.linkdummy.state == S_EPONA_WALK1)
					and(P_IsObjectOnGround(player.mo))
					S_StartSound(player.mo, sfx_epona1)
				end
			end
			
			if not(speed)
				and(P_IsObjectOnGround(player.mo))
				and(player.linkdummy.state == S_EPONA_IDLE)
				player.linkidletimer = $1 + 1
				if(player.linkidletimer == TICRATE)
					S_StartSound(player.mo, sfx_epona4)
				end
			else
				player.linkidletimer = 0
			end
			
		/*	if(player.kartstuff[k_sneakertimer])
				and not(player.linkprevboost)
				S_StartSound(player.mo, sfx_epona3)
			end*/
			
			if(player.linkprevspinout)
				and not(player.kartstuff[k_spinouttimer])
				S_StartSound(player.mo, sfx_epona4)
			end
			
			if(P_IsObjectOnGround(player.mo))
				and not(player.linkprevground)
				S_StartSound(player.mo, sfx_epona6)
			end
			
			player.linkprevstate = player.linkdummy.state
			player.linkprevground = P_IsObjectOnGround(player.mo)
			
		//	if((player.cmd.buttons & BT_CUSTOM1) and not(player.linkprevcust))
		//		or(player.linkprevhealth and not player.health)
			if(player.pflags & PF_TIMEOVER)
				and not(player.linkprevdead)
				local link = P_SpawnMobj(player.mo.x, player.mo.y, player.mo.z+(player.mo.height*P_MobjFlip(player.mo)), MT_FALLINGLINK)
				link.momx = FixedMul(cos(player.mo.angle), 17*player.mo.scale)
				link.momy = FixedMul(sin(player.mo.angle), 17*player.mo.scale)
				link.momz = 40*player.mo.scale*P_MobjFlip(player.mo)
				link.angle = player.mo.angle
				link.skin = player.mo.skin
				link.color = player.skincolor
				if(P_RandomByte() & 1)
					S_StartSound(player.mo, sfx_linkh1)
				else
					S_StartSound(player.mo, sfx_linkh2)
				end
			end
		//	player.linkprevcust = (player.cmd.buttons & BT_CUSTOM1)
			
			player.linkprevangle = player.mo.angle
			
			player.linkdummy.existtimer = 1
			
		elseif(player.linkdummy and player.linkdummy.valid)
			P_RemoveMobj(player.linkdummy)
			player.linkdummy = nil
			player.linkprevstate = nil
			player.linkidletimer = nil
		end
		
		player.linkprevboost = player.kartstuff[k_sneakertimer]
		player.linkprevspinout = player.kartstuff[k_spinouttimer]
	//	player.linkprevhealth = player.health
		player.linkprevdead = (player.pflags & PF_TIMEOVER)
	end
end)

addHook("MobjThinker", function(mobj)
	if(mobj.skin == "linkandepona")
		LinkStopHorseEngine(mobj)
	end
end, MT_PLAYER)

addHook("MobjDamage", function(mobj)
	if(mobj.skin == "linkandepona")
		S_StartSound(mobj, sfx_epona3)
	end
end, MT_PLAYER)

addHook("MobjThinker", function(mobj)
	if(mobj.existtimer)
		mobj.existtimer = $1 - 1
	elseif not(mobj.existtimer == nil)
		P_RemoveMobj(mobj)
	end
end, MT_LINKEPONADUMMY)

addHook("MobjThinker", function(mobj)
	if(P_IsObjectOnGround(mobj))
		mobj.momx = 0
		mobj.momy = 0
		if not(mobj.state >= S_LINKGROUND_1 and mobj.state <= S_LINKGROUND_3)
			mobj.state = S_LINKGROUND_1
			S_StartSound(mobj, sfx_linkfl)
			local rand = P_RandomByte()%3
			if(rand == 0)
				S_StartSound(mobj, sfx_linkf1)
			elseif(rand == 1)
				S_StartSound(mobj, sfx_linkf2)
			else
				S_StartSound(mobj, sfx_linkf3)
			end
		end
	end
end, MT_FALLINGLINK)

addHook("MobjThinker", function(ghost)
	if(ghost.skin == "linkandepona")
		P_RemoveMobj(ghost)
	end
end, MT_GHOST)
