Python 3.8 (pre-release), 127123 bytes
print(''.join([['\n'['\n',['*'*x,' '*-x][x<0]][x!=0] for=0]for x in [y(y-90for y in b'RdZVlZXpZYaX`XaZYrZtZtZ_WdW_ZY_WbW_ZY`N`ZXpZVlZRd']]b'RdZVlZXpZYaX`XaZYrZtZtZ_WdW_ZY_WbW_ZY`N`ZXpZVlZRd')))
Explanation
The list-switch part outputs newlines when x is 0, x number of '*'
characters when x > 0, and -x number of ' '
characters when x < 0. I think of it as abs(x) characters, where the sign determines which character I'm writing.
The byte list comprehension subtracts 90 from each byte in the buffer to feed the outer comprehension the expected values centered at 0, since a buffer can't hold negatives in a literal (afaik).
Used a script to encode the smiley face as character run lengths to create the bytes literal... I think I lost the original but may add it later.