@ -75,6 +75,36 @@ void Controller::Initialize() {
" Unknown ControllerSupportArgPrivate revision={} with size={} " ,
library_applet_version , controller_private_arg . arg_private_size ) ;
// Some games such as Cave Story+ set invalid values for the ControllerSupportMode.
// Defer to arg_size to set the ControllerSupportMode.
if ( controller_private_arg . mode > = ControllerSupportMode : : MaxControllerSupportMode ) {
switch ( controller_private_arg . arg_size ) {
case sizeof ( ControllerSupportArgOld ) :
case sizeof ( ControllerSupportArgNew ) :
controller_private_arg . mode = ControllerSupportMode : : ShowControllerSupport ;
break ;
case sizeof ( ControllerUpdateFirmwareArg ) :
controller_private_arg . mode = ControllerSupportMode : : ShowControllerFirmwareUpdate ;
break ;
default :
UNIMPLEMENTED_MSG ( " Unknown ControllerPrivateArg mode={} with arg_size={} " ,
controller_private_arg . mode , controller_private_arg . arg_size ) ;
controller_private_arg . mode = ControllerSupportMode : : ShowControllerSupport ;
break ;
}
}
// Some games such as Cave Story+ set invalid values for the ControllerSupportCaller.
// This is always 0 (Application) except with ShowControllerFirmwareUpdateForSystem.
if ( controller_private_arg . caller > = ControllerSupportCaller : : MaxControllerSupportCaller ) {
if ( controller_private_arg . flag_1 & &
controller_private_arg . mode = = ControllerSupportMode : : ShowControllerFirmwareUpdate ) {
controller_private_arg . caller = ControllerSupportCaller : : System ;
} else {
controller_private_arg . caller = ControllerSupportCaller : : Application ;
}
}
switch ( controller_private_arg . mode ) {
case ControllerSupportMode : : ShowControllerSupport : {
const auto user_arg_storage = broker . PopNormalDataToApplet ( ) ;