public bool HandleItemMove(MapItem item, int x, int y) { var cell = item.Cell; var purpose = item.GetComponentInChildren <ItemPurpose>(); var items = new List <MapItem>(); items.Add(item); bool canPush = false; while (true) { cell.x += x; cell.y += y; if (!_tilemap.HasTile(cell)) { break; } var door = GetDoor(cell); if (door != null && !door.IsOpen) { break; } if (HasMapItem(cell)) { var i = GetMapItem(cell); if (i.CanPush) { items.Add(i); } else { break; } } else { canPush = true; break; } } if (!canPush) { if (purpose != null) { purpose.ShowCantMovePurpose(x, y); } return(false); } foreach (var i in items) { i.Move(x, y); } if (purpose != null) { purpose.ShowMovePurpose(x, y); } return(true); }