freeslot (
	"MT_MULTIARROW",
	"MT_LUA_CC_SIGN",
	"S_MULTIARROW",
	"SPR_SDAR",
	"S_KODA_ARROW2",	
	"S_COLORED_CC_SIGN_SOLID1",
	"S_COLORED_CC_SIGN_SHIMMER",
	"S_COLORED_CC_SIGN_SOLID2",
	"S_COLORED_CC_SIGN_VANISH",
	"S_COLORED_CC_SIGN_CLEAR",
	"MT_LUACHARYB_ARROW1",
	"S_CHARYB_ARROW1_STEADY",
	"S_CHARYB_ARROW1_ANIM",
	"MT_LUACHARYB_HAND",
	"S_CHARYB_HAND_STEADY",
	"S_CHARYB_HAND_ANIM",
	"SPR_CHRY"
)

states[S_KODA_ARROW2] = {SPR_SDAR, FF_PAPERSPRITE|FF_ANIMATE|M, -1, None, 1, 4, S_KODA_ARROW2}

--Generic sign settings. Colors are always determined by angle/360, object scale by thing flags.
local function SignSettings (mo, sign) 
	--Determine scale by flags.
	--Extra doubles scale, Special halves scale, and Ambush quarters scale.
	--Ambush and Special can be combined for 1/8th scale. 
	--Extra Special triples scale, and Extra Ambush quadruples it.
	if (mo.spawnpoint.options == 1) sign.scale = $1 * 2 end
	if (mo.spawnpoint.options & (MTF_OBJECTSPECIAL)) sign.scale = $1 * 1/2 end
	if (mo.spawnpoint.options & (MTF_AMBUSH)) sign.scale = $1 * 1/4 end
	if (mo.spawnpoint.options == (MTF_OBJECTSPECIAL|1)) sign.scale = 3*FRACUNIT end
	if (mo.spawnpoint.options == (MTF_AMBUSH|1)) sign.scale = 4*FRACUNIT end
	local col = (abs((mo.spawnpoint.angle/360 + 1)))
	local anglecorrect = 0;
	
	//Angle correction in case of overflow.
	if (mo.spawnpoint.angle < 0)
		anglecorrect = (FRACUNIT/2-abs(mo.spawnpoint.angle)) % 360 + 8
		sign.angle = FixedAngle(anglecorrect * FRACUNIT)
	end
	
	//Color wrap-around for the other colors
	if (mo.spawnpoint.angle > 32760) 
		col = (abs(mo.spawnpoint.angle) - FRACUNIT/2)/360 + 90 
	elseif (mo.spawnpoint.angle < 0)
		col = (mo.spawnpoint.angle + FRACUNIT/2)/360 + 90
	else
	end
	
	--Determine color by angle
	if(col < MAXSKINCOLORS) 
		sign.color = col
	else 
		sign.color = SKINCOLOR_NONE --Default to no color.
		print("Miscolored sign placed at X: \$sign.x/FRACUNIT\ Y: \$sign.y/FRACUNIT\ Z: \$sign.z/FRACUNIT\")
	end
end

--Animated sign settings. A delay is set based off of the parameter value.
local function AnimSignSettings (mo, state,delaymul)
	local sign = P_SpawnMobj(mo.x,mo.y,mo.z, MT_THOK)
	sign.angle = FixedAngle(mo.spawnpoint.angle * FRACUNIT)
	SignSettings(mo,sign)
	sign.state = state
	--Parameter determines animation delay, in multiples of 2 tics.
	sign.tics = states[state].tics + delaymul * mo.spawnpoint.extrainfo
end

function A_MultiArrowFrame(mo,var1, var2)
	--A Multi Sign can be up to 16 different types of sign. 
	--Sign generation utilizes a hack similar to the one
	--in A_RandomShadowFrame.
	if(mo.extravalue1 != 1)
	local sign = P_SpawnMobj(mo.x,mo.y,mo.z, MT_THOK)
	sign.angle = FixedAngle(mo.spawnpoint.angle*FRACUNIT)
	sign.tics = -1
	sign.sprite = SPR_SDAR
	sign.frame = FF_PAPERSPRITE
	
	local signtype = {
		[0] = function (i) sign.frame = $1 | 0 end, --SD2
		[1]	= function (i) sign.frame = $1 | 12 end, --Kodachrome
		[2] = function (i) sign.frame = $1 | 14 end, --Basic
		[3] = function (i) sign.frame = $1 | 15 end, --Basic w/o background
		[4]	= function (i) sign.frame = $1 | 16 end, --Double Triangle
		[5] = function (i) sign.frame = $1 | 17 end, --Chevron
		[6] = function (i) sign.frame = $1 | 18 end, --SR 1
		[7] = function (i) sign.frame = $1 | 20 end, --SR 2 w/o background
		[8] = function (i) sign.frame = $1 | 21 end, --PG
		[9] = function (i) sign.frame = $1 | 22 end, --Golden arrow w/ inside colorable
		[10] = function (i) sign.frame = $1 | 23 end, --Golden arrow w/ outside colorable
		[11] = function (i) sign.frame = $1 | 24 end, --Honeybee Industries
		[12] = function (i) sign.frame = $1 | 25 end, --SD2 Warn
		[13] = function (i) sign.frame = $1 | 26 end, --SD2 Invincibility
		[14] = function (i) sign.frame = $1 | 27 end, --SD2 Shoe
		[15] = function (i) sign.frame = $1 | 28 end, --SD2 U-Turn
	}
	
	--Determine sign type by parameter. 	
	signtype[mo.spawnpoint.extrainfo](i)
	mo.flags2 = $1|MF2_DONTDRAW
	if (sign.frame == 12|FF_PAPERSPRITE) sign.state = S_KODA_ARROW2 end	--Animation handler for Koda sign.
	SignSettings(mo,sign)
	mo.extravalue1 = 1
	end
end

mobjinfo[MT_MULTIARROW] = {
        --$Name Lua Colorable Multi-Arrow
		--$Sprite SDARALAR
		doomednum = 2234,
        spawnstate = S_MULTIARROW,
        spawnhealth = 1000,
        seestate = S_NULL,
        seesound = sfx_None,
        reactiontime = 8,
        attacksound = sfx_None,
        painstate = S_NULL,
        painchance = 0,
        painsound = sfx_None,
        meleestate = S_NULL,
        missilestate = S_NULL,
        deathstate = S_NULL,
        xdeathstate = S_NULL,
        deathsound = sfx_None,
        speed = 0,
        radius = 128*FRACUNIT,
        height = 256*FRACUNIT,
        dispoffset = 0,
        mass = 100,
        damage = 0,
        activesound = sfx_None,
        flags = MF_NOGRAVITY|MF_RUNSPAWNFUNC,
        raisestate = S_NULL
}

states[S_MULTIARROW] = {SPR_NULL, FF_PAPERSPRITE|A, -1, A_MultiArrowFrame, 0, 0, S_MULTIARROW}

mobjinfo[MT_LUA_CC_SIGN] = {
        --$Name Lua Colorable Crimson Core Arrow
		--$Sprite SDARBLBR
		doomednum = 2235,
        spawnstate = S_NULL,
        spawnhealth = 1000,
        seestate = S_NULL,
        seesound = sfx_None,
        reactiontime = 8,
        attacksound = sfx_None,
        painstate = S_NULL,
        painchance = 0,
        painsound = sfx_None,
        meleestate = S_NULL,
        missilestate = S_NULL,
        deathstate = S_NULL,
        xdeathstate = S_NULL,
        deathsound = sfx_None,
        speed = 0,
        radius = 64*FRACUNIT,
        height = 256*FRACUNIT,
        dispoffset = 0,
        mass = 100,
        damage = 0,
        activesound = sfx_None,
        flags = MF_NOGRAVITY,
        raisestate = S_NULL
}
states[S_COLORED_CC_SIGN_SOLID1] = {SPR_SDAR, FF_PAPERSPRITE|B, 2, None, 0, 0, S_COLORED_CC_SIGN_SHIMMER}
states[S_COLORED_CC_SIGN_SHIMMER] = {SPR_SDAR, FF_PAPERSPRITE|FF_ANIMATE|C, 12, None, 6, 2, S_COLORED_CC_SIGN_SOLID2}
states[S_COLORED_CC_SIGN_SOLID2] = {SPR_SDAR, FF_PAPERSPRITE|B, 6, None, 0, 0, S_COLORED_CC_SIGN_VANISH}
states[S_COLORED_CC_SIGN_VANISH] = {SPR_SDAR, FF_PAPERSPRITE|FF_ANIMATE|I, 6, None, 3, 2, S_COLORED_CC_SIGN_CLEAR}
states[S_COLORED_CC_SIGN_CLEAR] = {SPR_SDAR, FF_PAPERSPRITE|L, 16, None, 0, 0, S_COLORED_CC_SIGN_SOLID1}

addHook("MobjRemoved",function(mo)
	AnimSignSettings (mo, S_COLORED_CC_SIGN_SOLID1,2)
end, MT_LUA_CC_SIGN)


--These arrows were contributed by Charybdizs.
mobjinfo[MT_LUACHARYB_ARROW1] = {
        --$Name Lua Colorable Animated Double Arrow
		--$Sprite CHRYARAL
		doomednum = 2245,
        spawnstate = S_NULL,
        spawnhealth = 1000,
        seestate = S_NULL,
        seesound = sfx_None,
        reactiontime = 8,
        attacksound = sfx_None,
        painstate = S_NULL,
        painchance = 0,
        painsound = sfx_None,
        meleestate = S_NULL,
        missilestate = S_NULL,
        deathstate = S_NULL,
        xdeathstate = S_NULL,
        deathsound = sfx_None,
        speed = 0,
        radius = 128*FRACUNIT,
        height = 256*FRACUNIT,
        dispoffset = 0,
        mass = 100,
        damage = 0,
        activesound = sfx_None,
        flags = MF_NOGRAVITY,
        raisestate = S_NULL
}
states[S_CHARYB_ARROW1_STEADY] = {SPR_CHRY, FF_PAPERSPRITE|A, 0, None, 0, 0, S_CHARYB_ARROW1_ANIM}
states[S_CHARYB_ARROW1_ANIM] = {SPR_CHRY, FF_PAPERSPRITE|FF_ANIMATE|A, -1, None, 20, 1, S_CHARYB_ARROW1_ANIM}



addHook("MobjRemoved",function(mo)
	AnimSignSettings (mo, S_CHARYB_ARROW1_STEADY,1)
end, MT_LUACHARYB_ARROW1)

mobjinfo[MT_LUACHARYB_HAND] = {
        --$Name Lua Colorable Giant Hand
		--$Sprite CHRYVRVL
		doomednum = 2246,
        spawnstate = S_NULL,
        spawnhealth = 1000,
        seestate = S_NULL,
        seesound = sfx_None,
        reactiontime = 8,
        attacksound = sfx_None,
        painstate = S_NULL,
        painchance = 0,
        painsound = sfx_None,
        meleestate = S_NULL,
        missilestate = S_NULL,
        deathstate = S_NULL,
        xdeathstate = S_NULL,
        deathsound = sfx_None,
        speed = 0,
        radius = 128*FRACUNIT,
        height = 256*FRACUNIT,
        dispoffset = 0,
        mass = 100,
        damage = 0,
        activesound = sfx_None,
        flags = MF_NOGRAVITY,
        raisestate = S_NULL
}
states[S_CHARYB_HAND_STEADY] = {SPR_CHRY, FF_PAPERSPRITE|V, 0, None, 0, 0, S_CHARYB_HAND_ANIM}
states[S_CHARYB_HAND_ANIM] = {SPR_CHRY, FF_PAPERSPRITE|FF_ANIMATE|V, -1, None, 9, 3, S_CHARYB_HAND_ANIM}

addHook("MobjRemoved",function(mo)
	AnimSignSettings (mo, S_CHARYB_HAND_STEADY,3)
end, MT_LUACHARYB_HAND)
