I improved the visibility blocking routine a bit. Here's one picture:
It could be a bit better.
The actual idea is quite hard to explain and the code got quite complicated. But since there are alreade many 2D Ultima remakes, I'll share the code to check the right side of the player.
Before checking, the code marks all tiles, that may block the visibility with 8's into showMap that's size is the visible area. Then I have another check for the showMap array. All "alone" 8's are marked with 9's. If 9's block the visibility the blocking number is 7. This could work better.
In fact the checking of other sides may have removed the necessary 8's for checking, this is why in the code below the check is made for the actual blocking tile in some parts. The code of blocking tile is 6.
The right side of the player is checked like this (the code really got complicated

):
Cerberus:
For Local y:Int = 0 To 17 - 1
For Local x:Int = 0 To 17 - 1
...
If (map[inMap(scrollX / 16 + x, scrollY / 16 + y)] = 6 Or showMap[x + y * 17] = 9) And x > 8 Then
For Local xp:Int = x + 1 To 17 - 1
If y = 8 Then
Local mark:Int
If showMap[x + y * 17] = 8 Then mark = 2
If showMap[x + y * 17] = 9 Then mark = 7
showMap[xp + y * 17] = mark
Endif
If y > 4 And y < 17 - 1 - 4 Then
For Local yp:Int = y + 1 To 17 - 1
'If showMap[xp - 1 + yp * 17] = 8 Then
If map[inMap(scrollX / 16 + xp - 1, scrollY / 16 + yp)] = 6
For Local xpp:Int = xp To 17 - 1
showMap[xpp + yp * 17] = 2
Next
Else
Exit
Endif
Next
For Local yp:Int = y - 1 To 0 Step -1
'If showMap[xp - 1 + yp * 17] = 8 Then
If map[inMap(scrollX / 16 + xp - 1, scrollY / 16 + yp)] = 6
For Local xpp:Int = xp To 17 - 1
showMap[xpp + yp * 17] = 2
Next
Else
Exit
Endif
Next
Endif
Next
Endif
...
The worldmap is in map array and the inMap function inside the map array always returns values that are inside the array.
It's a miracle that I understand anything about the code above, since I didn't comment it at all.