Really, the roughest part of buttons in SB4 are the new constant names, I think. #B_RRIGHT is just way clunkier than #A, for example. However, nothing's stopping you from defining your own constants in SB4, thanks to the new CONST keyword, so let's look at a comparison of BUTTON in SB3 and SB4, assuming you've made constants in SB4 defined as CONST #A=#B_RRIGHT, etc.
'First line is SB3, second is SB4 'Check if X is being held BUTTON() AND #X BUTTON(0,#X) 'Check if A was pressed this frame BUTTON(2) AND #A BUTTON(0,#A,2) 'Check if L and R are both being held (BUTTON() AND #L) && (BUTTON() AND #R) BUTTON(0,#L) && BUTTON(0,#R) 'Check if B isn't being held this frame !(BUTTON() AND #B) !BUTTON(0,#B)The SB4 version of BUTTON doesn't seem too bad to me. In fact, I'd say it's easier to understand! It's just unfortunate how verbose the button constants are now, if you stick with the default names of #B_LLEFT and #B_RDOWN and so on.