-- Sonic Boom
freeslot("S_PLAY_FLEETWAY_LASERSTATE")

states[S_PLAY_FLEETWAY_LASERSTATE] = {
    sprite = SPR_PLAY,
    frame = SPR2_FALL | FF_SEMIBRIGHT | A,
    tics = 5,
    action = A_SuperTurretFire,
    nextstate = S_PLAY_FALL
}

addHook("PlayerThink", function(player)
    if player.cmd.buttons == BT_ATTACK
            and player.mo.skin == "neostreak"
            and (player.mo.state ~= S_PLAY_FLEETWAY_LASERSTATE or player.powers[pw_super])
    then
        player.mo.state = S_PLAY_FLEETWAY_LASERSTATE
        P_SpawnPlayerMissile(player.mo, MT_SONICBOOM, MF2_SUPERFIRE)
    end
end)

freeslot("MT_SONICBOOM", "SPR_PSCT")
freeslot("S_SONBOOM", "S_SONBOOM2")
mobjinfo[MT_SONICBOOM] = {
    -1,
    S_SONBOOM,
    1,
    S_NULL,
    sfx_None,
    0,
    sfx_None,
    S_NULL,
    0,
    sfx_None,
    S_NULL,
    S_NULL,
    S_NULL,
    S_NULL,
    sfx_None,
    10,
    64 * FRACUNIT,
    64 * FRACUNIT,
    0,
    1,
    0,
    sfx_None,
    MF_NOGRAVITY | MF_NOCLIPHEIGHT | MF_NOCLIP | MF_MISSILE,
    S_NULL
}
mobjinfo[MT_SONICBOOM].speed = FRACUNIT * 100
mobjinfo[MT_SONICBOOM].painchance = 192 * FRACUNIT

addHook("MobjThinker", function(mo)
    if mo and mo.valid then
        mo.color = SKINCOLOR_COBALT
        mo.colorized = true
        mo.blendmode = AST_ADD

        if leveltime % 5 == 0 then
            S_StartSound(mo, sfx_s3k42)
        end

        -- Add rotation animation
        mo.rollangle = mo.rollangle + FixedAngle(10 * FRACUNIT)
    end
end, MT_SONICBOOM)

function A_SonBoomWallcheck(mo)
    if mo and mo.valid then
        local c = P_SpawnMobj(mo.x, mo.y, mo.z, MT_SONICBOOM)
        mo.angle = R_PointToAngle2(mo.x, mo.y, mo.x + mo.momx, mo.y + mo.momy)
        c.state = S_INVISIBLE
        c.weapon = mo.weapon
        c.tics = 1
        c.height = mo.height
        c.radius = mo.radius
        c.flags = MF_MISSILE | MF_NOGRAVITY | MF_NOCLIPHEIGHT
        c.target = mo.target

        if mo.weapon == WEP_GRENADE then
            mo.momx = FixedMul(64500, $)
            mo.momy = FixedMul(64500, $)
            mo.momz = FixedMul(64500, $)

            if FixedHypot(mo.momx, mo.momy) < FRACUNIT * 3
                    and mo.momz < FRACUNIT * 2 then
                mo.flags = MF_MISSILE | MF_NOGRAVITY
                A_RingExplode(mo)
                local a = P_SpawnMobj(mo.x, mo.y, mo.z, MT_THOK)
                a.state = S_INVISIBLE
                a.tics = TICRATE
                S_StartSound(a, sfx_pop)
                P_RemoveMobj(mo)
                return
            end
        end
    end
end

states[S_SONBOOM] = {SPR_PSCT, A | FF_FULLBRIGHT, 1, A_SonBoomWallcheck, 0, 0, S_SONBOOM}
states[S_SONBOOM2] = {SPR_PSCT, B | FF_FULLBRIGHT, 1, A_SonBoomWallcheck, 0, 0, S_SONBOOM2}
