-- command definitions etc

rawset(_G, "kmp", "R1.5")
rawset(_G, "kmp_prerelease", 0)		-- don't let that in the release, doofus.
--rawset(_G, "kmp_debug", 1)		-- don't let that in the release, doofus.

rawset(_G, "kmp_bumpspark", CV_RegisterVar({
  name = "kmp_bumpspark",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

rawset(_G, "kmp_hardsneakers", CV_RegisterVar({
  name = "kmp_hardsneakers",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

rawset(_G, "kmp_respawnpoints", CV_RegisterVar({
  name = "kmp_respawnpoints",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

rawset(_G, "kmp_extendflashtics", CV_RegisterVar({
  name = "kmp_extendflashtics",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

rawset(_G, "kmp_slowspinout", CV_RegisterVar({
  name = "kmp_slowspinout",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

rawset(_G, "kmp_offroadspinout", CV_RegisterVar({
  name = "kmp_offroadspinout",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

rawset(_G, "kmp_orbinautfuse", CV_RegisterVar({
  name = "kmp_orbinautfuse",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

rawset(_G, "kmp_floatingitemfuse", CV_RegisterVar({
  name = "kmp_floatingitemfuse",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

rawset(_G, "kmp_growthbump", CV_RegisterVar({
  name = "kmp_growthbump",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

rawset(_G, "kmp_itemlimiter", CV_RegisterVar({
  name = "kmp_itemlimiter",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

rawset(_G, "kmp_hyudoro", CV_RegisterVar({
  name = "kmp_hyudoro",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

rawset(_G, "kmp_orbitlimit", CV_RegisterVar({
  name = "kmp_orbitlimit",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

rawset(_G, "kmp_shrinkcleanse", CV_RegisterVar({
  name = "kmp_shrinkcleanse",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

rawset(_G, "kmp_shrinkduration", CV_RegisterVar({
  name = "kmp_shrinkduration",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

rawset(_G, "kmp_haste", CV_RegisterVar({
  name = "kmp_haste",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

rawset(_G, "kmp_airsneakerbuf", CV_RegisterVar({
  name = "kmp_airsneakerbuf",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

rawset(_G, "kmp_battleaccel", CV_RegisterVar({
  name = "kmp_battleaccel",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

rawset(_G, "kmp_raceaccel", CV_RegisterVar({
  name = "kmp_raceaccel",
  defaultvalue = "Off",
  flags = CV_NETVAR,
  PossibleValue = CV_OnOff,
}))

-- return splitflags in function of splitscreen status
rawset(_G, "FUCK_returnsplitflags", function(f, displaynum)

	if not splitscreen return f end

	-- exhibit 1: 2p
	if splitscreen == 1
		if not displaynum -- p1
			return f & ~(V_SNAPTOBOTTOM)
		else	-- p2
			return (f|V_SPLITSCREEN) & ~(V_SNAPTOTOP)
		end
	else
		-- jesus fuck this sucks dicks
		if not displaynum	-- p1
			return f & ~(V_SNAPTOBOTTOM|V_SNAPTORIGHT)
		elseif displaynum == 1	-- p2
			return (f|V_HORZSCREEN) & ~(V_SNAPTOBOTTOM|V_SNAPTOLEFT)
		elseif displaynum == 2	-- p3
			return (f|V_SPLITSCREEN) & ~(V_SNAPTOTOP|V_SNAPTORIGHT)
		elseif displaynum == 3	-- p4
			return (f|V_SPLITSCREEN|V_HORZSCREEN) & ~(V_SNAPTOTOP|V_SNAPTOLEFT)
		end
	end
	return f	-- shouldn't happen but don't return nil either way lol
end)

local dispinfo = {
	{"Keep Sparks on wallbump", kmp_bumpspark},
	{"Hard Mode Sneakers", kmp_hardsneakers},
	{"Respawn Points", kmp_respawnpoints},
	{"Extended Flashtics", kmp_extendflashtics},
	{"1.0.4 slower spinout", kmp_slowspinout},
	{"Offroad drag in spinout", kmp_offroadspinout},	
	{"Dropped Minecraft item fuse", kmp_floatingitemfuse},
	{"Item Limiter", kmp_itemlimiter},
	{"Orbiting Item Limiter", kmp_orbitlimit},
	{"Extended Hyudoro", kmp_hyudoro},
	{"Thrown Orbinaut Fuse", kmp_orbinautfuse},
	{"No Growth Squish mid-air", kmp_growthbump},
	{"Shrink Cleanse", kmp_shrinkcleanse},
	{"Dyn. Shrink duration", kmp_shrinkduration},
	{"Driftboost Adjust (Haste)", kmp_haste},
	{"Aerial Sneaker Buffer", kmp_airsneakerbuf},
	{"1.5x accel in Race", kmp_raceaccel},	
	{"1.5x accel in Battle", kmp_battleaccel},
}

COM_AddCommand("kmp_info", function(p)

	if kmp_prerelease
		CONS_Printf(p, "\x82".."KMP PRERELEASE "..kmp.." || DO NOT REDISTRIBUTE")
	else
		CONS_Printf(p, "\x82".."Running KMP "..kmp)
	end
	CONS_Printf(p, "List of parameters:")
	for i = 1, #dispinfo
		local info = dispinfo[i]
		local clr = info[2].value and "\x83".."ON " or "\x85".."OFF"

		CONS_Printf(p, clr.."\x80 - ".."\x82"..info[2].name.."\x80"..": ("..info[1]..")")
	end
	CONS_Printf(p, "Type \'kmp_help <command name>\' for more details about the above commands")
end)

local help = {
	{"Keep your drift sparks even after bumping a wall.", kmp_bumpspark},
	{"Raises the Hard Mode Sneaker speed boost from 27.5% to 50% like Normal Mode, giving Sneakers better catchup power.", kmp_hardsneakers},
	{"Creates respawn points for you every 2 seconds while on ground.", kmp_respawnpoints},
	{"Doubles invulnerability frames on hit. This is to make recoveries easier.", kmp_extendflashtics},
	{"Reverts spinout behavior back to its 1.0.4 iteration where it slows you down more, avoiding cases where you'll inevitably spin out in a pit, or far into offroad, and granting bananas more power on straightaways too!", kmp_slowspinout},
	{"During spinout, slow down rapidly to a complete stop if you drift off into offorad. This is to mitigate the power of bananas in turns.", kmp_offroadspinout},
	{"Makes dropped Minecraft Items disappear after a while, this is to avoid 1st place being able to come accross Growth or Invincbility, for instance. The time before it despawns depends on the Lap Count.", kmp_floatingitemfuse},
	{"Limits the amount of Bananas, Jawz and Orbinauts you can obtain from item boxes when the Player Count gets past 8 players, this is to keep the track easier to navigate overall withot hindering the players who get these items still.", kmp_itemlimiter},
	{"Adds a new behavior to orbiting items; when just deployed, they will spin faster, acting more like a shield. They will slow down over time and be destroyed after 10 seconds if they aren't thrown. This is to reward timing and prevent cases where a player with a Double Jawz becomes unpassable, among other things.", kmp_orbitlimit},
	{"Doubles Hyudoro's duration and makes Jawz lose sight of you when used.", kmp_hyudoro},
	{"Makes thrown orbinauts disappear after 20 seconds, to keep long straigthaways clean", kmp_orbinautfuse},
	{"Prevents Growth from squishing players mid-air, bumping them off instead.", kmp_growthbump},
	{"Destroys every item on stage upon Shrink activation.", kmp_shrinkcleanse},
	{"Shrink duration depends on your position, where first place gets the longest Shrink while players in the back aren't penalized as much.", kmp_shrinkduration},
	{"Longer drift boosts for lower speed stats.", kmp_haste},
	{"Allows you to consume Sneaker(s) mid-air or whilst spun out to have their effect apply as soon as possible. (Duration stacks with diminitive returns for multiple Sneakers)", kmp_airsneakerbuf},
	{"Increases acceleration in race mode 1.5x to mitigate item power and offer more dynamic games.", kmp_raceaccel},
	{"Increase acceleration in battle mode 1.5x for more dynamic games focused on quick reflexes.", kmp_battleaccel},
}

COM_AddCommand("kmp_help", function(p, arg)

	if not arg return end	-- morron
	arg = arg:lower()

	for i = 1, #help
		if arg == help[i][2].name
			CONS_Printf(p, "\x82"..help[i][2].name.."\x80"..":\n"..help[i][1])
			return
		end
	end
	CONS_Printf(p, "No command named \'"..arg.."\' in KMP. Use \'kmp_info\' to view a list of all the commands")
end)
