local function OpenTricks_MakeFrontSparks(player, color)
  local mobj = player.mo
  local travelangle = mobj.angle - ((ANGLE_45/5) * player.kartstuff[k_drift])
  
  local sparks = {}
  for i = 0, 1

    local newx = mobj.x + P_ReturnThrustX(mobj, ANGLE_180 + travelangle + ((i*2)-1)*ANGLE_135, FixedMul(32*FRACUNIT, mobj.scale))
    local newy = mobj.y + P_ReturnThrustY(mobj, ANGLE_180 + travelangle + ((i*2)-1)*ANGLE_135, FixedMul(32*FRACUNIT, mobj.scale))
    local spark = P_SpawnMobj(newx, newy, mobj.z, MT_OTRICKSPARK)

    spark.target = mobj
    spark.angle = travelangle-(ANGLE_45/5)*player.kartstuff[k_drift] + player.frameangle
    spark.destscale = mobj.scale/2
    spark.scale = mobj.scale/2
    spark.color = color

    spark.momx = mobj.momx/2
    spark.momy = mobj.momy/2

    sparks[i] = spark
  end
  return sparks
end

local function OpenTricks_MakeBurstRing(player, color)
  local mobj = player.mo
  local ring = P_SpawnMobj(mobj.x, mobj.y, mobj.z, MT_OTRICKFIRE)
  
  ring.state = S_OTRICKFIRE_A + (leveltime * 2) % 6
  ring.fuse = 7
  --ring.frame = ($ & !FF_TRANS80) | FF_TRANS40 -- reduce the transparency flag until the next state update -- this doesn't seem to work
  
  ring.target = mobj
  ring.angle = mobj.angle
  ring.destscale = mobj.scale*3/4
  ring.scale = mobj.scale*3/4
  ring.color = color
  
  ring.momx = mobj.momx/2
  ring.momy = mobj.momy/2
  
  return ring
end

local function OpenTricks_MakeWheels(player, color)
  local mobj = player.mo
  local travelangle = player.frameangle - ((ANGLE_45) * player.kartstuff[k_drift])
  
  local wheels = {}
  for i = 0, 1
    local newx = mobj.x + P_ReturnThrustX(mobj, ANGLE_180 + travelangle + ((i*2)-1)*ANGLE_135, FixedMul(32*FRACUNIT, mobj.scale))
    local newy = mobj.y + P_ReturnThrustY(mobj, ANGLE_180 + travelangle + ((i*2)-1)*ANGLE_135, FixedMul(32*FRACUNIT, mobj.scale))
    local wheel = P_SpawnMobj(newx, newy, mobj.z, MT_OTRICKWHEEL)

    wheel.state = S_OTRICKWHEEL_A + leveltime%5
    wheel.fuse = 35

    wheel.target = mobj
    wheel.angle = travelangle
    wheel.destscale = mobj.scale/4
    wheel.scale = mobj.scale/4
    wheel.color = color
    
    wheels[i] = wheel
  end
  return wheels
end

local function OpenTricks_MakeSmoke(player, color)
  local mobj = player.mo
  local travelangle = mobj.angle - ((ANGLE_45/5) * player.kartstuff[k_drift])
  
  local smokes = {}
  for i = 0, 1
    local newx = mobj.x + P_ReturnThrustX(mobj, travelangle + ((i*2)-1)*(ANGLE_180-ANG15), FixedMul(32*FRACUNIT, mobj.scale))
    local newy = mobj.y + P_ReturnThrustY(mobj, travelangle + ((i*2)-1)*(ANGLE_180-ANG15), FixedMul(32*FRACUNIT, mobj.scale))
    local newz = mobj.z + (mobj.height / 4)
    if (mobj.flags2 & MF2_OBJECTFLIP)
      newz = mobj.z - (mobj.height / 4)
    end
    local smoke = P_SpawnMobj(newx, newy, newz, MT_OTRICKSMOKE)
  
    smoke.target = mobj
    smoke.destscale = mobj.scale
    smoke.scale = mobj.scale
    smoke.color = color

    smokes[i] = smoke
  end
  return smokes
end

local function K_SpawnDashDustRelease(player) -- I can't believe it's not accessible to Lua!
  if (not P_IsObjectOnGround(player.mo))
    return
  end

  if (not player.speed and not player.kartstuff[k_startboost])
    return
  end

  local travelangle = player.mo.angle

  if (player.kartstuff[k_drift] or player.kartstuff[k_driftend])
    travelangle = $ - (ANGLE_45/5)*player.kartstuff[k_drift]
  end

  for i = 0, 1
  
    local newx = player.mo.x + P_ReturnThrustX(player.mo, travelangle + ((i&1) and -1 or 1)*ANGLE_90, FixedMul(48*FRACUNIT, player.mo.scale))
    local newy = player.mo.y + P_ReturnThrustY(player.mo, travelangle + ((i&1) and -1 or 1)*ANGLE_90, FixedMul(48*FRACUNIT, player.mo.scale))
    local dust = P_SpawnMobj(newx, newy, player.mo.z, MT_FASTDUST)

    dust.target = player.mo
    dust.angle = travelangle - ((i&1) and -1 or 1)*ANGLE_45
    dust.destscale = player.mo.scale
    dust.scale = player.mo.scale

    dust.momx = 3*player.mo.momx/5
    dust.momy = 3*player.mo.momy/5

    K_MatchGenericExtraFlags(dust, player.mo)
  end
end

rawset(_G, "OpenTricks_MakeFrontSparks", OpenTricks_MakeFrontSparks)
rawset(_G, "OpenTricks_MakeBurstRing", OpenTricks_MakeBurstRing)
rawset(_G, "OpenTricks_MakeWheels", OpenTricks_MakeWheels)
rawset(_G, "OpenTricks_MakeSmoke", OpenTricks_MakeSmoke)
rawset(_G, "K_SpawnDashDustRelease", K_SpawnDashDustRelease)