Okay, so if anyone needs it this one gets the job done:
#define joy_available (num_joysticks >= 1)
#define joy_dpad_center (joy_available && joy_hat == -1)
#define joy_dpad_up (joy_available && joy_dpad_available && joy_hat != -1 && (joy_hat < 67.5 || joy_hat > 292.5))
#define joy_dpad_down (joy_available && joy_dpad_available && joy_hat != -1 && joy_hat > 112.5 && joy_hat < 247.5)
#define joy_dpad_left (joy_available && joy_dpad_available && joy_hat != -1 && joy_hat > 202.5 && joy_hat < 337.5)
#define joy_dpad_right (joy_available && joy_dpad_available && joy_hat != -1 && joy_hat > 22.5 && joy_hat < 157.5)
#define joy2_available (num_joysticks >= 2)
#define joy2_dpad_center (joy2_available && joy2_hat == -1)
#define joy2_dpad_up (joy2_available && joy2_dpad_available && joy2_hat != -1 && joy2_hat < 67.5 || joy2_hat > 292.5)
#define joy2_dpad_down (joy2_available && joy2_dpad_available && joy2_hat != -1 && joy2_hat > 112.5 && joy2_hat < 247.5)
#define joy2_dpad_left (joy2_available && joy2_dpad_available && joy2_hat != -1 && joy2_hat > 202.5 && joy2_hat < 337.5)
#define joy2_dpad_right (joy2_available && joy2_dpad_available && joy2_hat != -1 && joy2_hat > 22.5 && joy2_hat < 157.5)
byte joy_dpad_available = false;
byte joy2_dpad_available = false;
// no need to call this function yourself!! the engine will do this automatically on startup due to the '_startup' suffix
void __joy_dpad_check_startup()
{
if(num_joysticks <= 0) // no direct input game controllers connected
return;
while(!joy_dpad_available || (joy2_available && !joy2_dpad_available))
{
if(joy_dpad_center) joy_dpad_available = true;
if(joy2_dpad_center && joy2_available) joy2_dpad_available = true;
wait(-1);
}
}
Note that it only checks if a dpad is available every second. If you want it to check every frame you can use wait(1) instead.
edit#3: oops, forgot that there's no 'bool' in standard lite-c so I changed it to byte
also added some safety checks that prevent joy_dpad_up to be true when no gamepad is connected