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

136 lines
5.1 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Terraria.Rain
// 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 System;
using Terraria.Graphics.Effects;
namespace Terraria
{
public class Rain
{
public Vector2 position;
public Vector2 velocity;
public float scale;
public float rotation;
public int alpha;
public bool active;
public byte type;
public static void ClearRain()
{
for (int index = 0; index < Main.maxRain; ++index)
Main.rain[index].active = false;
}
public static void MakeRain()
{
if (Main.netMode == 2 || Main.gamePaused || (double) Main.screenPosition.Y > Main.worldSurface * 16.0 || Main.gameMenu)
return;
float num1 = (float) Main.screenWidth / 1920f * 25f * (float) (0.25 + 1.0 * (double) Main.cloudAlpha);
if (Filters.Scene["Sandstorm"].IsActive())
return;
for (int index = 0; (double) index < (double) num1; ++index)
{
int num2 = 600;
if ((double) Main.player[Main.myPlayer].velocity.Y < 0.0)
num2 += (int) ((double) Math.Abs(Main.player[Main.myPlayer].velocity.Y) * 30.0);
Vector2 Position;
Position.X = (float) Main.rand.Next((int) Main.screenPosition.X - num2, (int) Main.screenPosition.X + Main.screenWidth + num2);
Position.Y = Main.screenPosition.Y - (float) Main.rand.Next(20, 100);
Position.X -= (float) ((double) Main.windSpeedCurrent * 15.0 * 40.0);
Position.X += Main.player[Main.myPlayer].velocity.X * 40f;
if ((double) Position.X < 0.0)
Position.X = 0.0f;
if ((double) Position.X > (double) ((Main.maxTilesX - 1) * 16))
Position.X = (float) ((Main.maxTilesX - 1) * 16);
int i = (int) Position.X / 16;
int j = (int) Position.Y / 16;
if (i < 0)
i = 0;
if (i > Main.maxTilesX - 1)
i = Main.maxTilesX - 1;
if (j < 0)
j = 0;
if (j > Main.maxTilesY - 1)
j = Main.maxTilesY - 1;
if (Main.gameMenu || !WorldGen.SolidTile(i, j) && Main.tile[i, j].wall <= (ushort) 0)
{
Vector2 Velocity = new Vector2(Main.windSpeedCurrent * 18f, 14f);
Rain.NewRain(Position, Velocity);
}
}
}
public void Update()
{
if (Main.gamePaused)
return;
this.position += this.velocity;
if (Main.gameMenu)
{
if ((double) this.position.Y <= (double) Main.screenPosition.Y + (double) Main.screenHeight + 2000.0)
return;
this.active = false;
}
else
{
if (!Collision.SolidCollision(this.position, 2, 2) && (double) this.position.Y <= (double) Main.screenPosition.Y + (double) Main.screenHeight + 100.0 && !Collision.WetCollision(this.position, 2, 2))
return;
this.active = false;
if ((double) Main.rand.Next(100) >= (double) Main.gfxQuality * 100.0)
return;
int index = Dust.NewDust(this.position - this.velocity, 2, 2, Dust.dustWater());
Main.dust[index].position.X -= 2f;
Main.dust[index].position.Y += 2f;
Main.dust[index].alpha = 38;
Main.dust[index].velocity *= 0.1f;
Main.dust[index].velocity += -this.velocity * 0.025f;
Main.dust[index].velocity.Y -= 2f;
Main.dust[index].scale = 0.6f;
Main.dust[index].noGravity = true;
}
}
private static int NewRain(Vector2 Position, Vector2 Velocity)
{
int index1 = -1;
int num1 = (int) ((double) Main.maxRain * (double) Main.cloudAlpha);
if (num1 > Main.maxRain)
num1 = Main.maxRain;
float num2 = (float) Main.maxTilesX / 6400f;
double num3 = (double) Math.Max(0.0f, Math.Min(1f, (float) (((double) Main.player[Main.myPlayer].position.Y / 16.0 - 85.0 * (double) num2) / (60.0 * (double) num2))));
float num4 = (float) ((1.0 + (double) Main.gfxQuality) / 2.0);
if ((double) num4 < 0.9)
num1 = (int) ((double) num1 * (double) num4);
float num5 = (float) (800 - Main.SceneMetrics.SnowTileCount);
if ((double) num5 < 0.0)
num5 = 0.0f;
float num6 = num5 / 800f;
int num7 = (int) ((double) (int) ((double) num1 * (double) num6) * Math.Pow((double) Main.atmo, 9.0));
if ((double) Main.atmo < 0.4)
num7 = 0;
for (int index2 = 0; index2 < num7; ++index2)
{
if (!Main.rain[index2].active)
{
index1 = index2;
break;
}
}
if (index1 == -1)
return Main.maxRain;
Rain rain = Main.rain[index1];
rain.active = true;
rain.position = Position;
rain.scale = (float) (1.0 + (double) Main.rand.Next(-20, 21) * 0.00999999977648258);
rain.velocity = Velocity * rain.scale;
rain.rotation = (float) Math.Atan2((double) rain.velocity.X, -(double) rain.velocity.Y);
rain.type = (byte) (Main.waterStyle * 3 + Main.rand.Next(3));
return index1;
}
}
}