@ -215,6 +215,11 @@ static void GetConnectionStatus(Interface* self) {
rb . Push ( RESULT_SUCCESS ) ;
rb . Push ( RESULT_SUCCESS ) ;
rb . PushRaw ( connection_status ) ;
rb . PushRaw ( connection_status ) ;
// Reset the bitmask of changed nodes after each call to this
// function to prevent falsely informing games of outstanding
// changes in subsequent calls.
connection_status . changed_nodes = 0 ;
LOG_DEBUG ( Service_NWM , " called " ) ;
LOG_DEBUG ( Service_NWM , " called " ) ;
}
}
@ -314,8 +319,11 @@ static void BeginHostingNetwork(Interface* self) {
// The host is always the first node
// The host is always the first node
connection_status . network_node_id = 1 ;
connection_status . network_node_id = 1 ;
node_info [ 0 ] . network_node_id = 1 ;
node_info [ 0 ] . network_node_id = 1 ;
connection_status . nodes [ 0 ] = connection_status . network_node_id ;
// Set the bit 0 in the nodes bitmask to indicate that node 1 is already taken.
// Set the bit 0 in the nodes bitmask to indicate that node 1 is already taken.
connection_status . node_bitmask | = 1 ;
connection_status . node_bitmask | = 1 ;
// Notify the application that the first node was set.
connection_status . changed_nodes | = 1 ;
// If the game has a preferred channel, use that instead.
// If the game has a preferred channel, use that instead.
if ( network_info . channel ! = 0 )
if ( network_info . channel ! = 0 )
@ -352,6 +360,8 @@ static void DestroyNetwork(Interface* self) {
// Unschedule the beacon broadcast event.
// Unschedule the beacon broadcast event.
CoreTiming : : UnscheduleEvent ( beacon_broadcast_event , 0 ) ;
CoreTiming : : UnscheduleEvent ( beacon_broadcast_event , 0 ) ;
// TODO(Subv): Check if connection_status is indeed reset after this call.
connection_status = { } ;
connection_status . status = static_cast < u8 > ( NetworkStatus : : NotConnected ) ;
connection_status . status = static_cast < u8 > ( NetworkStatus : : NotConnected ) ;
connection_status_event - > Signal ( ) ;
connection_status_event - > Signal ( ) ;