ModernUO/Projects/UOContent/Items/Games/Mahjong/MahjongTile.cs
2022-06-16 10:19:49 -07:00

86 lines
2.6 KiB
C#

using ModernUO.Serialization;
namespace Server.Engines.Mahjong;
[SerializationGenerator(1, false)]
public partial class MahjongTile
{
[DirtyTrackingEntity]
private readonly MahjongGame _game;
[SerializableField(0, setter: "private")]
private int _number;
[SerializableField(1, setter: "private")]
private MahjongTileType _value;
[SerializableField(2, setter: "private")]
private Point2D _position;
[SerializableField(3, setter: "private")]
private int _stackLevel;
[SerializableField(4, setter: "private")]
private MahjongPieceDirection _direction;
[SerializableField(5, setter: "private")]
private bool _flipped;
public MahjongTile(MahjongGame game) => _game = game;
public MahjongTile(
MahjongGame game, int number, MahjongTileType value, Point2D position, int stackLevel,
MahjongPieceDirection direction, bool flipped
)
{
_game = game;
_number = number;
_value = value;
_position = position;
_stackLevel = stackLevel;
_direction = direction;
_flipped = flipped;
}
public MahjongGame Game => _game;
private void Deserialize(IGenericReader reader, int version)
{
_number = reader.ReadInt();
_value = (MahjongTileType)reader.ReadInt();
_position = reader.ReadPoint2D();
_stackLevel = reader.ReadInt();
_direction = (MahjongPieceDirection)reader.ReadInt();
_flipped = reader.ReadBool();
}
public MahjongPieceDim Dimensions => GetDimensions(_position, _direction);
public bool IsMovable => _game.GetStackLevel(Dimensions) <= _stackLevel;
public static MahjongPieceDim GetDimensions(Point2D position, MahjongPieceDirection direction) =>
direction is MahjongPieceDirection.Up or MahjongPieceDirection.Down
? new MahjongPieceDim(position, 20, 30)
: new MahjongPieceDim(position, 30, 20);
public void Move(Point2D position, MahjongPieceDirection direction, bool flip, int validHandArea)
{
var dim = GetDimensions(position, direction);
var curHandArea = Dimensions.GetHandArea();
var newHandArea = dim.GetHandArea();
if (!IsMovable || !dim.IsValid() || validHandArea >= 0 &&
(curHandArea >= 0 && curHandArea != validHandArea || newHandArea >= 0 && newHandArea != validHandArea))
{
return;
}
Position = position;
Direction = direction;
StackLevel = -1; // Avoid self interference
StackLevel = _game.GetStackLevel(dim) + 1;
Flipped = flip;
_game.Players.SendTilePacket(this, true, true);
}
}