freeslot("MT_AIRBUBBLE","MT_CHARGE_DUST","MT_CHARGE_DUST2","S_CHARGE_DUST","S_CHARGE_DUST2","SPR_CHDS")

mobjinfo[MT_AIRBUBBLE] = {
    doomednum = -1,
    spawnstate = S_MEDIUMBUBBLE,
    height = 16*FU,
    radius = 8*FU,
    flags = MF_NOGRAVITY|MF_SCENERY|MF_NOCLIP|MF_NOCLIPHEIGHT
}

mobjinfo[MT_CHARGE_DUST] = {
	spawnstate = S_CHARGE_DUST,
	radius = FRACUNIT/2,
	height = FRACUNIT,
	flags = MF_SCENERY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY
}

mobjinfo[MT_CHARGE_DUST2] = {
	spawnstate = S_CHARGE_DUST2,
	radius = FRACUNIT/2,
	height = FRACUNIT,
	flags = MF_SCENERY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY
}

states[S_CHARGE_DUST] = {
  sprite = SPR_CHDS,
  frame = A|FF_ANIMATE|FF_PAPERSPRITE|FF_HORIZONTALFLIP,
  tics = -1,
  action = nil,
  var1 = 6,
  var2 = 3,
  nextstate = S_NULL
}

states[S_CHARGE_DUST2] = {
  sprite = SPR_CHDS,
  frame = A|FF_ANIMATE|FF_PAPERSPRITE,
  tics = -1,
  action = nil,
  var1 = 6,
  var2 = 3,
  nextstate = S_NULL
}

local function P_SpawnBubblesTrail(p)
    for player in players.iterate do
        if not (p.mo and p.mo.valid) then continue end

        local spread = P_RandomRange(-13, 13) * p.mo.scale

        local bubble = P_SpawnMobj(
            p.mo.x + spread,
            p.mo.y + spread,
            p.mo.z + (p.mo.height/2) + spread,
            MT_AIRBUBBLE
        )

        if bubble and bubble.valid then
            bubble.momx = 0
            bubble.momy = 0
            bubble.momz = 0
			bubble.scale = p.mo.scale
            bubble.fuse = 34
        end
    end
end

addHook("PlayerThink",function(p)
    if p.mo.state == S_ASHURA_BRST
        P_SpawnBubblesTrail(p)
    end
	if p.mo.state == S_ASHURA_SWIM
	and (FixedHypot(p.mo.momx, p.mo.momy) >= FixedMul(22, p.mo.scale, FU) or p.mo.momz >= 10*FU or p.mo.momz <= -10*FU)
	    P_SpawnBubblesTrail(p)
	end
	if p.mo.skin == "ashura"
	and p.pflags & PF_STARTDASH
	and not p.chargedust
	and not p.chargedust2
		p.chargedust = P_SpawnMobjFromMobj(p.mo, -40*cos(p.drawangle + ANG30), -40*sin(p.drawangle + ANG30), 0, MT_CHARGE_DUST)
		p.chargedust2 = P_SpawnMobjFromMobj(p.mo, -40*cos(p.drawangle - ANG30), -40*sin(p.drawangle - ANG30), 0, MT_CHARGE_DUST2)
		p.chargedust.angle = R_PointToAngle2(p.mo.x, p.mo.y, p.chargedust.x, p.chargedust.y) --- ANG15
		p.chargedust2.angle = R_PointToAngle2(p.mo.x, p.mo.y, p.chargedust2.x, p.chargedust2.y) --+ ANG15
		p.chargedust.scale = $ * 2
		p.chargedust2.scale = $ * 2
	end
	if p.chargedust
	and p.chargedust2
	and p.chargedust.valid
	and p.chargedust2.valid
		p.chargedust.angle = R_PointToAngle2(p.mo.x, p.mo.y, p.chargedust.x, p.chargedust.y) --- ANG15
		P_TeleportMove(p.chargedust, p.mo.x + (-40*cos(p.drawangle + ANG30)), p.mo.y + (-40*sin(p.drawangle + ANG30)), p.mo.z)
		p.chargedust2.angle = R_PointToAngle2(p.mo.x, p.mo.y, p.chargedust2.x, p.chargedust2.y) --+ ANG15
		P_TeleportMove(p.chargedust2, p.mo.x + (-40*cos(p.drawangle - ANG30)), p.mo.y + (-40*sin(p.drawangle - ANG30)), p.mo.z)
		p.chargedust.anim_duration = p.mo.tics - (p.mo.tics / 4)
		p.chargedust2.anim_duration = p.mo.tics - (p.mo.tics / 4)
	end
	if not (p.pflags & PF_STARTDASH)
		P_RemoveMobj(p.chargedust)
		P_RemoveMobj(p.chargedust2)
		p.chargedust = nil
		p.chargedust2 = nil
	end
end)