// --------------------------------------
// Lua_Battle
// Battle mod support! The rockets!
// --------------------------------------
freeslot("MT_METK_ROCKET", "S_METK_ROCKET", "SPR_MKRK",
"sfx_mkrock", "sfx_mkwarn")

mobjinfo[MT_METK_ROCKET].name = "rockets"
sfxinfo[sfx_mkrock].caption = "Rocket launched"
sfxinfo[sfx_mkwarn].caption = "WARNING"

local addedmetalknuckles = false

local rockettimer = TICRATE
local rocketspawntime = TICRATE/8
local spawnrockets = 4

local cooldown = TICRATE*3		// Rockets are pretty meaty, so they deserve a longer cooldown

local function SpawnMKRocket(mobj, target, rnum, waittime)
	local toh = FixedMul(mobjinfo[MT_METK_ROCKET].height, mobj.scale)
	local rocket = P_SpawnMobj(mobj.x, mobj.y, mobj.z+(mobj.height/2)-(toh), MT_METK_ROCKET)
	
	rocket.blockable = 1
	rocket.block_hthrust = mobjinfo[rocket.type].speed/FRACUNIT
	rocket.block_vthrust = 1
	rocket.block_stun = 0
	
	rocket.scale = mobj.scale
	rocket.flags2 = $1|(mobj.flags2 & MF2_OBJECTFLIP)
	rocket.eflags = $1|(mobj.eflags & MFE_VERTICALFLIP)
	rocket.angle = mobj.player.drawangle
	P_InstaThrust(rocket, mobj.player.drawangle+(ANGLE_90*rnum)+ANGLE_45, FixedMul(mobjinfo[rocket.type].speed, rocket.scale))
	rocket.target = mobj
	
	// Set the target!
//	rocket.tracer = target
	
	// Set the wait time
	rocket.starttimer = waittime
end

local function RocketChase(mobj, movespd, forward)
	local chasetarget
	if(mobj.target and mobj.target.valid and mobj.target.player and mobj.target.player.valid)
		chasetarget = MK_LookForEnemies(mobj, mobj.target.player, 500*mobj.scale)
	end
	
	local dir = 0
	local ang = 0
	
	if(chasetarget)
		// Chase the target!
		dir = R_PointToAngle2(mobj.x, mobj.y, chasetarget.x, chasetarget.y)
		ang = R_PointToAngle2(0, mobj.z+(mobj.height/2), R_PointToDist2(mobj.x, mobj.y, chasetarget.x, chasetarget.y), chasetarget.z+(chasetarget.height/2))
	elseif(forward)
		dir = mobj.angle
		ang = 0
	else
		// Keep going in the direction you're going!
		dir = R_PointToAngle2(0, 0, mobj.momx, mobj.momy)
		ang = R_PointToAngle2(0, 0, R_PointToDist2(0, 0, mobj.momx, mobj.momy), mobj.momz)
	end
	
	P_Thrust(mobj, dir, FixedMul(cos(ang), movespd))
	mobj.momz = $1 + FixedMul(sin(ang), movespd)
end

local function RandomOff(num)
	return (P_RandomByte()%num)-(num/2)
end
local function SpawnSparkles(mobj, spriteheight)
	local zoff = 2*mobj.scale*P_MobjFlip(mobj)
	local sparkle = P_SpawnMobj(mobj.x+(RandomOff(30)*mobj.scale), mobj.y+(RandomOff(30)*mobj.scale), mobj.z+(mobj.height/2)+(RandomOff(spriteheight)*mobj.scale)+zoff, MT_PUMATRAIL)
	sparkle.scale = mobj.scale
	if(mobj.eflags & MFE_VERTICALFLIP)
		sparkle.eflags = $1|MFE_VERTICALFLIP
	end
	sparkle.color = SKINCOLOR_WAVE
	sparkle.colorized = true
end

// Rocket thinker
addHook("MobjThinker", function(mobj)
	// Slow down and wait to fire
	if(mobj.starttimer)
		// Check if attack was interupted
		if mobj.target and mobj.target.valid and mobj.target.player
		and not mobj.target.player.actionstate
			P_KillMobj(mobj)
			mobj.starttimer = 0
			return
		end
		mobj.starttimer = $1 - 1
		mobj.momx = $1 * 80 / 100
		mobj.momy = $1 * 80 / 100
		// Launch!
		if not(mobj.starttimer)
			mobj.momx = 0
			mobj.momy = 0
			mobj.momz = 0
			RocketChase(mobj, FixedMul(mobjinfo[mobj.type].speed, mobj.scale), true)
			
		//	P_InstaThrust(mobj, mobj.angle, FixedMul(mobjinfo[mobj.type].speed, mobj.scale))
			if not(S_SoundPlaying(mobj.target, sfx_zoom))
				S_StartSound(mobj.target, sfx_zoom)
			end
		end
		return
	end
	
	// Died
	if not(mobj.state == S_METK_ROCKET)
		return
	end
	
	// Effect
	if(leveltime & 1)
		local fb = P_SpawnMobj(mobj.x, mobj.y, mobj.z+(mobj.height/2)-(5*mobj.scale*P_MobjFlip(mobj)), MT_FIREBALLTRAIL)
		if(mobj.eflags & MFE_VERTICALFLIP)
			fb.eflags = $1|MFE_VERTICALFLIP
			P_TeleportMove(fb, fb.x, fb.y, fb.z-(mobj.height-fb.height))
		end
		fb.color = SKINCOLOR_WAVE
		fb.colorized = true
	end
	SpawnSparkles(mobj, 30)
	
	// Chase target!
	mobj.momx = $1 * 80/100
	mobj.momy = $1 * 80/100
	mobj.momz = $1 * 80/100
	RocketChase(mobj, 8*mobj.scale, false)
	
	// Set angle and frame
	mobj.angle = R_PointToAngle2(0, 0, mobj.momx, mobj.momy)
	local spd = R_PointToDist2(0, 0, mobj.momx, mobj.momy)
	local verang = AngleFixed(R_PointToAngle2(0, 0, spd, mobj.momz))
	local off = (360*FRACUNIT)/64
	verang = (($1+off) * 16)/(360*FRACUNIT)
	
	// Paranoia
	if(verang < 0)
		verang = $1 + 16
	elseif(verang > 16)
		verang = $1 - 16
	end
	
	// Flip!
	if(verang > 8)
		verang = $1 - 16
	end
	
	// Cap
	if(verang > 4)
		verang = 4
	elseif(verang < -4)
		verang = -4
	end
	
	// Convert to frame
	if(verang < 0)
		verang = abs($1)+4
	end
	
	// Apply
	mobj.frame = verang
end, MT_METK_ROCKET)

// Rocket spawning attack
local function MetalRockets(mo, doaction)
	local player = mo.player
	
	player.actiontext = "Rockets"
	player.actionrings = 15
	
	if not(CBW_Battle.CanDoAction(player))
		player.actionstate = 0
		return
	end
	
	if(player.actionstate)
		player.canguard = false
	end
	
	if not(player.actionstate)
		if(doaction == 1)
			CBW_Battle.PayRings(player)
			player.actionstate = 1
			player.drawangle = mo.angle
			
			// Clear Metal Knuckles stuff
			player.mtkvar.storeddash = false
			player.normalspeed = skins[mo.skin].normalspeed
			player.dashmode = 0
			player.mtkvar.glidecharge = 0
			player.mtkvar.glidetime = 0
			player.mtkvar.climbwall = nil
			player.mtkvar.walldashtime = 0
		end
	end
	
	if(player.actionstate)
		player.lockaim = true	// No turning!
		player.lockmove = true
		
		// Spawning rockets!
		player.actionstate = $1 + 1
		
		if not(player.actionstate%rocketspawntime)
			and(player.actionstate <= rocketspawntime*spawnrockets)
			S_StartSound(mo, sfx_mkrock)
			SpawnMKRocket(mo, nil, player.actionstate/rocketspawntime, (rocketspawntime-player.actionstate)+TICRATE)
		end
		
		if(player.actionstate > rockettimer+4)
			player.actionstate = 0
			P_Thrust(mo, mo.angle, -16*mo.scale)
			if(P_IsObjectOnGround(mo))
				mo.state = S_PLAY_STND
			else
				mo.state = S_PLAY_FALL
			end
			CBW_Battle.ApplyCooldown(player, cooldown)
		else
			mo.momx = 0
			mo.momy = 0
			mo.momz = 0
			player.powers[pw_nocontrol] = max($1, 1)
			mo.state = S_METK_ROCKETCHARGE
		end
	end
end

// Add Metal Knuckles!
addHook("ThinkFrame", function()
	if(CBW_Battle and not addedmetalknuckles)
		local function GarbagePriority5(player)
			if player.mtkvar
			and (player.mtkvar.glidetime or player.mtkvar.slidetime)
				CBW_Battle.SetPriority(player,1,0,"knuckles_glide",2,1,"gliding fists")
			end
		end
	
		CBW_Battle.SkinVars["metalknuckles"] = {
			weight = 115,
			guard_frame = 1,
			special = MetalRockets,
			func_priority_ext = GarbagePriority5,
		}
		
		print("\x85 Metal Knuckles'\x80 battle ability has been added!")
		addedmetalknuckles = true
	end
end)

