86 lines
2.6 KiB
C#
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);
|
|
}
|
|
}
|