local otrx_mul = CV_FindVar("otrx_mul")

local function Burst_Initialize(player)
  player.OpenTricks.Burst = {["last_drift"] = 0, ["drifts_left"] = 0, ["decay_time"] = TICRATE * 10, ["first_burst"] = true, ["mini"] = 0}
end

local function Burst_Thinker(player)
  local mobj = player.mo
  local burst_t = player.OpenTricks.Burst
  burst_t.decay_time = max($ - 1, 0)
  
  OpenTricks_AutoMiniBoost(player, burst_t)
  
  local spark_threshold = K_GetKartDriftSparkValue(player)
  
  local thrust_speed = FixedMul(K_GetKartSpeed(player, true) * 11 / 10, otrx_mul.value) 
  
  if not P_IsObjectOnGround(mobj)
    thrust_speed = $ / 2
  elseif player.kartstuff[k_offroad]
    thrust_speed = $ / 2
  end
  
  if burst_t.drifts_left
    if player.speed >= mobj.scale * 10 -- hide visuals at low speeds.
      OpenTricks_MakeFrontSparks(player, SKINCOLOR_RED)
      if not burst_t.first_burst
        OpenTricks_MakeBurstRing(player, SKINCOLOR_FLAME)
      end
    end
  else
    burst_t.first_burst = true
  end
  
  if (burst_t.last_drift >= spark_threshold) and not player.kartstuff[k_driftcharge] and burst_t.drifts_left
    burst_t.first_burst = false
    burst_t.drifts_left = $ - 1
    S_StartSound(mobj, sfx_cdfm62)
    S_StartSound(mobj, sfx_s3k48)
    P_Thrust(mobj, mobj.angle - (270 * player.kartstuff[k_driftend]), thrust_speed)
  end

  burst_t.last_drift = player.kartstuff[k_driftcharge]
end

local function Burst_Landing(player)
  local mobj = player.mo
  S_StartSound(mobj, sfx_s23c)
  player.OpenTricks.Burst.mini = player.OpenTricks.combo * TICRATE
  local drift_base = player.OpenTricks.Burst.drifts_left
  local decay_base = player.OpenTricks.Burst.decay_time
  local drift_adder = player.OpenTricks.combo
  local decay_adder = TICRATE * (2 + player.OpenTricks.combo) * 3
  
  local bigger_drifts = max(drift_base + (drift_adder/2), (drift_base/2) + drift_adder)
  local bigger_decay = max(decay_base + (decay_adder/2), (decay_base/2) + decay_adder)
  
  player.OpenTricks.Burst.drifts_left = bigger_drifts
  player.OpenTricks.Burst.decay_time = bigger_decay
end

OPENTRICKS_ADD_FOURICONS("burst", "drift to blast off", "TRXTGN7", "TRXTGN8", "TRXTGN8", "TRXTGN18", false, Burst_Initialize, Burst_Thinker, nil, Burst_Landing)

local function Burst_Drawer(othud, player, cam)
  if not player.OpenTricks or not OpenTricks_Table
    return
  elseif OpenTricks_GetRange(player, false) == 0
    return
  elseif not player.OpenTricks.Burst
    return
  elseif player.OpenTricks.key ~= "burst"
    return
  elseif OpenTricks_CanSelect(player)
    return
  end
  
  local mobj = player.mo
  
  local icon_x, icon_y = OR_GetOTricksIconCoords(cam)
  
  local burst_text = player.OpenTricks.Burst.drifts_left
  local burst_x = othud.stringWidth(burst_text, V_20TRANS, "thin")
  othud.drawString(icon_x - (burst_x/2), icon_y - 4, "\x85" .. burst_text, V_HUDTRANS, "thin")
end

hud.add(Burst_Drawer)