local max_augment = 1023
local augment_to_speed_factor = 4
local storage_decay = 1
local max_decay_safety = TICRATE * 30
local bump_safety_time = TICRATE * 3

local function Augment_Initialize(player)
  player.OpenTricks.Augment = {["storage"] = 0, ["decay_time"] = max_decay_time, ["bump_safety"] = bump_safety_time}
end

local function Augment_Thinker(player)
  local aug_t = player.OpenTricks.Augment
  local mobj = player.mo
  if aug_t.storage
    local bonked = ((mobj.eflags & MFE_JUSTBOUNCEDWALL) and not player.trickactive and not OpenTricks_TryingTrick(player))
	local damaged = (mobj.health <= 0 or player.kartstuff[k_spinouttimer])
	local powered = (player.kartstuff[k_invincibilitytimer]) or (player.kartstuff[k_growshrinktimer] > 0) or (tsrb2k and mobj.tsr_ultimateon) or (HugeQuest and player.huge)
	local out_of_control = ((mobj.player.powers[pw_nocontrol] and mobj.player.pflags & PF_SKIDDOWN) or mobj.player.pflags & PF_SLIDING)
    if bonked and not bump_safety and not out_of_control and not damaged and not powered
	  aug_t.decay_time = min($, 0)
	  aug_t.bump_safety = bump_safety_time
	elseif damaged
	  aug_t.decay_time = min($, 0)
	end
	
	if aug_t.decay_time == 0
	  S_StartSound(nil, sfx_kc59, player)
	  aug_t.decay_time = -1
	elseif aug_t.decay_time < 0
	  aug_t.storage = $ - storage_decay
	else
	  aug_t.decay_time = $ - 1
	end
	aug_t.bump_safety = $ - 1
	
	if not mobj.player.kartstuff[k_respawn]
      OpenTricks_MakeWheels(player, SKINCOLOR_PISTACHIO)
	end
	local boost_floor = (100 * FRACUNIT)
	local boost_percent = boost_floor + FixedSqrt(player.OpenTricks.Augment.storage * FRACUNIT / augment_to_speed_factor)
	local boost_diff = boost_percent - boost_floor
	player.kartstuff[k_boostpower] = $ + (boost_diff / 100)
  end
end

local function Augment_Success(player)
  local aug_t = player.OpenTricks.Augment
  aug_t.decay_time = max_decay_safety
  aug_t.bump_safety = bump_safety_time
end

local function Augment_Landing(player)
  local mobj = player.mo
  S_StartSound(mobj, sfx_s23c)
  player.OpenTricks.Augment.storage = min($ + (64 * player.OpenTricks.combo), max_augment)
  player.OpenTricks.Augment.decay_time = max_decay_safety
  player.kartstuff[k_startboost] = $ + TICRATE
  player.OpenTricks.Augment.bump_safety = bump_safety_time
end

OPENTRICKS_ADD("augment", "boost your engine", "TRXTGN11", "TRXTGN12", false, Augment_Initialize, Augment_Thinker, Augment_Success, Augment_Landing)

local function Augment_Drawer(othud, player, cam)
  if not player.OpenTricks or not OpenTricks_Table
    return
  elseif OpenTricks_GetRange(player, false) == 0
    return
  elseif not player.OpenTricks.Augment
    return
  elseif player.OpenTricks.key ~= "augment"
    return
  elseif OpenTricks_CanSelect(player)
    return
  end
  
  local mobj = player.mo
  
  local icon_x, icon_y = OR_GetOTricksIconCoords(cam)
  
  local aug_text = (player.OpenTricks.Augment.storage * 100)/max_augment
  local aug_x = othud.stringWidth(aug_text, V_20TRANS, "thin")
  othud.drawString(icon_x + 8 - (aug_x/2), icon_y + 4, "\x83" .. aug_text, V_HUDTRANS, "thin")
end

hud.add(Augment_Drawer)