class SnowSpawner : SwitchableDecoration
{
	Default
	{
		+CLIENTSIDEONLY;
		+NOBLOCKMAP;
		+NOGRAVITY;
		+SPAWNCEILING;
	}
	States
	{
	Spawn:
	Active:
		TNT1 A 2 A_SpawnItemEx("SnowFlakeRandom", random[SquareEffectRandom](-256,256), random[SquareEffectRandom](-256,256), 0, 0, 0, 0, 0, 0, 64);
		Loop;
	InActive:
		TNT1 A -1;
		Stop;
	}
}

class SnowFlake : SquareActor
{
	Default
	{
		Projectile;
		-NOGRAVITY;
		+DONTSPLASH;
		+DONTBLAST;
		+CLIENTSIDEONLY;
		+FORCEXYBILLBOARD;

		Speed 0;
		Damage 0;
		Radius 1;
		Height 1;
		Scale 1.5;
		Alpha 0.8;
		RenderStyle 'Translucent';
	}
	States
	{
	Spawn:
		TNT1 A 1;
		TNT1 A 0 A_JumpIf(waterlevel==1, "WaterDeath");
		TNT1 A 0 A_Jump(256,1,2,3,4,5);
		TNT1 AAAAA 1;
		SNOW A 1 A_JumpIf(waterlevel==3, "Death");
		Goto Spawn+8;
	Death:
		SNOW A 0 A_Jump(256,1,2,3,4);
		SNOW AAAA 2;
		Stop;
	WaterDeath:
		TNT1 A 1;
		Stop;
	}
}

class SnowFlakeRandom : RandomSpawner
{
	Default
	{
		DropItem 'SnowFlake1', 255, 1;
		DropItem 'SnowFlake2', 255, 1;
		DropItem 'SnowFlake3', 255, 1;
		DropItem 'SnowFlake4', 255, 1;
	}
}

class SnowFlake1 : SnowFlake { Default { Gravity 0.0125; } }
class SnowFlake2 : SnowFlake { Default { Gravity 0.0250; Scale 1.25; } }
class SnowFlake3 : SnowFlake { Default { Gravity 0.0375; Scale 1.00; } }
class SnowFlake4 : SnowFlake { Default { Gravity 0.0500; Scale 0.75; } }

class RainSpawner : SwitchableDecoration
{
	int intensity;
	int time;

	Default
	{
		+CLIENTSIDEONLY
		+NOBLOCKMAP
		+NOGRAVITY
		+SPAWNCEILING
		Args 255, 64, 0;
	}
	States
	{
	Spawn:
	Active:
		TNT1 A 0;
	Setup:
		TNT1 A 0 { self.intensity = 1; } // [XA] I'll refactor this later during performance-tuneup time.
		TNT1 A 0 { self.time = 0; }      // Just keeping this as close to a 1:1 translation as possible.
	LightRain:
		TNT1 A 0 A_SpawnItemEx("RainDrop1", random[SquareEffectRandom](args[0]*-1,args[0]), random[SquareEffectRandom](args[0]*-1,args[0]), 0, 0, 0, 0, 0, 0, args[1]);
		TNT1 A 1;
		TNT1 A 0 A_JumpIf(args[2]==1, 1);
		Loop;
		TNT1 A 0 { self.time += 1; }
		TNT1 A 0 A_JumpIf(time > 1575, "Time");
		Loop;
	MediumRain:
		TNT1 AAA 0 A_SpawnItemEx("RainDrop2", random[SquareEffectRandom](args[0]*-1,args[0]), random[SquareEffectRandom](args[0]*-1,args[0]), 0, 0, 0, 0, 0, 0, args[1]);
		TNT1 A 1;
		TNT1 A 0 { self.time += 1; }
		TNT1 A 0 A_JumpIf(time > 1575, "Time");
		Loop;
	HeavyRain:
		TNT1 AAAAA 0 A_SpawnItemEx("RainDrop3", random[SquareEffectRandom](args[0]*-1,args[0]), random[SquareEffectRandom](args[0]*-1,args[0]), 0, 0, 0, 0, 0, 0, args[1]);
		TNT1 A 1;
		TNT1 A 0 { self.time += 1; }
		TNT1 A 0 A_JumpIf(time > 1575, "Time");
		Loop;
	Time:
		TNT1 A 0 { self.time = 0; }
		TNT1 A 0 { self.intensity += 1; }
		TNT1 A 0 A_JumpIf(intensity == 2, "MediumRain");
		TNT1 A 0 A_JumpIf(intensity == 3, "HeavyRain");
		TNT1 A 0 A_JumpIf(intensity == 4, "MediumRain");
		TNT1 A 0 { self.intensity = 1; }
		Goto LightRain;
	InActive:
		TNT1 A -1;
		Stop;
	}
}

class RainDrop1 : SquareActor
{
	Default
	{
		Projectile;
		-NOGRAVITY;
		+DONTSPLASH;
		+DONTBLAST;
		+CLIENTSIDEONLY;
		+FORCEXYBILLBOARD;

		Speed 0;
		Damage 0;
		Radius 1;
		Height 1;
		Alpha 0.8;
		RenderStyle 'Add';
	}
	States
	{
	Spawn:
		TNT1 A 1;
		TNT1 A 0 A_JumpIf(waterlevel>=1, "Death");
		RAIN A 1;
		Goto Spawn+1;
	Death:
		RAIN A 0 A_NoGravity();
		RAIN A 0 A_Stop();
		RAIN BCDE 2;
		Stop;
	}
}

class RainDrop2 : RainDrop1
{
	Default
	{
		Scale 1.33;
		Gravity 1.33;
	}
}

class RainDrop3 : RainDrop1
{
	Default
	{
		Scale 1.66;
		Gravity 1.66;
	}
}

class DripSpawner : SwitchableDecoration
{
	Default
	{
		+NOBLOCKMAP;
		+NOGRAVITY;
		+SPAWNCEILING;
		+CLIENTSIDEONLY;
	}
	States
	{
	Spawn:
	Active:
		TNT1 A 0;
		TNT1 A 7 A_SpawnItemEx("RainDrop1", 0, 0, 0, 0, 0, 0, 0, 0, 240);
		Loop;
	Inactive:
		TNT1 A -1;
		Stop;
	}
}

class BubbleSpawner : SwitchableDecoration
{
	Default
	{
		+NOBLOCKMAP;
		+NOGRAVITY;
		+CLIENTSIDEONLY;
	}
	States
	{
	Spawn:
	Active:
		TNT1 A 0;
		TNT1 A 7 A_SpawnItemEx("RandomBubble", 0, 0, 0, frandom[SquareEffectRandom](-0.5, 0.5), frandom[SquareEffectRandom](-0.5, 0.5), random[SquareEffectRandom](1,3), 0, 0, 128);
		Loop;
	Inactive:
		TNT1 A -1;
		Stop;
	}
}

class RandomBubble : RandomSpawner
{
	Default
	{
		DropItem 'Bubble1';
		DropItem 'Bubble2';
		DropItem 'Bubble3';
	}
}

class SquareBubble : SquareActor
{
	Default
	{
		Projectile;
		+DONTBLAST;
		+DONTSPLASH;
		+CLIENTSIDEONLY;
		+FORCEXYBILLBOARD;

		Radius 3;
		Height 3;
		Damage 0;
	}
}

class Bubble1 : SquareBubble
{
	States
	{
	Spawn:
		BUBB A 0;
		BUBB A 0 A_Jump(256, 1, 2, 3);
		BUBB AAA 7;
		Stop;
	}
}

class Bubble2 : SquareBubble
{
	States
	{
	Spawn:
		BUBB A 0;
		BUBB A 0 A_Jump(256, 1, 2, 3);
		BUBB AAABBB 6;
		Stop;
	}
}

class Bubble3 : SquareBubble
{
	States
	{
	Spawn:
		BUBB A 0;
		BUBB A 0 A_Jump(256, 1, 2, 3);
		BUBB AAABBBCCC 5;
		Stop;
	}
}
