/* Player is moving, bomb is moving */
        private bool HandlePlayerMovingBombMovingCollision(Bomb bomb)
        {
            Debug.Assert(IsMoving());
            Debug.Assert(bomb.IsMoving());

            bool hasKick = HasKick();

            if (direction == Util.Opposite(bomb.direction)) // moving in opposite directions
            {
                if (IsMovingTowards(bomb))
                {
                    if (CheckCell2BoundsCollision(bomb) || CheckBounds2CellCollision(bomb))
                    {
                        if (hasKick)
                        {
                            // move bomb out of player`s cell
                            bomb.MoveOutOfCell(this);

                            // kick in the moving direction
                            TryKick(bomb);

                            return true;
                        }

                        // treat player as an obstacle
                        bomb.HandleObstacleCollistion(this);

                        // make sure player is out of bomb`s cell
                        MoveOutOfCell(bomb);

                        return true;
                    }
                }
            }
            else if (direction == bomb.direction) // moving in the same direction
            {
                if (bomb.IsMovingTowards(this)) // bomb`s following player?
                {
                    if (bomb.CheckBounds2CellCollision(this)) // bomb bounds should collide player`s cell
                    {
                        // treat player as an obstacle
                        bomb.HandleObstacleCollistion(this);

                        return true;
                    }
                }
                else if (IsMovingTowards(bomb)) // player`s following bomb
                {
                    if (CheckCell2BoundsCollision(bomb) || CheckBounds2CellCollision(bomb))
                    {
                        if (hasKick)
                        {
                            // kick in the moving direction
                            TryKick(bomb);

                            return true;
                        }

                        // make sure player is out of bomb`s cell
                        MoveOutOfCell(bomb);

                        return true;
                    }
                }
            }
            else // player and bomb move in perpendicular directions
            {
                if (CheckCell2CellCollision(bomb))
                {
                    return false;
                }

                if (CheckBounds2CellCollision(bomb) && CheckBounds2BoundsCollision(bomb))
                {
                    if (IsMovingTowards(bomb))
                    {
                        if (hasKick)
                        {
                            TryKick(bomb);
                        }

                        MoveOutOfCell(bomb);

                        return true;
                    }
                }

                if (bomb.CheckBounds2BoundsCollision(this))
                {
                    if (bomb.IsMovingTowards(this))
                    {
                        bomb.HandleObstacleCollistion(this);
                        return true;
                    }
                }
            }

            return false;
        }