TShock/Terraria/Cloud.cs
2011-05-28 20:49:41 -06:00

210 lines
7.5 KiB
C#

namespace Terraria
{
using Microsoft.Xna.Framework;
using System;
public class Cloud
{
public bool active;
public int height;
public Vector2 position;
private static Random rand = new Random();
public float rotation;
public float rSpeed;
public float scale;
public float sSpeed;
public int type;
public int width;
public static void addCloud()
{
int index = -1;
for (int i = 0; i < 100; i++)
{
if (!Main.cloud[i].active)
{
index = i;
break;
}
}
if (index >= 0)
{
Main.cloud[index].rSpeed = 0f;
Main.cloud[index].sSpeed = 0f;
Main.cloud[index].type = rand.Next(4);
Main.cloud[index].scale = rand.Next(8, 13) * 0.1f;
Main.cloud[index].rotation = rand.Next(-10, 11) * 0.01f;
Main.cloud[index].width = (int) (Main.cloudTexture[Main.cloud[index].type].Width * Main.cloud[index].scale);
Main.cloud[index].height = (int) (Main.cloudTexture[Main.cloud[index].type].Height * Main.cloud[index].scale);
if (Main.windSpeed > 0f)
{
Main.cloud[index].position.X = (-Main.cloud[index].width - Main.cloudTexture[Main.cloud[index].type].Width) - rand.Next(Main.screenWidth * 2);
}
else
{
Main.cloud[index].position.X = (Main.screenWidth + Main.cloudTexture[Main.cloud[index].type].Width) + rand.Next(Main.screenWidth * 2);
}
Main.cloud[index].position.Y = rand.Next((int) (-Main.screenHeight * 0.25f), (int) (Main.screenHeight * 1.25));
Main.cloud[index].position.Y -= rand.Next((int) (Main.screenHeight * 0.25f));
Main.cloud[index].position.Y -= rand.Next((int) (Main.screenHeight * 0.25f));
Cloud cloud1 = Main.cloud[index];
cloud1.scale *= 2.2f - ((float) ((((double) (Main.cloud[index].position.Y + (Main.screenHeight * 0.25f))) / (Main.screenHeight * 1.5)) + 0.699999988079071));
if (Main.cloud[index].scale > 1.4)
{
Main.cloud[index].scale = 1.4f;
}
if (Main.cloud[index].scale < 0.6)
{
Main.cloud[index].scale = 0.6f;
}
Main.cloud[index].active = true;
Rectangle rectangle = new Rectangle((int) Main.cloud[index].position.X, (int) Main.cloud[index].position.Y, Main.cloud[index].width, Main.cloud[index].height);
for (int j = 0; j < 100; j++)
{
if ((index != j) && Main.cloud[j].active)
{
Rectangle rectangle2 = new Rectangle((int) Main.cloud[j].position.X, (int) Main.cloud[j].position.Y, Main.cloud[j].width, Main.cloud[j].height);
if (rectangle.Intersects(rectangle2))
{
Main.cloud[index].active = false;
}
}
}
}
}
public object Clone()
{
return base.MemberwiseClone();
}
public static void resetClouds()
{
if (Main.cloudLimit >= 10)
{
Main.numClouds = rand.Next(10, Main.cloudLimit);
Main.windSpeed = 0f;
while (Main.windSpeed == 0f)
{
Main.windSpeed = rand.Next(-100, 0x65) * 0.01f;
}
for (int i = 0; i < 100; i++)
{
Main.cloud[i].active = false;
}
for (int j = 0; j < Main.numClouds; j++)
{
addCloud();
}
for (int k = 0; k < Main.numClouds; k++)
{
if (Main.windSpeed < 0f)
{
Main.cloud[k].position.X -= Main.screenWidth * 2;
}
else
{
Main.cloud[k].position.X += Main.screenWidth * 2;
}
}
}
}
public void Update()
{
if (Main.gameMenu)
{
this.position.X += (Main.windSpeed * this.scale) * 3f;
}
else
{
this.position.X += (Main.windSpeed - (Main.player[Main.myPlayer].velocity.X * 0.1f)) * this.scale;
}
if (Main.windSpeed > 0f)
{
if ((this.position.X - Main.cloudTexture[this.type].Width) > Main.screenWidth)
{
this.active = false;
}
}
else if (((this.position.X + this.width) + Main.cloudTexture[this.type].Width) < 0f)
{
this.active = false;
}
this.rSpeed += rand.Next(-10, 11) * 2E-05f;
if (this.rSpeed > 0.0007)
{
this.rSpeed = 0.0007f;
}
if (this.rSpeed < -0.0007)
{
this.rSpeed = -0.0007f;
}
if (this.rotation > 0.05)
{
this.rotation = 0.05f;
}
if (this.rotation < -0.05)
{
this.rotation = -0.05f;
}
this.sSpeed += rand.Next(-10, 11) * 2E-05f;
if (this.sSpeed > 0.0007)
{
this.sSpeed = 0.0007f;
}
if (this.sSpeed < -0.0007)
{
this.sSpeed = -0.0007f;
}
if (this.scale > 1.4)
{
this.scale = 1.4f;
}
if (this.scale < 0.6)
{
this.scale = 0.6f;
}
this.rotation += this.rSpeed;
this.scale += this.sSpeed;
this.width = (int) (Main.cloudTexture[this.type].Width * this.scale);
this.height = (int) (Main.cloudTexture[this.type].Height * this.scale);
}
public static void UpdateClouds()
{
int num = 0;
for (int i = 0; i < 100; i++)
{
if (Main.cloud[i].active)
{
Main.cloud[i].Update();
num++;
}
}
for (int j = 0; j < 100; j++)
{
if (Main.cloud[j].active)
{
if ((j > 1) && (!Main.cloud[j - 1].active || (Main.cloud[j - 1].scale > (Main.cloud[j].scale + 0.02))))
{
Cloud cloud = (Cloud) Main.cloud[j - 1].Clone();
Main.cloud[j - 1] = (Cloud) Main.cloud[j].Clone();
Main.cloud[j] = cloud;
}
if ((j < 0x63) && (!Main.cloud[j].active || (Main.cloud[j + 1].scale < (Main.cloud[j].scale - 0.02))))
{
Cloud cloud2 = (Cloud) Main.cloud[j + 1].Clone();
Main.cloud[j + 1] = (Cloud) Main.cloud[j].Clone();
Main.cloud[j] = cloud2;
}
}
}
if (num < Main.numClouds)
{
addCloud();
}
}
}
}