public bool SetFacing( Direction facing )
{
if ( Parent != null || this.Map == null )
return false;
if ( CheckDecay() )
return false;
if ( Map != Map.Internal )
{
switch ( facing )
{
case Direction.North: if ( !CanFit( Location, Map, NorthID ) ) return false; break;
case Direction.East: if ( !CanFit( Location, Map, EastID ) ) return false; break;
case Direction.South: if ( !CanFit( Location, Map, SouthID ) ) return false; break;
case Direction.West: if ( !CanFit( Location, Map, WestID ) ) return false; break;
}
}
Direction old = m_Facing;
m_Facing = facing;
if ( m_TillerMan != null )
m_TillerMan.SetFacing( facing );
if ( m_Hold != null )
m_Hold.SetFacing( facing );
if ( m_PPlank != null )
m_PPlank.SetFacing( facing );
if ( m_SPlank != null )
m_SPlank.SetFacing( facing );
List<IEntity> toMove = GetMovingEntities();
toMove.Add( m_PPlank );
toMove.Add( m_SPlank );
int xOffset = 0, yOffset = 0;
Movement.Movement.Offset( facing, ref xOffset, ref yOffset );
if ( m_TillerMan != null )
m_TillerMan.Location = new Point3D( X + (xOffset * TillerManDistance) + (facing == Direction.North ? 1 : 0), Y + (yOffset * TillerManDistance), m_TillerMan.Z );
if ( m_Hold != null )
m_Hold.Location = new Point3D( X + (xOffset * HoldDistance), Y + (yOffset * HoldDistance), m_Hold.Z );
int count = (int)(m_Facing - old) & 0x7;
count /= 2;
for ( int i = 0; i < toMove.Count; ++i )
{
IEntity e = toMove[i];
if ( e is Item )
{
Item item = (Item)e;
item.Location = Rotate( item.Location, count );
}
else if ( e is Mobile )
{
Mobile m = (Mobile)e;
m.Direction = ( m.Direction - old + facing ) & Direction.Mask;
m.Location = Rotate( m.Location, count );
}
}
switch ( facing )
{
case Direction.North: ItemID = NorthID; break;
case Direction.East: ItemID = EastID; break;
case Direction.South: ItemID = SouthID; break;
case Direction.West: ItemID = WestID; break;
}
return true;
}