terraria-source-code/Cloud.cs
2021-10-26 12:45:26 -04:00

295 lines
11 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Terraria.Cloud
// Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null
// MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83
// Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Terraria.GameContent;
using Terraria.Utilities;
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 UnifiedRandom rand = new UnifiedRandom();
public static void resetClouds()
{
if (Main.dedServ)
return;
Main.windSpeedCurrent = Main.windSpeedTarget;
for (int index = 0; index < 200; ++index)
Main.cloud[index].active = false;
for (int index = 0; index < Main.numClouds; ++index)
{
Cloud.addCloud();
Main.cloud[index].Alpha = 1f;
}
for (int index = 0; index < 200; ++index)
Main.cloud[index].Alpha = 1f;
}
public static void addCloud()
{
if (Main.netMode == 2)
return;
int index1 = -1;
for (int index2 = 0; index2 < 200; ++index2)
{
if (!Main.cloud[index2].active)
{
index1 = index2;
break;
}
}
if (index1 < 0)
return;
Main.cloud[index1].kill = false;
Main.cloud[index1].rSpeed = 0.0f;
Main.cloud[index1].sSpeed = 0.0f;
Main.cloud[index1].scale = (float) Cloud.rand.Next(70, 131) * 0.01f;
Main.cloud[index1].rotation = (float) Cloud.rand.Next(-10, 11) * 0.01f;
Main.cloud[index1].width = (int) ((double) TextureAssets.Cloud[Main.cloud[index1].type].Width() * (double) Main.cloud[index1].scale);
Main.cloud[index1].height = (int) ((double) TextureAssets.Cloud[Main.cloud[index1].type].Height() * (double) Main.cloud[index1].scale);
Main.cloud[index1].Alpha = 0.0f;
Main.cloud[index1].spriteDir = SpriteEffects.None;
if (Cloud.rand.Next(2) == 0)
Main.cloud[index1].spriteDir = SpriteEffects.FlipHorizontally;
float num1 = Main.windSpeedCurrent;
if (!Main.gameMenu)
num1 = Main.windSpeedCurrent - Main.player[Main.myPlayer].velocity.X * 0.1f;
int num2 = 0;
int num3 = 0;
if ((double) num1 > 0.0)
num2 -= 200;
if ((double) num1 < 0.0)
num3 += 200;
int num4 = 300;
float num5 = (float) WorldGen.genRand.Next(num2 - num4, Main.screenWidth + num3 + num4);
Main.cloud[index1].Alpha = 0.0f;
Main.cloud[index1].position.Y = (float) Cloud.rand.Next((int) ((double) -Main.screenHeight * 0.25), (int) ((double) Main.screenHeight * 0.150000005960464));
if (Main.rand.Next(3) == 0)
Main.cloud[index1].position.Y -= (float) Cloud.rand.Next((int) ((double) Main.screenHeight * 0.100000001490116));
Main.cloud[index1].type = Cloud.rand.Next(4);
if ((double) Main.cloudAlpha > 0.0 && Cloud.rand.Next(4) != 0 || (double) Main.cloudBGActive >= 1.0 && Cloud.rand.Next(2) == 0)
{
Main.cloud[index1].type = Cloud.rand.Next(18, 22);
if ((double) Main.cloud[index1].scale >= 1.15)
Main.cloud[index1].position.Y -= 150f;
if ((double) Main.cloud[index1].scale >= 1.0)
Main.cloud[index1].position.Y -= 150f;
}
else if ((double) Main.cloudBGActive <= 0.0 && (double) Main.cloudAlpha == 0.0 && (double) Main.cloud[index1].scale < 1.0 && (double) Main.cloud[index1].position.Y < (double) -Main.screenHeight * 0.150000005960464 && (double) Main.numClouds <= 80.0)
Main.cloud[index1].type = Cloud.rand.Next(9, 14);
else if (((double) Main.cloud[index1].scale < 1.15 && (double) Main.cloud[index1].position.Y < (double) -Main.screenHeight * 0.300000011920929 || (double) Main.cloud[index1].scale < 0.85 && (double) Main.cloud[index1].position.Y < (double) Main.screenHeight * 0.150000005960464) && ((double) Main.numClouds > 70.0 || (double) Main.cloudBGActive >= 1.0))
Main.cloud[index1].type = Cloud.rand.Next(4, 9);
else if ((double) Main.cloud[index1].position.Y > (double) -Main.screenHeight * 0.150000005960464 && Cloud.rand.Next(2) == 0 && (double) Main.numClouds > 20.0)
Main.cloud[index1].type = Cloud.rand.Next(14, 18);
if (Cloud.rand.Next(150) == 0)
Main.cloud[index1].type = Cloud.RollRareCloud();
if ((double) Main.cloud[index1].scale > 1.2)
Main.cloud[index1].position.Y += 100f;
if ((double) Main.cloud[index1].scale > 1.3)
Main.cloud[index1].scale = 1.3f;
if ((double) Main.cloud[index1].scale < 0.7)
Main.cloud[index1].scale = 0.7f;
Main.cloud[index1].active = true;
Main.cloud[index1].position.X = num5;
if ((double) Main.cloud[index1].position.X > (double) (Main.screenWidth + 400))
Main.cloud[index1].Alpha = 1f;
if ((double) Main.cloud[index1].position.X + (double) TextureAssets.Cloud[Main.cloud[index1].type].Width() * (double) Main.cloud[index1].scale < -400.0)
Main.cloud[index1].Alpha = 1f;
Rectangle rectangle1 = new Rectangle((int) Main.cloud[index1].position.X, (int) Main.cloud[index1].position.Y, Main.cloud[index1].width, Main.cloud[index1].height);
for (int index3 = 0; index3 < 200; ++index3)
{
if (index1 != index3 && Main.cloud[index3].active)
{
Rectangle rectangle2 = new Rectangle((int) Main.cloud[index3].position.X, (int) Main.cloud[index3].position.Y, Main.cloud[index3].width, Main.cloud[index3].height);
if (rectangle1.Intersects(rectangle2))
Main.cloud[index1].active = false;
}
}
}
private static int RollRareCloud()
{
int num = -1;
bool flag = false;
while (!flag)
{
num = Cloud.rand.Next(22, 37);
switch (num)
{
case 25:
case 26:
flag = NPC.downedBoss1;
continue;
case 28:
if (Main.rand.Next(10) == 0)
{
flag = true;
continue;
}
continue;
case 30:
case 35:
flag = Main.hardMode;
continue;
case 31:
flag = NPC.downedBoss3;
continue;
case 36:
flag = NPC.downedBoss2 && WorldGen.crimson;
continue;
default:
flag = true;
continue;
}
}
return num;
}
public Color cloudColor(Color bgColor)
{
float num = this.scale * this.Alpha;
if ((double) num > 1.0)
num = 1f;
return new Color((int) (byte) (float) (int) ((double) bgColor.R * (double) num), (int) (byte) (float) (int) ((double) bgColor.G * (double) num), (int) (byte) (float) (int) ((double) bgColor.B * (double) num), (int) (byte) (float) (int) ((double) bgColor.A * (double) num));
}
public object Clone() => this.MemberwiseClone();
public static void UpdateClouds()
{
if (Main.netMode == 2)
return;
int maxValue = 0;
for (int index = 0; index < 200; ++index)
{
if (Main.cloud[index].active)
{
Main.cloud[index].Update();
if (!Main.cloud[index].kill)
++maxValue;
}
}
for (int index = 0; index < 200; ++index)
{
if (Main.cloud[index].active)
{
if (index > 1 && (!Main.cloud[index - 1].active || (double) Main.cloud[index - 1].scale > (double) Main.cloud[index].scale + 0.02))
{
Cloud cloud = (Cloud) Main.cloud[index - 1].Clone();
Main.cloud[index - 1] = (Cloud) Main.cloud[index].Clone();
Main.cloud[index] = cloud;
}
if (index < 199 && (!Main.cloud[index].active || (double) Main.cloud[index + 1].scale < (double) Main.cloud[index].scale - 0.02))
{
Cloud cloud = (Cloud) Main.cloud[index + 1].Clone();
Main.cloud[index + 1] = (Cloud) Main.cloud[index].Clone();
Main.cloud[index] = cloud;
}
}
}
if (maxValue < Main.numClouds)
{
Cloud.addCloud();
}
else
{
if (maxValue <= Main.numClouds)
return;
int index1 = Cloud.rand.Next(maxValue);
for (int index2 = 0; Main.cloud[index1].kill && index2 < 100; index1 = Cloud.rand.Next(maxValue))
++index2;
Main.cloud[index1].kill = true;
}
}
public void Update()
{
if (WorldGen.drunkWorldGenText && Main.gameMenu)
this.type = 28;
if ((double) this.scale == 1.0)
this.scale -= 0.0001f;
if ((double) this.scale == 1.15)
this.scale -= 0.0001f;
float num1;
if ((double) this.scale < 1.0)
{
float num2 = 0.07f;
float num3 = (float) (((double) (this.scale + 0.15f) + 1.0) / 2.0);
float num4 = num3 * num3;
num1 = num2 * num4;
}
else if ((double) this.scale <= 1.15)
{
float num5 = 0.19f;
float num6 = this.scale - 0.075f;
float num7 = num6 * num6;
num1 = num5 * num7;
}
else
{
float num8 = 0.23f;
float num9 = (float) ((double) this.scale - 0.150000005960464 - 0.0750000029802322);
float num10 = num9 * num9;
num1 = num8 * num10;
}
this.position.X += Main.windSpeedCurrent * 9f * num1 * (float) Main.dayRate;
this.position.X -= (Main.screenPosition.X - Main.screenLastPosition.X) * num1;
float num11 = 600f;
if ((double) Main.bgAlphaFrontLayer[4] == 1.0 && (double) this.position.Y > 200.0)
{
this.kill = true;
this.Alpha -= 0.005f * (float) Main.dayRate;
}
if (!this.kill)
{
if ((double) this.Alpha < 1.0)
{
this.Alpha += 1f / 1000f * (float) Main.dayRate;
if ((double) this.Alpha > 1.0)
this.Alpha = 1f;
}
}
else
{
this.Alpha -= 1f / 1000f * (float) Main.dayRate;
if ((double) this.Alpha <= 0.0)
this.active = false;
}
if ((double) this.position.X + (double) TextureAssets.Cloud[this.type].Width() * (double) this.scale < -(double) num11 || (double) this.position.X > (double) Main.screenWidth + (double) num11)
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) ((double) TextureAssets.Cloud[this.type].Width() * (double) this.scale);
this.height = (int) ((double) TextureAssets.Cloud[this.type].Height() * (double) this.scale);
if (this.type < 9 || this.type > 13 || (double) Main.cloudAlpha <= 0.0 && (double) Main.cloudBGActive < 1.0)
return;
this.kill = true;
}
}
}