local max_burst = 13000
local max_spent = 4000
local max_bleed = 13
local idle_bleed = 3
local otrx_mul = CV_FindVar("otrx_mul")

local function Burst_Delta_Initialize(player)
  player.OpenTricks.Burst_Delta = {["last_drift"] = 0, ["storage"] = 0, ["first_burst"] = true, ["mini"] = 0}
end

local function Burst_Delta_Activate(player, spent)
  local mobj = player.mo
  local burst_t = player.OpenTricks.Burst_Delta
  if not burst_t.storage return end
  
  local thrust_speed = FixedMul(K_GetKartSpeed(player, false) * 10 / 10, otrx_mul.value) 
  
  if not P_IsObjectOnGround(mobj)
    thrust_speed = $ / 2
  elseif player.kartstuff[k_offroad]
    thrust_speed = $ / 2
  end
  
  local spent = min(max_spent, burst_t.storage)
  local spent_ratio = (FRACUNIT * spent) / max_spent
  thrust_speed = FixedMul($, spent_ratio)

  burst_t.storage = min($ - spent, max_burst)
  
  S_StartSound(mobj, sfx_cdfm62)
  S_StartSound(mobj, sfx_s3k48)

  P_Thrust(mobj, mobj.angle - (270 * player.kartstuff[k_driftend]), thrust_speed)
end

local function Burst_Delta_Thinker(player)
  local mobj = player.mo
  local burst_t = player.OpenTricks.Burst_Delta
  
  OpenTricks_AutoMiniBoost(player, burst_t)
  
  local dsone = K_GetKartDriftSparkValue(player)
  local dstwo = dsone * 2
  local dsthree = dstwo * 2
  
  if burst_t.storage
    if player.speed >= mobj.scale * 10 -- hide visuals at low speeds.
      if player.kartstuff[k_driftcharge] > 0
        OpenTricks_MakeBurstRing(player, SKINCOLOR_FLAME)
      else
        OpenTricks_MakeBurstRing(player, SKINCOLOR_RED)
      end
    end
  else
    burst_t.first_burst = true
  end
  
  if (player.kartstuff[k_driftcharge] and burst_t.storage)
    local bleed = min(max_bleed, burst_t.storage)
    local drift_pity = ((10 - player.kartspeed) * 2) + 10 - player.kartweight
    if ((player.kartstuff[k_driftcharge] < dsone and player.kartstuff[k_driftcharge]+drift_pity >= dsone)
        or (player.kartstuff[k_driftcharge] < dstwo and player.kartstuff[k_driftcharge]+drift_pity >= dstwo)
        or (player.kartstuff[k_driftcharge] < dsthree and player.kartstuff[k_driftcharge]+drift_pity >= dsthree))
		and drift_pity 
      S_StartSoundAtVolume(player.mo, sfx_s3ka2, 192, player) -- play sounds
    end
    player.kartstuff[k_driftcharge] = $ + drift_pity/2
    burst_t.storage = $ - bleed
  end
  
  if (burst_t.last_drift >= dsone) and not player.kartstuff[k_driftcharge] and burst_t.storage
    Burst_Delta_Activate(player, min(max_spent, burst_t.storage))
  end

  burst_t.last_drift = player.kartstuff[k_driftcharge]
  
  burst_t.storage = max(0, $ - idle_bleed)
end

local function Burst_Delta_Landing(player)
  local mobj = player.mo
  S_StartSound(mobj, sfx_s23c)
  player.OpenTricks.Burst_Delta.storage = $ + (2000 * player.OpenTricks.combo)
  player.OpenTricks.Burst_Delta.mini = $ + TICRATE
  if player.OpenTricks.Burst_Delta.storage > max_burst and not player.kartstuff[k_driftcharge] -- players probably would prefer control over the speed boost
    Burst_Delta_Activate(player, abs(max_burst - player.OpenTricks.Burst_Delta.storage))
  end
end

OPENTRICKS_ADD_FOURICONS("burst delta", "burst but different", "TRXTGN7", "TRXTGN8", "TRXTGN8", "TRXTGN18", false, Burst_Delta_Initialize, Burst_Delta_Thinker, nil, Burst_Delta_Landing)

local function Burst_Delta_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_Delta
    return
  elseif player.OpenTricks.key ~= "burst delta"
    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_Delta.storage * 100)/max_burst
  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_Delta_Drawer)