diff --git a/gdnative/test/bitset.gd b/gdnative/test/bitset.gd index 412f274..426f684 100644 --- a/gdnative/test/bitset.gd +++ b/gdnative/test/bitset.gd @@ -6,49 +6,49 @@ # Called when the node enters the scene tree for the first time. func _ready(): - pass # Replace with function body. + pass # Replace with function body. # Called every frame. 'delta' is the elapsed time since the previous frame. #func _process(delta): # pass func test_resize(): - #var bitset = preload("res://bitset.gdns").new() - var bitset = BitSet.new() - print ("[bitset:test_resize]") - bitset.resize(1024) + #var bitset = preload("res://bitset.gdns").new() + var bitset = BitSet.new() + print ("[bitset:test_resize]") + bitset.resize(1024) func test_write(): - #var bitset = preload("res://bitset.gdns").new() - var bitset = BitSet.new() - print ("[bitset:test_put]") - bitset.resize(1024) - #print ("[bitset:test_put] " + bitset.show()) - assert( bitset.show() == "0000000000000000000000000000010000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") - bitset.write(1, 1) - #print ("[bitset:test_put] " + bitset.show()) - assert( bitset.show() == "0000000000000000000000000000010000000000000000000000000000000000001000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") - bitset.write(2, 1) - #print ("[bitset:test_put] " + bitset.show()) - assert( bitset.show() == "0000000000000000000000000000010000000000000000000000000000000000001000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") - bitset.write(1, 0) - #print ("[bitset:test_put] " + bitset.show()) - assert( bitset.show() == "0000000000000000000000000000010000000000000000000000000000000000001000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") + #var bitset = preload("res://bitset.gdns").new() + var bitset = BitSet.new() + print ("[bitset:test_put]") + bitset.resize(1024) + print ("[bitset:test_put] " + bitset.show()) + assert( bitset.show() == "0000000000000000000000000000010000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") + bitset.write(1, 1) + print ("[bitset:test_put] " + bitset.show()) + assert( bitset.show() == "0000000000000000000000000000010000000000000000000000000000000000001000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") + bitset.write(2, 1) + print ("[bitset:test_put] " + bitset.show()) + assert( bitset.show() == "0000000000000000000000000000010000000000000000000000000000000000001000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") + bitset.write(1, 0) + print ("[bitset:test_put] " + bitset.show()) + assert( bitset.show() == "0000000000000000000000000000010000000000000000000000000000000000001000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") func test_alloc(): - #var BitSet = preload("res://bitset.gdns") - print ("[bitset:test_alloc]") - var tab = {} - tab[1478] = BitSet.new() - assert( tab.size() == 1 ) - tab[1479] = BitSet.new() - assert( tab.size() == 2 ) - tab.erase(1478) - assert( tab.size() == 1 ) + #var BitSet = preload("res://bitset.gdns") + print ("[bitset:test_alloc]") + var tab = {} + tab[1478] = BitSet.new() + assert( tab.size() == 1 ) + tab[1479] = BitSet.new() + assert( tab.size() == 2 ) + tab.erase(1478) + assert( tab.size() == 1 ) func test(): - print("[bitset] Start check -> start") - test_resize() - test_write() - test_alloc() - print("[bitset] Start check -> end") + print("[bitset] Start check -> start") + test_resize() + test_write() + test_alloc() + print("[bitset] Start check -> end") diff --git a/login_scene/login_scene.gd b/login_scene/login_scene.gd index 85b8681..4a0c628 100644 --- a/login_scene/login_scene.gd +++ b/login_scene/login_scene.gd @@ -4,96 +4,96 @@ signal character_creation_finished func _ready(): - $login_menu.show() - self.connect( "character_creation_finished", global, "_on_login_scene_character_creation_finished" ) + $login_menu.show() + self.connect( "character_creation_finished", global, "_on_login_scene_character_creation_finished" ) - global.get_node( "audio_stream_player" ).stream = load( "res://assets/musics/pre-mix_menu_pantin_remake.ogg" ) - global.get_node( "audio_stream_player" ).play() + global.get_node( "audio_stream_player" ).stream = load( "res://assets/musics/pre-mix_menu_pantin_remake.ogg" ) + global.get_node( "audio_stream_player" ).play() - $login_menu.show() - $register_menu.hide() - $license_menu.hide() - $settings_menu.hide() + $login_menu.show() + $register_menu.hide() + $license_menu.hide() + $settings_menu.hide() func _on_login_menu_login_button_pressed(): - print("[login_scene] Launch game") - $login_menu.hide() - $character_selection_menu.show() + print("[login_scene] Launch game") + $login_menu.hide() + $character_selection_menu.show() func _on_character_selection_menu_return_button_pressed(): - $login_menu.show() - $character_selection_menu.hide() + $login_menu.show() + $character_selection_menu.hide() func _on_character_selection_menu_character_selected( slot ): - var config_file = ConfigFile.new() - var err = config_file.load( "user://player.cfg" ) - if err: - print("Error code when loading player config file player.cfg: ", err) + var config_file = ConfigFile.new() + var err = config_file.load( "user://player.cfg" ) + if err: + print("Error code when loading player config file player.cfg: ", err) - character.slot = slot - character.pseudo = config_file.get_value( str(slot), "name", "player" ) - character.gender = config_file.get_value( str(slot), "gender", 1 ) - character.color = config_file.get_value( str(slot), "color", Color(1.0, 0.25, 0.25, 1.0) ) - character.size = config_file.get_value( str(slot), "size", 1.0 ) - character.ears_size = config_file.get_value( str(slot), "ears_size", 0.0 ) - character.eyes_color = config_file.get_value( str(slot), "eyes_color", Color( 0.0, 1.0, 0.0, 1.0 ) ) - character.update() + character.slot = slot + character.pseudo = config_file.get_value( str(slot), "name", "player" ) + character.gender = config_file.get_value( str(slot), "gender", 1 ) + character.color = config_file.get_value( str(slot), "color", Color(1.0, 0.25, 0.25, 1.0) ) + character.size = config_file.get_value( str(slot), "size", 1.0 ) + character.ears_size = config_file.get_value( str(slot), "ears_size", 0.0 ) + character.eyes_color = config_file.get_value( str(slot), "eyes_color", Color( 0.0, 1.0, 0.0, 1.0 ) ) + character.update() - emit_signal( "character_creation_finished" ) + emit_signal( "character_creation_finished" ) func _on_quit_button_pressed(): - print("[login_scene:_on_quit_button_pressed] Stop application") - net_low_level.disconnect_server() - self.get_tree().quit() + print("[login_scene:_on_quit_button_pressed] Stop application") + net_low_level.disconnect_server() + self.get_tree().quit() func _on_sound_button_toggled(button_pressed): - if button_pressed: - global.get_node( "audio_stream_player" ).stop() - else: - global.get_node( "audio_stream_player" ).play() + if button_pressed: + global.get_node( "audio_stream_player" ).stop() + else: + global.get_node( "audio_stream_player" ).play() func _on_login_menu_register_button_pressed(): - $login_menu.hide() - $register_menu.show() - $license_menu.hide() - $settings_menu.hide() + $login_menu.hide() + $register_menu.show() + $license_menu.hide() + $settings_menu.hide() func _on_register_menu_cancel_button_pressed(): - $login_menu.show() - $register_menu.hide() - $license_menu.hide() - $settings_menu.hide() + $login_menu.show() + $register_menu.hide() + $license_menu.hide() + $settings_menu.hide() func _on_register_menu_license_button_pressed(): - $login_menu.hide() - $register_menu.hide() - $license_menu.show() - $settings_menu.hide() + $login_menu.hide() + $register_menu.hide() + $license_menu.show() + $settings_menu.hide() func _on_license_menu_return_button_pressed(): - $login_menu.hide() - $register_menu.show() - $license_menu.hide() - $settings_menu.hide() + $login_menu.hide() + $register_menu.show() + $license_menu.hide() + $settings_menu.hide() func _on_register_menu_register_account_created(): - $login_menu.show() - $register_menu.hide() - $license_menu.hide() - $settings_menu.hide() + $login_menu.show() + $register_menu.hide() + $license_menu.hide() + $settings_menu.hide() func _on_Settings_menu_return_pressed(): - $login_menu.show() - $register_menu.hide() - $license_menu.hide() - $settings_menu.hide() + $login_menu.show() + $register_menu.hide() + $license_menu.hide() + $settings_menu.hide() func _on_settings_button_pressed(): - $login_menu.hide() - $register_menu.hide() - $license_menu.hide() - $settings_menu.load_settings() - $settings_menu.show() + $login_menu.hide() + $register_menu.hide() + $license_menu.hide() + $settings_menu.load_settings() + $settings_menu.show() diff --git a/modules/bitset/bitset.cpp b/modules/bitset/bitset.cpp index d7f93fc..4d0fc6e 100644 --- a/modules/bitset/bitset.cpp +++ b/modules/bitset/bitset.cpp @@ -63,12 +63,13 @@ int BitSet::size() { return this->_size_byte; } - +#include "core/os/os.h" void BitSet::resize(uint32_t num_bits) { uint32_t n_last_bits; uint32_t new_size_byte = (num_bits + BITSET_SIZE - 1) / BITSET_SIZE; + OS::get_singleton()->print((String("INFO [") + String(__FILE__) + String(":") + String(uitos(__LINE__)) + String("] Resize") + String("\n")).utf8()); new_size_byte = (num_bits + BITSET_SIZE - 1) / BITSET_SIZE; if (this->_size_byte != new_size_byte ) { @@ -92,17 +93,20 @@ void BitSet::resize(uint32_t num_bits) void BitSet::clear() { + OS::get_singleton()->print((String("INFO [") + String(__FILE__) + String(":") + String(uitos(__LINE__)) + String("] Clear") + String("\n")).utf8()); this->resize(1); } void BitSet::clear_data() { + OS::get_singleton()->print((String("INFO [") + String(__FILE__) + String(":") + String(uitos(__LINE__)) + String("] clear_data") + String("\n")).utf8()); for(uint32_t i = 0;i < this->_size_byte; ++i) this->_data[i] = 0; } void BitSet::set_bit(uint32_t bit_number) { + OS::get_singleton()->print((String("INFO [") + String(__FILE__) + String(":") + String(uitos(__LINE__)) + String("] set_bit") + String("\n")).utf8()); if (bit_number >= this->_num_bits) { ERR_PRINTS("[BitSet::set_bit] Out of range (size:" + itos(this->_size_byte) + ", pos:" + itos(bit_number) + ")" ); @@ -115,6 +119,7 @@ void BitSet::set_bit(uint32_t bit_number) void BitSet::clear_bit(uint32_t bit_number) { + OS::get_singleton()->print((String("INFO [") + String(__FILE__) + String(":") + String(uitos(__LINE__)) + String("] clear_bit") + String("\n")).utf8()); if (bit_number >= this->_num_bits) { ERR_PRINTS("[BitSet::clear_bit] Out of range (size:" + itos(this->_size_byte) + ", pos:" + itos(bit_number) + ")" ); @@ -122,7 +127,7 @@ void BitSet::clear_bit(uint32_t bit_number) } uint32_t mask = bit_number & (BITSET_SIZE - 1); mask = 1 << mask; - this->_data[bit_number>>5] &= mask; + this->_data[bit_number>>5] &= ~ mask; } void BitSet::write(uint32_t bit_number, bool value) diff --git a/modules/debug/debug.h b/modules/debug/debug.h index 9cc3637..8d0790f 100644 --- a/modules/debug/debug.h +++ b/modules/debug/debug.h @@ -21,7 +21,8 @@ #include "core/error_macros.h" #ifdef DEBUG_ENABLED #include "core/os/os.h" - #define DBG_PRINT(m_string) OS::get_singleton()->print((String("[") + String(__FILE__) + String(":") + String(uitos(__LINE__)) + String("] ") + String(m_string) + String("\n")).utf8()) + #define DBG_PRINT(m_string) OS::get_singleton()->print((String("DEBUG [") + String(__FILE__) + String(":") + String(uitos(__LINE__)) + String("] ") + String(m_string) + String("\n")).utf8()) #else #define DBG_PRINT(m_string) #endif +#define INF_PRINT(m_string) OS::get_singleton()->print((String("INFO [") + String(__FILE__) + String(":") + String(uitos(__LINE__)) + String("] ") + String(m_string) + String("\n")).utf8()) \ No newline at end of file diff --git a/modules/networkconnection/state_connexion.cpp b/modules/networkconnection/state_connexion.cpp index 2640b33..fd06e51 100644 --- a/modules/networkconnection/state_connexion.cpp +++ b/modules/networkconnection/state_connexion.cpp @@ -22,12 +22,52 @@ #include "state_connexion.h" #include "network_connection_core.h" #include "modules/debug/debug.h" +#include "modules/networkconnection/network_data.h" -// We need managed when number 'uint32_t' exceed the capacity (32bits => 4294967296) -// So, we split in two group. -// < 0...1073741824 > < 1073741825 ... 3221225472 > < 3221225472 ... 4294967295 > -// Group 1 : < 0...1073741824 > + < 3221225472 ... 4294967295 > => number value : 2147483648 -// Group 2 : < 1073741825 ... 3221225472 > => number value : 2147483648 + + +inline uint32_t diff_uint32_circulate(uint32_t a, uint32_t b) +{ + // We need managed when number 'uint32_t' exceed the capacity (32bits => 4294967296) + // + // So, we split in two group. + // < 0...1073741824 > < 1073741825 ... 3221225472 > < 3221225472 ... 4294967295 > + // Group 1 : < 0...1073741824 > + < 3221225472 ... 4294967295 > => number value : 2147483648 + // Group 2 : < 1073741825 ... 3221225472 > => number value : 2147483648 + // + + if ( a >= 1073741825 && a <= 3221225472 ) + return a - b; + a += 1073741825; + b += 1073741825; + return a - b; +} + +inline void calculate_ack_bit(NetworkData * _data, bool ackBool) +{ + // bool ackBool = (!_SystemMode && (_ConnectionState == Connected || _ConnectionState == Synchronize)); + uint32_t i; + uint32_t ackBit = (ackBool ? 1 : 0); + + if ( _data->_current_received_number - _data->_last_received_number < 32) + { + _data->_ack_bit_mask <<= _data->_current_received_number - _data->_last_received_number; + _data->_ack_bit_mask |= _data->_last_ack_bit << (_data->_current_received_number - _data->_last_received_number - 1); + } + else + { + _data->_ack_bit_mask = (_data->_current_received_number - _data->_last_received_number == 32 && _data->_last_ack_bit != 0) ? 0x80000000 : 0x00000000; + } + _data->_last_ack_bit = ackBit; + for(i=_data->_last_received_number+1;i<_data->_current_received_number;++i) + _data->_long_ack_bit_field.clear_bit(i & 511); + _data->_long_ack_bit_field.write(_data->_current_received_number & 0x1ff, ackBool); + if ( diff_uint32_circulate(_data->_last_ack_in_long_ack, _data->_current_received_number) > 512 ) + { + _data->_last_ack_in_long_ack = _data->_current_received_number - 511; + } + _data->_last_received_number = _data->_current_received_number; +} /* * StateConnectionBase @@ -370,6 +410,8 @@ void StateConnectionConnected::receive_message(int index) // SHOW_USAGE_MEMORY bool system_mode; + //INF_PRINT("Receive application message"); + Ref field = this->_network->_queue.get_msg(index); uint32_t current_received_number = field->get_id(); @@ -417,6 +459,10 @@ void StateConnectionConnected::receive_message(int index) { DBG_PRINT("Receive application message (" + itos(current_received_number) + ") [" + uitos(this->_network->_queue.length()) + "]"); } + calculate_ack_bit(this->_data, system_mode); + + //DBG_PRINT("Ack:" + this->_data->_long_ack_bit_field.show()); + this->_network->_queue.erase_index(index); // Check in buffer if we have next if ( this->_network->_queue.is_index(index + 1) )