210 lines
7.5 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|