ModernUO/Scripts/Items/Games/Mahjong/MahjongTile.cs
2018-09-14 08:46:14 -07:00

88 lines
2.8 KiB
C#

namespace Server.Engines.Mahjong
{
public class MahjongTile
{
public static MahjongPieceDim GetDimensions( Point2D position, MahjongPieceDirection direction )
{
if ( direction == MahjongPieceDirection.Up || direction == MahjongPieceDirection.Down )
return new MahjongPieceDim( position, 20, 30 );
else
return new MahjongPieceDim( position, 30, 20 );
}
private MahjongGame m_Game;
private int m_Number;
private MahjongTileType m_Value;
protected Point2D m_Position;
private int m_StackLevel;
private MahjongPieceDirection m_Direction;
private bool m_Flipped;
public MahjongGame Game => m_Game;
public int Number => m_Number;
public MahjongTileType Value => m_Value;
public Point2D Position => m_Position;
public int StackLevel => m_StackLevel;
public MahjongPieceDirection Direction => m_Direction;
public bool Flipped => m_Flipped;
public MahjongTile( MahjongGame game, int number, MahjongTileType value, Point2D position, int stackLevel, MahjongPieceDirection direction, bool flipped )
{
m_Game = game;
m_Number = number;
m_Value = value;
m_Position = position;
m_StackLevel = stackLevel;
m_Direction = direction;
m_Flipped = flipped;
}
public MahjongPieceDim Dimensions => GetDimensions( m_Position, m_Direction );
public bool IsMovable => m_Game.GetStackLevel( Dimensions ) <= m_StackLevel;
public void Move( Point2D position, MahjongPieceDirection direction, bool flip, int validHandArea )
{
MahjongPieceDim dim = GetDimensions( position, direction );
int curHandArea = Dimensions.GetHandArea();
int newHandArea = dim.GetHandArea();
if ( !IsMovable || !dim.IsValid() || ( validHandArea >= 0 && ((curHandArea >= 0 && curHandArea != validHandArea) || (newHandArea >= 0 && newHandArea != validHandArea)) ) )
return;
m_Position = position;
m_Direction = direction;
m_StackLevel = -1; // Avoid self interference
m_StackLevel = m_Game.GetStackLevel( dim ) + 1;
m_Flipped = flip;
m_Game.Players.SendTilePacket( this, true, true );
}
public void Save( GenericWriter writer )
{
writer.Write( (int) 0 ); // version
writer.Write( m_Number );
writer.Write( (int) m_Value );
writer.Write( m_Position );
writer.Write( m_StackLevel );
writer.Write( (int) m_Direction );
writer.Write( m_Flipped );
}
public MahjongTile( MahjongGame game, GenericReader reader )
{
m_Game = game;
int version = reader.ReadInt();
m_Number = reader.ReadInt();
m_Value = (MahjongTileType) reader.ReadInt();
m_Position = reader.ReadPoint2D();
m_StackLevel = reader.ReadInt();
m_Direction = (MahjongPieceDirection) reader.ReadInt();
m_Flipped = reader.ReadBool();
}
}
}