// ****************************
// EQUINOX - By Akira Software
// Team: Akirahedgehog, Mazmazz
// Version 1.0.1
// ****************************
freeslot("S_SUIT4","S_MJAC1","S_KGLI","MT_KGLI","SPR_KGLI","S_CSPIN","MT_SUIT","MT_RADE","S_RADE1","S_RADE2","S_RADE3","S_RADE4","SPR_RADE","MT_OURO","S_OURO1","SPR_OURO","MT_GUARD","MT_AUTOMATRON","MT_RHEA","S_RHEA1","S_RHEA2","S_RHEA3","S_RHEA4","S_RHEA5","S_RHEA6","S_RHEA7","S_RHEA8","S_RHEA9","S_RHEA10","SPR_RHEA","S_AUTO1","MT_BALLZ","S_BALLZ","S_BALLZ2","S_AUTO2","sfx_rade","sfx_mjack","sfx_heehee","sfx_hock")
freeslot("MT_PAST","S_PAST1","S_PAST2","S_PAST3","S_PAST4","SPR_PAST")
freeslot("MT_FUTU","S_FUTU1","S_FUTU2","S_FUTU3","S_FUTU4","SPR_FUTU")
freeslot("MT_DOLL","MT_DOLL2","S_DOLL1","S_DOLL2","S_DOLL3","S_DOLL4","S_DOLL5","S_DOLL6","SPR_DOLL")
freeslot("MT_DOLL3","SPR_DOLM","S_DOLL7","S_DOLL8","S_DOLL9","S_DOLL10","S_DOLL11","S_DOLL12","S_DOLL13")
freeslot("MT_RASP","S_RASP20","MT_DOLL4","SPR_DOLS","S_DOLL20","S_DOLL21","S_DOLL22","S_DOLL23","S_DOLL24","S_DOLL25","S_DOLL26","S_DOLL27","S_DOLL28","S_DOLL29","S_DOLL30","S_DOLL31","S_DOLL32")
freeslot("S_DOLL33","S_DOLL34")
freeslot("sfx_rasp0","sfx_rasp1","sfx_rasp2","sfx_rasp3","sfx_rasp4","sfx_rasp5","sfx_rasp6","sfx_rasp7","sfx_rasp8","sfx_rasp9")
freeslot("S_RASPFLEE1","S_RASPFLEE2")
rawset(_G, "MAX_DANCE_RANGE", FRACUNIT*1024)
rawset(_G, "heehee_save", reserveLuabanks())
local heehee = 0	
local delaytime = 0
local muspos = 0
local lscore = 0
local rscore = 0
local splat = nil
local splatz = nil
local flatz = nil
local raid1 = nil
local raid2 = nil
local raid3 = nil
local raid4 = nil
local keepitlit = nil
local theflat = nil
local thepast = 0
local thefuture = 0
local i = 0
local ab = 0
local theraid = 0
local runonce = 0

function A_ZPast(actor, var1, var2)
	thepast = 1
	thefuture = 0
end

function A_ZFutu(actor, var1, var2)
	thepast = 0
	thefuture = 1
end

//Flying Doll Spawn
states[S_DOLL1] = {SPR_DOLL, A, 5, A_Look, (0<<64)|0, 0, S_DOLL1}
//Large Flying Doll See
states[S_DOLL2] = {SPR_DOLL, A, -1, A_FaceTarget, 0, 0, S_DOLL2}
states[S_DOLL3] = {SPR_DOLL, A, 1, A_SpawnObjectRelative, (0<<16)|0, (0<<16)+MT_DOLL2, S_NULL}
//Large Doll Spawn
states[S_DOLL32] = {SPR_DOLL, A, 5, A_Look, (0<<64)|0, 0, S_DOLL33}
states[S_DOLL33] = {SPR_DOLL, A, 35, A_BunnyHop, 4, 16, S_DOLL7}
states[S_DOLL7] = {SPR_DOLL, A, 1, A_SpawnObjectRelative, (64<<16)|0, (128<<16)+MT_DOLL3, S_DOLL34}
states[S_DOLL34] = {SPR_DOLL, A, 5, A_Look, (0<<64)|0, 0, S_DOLL34}
//Large Doll Movement
states[S_DOLL4] = {SPR_DOLL, A, 1, A_FaceTarget, 0, 0, S_DOLL5}
states[S_DOLL5] = {SPR_DOLL, A, 70, A_BunnyHop, 4, 16, S_DOLL28}
states[S_DOLL28] = {SPR_DOLL, A, 70, A_ChangeAngleRelative, 90, 90, S_DOLL29}
states[S_DOLL29] = {SPR_DOLL, A, 5, A_Look, 0, 0, S_DOLL4}
//Medium Doll Spawn
states[S_DOLL8] = {SPR_DOLM, A, 35, A_BunnyHop, 32, 32, S_DOLL10}
states[S_DOLL10] = {SPR_DOLM, A, 1, A_SpawnObjectRelative, (64<<16)|0, (128<<16)+MT_DOLL4, S_DOLL30}
states[S_DOLL30] = {SPR_DOLM, A, 1, A_SetObjectFlags, 4194309, 0, S_DOLL13}
states[S_DOLL13] = {SPR_DOLM, A, 5, A_Look, (0<<64)|0, 0, S_DOLL13}
//Medium Doll Movement
states[S_DOLL9] = {SPR_DOLM, A, 1, A_FaceTarget, 0, 0, S_DOLL11}
states[S_DOLL11] = {SPR_DOLM, A, 70, A_BunnyHop, 8, 16, S_DOLL24}
states[S_DOLL24] = {SPR_DOLM, A, 5, A_ChangeAngleRelative, 45, 45, S_DOLL25}
states[S_DOLL25] = {SPR_DOLM, A, 5, A_Look, 0, 0, S_DOLL9}
//Small Doll Spawn
states[S_DOLL20] = {SPR_DOLS, A, 35, A_BunnyHop, 32	, 32, S_DOLL31}
states[S_DOLL31] = {SPR_DOLS, A, 1, A_SetObjectFlags, 4194309, 0, S_DOLL21}
states[S_DOLL21] = {SPR_DOLS, A, 5, A_Look, (0<<64)|0, 0, S_DOLL21}
//Small Doll Movement
states[S_DOLL22] = {SPR_DOLS, A, 1, A_FaceTarget, 0, 0, S_DOLL23}
states[S_DOLL23] = {SPR_DOLS, A, 70, A_BunnyHop, 8, 16, S_DOLL26}
states[S_DOLL26] = {SPR_DOLS, A, 5, A_ChangeAngleRelative, 45, 45, S_DOLL27}
states[S_DOLL27] = {SPR_DOLS, A, 5, A_Look, 0, 0, S_DOLL22}

states[S_PAST1] = {SPR_PAST, A, -1, NULL, 0, 0, S_PAST1}
states[S_PAST2] = {SPR_PAST, FF_ANIMATE|A, 30, A_SCREAM, 4, 2, S_PAST3}
states[S_PAST3] = {SPR_PAST, E, 2, A_ZPast, 0, 0, S_PAST4} 
states[S_PAST4] = {SPR_PAST, E, -1, NULL, 0, 0, S_PAST4}
states[S_FUTU1] = {SPR_FUTU, A, -1, NULL, 0, 0, S_FUTU1}
states[S_FUTU2] = {SPR_FUTU, FF_ANIMATE|A, 30, A_SCREAM, 4, 2, S_FUTU3}
states[S_FUTU3] = {SPR_FUTU, E, 2, A_ZFUTU, 0, 0, S_FUTU4} 
states[S_FUTU4] = {SPR_FUTU, E, -1, NULL, 0, 0, S_FUTU4}
states[S_KGLI] = {SPR_KGLI, FF_FULLBRIGHT|TR_TRANS50|A, -1, NULL, 7, 5, S_KGLI}
states[S_SUIT4] = {SPR_TANZ, A, 5, A_CustomPower, 7, 5, S_XPLD1}
states[S_RADE1] = {SPR_RADE, FF_FULLBRIGHT|A, 35, A_Chase, 0, 0, S_RADE1}
states[S_RADE2] = {SPR_RADE, FF_FULLBRIGHT|A, 1, A_DualAction, S_RADE3, S_RADE4, S_RADE2}
states[S_RADE3] = {SPR_RADE, FF_FULLBRIGHT|A, 1, A_GhostMe, 0, 0, S_RADE2}
states[S_RADE4] = {SPR_RADE, FF_FULLBRIGHT|A, 1, A_Chase, 0, 0, S_RADE2}
states[S_MJAC1] = {SPR_MJAC, A, 70, NULL, 0, 0, S_PLAY_STND}
states[S_CSPIN] = {SPR_SPOS, A, 5, A_BunnyHop, 8, 4, S_CSPIN}
states[S_AUTO1] = {SPR_SPHR, A, 5, A_LOOK, 0, 0, S_AUTO1}
states[S_BALLZ] = {SPR_SPHR, A, 1, NULL, 0, 0, S_BALLZ}
states[S_BALLZ2] = {SPR_SPHR, C, 1, NULL, 0, 0, S_BALLZ2}
states[S_AUTO2] = {SPR_SPHR, A, 1, A_Chase, 0, 0, S_AUTO2}
states[S_OURO1] = {SPR_OURO, FF_FULLBRIGHT|TR_TRANS40|A, 1, A_CapeChase, (8<<16)+0, (-8<<16)+0, S_OURO1}
states[S_RHEA1] = {SPR_RHEA, FF_FULLBRIGHT|TR_TRANS90|A, 5, NULL, 0, 0, S_RHEA2}
states[S_RHEA2] = {SPR_RHEA, FF_FULLBRIGHT|TR_TRANS80|A, 5, NULL, 0, 0, S_RHEA3}
states[S_RHEA3] = {SPR_RHEA, FF_FULLBRIGHT|TR_TRANS70|A, 5, NULL, 0, 0, S_RHEA4}
states[S_RHEA4] = {SPR_RHEA, FF_FULLBRIGHT|TR_TRANS60|A, 5, NULL, 0, 0, S_RHEA5}
states[S_RHEA5] = {SPR_RHEA, FF_FULLBRIGHT|TR_TRANS50|A, 5, NULL, 0, 0, S_RHEA6}
states[S_RHEA6] = {SPR_RHEA, FF_FULLBRIGHT|TR_TRANS40|A, 5, NULL, 0, 0, S_RHEA7}
states[S_RHEA7] = {SPR_RHEA, FF_FULLBRIGHT|TR_TRANS30|A, 5, NULL, 0, 0, S_RHEA8}
states[S_RHEA8] = {SPR_RHEA, FF_FULLBRIGHT|TR_TRANS20|A, 5, NULL, 0, 0, S_RHEA9}
states[S_RHEA9] = {SPR_RHEA, FF_FULLBRIGHT|TR_TRANS10|A, 5, NULL, 0, 0, S_RHEA10}
states[S_RHEA10] = {SPR_RHEA, FF_FULLBRIGHT|A, 140, A_SetObjectFlags, MF_PAIN, 0, S_NULL}

//Hockey scoring in Artemis
local function LeftScores(line, mo)
	P_TeleportMove(mo,9936*FRACUNIT,12016*FRACUNIT,312*FRACUNIT)
	
	if rscore < 9
		if lscore == 0
			P_LinedefExecute(622)
			lscore = lscore + 1
			S_StartSound(mo,sfx_hock)
		elseif lscore == 1
			P_LinedefExecute(623)
			lscore = lscore + 1
			S_StartSound(mo,sfx_hock)
		elseif lscore == 2
			P_LinedefExecute(624)
			lscore = lscore + 1
			S_StartSound(mo,sfx_hock)
		elseif lscore == 3
			P_LinedefExecute(625)
			lscore = lscore + 1
			S_StartSound(mo,sfx_hock)
		elseif lscore == 4
			P_LinedefExecute(626)
			lscore = lscore + 1
			S_StartSound(mo,sfx_hock)
		elseif lscore == 5
			P_LinedefExecute(627)
			lscore = lscore + 1
			S_StartSound(mo,sfx_hock)
		elseif lscore == 6
			P_LinedefExecute(628)
			lscore = lscore + 1
			S_StartSound(mo,sfx_hock)
		elseif lscore == 7
			P_LinedefExecute(629)
			lscore = lscore + 1
			S_StartSound(mo,sfx_hock)
		elseif lscore == 8
			P_LinedefExecute(630)
			lscore = lscore + 1
			S_StartSound(mo,sfx_hock)
		end
	end
end

local function RightScores(line, mo)
	P_TeleportMove(mo,9936*FRACUNIT,12016*FRACUNIT,312*FRACUNIT)
	if lscore < 9
		if rscore == 0
			P_LinedefExecute(632)
			rscore = rscore + 1
			S_StartSound(mo,sfx_hock)
		elseif rscore == 1
			P_LinedefExecute(633)
			rscore = rscore + 1
			S_StartSound(mo,sfx_hock)
		elseif rscore == 2
			P_LinedefExecute(634)
			rscore = rscore + 1
			S_StartSound(mo,sfx_hock)
		elseif rscore == 3
			P_LinedefExecute(635)
			rscore = rscore + 1
			S_StartSound(mo,sfx_hock)
		elseif rscore == 4
			P_LinedefExecute(636)
			rscore = rscore + 1
			S_StartSound(mo,sfx_hock)
		elseif rscore == 5
			P_LinedefExecute(637)
			rscore = rscore + 1
			S_StartSound(mo,sfx_hock)
		elseif rscore == 6
			P_LinedefExecute(638)
			rscore = rscore + 1
			S_StartSound(mo,sfx_hock)
		elseif rscore == 7
			P_LinedefExecute(639)
			rscore = rscore + 1
			S_StartSound(mo,sfx_hock)
		elseif rscore == 8
			P_LinedefExecute(640)
			rscore = rscore + 1
			S_StartSound(mo,sfx_hock)
		end
	end
end

//RHEA
mobjinfo[MT_RHEA] = {
	doomednum = 2302,
	spawnstate = S_RHEA1,
	spawnhealth = 1,
	seestate = S_RHEA1,
	seesound = sfx_None,
	reactiontime = TICRATE,
	attacksound = sfx_None,
	painstate = S_NULL,
	painchance = 0,
	painsound = sfx_None,
	meleestate = S_NULL,
	missilestate = S_NULL,
	deathstate = S_XPLD1,
	xdeathstate = S_NULL,
	deathsound = sfx_pop,
	speed = 10,
	radius = 128*FRACUNIT,
	height = 256*FRACUNIT,
	dispoffset = 0,
	mass = 100,
	damage = 0,
	activesound = sfx_None,
	flags = MF_SCENERY,
	raisestate = S_NULL
}

//OURO
mobjinfo[MT_OURO] = {
	doomednum = 2303,
	spawnstate = S_OURO1,
	spawnhealth = 1,
	seestate = S_OURO1,
	seesound = sfx_None,
	reactiontime = TICRATE,
	attacksound = sfx_None,
	painstate = S_NULL,
	painchance = 0,
	painsound = sfx_None,
	meleestate = S_NULL,
	missilestate = S_NULL,
	deathstate = S_XPLD1,
	xdeathstate = S_NULL,
	deathsound = sfx_pop,
	speed = 10,
	radius = 128*FRACUNIT,
	height = 256*FRACUNIT,
	dispoffset = 0,
	mass = 100,
	damage = 0,
	activesound = sfx_None,
	flags = MF_SCENERY,
	raisestate = S_NULL
}

//RADE
mobjinfo[MT_RADE] = {
	doomednum = 2304,
	spawnstate = S_RADE2,
	spawnhealth = 1,
	seestate = S_RADE2,
	seesound = sfx_None,
	reactiontime = TICRATE,
	attacksound = sfx_None,
	painstate = S_NULL,
	painchance = 0,
	painsound = sfx_None,
	meleestate = S_NULL,
	missilestate = S_NULL,
	deathstate = S_XPLD1,
	xdeathstate = S_NULL,
	deathsound = sfx_pop,
	speed = 20,
	radius = 16*FRACUNIT,
	height = 64*FRACUNIT,
	dispoffset = 0,
	mass = 100,
	damage = 0,
	activesound = sfx_None,
	flags = MF_ENEMY|MF_PAIN|MF_NOGRAVITY,
	raisestate = S_NULL
}

//King's Gambit Lighting
mobjinfo[MT_KGLI] = {
	doomednum = 2305,
	spawnstate = S_KGLI,
	spawnhealth = 1,
	seestate = S_NULL,
	seesound = sfx_None,
	reactiontime = TICRATE,
	attacksound = sfx_None,
	painstate = S_NULL,
	painchance = 0,
	painsound = sfx_None,
	meleestate = S_NULL,
	missilestate = S_NULL,
	deathstate = S_XPLD1,
	xdeathstate = S_NULL,
	deathsound = sfx_pop,
	speed = 20,
	radius = 16*FRACUNIT,
	height = 64*FRACUNIT,
	dispoffset = 0,
	mass = 100,
	damage = 0,
	activesound = sfx_None,
	flags = MF_SCENERY|MF_NOGRAVITY,
	raisestate = S_NULL
}

//Past Panel
mobjinfo[MT_PAST] = {
	doomednum = 2306,
	spawnstate = S_PAST1,
	spawnhealth = 1,
	seestate = S_NULL,
	seesound = sfx_None,
	reactiontime = TICRATE,
	attacksound = sfx_None,
	painstate = S_NULL,
	painchance = 0,
	painsound = sfx_None,
	meleestate = S_NULL,
	missilestate = S_NULL,
	deathstate = S_PAST2,
	xdeathstate = S_NULL,
	deathsound = sfx_cdpcm1,
	speed = 20,
	radius = 16*FRACUNIT,
	height = 64*FRACUNIT,
	dispoffset = 0,
	mass = 100,
	damage = 3,
	activesound = sfx_None,
	flags = MF_SPECIAL,
	raisestate = S_NULL
}

//Future Panel
mobjinfo[MT_FUTU] = {
	doomednum = 2307,
	spawnstate = S_FUTU1,
	spawnhealth = 1,
	seestate = S_NULL,
	seesound = sfx_None,
	reactiontime = TICRATE,
	attacksound = sfx_None,
	painstate = S_NULL,
	painchance = 0,
	painsound = sfx_None,
	meleestate = S_NULL,
	missilestate = S_NULL,
	deathstate = S_FUTU2,
	xdeathstate = S_NULL,
	deathsound = sfx_cdpcm0,
	speed = 20,
	radius = 16*FRACUNIT,
	height = 64*FRACUNIT,
	dispoffset = 0,
	mass = 100,
	damage = 3,
	activesound = sfx_None,
	flags = MF_SPECIAL,
	raisestate = S_NULL
}

//Future Panel
mobjinfo[MT_DOLL] = {
	doomednum = 2308,
	spawnstate = S_DOLL1,
	spawnhealth = 1,
	seestate = S_DOLL2,
	seesound = sfx_None,
	reactiontime = 1*TICRATE,
	attacksound = sfx_None,
	painstate = S_NULL,
	painchance = 0,
	painsound = sfx_None,
	meleestate = S_NULL,
	missilestate = S_NULL,
	deathstate = S_DOLL3,
	xdeathstate = S_NULL,
	deathsound = sfx_cdfm50,
	speed = 16*FRACUNIT,
	radius = 16*FRACUNIT,
	height = 128*FRACUNIT,
	dispoffset = 0,
	mass = 100,
	damage = 3,
	activesound = sfx_None,
	flags = MF_ENEMY|MF_SHOOTABLE|MF_NOGRAVITY|MF_MISSILE|MF_PAIN,
	raisestate = S_NULL
}

//Future Panel
mobjinfo[MT_DOLL2] = {
	doomednum = 2309,
	spawnstate = S_DOLL32,
	spawnhealth = 1,
	seestate = S_DOLL4,
	seesound = sfx_None,
	reactiontime = 1*TICRATE,
	attacksound = sfx_None,
	painstate = S_NULL,
	painchance = 0,
	painsound = sfx_None,
	meleestate = S_NULL,
	missilestate = S_NULL,
	deathstate = S_XPLD1,
	xdeathstate = S_NULL,
	deathsound = sfx_cdfm50,
	speed = 16*FRACUNIT,
	radius = 16*FRACUNIT,
	height = 128*FRACUNIT,
	dispoffset = 0,
	mass = 100,
	damage = 3,
	activesound = sfx_None,
	flags = MF_ENEMY|MF_SHOOTABLE|MF_SPECIAL,
	raisestate = S_NULL
}

mobjinfo[MT_DOLL3] = {
	doomednum = 2310,
	spawnstate = S_DOLL8,
	spawnhealth = 1,
	seestate = S_DOLL9,
	seesound = sfx_None,
	reactiontime = 1*TICRATE,
	attacksound = sfx_None,
	painstate = S_NULL,
	painchance = 0,
	painsound = sfx_None,
	meleestate = S_NULL,
	missilestate = S_NULL,
	deathstate = S_XPLD1,
	xdeathstate = S_NULL,
	deathsound = sfx_cdfm50,
	speed = 18*FRACUNIT,
	radius = 16*FRACUNIT,
	height = 128*FRACUNIT,
	dispoffset = 0,
	mass = 100,
	damage = 3,
	activesound = sfx_None,
	flags = MF_ENEMY|MF_SHOOTABLE|MF_SPECIAL|MF_NOCLIPTHING,
	raisestate = S_NULL
}

mobjinfo[MT_DOLL4] = {
	doomednum = 2311,
	spawnstate = S_DOLL20,
	spawnhealth = 1,
	seestate = S_DOLL22,
	seesound = sfx_None,
	reactiontime = 1*TICRATE,
	attacksound = sfx_None,
	painstate = S_NULL,
	painchance = 0,
	painsound = sfx_None,
	meleestate = S_NULL,
	missilestate = S_NULL,
	deathstate = S_XPLD1,
	xdeathstate = S_NULL,
	deathsound = sfx_cdfm50,
	speed = 18*FRACUNIT,
	radius = 16*FRACUNIT,
	height = 128*FRACUNIT,
	dispoffset = 0,
	mass = 100,
	damage = 3,
	activesound = sfx_None,
	flags = MF_ENEMY|MF_SHOOTABLE|MF_SPECIAL|MF_NOCLIPTHING,
	raisestate = S_NULL
}

function A_RaspPrime(actor, var1, var2)
	if (actor.target.subsector.sector.tag == 91)
		//Flame
		S_StartSound(actor.target,sfx_rasp4)
		A_RHeat(actor,0,0)
		A_VileAttack(actor,0,0)
	else
		//Throw doll
		S_StartSound(actor.targer,sfx_rasp5)
		A_BossFireShot(actor,MT_DOLL,2)
	end
end

function A_RHeat(actor, var1, var2)
    //Let's go!
	if actor.target.subsector.sector.tag == 91
		splat = P_SpawnMobj(actor.target.x, actor.target.y, 4*FRACUNIT, MT_RHEA)
		splat.renderflags = RF_FLOORSPRITE|RF_BLENDMASK
		splat.blendmode = AST_ADD
	end
end

//WIP SPHERE CHARACTER
mobjinfo[MT_AUTOMATRON] = {
	doomednum = 2300,
	spawnstate = S_AUTO1,
	spawnhealth = 1,
	seestate = S_AUTO2,
	seesound = sfx_None,
	reactiontime = TICRATE,
	attacksound = sfx_None,
	painstate = S_NULL,
	painchance = 0,
	painsound = sfx_None,
	meleestate = S_NULL,
	missilestate = S_NULL,
	deathstate = S_XPLD1,
	xdeathstate = S_NULL,
	deathsound = sfx_pop,
	speed = 10,
	radius = 64*FRACUNIT,
	height = 32*FRACUNIT,
	dispoffset = 0,
	mass = 100,
	damage = 0,
	activesound = sfx_None,
	flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE|MF_NOGRAVITY,
	raisestate = S_NULL
}

mobjinfo[MT_BALLZ] = {
	doomednum = 2301,
	spawnstate = S_BALLZ,
	spawnhealth = 1,
	seestate = S_BALLZ,
	seesound = sfx_None,
	reactiontime = TICRATE,
	attacksound = sfx_None,
	painstate = S_NULL,
	painchance = 0,
	painsound = sfx_None,
	meleestate = S_NULL,
	missilestate = S_NULL,
	deathstate = S_XPLD1,
	xdeathstate = S_NULL,
	deathsound = sfx_pop,
	speed = 10,
	radius = 16*FRACUNIT,
	height = 32*FRACUNIT,
	dispoffset = 0,
	mass = 100,
	damage = 0,
	activesound = sfx_None,
	flags = MF_NOGRAVITY,
	raisestate = S_NULL
}

local framea = {head = {100,250,0}, utor = {0,128,5}}

local function change_position(parent,child,frame,x,y,z)
	//child.x = parent.x + x
	//child.y = parent.y + y
	//child.z = parent.z + z
	print('Frame Translate - X: ' + child.x)
end

function A_Delay(actor, var1, var2)
	delaytime = actor.angle*TICRATE
	//if leveltime == delaytime
		actor.state = S_BLDE1
	//end
end

function A_RAID(actor, var1, var2)
	if actor.target.subsector.sector.tag == 91
		S_StartSound(actor,sfx_rade)
		raid1 = P_SpawnMobj(actor.x+64*FRACUNIT,actor.y+64*FRACUNIT,actor.z+16*FRACUNIT,MT_RADE)
		A_SetFuse(raid1, 500, 0)
		raid2 = P_SpawnMobj(actor.x-64*FRACUNIT,actor.y+64*FRACUNIT,actor.z+16*FRACUNIT,MT_RADE)
		A_SetFuse(raid2, 500, 0)
		raid3 = P_SpawnMobj(actor.x-64*FRACUNIT,actor.y-64*FRACUNIT,actor.z+16*FRACUNIT,MT_RADE)
		A_SetFuse(raid3, 500, 0)
		raid4 = P_SpawnMobj(actor.x+64*FRACUNIT,actor.y-64*FRACUNIT,actor.z+16*FRACUNIT,MT_RADE)
		A_SetFuse(raid4, 500, 0)
	else //Player is outside the arena
		A_BrakFireShot(actor,MT_DEMONFIRE,64)	
	end
end

function A_AutoWalk(actor, var1, var2)
   //Move head
   //change_position(actor,actor.head,framea['head'][1],framea['head'][2],framea['head'][3])
   actor.head.x = actor.x + framea['head'][1]
   //Move upper torso
end

//HEE HEE
hud.add(function(v, player)
	local patch = v.cachePatch("HEEHEE")
	if (mapheaderinfo[gamemap].bk) 
		local tt01 = v.cachePatch("TT01")
		local tt02 = v.cachePatch("TT02")
		local tt03 = v.cachePatch("TT03")
		if (ab == 80)
			v.draw(0, 0, tt01)
		elseif (ab == 81)
			v.draw(0, 0, tt02)
		elseif (ab == 82)
			v.draw(0, 0, tt03)
		end
	end
	
	local f = hudinfo[HUD_RINGS].f
	
	if (mapheaderinfo[gamemap].lunarcitadel) 
		if (player.realtime > 350) and (player.mo.x < -14000*FRACUNIT)
			if (heehee > 0)
				v.draw(16, 57, patch, f)
				v.drawNum(95,58,heehee, f)
			end
		end
	else
		if (heehee > 0)
			v.draw(16, 57, patch, f)
			v.drawNum(95,58,heehee, f)
		end
	end
	end, "game")
	
hud.add(function(v, player)
		if (mapheaderinfo[gamemap].lunarcitadel) 
			local patchz = v.cachePatch("SHIPCON")
			if (player.realtime < 350) and (player.mo.x < -14000*FRACUNIT)
				v.draw(0, 0, patchz)
				hud.disable('rings')
				hud.disable('score')
				hud.disable('time')
			elseif (player.realtime == 351)
				hud.enable('rings')
				hud.enable('score')
				hud.enable('time')
			end
		end
	end, "game")

local function LunarRestore(line, mo)
	COM_BufInsertText(mo.player, "chasecam on")
end

local function MJactivate(line, mo)
	S_StartSound(mo,sfx_mjack)
end

function A_HeeHee(actor, var1, var2)
	S_StartSound(actor,sfx_heehee)
	if heehee < 8
		heehee = heehee + 1
	end
end

local function TimeZoneDescription(line, mo)
	if (mapheaderinfo[gamemap].desolatedustbowl) 
		COM_BufInsertText(mo.player, "cecho Cape Canaveral, Florida\\\October 9, 2024")
	end
end

local function enemy_dance(mo, v)
	if v.type == MT_GUARD //Guardian Spirit
		v.state = S_CSPIN
	end
	
	if v.type == MT_MONK //Cultist
		v.state = S_DSPIN
	end
	
	if v.type == MT_BYBZ //Shadow People
		v.state = S_ESPIN
	end
	
	if v.type == MT_BZRO //Skeletons
		v.state = S_SSPIN
	end
end

local function AirMeUp(line, mo)
	if mo.player.bot == 0
		mo.tank = P_SpawnMobj(mo.x, mo.y, mo.z+mo.height, MT_SUIT)
		mo.tank.target = mo
	end
end

addHook("BossDeath", function(rasputin)
	S_StopMusic(consoleplayer)
end)

local function RasputinShield(line, mo)	
	//Destroy the shield
	if lscore == 0
	for mt in mapthings.iterate
		if mt.type == 1644
			if (mt.mobj.rshield.valid) and (mt.mobj.health > 0) //Breakage here after Rasputin dies
				P_RemoveMobj(mt.mobj.rshield)
				A_SetObjectFlags(mt.mobj,133,0)
			end
		end
	end
	lscore = 1
	end
end

local function RasputinRade(line, mo)
	if runonce == 0
		for mobj in mobjs.iterate()
			if mobj.type == MT_RADE
				P_SetMobjStateNF(mobj,642)
			end
		end
	S_StartSound(mo,sfx_bexpld)
	theraid = 1
	end
	runonce = 1
end

//Hee hee..
function A_DanceBomb(actor, var1, var2)
	//for player in players.iterate
		P_BlackOw(consoleplayer)
	//end
	S_ChangeMusic(mapmusname)
	S_SetMusicPosition(muspos)
end

function A_RestoreRAShield(actor, var1, var2)
	for mt in mapthings.iterate
		if mt.type == 1646
			P_TeleportMove(mt.mobj,-11120*FRACUNIT,-8976*FRACUNIT,128*FRACUNIT)
		end
	end
	actor.rshield = P_SpawnMobj(actor.x, actor.y, actor.z+actor.height, MT_OURO)
	actor.rshield.target = actor
	A_SetObjectFlags(actor,16777345,0)
	if  actor.health == 1
		S_StartSound(actor.target,sfx_rasp1)
		actor.info.speed = 64
		actor.info.spawnstate = S_RASP28
		actor.info.meleestate = S_RASP20
		actor.info.misslestate = S_RASP20
		A_SetObjectFlags2(actor,MF2_FRET,1)
	end
	lscore = 0
	P_LinedefExecute(92)
end

function A_RestoreRARaid(actor, var1, var2)
	if theraid == 1
		for mt in mapthings.iterate
			if mt.type == 1645
				P_TeleportMove(mt.mobj,-13066*FRACUNIT,-8978*FRACUNIT,128*FRACUNIT)
			end
		end
		P_LinedefExecute(105)
		theraid = 0
		runonce = 0
	end
end

addHook("LinedefExecute", TimeZoneDescription, "FLORIDA")
addHook("LinedefExecute", LunarRestore, "LUNAR")
addHook("LinedefExecute", MJactivate, "MJACK")
addHook("LinedefExecute", AirMeUp, "AIRMEUP")
addHook("LinedefExecute", RasputinShield, "RASHIELD")
addHook("LinedefExecute", RasputinRade, "RARADE")
addHook("LinedefExecute", LeftScores, "LSCOR")
addHook("LinedefExecute", RightScores, "RSCOR")

//really hackish I know.. Sorry, not sorry.
addHook("PlayerSpawn", function(player)
	if (mapheaderinfo[gamemap].lunarcitadel) and player.bot == 0
		player.mo.tank = P_SpawnMobj(player.mo.x, player.mo.y, player.mo.z+player.mo.height, MT_SUIT)
		player.mo.tank.target = player.mo
		P_RemoveMobj(player.mo.tank)
	end
end)

addHook("MapLoad", function()
	lscore = 0
	rscore = 0
	for mt in mapthings.iterate
		if (mt.type == 2300)
			mt.mobj.z = mt.mobj.z + 196
			mt.mobj.spritexscale = 2*FRACUNIT
			mt.mobj.spriteyscale = 2*FRACUNIT
			mt.mobj.lleg1 = P_SpawnMobj(mt.mobj.x+24*FRACUNIT, mt.mobj.y, mt.mobj.z - 32*FRACUNIT, MT_BALLZ)
			mt.mobj.lleg1.target = mt.mobj
			
			mt.mobj.lleg2 = P_SpawnMobj(mt.mobj.x+24*FRACUNIT, mt.mobj.y, mt.mobj.z - 64*FRACUNIT, MT_BALLZ)
			mt.mobj.lleg2.target = mt.mobj
			
			mt.mobj.rleg1 = P_SpawnMobj(mt.mobj.x-24*FRACUNIT, mt.mobj.y, mt.mobj.z - 32*FRACUNIT, MT_BALLZ)
			mt.mobj.rleg1.target = mt.mobj
			
			mt.mobj.rleg2 = P_SpawnMobj(mt.mobj.x-24*FRACUNIT, mt.mobj.y, mt.mobj.z - 64*FRACUNIT, MT_BALLZ)
			mt.mobj.rleg2.target = mt.mobj
			
			mt.mobj.utor = P_SpawnMobj(mt.mobj.x, mt.mobj.y+5, mt.mobj.z + 54*FRACUNIT, MT_BALLZ)
			mt.mobj.utor.target = mt.mobj
			mt.mobj.utor.spritexscale = 2*FRACUNIT
			mt.mobj.utor.spriteyscale = 2*FRACUNIT
			
			mt.mobj.larm1 = P_SpawnMobj(mt.mobj.x+40*FRACUNIT, mt.mobj.y, mt.mobj.z + 96*FRACUNIT, MT_BALLZ)
			mt.mobj.larm1.target = mt.mobj
			
			mt.mobj.larm2 = P_SpawnMobj(mt.mobj.x+40*FRACUNIT, mt.mobj.y, mt.mobj.z + 64*FRACUNIT, MT_BALLZ)
			mt.mobj.larm2.target = mt.mobj
			
			mt.mobj.rarm1 = P_SpawnMobj(mt.mobj.x-40*FRACUNIT, mt.mobj.y, mt.mobj.z + 96*FRACUNIT, MT_BALLZ)
			mt.mobj.rarm1.target = mt.mobj
			
			mt.mobj.rarm2 = P_SpawnMobj(mt.mobj.x-40*FRACUNIT, mt.mobj.y, mt.mobj.z + 64*FRACUNIT, MT_BALLZ)
			mt.mobj.rarm2.target = mt.mobj
			
			mt.mobj.head = P_SpawnMobj(mt.mobj.x, mt.mobj.y, mt.mobj.z + 120*FRACUNIT, MT_BALLZ)
			mt.mobj.head.target = mt.mobj
			mt.mobj.head.state = S_BALLZ2
			P_TryMove(mt.mobj.head,0,0)
		elseif (mt.type == 1642)
			//mt.mobj.keepitlit = P_SpawnMobj(mt.mobj.x, mt.mobj.y, mt.mobj.z+mt.mobj.height, MT_KGLI)
			//mt.mobj.keepitlit.renderflags = RF_FLOORSPRITE|RF_BLENDMASK
			//mt.mobj.keepitlit.blendmode = AST_ADD
		elseif (mt.type == 1644)
			mt.mobj.rshield = P_SpawnMobj(mt.mobj.x, mt.mobj.y, mt.mobj.z+mt.mobj.height, MT_OURO)
			mt.mobj.rshield.target = mt.mobj
			mt.mobj.info.speed = 25
			mt.mobj.info.spawnstate = S_RASP1
			mt.mobj.info.meleestate = S_RASP15
			mt.mobj.info.misslestate = S_RASP7
		end
	end
	
	if (mapheaderinfo[gamemap].lunarcitadel)
		//for player in players.iterate
			if (consoleplayer.mo.x < -14000*FRACUNIT)
				COM_BufInsertText(consoleplayer, 'chasecam off')
			end
		//end
	end
end)

addHook("MobjThinker", function(mo)
	if mo.type == MT_OURO
		mo.rollangle = mo.rollangle + FixedAngle(5*FRACUNIT)
	end
	if mo.type == MT_SOLO
		mo.rollangle = mo.rollangle - FixedAngle(5*FRACUNIT)
	end
end)

addHook("MobjDamage", function(mo,inf,src)
	if (mapheaderinfo[gamemap].lunarcitadel) and mo.player.bot == 0
		if mo.tank.valid
			P_SetMobjStateNF(mo.tank, S_SUIT4)
			//P_RemoveMobj(mo.tank)
			P_PlayRinglossSound(src,mo.player)
			P_RemoveShield(mo.player)
			P_DoPlayerPain(mo.player,src,inf)
			P_PlayerRingBurst(mo.player,1)
		
			mo.player.rings = 0
			mo.player.powers[pw_spacetime] = 12*TICRATE
			return true
		end
	end
end, MT_PLAYER)

//Scrapped. May use for Zodiac..
addHook("ThinkFrame", function()
	if (mapheaderinfo[gamemap].ecredits) 
		for player in players.iterate do
			if (player.realtime == 420)
				//hud.disable("credit1")
				//heehee = heehee - 1
				P_TeleportMove(player.mo,1312,2432,0)
				//hud.vz.disable
			elseif (player.realtime == 4200)
				P_DoPlayerExit(player)
			end
		end
	end
end)

addHook("ThinkFrame", function()
	for mt in mapthings.iterate
		if (mt.type == 2303)
			mt.mobj.rollangle = mt.mobj.rollangle + FixedAngle(1*FRACUNIT)
		end
	end
	
	for player in players.iterate do
		local z = player.mo.z
		if ((player.speed > 30*FRACUNIT) and (thepast == 1))
			if (i % 2)
				P_SpawnMobjFromMobj(player.mo,16*FRACUNIT, 0, 0, MT_SUPERSPARK)
				i = i + 1
				ab = ab + 1
			elseif i == 34
				i = 0
				S_StartSound(player.mo,sfx_cdfm50)
				ab = ab + 1				
			else 
				i = i + 1
				ab = ab + 1
			end
			
			if ab == 101
				S_StartSound(player.mo,sfx_cdfm72)
				thepast = 0
				ab = 0
				i = 0
			end
		end
		
		if (((player.mo.subsector.sector.floorpic == 'LUNSOI') or (player.mo.subsector.sector.floorpic == 'LUNSOI2')) and (player.mo.z == player.mo.floorz))
		if ((player.mo.state == S_PLAY_RUN) or (player.mo.state == S_PLAY_WALK))
			if i == 0
				splat = P_SpawnMobjFromMobj(player.mo,5*FRACUNIT, 0, 0, MT_RFOT)
				splat.renderflags = RF_FLOORSPRITE|RF_NOSPLATBILLBOARD
				splat.angle = player.mo.angle
				i = 1
			elseif i == 4
				splatz = P_SpawnMobjFromMobj(player.mo,-5*FRACUNIT, 0, 0, MT_RFOT)
				splatz.renderflags = RF_FLOORSPRITE|RF_HORIZONTALFLIP|RF_NOSPLATBILLBOARD
				splatz.angle = player.mo.angle
				i = 5
			elseif i == 9
				splat = P_SpawnMobjFromMobj(player.mo,5*FRACUNIT, 0, 0, MT_RFOT)
				splat.renderflags = RF_FLOORSPRITE|RF_NOSPLATBILLBOARD|RF_NOSPLATBILLBOARD
				splat.angle = player.mo.angle
				i = 10
			elseif i == 14
				splatz = P_SpawnMobjFromMobj(player.mo,-5*FRACUNIT, 0, 0, MT_RFOT)
				splatz.renderflags = RF_FLOORSPRITE|RF_HORIZONTALFLIP|RF_NOSPLATBILLBOARD
				splatz.angle = player.mo.angle
				i = 15
			elseif i == 20
				splatz = P_SpawnMobjFromMobj(player.mo,5*FRACUNIT, 0, 0, MT_RFOT)
				splatz.renderflags = RF_FLOORSPRITE|RF_NOSPLATBILLBOARD
				splatz.angle = player.mo.angle
				i = 21
			elseif i == 24
				splatz = P_SpawnMobjFromMobj(player.mo,-5*FRACUNIT, 0, 0, MT_RFOT)
				splatz.renderflags = RF_FLOORSPRITE|RF_HORIZONTALFLIP|RF_NOSPLATBILLBOARD
				splatz.angle = player.mo.angle
				i = 25
			elseif i == 29
				splatz = P_SpawnMobjFromMobj(player.mo,-5*FRACUNIT, 0, 0, MT_RFOT)
				splatz.renderflags = RF_FLOORSPRITE|RF_HORIZONTALFLIP|RF_NOSPLATBILLBOARD
				splatz.angle = player.mo.angle
				i = 30
			elseif i == 34
				i = 0
			else
				i = i + 1
			end
		end
		end
	
		if not (player.cmd.buttons & BT_CUSTOM1) then 
			player.spintapready = true
			player.spintapping = false
		elseif player.spintapready then
			if heehee > 0
				player.spintapping = true
				player.spintapready = false
			else
				player.spintapready = true
				player.spintapping = false
			end
		else
			player.spintapping = false
		end
		
		local tectonic = P_RandomRange(0, 11)
		
		if player.spintapping then
			muspos = S_GetMusicPosition()
			if tectonic == 0
				P_PlayJingleMusic(player, "DANC1", nil, false, JT_OTHER)
			elseif tectonic == 1
				P_PlayJingleMusic(player, "DANC2", nil, false, JT_OTHER)
			elseif tectonic == 2
				P_PlayJingleMusic(player, "DANC3", nil, false, JT_OTHER)
			elseif tectonic == 3 
				P_PlayJingleMusic(player, "DANC4", nil, false, JT_OTHER)
			elseif tectonic == 4
				P_PlayJingleMusic(player, "DANC5", nil, false, JT_OTHER)
			elseif tectonic == 5
				P_PlayJingleMusic(player, "DANC6", nil, false, JT_OTHER)
			elseif tectonic == 6
				P_PlayJingleMusic(player, "DANC7", nil, false, JT_OTHER)
			elseif tectonic == 7
				P_PlayJingleMusic(player, "DANC8", nil, false, JT_OTHER)
			elseif tectonic == 8
				P_PlayJingleMusic(player, "DANC9", nil, false, JT_OTHER)
			elseif tectonic == 9
				P_PlayJingleMusic(player, "DANC10", nil, false, JT_OTHER)
			elseif tectonic == 10
				P_PlayJingleMusic(player, "DANC11", nil, false, JT_OTHER)
			elseif tectonic == 11
				P_PlayJingleMusic(player, "DANC12", nil, false, JT_OTHER)
			end
			heehee = heehee - 1
			player.mo.state = S_MJAC1
			player.powers[pw_invulnerability] = 280
			player.powers[pw_nocontrol] = 280
			player.mo.damage = 1024*FRACUNIT
			local dump = {}
			local mindist = FixedMul(player.mo.scale, MAX_DANCE_RANGE) / FRACUNIT
			local removekey = 0
			local add

			local dist = mindist/2
			local x, y, z = player.mo.x + dist*cos(player.mo.angle), player.mo.y + dist*sin(player.mo.angle), player.mo.z
			local tcheck = P_SpawnMobj(x, y, z, MT_NULL)

			local maxrange = FixedMul(MAX_DANCE_RANGE/2, player.mo.scale)
			searchBlockmap("objects", enemy_dance, player.mo, tcheck.x - maxrange, tcheck.x + maxrange, tcheck.y - maxrange, tcheck.y + maxrange)
		end
	end
end)