

//***Che: Dr Frankenstein, meet MY monster... I mean, boss cube.

// A vital part of this logic (including spawn lists) 
// is inside map ACS inside eday32.wad and eday313.wad

Actor IosNumberOfCubesInFlight: Inventory
{
	// actually, no more than 8 in flight at any given time
	inventory.maxamount 1000
}

ACTOR IosBossCubeMkIIA_Abstract
// the A version of the cube is an absolute ghost moved by the ACS map script that spawns it
{
	// red
	Translation  "61:79=168:188", "48:61=224:227", "144:151=183:183", "101:111=180:191", "13:15=186:186", "0:2=0:0"
	+BRIGHT
	
	+NOBLOCKMAP // Is excluded from passive collision detection. 
		// Nothing else can run into a NOBLOCKMAP actor but the actor himself can run into others.	
	+NOINTERACTION // has no collision with walls
	-NOCLIP // but is still affected by floors and ceilings
	+NOGRAVITY
	RenderStyle Add
	Alpha 0.8	
	Radius 20
	Height 40
	var int user_moncount; // is set by the map ACS that spawns us
	States
	{
		Spawn:
			BOSF ABCD 3
			Loop

		FlashOut: // reached via ACS
			TNT1 A 0 A_PlaySound("pain/death")
			TNT1 A 0 A_SpawnItemEx("IosBossCubeExplosion",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION,0)
			TNT1 A 10
			Stop
	}
}


ACTOR IosBossCubeMkIIA: IosBossCubeMkIIA_Abstract	
{
	// red
	Translation  "61:79=168:188", "48:61=224:227", "144:151=183:183", "101:111=180:191", "13:15=186:186", "0:2=0:0"
	+BRIGHT
}

ACTOR IosBossCubeMkIIA_Bikstronk: IosBossCubeMkIIA_Abstract	
{
	// gold
	Translation  "61:79=160:167", "48:61=224:227", "144:151=167:167", "101:111=162:167", "13:15=166:166", "0:2=0:0", "5:5=189:189"
	Scale 1.6
}



/*
ACTOR IosBossCubeMkIIB_Abstract {
	// the B version is a seeker missile endemic to map 32, the second stage of IOS.

	+MISSILE 
	+SEEKERMISSILE
	+THRUSPECIES  // checks the *target's* species, not missile's
	+MTHRUSPECIES
	Speed 16
	
	BounceType "Doom"
	BounceFactor 0.99
	+ALLOWBOUNCEONACTORS
	+BOUNCEONACTORS
	+BOUNCEONWALLS
	+BOUNCEONFLOORS
	+BOUNCEONCEILINGS	
	
	Radius 20
	Height 40
	
	var int user_moncount;
	var int user_mycircdir;
	var int user_wobble_angle;
	var int user_wobble_pitch;	
	var int user_lifetime;
	
	+BRIGHT
	+NOGRAVITY 
	
	RenderStyle Add
	Alpha 0.8
	
	States {
		Spawn:
			BOSF B 1
			"----" A 0 A_PlaySound("brain/spit")
			BOSF ABCD 3 BRIGHT A_SpawnItemEx("RedFlare3BossCubeSpawn", 0,0,0, 0,0,0, 0,SXF_NOCHECKPOSITION)
			"----" A 0 A_SetUserVar("user_lifetime", 20 * 35) // 20 seconds
		FlyAway:	
			"----" A 0 A_FaceTarget
			"----" A 0 A_SetAngle(angle + 180)
			BOSF ABCD 3 BRIGHT 
		FlyHoming:
			"----" A 0 A_JumpIf(CallAcs("IsBossDead"), "FlashOut")
			"----" A 0 A_JumpIfInventory("SummonsCount", 1, "FlashOut")
			
			"----" A 0 A_SetUserVar("user_lifetime", user_lifetime - 12)
		
			"----" A 0 A_JumpIf(z - floorz > 400 || z > 600, "SteerDown")
			"----" A 0 A_JumpIf(z - floorz < 150, "SteerUp")
			"----" A 0 A_SetUserVar("user_wobble_pitch", user_wobble_pitch + Random(-3, 3))
			Goto Home
		SteerDown:
			"----" A 0 A_SetUserVar("user_wobble_pitch", z < 400 ? Random(-3, -1) : -6)
			Goto Home
		SteerUp:
			"----" A 0 A_SetUserVar("user_wobble_pitch", z - floorz > 100 ? Random(1, 3) : 6)
			Goto Home
		Home:
			// diminishes slowly approaching zero, to avoid runaway effect
			"----" A 0 A_SetUserVar("user_wobble_pitch", user_wobble_pitch > 1 ? user_wobble_pitch - 1 : (user_wobble_pitch < 1 ? user_wobble_pitch + 1 : user_wobble_pitch))		
			"----" A 0 A_ChangeVelocity(momx, momy, momz * 0.9 + 0.1 * user_wobble_pitch, CVF_REPLACE)
		
			// this jump uses target, i.e. the boss himself. Keep flying *away* from him until far enough away!
			"----" A 0 A_JumpIfCloser(800, "FlyAway")
			TNT1 A 0 A_JumpIf(user_lifetime <= 0, "TrySpawn")
		
			BOSF ABCD 3 BRIGHT
			
			// JLOSF_PROJECTILE causes to check tracer instead of target because we are a seeker missile
			TNT1 A 0 A_JumpIfTargetInLOS("StartCirclingLikeShark", 0, JLOSF_PROJECTILE, 400)
				
			TNT1 A 0 A_SetUserVar("user_wobble_angle", user_wobble_angle + Random(-3, 3))
			TNT1 A 0 A_SetAngle(angle + user_wobble_angle)
			
			TNT1 A 0 A_JumpIfTargetInLOS("FlyAtTarget", 0, JLOSF_PROJECTILE, 3000) //1200)
			TNT1 A 0 A_JumpIf(user_lifetime % 3 == 1, "FlyAtTarget")
			
			Loop
		
		FlyAtTarget:
			TNT1 A 0 A_SeekerMissile (16,32, SMF_LOOK | SMF_PRECISE, 256, 14)
			// without this momz dampening it bounces with slowly increasing amplitude!
			TNT1 A 0 A_ChangeVelocity(momx, momy, momz * 0.9 + 0.1 * user_wobble_pitch, CVF_REPLACE)
			Goto FlyHoming
			
		StartCirclingLikeShark:
			"----" A 0 A_JumpIf(user_mycircdir != 0, "CircleLikeShark")
			"----" A 0 A_SetUserVar("user_mycircdir", Random(0, 1) ? 1 : -1)
		CircleLikeShark:
			"----" A 0 A_JumpIfTargetInLOS("SteerAway", 0, JLOSF_PROJECTILE, 200)
			"----" A 0 ACS_NamedExecuteWithResult("FaceClosestPlayer")
			"----" A 0 A_SetAngle(angle + 90.0 * user_mycircdir)
			BOSF ABCD 3
			"----" A 0 A_JumpIf(CallAcs("GetDistanceToClosestPlayer") < 300, "FlyHoming") 
			"----" A 0 A_Jump(30, "TrySpawn")
			Goto FlyHoming // perform vertical steer too!
		SteerAway: 
			"----" A 0 ACS_NamedExecuteWithResult("FaceClosestPlayer")
			"----" A 0 A_SetAngle(angle + 110.0 * user_mycircdir)
			BOSF ABCD 3
			Goto FlyHoming

		Death: // Hit a wall, died. Bad luck.
			TNT1 A 0 A_PlaySound("pain/death")
			BOSF ABCDABCDABCDABCDABCDABCDABCD 3 A_FadeOut(0.04)
			Stop
		
		FlashOut: 
			TNT1 A 0 A_PlaySound("pain/death")
			TNT1 A 0 A_SpawnItemEx("IosBossCubeExplosion",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION,0)
			TNT1 A 100 A_Stop
			Stop

		TrySpawn:
			"----" A 0 ACS_NamedExecuteWithResult("BossCubeTrySpawn", 0)
			BOSF ABCD 3
			Goto FlyHoming
	}
}

ACTOR IosBossCubeMkIIB: IosBossCubeMkIIB_Abstract	
{
	// red
	Translation  "61:79=168:188", "48:61=224:227", "144:151=183:183", "101:111=180:191", "13:15=186:186", "0:2=0:0"
	+BRIGHT
}

ACTOR IosBossCubeMkIIB_Bikstronk: IosBossCubeMkIIB_Abstract	
{
	// gold
	Scale 1.6
	Translation  "61:79=160:167", "48:61=224:227", "144:151=167:167", "101:111=162:167", "13:15=166:166", "0:2=0:0", "5:5=189:189"
	States
	{
		TrySpawn:
			"----" A 0 ACS_NamedExecuteWithResult("BossCubeTrySpawn", 1)
			BOSF ABCD 3
			Goto FlyHoming	
	}
}
*/

// 3rd stage bosses' offsets (sprite KPRM D): x 124 * 2.8 = 347, y = -19 * 2.8 = -53, z = 245 * 2.8 = 686,

ACTOR IosBossCubeFirer: FastProjectile // Boss is thicc :(
{
	DamageType None
	Damage (random (0, 0))
	+THRUACTORS
	+SEEKERMISSILE // otherwise targeting is not conveyed from the boss to the cube
	Radius 20
	Height 40
	Speed 250
	States
	{
		Spawn:
			TNT1 A 1
			TNT1 A 0 A_CustomMissile("IosBossCubeMkIIB", 0, 0, 0, CMF_AIMDIRECTION | CMF_TRACKOWNER | CMF_ABSOLUTEPITCH | CMF_SAVEPITCH, pitch)
			TNT1 A 1 A_Stop
			Stop
		Death: // hit wall. Pretend nothing happened!
			TNT1 A 1
			Stop
	}
}

ACTOR IosBossCubeFirer_Bikstronk: IosBossCubeFirer 
{
	States
	{
		Spawn:
			TNT1 A 1
			TNT1 A 0 A_CustomMissile("IosBossCubeMkIIB_Bikstronk", 0, 0, 0, CMF_AIMDIRECTION | CMF_TRACKOWNER | CMF_ABSOLUTEPITCH | CMF_SAVEPITCH, pitch)
			TNT1 A 1 A_Stop
			Stop
	}
}

Actor BossCubeTrail5 { 
	// for beams that strike from the cube to the monster spawned
	// ( map script analogous to LAZRBEAM.acs )

	radius 12
	height 3
	+FORCEXYBILLBOARD
	+CLIENTSIDEONLY
	+NOBLOCKMAP
	+NOGRAVITY
	+NOINTERACTION
	+NOTELEPORT
	renderstyle ADD
	alpha 0.6
	states	{
		Spawn:
			// alas, cannot flip the Y scale: sprite not centered, origin 32 map units below the desided point
			TFOG ABCDCDCDCBA 1 A_SetScale ((Random(0,1) ? -0.1 : 0.1) * Random(6,13), 0.1 * Random(8,13))
			Stop
	}
}

ACTOR RedFlare3BossCubeSpawn : Flare_General
{
	+BRIGHT
	var int user_life;
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_SetUserVar("user_life", 4)
		Live:	
			TNT1 A 0 A_JumpIf(user_life < 1, "Vanish")
			TNT1 A 0 A_SetUserVar("user_life", user_life - 1)
			TNT1 A 0 A_Jump(192, "Flare2", "Flare3", "Flare4")
		Flare1:
			LEYS R 1 A_SetScale((Random(1,0) ? 0.1 : -0.1) * Random(20, 40), (Random(1,0) ? 0.1 : -0.1) * Random(15, 27))
			Goto Live
		Flare2:
			FLAR B 1 A_SetScale((Random(1,0) ? 0.1 : -0.1) * Random(20, 40), (Random(1,0) ? 0.1 : -0.1) * Random(15, 27))
			Goto Live
		Flare3:
			L2NR A 1 A_SetScale((Random(1,0) ? 0.1 : -0.1) * Random(20, 40), (Random(1,0) ? 0.1 : -0.1) * Random(15, 27))
			Goto Live
		Flare4:
			LENR A 1 A_SetScale((Random(1,0) ? 0.1 : -0.1) * Random(20, 40), (Random(1,0) ? 0.1 : -0.1) * Random(15, 27))
			Goto Live
		Vanish:
			TNT1 A 0
			Stop
	}
}

ACTOR IosBossCubeExplosionFlames: FireballExplosionFlames	
{
	+NOINTERACTION
	+NOCLIP

/*	
Script error, "chebskies-EDAY-2.pk3:eday313actors.txt" line 261:
"NOSAVEGAME" is an unknown flag


Execution could not continue.
	
	+NOSAVEGAME
*/	
}


ACTOR IosBossCubeExplosion // pure sfx
{
	// These 2 flags make the actor have no collision at all -- including the map geometry.
	+NOINTERACTION 
	+NOCLIP
	
	+CLIENTSIDEONLY
	+NOGRAVITY
	States
	{
		Spawn:
			TNT1 AAAAAA 1 A_CustomMissile ("IosBossCubeExplosionFlames", random(8,80), random(-5,5), random (0, 360), 2, random (0, 90))
			TNT1 AAAAAA 1 A_CustomMissile ("IosBossCubeExplosionFlames", random(30,90), random(-10,10), random (0, 360), 2, random (0, 90))
			TNT1 AAAAAA 1 A_CustomMissile ("IosBossCubeExplosionFlames", random(50,100), random(-15,15), random (0, 360), 2, random (0, 90))
			TNT1 AAAAAA 1 A_CustomMissile ("IosBossCubeExplosionFlames", random(70,110), random(-30,30), random (0, 360), 2, random (0, 90))
			TNT1 AAAAAA 1 A_CustomMissile ("IosBossCubeExplosionFlames", random(90,120), random(-45,45), random (0, 360), 2, random (0, 90))
			TNT1 AAAAAA 1 A_CustomMissile ("IosBossCubeExplosionFlames", random(110,130), random(-55,55), random (0, 360), 2, random (0, 90))
			Stop
	}
}

ACTOR IosBossCubeBoo // pure sfx
{
	PainSound "KYBOCUB1"
	+NOINTERACTION 
	+NOCLIP
	
	+CLIENTSIDEONLY
	+NOGRAVITY
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 1 A_Scream
			TNT1 A 1
			Stop
	}
}

ACTOR IosBossCubeBoo3: IosBossCubeBoo
{
	PainSound "KYBOCUB3"
}




















// ============================== OBSOLETE SHIT BELOW ==============================
/*
Actor IosBossCubeAbstract {

	// not a monster because arena edge has blockmonsters
	+MISSILE 
	+SEEKERMISSILE
	+THRUSPECIES
	+MTHRUSPECIES
	Speed 16
	
	BounceType "Doom"
	BounceFactor 0.9
	+ALLOWBOUNCEONACTORS
	+BOUNCEONACTORS
	+BOUNCEONWALLS
	+BOUNCEONFLOORS
	+BOUNCEONCEILINGS	
	
	+SHOOTABLE	
	
	+NOICEDEATH
	damagefactor "IOS_Frost", 0.0
	
	+NOBLOOD 
	-PUSHABLE
	// will become a monster later
	-COUNTKILL
	+NOPAIN
	 // will lose nogravity later 
	-NOGRAVITY
	Gravity 0.05
	Mass 300
	Radius 40
	Height 90
	Scale 2.0
	Health 200
	DeathSound "misc/bryed3d_firexp"
	SeeSound None // cannot use because we spawn as a missile
	var int user_level;
	var int user_delay;
	var int user_lifetime;
	var int user_wobble_angle;
	var int user_wobble_pitch;
	var int user_arrived;	
	States {
		
		// the spawn state is for children, they set user_level
		AfterSpawn:
			TNT1 A 0 A_SetUserVar("user_lifetime", -1) // vanish silently on death
			TNT1 A 0 A_GiveInventory("IosNumberOfCubesInFlight", 1, AAPTR_TARGET)
			Goto FlyInvisible
		FlyInvisible:
			TNT1 A 10
			TNT1 A 0 A_ChangeFlag("THRUSPECIES", 0)
			TNT1 A 0 A_ChangeFlag("MTHRUSPECIES", 0)
			TNT1 A 0 A_SetUserVar("user_lifetime", 175) // 60 seconds
			TNT1 A 0 A_SpawnItemEx("RedFlare3", 0,0,0, 0,0,0, 0,SXF_NOCHECKPOSITION)
			TNT1 A 0 A_PlaySound("brain/spit")

		Fly:
			BOSF ABCD 3 BRIGHT
			
			TNT1 A 0 A_SetUserVar("user_lifetime", user_lifetime - 1)
			TNT1 A 0 A_JumpIf(user_lifetime <= 0, "DoDie") // if expired, 
			// drop our load right there. The monster may go splat from falling damage.
			
			// JLOSF_PROJECTILE causes to check tracer instead of target because we are a seeker missile
			TNT1 A 0 A_JumpIfTargetInLOS("Arrived", 0, JLOSF_PROJECTILE, 400)
			
			
			// all those max, min, sin -- they are gzdoom only. Zandronum crashes at startup.
			TNT1 A 0 A_SetUserVar("user_wobble_angle", user_wobble_angle + Random(-3, 3))
			TNT1 A 0 A_SetUserVar("user_wobble_pitch", user_wobble_pitch + Random(-3, 3))
			
			// diminishes slowly approaching zero, to avoid runaway effect
			TNT1 A 0 A_SetUserVar("user_wobble_pitch", user_wobble_pitch > 1 ? user_wobble_pitch - 1 : (user_wobble_pitch < 1 ? user_wobble_pitch + 1 : user_wobble_pitch))
			
			TNT1 A 0 A_SetAngle(angle + user_wobble_angle)
			
			TNT1 A 0 A_JumpIfTargetInLOS("FlyAtTarget", 0, JLOSF_PROJECTILE, 3000) //1200)
			TNT1 A 0 A_JumpIf(user_lifetime % 8 == 1, "FlyAtTarget")
			// do not dip below 500  
			//TNT1 A 0 A_ChangeVelocity(momx, momy, z > 500 ? momz + 0.1 * user_wobble_pitch : (0.1 * user_wobble_pitch > 0 ? 0.1 * user_wobble_pitch : 0), CVF_REPLACE)
			TNT1 A 0 A_ChangeVelocity(momx, momy, momz + 0.1 * user_wobble_pitch, CVF_REPLACE)
			
			TNT1 A 0 A_JumpIf(z > 2900 || z - floorz < 48, "DoDie") 
				// if they pierce the cloud layer, the cube bursts and monster falls down.
				// if the cube touches the ground it spawns
			Loop
		
		FlyAtTarget:
			TNT1 A 0 A_SeekerMissile (16,32, SMF_PRECISE)
			TNT1 A 0 A_ChangeVelocity(momx, momy, momz + 0.1 * user_wobble_pitch, CVF_REPLACE)
			Goto Fly
		
		Arrived:
			TNT1 A 0 A_Stop
			TNT1 A 0 A_TakeInventory("IosNumberOfCubesInFlight", 1, AAPTR_TARGET)
			TNT1 A 0 A_ChangeFlag("MISSILE", 0)
			TNT1 A 0 A_ChangeFlag("ISMONSTER", 1)
			TNT1 A 0 A_RearrangePointers(AAPTR_NULL, AAPTR_NULL, AAPTR_NULL, 0) // basically clear target
			TNT1 A 0 A_ChangeFlag("NOGRAVITY", 0)
			TNT1 A 0 A_SetUserVar("user_arrived", 1)
		Spin:	
			BOSF ABCD 3 BRIGHT
			TNT1 A 0 A_Look
			Loop	
		See:
			TNT1 A 0 A_SetUserVar("user_delay", random(8,13))
			
			// say "Boo!"
			// cannot make this our SeeSound because we spawn as a missile
			TNT1 A 0 A_JumpIf(user_level >= 3, "Boo3")
			TNT1 A 0 A_PlaySound("KYBOCUB1", CHAN_VOICE)
			Goto SpinActive
		Boo3:
			TNT1 A 0 A_PlaySound("KYBOCUB3", CHAN_VOICE)
			Goto SpinActive
		SpinActive:	
			BOSF ABCD 3 BRIGHT A_FaceTarget
			TNT1 A 0 A_SetUserVar("user_delay", user_delay - 1)
			
			TNT1 A 0 A_JumpIf(user_delay <= 0, "DoDie")
			//, "Death")
			// fucking how many times must I remind myself,
			// NEVER, EVER jump to the death state!
			// Bad things happen! The game engine
			// does not conside actor dead
			// in this case resulting in monsters getting stuck mid-air
			// or the cube dying twice, with two monsters stuck mid-air
			// inside each other!
			// Always, FUCKING ALWAYS, invoke A_Die!
			// (unless one death state jumps to another death state)
			
			Loop
		DoDie:
			TNT1 A 0 A_Die
			
		Death:
		XDeath:
			TNT1 A 0 A_JumpIf(user_lifetime < 0, "Vanish") // blew too close to the boss!
				// pretend we never even existed.
				
			TNT1 A 0 A_NoBlocking
			
			TNT1 A 0 A_JumpIf(user_arrived, 2)
			TNT1 A 0 A_JumpIfCloser(300, "Splat") // too close to the boss, 
				// don't spawn anything to avoid blocking him
				
			TNT1 A 0 A_Scream
			
			TNT1 A 0 A_JumpIf(user_arrived, 2)
			TNT1 A 0 A_TakeInventory("IosNumberOfCubesInFlight", 1, AAPTR_TARGET)
			TNT1 A 0 ACS_NamedExecuteWithResult("SpawnerSpawnMob", user_level - 1)
		Fireworks:
			TNT1 AAAAAA 0 A_CustomMissile ("MuchBlood", 32, 0, random (0, 360), 2, random (65, 90))
			TNT1 AAAAAA 1 A_CustomMissile ("FireballExplosionFlames", random(8,80), random(-5,5), random (0, 360), 2, random (0, 90))
			TNT1 AAAAAA 1 A_CustomMissile ("FireballExplosionFlames", random(30,90), random(-10,10), random (0, 360), 2, random (0, 90))
			TNT1 AAAAAA 1 A_CustomMissile ("FireballExplosionFlames", random(50,100), random(-15,15), random (0, 360), 2, random (0, 90))
			TNT1 AAAAAA 1 A_CustomMissile ("FireballExplosionFlames", random(70,110), random(-30,30), random (0, 360), 2, random (0, 90))
			TNT1 AAAAAA 1 A_CustomMissile ("FireballExplosionFlames", random(90,120), random(-45,45), random (0, 360), 2, random (0, 90))
			TNT1 AAAAAA 1 A_CustomMissile ("FireballExplosionFlames", random(110,130), random(-55,55), random (0, 360), 2, random (0, 90))
			TNT1 A 35 // Stop makes scripts lose their activator. Wait for them to run!
			Stop
		Vanish:
			TNT1 A 1
			Stop
		Splat:
			TNT1 AAAAAA 0 A_CustomMissile ("MuchBlood", 32, 0, random (0, 360), 2, random (65, 90))
			TNT1 A 0 A_SpawnItemEx("MuchMeatDeath", 0,0,40, 0,0,0, 0,SXF_NOCHECKPOSITION)
			TNT1 A 1 A_XScream
			Stop
	}
}

Actor IosBossCube0: IosBossCubeAbstract {
	// gray
	Translation "61:79=93:111", "48:61=80:92", "144:151=105:109", "101:111=109:111", "13:15=108:111", "0:2=0:0", "5:5=5:5"
	States {
		Spawn:
			BOSF B 0 NODELAY A_SetUserVar("user_level", 1)
			Goto AfterSpawn
	}
}

Actor IosBossCube1: IosBossCubeAbstract {
	// red
	Translation  "61:79=168:188", "48:61=224:227", "144:151=183:183", "101:111=180:191", "13:15=186:186", "0:2=0:0"
	States {
		Spawn:
			BOSF B 0 NODELAY A_SetUserVar("user_level", 2)
			Goto AfterSpawn
	}
}

Actor IosBossCube2: IosBossCubeAbstract {
	// gold
	Translation  "61:79=160:167", "48:61=224:227", "144:151=167:167", "101:111=162:167", "13:15=166:166", "0:2=0:0", "5:5=189:189"
	States {
		Spawn:
			BOSF B 0 NODELAY A_SetUserVar("user_level", 3)
			Goto AfterSpawn
	}
}





// Old-style Chebskies 1.x spawners, now used in map 313

Actor IosSpawnerBase: IosBossCubeAbstract
{
	Gravity 0.05
	+WINDTHRUST
	-MISSILE
	+SOLID // must block teleporting several ones into the same position
}

Actor IosSpawner0: IosSpawnerBase {
	// gray
	Translation "61:79=93:111", "48:61=80:92", "144:151=105:109", "101:111=109:111", "13:15=108:111", "0:2=0:0", "5:5=5:5"
	States {
		Spawn:
			BOSF B 0 NODELAY A_SetUserVar("user_level", 1)
			Goto Arrived
	}
}

Actor IosSpawner1: IosSpawnerBase {
	// red
	Translation  "61:79=168:188", "48:61=224:227", "144:151=183:183", "101:111=180:191", "13:15=186:186", "0:2=0:0"
	States {
		Spawn:
			BOSF B 0 NODELAY A_SetUserVar("user_level", 2)
			Goto Arrived
	}
}

Actor IosSpawner2: IosSpawnerBase {
	// gold
	Translation  "61:79=160:167", "48:61=224:227", "144:151=167:167", "101:111=162:167", "13:15=166:166", "0:2=0:0", "5:5=189:189"
	SeeSound "KYBOCUB3"
	States {
		Spawn:
			BOSF B 0 NODELAY A_SetUserVar("user_level", 3)
			Goto Arrived
	}
}	

*/