freeslot("S_PILLARBOI", "S_PILLARBOI_UHOH", "S_PILLARBOI_DEAD", "MT_PILLARBOI", "S_LAPPORTAL", "MT_LAPPORTAL", "SPR_JOHN", "SPR_JOHS", "SPR_JOHD", "SPR_LAP2", "MT_PIZZAMASK", "MT_PIZZAFACE", "S_PIZZAFACE", "S_PIZZAFACE_SPAWN", "SPR_PZAT", "SPR_SWRD", "S_SWORD_SPAWN", "MT_SWORD", "S_PIZZAFACERECOVER", "SPR_PZAR", "SPR_SWDG", "S_SWORD_GONE", "S_GATE_CLOSED", "S_GATE_OPEN", "MT_GATE", "SPR_GATO", "SPR_GATC")

states[S_PILLARBOI] = {
	sprite = SPR_JOHN,
	frame = A,
	tics = -1,
	nextstate = S_PILLARBOI
}

states[S_PILLARBOI_UHOH] = {
	sprite = SPR_JOHS,
	frame = A,
	tics = -1,
	nextstate = S_PILLARBOI_UHOH
}

states[S_PILLARBOI_DEAD] = {
	sprite = SPR_JOHD,
	frame = A,
	tics = -1,
	nextstate = S_PILLARBOI_DEAD
}

states[S_LAPPORTAL] = {
	sprite = SPR_LAP2,
	frame = FF_ANIMATE|A,
	var1 = 2,
	var2 = 2,
	tics = -1
}

mobjinfo[MT_PILLARBOI] = {
	doomednum = -1,
	spawnstate = S_PILLARBOI,
	spawnhealth = 2,
	deathstate = S_PILLARBOI_DEAD,
	radius = 64*FU,
	height = 200*FU,
	flags = MF_SPECIAL|MF_ENEMY
}

mobjinfo[MT_LAPPORTAL] = {
	doomednum = 3002,
	spawnstate = S_LAPPORTAL,
	spawnhealth = 9999,
	radius = 32*FU,
	height = 130*FU,
	flags = MF_SPECIAL|MF_NOGRAVITY
}

states[S_PIZZAFACE_SPAWN] = {
    sprite = SPR_PZAT,
    frame = FF_ANIMATE|A,
    tics = -1,
    var1 = 15,
    var2 = 2,
    nextstate =	S_PIZZAFACE_SPAWN
}

mobjinfo[MT_PIZZAFACE] = {
	doomednum = -1,
	spawnstate = S_PIZZAFACE_SPAWN,
	spawnhealth = 1,
	speed = 24*FRACUNIT,
	radius = 60*FRACUNIT,
	height = 72*FRACUNIT,
	flags = MF_NOCLIPHEIGHT|MF_NOBLOCKMAP|MF_RUNSPAWNFUNC|MF_NOGRAVITY|MF_NOCLIP
}

mobjinfo[MT_PIZZAMASK] = {
	doomednum = -1,
	spawnstate = S_PIZZAFACE,
	spawnhealth = 1000,
	deathstate = S_NULL,
	radius = 16*FU,
	height = 48*FU,
	flags = MF_NOCLIPHEIGHT|MF_NOBLOCKMAP|MF_RUNSPAWNFUNC|MF_NOGRAVITY|MF_NOCLIP
}

states[S_PIZZAFACE] = {
    sprite = SPR_PZAT,
    frame = FF_ANIMATE|A,
    tics = -1,
    var1 = 15,
    var2 = 2,
    nextstate = SPR_PZAT
}

states[S_SWORD_SPAWN] = {
	sprite = SPR_SWRD,
	frame = A,
	tics = -1,
	nextstate = S_SWORD_SPAWN
}

states[S_SWORD_GONE] = {
	sprite = SPR_SWDG,
	frame = A,
	tics = -1,
	nextstate = S_SWORD_GONE
}

mobjinfo[MT_SWORD] = {
	doomednum = 3003,
	spawnstate = S_SWORD_SPAWN,
	spawnhealth = 9999,
	radius = 32*FU,
	flags = MF_SPECIAL
}

states[S_PIZZAFACERECOVER] = {
    sprite = SPR_PZAR,
    frame = FF_ANIMATE|A,
    tics = 18,
    var1 = 9,
    var2 = 2,
    nextstate = S_PIZZAFACE
}

states[S_GATE_CLOSED] = {
	sprite = SPR_GATC,
	frame = A,
	tics = -1,
	nextstate = S_GATE_CLOSED
}

states[S_GATE_OPEN] = {
	sprite = SPR_GATO,
	frame = A,
	tics = -1,
	nextstate = S_GATE_OPEN
}

mobjinfo[MT_GATE] = {
	doomednum = -1,
	spawnstate = S_GATE_CLOSED,
	spawnhealth = 9999,
	radius = 32*FU,
	flags = MF_SPECIAL
}

rawset(_G, 'hooks', {})

rawset(_G, 'addPTHook', function(name, func)
	if not hooks[name]
		hooks[name] = {}
	end
	table.insert(hooks[name], func)
end)

rawset(_G, 'executePTHook', function(name, table)
	if hooks[name]
		local return_val = nil
		for _,func in pairs(hooks[name])
			local thing = func(unpack(table))
			if not return_val
				return_val = thing
			end
		end
		return return_val
	end
end)

rawset(_G, "L_TableContains", function(table, val)
	local hasit = {}
	for _,i in pairs(table) do
		hasit[i] = true
	end
	return hasit[val]
end)