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

469 lines
14 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Terraria.WorldBuilding.Modifiers
// 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;
namespace Terraria.WorldBuilding
{
public static class Modifiers
{
public class ShapeScale : GenAction
{
private int _scale;
public ShapeScale(int scale) => this._scale = scale;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
bool flag = false;
for (int index1 = 0; index1 < this._scale; ++index1)
{
for (int index2 = 0; index2 < this._scale; ++index2)
flag |= !this.UnitApply(origin, (x - origin.X << 1) + index1 + origin.X, (y - origin.Y << 1) + index2 + origin.Y);
}
return !flag;
}
}
public class Expand : GenAction
{
private int _xExpansion;
private int _yExpansion;
public Expand(int expansion)
{
this._xExpansion = expansion;
this._yExpansion = expansion;
}
public Expand(int xExpansion, int yExpansion)
{
this._xExpansion = xExpansion;
this._yExpansion = yExpansion;
}
public override bool Apply(Point origin, int x, int y, params object[] args)
{
bool flag = false;
for (int index1 = -this._xExpansion; index1 <= this._xExpansion; ++index1)
{
for (int index2 = -this._yExpansion; index2 <= this._yExpansion; ++index2)
flag |= !this.UnitApply(origin, x + index1, y + index2, args);
}
return !flag;
}
}
public class RadialDither : GenAction
{
private float _innerRadius;
private float _outerRadius;
public RadialDither(float innerRadius, float outerRadius)
{
this._innerRadius = innerRadius;
this._outerRadius = outerRadius;
}
public override bool Apply(Point origin, int x, int y, params object[] args)
{
Vector2 vector2 = new Vector2((float) origin.X, (float) origin.Y);
float num = Math.Max(0.0f, Math.Min(1f, (float) (((double) Vector2.Distance(new Vector2((float) x, (float) y), vector2) - (double) this._innerRadius) / ((double) this._outerRadius - (double) this._innerRadius))));
return GenBase._random.NextDouble() > (double) num ? this.UnitApply(origin, x, y, args) : this.Fail();
}
}
public class Blotches : GenAction
{
private int _minX;
private int _minY;
private int _maxX;
private int _maxY;
private double _chance;
public Blotches(int scale = 2, double chance = 0.3)
{
this._minX = scale;
this._minY = scale;
this._maxX = scale;
this._maxY = scale;
this._chance = chance;
}
public Blotches(int xScale, int yScale, double chance = 0.3)
{
this._minX = xScale;
this._maxX = xScale;
this._minY = yScale;
this._maxY = yScale;
this._chance = chance;
}
public Blotches(int leftScale, int upScale, int rightScale, int downScale, double chance = 0.3)
{
this._minX = leftScale;
this._maxX = rightScale;
this._minY = upScale;
this._maxY = downScale;
this._chance = chance;
}
public override bool Apply(Point origin, int x, int y, params object[] args)
{
GenBase._random.NextDouble();
if (GenBase._random.NextDouble() >= this._chance)
return this.UnitApply(origin, x, y, args);
bool flag = false;
int num1 = GenBase._random.Next(1 - this._minX, 1);
int num2 = GenBase._random.Next(0, this._maxX);
int num3 = GenBase._random.Next(1 - this._minY, 1);
int num4 = GenBase._random.Next(0, this._maxY);
for (int index1 = num1; index1 <= num2; ++index1)
{
for (int index2 = num3; index2 <= num4; ++index2)
flag |= !this.UnitApply(origin, x + index1, y + index2, args);
}
return !flag;
}
}
public class InShape : GenAction
{
private readonly ShapeData _shapeData;
public InShape(ShapeData shapeData) => this._shapeData = shapeData;
public override bool Apply(Point origin, int x, int y, params object[] args) => !this._shapeData.Contains(x - origin.X, y - origin.Y) ? this.Fail() : this.UnitApply(origin, x, y, args);
}
public class NotInShape : GenAction
{
private readonly ShapeData _shapeData;
public NotInShape(ShapeData shapeData) => this._shapeData = shapeData;
public override bool Apply(Point origin, int x, int y, params object[] args) => this._shapeData.Contains(x - origin.X, y - origin.Y) ? this.Fail() : this.UnitApply(origin, x, y, args);
}
public class Conditions : GenAction
{
private readonly GenCondition[] _conditions;
public Conditions(params GenCondition[] conditions) => this._conditions = conditions;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
bool flag = true;
for (int index = 0; index < this._conditions.Length; ++index)
flag &= this._conditions[index].IsValid(x, y);
return flag ? this.UnitApply(origin, x, y, args) : this.Fail();
}
}
public class OnlyWalls : GenAction
{
private ushort[] _types;
public OnlyWalls(params ushort[] types) => this._types = types;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
for (int index = 0; index < this._types.Length; ++index)
{
if ((int) GenBase._tiles[x, y].wall == (int) this._types[index])
return this.UnitApply(origin, x, y, args);
}
return this.Fail();
}
}
public class OnlyTiles : GenAction
{
private ushort[] _types;
public OnlyTiles(params ushort[] types) => this._types = types;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
if (!GenBase._tiles[x, y].active())
return this.Fail();
for (int index = 0; index < this._types.Length; ++index)
{
if ((int) GenBase._tiles[x, y].type == (int) this._types[index])
return this.UnitApply(origin, x, y, args);
}
return this.Fail();
}
}
public class IsTouching : GenAction
{
private static readonly int[] DIRECTIONS = new int[16]
{
0,
-1,
1,
0,
-1,
0,
0,
1,
-1,
-1,
1,
-1,
-1,
1,
1,
1
};
private bool _useDiagonals;
private ushort[] _tileIds;
public IsTouching(bool useDiagonals, params ushort[] tileIds)
{
this._useDiagonals = useDiagonals;
this._tileIds = tileIds;
}
public override bool Apply(Point origin, int x, int y, params object[] args)
{
int num = this._useDiagonals ? 16 : 8;
for (int index1 = 0; index1 < num; index1 += 2)
{
Tile tile = GenBase._tiles[x + Modifiers.IsTouching.DIRECTIONS[index1], y + Modifiers.IsTouching.DIRECTIONS[index1 + 1]];
if (tile.active())
{
for (int index2 = 0; index2 < this._tileIds.Length; ++index2)
{
if ((int) tile.type == (int) this._tileIds[index2])
return this.UnitApply(origin, x, y, args);
}
}
}
return this.Fail();
}
}
public class NotTouching : GenAction
{
private static readonly int[] DIRECTIONS = new int[16]
{
0,
-1,
1,
0,
-1,
0,
0,
1,
-1,
-1,
1,
-1,
-1,
1,
1,
1
};
private bool _useDiagonals;
private ushort[] _tileIds;
public NotTouching(bool useDiagonals, params ushort[] tileIds)
{
this._useDiagonals = useDiagonals;
this._tileIds = tileIds;
}
public override bool Apply(Point origin, int x, int y, params object[] args)
{
int num = this._useDiagonals ? 16 : 8;
for (int index1 = 0; index1 < num; index1 += 2)
{
Tile tile = GenBase._tiles[x + Modifiers.NotTouching.DIRECTIONS[index1], y + Modifiers.NotTouching.DIRECTIONS[index1 + 1]];
if (tile.active())
{
for (int index2 = 0; index2 < this._tileIds.Length; ++index2)
{
if ((int) tile.type == (int) this._tileIds[index2])
return this.Fail();
}
}
}
return this.UnitApply(origin, x, y, args);
}
}
public class IsTouchingAir : GenAction
{
private static readonly int[] DIRECTIONS = new int[16]
{
0,
-1,
1,
0,
-1,
0,
0,
1,
-1,
-1,
1,
-1,
-1,
1,
1,
1
};
private bool _useDiagonals;
public IsTouchingAir(bool useDiagonals = false) => this._useDiagonals = useDiagonals;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
int num = this._useDiagonals ? 16 : 8;
for (int index = 0; index < num; index += 2)
{
if (!GenBase._tiles[x + Modifiers.IsTouchingAir.DIRECTIONS[index], y + Modifiers.IsTouchingAir.DIRECTIONS[index + 1]].active())
return this.UnitApply(origin, x, y, args);
}
return this.Fail();
}
}
public class SkipTiles : GenAction
{
private ushort[] _types;
public SkipTiles(params ushort[] types) => this._types = types;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
if (!GenBase._tiles[x, y].active())
return this.UnitApply(origin, x, y, args);
for (int index = 0; index < this._types.Length; ++index)
{
if ((int) GenBase._tiles[x, y].type == (int) this._types[index])
return this.Fail();
}
return this.UnitApply(origin, x, y, args);
}
}
public class HasLiquid : GenAction
{
private int _liquidType;
private int _liquidLevel;
public HasLiquid(int liquidLevel = -1, int liquidType = -1)
{
this._liquidType = liquidType;
this._liquidLevel = liquidLevel;
}
public override bool Apply(Point origin, int x, int y, params object[] args)
{
Tile tile = GenBase._tiles[x, y];
return (this._liquidType == -1 || this._liquidType == (int) tile.liquidType()) && (this._liquidLevel == -1 && tile.liquid != (byte) 0 || this._liquidLevel == (int) tile.liquid) ? this.UnitApply(origin, x, y, args) : this.Fail();
}
}
public class SkipWalls : GenAction
{
private ushort[] _types;
public SkipWalls(params ushort[] types) => this._types = types;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
for (int index = 0; index < this._types.Length; ++index)
{
if ((int) GenBase._tiles[x, y].wall == (int) this._types[index])
return this.Fail();
}
return this.UnitApply(origin, x, y, args);
}
}
public class IsEmpty : GenAction
{
public override bool Apply(Point origin, int x, int y, params object[] args) => !GenBase._tiles[x, y].active() ? this.UnitApply(origin, x, y, args) : this.Fail();
}
public class IsSolid : GenAction
{
public override bool Apply(Point origin, int x, int y, params object[] args) => GenBase._tiles[x, y].active() && WorldGen.SolidOrSlopedTile(x, y) ? this.UnitApply(origin, x, y, args) : this.Fail();
}
public class IsNotSolid : GenAction
{
public override bool Apply(Point origin, int x, int y, params object[] args) => !GenBase._tiles[x, y].active() || !WorldGen.SolidOrSlopedTile(x, y) ? this.UnitApply(origin, x, y, args) : this.Fail();
}
public class RectangleMask : GenAction
{
private int _xMin;
private int _yMin;
private int _xMax;
private int _yMax;
public RectangleMask(int xMin, int xMax, int yMin, int yMax)
{
this._xMin = xMin;
this._yMin = yMin;
this._xMax = xMax;
this._yMax = yMax;
}
public override bool Apply(Point origin, int x, int y, params object[] args) => x >= this._xMin + origin.X && x <= this._xMax + origin.X && y >= this._yMin + origin.Y && y <= this._yMax + origin.Y ? this.UnitApply(origin, x, y, args) : this.Fail();
}
public class Offset : GenAction
{
private int _xOffset;
private int _yOffset;
public Offset(int x, int y)
{
this._xOffset = x;
this._yOffset = y;
}
public override bool Apply(Point origin, int x, int y, params object[] args) => this.UnitApply(origin, x + this._xOffset, y + this._yOffset, args);
}
public class Dither : GenAction
{
private double _failureChance;
public Dither(double failureChance = 0.5) => this._failureChance = failureChance;
public override bool Apply(Point origin, int x, int y, params object[] args) => GenBase._random.NextDouble() >= this._failureChance ? this.UnitApply(origin, x, y, args) : this.Fail();
}
public class Flip : GenAction
{
private bool _flipX;
private bool _flipY;
public Flip(bool flipX, bool flipY)
{
this._flipX = flipX;
this._flipY = flipY;
}
public override bool Apply(Point origin, int x, int y, params object[] args)
{
if (this._flipX)
x = origin.X * 2 - x;
if (this._flipY)
y = origin.Y * 2 - y;
return this.UnitApply(origin, x, y, args);
}
}
}
}