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

69 lines
3 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Terraria.GameContent.Generation.ShapeBranch
// 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 System.Collections.Generic;
using Terraria.WorldBuilding;
namespace Terraria.GameContent.Generation
{
public class ShapeBranch : GenShape
{
private Point _offset;
private List<Point> _endPoints;
public ShapeBranch() => this._offset = new Point(10, -5);
public ShapeBranch(Point offset) => this._offset = offset;
public ShapeBranch(double angle, double distance) => this._offset = new Point((int) (Math.Cos(angle) * distance), (int) (Math.Sin(angle) * distance));
private bool PerformSegment(Point origin, GenAction action, Point start, Point end, int size)
{
size = Math.Max(1, size);
for (int index1 = -(size >> 1); index1 < size - (size >> 1); ++index1)
{
for (int index2 = -(size >> 1); index2 < size - (size >> 1); ++index2)
{
if (!Utils.PlotLine(new Point(start.X + index1, start.Y + index2), end, (Utils.TileActionAttempt) ((tileX, tileY) => this.UnitApply(action, origin, tileX, tileY) || !this._quitOnFail), false))
return false;
}
}
return true;
}
public override bool Perform(Point origin, GenAction action)
{
float num1 = new Vector2((float) this._offset.X, (float) this._offset.Y).Length();
int size = (int) ((double) num1 / 6.0);
if (this._endPoints != null)
this._endPoints.Add(new Point(origin.X + this._offset.X, origin.Y + this._offset.Y));
if (!this.PerformSegment(origin, action, origin, new Point(origin.X + this._offset.X, origin.Y + this._offset.Y), size))
return false;
int num2 = (int) ((double) num1 / 8.0);
for (int index = 0; index < num2; ++index)
{
float num3 = (float) (((double) index + 1.0) / ((double) num2 + 1.0));
Point point1 = new Point((int) ((double) num3 * (double) this._offset.X), (int) ((double) num3 * (double) this._offset.Y));
Vector2 spinningpoint = new Vector2((float) (this._offset.X - point1.X), (float) (this._offset.Y - point1.Y));
spinningpoint = spinningpoint.RotatedBy((GenBase._random.NextDouble() * 0.5 + 1.0) * (GenBase._random.Next(2) == 0 ? -1.0 : 1.0)) * 0.75f;
Point point2 = new Point((int) spinningpoint.X + point1.X, (int) spinningpoint.Y + point1.Y);
if (this._endPoints != null)
this._endPoints.Add(new Point(point2.X + origin.X, point2.Y + origin.Y));
if (!this.PerformSegment(origin, action, new Point(point1.X + origin.X, point1.Y + origin.Y), new Point(point2.X + origin.X, point2.Y + origin.Y), size - 1))
return false;
}
return true;
}
public ShapeBranch OutputEndpoints(List<Point> endpoints)
{
this._endPoints = endpoints;
return this;
}
}
}