// Wheel of Fate script by PDA Expert, for use in MVM missions.
// Inspired by the Wheel of Fate seen in Wizardy.
::ROOT <- getroottable()
if ("PDA_WheelOfFate" in ::ROOT) return
PrecacheModel("models/props_lakeside_event/buff_plane.mdl")

::PDA_WheelOfFate <- {
	mvm_stats = Entities.FindByClassname(null, "tf_mann_vs_machine_stats")

	function OnGameEvent_recalculate_holidays(_) {
		if (GetRoundState() != Constants.ERoundState.GR_STATE_PREROUND) return
		if (NetProps.GetPropInt(mvm_stats, "m_iCurrentWaveIdx") != 0) return

		delete ::wheeloffate_logic
		foreach (name, _ in ::ROOT)
			if (startswith(name, "wheel_"))
				delete ::ROOT[name]

		delete ::PDA_WheelOfFate
	}
}
__CollectGameEventCallbacks(::PDA_WheelOfFate)


if (Entities.FindByName(null, "filter_redteam") == null)
{
	printl("No redteam filter under the name of filter_redteam was found, spawning in one for the sake of easier use!")
	SpawnEntityFromTable("filter_activator_tfteam" , {
		targetname = "filter_redteam"
		teamnum = Constants.ETFTeam.TF_TEAM_RED
	})
}

if (Entities.FindByName(null, "filter_bluteam") == null)
{
	printl("No bluteam filter under the name of filter_bluteam was found, spawning in one for the sake of easier use!")
	SpawnEntityFromTable("filter_activator_tfteam" , {
		targetname = "filter_bluteam"
		teamnum = Constants.ETFTeam.TF_TEAM_BLUE
	})
}

::wheeloffate_logic <- function(x, y, z, angx, angy, angz)  // magic numbers you set in the popfile.
{
	local wheel_card = SpawnEntityFromTable("prop_dynamic" {
	        targetname = "wheel_card"
			model = "models/props_lakeside_event/buff_plane.mdl"
			skin = "1"
			solid = 0
			startdisabled = 1
		}
	)

	wheel_card.SetLocalOrigin(Vector(x, y, z))
	wheel_card.SetLocalAngles(QAngle(angx, angy, angz))

	local wheel_sparks1 = SpawnEntityFromTable("info_particle_system" {
    	    targetname = "green_wof_sparks"
			effect_name = "green_wof_sparks"
		}
	)

	wheel_sparks1.SetLocalOrigin(Vector(x + 3, y - 18, z - 6))
	wheel_sparks1.SetLocalAngles(QAngle(angx, angy + 286, angz))


	local wheel_sparks2 = SpawnEntityFromTable("info_particle_system" {
    	    targetname = "green_wof_sparks"
			effect_name = "green_wof_sparks"
		}
	)

	wheel_sparks2.SetLocalOrigin(Vector(x - 8, y - 18, z - 6))
	wheel_sparks2.SetLocalAngles(QAngle(angx, angy + 247, angz))

	local wheel_steam1 = SpawnEntityFromTable("info_particle_system" {
    	    targetname = "green_steam_cap"
			effect_name = "green_steam_plume"
		}
	)

	wheel_steam1.SetLocalOrigin(Vector(x - 14, y + 18, z - 337))
	wheel_steam1.SetLocalAngles(QAngle(angx - 60, angy + 180, angz + 180))

	local wheel_steam2 = SpawnEntityFromTable("info_particle_system" {
    	    targetname = "green_steam_cap"
			effect_name = "green_steam_plume"
		}
	)

	wheel_steam2.SetLocalOrigin(Vector(x + 10, y + 18, z - 337))
	wheel_steam2.SetLocalAngles(QAngle(angx - 60, angy, angz))

	local wheel_plumes = SpawnEntityFromTable("ambient_generic" {
        targetname = "plumes_long"
		message = "Halloween.plumes_long"
		radius = 2500
		spawnflags = 48
		health = 10
    	}
	)

	local wheel_spin_sound = SpawnEntityFromTable("ambient_generic" {
        targetname = "wheel_of_doom_sound"
		message = "Halloween.WheelofFate"
		radius = 1250
		spawnflags = 49
		health = 10
    	}
	)

	local wheel_merasmus_babble = SpawnEntityFromTable("ambient_generic" {
        targetname = "merasmus_wheel_babble_sound"
		message = "Halloween.MerasmusWheelSpin"
		radius = 1250
		spawnflags = 49
		health = 10
    	}
	)

	SpawnEntityFromTable("logic_relay" {
	    targetname = "merasmus_wheel_babble"
		startdisabled = 1
		"OnTrigger": "merasmus_wheel_babble_sound,PlaySound,,0,-1"
		}
	)

	wheel_plumes.SetLocalOrigin(Vector(x - 2, y + 2, z - 345))
	wheel_spin_sound.SetLocalOrigin(Vector(x - 2, y + 2, z - 345))
	wheel_merasmus_babble.SetLocalOrigin(Vector(x - 2, y + 2, z - 345))

	SpawnEntityFromTable("logic_relay" {
	    targetname = "green_steam_cap_relay"
		"OnTrigger#1": "green_steam_cap,Start,,0,-1"
		"OnTrigger#2": "green_steam_cap,Stop,,3,-1"
		"OnTrigger#3": "green_steam_cap,Start,,3.25,-1"
		"OnTrigger#4": "green_steam_cap,Stop,,3.65,-1"
		"OnTrigger#5": "green_steam_cap,Stop,,4.5,-1"
		"OnTrigger#6": "green_steam_cap,Start,,4,-1"
		"OnTrigger#7": "green_wof_sparks,Start,,0,-1"
		"OnTrigger#8": "green_wof_sparks,Stop,,6.7,-1"
		"OnTrigger#9": "green_wof_sparks,Stop,,14,-1"
		"OnTrigger#10": "green_wof_sparks,Start,,6.75,-1"
		}
	)

	SpawnEntityFromTable("logic_case" {
        targetname = "case_wheel_random_card_nofinal"
		"OnCase01": "wheel_card,Skin,10,0,-1"
		"OnCase02": "wheel_card,Skin,11,0,-1"
		"OnCase03": "wheel_card,Skin,12,0,-1"
		"OnCase04": "wheel_card,Skin,13,0,-1"
		"OnCase05": "wheel_card,Skin,14,0,-1"
		"OnCase06": "wheel_card,Skin,15,0,-1"
    	}
	)

	SpawnEntityFromTable("logic_case" {
        targetname = "case_wheel_random_card"
		"OnCase01": "wheel_card,Skin,2,0,-1"
		"OnCase02": "wheel_card,Skin,3,0,-1"
		"OnCase03": "wheel_card,Skin,4,0,-1"
		"OnCase04": "wheel_card,Skin,5,0,-1"
		"OnCase05": "wheel_card,Skin,6,0,-1"
		"OnCase06": "wheel_card,Skin,7,0,-1"
		"OnCase07": "wheel_card,Skin,8,0,-1"
		"OnCase08": "wheel_card,Skin,9,0,-1"
		"OnCase09": "case_wheel_random_card_nofinal,pickrandomshuffle,,0,-1"
		"OnCase10": "case_wheel_random_card_nofinal,pickrandomshuffle,,0,-1"
		"OnCase11": "case_wheel_random_card_nofinal,pickrandomshuffle,,0,-1"
		"OnCase12": "case_wheel_random_card_nofinal,pickrandomshuffle,,0,-1"
		"OnCase13": "case_wheel_random_card_nofinal,pickrandomshuffle,,0,-1"
		"OnCase14": "case_wheel_random_card_nofinal,pickrandomshuffle,,0,-1"
    	}
	)

	SpawnEntityFromTable("logic_relay" {
	    targetname = "relay_wheel_random_card"
		"OnTrigger#1": "case_wheel_random_card,pickrandomshuffle,,0,-1"
	}
	)

	SpawnEntityFromTable("logic_relay" {
     	    targetname = "relay_wheel_card_size"
			"OnTrigger#1": "wheel_card,SetModelScale,0.96,5.75,-1"
			"OnTrigger#2": "wheel_card,SetModelScale,0.94,5.36,-1"
			"OnTrigger#3": "wheel_card,SetModelScale,0.92,5.01,-1"
			"OnTrigger#4": "wheel_card,SetModelScale,0.90,4.67,-1"
			"OnTrigger#5": "wheel_card,SetModelScale,0.88,4.37,-1"
			"OnTrigger#6": "wheel_card,SetModelScale,0.86,4.07,-1"
			"OnTrigger#7": "wheel_card,SetModelScale,0.84,3.82,-1"
			"OnTrigger#8": "wheel_card,SetModelScale,0.82,3.58,-1"
			"OnTrigger#9": "wheel_card,SetModelScale,0.80,3.38,-1"
			"OnTrigger#10": "wheel_card,SetModelScale,0.78,3.2,-1"
			"OnTrigger#11": "wheel_card,SetModelScale,0.77,3.03,-1"
			"OnTrigger#12": "wheel_card,SetModelScale,0.76,2.97,-1"
			"OnTrigger#13": "wheel_card,SetModelScale,0.75,2.73,-1"
			"OnTrigger#14": "wheel_card,SetModelScale,0.74,2.58,-1"
			"OnTrigger#15": "wheel_card,SetModelScale,0.73,2.44,-1"
			"OnTrigger#16": "wheel_card,SetModelScale,0.72,2.3,-1"
			"OnTrigger#17": "wheel_card,SetModelScale,0.71,2.17,-1"
			"OnTrigger#18": "wheel_card,SetModelScale,0.70,2.05,-1"
			"OnTrigger#19": "wheel_card,SetModelScale,0.69,1.93,-1"
			"OnTrigger#20": "wheel_card,SetModelScale,0.68,1.71,-1"
			"OnTrigger#21": "wheel_card,SetModelScale,0.67,1.69,-1"
			"OnTrigger#22": "wheel_card,SetModelScale,0.66,1.58,-1"
			"OnTrigger#23": "wheel_card,SetModelScale,0.65,1.47,-1"
			"OnTrigger#24": "wheel_card,SetModelScale,0.64,1.36,-1"
			"OnTrigger#25": "wheel_card,SetModelScale,0.63,1.26,-1"
			"OnTrigger#26": "wheel_card,SetModelScale,0.62,1.15,-1"
			"OnTrigger#27": "wheel_card,SetModelScale,0.61,1.05,-1"
			"OnTrigger#28": "wheel_card,SetModelScale,0.60,0.95,-1"
			"OnTrigger#29": "wheel_card,SetModelScale,0.59,0.86,-1"
			"OnTrigger#30": "wheel_card,SetModelScale,0.58,0.76,-1"
			"OnTrigger#31": "wheel_card,SetModelScale,0.57,0.67,-1"
			"OnTrigger#32": "wheel_card,SetModelScale,0.56,0.58,-1"
			"OnTrigger#33": "wheel_card,SetModelScale,0.55,0.5,-1"
			"OnTrigger#34": "wheel_card,SetModelScale,0.54,0.41,-1"
			"OnTrigger#35": "wheel_card,SetModelScale,0.53,0.33,-1"
			"OnTrigger#36": "wheel_card,SetModelScale,0.52,0.24,-1"
			"OnTrigger#37": "wheel_card,SetModelScale,0.51,0.16,-1"
			"OnTrigger#38": "wheel_card,SetModelScale,0.5,0.07,-1"
     	}
	)

	SpawnEntityFromTable("logic_relay" {
	    targetname = "wheeloffate_spin"
		"OnTrigger#1": "wheel_card,setmodelscale,0.5,0.07,-1"
		"OnTrigger#2": "relay_wheel_card_size,trigger,,0.07,-1"
		"OnTrigger#3": "relay_wheel_random_card,Trigger,,0.07,-1"
		"OnTrigger#4": "relay_wheel_random_card,Trigger,,0.16,-1"
		"OnTrigger#5": "relay_wheel_random_card,Trigger,,0.24,-1"
		"OnTrigger#6": "relay_wheel_random_card,Trigger,,0.33,-1"
		"OnTrigger#7": "relay_wheel_random_card,Trigger,,0.41,-1"
		"OnTrigger#8": "relay_wheel_random_card,Trigger,,0.50,-1"
		"OnTrigger#9": "relay_wheel_random_card,Trigger,,0.58,-1"
		"OnTrigger#10": "relay_wheel_random_card,Trigger,,0.67,-1"
		"OnTrigger#11": "relay_wheel_random_card,Trigger,,0.76,-1"
		"OnTrigger#12": "relay_wheel_random_card,Trigger,,0.86,-1"
		"OnTrigger#13": "relay_wheel_random_card,Trigger,,0.95,-1"
		"OnTrigger#14": "relay_wheel_random_card,Trigger,,1.05,-1"
		"OnTrigger#15": "relay_wheel_random_card,Trigger,,1.15,-1"
		"OnTrigger#16": "relay_wheel_random_card,Trigger,,1.26,-1"
		"OnTrigger#17": "relay_wheel_random_card,Trigger,,1.36,-1"
		"OnTrigger#18": "relay_wheel_random_card,Trigger,,1.47,-1"
		"OnTrigger#19": "relay_wheel_random_card,Trigger,,1.58,-1"
		"OnTrigger#20": "relay_wheel_random_card,Trigger,,1.69,-1"
		"OnTrigger#21": "relay_wheel_random_card,Trigger,,1.71,-1"
		"OnTrigger#22": "relay_wheel_random_card,Trigger,,1.93,-1"
		"OnTrigger#23": "relay_wheel_random_card,Trigger,,2.05,-1"
		"OnTrigger#24": "relay_wheel_random_card,Trigger,,2.17,-1"
		"OnTrigger#25": "relay_wheel_random_card,Trigger,,2.30,-1"
		"OnTrigger#26": "relay_wheel_random_card,Trigger,,2.44,-1"
		"OnTrigger#27": "relay_wheel_random_card,Trigger,,2.58,-1"
		"OnTrigger#28": "relay_wheel_random_card,Trigger,,2.73,-1"
		"OnTrigger#29": "relay_wheel_random_card,Trigger,,2.97,-1"
		"OnTrigger#30": "relay_wheel_random_card,Trigger,,3.03,-1"
		"OnTrigger#31": "relay_wheel_random_card,Trigger,,3.2,-1"
		"OnTrigger#32": "relay_wheel_random_card,Trigger,,3.38,-1"
		"OnTrigger#33": "relay_wheel_random_card,Trigger,,3.58,-1"
		"OnTrigger#34": "relay_wheel_random_card,Trigger,,3.82,-1"
		"OnTrigger#35": "relay_wheel_random_card,Trigger,,4.07,-1"
		"OnTrigger#36": "relay_wheel_random_card,Trigger,,4.37,-1"
		"OnTrigger#37": "relay_wheel_random_card,Trigger,,4.67,-1"
		"OnTrigger#38": "case_wheel_random_card_nofinal,pickrandomshuffle,,5.75,-1"
		"OnTrigger#39": "green_steam_cap_relay,Trigger,,0,-1"
		"OnTrigger#40": "plumes_long,PlaySound,,0,-1"
		"OnTrigger#41": "wheel_of_doom_sound,PlaySound,,0,-1"
		"OnTrigger#42": "merasmus_wheel_babble,Trigger,,0,-1" // this is disabled by default.
		"OnTrigger#43": "wheel_card,Enable,,0.08,-1"
		"OnTrigger#44": "case_wheel_random_card_nofinal,pickrandomshuffle,,5.01,-1"
		"OnTrigger#45": "case_wheel_random_card_nofinal,pickrandomshuffle,,5.36,-1"
     	}
	)

	SpawnEntityFromTable("logic_relay" {
	        targetname = "relay_wheel_final"
			"OnTrigger#1": "wheel_card,setmodelscale,1,0,-1"
			"OnTrigger#2": "wheel_effect_trigger,enable,,1,-1"
			"OnTrigger#3": "relay_wheel_timer,enable,,1,-1"
			"OnTrigger#4": "wheel_effect_trigger,disable,,1.5,-1"
    	}
	)

	SpawnEntityFromTable("logic_relay" {
	        targetname = "relay_wheel_refresh"
			"OnTrigger#1": "wheel_effect_trigger,kill,,0.5,-1"
			"OnTrigger#2": "wheel_card,disable,,0,-1"
			"OnTrigger#3": "relay_wheel_timer,disable,,0,-1"
			"OnTrigger#4": "wheel_lowgravity_effect,disable,,0,-1"
			"OnTrigger#5": "wheel_lowgravity_effect,kill,,1,-1"
			"OnTrigger#6": "wheel_resetgravity,Enable,,0.5,-1"
			"OnTrigger#7": "wheel_attribute_clear,Enable,,0.5,-1"
			"OnTrigger#8": "wheel_attribute_clear,Kill,,2,-1"
			"OnTrigger#9": "wheel_attribute_effect,Disable,,0,-1"
			"OnTrigger#10": "wheel_attribute_effect,Kill,,0.5,-1"
    	}
	)

	SpawnEntityFromTable("logic_timer" {
	        targetname = "relay_wheel_timer"
			refiretime = 1
			startdisabled = 1
			"OnTimer#1": "wheel_effect_trigger,enable,,0,-1"
			"OnTimer#2": "wheel_effect_trigger,disable,,0.5,-1"
			"OnTimer#3": "wheel_attribute_effect,enable,,0,-1"
			"OnTimer#4": "wheel_attribute_effect,disable,,0.5,-1"
    	}
	)

    local wheel_ngtrigger = SpawnEntityFromTable("trigger_gravity" {
	        targetname = "wheel_resetgravity"
	    	spawnflags = "1"
	    	startdisabled = "0"
			gravity = "1"
        }
    )

    wheel_ngtrigger.KeyValueFromInt("solid", 2)
    wheel_ngtrigger.KeyValueFromString("mins", "-9999 -9999 -9999")
    wheel_ngtrigger.KeyValueFromString("maxs", "9999 9999 9999")

	printl("Wheel spawned!")
}

::wheel_generic <- function()
{
	EntFire("wheeloffate_spin", "trigger" , "null", 0,-1)
	EntFire("relay_wheel_card_size", "trigger", "null", 0,-1)
	EntFire("relay_wheel_final", "trigger", "null", 6.75,-1)
}

::wheel_customeffect <- function(condition, filter, cardskin) // set team filter via popfile
{
    wheel_generic()
	EntFire("wheel_card","Skin", cardskin,6.75,-1)

    local wheel_effects = SpawnEntityFromTable("trigger_add_tf_player_condition" {
	        targetname = "wheel_effect_trigger"
	    	duration = "2"
	    	spawnflags = "1"
	    	startdisabled = "1"
			filtername = filter
			//"OnTrigger": format("!activator,RunScriptCode,condthink(%d),,0,-1", condition)
        }
    )

    wheel_effects.KeyValueFromInt("solid", 2)
    wheel_effects.KeyValueFromString("mins", "-9999 -9999 -9999")
    wheel_effects.KeyValueFromString("maxs", "9999 9999 9999")
    wheel_effects.KeyValueFromInt("condition", condition)
}

::wheel_critboost <- function()
{
	wheel_customeffect(56,"filter_redteam",8)
}

::wheel_uber <- function()
{
	wheel_customeffect(57,"filter_redteam",7)
}

::wheel_superspeed <- function(filter)
{
	wheel_customeffect(32,filter,4)
	EntFire("wheel_attribute_effect","enable",null,7.75,-1)
	EntFire("wheel_attribute_effect","disable",null,8.25,-1)

    local wheel_attribute = SpawnEntityFromTable("trigger_add_or_remove_tf_player_attributes" {
	        targetname = "wheel_attribute_effect"
	    	duration = "2"
			value = "3"
	    	spawnflags = "1"
	    	startdisabled = "1"
			filtername = filter
			attribute_name = "major move speed bonus"
			add_or_remove = "0"
        }
    )

    wheel_attribute.KeyValueFromInt("solid", 2)
    wheel_attribute.KeyValueFromString("mins", "-9999 -9999 -9999")
    wheel_attribute.KeyValueFromString("maxs", "9999 9999 9999")

	local wheel_remove_attr = SpawnEntityFromTable("trigger_add_or_remove_tf_player_attributes" {
	        targetname = "wheel_attribute_clear"
			value = "3"
	    	spawnflags = "1"
	    	startdisabled = "1"
			filtername = filter
			attribute_name = "major move speed bonus"
			add_or_remove = "1"
        }
    )

    wheel_remove_attr.KeyValueFromInt("solid", 2)
    wheel_remove_attr.KeyValueFromString("mins", "-9999 -9999 -9999")
    wheel_remove_attr.KeyValueFromString("maxs", "9999 9999 9999")
}

::wheel_superspeed_red <- function()
{
    wheel_superspeed("filter_redteam")
}

::wheel_superspeed_blu <- function()
{
    wheel_superspeed("filter_bluteam")
}

::wheel_superspeed_all <- function()
{
    wheel_superspeed(null)
}

::wheel_bighead <- function()
{
	wheel_customeffect(84,"filter_redteam",6)
}

// low gravity is unqiue in the sense that it requires a seperate trigger for it to work, we'll have to make do here.
// note : not so unqiue now, eh?

::wheel_lowgravity <- function()
{

	EntFire("wheeloffate_spin", "trigger" , "null", 0,-1)
	EntFire("wheel_resetgravity", "Disable" , "null", 2,-1)
	EntFire("relay_wheel_card_size", "trigger", "null", 0,-1)
	EntFire("wheel_card","Skin", 5,6.75,-1)
	EntFire("wheel_card","setmodelscale", 1,6.75,-1)
	EntFire("wheel_lowgravity_effect","Enable", "null",7.75,-1)

    local wheel_lgtrigger = SpawnEntityFromTable("trigger_gravity" {
	        targetname = "wheel_lowgravity_effect"
	    	spawnflags = "1"
	    	startdisabled = "1"
			gravity = "0.2"
        }
    )

    wheel_lgtrigger.KeyValueFromInt("solid", 2)
    wheel_lgtrigger.KeyValueFromString("mins", "-9999 -9999 -9999")
    wheel_lgtrigger.KeyValueFromString("maxs", "9999 9999 9999")
}

// custom, ones that don't appear normally.

// this one's getting replaced by a more, accurate super speed.

::wheel_superspeed_wizardy <- function()
{
	wheel_customeffect(32,"filter_redteam",4)
}

::wheel_superduperspeed <- function()
{
	wheel_customeffect(72,"filter_redteam",4)
}

::wheel_dodge <- function()
{
	wheel_customeffect(79,"filter_redteam",14)
}

// replacement for jarate, basically.

::wheel_markfordeath <- function()
{
	wheel_customeffect(30,"filter_redteam",1)
}

::wheel_madmilk <- function()
{
	wheel_customeffect(27,"filter_redteam",1)
}

::wheel_jarate <- function()
{
	wheel_customeffect(24,"filter_redteam",1)
}

::wheel_fish <- function()
{
	wheel_customeffect(86,"filter_redteam",10)
}

::wheel_flight <- function()
{
	wheel_customeffect(107,"filter_redteam",2)
}

printl("Wheel script loaded succsesfully.")
