terraria-source-code/Terraria/Cloud.cs
TheVamp 0462173018 Version 1.2.0.3.1
Decompiled with IlSpy
Fixes Source Code
2013-10-12 11:25:17 +02:00

342 lines
9.2 KiB
C#

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
namespace Terraria
{
public class Cloud
{
public Vector2 position;
public float scale;
public float rotation;
public float rSpeed;
public float sSpeed;
public bool active;
public SpriteEffects spriteDir;
public int type;
public int width;
public int height;
public float Alpha;
public bool kill;
private static Random rand = new Random();
public static void resetClouds()
{
if (Main.dedServ)
{
return;
}
if (Main.cloudLimit < 10)
{
return;
}
Main.windSpeed = Main.windSpeedSet;
for (int i = 0; i < 200; i++)
{
Main.cloud[i].active = false;
}
for (int j = 0; j < Main.numClouds; j++)
{
Cloud.addCloud();
Main.cloud[j].Alpha = 1f;
}
for (int k = 0; k < 200; k++)
{
Main.cloud[k].Alpha = 1f;
}
}
public static void addCloud()
{
if (Main.netMode == 2)
{
return;
}
int num = -1;
for (int i = 0; i < 200; i++)
{
if (!Main.cloud[i].active)
{
num = i;
break;
}
}
if (num >= 0)
{
Main.cloud[num].kill = false;
Main.cloud[num].rSpeed = 0f;
Main.cloud[num].sSpeed = 0f;
Main.cloud[num].scale = (float)Cloud.rand.Next(70, 131) * 0.01f;
Main.cloud[num].rotation = (float)Cloud.rand.Next(-10, 11) * 0.01f;
Main.cloud[num].width = (int)((float)Main.cloudTexture[Main.cloud[num].type].Width * Main.cloud[num].scale);
Main.cloud[num].height = (int)((float)Main.cloudTexture[Main.cloud[num].type].Height * Main.cloud[num].scale);
Main.cloud[num].Alpha = 0f;
Main.cloud[num].spriteDir = SpriteEffects.None;
if (Cloud.rand.Next(2) == 0)
{
Main.cloud[num].spriteDir = SpriteEffects.FlipHorizontally;
}
float num2 = Main.windSpeed;
if (!Main.gameMenu)
{
num2 = Main.windSpeed - Main.player[Main.myPlayer].velocity.X * 0.1f;
}
int num3 = 0;
int num4 = 0;
if (num2 > 0f)
{
num3 -= 200;
}
if (num2 < 0f)
{
num4 += 200;
}
int num5 = 300;
float x = (float)WorldGen.genRand.Next(num3 - num5, Main.screenWidth + num4 + num5);
Main.cloud[num].Alpha = 0f;
Main.cloud[num].position.Y = (float)Cloud.rand.Next((int)((float)(-(float)Main.screenHeight) * 0.25f), (int)((float)Main.screenHeight * 0.25f));
Cloud expr_211_cp_0 = Main.cloud[num];
expr_211_cp_0.position.Y = expr_211_cp_0.position.Y - (float)Cloud.rand.Next((int)((float)Main.screenHeight * 0.15f));
Cloud expr_241_cp_0 = Main.cloud[num];
expr_241_cp_0.position.Y = expr_241_cp_0.position.Y - (float)Cloud.rand.Next((int)((float)Main.screenHeight * 0.15f));
Main.cloud[num].type = Cloud.rand.Next(4);
if (Main.rand == null)
{
Main.rand = new Random();
}
if ((Main.cloudAlpha > 0f && Cloud.rand.Next(4) != 0) || (Main.cloudBGActive >= 1f && Main.rand.Next(2) == 0))
{
Main.cloud[num].type = Cloud.rand.Next(18, 22);
if ((double)Main.cloud[num].scale >= 1.15)
{
Cloud expr_303_cp_0 = Main.cloud[num];
expr_303_cp_0.position.Y = expr_303_cp_0.position.Y - 150f;
}
if (Main.cloud[num].scale >= 1f)
{
Cloud expr_336_cp_0 = Main.cloud[num];
expr_336_cp_0.position.Y = expr_336_cp_0.position.Y - 150f;
}
}
else
{
if (((Main.cloudBGActive <= 0f && Main.cloudAlpha == 0f && Main.cloud[num].scale < 1f && Main.cloud[num].position.Y < (float)(-(float)Main.screenHeight) * 0.2f) || Main.cloud[num].position.Y < (float)(-(float)Main.screenHeight) * 0.2f) && (double)Main.numClouds < 50.0)
{
Main.cloud[num].type = Cloud.rand.Next(9, 14);
}
else
{
if ((((double)Main.cloud[num].scale < 1.15 && Main.cloud[num].position.Y < (float)(-(float)Main.screenHeight) * 0.3f) || ((double)Main.cloud[num].scale < 0.85 && Main.cloud[num].position.Y < (float)Main.screenHeight * 0.15f)) && ((double)Main.numClouds > 70.0 || Main.cloudBGActive >= 1f))
{
Main.cloud[num].type = Cloud.rand.Next(4, 9);
}
else
{
if (Main.cloud[num].position.Y > (float)(-(float)Main.screenHeight) * 0.15f && Cloud.rand.Next(2) == 0 && (double)Main.numClouds > 20.0)
{
Main.cloud[num].type = Cloud.rand.Next(14, 18);
}
}
}
}
if ((double)Main.cloud[num].scale > 1.2)
{
Cloud expr_50A_cp_0 = Main.cloud[num];
expr_50A_cp_0.position.Y = expr_50A_cp_0.position.Y + 100f;
}
if ((double)Main.cloud[num].scale > 1.3)
{
Main.cloud[num].scale = 1.3f;
}
if ((double)Main.cloud[num].scale < 0.7)
{
Main.cloud[num].scale = 0.7f;
}
Main.cloud[num].active = true;
Main.cloud[num].position.X = x;
if (Main.cloud[num].position.X > (float)(Main.screenWidth + 100))
{
Main.cloud[num].Alpha = 1f;
}
if (Main.cloud[num].position.X + (float)Main.cloudTexture[Main.cloud[num].type].Width * Main.cloud[num].scale < -100f)
{
Main.cloud[num].Alpha = 1f;
}
Rectangle rectangle = new Rectangle((int)Main.cloud[num].position.X, (int)Main.cloud[num].position.Y, Main.cloud[num].width, Main.cloud[num].height);
for (int j = 0; j < 200; j++)
{
if (num != j && Main.cloud[j].active)
{
Rectangle value = 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(value))
{
Main.cloud[num].active = false;
}
}
}
}
}
public Color cloudColor(Color bgColor)
{
float num = this.scale * this.Alpha;
if (num > 1f)
{
num = 1f;
}
float num2 = (float)((int)((float)bgColor.R * num));
float num3 = (float)((int)((float)bgColor.G * num));
float num4 = (float)((int)((float)bgColor.B * num));
float num5 = (float)((int)((float)bgColor.A * num));
return new Color((int)((byte)num2), (int)((byte)num3), (int)((byte)num4), (int)((byte)num5));
}
public object Clone()
{
return base.MemberwiseClone();
}
public static void UpdateClouds()
{
if (Main.netMode == 2)
{
return;
}
int num = 0;
for (int i = 0; i < 200; i++)
{
if (Main.cloud[i].active)
{
Main.cloud[i].Update();
if (!Main.cloud[i].kill)
{
num++;
}
}
}
for (int j = 0; j < 200; j++)
{
if (Main.cloud[j].active)
{
if (j > 1 && (!Main.cloud[j - 1].active || (double)Main.cloud[j - 1].scale > (double)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 < 199 && (!Main.cloud[j].active || (double)Main.cloud[j + 1].scale < (double)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)
{
Cloud.addCloud();
return;
}
if (num > Main.numClouds)
{
int num2 = Main.rand.Next(num);
int num3 = 0;
while (Main.cloud[num2].kill && num3 < 100)
{
num3++;
num2 = Main.rand.Next(num);
}
Main.cloud[num2].kill = true;
}
}
public void Update()
{
if (Main.gameMenu)
{
this.position.X = this.position.X + Main.windSpeed * this.scale * 3f;
}
else
{
if (this.scale == 1f)
{
this.scale -= 0.0001f;
}
if ((double)this.scale == 1.15)
{
this.scale -= 0.0001f;
}
float num;
if (this.scale < 1f)
{
num = 0.07f;
float num2 = this.scale + 0.15f;
num2 = (num2 + 1f) / 2f;
num2 *= num2;
num *= num2;
}
else
{
if ((double)this.scale <= 1.15)
{
num = 0.17f;
float num3 = this.scale - 0.075f;
num3 *= num3;
num *= num3;
}
else
{
num = 0.23f;
float num4 = this.scale - 0.15f - 0.075f;
num4 *= num4;
num *= num4;
}
}
this.position.X = this.position.X + Main.windSpeed * num * 5f * (float)Main.dayRate;
float num5 = Main.screenPosition.X - Main.screenLastPosition.X;
this.position.X = this.position.X - num5 * num;
}
float num6 = 600f;
if (!this.kill)
{
if (this.Alpha < 1f)
{
this.Alpha += 0.001f * (float)Main.dayRate;
if (this.Alpha > 1f)
{
this.Alpha = 1f;
}
}
}
else
{
this.Alpha -= 0.001f * (float)Main.dayRate;
if (this.Alpha <= 0f)
{
this.active = false;
}
}
if (this.position.X + (float)Main.cloudTexture[this.type].Width * this.scale < -num6 || this.position.X > (float)Main.screenWidth + num6)
{
this.active = false;
}
this.rSpeed += (float)Cloud.rand.Next(-10, 11) * 2E-05f;
if ((double)this.rSpeed > 0.0002)
{
this.rSpeed = 0.0002f;
}
if ((double)this.rSpeed < -0.0002)
{
this.rSpeed = -0.0002f;
}
if ((double)this.rotation > 0.02)
{
this.rotation = 0.02f;
}
if ((double)this.rotation < -0.02)
{
this.rotation = -0.02f;
}
this.rotation += this.rSpeed;
this.width = (int)((float)Main.cloudTexture[this.type].Width * this.scale);
this.height = (int)((float)Main.cloudTexture[this.type].Height * this.scale);
if (this.type >= 9 && this.type <= 13 && (Main.cloudAlpha > 0f || Main.cloudBGActive >= 1f))
{
this.kill = true;
}
}
}
}