terraria-source-code/GameContent/Biomes/TerrainPass.cs
2021-10-26 12:45:26 -04:00

309 lines
11 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Terraria.GameContent.Biomes.TerrainPass
// 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 System;
using Terraria.IO;
using Terraria.WorldBuilding;
namespace Terraria.GameContent.Biomes
{
public class TerrainPass : GenPass
{
public double WorldSurface { get; private set; }
public double WorldSurfaceHigh { get; private set; }
public double WorldSurfaceLow { get; private set; }
public double RockLayer { get; private set; }
public double RockLayerHigh { get; private set; }
public double RockLayerLow { get; private set; }
public int WaterLine { get; private set; }
public int LavaLine { get; private set; }
public int LeftBeachSize { get; set; }
public int RightBeachSize { get; set; }
public TerrainPass()
: base("Terrain", 449.3722f)
{
}
protected override void ApplyPass(GenerationProgress progress, GameConfiguration configuration)
{
int num1 = configuration.Get<int>("FlatBeachPadding");
progress.Message = Lang.gen[0].Value;
TerrainPass.TerrainFeatureType featureType = TerrainPass.TerrainFeatureType.Plateau;
double num2 = (double) Main.maxTilesY * 0.3 * ((double) GenBase._random.Next(90, 110) * 0.005);
double num3 = (num2 + (double) Main.maxTilesY * 0.2) * ((double) GenBase._random.Next(90, 110) * 0.01);
double val2_1 = num2;
double val2_2 = num2;
double val2_3 = num3;
double val2_4 = num3;
double num4 = (double) Main.maxTilesY * 0.23;
TerrainPass.SurfaceHistory history = new TerrainPass.SurfaceHistory(500);
int num5 = this.LeftBeachSize + num1;
for (int index = 0; index < Main.maxTilesX; ++index)
{
progress.Set((float) index / (float) Main.maxTilesX);
val2_1 = Math.Min(num2, val2_1);
val2_2 = Math.Max(num2, val2_2);
val2_3 = Math.Min(num3, val2_3);
val2_4 = Math.Max(num3, val2_4);
if (num5 <= 0)
{
featureType = (TerrainPass.TerrainFeatureType) GenBase._random.Next(0, 5);
num5 = GenBase._random.Next(5, 40);
if (featureType == TerrainPass.TerrainFeatureType.Plateau)
num5 *= (int) ((double) GenBase._random.Next(5, 30) * 0.2);
}
--num5;
if ((double) index > (double) Main.maxTilesX * 0.45 && (double) index < (double) Main.maxTilesX * 0.55 && (featureType == TerrainPass.TerrainFeatureType.Mountain || featureType == TerrainPass.TerrainFeatureType.Valley))
featureType = (TerrainPass.TerrainFeatureType) GenBase._random.Next(3);
if ((double) index > (double) Main.maxTilesX * 0.48 && (double) index < (double) Main.maxTilesX * 0.52)
featureType = TerrainPass.TerrainFeatureType.Plateau;
num2 += TerrainPass.GenerateWorldSurfaceOffset(featureType);
float num6 = 0.17f;
float num7 = 0.26f;
if (WorldGen.drunkWorldGen)
{
num6 = 0.15f;
num7 = 0.28f;
}
if (index < this.LeftBeachSize + num1 || index > Main.maxTilesX - this.RightBeachSize - num1)
num2 = Utils.Clamp<double>(num2, (double) Main.maxTilesY * 0.17, num4);
else if (num2 < (double) Main.maxTilesY * (double) num6)
{
num2 = (double) Main.maxTilesY * (double) num6;
num5 = 0;
}
else if (num2 > (double) Main.maxTilesY * (double) num7)
{
num2 = (double) Main.maxTilesY * (double) num7;
num5 = 0;
}
while (GenBase._random.Next(0, 3) == 0)
num3 += (double) GenBase._random.Next(-2, 3);
if (num3 < num2 + (double) Main.maxTilesY * 0.06)
++num3;
if (num3 > num2 + (double) Main.maxTilesY * 0.35)
--num3;
history.Record(num2);
TerrainPass.FillColumn(index, num2, num3);
if (index == Main.maxTilesX - this.RightBeachSize - num1)
{
if (num2 > num4)
TerrainPass.RetargetSurfaceHistory(history, index, num4);
featureType = TerrainPass.TerrainFeatureType.Plateau;
num5 = Main.maxTilesX - index;
}
}
Main.worldSurface = (double) (int) (val2_2 + 25.0);
Main.rockLayer = val2_4;
double num8 = (double) ((int) ((Main.rockLayer - Main.worldSurface) / 6.0) * 6);
Main.rockLayer = (double) (int) (Main.worldSurface + num8);
int num9 = (int) (Main.rockLayer + (double) Main.maxTilesY) / 2 + GenBase._random.Next(-100, 20);
int num10 = num9 + GenBase._random.Next(50, 80);
int num11 = 20;
if (val2_3 < val2_2 + (double) num11)
{
double num12 = (val2_3 + val2_2) / 2.0;
double num13 = Math.Abs(val2_3 - val2_2);
if (num13 < (double) num11)
num13 = (double) num11;
val2_3 = num12 + num13 / 2.0;
val2_2 = num12 - num13 / 2.0;
}
this.RockLayer = num3;
this.RockLayerHigh = val2_4;
this.RockLayerLow = val2_3;
this.WorldSurface = num2;
this.WorldSurfaceHigh = val2_2;
this.WorldSurfaceLow = val2_1;
this.WaterLine = num9;
this.LavaLine = num10;
}
private static void FillColumn(int x, double worldSurface, double rockLayer)
{
for (int index = 0; (double) index < worldSurface; ++index)
{
Main.tile[x, index].active(false);
Main.tile[x, index].frameX = (short) -1;
Main.tile[x, index].frameY = (short) -1;
}
for (int index = (int) worldSurface; index < Main.maxTilesY; ++index)
{
if ((double) index < rockLayer)
{
Main.tile[x, index].active(true);
Main.tile[x, index].type = (ushort) 0;
Main.tile[x, index].frameX = (short) -1;
Main.tile[x, index].frameY = (short) -1;
}
else
{
Main.tile[x, index].active(true);
Main.tile[x, index].type = (ushort) 1;
Main.tile[x, index].frameX = (short) -1;
Main.tile[x, index].frameY = (short) -1;
}
}
}
private static void RetargetColumn(int x, double worldSurface)
{
for (int index = 0; (double) index < worldSurface; ++index)
{
Main.tile[x, index].active(false);
Main.tile[x, index].frameX = (short) -1;
Main.tile[x, index].frameY = (short) -1;
}
for (int index = (int) worldSurface; index < Main.maxTilesY; ++index)
{
if (Main.tile[x, index].type != (ushort) 1 || !Main.tile[x, index].active())
{
Main.tile[x, index].active(true);
Main.tile[x, index].type = (ushort) 0;
Main.tile[x, index].frameX = (short) -1;
Main.tile[x, index].frameY = (short) -1;
}
}
}
private static double GenerateWorldSurfaceOffset(TerrainPass.TerrainFeatureType featureType)
{
double num = 0.0;
if ((WorldGen.drunkWorldGen || WorldGen.getGoodWorldGen) && WorldGen.genRand.Next(2) == 0)
{
switch (featureType)
{
case TerrainPass.TerrainFeatureType.Plateau:
while (GenBase._random.Next(0, 6) == 0)
num += (double) GenBase._random.Next(-1, 2);
break;
case TerrainPass.TerrainFeatureType.Hill:
while (GenBase._random.Next(0, 3) == 0)
--num;
while (GenBase._random.Next(0, 10) == 0)
++num;
break;
case TerrainPass.TerrainFeatureType.Dale:
while (GenBase._random.Next(0, 3) == 0)
++num;
while (GenBase._random.Next(0, 10) == 0)
--num;
break;
case TerrainPass.TerrainFeatureType.Mountain:
while (GenBase._random.Next(0, 3) != 0)
--num;
while (GenBase._random.Next(0, 6) == 0)
++num;
break;
case TerrainPass.TerrainFeatureType.Valley:
while (GenBase._random.Next(0, 3) != 0)
++num;
while (GenBase._random.Next(0, 5) == 0)
--num;
break;
}
}
else
{
switch (featureType)
{
case TerrainPass.TerrainFeatureType.Plateau:
while (GenBase._random.Next(0, 7) == 0)
num += (double) GenBase._random.Next(-1, 2);
break;
case TerrainPass.TerrainFeatureType.Hill:
while (GenBase._random.Next(0, 4) == 0)
--num;
while (GenBase._random.Next(0, 10) == 0)
++num;
break;
case TerrainPass.TerrainFeatureType.Dale:
while (GenBase._random.Next(0, 4) == 0)
++num;
while (GenBase._random.Next(0, 10) == 0)
--num;
break;
case TerrainPass.TerrainFeatureType.Mountain:
while (GenBase._random.Next(0, 2) == 0)
--num;
while (GenBase._random.Next(0, 6) == 0)
++num;
break;
case TerrainPass.TerrainFeatureType.Valley:
while (GenBase._random.Next(0, 2) == 0)
++num;
while (GenBase._random.Next(0, 5) == 0)
--num;
break;
}
}
return num;
}
private static void RetargetSurfaceHistory(
TerrainPass.SurfaceHistory history,
int targetX,
double targetHeight)
{
for (int index1 = 0; index1 < history.Length / 2 && history[history.Length - 1] > targetHeight; ++index1)
{
for (int index2 = 0; index2 < history.Length - index1 * 2; ++index2)
{
double num = history[history.Length - index2 - 1] - 1.0;
history[history.Length - index2 - 1] = num;
if (num <= targetHeight)
break;
}
}
for (int index = 0; index < history.Length; ++index)
{
double worldSurface = history[history.Length - index - 1];
TerrainPass.RetargetColumn(targetX - index, worldSurface);
}
}
private enum TerrainFeatureType
{
Plateau,
Hill,
Dale,
Mountain,
Valley,
}
private class SurfaceHistory
{
private readonly double[] _heights;
private int _index;
public double this[int index]
{
get => this._heights[(index + this._index) % this._heights.Length];
set => this._heights[(index + this._index) % this._heights.Length] = value;
}
public int Length => this._heights.Length;
public SurfaceHistory(int size) => this._heights = new double[size];
public void Record(double height)
{
this._heights[this._index] = height;
this._index = (this._index + 1) % this._heights.Length;
}
}
}
}