local max_store = 1023
local max_spent = 400

local function Store_Activate(player, spent)
  local mobj = player.mo
  if player.OpenTricks.Store.storage == 0
    S_StartSound(player.mo, sfx_cdfm50)
    return
  end
  S_StartSound(mobj, sfx_s3k3c)
  local boost_time = spent/3
  player.OpenTricks.Store.store_time = $ + (boost_time)
  player.OpenTricks.Store.storage = max(0, $ - spent)
end

local function Store_Attempting(player)
  local mobj = player.mo
  local damaged = (mobj.health <= 0) or player.kartstuff[k_spinouttimer] or mobj.player.kartstuff[k_respawn]
  local item = (player.kartstuff[k_itemtype]) or (player.kartstuff[k_itemheld]) or (player.kartstuff[k_eggmanheld]) or (player.kartstuff[k_rocketsneakertimer]) or (player.OpenTricks.Store.last_item)
  local just_pressed = (player.cmd.buttons & BT_ATTACK) and (not player.OpenTricks.Store.last_press)
  return P_IsObjectOnGround(mobj) and just_pressed and not damaged and not item
end

local function Store_Initialize(player)
  player.OpenTricks.Store = {["storage"] = 0, ["store_time"] = 0, ["last_press"] = false, ["last_item"] = 0}
end

local function Store_Thinker(player)
  local store_t = player.OpenTricks.Store
  local make_smoke = (player.speed >= player.mo.scale * 10) or (leveltime % 7 == 0)
  if not store_t.store_time
    make_smoke = ((player.speed >= player.mo.scale * 10) and (leveltime % 3 == 0)) or ((player.speed < player.mo.scale * 10) and (leveltime % 7 == 0))
  end
  
  local smoke = nil
  if store_t.store_time
    if make_smoke
      OpenTricks_MakeSmoke(player, SKINCOLOR_BLUE)
	end
	K_SpawnDashDustRelease(player)
	player.kartstuff[k_boostpower] = $ + (FRACUNIT / 4)
	player.kartstuff[k_accelboost] = $ + (FRACUNIT * 2)
  elseif store_t.storage and (make_smoke)
    OpenTricks_MakeSmoke(player, SKINCOLOR_BLUEBERRY)
  end
  
  if Store_Attempting(player)
    Store_Activate(player, min(player.OpenTricks.Store.storage, max_spent))
  end
  
  store_t.store_time = max(0, $ - 1)
  store_t.last_press = (player.cmd.buttons & BT_ATTACK)
  store_t.last_item = (player.kartstuff[k_itemtype]) or (player.kartstuff[k_itemheld]) or (player.kartstuff[k_eggmanheld]) or (player.kartstuff[k_rocketsneakertimer])
end

local function Store_Success(player)
  local store_t = player.OpenTricks.Store
  store_t.decay_time = max_decay_safety
  store_t.bump_safety = bump_safety_time
end

local function Store_Landing(player)
  local mobj = player.mo
  S_StartSound(mobj, sfx_s23c)
  player.OpenTricks.Store.storage = $ + (64 * player.OpenTricks.combo)
  player.kartstuff[k_startboost] = $ + TICRATE
  if player.OpenTricks.Store.storage > max_store
    Store_Activate(player, abs(max_store - player.OpenTricks.Store.storage))
  end
end

OPENTRICKS_ADD("store", "push [item] to spend energy", "TRXTGN9", "TRXTGN10", false, Store_Initialize, Store_Thinker, Store_Success, Store_Landing)

local function Store_Drawer(othud, player, cam)
  if not player.OpenTricks or not OpenTricks_Table
    return
  elseif OpenTricks_GetRange(player, false) == 0
    return
  elseif not player.OpenTricks.Store
    return
  elseif player.OpenTricks.key ~= "store"
    return
  elseif OpenTricks_CanSelect(player)
    return
  end
  
  local mobj = player.mo
  
  local icon_x, icon_y = OR_GetOTricksIconCoords(cam)
  
  local store_text = (player.OpenTricks.Store.storage * 100)/max_store
  local store_x = othud.stringWidth(store_text, V_20TRANS, "thin")
  othud.drawString(icon_x + 8 - (store_x/2), icon_y + 4, "\x84" .. store_text, V_HUDTRANS, "thin")
end

hud.add(Store_Drawer)