We start off with some basic patterns:
The 1 next to the 3 has its edge satisfied, so we x around it. There can't be a line to the top left coming down because of the 1 on the top left preventing the formation of a corner, so we x that spot. Thus, there is only 1 spot left for the line for the 1 above the 1 next to the 3 to go.
Putting a line to the right of the leftmost 3 leads to a contradiction. The corner forces the top 2 to have a line on top, and also forces the top right 2's lines. However, at that point, both neighboring 1s have their lines satisfied, leading to a dead end.
Thus, we know how the 3 must look. We pick up an x on the top left side from earlier, and one next to the corner on the 3.
Putting an x on the left side of the top-left 1 would force a loop on the bottom, for the bottom left 1 to be satisfied, and for the line to enter and leave the bottom-most region. This forces deductions upwards until a contradiction must occur at the top left with a dead end.
Therefore, the top-left 1 has a line on its left side and an x on top. This gives us a bit of the top left.
The bottom-left 1 can't have a line on top (otherwise, dead end). Putting the line on the left gives us enough xs to get the line for the 1 to the right as well. This gives us the bottom-left side.
We make basic eliminations around the 0s area:
No matter how the bottom-left 2 is connected, the vertical edge 1 right and below will always be an x
Putting a line below the 2 forces a closed loop.
Therefore, the x below the 2 gives more of the bottom left.
Putting a line at the highlighted spot would force a dead end next to the 3.
Putting a line at either highlighted spot forces a dead end due to neighboring 1s.
One of the highlighted locations must be a line, and the other must be empty. Therefore, the exit to the existing line must be at the diagonally adjacent 1's bottom or left side, giving an x on top.
This gives us another x to prevent a dead end.
Based on the 2 to the right of the top-left 2, there must be an exiting line to the top-right. Since the right exit is blocked off, we get a vertical line. From this point, putting a line above the 2 would be a possibility. We then can't put a line to the right of the 2. If we put a line to the left as well, that forces the central 2 to be unsatisfiable.
If we put a line to the bottom instead, that would force a dead end/closed loop around the center left.
So, we can't put a line above the 2.
This forces the line to the top-right of the 2 to continue downwards, also satisfying the 1 to the right of the 2.
We fill in 1 more x
This allows us to add a line above the 2nd 2, given that the first 2 is entered from the bottom left, and the other exit is an x
Placing a line at the top right highlighted spot forces the orientation of the 3, which then forces the lines around the 2. In combination with the xs resulting from the placements, the bottom left highlighted spot is forced, which violated the adjacent 1 constraint. Thus, the top right highlighted spot cannot be a line.
The previously deduced spot can't be a line, and that makes the spot to the right of that also a dead end.
Trying to put an x at the highlighted spot will force a closed corner on the bottom center, and eventually a closed loop on the left side. Therefore, this must be a line.
The line gives another x on top of the adjacent 1
We try placing a line at the highlighted spot. It seems to work out so far...
... but then we propagate the xs across the bottom, and things start looking dicey. No matter which way the bottom-right 2 is covered (top and left, bottom and left), the 6 open dots only have 1 vertical entrance, and no horizontal escape. Using 2 horizontal lines to cover the 2 would create a closed loop as well. Therefore, a dead end/closed loop must occur if the highlighted spot is a line, so the highlighted spot is an x.
Making the highlighted spot an x gives a line next to the 1 and an x on the right of the highlighted spot.
We see that the central 2 is entered from the top right. Therefore, the exit is at the bottom left. We can put 2 xs on the non-relevant sides of the diagonally adjacent 1, then.
Putting a 1 at the highlighted spot immediately creates a dead end.
Therefore, we get a line on top of the adjacent one, giving more xs as well.
As the bottom-central 2 is entered from the highlighted spot, the exit must be on the bottom left. Given that one of those possibilities is an x, the other must be a line.
As the 2 to the left of the 2 from the last step is entered from the highlighted spot, the exit must be to the top left. Given that one of those possibilities is an x, the other must be line.
This gives us an x next to the straight line segments, an x next to the 1, a forced 2 (and x), and a forced exit for the top left line segment.
To avoid creating a dead end, we fill in the top left side like so:
We fill in the forced option for the bottom-central twos. Then, we fill in some xs (some forced xs, one because of not being adjacent to an incoming line for a 1, and then some more forced xs).
Making the highlighted spot a line would force a loop/dead end at the bottom right, so it is an x.
This would force the orientation of the 2.
Filling in the x on the 2 fixes the orientation of the 3.
Filling in more forced xs and lines gives the following:
Making the highlighted spot into a line forces the same group of 6 dots to be locked in on the bottom-right side (adjacent to the 2 from before). As before, covering the 2 guarantees a dead end/closed loop. Thus, the highlighted spot is an x.
The x gives a forced line on the 1. The forced line has no choice but to connect to the pre-existing line at the bottom-center.
We get a forced line on the remaining central 1, and 2 xs on impossible squares for the diagonally top-right 1.
Making the highlighted spot into a line forces the vertically analogous (mirrored) group of 6 dots to be locked in on the top-right side (adjacent to the top-right 2). As before, covering the 2 guarantees a dead end/closed loop. Thus, the highlighted spot is an x.
Making the previously highlighted spot an x forces lines for the 2 adjacent 1s.
Forced lines and xs are now filled in.
Filling in the bottom-right 2 like this would force a dead end on the bottom right side (or 2 having 3 adjacent lines)
Filling in the bottom-right 2 like this would force the leftmost highlighted spot to be a loop if filled, and a dead end if not filled.
Thus, the only way to fill in the 2 is like so:
Filling in more forced xs and forced lines gets us this far:
Now, of course, there are only 2 options for the 2 lines adjacent to the top-right 2, and the rest is forced.
Well, that wasn't that hard... right?