local ANGLE_90 = ANGLE_90

freeslot("MT_TRXOMO", "SPR_OMCH", "S_TRXOMO_A", "S_TRXOMO_B", "S_TRXOMO_C", "S_TRXOMO_D", "sfx_tmchon")

mobjinfo[MT_TRXOMO].spawnstate = S_TRXOMO_A
mobjinfo[MT_TRXOMO].flags = MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_DONTENCOREMAP

function A_OmochaoCreep(actor, var1, var2)
  actor.angle = $ - ANGLE_90
  A_Custom3DRotate(actor, var1, var2)
  if actor and actor.valid
    actor.angle = $ + ANGLE_90
  end
end

states[S_TRXOMO_A] = {SPR_OMCH, A, 1, A_OmochaoCreep, 120 + 14<<16, 80<<16, S_TRXOMO_B}
states[S_TRXOMO_B] = {SPR_OMCH, B, 1, A_OmochaoCreep, 120 + 14<<16, 80<<16, S_TRXOMO_C}
states[S_TRXOMO_C] = {SPR_OMCH, C, 1, A_OmochaoCreep, 120 + 14<<16, 80<<16, S_TRXOMO_D}
states[S_TRXOMO_D] = {SPR_OMCH, D, 1, A_OmochaoCreep, 120 + 14<<16, 80<<16, S_TRXOMO_A}

local min_sounds = 1
local max_sounds = 40

for x = min_sounds, max_sounds, 1 do --freeslot all sounds
  freeslot("sfx_tmch" .. tostring(x))
end

local chao_key = "Chao"

local cd_mode = CV_FindVar("cd_mode")

local function Chao_Initialize(player)
  if not cd_mode
    cd_mode = CV_FindVar("cd_mode")
  end
end

local function cd_spawndrive(pmo, cdt)
    local x_offset = P_RandomRange(FRACUNIT/2 * -1, FRACUNIT/2 * 1) * 160
    local y_offset = P_RandomRange(FRACUNIT/2 * -1, FRACUNIT/2 * 1) * 160
    local thisdrive = P_SpawnMobj(pmo.x + x_offset, pmo.y + y_offset, pmo.z, cdt)
    thisdrive.cd_source = pmo
    thisdrive.threshold = pmo.player.laps
    thisdrive.fuse = TICRATE * 120
end

local function cd_reward(pmo)
  --set random here
  local player = pmo.player
  local reward = P_RandomKey(4)
  if reward == 0
    player.cd_run = min($ + 1, chaosdrives.max)
    player.cd_runLast = 0
  elseif reward == 1
    player.cd_swim = min($ + 1, chaosdrives.max)
    player.cd_swimLast = 0
  elseif reward == 2
    player.cd_fly = min($ + 1, chaosdrives.max)
    player.cd_flyLast = 0
  elseif reward == 3
    player.cd_power = min($ + 1, chaosdrives.max)
    player.cd_powerLast = 0
  else -- somebody's messing with things they shouldn't! or maybe i wanted to add extra drive types and never got to it.
    print("chaos drives had an oopsie!")
  end
end

local function Chao_Trick(player)
  local mobj = player.mo
  if (cd_mode and cd_mode.value and cd_mode.value > 0)
    --chaos drives
    cd_reward(mobj)
	
	local count = 0
    for player in players.iterate()
      if player and player.valid and not player.spectator then count = $ + 1 end
    end
    local amount_to_spawn = 1 + ((count + 1) / 5) -- +1 at 4p, +1 at 9p, +1 at 14p
	
    for x = 1, amount_to_spawn, 1 do
      local reward = P_RandomKey(4)
      if reward == 0
        cd_spawndrive(mobj, MT_RUNDRIVE)
      elseif reward == 1
        cd_spawndrive(mobj, MT_SWIMDRIVE)
      elseif reward == 2
        cd_spawndrive(mobj, MT_FLYDRIVE)
      elseif reward == 3
        cd_spawndrive(mobj, MT_POWERDRIVE)
      end
    end
  else
    --omochao
    for victim in players.iterate()
      if not victim or not victim.valid or not victim.mo or not victim.mo.valid continue end -- ignore nonexistent
      if victim.spectator continue end -- ignore specs
      if victim.OpenTricks.key == chao_key continue end -- ignore other chao
      local mobj = victim.mo
      local omochao = P_SpawnMobj(mobj.x, mobj.y, mobj.z, MT_TRXOMO)
      omochao.fuse = TICRATE * 10
      omochao.target = mobj
      S_StartSound(omochao, sfx_tmchon) -- intentionally playing for all players.
      S_StartSound(omochao, sfx_tmchon + P_RandomRange(min_sounds, max_sounds), victim)
    end
  end
end

OPENTRICKS_ADD_FOURICONS(chao_key, "schizophrenic oomfie", "TRXTGN23", "TRXTGN25", "TRXTGN25", "TRXTGN27", false, Chao_Initialize, nil, Chao_Trick, nil)