local HIGH_SPEED_THRESHOLD = 30 * FRACUNIT
local STAR_TRAIL_DURATION = 3 * TICRATE 

mobjinfo[MT_STAR_TRAIL] = {
    sprite = SPR_STAR,
    spawnstate = S_STAR_TRAIL,
    deathstate = S_NULL,
    flags = MF_NOGRAVITY | MF_NOCLIP | MF_SCENERY,
    scale = FRACUNIT / 2,
}


states[S_STAR_TRAIL] = {
    SPR_STAR, 0, 3, A_SpawnSmoke, 0, 0, S_NULL
}

function A_SpawnSmoke(mobj)
    local smoke = P_SpawnMobj(mobj.x, mobj.y, mobj.z, MT_SMOKE)
    smoke.momx = P_RandomRange(-1, 1) * FRACUNIT
    smoke.momy = P_RandomRange(-1, 1) * FRACUNIT
    smoke.momz = P_RandomRange(0, 1) * FRACUNIT
end

addHook("ThinkFrame", function()
    for player in players.iterate do
        if player.mo and player.mo.valid and player.mo.skin == "saosonic" then
            
            if player.mo.momx^2 + player.mo.momy^2 >= HIGH_SPEED_THRESHOLD^2 then
               
                local star = P_SpawnMobjFromMobj(player.mo, 0, 0, 0, MT_STAR_TRAIL)
                star.target = player.mo
                star.lifetime = STAR_TRAIL_DURATION
            end
           
            if player.attackdown then
               
                local star = P_SpawnMobjFromMobj(player.mo, 0, 0, 0, MT_STAR_TRAIL)
                star.target = player.mo
                star.lifetime = STAR_TRAIL_DURATION
            end
        end
    end
end)
