local CHEWCHEWTANK_VALUES_TABLE = {
	CHEWCHEWTANK_MODEL                = "models/lilchewchew/lilchewchew_v3.mdl"
	CHEWCHEWTANK_MODEL_WHEELS         = "models/lilchewchew/lilchewchew_wheels_v3.mdl"
	CHEWCHEWTANK_DAMAGE               = 1000
	CHEWCHEWTANK_FRIENDLY_FIRE        = true
	CHEWCHEWTANK_FUNCTION_CHOMP_SOUND = function()
	{
		local sSound = format(")mvm/melee_impacts/metal_gloves_hit_robo0%i.wav", RandomInt(1, 4))
		TankExt.PrecacheSound(sSound)
		EmitSoundEx({
			sound_name  = sSound
			sound_level = 85
			entity      = self
			filter_type = RECIPIENT_FILTER_GLOBAL
		})
	}
}
foreach(k,v in CHEWCHEWTANK_VALUES_TABLE)
	if(!(k in TankExt.ValueOverrides))
		ROOT[k] <- v

PrecacheModel(CHEWCHEWTANK_MODEL)
PrecacheModel(CHEWCHEWTANK_MODEL_WHEELS)

::ChewChewTankEvents <- {
	function OnGameEvent_recalculate_holidays(_) { if(GetRoundState() == 3) delete ::ChewChewTankEvents }
	function OnScriptHook_OnTakeDamage(params)
	{
		local hVictim   = params.const_entity
		local hAttacker = params.attacker
		if(hVictim && hAttacker && hAttacker.GetClassname() == "tank_boss")
		{
			local hAttacker_scope = hAttacker.GetScriptScope()
			local ChewChewScope   = TankExt.GetMultiScopeTable(hAttacker_scope, "chewchewtank")
			if(ChewChewScope)
				params.force_friendly_fire = CHEWCHEWTANK_FRIENDLY_FIRE
		}
	}
}
__CollectGameEventCallbacks(ChewChewTankEvents)

TankExt.NewTankType("chewchewtank", {
	DisableChildModels = 1
	DisableSmokestack  = 1
	NoDestructionModel = 1
	EngineLoopSound    = ")ambient/machines/train_freight_loop2.wav"
	function OnSpawn()
	{
		local hTrack = null
		local hBomb  = null
		for(local hChild = self.FirstMoveChild(); hChild; hChild = hChild.NextMovePeer())
			if(hChild.GetModelName().tolower().find("track_r"))
				{ hTrack = hChild; break }

		local hModel    = TankExt.SpawnEntityFromTableFast("prop_dynamic", { origin = "40 0 0", defaultanim = "move", model = CHEWCHEWTANK_MODEL })
		local hWheels   = TankExt.SpawnEntityFromTableFast("prop_dynamic", { origin = "40 0 0", defaultanim = "move", disableshadows = 1, model = CHEWCHEWTANK_MODEL_WHEELS })
		local hFakeBomb = TankExt.SpawnEntityFromTableFast("prop_dynamic", { origin = "44 0 -38", modelscale = 0.75, disableshadows = 1, model = "models/bots/boss_bot/bomb_mechanism.mdl" })
		local hChomp    = SpawnEntityFromTable("trigger_multiple", {
			origin       = "152 0 66"
			spawnflags   = 64
			OnStartTouch = "!selfRunScriptCodeChomp(activator)-1-1"
		})
		hChomp.SetSize(Vector(-40, -52, -66), Vector(40, 52, 66))
		hChomp.SetSolid(SOLID_BBOX)
		hChomp.ValidateScriptScope()

		local hTank      = self
		local iDeploySeq = self.LookupSequence("deploy")
		hChomp.GetScriptScope().Chomp <- function(hEnt)
		{
			if((hEnt.IsPlayer() && !hEnt.IsMiniBoss() && (CHEWCHEWTANK_FRIENDLY_FIRE || hEnt.GetTeam() != hTank.GetTeam())) || HasProp(hEnt, "m_iObjectType"))
			{
				hModel.AcceptInput("SetAnimation", "chomp", null, null)
				EntFireByHandle(hModel, "SetAnimation", hTank.GetSequence() == iDeploySeq ? "idle" : "move", 0.33, null, null)
				hEnt.TakeDamageEx(hTank, hTank, null, Vector(), Vector(), CHEWCHEWTANK_DAMAGE, DMG_VEHICLE)
				CHEWCHEWTANK_FUNCTION_CHOMP_SOUND()
			}
		}

		TankExt.SetParentArray([hModel, hWheels, hFakeBomb, hChomp], self)
		SetPropEntity(hChomp, "m_pParent", null)

		local iEmpty     = PrecacheModel("models/empty.mdl")
		local bDeploying = false
		function Think()
		{
			SetPropIntArray(self, "m_nModelIndexOverrides", iEmpty, 0)
			SetPropIntArray(self, "m_nModelIndexOverrides", iEmpty, 3)

			// now i know this looks bad but theres no other reliable way to detect buildings
			hChomp.AcceptInput("Disable", null, null, null)
			hChomp.AcceptInput("Enable", null, null, null)

			// sync wheels with tank speed
			hWheels.SetPlaybackRate(hTrack.GetPlaybackRate() * 0.83)

			if(!bDeploying && self.GetSequence() == iDeploySeq)
			{
				bDeploying = true
				hFakeBomb.AcceptInput("SetAnimation", "deploy", null, null)
				hModel.AcceptInput("SetAnimation", "idle", null, null)
			}
		}
	}
})