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

388 lines
12 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Terraria.WorldBuilding.Actions
// 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 System.Collections.Generic;
using Terraria.DataStructures;
using Terraria.GameContent;
namespace Terraria.WorldBuilding
{
public static class Actions
{
public static GenAction Chain(params GenAction[] actions)
{
for (int index = 0; index < actions.Length - 1; ++index)
actions[index].NextAction = actions[index + 1];
return actions[0];
}
public static GenAction Continue(GenAction action) => (GenAction) new Actions.ContinueWrapper(action);
public class ContinueWrapper : GenAction
{
private GenAction _action;
public ContinueWrapper(GenAction action) => this._action = action;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
this._action.Apply(origin, x, y, args);
return this.UnitApply(origin, x, y, args);
}
}
public class Count : GenAction
{
private Ref<int> _count;
public Count(Ref<int> count) => this._count = count;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
++this._count.Value;
return this.UnitApply(origin, x, y, args);
}
}
public class Scanner : GenAction
{
private Ref<int> _count;
public Scanner(Ref<int> count) => this._count = count;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
++this._count.Value;
return this.UnitApply(origin, x, y, args);
}
}
public class TileScanner : GenAction
{
private ushort[] _tileIds;
private Dictionary<ushort, int> _tileCounts;
public TileScanner(params ushort[] tiles)
{
this._tileIds = tiles;
this._tileCounts = new Dictionary<ushort, int>();
for (int index = 0; index < tiles.Length; ++index)
this._tileCounts[this._tileIds[index]] = 0;
}
public override bool Apply(Point origin, int x, int y, params object[] args)
{
Tile tile = GenBase._tiles[x, y];
if (tile.active() && this._tileCounts.ContainsKey(tile.type))
this._tileCounts[tile.type]++;
return this.UnitApply(origin, x, y, args);
}
public Actions.TileScanner Output(Dictionary<ushort, int> resultsOutput)
{
this._tileCounts = resultsOutput;
for (int index = 0; index < this._tileIds.Length; ++index)
{
if (!this._tileCounts.ContainsKey(this._tileIds[index]))
this._tileCounts[this._tileIds[index]] = 0;
}
return this;
}
public Dictionary<ushort, int> GetResults() => this._tileCounts;
public int GetCount(ushort tileId) => !this._tileCounts.ContainsKey(tileId) ? -1 : this._tileCounts[tileId];
}
public class Blank : GenAction
{
public override bool Apply(Point origin, int x, int y, params object[] args) => this.UnitApply(origin, x, y, args);
}
public class Custom : GenAction
{
private GenBase.CustomPerUnitAction _perUnit;
public Custom(GenBase.CustomPerUnitAction perUnit) => this._perUnit = perUnit;
public override bool Apply(Point origin, int x, int y, params object[] args) => this._perUnit(x, y, args) | this.UnitApply(origin, x, y, args);
}
public class ClearMetadata : GenAction
{
public override bool Apply(Point origin, int x, int y, params object[] args)
{
GenBase._tiles[x, y].ClearMetadata();
return this.UnitApply(origin, x, y, args);
}
}
public class Clear : GenAction
{
public override bool Apply(Point origin, int x, int y, params object[] args)
{
GenBase._tiles[x, y].ClearEverything();
return this.UnitApply(origin, x, y, args);
}
}
public class ClearTile : GenAction
{
private bool _frameNeighbors;
public ClearTile(bool frameNeighbors = false) => this._frameNeighbors = frameNeighbors;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
WorldUtils.ClearTile(x, y, this._frameNeighbors);
return this.UnitApply(origin, x, y, args);
}
}
public class ClearWall : GenAction
{
private bool _frameNeighbors;
public ClearWall(bool frameNeighbors = false) => this._frameNeighbors = frameNeighbors;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
WorldUtils.ClearWall(x, y, this._frameNeighbors);
return this.UnitApply(origin, x, y, args);
}
}
public class HalfBlock : GenAction
{
private bool _value;
public HalfBlock(bool value = true) => this._value = value;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
GenBase._tiles[x, y].halfBrick(this._value);
return this.UnitApply(origin, x, y, args);
}
}
public class SetTile : GenAction
{
private ushort _type;
private bool _doFraming;
private bool _doNeighborFraming;
public SetTile(ushort type, bool setSelfFrames = false, bool setNeighborFrames = true)
{
this._type = type;
this._doFraming = setSelfFrames;
this._doNeighborFraming = setNeighborFrames;
}
public override bool Apply(Point origin, int x, int y, params object[] args)
{
GenBase._tiles[x, y].Clear(~(TileDataType.Wiring | TileDataType.Actuator));
GenBase._tiles[x, y].type = this._type;
GenBase._tiles[x, y].active(true);
if (this._doFraming)
WorldUtils.TileFrame(x, y, this._doNeighborFraming);
return this.UnitApply(origin, x, y, args);
}
}
public class SetTileKeepWall : GenAction
{
private ushort _type;
private bool _doFraming;
private bool _doNeighborFraming;
public SetTileKeepWall(ushort type, bool setSelfFrames = false, bool setNeighborFrames = true)
{
this._type = type;
this._doFraming = setSelfFrames;
this._doNeighborFraming = setNeighborFrames;
}
public override bool Apply(Point origin, int x, int y, params object[] args)
{
ushort wall = GenBase._tiles[x, y].wall;
int wallFrameX = GenBase._tiles[x, y].wallFrameX();
int wallFrameY = GenBase._tiles[x, y].wallFrameY();
GenBase._tiles[x, y].Clear(~(TileDataType.Wiring | TileDataType.Actuator));
GenBase._tiles[x, y].type = this._type;
GenBase._tiles[x, y].active(true);
if (wall > (ushort) 0)
{
GenBase._tiles[x, y].wall = wall;
GenBase._tiles[x, y].wallFrameX(wallFrameX);
GenBase._tiles[x, y].wallFrameY(wallFrameY);
}
if (this._doFraming)
WorldUtils.TileFrame(x, y, this._doNeighborFraming);
return this.UnitApply(origin, x, y, args);
}
}
public class DebugDraw : GenAction
{
private Color _color;
private SpriteBatch _spriteBatch;
public DebugDraw(SpriteBatch spriteBatch, Color color = default (Color))
{
this._spriteBatch = spriteBatch;
this._color = color;
}
public override bool Apply(Point origin, int x, int y, params object[] args)
{
this._spriteBatch.Draw(TextureAssets.MagicPixel.Value, new Microsoft.Xna.Framework.Rectangle((x << 4) - (int) Main.screenPosition.X, (y << 4) - (int) Main.screenPosition.Y, 16, 16), this._color);
return this.UnitApply(origin, x, y, args);
}
}
public class SetSlope : GenAction
{
private int _slope;
public SetSlope(int slope) => this._slope = slope;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
WorldGen.SlopeTile(x, y, this._slope);
return this.UnitApply(origin, x, y, args);
}
}
public class SetHalfTile : GenAction
{
private bool _halfTile;
public SetHalfTile(bool halfTile) => this._halfTile = halfTile;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
GenBase._tiles[x, y].halfBrick(this._halfTile);
return this.UnitApply(origin, x, y, args);
}
}
public class PlaceTile : GenAction
{
private ushort _type;
private int _style;
public PlaceTile(ushort type, int style = 0)
{
this._type = type;
this._style = style;
}
public override bool Apply(Point origin, int x, int y, params object[] args)
{
WorldGen.PlaceTile(x, y, (int) this._type, true, style: this._style);
return this.UnitApply(origin, x, y, args);
}
}
public class RemoveWall : GenAction
{
public override bool Apply(Point origin, int x, int y, params object[] args)
{
GenBase._tiles[x, y].wall = (ushort) 0;
return this.UnitApply(origin, x, y, args);
}
}
public class PlaceWall : GenAction
{
private ushort _type;
private bool _neighbors;
public PlaceWall(ushort type, bool neighbors = true)
{
this._type = type;
this._neighbors = neighbors;
}
public override bool Apply(Point origin, int x, int y, params object[] args)
{
GenBase._tiles[x, y].wall = this._type;
WorldGen.SquareWallFrame(x, y);
if (this._neighbors)
{
WorldGen.SquareWallFrame(x + 1, y);
WorldGen.SquareWallFrame(x - 1, y);
WorldGen.SquareWallFrame(x, y - 1);
WorldGen.SquareWallFrame(x, y + 1);
}
return this.UnitApply(origin, x, y, args);
}
}
public class SetLiquid : GenAction
{
private int _type;
private byte _value;
public SetLiquid(int type = 0, byte value = 255)
{
this._value = value;
this._type = type;
}
public override bool Apply(Point origin, int x, int y, params object[] args)
{
GenBase._tiles[x, y].liquidType(this._type);
GenBase._tiles[x, y].liquid = this._value;
return this.UnitApply(origin, x, y, args);
}
}
public class SwapSolidTile : GenAction
{
private ushort _type;
public SwapSolidTile(ushort type) => this._type = type;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
Tile tile = GenBase._tiles[x, y];
if (!WorldGen.SolidTile(tile))
return this.Fail();
tile.ResetToType(this._type);
return this.UnitApply(origin, x, y, args);
}
}
public class SetFrames : GenAction
{
private bool _frameNeighbors;
public SetFrames(bool frameNeighbors = false) => this._frameNeighbors = frameNeighbors;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
WorldUtils.TileFrame(x, y, this._frameNeighbors);
return this.UnitApply(origin, x, y, args);
}
}
public class Smooth : GenAction
{
private bool _applyToNeighbors;
public Smooth(bool applyToNeighbors = false) => this._applyToNeighbors = applyToNeighbors;
public override bool Apply(Point origin, int x, int y, params object[] args)
{
Tile.SmoothSlope(x, y, this._applyToNeighbors);
return this.UnitApply(origin, x, y, args);
}
}
}
}