예제 #1
0
        public bool AddItem(Item item, Point location, IHistoryTransaction trans,
                            CollisionAction collisionAction = CollisionAction.ThrowException)
        {
            if (!item.IsRoot)
            {
                throw new InvalidOperationException("Only root items may be added to the field.");
            }
            Size size = item.GetSize();
            var  l    = mapManager.CurrentLayer;

            var itemRect = new Rectangle(location, size);

            if (IsOccupied(itemRect))
            {
                switch (collisionAction)
                {
                case CollisionAction.ThrowException:
                    throw new InvalidOperationException("The specified location is already occupied.");

                case CollisionAction.Abort:
                    return(false);

                case CollisionAction.Overwrite:
                    DeleteRect(itemRect, trans);
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(collisionAction), collisionAction, null);
                }
            }

            if (!IsInWorldBounds(itemRect))
            {
                switch (collisionAction)
                {
                case CollisionAction.ThrowException:
                    throw new InvalidOperationException("The specified location is outside of the world.");

                case CollisionAction.Abort:
                    return(false);

                case CollisionAction.Overwrite:
                    return(false);

                default:
                    throw new ArgumentOutOfRangeException(nameof(collisionAction), collisionAction, null);
                }
            }

            trans?.AddStep(new AddItemStep(item, location, this));
            Item tile = l.GetTile(location);

            l.SetExtensionTiles(item, location.X, location.Y);
            tile.CopyFrom(item);
            return(true);
        }
예제 #2
0
 public PaintAction(IHistoryService historyService, Item item)
 {
     this.transaction = historyService.BeginTransaction("Paint");
     this.item        = item;
     this.itemSize    = item.GetSize();
 }
예제 #3
0
 public void DeleteAll(IHistoryTransaction trans)
 {
     DeleteRect(WorldTileBounds, trans);
 }
예제 #4
0
 public EraseAction(IHistoryService historyService)
 {
     this.transaction = historyService.BeginTransaction("Eraser");
 }