From 7d44d8132b34dafcb54608501ab42e3531bceb07 Mon Sep 17 00:00:00 2001 From: AleaJactaEst Date: Thu, 27 May 2021 23:56:16 +0200 Subject: [PATCH] update 1st page - adding option to update/configure video/sound, show information and locale (fr & en) --- AUTHORS | 6 + NEWS | 1 + NEWS_fr | 28 + addons/kh_slider/kh_h_slider.gd | 50 +- addons/kh_slider/kh_h_slider_plugin.gd | 4 +- addons/kh_window/kh_window.gd | 787 +++++++++--------- addons/kh_window/kh_window_plugin.gd | 12 +- assets/fonts/IMMORTAL.ttf | Bin 0 -> 170508 bytes .../Login-Khanat-help-button-hover.png | Bin 0 -> 14111 bytes .../Login-Khanat-language-button-hover.png | Bin 0 -> 16365 bytes .../Login-Khanat-language-button.png | Bin 0 -> 13792 bytes .../Login-Khanat-news-button-hover.png | Bin 0 -> 16828 bytes .../interfaces/Login-Khanat-news-button.png | Bin 0 -> 13559 bytes .../Login-Khanat-quit-button-hover.png | Bin 0 -> 15753 bytes .../Login-Khanat-settings-button-hover.png | Bin 0 -> 18276 bytes .../Login-Khanat-sound-button-hover.png | Bin 0 -> 16746 bytes .../Login-Khanat-sound-muted-button-hover.png | Bin 0 -> 14427 bytes assets/interfaces/options.png | Bin 0 -> 545 bytes assets/interfaces/options_reduce.png | Bin 0 -> 751 bytes default_bus_layout.tres | 3 + icon.png | Bin 3305 -> 63092 bytes locale/en.po | 120 +++ locale/fr.po | 120 +++ locale/locale.sh | 21 + locale/messages.mo | Bin 0 -> 2285 bytes locale/messages.pot | 112 +++ project.godot | 13 +- ressources/scripts/config/config.gd | 205 +++++ ressources/scripts/global.gd | 18 +- ressources/scripts/resource_queue.gd | 192 ++--- scenes/creatures/creature_creation_menu.gd | 222 ++--- scenes/creatures/creature_creation_menu.tscn | 172 ++-- scenes/creatures/creatures_creation.gd | 252 +++--- scenes/creatures/creatures_creation.tscn | 1 + scenes/game/game.gd | 62 +- .../creatures_editor/creatures_editor_ui.gd | 122 +-- .../creatures_editor/creatures_editor_ui.tscn | 2 +- .../interfaces/creatures_menu/creature_box.gd | 4 +- .../creatures_menu/creature_box.tscn | 17 +- .../creatures_menu/creatures_menu_ui.gd | 74 +- .../creatures_menu/creatures_menu_ui.tscn | 11 +- scenes/interfaces/game_menu/game_ui.gd | 54 +- scenes/interfaces/game_menu/game_ui.tscn | 1 + scenes/interfaces/main_menu/main_menu.gd | 19 +- scenes/interfaces/main_menu/main_menu.tscn | 24 +- .../interfaces/music_manager/music_button.gd | 2 +- .../music_manager/music_button.tscn | 1 + .../interfaces/music_manager/music_manager.gd | 138 ++- .../music_manager/music_manager.tscn | 10 +- scenes/interfaces/options/option_info.gd | 72 ++ scenes/interfaces/options/option_info.tscn | 80 ++ scenes/interfaces/options/option_language.gd | 46 + .../interfaces/options/option_language.tscn | 66 ++ scenes/interfaces/options/option_news.gd | 58 ++ scenes/interfaces/options/option_news.tscn | 74 ++ scenes/interfaces/options/option_settings.gd | 185 ++++ .../interfaces/options/option_settings.tscn | 445 ++++++++++ .../options/option_settings_music_box.gd | 13 + .../options/option_settings_music_box.tscn | 28 + scenes/interfaces/options/options.gd | 51 ++ scenes/interfaces/options/options.tscn | 122 +++ scenes/main/main.gd | 164 ++-- scenes/main/main.tscn | 3 + scenes/player/player.gd | 296 +++---- 64 files changed, 3276 insertions(+), 1307 deletions(-) create mode 100644 AUTHORS create mode 100644 NEWS create mode 100644 NEWS_fr create mode 100644 assets/fonts/IMMORTAL.ttf create mode 100644 assets/interfaces/Login-Khanat-help-button-hover.png create mode 100644 assets/interfaces/Login-Khanat-language-button-hover.png create mode 100644 assets/interfaces/Login-Khanat-language-button.png create mode 100644 assets/interfaces/Login-Khanat-news-button-hover.png create mode 100644 assets/interfaces/Login-Khanat-news-button.png create mode 100644 assets/interfaces/Login-Khanat-quit-button-hover.png create mode 100644 assets/interfaces/Login-Khanat-settings-button-hover.png create mode 100644 assets/interfaces/Login-Khanat-sound-button-hover.png create mode 100644 assets/interfaces/Login-Khanat-sound-muted-button-hover.png create mode 100644 assets/interfaces/options.png create mode 100644 assets/interfaces/options_reduce.png create mode 100644 default_bus_layout.tres create mode 100644 locale/en.po create mode 100644 locale/fr.po create mode 100755 locale/locale.sh create mode 100644 locale/messages.mo create mode 100644 locale/messages.pot create mode 100644 ressources/scripts/config/config.gd create mode 100644 scenes/interfaces/options/option_info.gd create mode 100644 scenes/interfaces/options/option_info.tscn create mode 100644 scenes/interfaces/options/option_language.gd create mode 100644 scenes/interfaces/options/option_language.tscn create mode 100644 scenes/interfaces/options/option_news.gd create mode 100644 scenes/interfaces/options/option_news.tscn create mode 100644 scenes/interfaces/options/option_settings.gd create mode 100644 scenes/interfaces/options/option_settings.tscn create mode 100644 scenes/interfaces/options/option_settings_music_box.gd create mode 100644 scenes/interfaces/options/option_settings_music_box.tscn create mode 100644 scenes/interfaces/options/options.gd create mode 100644 scenes/interfaces/options/options.tscn diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..75ea10a --- /dev/null +++ b/AUTHORS @@ -0,0 +1,6 @@ +Yannk +Zatalyz +Deed +Lyne +Osquallo +AleaJactaEst diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..2b85e05 --- /dev/null +++ b/NEWS @@ -0,0 +1 @@ +# What's new on khanat? diff --git a/NEWS_fr b/NEWS_fr new file mode 100644 index 0000000..527f5ea --- /dev/null +++ b/NEWS_fr @@ -0,0 +1,28 @@ +# Quels sont les dernières nouvelles ? + +1) Configuration de l'internationalisation (fr & en) + +2) Dans la page principale, ajout d'un menu, en haut à droite, afin d'avoir d'accessible les actions rapides suivantes: + * les nouvelles + * configuration de la langue + * activer le son + * l'aide + * configuration + * sortir + +3) Ajout d'un A propos + a) Auteur + b) License + +4) Ajout d'un image pour les icons OPTIONS afin de savoir lequel est actif (fond jaune au lieu de blanc) + +5) Ajout de l'option paramètres + I) Paramétrage vidéo + a) Plein écran + b) Fenêtre redimensionnable + c) Orientation de l'écran (à vérifier) + d) Fenêtre sans bord + e) Choisir l'écran + f) Garder la fenêtre dessus + II) Paramétrage son + diff --git a/addons/kh_slider/kh_h_slider.gd b/addons/kh_slider/kh_h_slider.gd index 4522186..567f813 100644 --- a/addons/kh_slider/kh_h_slider.gd +++ b/addons/kh_slider/kh_h_slider.gd @@ -6,40 +6,40 @@ signal value_changed( value ) export( Texture ) var minus_texture setget set_minus_texture, get_minus_texture func set_minus_texture( value ): - minus_texture = value - if self.has_node( "kh_h_slider/minus" ): - $kh_h_slider/minus.texture_normal = minus_texture + minus_texture = value + if self.has_node( "kh_h_slider/minus" ): + $kh_h_slider/minus.texture_normal = minus_texture func get_minus_texture(): - return minus_texture - + return minus_texture + export( Texture ) var plus_texture setget set_plus_texture, get_plus_texture func set_plus_texture( value ): - plus_texture = value - if self.has_node( "kh_h_slider/plus" ): - $kh_h_slider/plus.texture_normal = plus_texture + plus_texture = value + if self.has_node( "kh_h_slider/plus" ): + $kh_h_slider/plus.texture_normal = plus_texture func get_plus_texture(): - return plus_texture + return plus_texture func _ready(): - self.add_child( preload( "res://addons/kh_slider/kh_h_slider.tscn" ).instance() ) - - $kh_h_slider/minus.connect( "pressed", self, "_on_minus_pressed" ) - $kh_h_slider/value.connect( "changed", self, "_on_value_changed" ) - $kh_h_slider/value.connect( "value_changed", self, "_on_value_value_changed" ) - $kh_h_slider/plus.connect( "pressed", self, "_on_plus_pressed" ) - $kh_h_slider/minus.texture_normal = minus_texture - $kh_h_slider/plus.texture_normal = plus_texture - + self.add_child( preload( "res://addons/kh_slider/kh_h_slider.tscn" ).instance() ) + + $kh_h_slider/minus.connect( "pressed", self, "_on_minus_pressed" ) + $kh_h_slider/value.connect( "changed", self, "_on_value_changed" ) + $kh_h_slider/value.connect( "value_changed", self, "_on_value_value_changed" ) + $kh_h_slider/plus.connect( "pressed", self, "_on_plus_pressed" ) + $kh_h_slider/minus.texture_normal = minus_texture + $kh_h_slider/plus.texture_normal = plus_texture + func _on_minus_pressed(): - $kh_h_slider/value.value -= $kh_h_slider/value.step - + $kh_h_slider/value.value -= $kh_h_slider/value.step + func _on_plus_pressed(): - $kh_h_slider/value.value += $kh_h_slider/value.step - + $kh_h_slider/value.value += $kh_h_slider/value.step + func _on_value_changed(): - emit_signal( "changed" ) - + emit_signal( "changed" ) + func _on_value_value_changed( value ): - emit_signal( "value_changed", value ) + emit_signal( "value_changed", value ) diff --git a/addons/kh_slider/kh_h_slider_plugin.gd b/addons/kh_slider/kh_h_slider_plugin.gd index 5274fe4..892a7f8 100644 --- a/addons/kh_slider/kh_h_slider_plugin.gd +++ b/addons/kh_slider/kh_h_slider_plugin.gd @@ -2,7 +2,7 @@ tool extends EditorPlugin func _enter_tree(): - add_custom_type("KhHSlider", "HBoxContainer", preload("kh_h_slider.gd"), preload("kh_h_slider.png")) + add_custom_type("KhHSlider", "HBoxContainer", preload("kh_h_slider.gd"), preload("kh_h_slider.png")) func _exit_tree(): - remove_custom_type("KhHSlider") + remove_custom_type("KhHSlider") diff --git a/addons/kh_window/kh_window.gd b/addons/kh_window/kh_window.gd index fa29489..63ceb7e 100644 --- a/addons/kh_window/kh_window.gd +++ b/addons/kh_window/kh_window.gd @@ -31,63 +31,63 @@ var size_changed = true func add_child_to_content( node): - if self.get_content(): - self.get_content().add_child(node) + if self.get_content(): + self.get_content().add_child(node) func add_window_part( node ): - add_child( node ) + add_child( node ) func set_mouse_pass_to_children( node ): - for child in node.get_children(): - set_mouse_pass_to_children( child ) - if node is Control: - node.mouse_filter = MOUSE_FILTER_PASS + for child in node.get_children(): + set_mouse_pass_to_children( child ) + if node is Control: + node.mouse_filter = MOUSE_FILTER_PASS #func _ready(): func _enter_tree(): - ######## - #### Window's part création. - # The internal elements structure is: - # self - MarginContainer - # background - NinePatchRect - # parts - VBoxContainer - # header_box - MarginContainer - # header - HBoxContainer - # quit - TextureButton - # close - TextureButton - # open - TextureButton - # label - Label - # content_box - MarginContainer - # scroll_container - Scrollcontainer - # content - VBoxContainer - # footer_box - MarginContainer - # footer - HBoxContainer - # contextual_help - Label - # resize - TextureButton + ######## + #### Window's part création. + # The internal elements structure is: + # self - MarginContainer + # background - NinePatchRect + # parts - VBoxContainer + # header_box - MarginContainer + # header - HBoxContainer + # quit - TextureButton + # close - TextureButton + # open - TextureButton + # label - Label + # content_box - MarginContainer + # scroll_container - Scrollcontainer + # content - VBoxContainer + # footer_box - MarginContainer + # footer - HBoxContainer + # contextual_help - Label + # resize - TextureButton - ### - # self - self.size_flags_horizontal = SIZE_EXPAND - self.size_flags_vertical = SIZE_EXPAND + ### + # self + self.size_flags_horizontal = SIZE_EXPAND + self.size_flags_vertical = SIZE_EXPAND - self.set( "custom_constants/margin_right", 0) - self.set( "custom_constants/margin_top", 0) - self.set( "custom_constants/margin_left", 0) - self.set( "custom_constants/margin_bottom", 0) + self.set( "custom_constants/margin_right", 0) + self.set( "custom_constants/margin_top", 0) + self.set( "custom_constants/margin_left", 0) + self.set( "custom_constants/margin_bottom", 0) - self.connect ( "gui_input", self, "_on_window_gui_input" ) - if is_movable and not self.is_dragged_by_header_only: - self.mouse_default_cursor_shape = CURSOR_MOVE - ### - ### - # background - var background - if not self.has_node( "background" ): - background = NinePatchRect.new() - background.name = "background" - if not background_texture: + self.connect ( "gui_input", self, "_on_window_gui_input" ) + if is_movable and not self.is_dragged_by_header_only: + self.mouse_default_cursor_shape = CURSOR_MOVE + ### + ### + # background + var background + if not self.has_node( "background" ): + background = NinePatchRect.new() + background.name = "background" + if not background_texture: # var background_image = Image.new() # var stream_texture = load('res://addons/ui_window/background_default.jpg') # if not stream_texture : @@ -97,435 +97,436 @@ func _enter_tree(): # background.texture = ImageTexture.new() # background.texture.create_from_image( background_image ) # background.texture.flags = Texture.FLAG_FILTER | Texture.FLAG_REPEAT - pass - else: - background.texture = background_texture - background.texture.flags = Texture.FLAG_FILTER | Texture.FLAG_REPEAT - - background.axis_stretch_horizontal = NinePatchRect.AXIS_STRETCH_MODE_TILE - background.axis_stretch_vertical = NinePatchRect.AXIS_STRETCH_MODE_TILE + pass + else: + background.texture = background_texture + background.texture.flags = Texture.FLAG_FILTER | Texture.FLAG_REPEAT + + background.axis_stretch_horizontal = NinePatchRect.AXIS_STRETCH_MODE_TILE + background.axis_stretch_vertical = NinePatchRect.AXIS_STRETCH_MODE_TILE - background.size_flags_horizontal = SIZE_EXPAND_FILL - background.size_flags_vertical = SIZE_EXPAND_FILL + background.size_flags_horizontal = SIZE_EXPAND_FILL + background.size_flags_vertical = SIZE_EXPAND_FILL - background.region_rect = Rect2( 0, 0, 0, 0 ) - background.patch_margin_left = 4 - background.patch_margin_top = 32 - background.patch_margin_right = 4 - background.patch_margin_bottom = 4 + background.region_rect = Rect2( 0, 0, 0, 0 ) + background.patch_margin_left = 4 + background.patch_margin_top = 32 + background.patch_margin_right = 4 + background.patch_margin_bottom = 4 - background.self_modulate = background_color - self.add_window_part( background ) + background.self_modulate = background_color + self.add_window_part( background ) # background.set_owner( self ) - ### - ### - # parts - var parts - if not self.has_node( "parts" ): - parts = VBoxContainer.new() - parts.name = "parts" - parts.size_flags_horizontal = SIZE_EXPAND_FILL - parts.size_flags_vertical = SIZE_EXPAND_FILL - self.add_window_part( parts ) + ### + ### + # parts + var parts + if not self.has_node( "parts" ): + parts = VBoxContainer.new() + parts.name = "parts" + parts.size_flags_horizontal = SIZE_EXPAND_FILL + parts.size_flags_vertical = SIZE_EXPAND_FILL + self.add_window_part( parts ) # parts.set_owner( self ) - ### - ### - # header_box - var header_box - if not parts.has_node( "header_box" ): - header_box = MarginContainer.new() - header_box.name = "header_box" - header_box.size_flags_horizontal = SIZE_EXPAND_FILL - header_box.size_flags_vertical = SIZE_SHRINK_CENTER + ### + ### + # header_box + var header_box + if not parts.has_node( "header_box" ): + header_box = MarginContainer.new() + header_box.name = "header_box" + header_box.size_flags_horizontal = SIZE_EXPAND_FILL + header_box.size_flags_vertical = SIZE_SHRINK_CENTER - header_box.set( "custom_constants/margin_right", 4) - header_box.set( "custom_constants/margin_top", 4) - header_box.set( "custom_constants/margin_left", 4) - header_box.set( "custom_constants/margin_bottom", 4) + header_box.set( "custom_constants/margin_right", 4) + header_box.set( "custom_constants/margin_top", 4) + header_box.set( "custom_constants/margin_left", 4) + header_box.set( "custom_constants/margin_bottom", 4) - if is_movable: - header_box.mouse_default_cursor_shape = CURSOR_MOVE - parts.add_child( header_box ) + if is_movable: + header_box.mouse_default_cursor_shape = CURSOR_MOVE + parts.add_child( header_box ) # header_box.set_owner( parts ) - header_box.connect ( "gui_input", self, "_on_Header_gui_input" ) - ### - ### - # header - var header - if not header_box.has_node( "header" ): - header = HBoxContainer.new() - header.name = "header" - header.size_flags_horizontal = SIZE_EXPAND_FILL - header.size_flags_vertical = SIZE_EXPAND | SIZE_SHRINK_CENTER - if is_movable: - header.mouse_default_cursor_shape = CURSOR_MOVE - header_box.add_child( header ) + header_box.connect ( "gui_input", self, "_on_Header_gui_input" ) + ### + ### + # header + var header + if not header_box.has_node( "header" ): + header = HBoxContainer.new() + header.name = "header" + header.size_flags_horizontal = SIZE_EXPAND_FILL + header.size_flags_vertical = SIZE_EXPAND | SIZE_SHRINK_CENTER + if is_movable: + header.mouse_default_cursor_shape = CURSOR_MOVE + header_box.add_child( header ) # header.set_owner( header_box ) - ### - ### - # quit - var quit_button - if not header.has_node( "quit" ): - quit_button = TextureButton.new() - quit_button.name = "quit" - quit_button.size_flags_horizontal = SIZE_SHRINK_END - quit_button.size_flags_vertical = SIZE_SHRINK_CENTER + ### + ### + # quit + var quit_button + if not header.has_node( "quit" ): + quit_button = TextureButton.new() + quit_button.name = "quit" + quit_button.size_flags_horizontal = SIZE_SHRINK_END + quit_button.size_flags_vertical = SIZE_SHRINK_CENTER - var tex_quit = ImageTexture.new() - var img_quit = Image.new() - var stream_texture = load( "res://addons/kh_window/button_quit.png") - img_quit = stream_texture.get_data() - tex_quit.create_from_image( img_quit ) - quit_button.texture_normal = tex_quit + var tex_quit = ImageTexture.new() + var img_quit = Image.new() + var stream_texture = load( "res://addons/kh_window/button_quit.png") + img_quit = stream_texture.get_data() + tex_quit.create_from_image( img_quit ) + quit_button.texture_normal = tex_quit - header.add_child( quit_button ) + header.add_child( quit_button ) # quit_button.set_owner( header ) - quit_button.connect ( "pressed", self, "_on_Quit_pressed" ) - ### - # close - var close_button = TextureButton.new() - if not header.has_node( "close" ): - close_button = TextureButton.new() - close_button.name = "close" - close_button.size_flags_horizontal = SIZE_SHRINK_END - close_button.size_flags_vertical = SIZE_SHRINK_CENTER + quit_button.connect ( "pressed", self, "_on_Quit_pressed" ) + ### + # close + var close_button = TextureButton.new() + if not header.has_node( "close" ): + close_button = TextureButton.new() + close_button.name = "close" + close_button.size_flags_horizontal = SIZE_SHRINK_END + close_button.size_flags_vertical = SIZE_SHRINK_CENTER - var tex_close = ImageTexture.new() - var img_close = Image.new() - var stream_texture = load("res://addons/kh_window/button_close.png") - img_close = stream_texture.get_data() - tex_close.create_from_image( img_close ) - close_button.texture_normal = tex_close + var tex_close = ImageTexture.new() + var img_close = Image.new() + var stream_texture = load("res://addons/kh_window/button_close.png") + img_close = stream_texture.get_data() + tex_close.create_from_image( img_close ) + close_button.texture_normal = tex_close - header.add_child( close_button ) + header.add_child( close_button ) # close_button.set_owner( header ) - close_button.connect ( "pressed", self, "_on_Close_pressed" ) - ### - # open - var open_button - if not header.has_node( "open" ): - open_button = TextureButton.new() - open_button.name = "open" - open_button.size_flags_horizontal = SIZE_SHRINK_END - open_button.size_flags_vertical = SIZE_SHRINK_CENTER + close_button.connect ( "pressed", self, "_on_Close_pressed" ) + ### + # open + var open_button + if not header.has_node( "open" ): + open_button = TextureButton.new() + open_button.name = "open" + open_button.size_flags_horizontal = SIZE_SHRINK_END + open_button.size_flags_vertical = SIZE_SHRINK_CENTER - var tex_open = ImageTexture.new() - var img_open = Image.new() - var stream_texture = load("res://addons/kh_window/button_open.png") - img_open = stream_texture.get_data() - tex_open.create_from_image( img_open ) - open_button.texture_normal = tex_open - open_button.visible = false - header.add_child( open_button ) + var tex_open = ImageTexture.new() + var img_open = Image.new() + var stream_texture = load("res://addons/kh_window/button_open.png") + img_open = stream_texture.get_data() + tex_open.create_from_image( img_open ) + open_button.texture_normal = tex_open + open_button.visible = false + header.add_child( open_button ) # open_button.set_owner( header ) - open_button.connect ( "pressed", self, "_on_Open_pressed" ) - ### - ### - # Title Label - var title_label - if not header.has_node( "label" ): - title_label = Label.new() - title_label.name = "label" - title_label.text = title - title_label.size_flags_horizontal = SIZE_EXPAND_FILL - title_label.size_flags_vertical = SIZE_SHRINK_CENTER - if is_movable: - title_label.mouse_default_cursor_shape = CURSOR_MOVE - header.add_child( title_label ) + open_button.connect ( "pressed", self, "_on_Open_pressed" ) + ### + ### + # Title Label + var title_label + if not header.has_node( "label" ): + title_label = Label.new() + title_label.name = "label" + title_label.text = title + title_label.size_flags_horizontal = SIZE_EXPAND_FILL + title_label.size_flags_vertical = SIZE_SHRINK_CENTER + if is_movable: + title_label.mouse_default_cursor_shape = CURSOR_MOVE + header.add_child( title_label ) # title_label.set_owner( header ) - ### - ### - # Content - var content_box - if not parts.has_node( "content_box" ): - content_box = MarginContainer.new() - content_box.name = "content_box" - content_box.size_flags_horizontal = SIZE_EXPAND_FILL - content_box.size_flags_vertical = SIZE_EXPAND_FILL - content_box.set( "custom_constants/margin_right", 8) - content_box.set( "custom_constants/margin_top", 8) - content_box.set( "custom_constants/margin_left", 8) - content_box.set( "custom_constants/margin_bottom", 8) - parts.add_child( content_box ) + ### + ### + # Content + var content_box + if not parts.has_node( "content_box" ): + content_box = MarginContainer.new() + content_box.name = "content_box" + content_box.size_flags_horizontal = SIZE_EXPAND_FILL + content_box.size_flags_vertical = SIZE_EXPAND_FILL + content_box.set( "custom_constants/margin_right", 8) + content_box.set( "custom_constants/margin_top", 8) + content_box.set( "custom_constants/margin_left", 8) + content_box.set( "custom_constants/margin_bottom", 8) + parts.add_child( content_box ) # content_box.set_owner( parts ) - ### - ### - if self.has_scrollbar: - # content_box/scroll_container - var content_scroll_container - if not content_box.has_node( "scroll_container" ): - content_scroll_container = ScrollContainer.new() - content_scroll_container.name = "scroll_container" - content_scroll_container.size_flags_horizontal = SIZE_FILL - content_scroll_container.size_flags_vertical = SIZE_FILL - content_scroll_container.scroll_deadzone = 0 - content_box.add_child( content_scroll_container ) - # content_scroll_container.set_owner( content_box ) - ### - ### - # content - var content - if not content_scroll_container.has_node( "content" ): - content = MarginContainer.new() - content.name = "content" - content.size_flags_horizontal = SIZE_EXPAND_FILL - content.size_flags_vertical = SIZE_EXPAND_FILL - content_scroll_container.add_child( content ) - # content.set_owner( content_scroll_container ) - ### - else: - var content - if not content_box.has_node( "content" ): - content = MarginContainer.new() - content.name = "content" - content.size_flags_horizontal = SIZE_EXPAND_FILL - content.size_flags_vertical = SIZE_EXPAND_FILL - content_box.add_child( content ) + ### + ### + if self.has_scrollbar: + # content_box/scroll_container + var content_scroll_container + if not content_box.has_node( "scroll_container" ): + content_scroll_container = ScrollContainer.new() + content_scroll_container.name = "scroll_container" + content_scroll_container.size_flags_horizontal = SIZE_FILL + content_scroll_container.size_flags_vertical = SIZE_FILL + content_scroll_container.scroll_deadzone = 0 + content_box.add_child( content_scroll_container ) + # content_scroll_container.set_owner( content_box ) + ### + ### + # content + var content + if not content_scroll_container.has_node( "content" ): + content = MarginContainer.new() + content.name = "content" + content.size_flags_horizontal = SIZE_EXPAND_FILL + content.size_flags_vertical = SIZE_EXPAND_FILL + content_scroll_container.add_child( content ) + # content.set_owner( content_scroll_container ) + ### + else: + var content + if not content_box.has_node( "content" ): + content = MarginContainer.new() + content.name = "content" + content.size_flags_horizontal = SIZE_EXPAND_FILL + content.size_flags_vertical = SIZE_EXPAND_FILL + content_box.add_child( content ) - ### - # Footer - var footer_box - if not parts.has_node( "footer_box" ): - footer_box = MarginContainer.new() - footer_box.name = "footer_box" - footer_box.size_flags_horizontal = SIZE_FILL - footer_box.size_flags_vertical = SIZE_FILL - footer_box.set( "custom_constants/margin_right", content_margin.position.y) - footer_box.set( "custom_constants/margin_top", content_margin.size.x) - footer_box.set( "custom_constants/margin_left", content_margin.position.x) - footer_box.set( "custom_constants/margin_bottom", content_margin.size.y) - parts.add_child( footer_box ) + ### + # Footer + var footer_box + if not parts.has_node( "footer_box" ): + footer_box = MarginContainer.new() + footer_box.name = "footer_box" + footer_box.size_flags_horizontal = SIZE_FILL + footer_box.size_flags_vertical = SIZE_FILL + footer_box.set( "custom_constants/margin_right", content_margin.position.y) + footer_box.set( "custom_constants/margin_top", content_margin.size.x) + footer_box.set( "custom_constants/margin_left", content_margin.position.x) + footer_box.set( "custom_constants/margin_bottom", content_margin.size.y) + parts.add_child( footer_box ) # footer_box.set_owner( parts ) - ### - ### - # footer_box/footer - var footer - if not footer_box.has_node( "footer" ): - footer = HBoxContainer.new() - footer.name = "footer" - footer.size_flags_horizontal = SIZE_EXPAND_FILL - footer.size_flags_vertical = SIZE_EXPAND_FILL - footer_box.add_child( footer ) + ### + ### + # footer_box/footer + var footer + if not footer_box.has_node( "footer" ): + footer = HBoxContainer.new() + footer.name = "footer" + footer.size_flags_horizontal = SIZE_EXPAND_FILL + footer.size_flags_vertical = SIZE_EXPAND_FILL + footer_box.add_child( footer ) # footer.set_owner( footer_box ) - ### - ### - # footer_label - var footer_label - if not footer.has_node( "footer_label" ): - footer_label = Label.new() - footer_label.name = "footer_label" - footer_label.size_flags_horizontal = SIZE_EXPAND - footer_label.size_flags_vertical = SIZE_EXPAND + ### + ### + # footer_label + var footer_label + if not footer.has_node( "footer_label" ): + footer_label = Label.new() + footer_label.name = "footer_label" + footer_label.size_flags_horizontal = SIZE_EXPAND + footer_label.size_flags_vertical = SIZE_EXPAND - footer.add_child( footer_label ) + footer.add_child( footer_label ) - ### - # resize - var resize_button - if not footer.has_node( "resize" ): - resize_button = TextureButton.new() - resize_button.name = "resize" - resize_button.size_flags_horizontal = SIZE_FILL | SIZE_SHRINK_END - resize_button.size_flags_vertical = SIZE_SHRINK_END + ### + # resize + var resize_button + if not footer.has_node( "resize" ): + resize_button = TextureButton.new() + resize_button.name = "resize" + resize_button.size_flags_horizontal = SIZE_FILL | SIZE_SHRINK_END + resize_button.size_flags_vertical = SIZE_SHRINK_END - var tex_resize = ImageTexture.new() - var img_resize = Image.new() - var stream_texture = load("res://addons/kh_window/button_resize.png") - img_resize = stream_texture.get_data() - tex_resize.create_from_image( img_resize ) - resize_button.texture_normal = tex_resize - resize_button.mouse_default_cursor_shape = CURSOR_FDIAGSIZE - resize_button.action_mode = Button.ACTION_MODE_BUTTON_PRESS + var tex_resize = ImageTexture.new() + var img_resize = Image.new() + var stream_texture = load("res://addons/kh_window/button_resize.png") + img_resize = stream_texture.get_data() + tex_resize.create_from_image( img_resize ) + resize_button.texture_normal = tex_resize + resize_button.mouse_default_cursor_shape = CURSOR_FDIAGSIZE + resize_button.action_mode = Button.ACTION_MODE_BUTTON_PRESS # resize_button.mouse_filter = MOUSE_FILTER_STOP - footer.add_child( resize_button ) + footer.add_child( resize_button ) # resize_button.set_owner( footer ) - resize_button.connect ( "button_down", self, "_on_Resize_pressed" ) - ###er_label.set_owner( footer ) - ### + resize_button.connect ( "button_down", self, "_on_Resize_pressed" ) + ###er_label.set_owner( footer ) + ### - current_rect_size = self.rect_min_size + current_rect_size = self.rect_min_size - if is_borderless: - $background.region_rect = Rect2( $background.patch_margin_left-1 - , $background.patch_margin_top-1 - , 256-($background.patch_margin_left+$background.patch_margin_right)+2 - , 256-($background.patch_margin_top+$background.patch_margin_bottom)+2 ) - $background.patch_margin_left = 1 - $background.patch_margin_top = 1 - $background.patch_margin_right = 1 - $background.patch_margin_bottom = 1 - header_box.rect_min_size.y = 1 - close_button.visible = false - open_button.visible = false - quit_button.visible = false - title_label.visible = false + if is_borderless: + $background.region_rect = Rect2( $background.patch_margin_left-1 + , $background.patch_margin_top-1 + , 256-($background.patch_margin_left+$background.patch_margin_right)+2 + , 256-($background.patch_margin_top+$background.patch_margin_bottom)+2 ) + $background.patch_margin_left = 1 + $background.patch_margin_top = 1 + $background.patch_margin_right = 1 + $background.patch_margin_bottom = 1 + header_box.rect_min_size.y = 1 + close_button.visible = false + open_button.visible = false + quit_button.visible = false + title_label.visible = false - if not is_resizable: - if not has_footer: - footer_box.visible = false - else: - footer_box.get_node( "footer/resize" ).visible = false + if not is_resizable: + if not has_footer: + footer_box.visible = false + else: + footer_box.get_node( "footer/resize" ).visible = false func _ready(): - # On déplace les enfants ajouter via l'editeur sous content. - for child in self.get_children(): - if not child.name =="parts" and not child.name =="background": - if child.name.begins_with( "footer_" ): - if footer_box.get_node("footer").has_node("footer_label"): - footer_box.get_node("footer").remove_child( footer_box.get_node("footer").get_node("footer_label") ) + # On déplace les enfants ajouter via l'editeur sous content. + for child in self.get_children(): + if not child.name =="parts" and not child.name =="background": + if child.name.begins_with( "footer_" ): + if footer_box.get_node("footer").has_node("footer_label"): + footer_box.get_node("footer").remove_child( footer_box.get_node("footer").get_node("footer_label") ) - self.remove_child( child ) - get_footer().add_child( child ) - get_footer().move_child( child, 0 ) - else: - self.remove_child( child ) - get_content().add_child( child ) + self.remove_child( child ) + get_footer().add_child( child ) + get_footer().move_child( child, 0 ) + else: + self.remove_child( child ) + get_content().add_child( child ) - set_mouse_pass_to_children( self ) + set_mouse_pass_to_children( self ) func _process(delta): - if size_changed: - self.rect_size = Vector2( clamp( self.rect_size.x, min_size.x, self.rect_size.x ), clamp( self.rect_size.y, min_size.y, self.rect_size.y ) ) - size_changed = false + if size_changed: + self.rect_size = Vector2( clamp( self.rect_size.x, min_size.x, self.rect_size.x ), clamp( self.rect_size.y, min_size.y, self.rect_size.y ) ) + size_changed = false func _on_Window_mouse_entered(): - print("mouse_entered") + print("mouse_entered") func _on_Window_focus_entered(): - print("focus_entered") + print("focus_entered") func _on_Quit_pressed(): - self.visible = false + self.visible = false func get_content_child( p_node ): - return get_content().get_node( p_node ) + return get_content().get_node( p_node ) func get_content(): - if self.has_scrollbar: - return content_box.get_node( "scroll_container/content" ) - else: - return content_box.get_node( "content" ) - + if self.has_scrollbar: + return content_box.get_node( "scroll_container/content" ) + else: + return content_box.get_node( "content" ) + func get_footer(): - return footer_box.get_node( "footer" ) + return footer_box.get_node( "footer" ) func close(): - if not self.is_borderless: - self.header_box.get_node( "header/close" ).visible = false - self.header_box.get_node( "header/open" ).visible = true - self.content_box.visible = false - self.footer_box.visible = false - self.current_rect_size = self.rect_size - self.rect_size = Vector2( 0, 0 ) - $background.rect_size = Vector2( 0, 0 ) - $background.rect_min_size = Vector2( 0, 0 ) - else: - self.header_box.get_node( "header/close" ).visible = false - self.header_box.get_node( "header/open" ).visible = false - self.content_box.visible = false - self.footer_box.visible = false - self.current_rect_size = self.rect_size - self.rect_size = Vector2( 0, 0 ) - $background.rect_size = Vector2( 0, 0 ) - $background.rect_min_size = Vector2( 0, 0 ) + if not self.is_borderless: + self.header_box.get_node( "header/close" ).visible = false + self.header_box.get_node( "header/open" ).visible = true + self.content_box.visible = false + self.footer_box.visible = false + self.current_rect_size = self.rect_size + self.rect_size = Vector2( 0, 0 ) + $background.rect_size = Vector2( 0, 0 ) + $background.rect_min_size = Vector2( 0, 0 ) + else: + self.header_box.get_node( "header/close" ).visible = false + self.header_box.get_node( "header/open" ).visible = false + self.content_box.visible = false + self.footer_box.visible = false + self.current_rect_size = self.rect_size + self.rect_size = Vector2( 0, 0 ) + $background.rect_size = Vector2( 0, 0 ) + $background.rect_min_size = Vector2( 0, 0 ) func _on_Close_pressed(): - close() + close() func open(): - if not is_borderless: - header_box.get_node( "header/close" ).visible = true - header_box.get_node( "header/open" ).visible = false - content_box.visible = true - footer_box.visible = true - self.rect_size = current_rect_size - else: - header_box.get_node( "header/close" ).visible = false - header_box.get_node( "header/open" ).visible = false - content_box.visible = true - footer_box.visible = true - self.rect_size = current_rect_size + if not is_borderless: + header_box.get_node( "header/close" ).visible = true + header_box.get_node( "header/open" ).visible = false + content_box.visible = true + footer_box.visible = true + self.rect_size = current_rect_size + else: + header_box.get_node( "header/close" ).visible = false + header_box.get_node( "header/open" ).visible = false + content_box.visible = true + footer_box.visible = true + self.rect_size = current_rect_size func _on_Open_pressed(): - open() + open() func _on_Resize_pressed(): - is_resizing = true + is_resizing = true func _input( event ): - if is_resizable: - if is_resizing and event is InputEventMouseButton and not event.pressed: - is_resizing = false - if event is InputEventMouseMotion and is_resizing: - var delta = event.relative - self.rect_size += delta - size_changed = true + if is_resizable: + if is_resizing and event is InputEventMouseButton and not event.pressed: + is_resizing = false + if event is InputEventMouseMotion and is_resizing: + var delta = event.relative + self.rect_size += delta + size_changed = true func check_if_clicked( event ): - if not is_moving and event is InputEventMouseButton and event.is_pressed() and not event.is_echo() and event.button_index == 1 : - emit_signal( "window_clicked", self ) + if not is_moving and event is InputEventMouseButton and event.is_pressed() and not event.is_echo() and event.button_index == 1 : + emit_signal( "window_clicked", self ) func _on_Header_gui_input( event ): - check_if_clicked( event ) + check_if_clicked( event ) - if self.is_dragged_by_header_only: - if is_movable: - if is_moving and event is InputEventMouseButton and not event.pressed: - is_moving = false - elif not is_moving and event is InputEventMouseButton and event.pressed: - is_moving = true - if event is InputEventMouseMotion and is_moving: - var delta = event.relative - self.rect_position += delta + if self.is_dragged_by_header_only: + if is_movable: + if is_moving and event is InputEventMouseButton and not event.pressed: + is_moving = false + elif not is_moving and event is InputEventMouseButton and event.pressed: + is_moving = true + if event is InputEventMouseMotion and is_moving: + var delta = event.relative + self.rect_position += delta func _on_window_gui_input( event ): - check_if_clicked( event ) - if not self.is_dragged_by_header_only: - if is_movable: - if is_moving and event is InputEventMouseButton and not event.pressed: - is_moving = false - elif not is_moving and event is InputEventMouseButton and event.pressed: - is_moving = true - if event is InputEventMouseMotion and is_moving: - var delta = event.relative - self.rect_position += delta - + check_if_clicked( event ) + if not self.is_dragged_by_header_only: + if is_movable: + if is_moving and event is InputEventMouseButton and not event.pressed: + is_moving = false + elif not is_moving and event is InputEventMouseButton and event.pressed: + is_moving = true + if event is InputEventMouseMotion and is_moving: + var delta = event.relative + self.rect_position += delta + func load_from_file( config_file ): - if config_file.has_section( self.name ): - self.rect_position = config_file.get_value( self.name, "position" ) - self.rect_size = config_file.get_value( self.name, "size" ) - self.is_borderless = config_file.get_value( self.name, "borderless" ) - current_rect_position = self.rect_position - current_rect_size = self.rect_size - if config_file.get_value( self.name, "opened" ): - open() - else: - close() + print("[res://addons/kh_window/kh_window.gd] load_from_file") + if config_file.has_section( self.name ): + self.rect_position = config_file.get_value( self.name, "position" ) + self.rect_size = config_file.get_value( self.name, "size" ) + self.is_borderless = config_file.get_value( self.name, "borderless" ) + current_rect_position = self.rect_position + current_rect_size = self.rect_size + if config_file.get_value( self.name, "opened" ): + open() + else: + close() func save_to_file( config_file ): - var is_open = content_box.visible + var is_open = content_box.visible - config_file.set_value(self.name, "position", self.rect_position) + config_file.set_value(self.name, "position", self.rect_position) - if not is_open: - config_file.set_value(self.name, "size", current_rect_size) - else: - config_file.set_value(self.name, "size", self.rect_size) + if not is_open: + config_file.set_value(self.name, "size", current_rect_size) + else: + config_file.set_value(self.name, "size", self.rect_size) - if is_open: - config_file.set_value(self.name, "opened", true) - else: - config_file.set_value(self.name, "opened", false) + if is_open: + config_file.set_value(self.name, "opened", true) + else: + config_file.set_value(self.name, "opened", false) - config_file.set_value(self.name, "borderless", is_borderless) + config_file.set_value(self.name, "borderless", is_borderless) diff --git a/addons/kh_window/kh_window_plugin.gd b/addons/kh_window/kh_window_plugin.gd index 1e179c2..d6d2535 100644 --- a/addons/kh_window/kh_window_plugin.gd +++ b/addons/kh_window/kh_window_plugin.gd @@ -2,11 +2,11 @@ tool extends EditorPlugin func _enter_tree(): - # Initialization of the plugin goes here - # Add the new type with a name, a parent type, a script and an icon - add_custom_type("kh_window", "MarginContainer", preload("kh_window.gd"), preload("icon.png")) + # Initialization of the plugin goes here + # Add the new type with a name, a parent type, a script and an icon + add_custom_type("kh_window", "MarginContainer", preload("kh_window.gd"), preload("icon.png")) func _exit_tree(): - # Clean-up of the plugin goes here - # Always remember to remove it from the engine when deactivated - remove_custom_type("kh_window") \ No newline at end of file + # Clean-up of the plugin goes here + # Always remember to remove it from the engine when deactivated + remove_custom_type("kh_window") diff --git a/assets/fonts/IMMORTAL.ttf b/assets/fonts/IMMORTAL.ttf new file mode 100644 index 0000000000000000000000000000000000000000..146ad3c0b5c78e563b160cdad758c6c321fb9244 GIT binary patch literal 170508 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 %3ecnyQ4RLL-G zlQARS*Nn=(tgy0n14he{`Hh{Hk@6R>mCQ4I9qVO2+i6%UmH&D5+?~~Dt}tT)!tm

{Y+pSSVl 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 literal 0 HcmV?d00001 diff --git a/assets/interfaces/Login-Khanat-help-button-hover.png b/assets/interfaces/Login-Khanat-help-button-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..24ea86a04883648a0b135fa5a8b2c996d2725666 GIT binary patch literal 14111 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 LELkgV9Q=O(=GW^b literal 0 HcmV?d00001 diff --git a/assets/interfaces/Login-Khanat-language-button.png b/assets/interfaces/Login-Khanat-language-button.png new file mode 100644 index 0000000000000000000000000000000000000000..59b96a780261ca904972566700482d09a9b7f57f GIT binary patch literal 13792 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 VP+KK=_4_Xj{8CA#T*@f${{Ra?G}izC literal 0 HcmV?d00001 diff --git a/assets/interfaces/Login-Khanat-quit-button-hover.png b/assets/interfaces/Login-Khanat-quit-button-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..e243c38ee965ed3508152943b493946e759f3925 GIT binary patch literal 15753 zcmeIZWmH_v5;lsvyL<3~!QI_mf)7q`cXtWy5F|j5;O_3h-Q5Y6;Cjh>{NC@+S?hlP z&R(-;dUsbnUG;QzPxq{vNM%JSWCQ{PFfcG=8EJ9V_fO9ETL2E`{rw;)lLQQm7SBsv z+eH=RPUhfbZ*FB{M&{z_U`A%m zD$VscrbViuh5jivwk-+D2nZ>X@$&Y1n(qH{YB;fysUTl;kXpBIXjAhr!8I@VHu&<> zrakwfD}Hmc#n6xo)X{a>j&(h8ICQYN$W`^b!`t8PLTqjEsmt#A=JTmfTBrZ?)6?Vq z&CS)u)Z*sG5wVEFWYQU5@6`tFy}S6;gJ&n@Xho{wx5k5~z57n}uD7`S`|MhVgvseu zRj1vj6I;ge!x`bp>$4470mMho?bE}mCa=LgcZZ%|%i;GitVjO1yoQ*$4;x3HeU6F- z579>TJ&;D7es@@31h>909!xeo7!(LS+$nv#X&rG5j+<|MGkLrBxg)%zeeo6GukyDu z{e5`KZ2sc4UbNXxA{cko6;t9TwERXi-6;6NdPu4%U@`A}>suEoV1AIjDdVfK?>9sk zu6b&Z`at`fd*8VhHz?JxuBc~$&lg$JgF5bMs8_@U%m8s$HXGu?Lk$Iw60k`YT%H5l?iG zTO54yAam#3+xOSxk35<%Y4Y$Os|fiRY?EGJ*>V`t6S~55)zQ+zOq~-RQwi;f4~Svj z@E=muo#={EHNB8I7Sx>q4GWsyzX5ngyc|0<^9wo`{PoU<6Z2o(uLYmsC}Y`w(H6vV zKKA>XXImY7H2-3IyRQX|7B=uq(a_TMZTrk{);v4W_Oo^M99D~OyFW=$aDQ%A@lAWY z1N0OS`yVg)>+3I{W;!_L*L}=*>#j!idY|6TOd&w4KqM#{k2W=Ya8tr zIzn>4r|r;itgm9>B|SDe)~!}a51j{;aFDDCk?al~*%Hci@fD*DoXHc~R1WDYdJq

Kw(_NxBq2EqhxBcs#Nl_ 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 literal 0 HcmV?d00001 diff --git a/assets/interfaces/Login-Khanat-settings-button-hover.png b/assets/interfaces/Login-Khanat-settings-button-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..ef49265c3a87d1c7e3396b84f9baa09bd68a196a GIT binary patch literal 18276 zcmeIZWmKHOvM!9fySux)ySw`UgS$&`cL?ql2(H219fG?<2u^U%CE5Gzv(NhOpR?9? z|Ls}x&h%7QJ=OJ8z5RC2S{GQpKz)4v2+kq`0bxP+ z(a>>I19*}+xj0%_+W|@3yq$m~Krd?x5D>4msT^Go3f>0u-}TXYU_Su7I5WqDx7ROl zJLW76Y>nZ|#LQ&uGJKm;EM?KrWptBgzh464pGJh=cMU3+1~qIPc=g{0v9d2esh_{F zU-V25zg)hdUmtm1JS;2fiDRq1hJ7)a(0B z)~IpU!iD@3Qzwuf7mVCKAK(3@D?@ns$1>jAP=0`=9x;2H#Z{N>`tLTsPXQ0mH#BcI zK3=r}#-l$jYkTZZmrt4AcJHqI@PDsIp49Tc9lFwh(mbQ7Q5&j&+`*tU%SliZBPr0`Q@^{)py&&k=t^@#tpx z^>sJk`XQgmE&kImul_b404sK4f(IwuL+ST56W3twOjbkj52pGTqo4T!-|B-16+AQP z(a$_O6i#RlBFlkL!F_ooESF^D$SynMqwQu6y4hAh%A0XDZufCgB=6v+-zr10&{JL3Y^7!@BB_4D7wL2^|kL((|$E5T~JoY&V z)OnL-b30C#hrN>Nx6 zcfbAQ#0G1_cdwblt1`(YAJ$M#cy@@JZ04O28g5_tz1In-l!mKT4hwE|N=lubO~;amGW8pJ*${K%89OnH)G`ZbxG|g8AfMTB84;YQc0Q zVp{|}wlG6@5Dy7zfB2QxT(hu!=yB!>8~@oq?h-Zk&SxRr+G*KYcvxYAhde^%&b37{ zeFlM}k%AsmzQNy_4koDTrA8zzcjb^KvK zH^1?Ggg0c;K7#8h+z!HJ(SAGg3nWQsy!1lzXzA;P`I91j#%g}t%&SoEZ~sp}9zfq8 z_Spkk0)LM^PHr>q1h5I+Xv6csX=%HzbZhOb-c8Cw3wV-CAoSdsCS>3Sf$g#*1QqjK z@$Vy2eu)cQU(#S;eN*^Hp9s~?|eMJ!KaUvLz2sb(`U<^_Vtz*JA^J5 z1!fX(AEJ|L(qB`8$L=~jnVbc?+Q@7%Dj-|qWRs`1L5jRU_UbUn+`iAu_n_Z$AqnD|E;U4! zd>?#7nt5P1H#!fS-G73hJ8dxm1cS_e$-H)H~Dj$>Q;Q-9O;T$Mpbba$SoP3(Bun#1_|xK`gc^uroB zGa&n1J6{38!@aRtl==^Wm@uhKI)?yStA1X&rinoaqYgW*bhO@h890=P-qx59NoX8-nz`u@PkNG3qp99%FVsapWdQ}H=w zy1MebpoLe(TFQDhEJjbBf*44PLBsrF!X|NGO+<`9SfO@ZJKuSOnGE9hyx=53QqL|; zy&_adyjjD=UiYNCO2g;h6R0PKW?!@ptAzAuMRhBqMTOv`*>ypc{IPLEViS=v0!kZn z*B_2{l0J0xVzD#*Q4TX*>NN9Vndvcg2i#m7I69!yeaWB7d3qu7cjVxSYi`6mgA~s7 z(yL=pr+r>6tHR!b+kES^cyQqpxFW=!_LsM^LF(wf1ww*qEHxq6!ZGmWe8=T^7>_E1?1g+;;L4u+{ zeWIF!gSYlXgff>(sBT2^}Jsq=EzFIEZp z!63As+4KgUx(Gi}SdtV2Ne?*T%F;M-Gs&;Bznvz_qceirAZutvL#8vC)Fmbb!dae+ z@IlGeDcQ*yd(pPW1#d*pRr4WW-c2{ld`-K!A^?+rYC)a;Bu)Smff&M5T-|R|or~X{ zP}_uf-V3L-stV2|Vk7P(ref0PF9}0Oicb%DTDKSaJfH@xQ!46@YGCUMXksk*=tRZd&q{oR-z-mVyoVWSWuabtp*-w3~sa1^6e zeYm$YJ!!9#2+J8=#GZYG1ZrShjE~RtI+P%c5QA$z(80bQ)=F@F;4CWj@iVQ{^(n*S zxUN(A;wGdc=~J3M;=&u5NpahnJrwT7tnlT~S;(RHoGBFL zEA%K;-q5-!_n-zu_kB`lLg#bg6I;zO|lmRH45tw*MiFpQlCS2Oq_)Kd~YoXZ>twxU%fRHQwKkTdcXcT^ag zlwKyMOcCVOpf_5ui2l0{Lw-dpKacqbYXf{oN6`T4th59l-9ytDW<@!8;jM>tD*P8=91(~+3iesM zk;NHkeaNMw2>oD!I+8z@hWl4gsNvh4SBFXU%+~cEjUet3KW(BrjMV^kO~#b_SycvO zhwi|E_!H=tVPxcB`GFL#>?Fb25KwR)d))gOn+>U{EZ-*{FCXq^dKw@f8T7-Vf-4!8 zB4-3<*j|w;NwDfE$3f~!5C>|nM*Lue+G6fyDcsJkFHS`oz>6d-5I)PSi%gn*o7Njw z+~9A={uIW4$JvJa*#^RNeVSE@MxJUC`J1Ro1?0K{;3;+!F+d^o8MO#kInak)hS7bR zfnO9nCi6K(r;gZO;OmP^+b^+K_cpUH5Gx6>$^C(RwLv62gfXy9&}Z;g;7dP1WRWsh z)0w><72b2QJyCBFJP)5;>VyjFAp_BD!Kmo@V-0NdzNoH3zW!1~z-?6ZLio&+wP#@< zfw43?aGw%7id6WENgo=ONKe_^JVA}(OPxw*D}fL4K`$b=IILRO;KsAnl!uDIeQ4@l zJi~ooxTx$fOX`&wwz{c}(OHB}E9^5eZp3{fV;b7YNVw_43dN7ZUU7R`67P9Dq%&8v z8I?Q$spd~y$an>rgPL-ifCP@cF{ym)_JRn;=!5XnXt2%GD7T-`-#g457#y(NdFGTl zL+ksLe*FTxOvI7&3bfFVz?)Z|v54UM>6jwpCqoNd!P}9?+=_C8i9!d*XuB%krgG~b z)^H!#=WPc6SPzl*KqZ7ACPie2G|;gQ2YqUQu$NjSxOEU!jqjh|Dmx46+IS@QXpXV6 z$%Q~kYgE}m>AvIH8(W8( zq9|{q(U}Ko#K4&&2D^?sgB$$9>MXlD$n_rSt+&45r~vtAGY+s@N)W^XCe-r`rc)Ru z0Cy#Pb%`=Sts)0`$u5HeO!$i?YAkuR-*HMJyFm~dSfmE~y$K_NU zx)=mDG=^Ym zZu6p!x#(w8T>zm93XJ5GD<{cm3i>eb8h$=8iWpLZ5wX5w$g0{(u8)Vtct^XPD631y zR9Ip!yJxRF|2daO7c9mnve8fU64jKETw0K~YzOqMyWY^^H}J}9Rc789aUEo-xXe{x zkpl@ZV<_&_T&;ORa;v{xzYDNz%0WZ~;MPPy(jmL0piqsXthQ0%91l4&*Vua)sM4Y| zI=Y}pL*D1M`q+5!cQmh&flSe4hfRVKXd9!UrAkY264qq}?4qqMb~lR?fmHI;)!K!= zYpm}|*Pa-rB(Jg-On@zc$5JMsrgN&Lyi59`hA$64eRfgiuJVI}pb<)LB&aV?L5joHp*|{gnTTVA(%5I^vZxCZR;3}>PS6P-9lr$Y#QUyuA0lTh2 zx+G0CdV=OsKr~KLLYKM{_Aa^6i+c}F#$YzeYUPO~M?S`(!nR(FCQ#+Lq8hQ>VA9dt z#&R{!37h96j^alapDNlr8U%hBIQK&7{(?~ldu^rlEQMSnfpMTZH1Y}a_r8c*UikU^OHNiNapNQl*sV} zH>Tr_i5F-#i0o{86%)pW{g-U@Xx2(9rAXf_8+7WF7tURDL+Td@A6R$TBNPo*0eYkg zMrd*omG33IPTy$0BH9zCA6-;V#6~(;M}nOLqAy>ad8GCiVTi}kCr-3aqup%0Ppnx00+5ke>7aHxJ$go2+#p1{c z(kMtT1iO(K_ZZxeO-;KAa%fOgiOmQaz}tG(raPNEVZi?dbC(*dcGA&O$Znh3%zu$l zG$L+D=a+Na3)fm?S|i*fjm!phO-8+0y&4CSD~*+RDiTu0ddrYTu_>WXEDr4R*2Xu? zs4Ez6=ukN#dVhm#O&_?R7vBsZ8M_wneZ1Pz)2Z6S&6^*p8!g|qHe13*atfy^9)tSZ zKrv|{=rW3%?UsjQSfT@qW+$$ZoQ~-WEH4kXI7m5l^XS^?JDWd)Z&AI06=WE1p;HS3 zxOj)1br?(n)kWW^f{Kc~n!>o2d_!;t_S(MB_Y0I->{UU8z(}Li2y!8@p5W_D)uu30 zl?tLW=L~lVIF8E2;p zSik`YYkgzkb@;ipE02f>pIZC2MN}k^HueUqbJeSxMaYIbd7_c3CoU$`Z+u9Jzd%Fa zjTQ;S5uaFw7&8aAR~WI-3#JzMRVz>nCG0ys8&}F} zP~5_m>Z*i`agQ&!gBT_SZAP~^HulWYveytD_T8g5l&h{&$yrOL0_5CaQH9Dap%+;F zL)r*Yn|h3_8fxsJ9?CH+Ej;B?Dy*WaE-8B}Hbzh+#WOD7DdM0Ar2$myFW=VWT(2ld z$+~g`Sh8DjUNg;enL#2(umv;&9DkR+wKDZ%xJ>2;XsiXJE0-O^!A$MSh8-_X){*^E z7;6*w8P;if&jANn-Qg^3ZGb`9mD8vM|z($g~d*$^9)*892NQqbMTVq?! z#6UbNG(DiPyXA)tnw_zEEaBbjZ}e#u4WcmnC>SLdG>W!)?>Fz07Nht*Rk%K!-ODanYG=8W@`_wO~*b2!8vL{V^4VF^e z6Uwha;Dnqqw#R*G0)F9z8^B14!o`;WqrHI}iSW)M=zY}^#Q=H2TsP`&F4eZPEo(K< z_buVFmJcFBVtv_Jl5^fc8WVwZkmCYcDdrdT9pe?TvjquBN(wJ*7y z*v1;o7({uXyclm&hD1M&m=%s>Rv{|YW}Ut!%8Hgwm?9)YikW66=%p9$5+qbzA@fM| zvx%Zn{35{+f>3K@&&4r3_5yMtW>6UIVbG8p<=a>NZnK^8%3=U~&iVPM_z3EyPefU?5I>mZAOSJJp7^7;)_8`G=WEju^3n%MnNf3iPW_8qv@QuEWLqE zZ_=qE#r1l*#Mryd*Zx+5M#^{c?&Yca@)Tdw&xQ3X1 zFaXbCfMPF#?WLxO*#c$gb=D$fZSQ^dl@Jjk#;iSxu*M|{Bm~NWw+H?Vf-tCF2E`tB zg{5m*!ApOEbn?`Fsplm49JqYa#7p zDu?tj)LI)cR-2;~!Tu^dt8Ev^un(Q1&7VE0Hs241Y<<#bXu)|Q0m;-K!!nCl?ULi_ zvo{Il26Icj15uX@)Mk4pJx0Chf#^Eke5R5HDgj1YOaeJf5`^# zs;1s;szQm3^J%ru9tc@gH6-ynKhc;bD;k)H!WG|RI-!wM_dyqsGO5_cL2d~|vD-p) z3ur@xlUy_rWm#E)?Oe%HE8O4_9cr{8q4delMSH+{-z0pG@umY+ePhjg{CIqYYqt!1 zjVOe=1C~Vqur-Yr2kHmgH0I1xQ9MFd3cp{pe&#q=<@~&jj>Zkr+dnqtn29G5+UOPY zOeQApC02_*3U(Y=DXs&arGK9L3rC7G)o4?xD^-ObQ&8U#qHuS%^(U(Dgec*-z+e#` z70b5^t+npyLV;xtTxw*@*Fk+`y>J|M$Zt|lh(_Zq9sNkU#b%da?tCW>~@b>bNj_YO0J>pOjjSj}! zwy>|acbjP<7)TcQbP&+!YbIUop!+IF@^35>nQ4d;e1%8k3mC}~6?C012+`}SAwkQ=0$;dtg)rE+#^ z%}~Z&K6Pa?iied!rJA3m#!iS-MIKp~yPLon=2{LTNn4~EsCOmCk``mxmc{*?R8cj{ zpT^`atG7@?72h+5)tJU;A)8VeyEf6-U?+*YxHK3BH5~ScVYHl0X_CtaljK;qFNH(Y z7=iVxZHlZ_yM~(nJ(WGMPvmWRt=xlX$FSh1JJMZ+iFb!+Jk)RIy z{x(P|Po^u2C3;((H*Kdy9rTNX{+kL2<384ij>2(2Yc+#K)<+)p%68aJWSV2!m}m<< zW`p{QB2)x%`XO)urI6kYSV=^g`T*z{s}U)51WEaYaXTaCoBSrWQ+y283P?C8g8OwY z$nE;_DW{iGJJs+LIE8}d9nDyk6==V};cYxC(`t=o9-g379;hETVsTPH<=t*_8$}Zl z8G4a^6e-j&@Xv_&fs2jhC^b>q+lSF-mt-H9Z2|ENC5Wv{=%C;u^g-t7VEX z1aromoFw>U2gZql2V@rx%e#P_+x4LNs)iBLEmc>6Od>W|Lp|4Rmj;dfy>v`976P#< z(%nla0CazE=oOLqO7R8}=N{YSEPF~b^T4dC#gT}CKEL@%SE~)d#q?FuJp$;^L>a?y zR!zmU6pb1^NjUZyJX$cO*PxBZBJng(r)7_HC-$d^j#SX|`CMH+6hQWx71ZO9@%y-b zo9*)MV#2{&OUHm2^43L7i!IeO?iAb?&G%nQgd_oJ-=Z#ElJa5r)(JTXAmzFfhT)^o z70q6fMa-CDPj(zen}0MQT|X9W*;zEPk|Q5cj=Bbg8l(TFz)ztVG0+H)-YhWC)A+UV z%V>~RPQhZnva2i6glZ4_%}K~&?o}D8bYakp9;)5cQKsSKcnXc6BDz}-pgt?o1sgq7 zgEG>4AV(9juhHKvopV=)xoH<*^B6YDp#d_jlo2ew(lX27r!xA~Hy1y@J3BCniL-d$ z*@tC|(rV?|ladN;L$5TVwi`xGp13IDM@xqazJ4~IB9gvm`=rG@p`Be^Uq#)AOx(K6yJ&R_Da<@ZXFMGkdB(v4E`>?iRtvS;E=#(1KN?wA;kKA zEOgOhn|jZ8(t8oAvf+G{wmf<)i_qWpYP(Rc=X3w79(27L!3m!(xWXY^(eHkZL&OR= zka9#4&MJKXNhc;JcsAzwz(TO`NGV#&O=hGx!9C6eKks<7q`T_k;f{4)udWFL3(-Qx zRVxGeT62wwIyWc3Kcv27?a(W#osDps34LF=J`Va6+!-A#Te~v5AgO*BxN+(QOs2JW zZx4+!7PH52kezKR{}e)==={CG+~+_lA<))_xlqCZt)jTopq2(+_Knz4`lrs=$S%r! zWvRh#u35~%b)3~nn@MxS^i`V*s>wZrvpTv|i4J1I`#hQ}xV^XQB+cUAaveUJ1KB2t z@L@&6g{7a<)pe~Zz>o4S>v|Q9YPHPxP{=o65kWcPW*T##QQMBj}pxqINwb>^Og=;z!xB!S!40umCU&%-T>Oj1b^=ygpXY9fqkuMCOpJ&6oZZdhmUPbuOT7yve2xrWT z#XDscwYC$|7X;)&;?igR&a3wldpuhzTHK>wSvA4dD!0VkA~5@vY6<J zQB#y=S$uFw_RYixKc0A-H>_&-QQk7Mf^QU8ap*gSutZvAJ4U^8ohSXvYP_ncT=f@c zGeT9y1XV^~xG(3W+YV%^2BQ|JXFGO#1GqLnio34u$~VVZ9EJ>dW!2hd$}4`POoU?< z66t`mwv`gd-JVQn3bv!ML{7`7xxa!om60#%YFah$A*U{$fy5}VNjmgVRg`6GdL|@3 zRYz?$a*|9VNvF#EWSGsVJ00*74|SHD?kGWSq)mwRU8)_0Cn~DzO(UyRLE?&Y z;=|`!m}3~kQef~XD>92y00^aXHL0-jexwCZvT0;6n-lf87C3CW=*m}8DG3$zmwQHW z2ucLZR!7y@NNQP$)bu6dT6?m*+AscHiwKW{Q^(ME$BWtX%;U%KtU>){6*MO}L@8#* zZ53lUdXX#6i?omq!qwNGE`O&5x(g;BRxXq?S%CaZ<70GNIo1gC*>WgJUR^xa;Y={1 za^w42*PokWPq$PS!UtVKRZpMTp+S(_WQQXen%lXrKDcFeYD^d&Zj1!Zd&<8L!bgj` z2*X~$Ni<-Jz3bs!9<^!%SisP`)C-ZLJS%lLs3vG>FKpD`T{u%eCyZAJ#6-siuhI<4=yBc%h=wKwz*L<`tDd z3ke|s2M4zZR3^2FR*)15>Z?Qqmsqh$gk_gQ2NKG)lDco$r0p@ChaAeF6N_O`5sHx#56l&0uwSs^0_tFQipkIi;h#y z6w!G27MqlXEsA+_)-%$?S;}?Addu1UVHPL>-=e5J;%dkRD$r!fP4oIT<1tzAP)l7` zkABP<2W;D?J=s{kxs88X(>4A&X>Zw;%eLpIn)&_Q7*B8N=ZWvqsyHWYIeJ%gs))?^ zxx_LrYbspQ;iXk#f6Vi;$#k7+zFQSXR*7PoG;cBwxhIVqoi^F<}HS;PIdAB zdwvFyetHJ!Stf@?(LGC)Caw>$FItMU{|X=FCKjmQ;hR~V~LNQ9pRskgk zLlmDdweuEfOchk}RDpwoR|KL%B@{Ru=Y8W0UO_BG_)QeLIpcTY0C*7? zB-4~I6{g_Q&RnbD`}gm!XNHJVB)6X8H_waTtJvMI5D3?obXA#qBgNemmfki=C$Z?l zNKJy_?gShoSa2YEdgEQ=LE~fv6nwtTe+O7;n5uQzpk$DSk@%{+OGxL4K8}7Kc8yUU zXYYG5VUnk49XP8*;`?FKspQ2)hD%Cz;of2_OGB94KI?C-M^d6DR4e-GvHLUh@Ep0v zkOy^=3TBHd$2nV$9^tgPl-mf_s&P5JW{Y^~q>{OdbCRrV!^bxOFNE#0fOuvqfeL{OXy)a_5Lg0+HEywimko^)J?Ht&vG?h z2wqgtOPKSq%4YiV3-`P8Lxf9vl7;U+O&5J3;e3xTDg&p%d~nB*jIy3RBQz2(CVp@W zFI5fHv!sNb;b$cs7J=ct91OLQX1+gaPj$gKKIaQLi}vwYd_r*(`6Ls~Mc4;+T<;FG zmPVul3c83cOwv|-n(C=yB>S*vq2Bz`Xo6B%KyF?sMwXW))oGGxbFakL6}zh~MQY*h zCc}V1$q$!qc(QPjDoP@;!^^oQW6sTcTBWFxFz%1IrAzJ9^L(6p=HT~yY)kVXC>OOE z|14eHfOmpuMaD|MojO+h=yt)-i|&|RC{j)4q~W4IZ~xoP`jp@+&#Z` zkfyD6c0}HB-${<&dbK%Bgb59uq5NDSGNBJ7sd3t6&mM(Jf*Pyx?EYb&o%2Njlrfx!l;&O^nDAKakNtlS6lVE_o znE8d-PQxG}rlk8bQEJ?p6p3VNms8B^w8-1xuZGI|WEYMx$EGs>cE#{n*#pQ`?=VWh zs8p1!pfG}JG1TB8Aade?mZX-JZ&O;323X3D5?Tx)uX(U%VHIKEeji>ZqCrYx8R1$s zAnMzY0^VKzo#Qu*@sI6ZW{td~c?I#fhYB_gLPKgEzuYv^vaId+2@x`Xg7nP%eKzB- zz{hVy{e{KywX3Sq=^7B$e2mRovn4Lc7A=ArHV`b~k(cX-vM9JZ=C<;SpPpw`Yq#FtQeLnR!0)=u7s zii7%viHjfIqsio=YxHBadS*@FKw!VL9v|z|WuLZQZyWD)SWk3D6b^bm9(XuJ9bHr2 z)o?N48XfbA_R$fk9yk;4qR-UE{KWgA%zXWI;>nd07V8<5E6iJ3mX_>XHGol`Of+9h zKwIy|1Jl1ixdpHuhtOOv)w3%sv4V=~@&tNGe+T5A3Q!q~FEMBc91Pi9%a7es~~i_&C#&eJX=r#k_mzZV=a z&AMB&&bPViY3fX!@xDgU(DuCKX}jiY6r}XbAp(;4peM*8M%Y{kSwbBa*i=-~3GwId z#g3zun=n_TabPr01mx{G`RYm9Ry?(_cwEkHl2L!+6i_{8gS|}K=`n-yX>Iyq{DRZZU#3!TtwxDA z<>XS=YSLP(hP1x!s|smS*BN~NtXM`)pf_H^dyjV?2>H{Bmv!0J`)&u5b=B!wv0bZY zG2?*wWm%aO$cZ~2!Y>1a3x&5?u|kA$+lo@$$q&b@K8SL)BR{o{J=yujciy{4 zzi0?JgHe?vo0EHVCW{gf0%lQ51JAWXzU@h)u6h>y%Jq6S;Ov$L@vj-@95`}zIVtE& zNDe_(bJv0`TdlbPvVd{?sRU{%cZ!s!QgRbf~p(Rx@A!=%byFz zkG1mA!RbfT9ukH zvG=**B=#V7+Q8sVIikwr7mzENS|CWSL9WgQiTnV`YQhy(7Ms9idu~yNdTQy(`h5)f z&TSCMh-v*8FvGh$my;**rQhYmrf1;yGM1?mJZO$huKB3el&NaDUF}d7kff!uNd_~fRJnf7Pn+bu z4;?r&*R?OMw-w$oprBD+X}G0|ouUF=*7!LOQIcApHTPWiSd*D#UPs-B_PM7e(;@R{ zvodc5>SY)(`E`y>wAeWJX!pu0j#HS;1+{n`otNl1m)fZV02H;g46eC9SkQC^(bN(P z3c}gw>QIXfsfWa}ruT*3Ntg4<(#2}naCos)!k|{~LVovMZs~=M!7|gLL5nfR->`y( zdIni+I(H`!e)R@}$Pc3LIwK3ECQM>mBjh`cD=<_+a(|I5D#_u`t`)Gyl7VtDB_9 z2gpAM^nbN*)%ZB|!mI{#b#!+z14?=T9o)$O9m3q~U-nM!E_Q#zF*jod+5zo9R9!#3 zvi=X3(z1#w|FZZ)fu*&*(_gC(vj2yso3+J%ll4Ew_NV7>IR8G75A%QF{txZ{iv6$h zhnAuupM;~C`=8;-N(hqu@y}=OXl8BB_qPe;W#wS!;WlS9Wi?}GIVx=Vj#JJOCp2NaMO$i>19U}5C6VCVjTVgWFka#{cx zS-5!2*tyKic}+P0f1%9H_@o?N>;WI?w6+IW0-2p0EdO@=A)HTCMOKiEjp-j=|4LNs z0B#l^27+V?)(-Ao|E;QFZ4Xp;1N>o=m5c4;&CSil#m&pZ%g*}WN?Je{*N;m4gUQOm z#K!Tr=TBPrK7#om7VxJ|KLGy9KVsn%cL4(299=XV9qk0k{tSTRkLBO;CK32YQe>=M zKQz4mRQx|{ULENCk6-_|1?;T;Fr#SXqGp3v*U;Ms^kpb4Cs>4h}|Ba~@MhZZk7hAe#jn%SXchhVd_SS4Rss zPk;+h)bbV{Fp>YcK)p(YJwAlcZnBD!(1(zi7_fL~ccSwj zB3w5~9XD}D`#*@LWvsD{rpflIQ^B{{habC6mz$p3o2Lr%eij##-M-td(=V^jLfc2) z%o<8=B4wwzNvzj;e9@e8dcylh<%o^RDp@hd5IB*=PuaejwFplf`)U{AB1 zXCO$t?seEX7pZ45^!0ltqlO9~mhF($8J_&4`RKvbiloQ zZ1eQG^r};^M7WFRb{`J2z90Rf{S(B2F~W5C8p`P_leX8gFM~|+$^!)7Hg_60 z5Fy?-um?0ba3&QKv&)RD4)qb*skELzsm?+qG>_NpSjKA$J1`%V8QcP@}sR_Olo|9pl*e|)A{a)ihVrmX4Os6QaebgQ60<4TI zmgPp8|LUp+3nhehckhu2FA)WSpr<-`%EoZ%N-=KIfS71NEw!-n?4YYcicbXM> z<`{~!Sq2(|iw9D^o!8?BB?oQePVCQ$BSLh83BcO@il69uaa78Mi3KrInX-jO0yXQ} zho~k7+kkq-@>=4@gUji`@xp%0@{B#f9_loMa7xA*Dq5NAO;7c$1&s*G2SN54LF|Rv z31O2_iUsmt!J2e=PA&?{W9&hBQD{x;cz_CH!Z4m6BR+>m@vEqF@w1V&VVHc4SAQCzg59?rnXpuwcyI*v#4-fQvRCxZVMe` zA$Swrt(H9^VXKweY8mh8<~0Hpq_Ea_(rK39`MSwJjMa7|zU8bk!$F@q(z*X>hrKtu zmyq&)1?Ckk1JpnRL9@#&)DuA+wm_uDAG}Q6+&rfDH|oxMyFtxbmI14CqlF<8ds;wh z8K+@y{Og=mzFyEM(@w1^O7`KQP9HM-6BoQy^cZ+=evoV6Qx_QWWh;UXd?#2eqXh8Q zgcB?DR!PMYPwQeH>AiWb{tFezrJy7_kOV9MGepQGOo|m&#mBzubG01Xs^%2~` zgwsxx4(*tb2{Q|7nHu9ndT^Cz71q~JQriz4VmPn{=vU+WV!sx5E<*${?n$3D$~j>V z4ME2W(89~Ls>d;{UBl@kV#b2dX8dzZU4uq$RV;l*>cH@SaF}N@R$hV;UB}Od_1AH-QCg^eR`D-zxk$Ry_ix3V!)!)AfGYLkNu4YKqi7g?Am{@cPV(Y7Ng0Ta2 z_-o2q=8A2H(Imd0X+>20R>jfw(FK8?HSI_vn+og*lp9~(HuMWG=?=-xv)DKKM5&;0 zyhG1R40LiwHJ%y<4lwmy0}ut3jt0)3k?eg&ACpc>QCr!H{57cHnh-Chp#&Peo;`)gC4KTi1Sh5WXW+oXLvAM8Z@mN^W81nqeHu8u)>L z-uyt$U%t$Trc@51oo01wd3<3n?RhCD=e@U7hg1Dx9Ai51g9rvcoAd#%-%eIVyt$0F zbOCOBA>25beZQD8HZIe{_0xeU0Ws43dcG66mGi1s+m?=*%uoinI z%vSSE6sc?yT*BJ-$ZRiX&wi`!%zcq7$))17mb*2_H74C9Ebc0n&o}B>Rk-oDYtxIe z7MpO9O}_r+Z{}To7L7ZhFB;G3JHq>RR^GS8s;uy}i~3}NnHQ@oas@dDL&uYU%ncvF* literal 0 HcmV?d00001 diff --git a/assets/interfaces/Login-Khanat-sound-button-hover.png b/assets/interfaces/Login-Khanat-sound-button-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..f62614f69b9ea516ddb44c50b68c48f9dc3f9907 GIT binary patch literal 16746 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 literal 0 HcmV?d00001 diff --git a/assets/interfaces/Login-Khanat-sound-muted-button-hover.png b/assets/interfaces/Login-Khanat-sound-muted-button-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..8e9994fc7fa830b1c1e5dc861adb4c9a5b81f0d0 GIT binary patch literal 14427 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

>V5Km^4+t0_P6hqIYue1D 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 DCgqMi literal 0 HcmV?d00001 diff --git a/assets/interfaces/options.png b/assets/interfaces/options.png new file mode 100644 index 0000000000000000000000000000000000000000..47ac3466cb62045478cfd9cf037043337e669bae GIT binary patch literal 545 zcmeAS@N?(olHy`uVBq!ia0y~yV4MeJyK=Ar$*NBc;XsPBz$3C4NLhg}|C)4Z8lh3@)7f41tH39j1I>5Ky(Dj9a?RZlSLJQr-US$IZ`jUvFl-VQIQ^ z&2`ytvt1=s%b7lGugGF1&7WDn?<>_DPX9Z@-ym Nz|+;wWt~$(697`Jz=Hq) literal 0 HcmV?d00001 diff --git a/assets/interfaces/options_reduce.png b/assets/interfaces/options_reduce.png new file mode 100644 index 0000000000000000000000000000000000000000..5aee4104f754ccaa7ae4beb61c494d270296f434 GIT binary patch literal 751 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 diff --git a/locale/en.po b/locale/en.po new file mode 100644 index 0000000..a6df706 --- /dev/null +++ b/locale/en.po @@ -0,0 +1,120 @@ +# Don't remove the two lines below, they're required for gettext to work correctly. +msgid "" +msgstr "" +"Project-Id-Version: khanat-client 1\n" +"PO-Revision-Date: 1\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "MAIN_MENU_PLAY" +msgstr "Play" + +msgid "MAIN_MENU_USERNAME" +msgstr "Username" + +msgid "MAIN_MENU_PASSWORD" +msgstr "Password" + +msgid "MAIN_MENU_QUIT" +msgstr "Quit" + +msgid "Select" +msgstr "Select" + +msgid "Remove" +msgstr "Remove" + +msgid "New creature" +msgstr "New creature" + +msgid "Cancel" +msgstr "Cancel" + +msgid "OPTION_LANGUAGE_SELECT_YOUR_LANGUAGE" +msgstr "Select your language" + +msgid "OPTION_LANGUAGE_EXIT" +msgstr "Ok" + +msgid "OPTION_NEWS_TITLE" +msgstr "News" + +msgid "OPTION_INFO_TITLE" +msgstr "About" + +msgid "OPTION_INFO_AUTHORS" +msgstr "Authors" + +msgid "OPTION_INFO_LICENSE" +msgstr "License" + +msgid "OPTION_NEWS_EXIT" +msgstr "OK" + +msgid "OPTION_INFO_EXIT" +msgstr "OK" + +msgid "OPTION_SETTINGS_EXIT" +msgstr "OK" + +msgid "OPTION_SETTINGS_VIDEO" +msgstr "Video" + +msgid "OPTION_SETTINGS_SOUND" +msgstr "Sound" + +msgid "OPTION_SETTINGS_VIDEO_FULLSCREEN" +msgstr "Fullscreen" + +msgid "OPTION_SETTINGS_VIDEO_RESIZABLE" +msgstr "Resizable" + +msgid "OPTION_SETTINGS_VIDEO_SCREEN_ORIENTATION" +msgstr "Screen orientation" + +msgid "OPTION_SETTINGS_VIDEO_BORDERLESS" +msgstr "Borderless" + +msgid "OPTION_SETTINGS_VIDEO_SCREEN" +msgstr "Screen" + +msgid "OPTION_SETTINGS_VIDEO_WINDOW_ALWAYS_ON_TOP" +msgstr "Window always on top" + +msgid "OPTION_SETTINGS_VIDEO_WINDOW_MAXIMIZED" +msgstr "window maximized" + +msgid "OPTION_SETTINGS_VIDEO_DEFAULT" +msgstr "Default configuration" + +msgid "OPTION_SETTINGS_VIDEO_SIZE_FONT" +msgstr "font size" + +msgid "OPTION_SETTINGS_SOUND_MUTE" +msgstr "Mute" + +msgid "OPTION_SETTINGS_SOUND_LEVEL_GLOBAL" +msgstr "Global" + +msgid "OPTION_SETTINGS_SOUND_LEVEL_MUSIC" +msgstr "Music" + +msgid "OPTION_SETTINGS_SOUND_LEVEL_EFFECT" +msgstr "Effect" + +msgid "OPTION_SETTINGS_SOUND_YOUR_MUSIC" +msgstr "Launch your music" + +msgid "OPTION_SETTINGS_SOUND_YOUR_SELECTION" +msgstr "Your music" + +msgid "OPTION_SETTINGS_SOUND_SELECTION_ADD" +msgstr "Add" + +msgid "OPTION_SETTINGS_SOUND_SELECTION_DELETE" +msgstr "Del" diff --git a/locale/fr.po b/locale/fr.po new file mode 100644 index 0000000..c739c0c --- /dev/null +++ b/locale/fr.po @@ -0,0 +1,120 @@ +# Don't remove the two lines below, they're required for gettext to work correctly. +msgid "" +msgstr "" +"Project-Id-Version: khanat-client 1\n" +"PO-Revision-Date: 1\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "MAIN_MENU_PLAY" +msgstr "Jouer" + +msgid "MAIN_MENU_USERNAME" +msgstr "Identifiant" + +msgid "MAIN_MENU_PASSWORD" +msgstr "Mot de passe" + +msgid "MAIN_MENU_QUIT" +msgstr "Quitter" + +msgid "Select" +msgstr "Sélectionner" + +msgid "Remove" +msgstr "Supprimer" + +msgid "New creature" +msgstr "Créer une nouvel créature" + +msgid "Cancel" +msgstr "Annuler" + +msgid "OPTION_LANGUAGE_SELECT_YOUR_LANGUAGE" +msgstr "Sélectionner votre langue" + +msgid "OPTION_LANGUAGE_EXIT" +msgstr "Ok" + +msgid "OPTION_NEWS_TITLE" +msgstr "Nouveauté" + +msgid "OPTION_INFO_TITLE" +msgstr "À propos" + +msgid "OPTION_INFO_AUTHORS" +msgstr "Auteurs" + +msgid "OPTION_INFO_LICENSE" +msgstr "Licence" + +msgid "OPTION_NEWS_EXIT" +msgstr "OK" + +msgid "OPTION_INFO_EXIT" +msgstr "OK" + +msgid "OPTION_SETTINGS_EXIT" +msgstr "OK" + +msgid "OPTION_SETTINGS_VIDEO" +msgstr "Vidéo" + +msgid "OPTION_SETTINGS_SOUND" +msgstr "Son" + +msgid "OPTION_SETTINGS_VIDEO_FULLSCREEN" +msgstr "Plein écran" + +msgid "OPTION_SETTINGS_VIDEO_RESIZABLE" +msgstr "Fenêtre redimensionnable" + +msgid "OPTION_SETTINGS_VIDEO_SCREEN_ORIENTATION" +msgstr "Orientation de l'écran" + +msgid "OPTION_SETTINGS_VIDEO_BORDERLESS" +msgstr "Fenêtre sans bord" + +msgid "OPTION_SETTINGS_VIDEO_SCREEN" +msgstr "Écran" + +msgid "OPTION_SETTINGS_VIDEO_WINDOW_ALWAYS_ON_TOP" +msgstr "Garder la fenêtre dessus" + +msgid "OPTION_SETTINGS_VIDEO_WINDOW_MAXIMIZED" +msgstr "Fenêtre prend tout l'écran" + +msgid "OPTION_SETTINGS_VIDEO_DEFAULT" +msgstr "Configuration par défaut" + +msgid "OPTION_SETTINGS_VIDEO_SIZE_FONT" +msgstr "Taille de la police" + +msgid "OPTION_SETTINGS_SOUND_MUTE" +msgstr "Mute" + +msgid "OPTION_SETTINGS_SOUND_LEVEL_GLOBAL" +msgstr "Niveau global" + +msgid "OPTION_SETTINGS_SOUND_LEVEL_MUSIC" +msgstr "Niveau musique" + +msgid "OPTION_SETTINGS_SOUND_LEVEL_EFFECT" +msgstr "Niveau effet" + +msgid "OPTION_SETTINGS_SOUND_YOUR_MUSIC" +msgstr "Jouer votre musique" + +msgid "OPTION_SETTINGS_SOUND_YOUR_SELECTION" +msgstr "Votre musique" + +msgid "OPTION_SETTINGS_SOUND_SELECTION_ADD" +msgstr "Ajouter" + +msgid "OPTION_SETTINGS_SOUND_SELECTION_DELETE" +msgstr "Supprimer" diff --git a/locale/locale.sh b/locale/locale.sh new file mode 100755 index 0000000..859f151 --- /dev/null +++ b/locale/locale.sh @@ -0,0 +1,21 @@ +*#!/bin/bash +WORKDIR="$(dirname $(readlink -f $0))" + +function generate_locale() +{ + echo "--- Begin : $1" + if [ -f $1.po ] + then + msgmerge --update --backup=none $1.po messages.pot + else + msginit --no-translator --input=messages.pot --locale=$1 + fi + echo "--- Check : $1" + msgfmt $1.po --check + echo "--- End : $1" +} +ORIGIN=$PWD +cd $WORKDIR +generate_locale fr +generate_locale en +cd $ORIGIN diff --git a/locale/messages.mo b/locale/messages.mo new file mode 100644 index 0000000000000000000000000000000000000000..9fa5282568f18e6da9ec52d96116c4e7cf6cb0b4 GIT binary patch literal 2285 zcmaKsO>Epm6vqczC@fHDfkOF;3!y4Vh6aQbZJL9#I~%Ne?d{smHdQ5S;+;+0dhN&` zO@ol=6>+Y(Ko3Y9feRN72&qEihB$DAoIr5ngoMO_|65Ns*_6#_$G?4lzj^cKy^()C zdGt2Jn8kbn^TK_My#rpo9}kT4M;Ln$oC8mS^WbstqT&^$N8qE--v^%rKLnouKUMaZ z;0f4w!Kc8VLE7_Ako=Axt=`Xo^nMO}8f<|tgI5(l0MEew415m!9()Dd0X6W*16ABv zkk*?Z=>hm6cuU!Lz!})zfpqR2@ErKB(qF})Ux&@Xv*0F(ANyGG4tNZ;`dryx9AoSu zy#E?RD(qXuyGs87r26~>;>Ui$gG&6Hvi|_FHTz5He}hzqf0TV3!71(ukk*|7$^SG+ zdCe%ERk{w6|Jxu+%;rI={{^rH+90i8RdxVUy{;+y7Wgpik3fol8>Ie!qV%so%I_PH z`u8J9emjc4gDB6aHL-ooD~$R{Yc)*D;aN<|jq;^2TVeD(g(u}fH8?n4 zQUdjr22xASpZ8*R>Pxuu1f6h)ay=5##Mu>;d?If3DO?>b#~ zLgSYaWWSSTHn{Eb3C%M-Yphs?z3dyyJlMZg-f* zqd6_jQDF{?KXMpHx+jShv&o(RSA!*77v8nFJ8tnf!O^my$yoSoUT>EfL)=RN2bx(?6T}#qL zja zEpXE^=`%hUPy?3ZbWPx+SLRWOXMs5VKC?ubgd0_e;po*WMXUagWgO@D2+9OK&!hLmT8y?=LIo|&sKu5009DuECRr~^`stP? b;w`bAYiXht=_cE%#G$wu4dK*3aF6~2BUJ-U literal 0 HcmV?d00001 diff --git a/locale/messages.pot b/locale/messages.pot new file mode 100644 index 0000000..87c331f --- /dev/null +++ b/locale/messages.pot @@ -0,0 +1,112 @@ +# Don't remove the two lines below, they're required for gettext to work correctly. +msgid "" +msgstr "" + +msgid "MAIN_MENU_PLAY" +msgstr "" + +msgid "MAIN_MENU_USERNAME" +msgstr "" + +msgid "MAIN_MENU_PASSWORD" +msgstr "" + +msgid "MAIN_MENU_QUIT" +msgstr "" + +msgid "Select" +msgstr "" + +msgid "Remove" +msgstr "" + +msgid "New creature" +msgstr "" + +msgid "Cancel" +msgstr "" + +msgid "OPTION_LANGUAGE_SELECT_YOUR_LANGUAGE" +msgstr "" + +msgid "OPTION_LANGUAGE_EXIT" +msgstr "" + +msgid "OPTION_NEWS_TITLE" +msgstr "" + +msgid "OPTION_INFO_TITLE" +msgstr "" + +msgid "OPTION_INFO_AUTHORS" +msgstr "" + +msgid "OPTION_INFO_LICENSE" +msgstr "" + +msgid "OPTION_NEWS_EXIT" +msgstr "" + +msgid "OPTION_INFO_EXIT" +msgstr "" + +msgid "OPTION_SETTINGS_EXIT" +msgstr "" + +msgid "OPTION_SETTINGS_VIDEO" +msgstr "" + +msgid "OPTION_SETTINGS_SOUND" +msgstr "" + +msgid "OPTION_SETTINGS_VIDEO_FULLSCREEN" +msgstr "" + +msgid "OPTION_SETTINGS_VIDEO_RESIZABLE" +msgstr "" + +msgid "OPTION_SETTINGS_VIDEO_SCREEN_ORIENTATION" +msgstr "" + +msgid "OPTION_SETTINGS_VIDEO_BORDERLESS" +msgstr "" + +msgid "OPTION_SETTINGS_VIDEO_SCREEN" +msgstr "" + +msgid "OPTION_SETTINGS_VIDEO_WINDOW_ALWAYS_ON_TOP" +msgstr "" + +msgid "OPTION_SETTINGS_VIDEO_WINDOW_MAXIMIZED" +msgstr "" + +msgid "OPTION_SETTINGS_VIDEO_DEFAULT" +msgstr "" + +msgid "OPTION_SETTINGS_VIDEO_SIZE_FONT" +msgstr "" + +msgid "OPTION_SETTINGS_SOUND_MUTE" +msgstr "" + +msgid "OPTION_SETTINGS_SOUND_LEVEL_GLOBAL" +msgstr "" + +msgid "OPTION_SETTINGS_SOUND_LEVEL_MUSIC" +msgstr "" + +msgid "OPTION_SETTINGS_SOUND_LEVEL_EFFECT" +msgstr "" + +msgid "OPTION_SETTINGS_SOUND_YOUR_MUSIC" +msgstr "" + +msgid "OPTION_SETTINGS_SOUND_YOUR_SELECTION" +msgstr "" + +msgid "OPTION_SETTINGS_SOUND_SELECTION_ADD" +msgstr "" + +msgid "OPTION_SETTINGS_SOUND_SELECTION_DELETE" +msgstr "" + diff --git a/project.godot b/project.godot index b14315e..bba0b02 100644 --- a/project.godot +++ b/project.godot @@ -67,8 +67,13 @@ run/main_scene="res://scenes/main/main.tscn" boot_splash/image="res://assets/interfaces/new_launcher_bg_0-1.png" config/icon="res://icon.png" +[audio] + +enable_audio_input=true + [autoload] +Config="*res://ressources/scripts/config/config.gd" Creatures="*res://ressources/scripts/creatures_old.gd" MusicManager="*res://scenes/interfaces/music_manager/music_manager.tscn" Connection="*res://scenes/connection/connection.tscn" @@ -85,10 +90,11 @@ gdscript/warnings/return_value_discarded=false window/size/width=1280 window/size/height=720 +window/size/always_on_top=true [editor_plugins] -enabled=PoolStringArray( "kh_slider", "kh_window" ) +enabled=PoolStringArray( "res://addons/kh_slider/plugin.cfg", "res://addons/kh_window/plugin.cfg" ) [input] @@ -222,6 +228,11 @@ camera_switch={ debug_mode=true +[locale] + +locale_filter=[ 0, [ ] ] +translations=PoolStringArray( "res://locale/fr.po", "res://locale/en.po" ) + [node] name_num_separator=2 diff --git a/ressources/scripts/config/config.gd b/ressources/scripts/config/config.gd new file mode 100644 index 0000000..553be57 --- /dev/null +++ b/ressources/scripts/config/config.gd @@ -0,0 +1,205 @@ +extends Node + +# Localization configuration on linux +# $HOME/.local/share/godot/app_userdata/Khanat +var font_size = 14 +var SettingsFile = "user://settings.cfg" +var screen_number = 0 +var screen_orientation = 0 +var window_maximized:bool = false +var video_default:bool = true +var window_fullscreen:bool = true +var window_borderless:bool = false +var window_resizable:bool = true +var window_size_x = 0 +var window_size_y = 0 +var window_always_on_top:bool = true +var debug:bool = true + +var sound_lvl_music = 50 +var sound_lvl_effect = 50 +var sound_lvl_global = 50 +var mute:bool = false + +func msg_debug(text): + if debug: + var frame = get_stack()[1] + print("DEBUG [%s:%d] %s" % [frame.source, frame.line, text] ) + +func msg_info(text): + var frame = get_stack()[1] + print("INFO [%s:%d] %s" % [frame.source, frame.line, text] ) + +func msg_error(text): + var frame = get_stack()[1] + print("ERROR [%s:%d] %s" % [frame.source, frame.line, text] ) + +# Called when the node enters the scene tree for the first time. +func _ready(): + load_config() + msg_debug("load end") + +func set_window_fullscreen(value: bool): + #if ProjectSettings.has_setting( "display/window/size/fullscreen" ): + # ProjectSettings.set_setting("display/window/size/fullscreen", value) + window_fullscreen = value + if video_default == false: + OS.window_fullscreen = window_fullscreen + +func set_window_borderless(value: bool): + #if ProjectSettings.has_setting( "display/window/size/borderless" ): + # ProjectSettings.set_setting("display/window/size/borderless", value) + window_borderless = value + if video_default == false: + OS.window_borderless = window_borderless + +func set_window_resizable(value: bool): + #if ProjectSettings.has_setting( "display/window/size/resizable" ): + # ProjectSettings.set_setting("display/window/size/resizable", value) + window_resizable = true + if video_default == false: + OS.window_resizable = window_resizable + +func set_window_width(value: int): + #if ProjectSettings.has_setting( "display/window/size/width" ): + # ProjectSettings.set_setting("display/window/size/width", value) + window_size_x = value + if video_default == false: + OS.window_size.x = window_size_x + #OS.window_fullscreen = ProjectSettings.get_setting("display/window/size/width") + +func set_window_height(value: int): + #if ProjectSettings.has_setting( "display/window/size/height" ): + # ProjectSettings.set_setting("display/window/size/height", value) + window_size_y = value + if video_default == false: + OS.window_size.y = window_size_y + #OS.window_fullscreen = ProjectSettings.get_setting("display/window/size/height") + +func set_font_size(value: int): + font_size = value + if video_default == false: + pass + +func set_video_default(value): + video_default = value + +func set_window_always_on_top(value: bool): + window_always_on_top = value + if video_default == false: + OS.set_window_always_on_top(window_always_on_top) + +func set_current_screen(value: int): + screen_number = int(value) + if video_default == false: + OS.current_screen = screen_number + +func set_screen_orientation(value: int): + if video_default == false: + screen_orientation = int(value) + OS.set_screen_orientation(screen_orientation) + +func set_window_maximized(value: bool): + if value: + window_maximized = true + else: + window_maximized = false + if not video_default: + OS.set_window_maximized(window_maximized) + +func enable_window_default(): + # display/window/handheld/orientation + if ProjectSettings.has_setting( "display/window/handheld/orientation" ): + var num = 0 + var default_orientation = ProjectSettings.get_setting("display/window/handheld/orientation") + match default_orientation: + "landscape": + num = 0 + "portrait": + num = 1 + "reverse_landscape": + num = 2 + "reverse_portrait": + num = 3 + "sensor_landscape": + num = 4 + "sensor_portrait": + num = 5 + "sensor": + num = 6 + _: + num = 6 + OS.set_screen_orientation(num) + OS.set_window_maximized(window_maximized) + OS.current_screen = screen_number + # display/window/size/always_on_top + if ProjectSettings.has_setting( "display/window/size/always_on_top" ): + OS.set_window_always_on_top( ProjectSettings.get_setting( "display/window/size/always_on_top" ) ) + #OS.window_size.x = window_size_x + #OS.window_size.y = window_size_y + if ProjectSettings.has_setting( "display/window/size/fullscreen" ): + OS.window_fullscreen = ProjectSettings.get_setting( "display/window/size/fullscreen" ) + if ProjectSettings.has_setting( "display/window/size/borderless" ): + OS.window_borderless = ProjectSettings.get_setting( "display/window/size/borderless" ) + if ProjectSettings.has_setting( "display/window/size/resizable" ): + OS.window_resizable = ProjectSettings.get_setting( "display/window/size/resizable" ) + +func disable_window_default(): + OS.set_screen_orientation(screen_orientation) + OS.set_window_maximized(window_maximized) + OS.current_screen = screen_number + OS.set_window_always_on_top(window_always_on_top) + #OS.window_size.x = window_size_x + #OS.window_size.y = window_size_y + OS.window_fullscreen = window_fullscreen + OS.window_borderless = window_borderless + OS.window_resizable = window_resizable + +func set_sound_mute(value: bool): + Config.msg_debug("mute:" + str(value)) + mute = value + +func save_config(): + var config_file = ConfigFile.new() + config_file.set_value( "theme", "font_size", 14 ) + config_file.set_value( "display", "default", video_default ) + config_file.set_value( "display", "fullscreen", OS.window_fullscreen ) + config_file.set_value( "display", "borderless", OS.window_borderless ) + config_file.set_value( "display", "resizable", OS.window_resizable ) + #config_file.set_value( "display", "width", int( OS.window_size.x ) ) + #config_file.set_value( "display", "height", int( OS.window_size.y ) ) + config_file.set_value( "display", "window_always_on_top", OS.keep_screen_on ) + config_file.set_value( "display", "screen_orientation", OS.get_screen_orientation() ) + config_file.set_value( "display", "current_screen", screen_number ) + config_file.set_value( "display", "window_maximized", window_maximized ) + config_file.set_value( "sound", "global_level", sound_lvl_global ) + config_file.set_value( "sound", "music_level", sound_lvl_music ) + config_file.set_value( "sound", "effect_level", sound_lvl_effect ) + config_file.set_value( "sound", "mute", mute ) + config_file.save( SettingsFile ) + #print("[res://ressources/scripts/config/config.gd] save_config") + +func load_config(): + var config_file = ConfigFile.new() + var err = config_file.load( SettingsFile ) + if err == ERR_CANT_OPEN or err == ERR_FILE_NOT_FOUND: + # On suppose que le fichier n'existe pas encore, donc on le crée. + #print("[res://ressources/scripts/config/config.gd] Error to read, recreate config") + save_config() + elif not err == OK: + print("[res://ressources/scripts/config/config.gd] Error code when loading user://settings.cfg file: ", err) + font_size = config_file.get_value("theme", "font_size", false) + video_default = config_file.get_value("display", "default", true) + set_window_fullscreen(config_file.get_value("display", "fullscreen", true)) + set_window_borderless(config_file.get_value("display", "borderless", false)) + set_window_resizable(config_file.get_value("display", "resizable", true)) + set_window_always_on_top(config_file.get_value("display", "window_always_on_top", true)) + set_screen_orientation(config_file.get_value("display", "screen_orientation", 0)) + set_current_screen(config_file.get_value("display", "current_screen", 0)) + #set_window_width(config_file.get_value("display", "width", OS.window_size.x)) + #set_window_height(config_file.get_value("display", "height", OS.window_size.y)) + set_window_maximized(config_file.get_value("display", "window_maximized", OS.window_maximized)) + sound_lvl_global = config_file.get_value("sound", "global_level", 100) + sound_lvl_music = config_file.get_value("sound", "music_level", 100) + sound_lvl_effect = config_file.get_value("sound", "effect_level", 100) + mute = config_file.get_value("sound", "mute", false) diff --git a/ressources/scripts/global.gd b/ressources/scripts/global.gd index 09fb705..42c038a 100644 --- a/ressources/scripts/global.gd +++ b/ressources/scripts/global.gd @@ -7,29 +7,29 @@ var player_name = null var ressource_queue = preload("res://ressources/scripts/resource_queue.gd").new() enum RACE { - human + human } var race_label = [ "Humain" ] func get_race_id( p_label ): - return race_label.find( p_label ) - + return race_label.find( p_label ) + enum SEX { - female, - male + female, + male } var sex_label = [ "Femme", "Homme" ] func get_sex_id( p_label ): - return race_label.find( p_label ) + return race_label.find( p_label ) enum CREATURES_EDITOR_MODE { - player, - npc + player, + npc } var creatures_editor_mode = CREATURES_EDITOR_MODE.player func goto_scene( path ): - self.get_tree().get_root().get_node("main").goto_scene( path ) + self.get_tree().get_root().get_node("main").goto_scene( path ) diff --git a/ressources/scripts/resource_queue.gd b/ressources/scripts/resource_queue.gd index 45d266f..896de4f 100644 --- a/ressources/scripts/resource_queue.gd +++ b/ressources/scripts/resource_queue.gd @@ -8,138 +8,138 @@ var queue = [] var pending = {} func _lock(_caller): - mutex.lock() + mutex.lock() func _unlock(_caller): - mutex.unlock() + mutex.unlock() func _post(_caller): - sem.post() + sem.post() func _wait(_caller): - sem.wait() + sem.wait() func queue_resource(path, p_in_front = false): - _lock("queue_resource") - if path in pending: - _unlock("queue_resource") - return - elif ResourceLoader.has_cached(path): - var res = ResourceLoader.load(path) - pending[path] = res - _unlock("queue_resource") - return - else: - var res = ResourceLoader.load_interactive(path) - res.set_meta("path", path) - if p_in_front: - queue.insert(0, res) - else: - queue.push_back(res) - pending[path] = res - _post("queue_resource") - _unlock("queue_resource") - return + _lock("queue_resource") + if path in pending: + _unlock("queue_resource") + return + elif ResourceLoader.has_cached(path): + var res = ResourceLoader.load(path) + pending[path] = res + _unlock("queue_resource") + return + else: + var res = ResourceLoader.load_interactive(path) + res.set_meta("path", path) + if p_in_front: + queue.insert(0, res) + else: + queue.push_back(res) + pending[path] = res + _post("queue_resource") + _unlock("queue_resource") + return func cancel_resource(path): - _lock("cancel_resource") - if path in pending: - if pending[path] is ResourceInteractiveLoader: - queue.erase(pending[path]) - pending.erase(path) - _unlock("cancel_resource") + _lock("cancel_resource") + if path in pending: + if pending[path] is ResourceInteractiveLoader: + queue.erase(pending[path]) + pending.erase(path) + _unlock("cancel_resource") func get_progress(path): - _lock("get_progress") - var ret = -1 - if path in pending: - if pending[path] is ResourceInteractiveLoader: - ret = float(pending[path].get_stage()) / float(pending[path].get_stage_count()) - else: - ret = 1.0 - _unlock("get_progress") - return ret + _lock("get_progress") + var ret = -1 + if path in pending: + if pending[path] is ResourceInteractiveLoader: + ret = float(pending[path].get_stage()) / float(pending[path].get_stage_count()) + else: + ret = 1.0 + _unlock("get_progress") + return ret func is_ready(path): - var ret - _lock("is_ready") - if path in pending: - ret = !(pending[path] is ResourceInteractiveLoader) - else: - ret = false - _unlock("is_ready") - return ret + var ret + _lock("is_ready") + if path in pending: + ret = !(pending[path] is ResourceInteractiveLoader) + else: + ret = false + _unlock("is_ready") + return ret func _wait_for_resource(res, path): - _unlock("wait_for_resource") - while true: - VisualServer.sync() - OS.delay_usec(16000) # Wait approximately 1 frame. - _lock("wait_for_resource") - if queue.size() == 0 || queue[0] != res: - return pending[path] - _unlock("wait_for_resource") + _unlock("wait_for_resource") + while true: + VisualServer.sync() + OS.delay_usec(16000) # Wait approximately 1 frame. + _lock("wait_for_resource") + if queue.size() == 0 || queue[0] != res: + return pending[path] + _unlock("wait_for_resource") func get_resource(path): - _lock("get_resource") - if path in pending: - if pending[path] is ResourceInteractiveLoader: - var res = pending[path] - if res != queue[0]: - var pos = queue.find(res) - queue.remove(pos) - queue.insert(0, res) + _lock("get_resource") + if path in pending: + if pending[path] is ResourceInteractiveLoader: + var res = pending[path] + if res != queue[0]: + var pos = queue.find(res) + queue.remove(pos) + queue.insert(0, res) - res = _wait_for_resource(res, path) - pending.erase(path) - _unlock("return") - return res - else: - var res = pending[path] - pending.erase(path) - _unlock("return") - return res - else: - _unlock("return") - return ResourceLoader.load(path) + res = _wait_for_resource(res, path) + pending.erase(path) + _unlock("return") + return res + else: + var res = pending[path] + pending.erase(path) + _unlock("return") + return res + else: + _unlock("return") + return ResourceLoader.load(path) func thread_process(): - _wait("thread_process") - _lock("process") + _wait("thread_process") + _lock("process") - while queue.size() > 0: - var res = queue[0] - _unlock("process_poll") - var ret = res.poll() - _lock("process_check_queue") + while queue.size() > 0: + var res = queue[0] + _unlock("process_poll") + var ret = res.poll() + _lock("process_check_queue") - if ret == ERR_FILE_EOF || ret != OK: - var path = res.get_meta("path") - if path in pending: # Else, it was already retrieved. - pending[res.get_meta("path")] = res.get_resource() - # Something might have been put at the front of the queue while - # we polled, so use erase instead of remove. - queue.erase(res) - _unlock("process") + if ret == ERR_FILE_EOF || ret != OK: + var path = res.get_meta("path") + if path in pending: # Else, it was already retrieved. + pending[res.get_meta("path")] = res.get_resource() + # Something might have been put at the front of the queue while + # we polled, so use erase instead of remove. + queue.erase(res) + _unlock("process") func thread_func(_u): - while true: - thread_process() + while true: + thread_process() func start(): - mutex = Mutex.new() - sem = Semaphore.new() - thread = Thread.new() - thread.start(self, "thread_func", 0) + mutex = Mutex.new() + sem = Semaphore.new() + thread = Thread.new() + thread.start(self, "thread_func", 0) diff --git a/scenes/creatures/creature_creation_menu.gd b/scenes/creatures/creature_creation_menu.gd index aaf7c4a..04a3423 100644 --- a/scenes/creatures/creature_creation_menu.gd +++ b/scenes/creatures/creature_creation_menu.gd @@ -17,219 +17,219 @@ onready var sex_popup = $margin_box/window_box/content_box/tabs_box/definition/s var max_caracteristiques_points = 5*5 + 5 func _ready(): - # Race. - race_popup.add_item( Globals.race_label[ Globals.RACE.human ] ) - race_popup.connect("id_pressed", self, "_on_race_id_pressed") + # Race. + race_popup.add_item( Globals.race_label[ Globals.RACE.human ] ) + race_popup.connect("id_pressed", self, "_on_race_id_pressed") - # Sex. - sex_popup.add_item( Globals.sex_label[ Globals.SEX.female ] ) - sex_popup.add_item( Globals.sex_label[ Globals.SEX.male ] ) - sex_popup.connect("id_pressed", self, "_on_sex_id_pressed") - + # Sex. + sex_popup.add_item( Globals.sex_label[ Globals.SEX.female ] ) + sex_popup.add_item( Globals.sex_label[ Globals.SEX.male ] ) + sex_popup.connect("id_pressed", self, "_on_sex_id_pressed") + func _on_race_id_pressed( ID ): - $margin_box/window_box/content_box/tabs_box/definition/race/value.text = race_popup.get_item_text( ID ) - emit_signal( "updated", "race", ID ) - + $margin_box/window_box/content_box/tabs_box/definition/race/value.text = race_popup.get_item_text( ID ) + emit_signal( "updated", "race", ID ) + func _on_sex_id_pressed( ID ): - $margin_box/window_box/content_box/tabs_box/definition/sex/value.text = sex_popup.get_item_text( ID ) - emit_signal( "updated", "sex", ID ) - - if ID == Globals.SEX.male: - $margin_box/window_box/content_box/tabs_box/Corps/aspect/female_label.hide() - $margin_box/window_box/content_box/tabs_box/Corps/aspect/breast.hide() - $margin_box/window_box/content_box/tabs_box/Corps/aspect/pregnancy.hide() - else: - $margin_box/window_box/content_box/tabs_box/Corps/aspect/female_label.show() - $margin_box/window_box/content_box/tabs_box/Corps/aspect/breast.show() - $margin_box/window_box/content_box/tabs_box/Corps/aspect/pregnancy.show() - + $margin_box/window_box/content_box/tabs_box/definition/sex/value.text = sex_popup.get_item_text( ID ) + emit_signal( "updated", "sex", ID ) + + if ID == Globals.SEX.male: + $margin_box/window_box/content_box/tabs_box/Corps/aspect/female_label.hide() + $margin_box/window_box/content_box/tabs_box/Corps/aspect/breast.hide() + $margin_box/window_box/content_box/tabs_box/Corps/aspect/pregnancy.hide() + else: + $margin_box/window_box/content_box/tabs_box/Corps/aspect/female_label.show() + $margin_box/window_box/content_box/tabs_box/Corps/aspect/breast.show() + $margin_box/window_box/content_box/tabs_box/Corps/aspect/pregnancy.show() + func update_sliders( p_creature ): - var race = p_creature.get_data( "race", Globals.RACE.human ) - self._on_race_id_pressed( race ) - var sex = p_creature.get_data( "sex", Globals.SEX.female ) - self._on_sex_id_pressed( sex ) + var race = p_creature.get_data( "race", Globals.RACE.human ) + self._on_race_id_pressed( race ) + var sex = p_creature.get_data( "sex", Globals.SEX.female ) + self._on_sex_id_pressed( sex ) - for child in $margin_box/window_box/content_box/tabs_box/Corps/aspect.get_children(): - if not child is Label: - if child.get_node( "value" ) is ColorPickerButton: - child.get_node( "value" ).color = p_creature.get_data( child.name, Color.white ) - else: - child.get_node( "value" ).value = p_creature.get_data( child.name, 0.0 ) - for child in self.get_node( "margin_box/window_box/content_box/tabs_box/Tête/aspect" ).get_children(): - if not child is Label: - if child.get_node( "value" ) is ColorPickerButton: - child.get_node( "value" ).color = p_creature.get_data( child.name, Color.white ) - else: - child.get_node( "value" ).value = p_creature.get_data( child.name, 0.0 ) + for child in $margin_box/window_box/content_box/tabs_box/Corps/aspect.get_children(): + if not child is Label: + if child.get_node( "value" ) is ColorPickerButton: + child.get_node( "value" ).color = p_creature.get_data( child.name, Color.white ) + else: + child.get_node( "value" ).value = p_creature.get_data( child.name, 0.0 ) + for child in self.get_node( "margin_box/window_box/content_box/tabs_box/Tête/aspect" ).get_children(): + if not child is Label: + if child.get_node( "value" ) is ColorPickerButton: + child.get_node( "value" ).color = p_creature.get_data( child.name, Color.white ) + else: + child.get_node( "value" ).value = p_creature.get_data( child.name, 0.0 ) func update_caracteristique( p_name, p_value ): - var total_points = 0 - for caracteristique in $margin_box/window_box/content_box/tabs_box/caracteristiques.get_children(): - if not caracteristique.name == "lasting_points": - total_points += caracteristique.get_node( "value" ).value - - $margin_box/window_box/content_box/tabs_box/caracteristiques/lasting_points/value.text = str(self.max_caracteristiques_points - total_points) + var total_points = 0 + for caracteristique in $margin_box/window_box/content_box/tabs_box/caracteristiques.get_children(): + if not caracteristique.name == "lasting_points": + total_points += caracteristique.get_node( "value" ).value + + $margin_box/window_box/content_box/tabs_box/caracteristiques/lasting_points/value.text = str(self.max_caracteristiques_points - total_points) - if int($margin_box/window_box/content_box/tabs_box/caracteristiques/lasting_points/value.text) < 0: - var other_points = total_points - p_value - var other_lasting_points = self.max_caracteristiques_points - other_points - self.get_node( "margin_box/window_box/content_box/tabs_box/caracteristiques/"+p_name+"/value" ).value = other_lasting_points - $margin_box/window_box/content_box/tabs_box/caracteristiques/lasting_points/value.text = "0" + if int($margin_box/window_box/content_box/tabs_box/caracteristiques/lasting_points/value.text) < 0: + var other_points = total_points - p_value + var other_lasting_points = self.max_caracteristiques_points - other_points + self.get_node( "margin_box/window_box/content_box/tabs_box/caracteristiques/"+p_name+"/value" ).value = other_lasting_points + $margin_box/window_box/content_box/tabs_box/caracteristiques/lasting_points/value.text = "0" func _on_first_name_text_entered(new_text): - emit_signal( "updated", "first_name", new_text ) + emit_signal( "updated", "first_name", new_text ) func _on_last_name_text_entered(new_text): - emit_signal( "updated", "last_name", new_text ) + emit_signal( "updated", "last_name", new_text ) func _on_size_value_changed(value): - emit_signal( "updated", "size", value ) + emit_signal( "updated", "size", value ) func _on_fat_value_changed(value): - emit_signal( "updated", "fat", value ) + emit_signal( "updated", "fat", value ) func _on_muscle_value_changed(value): - emit_signal( "updated", "muscles", value ) + emit_signal( "updated", "muscles", value ) func _on_breast_value_changed(value): - emit_signal( "updated", "breast", value ) + emit_signal( "updated", "breast", value ) func _on_pregnancy_value_changed(value): - emit_signal( "updated", "pregnancy", value ) + emit_signal( "updated", "pregnancy", value ) func _on_skin_tone_value_changed(value): - emit_signal( "updated", "skin_tone", value ) - + emit_signal( "updated", "skin_tone", value ) + func _on_hair_value_changed(value): - emit_signal( "updated", "hair", value ) + emit_signal( "updated", "hair", value ) func _on_hair_color_color_changed( color ): - emit_signal( "updated", "hair_color", color ) - + emit_signal( "updated", "hair_color", color ) + func _on_caucasian_value_changed(value): - emit_signal( "updated", "caucasian", value ) - + emit_signal( "updated", "caucasian", value ) + func _on_african_value_changed(value): - emit_signal( "updated", "african", value ) - + emit_signal( "updated", "african", value ) + func _on_asian_value_changed(value): - emit_signal( "updated", "asian", value ) + emit_signal( "updated", "asian", value ) func _on_first_name_text_changed(new_text): - emit_signal( "updated", "first_name", new_text ) + emit_signal( "updated", "first_name", new_text ) func _on_last_name_text_changed(new_text): - emit_signal( "updated", "last_name", new_text ) + emit_signal( "updated", "last_name", new_text ) func _on_proportion_value_changed(value): - emit_signal( "updated", "proportion", value ) + emit_signal( "updated", "proportion", value ) func _on_strength_value_changed(value): - self.update_caracteristique( "strength", value ) + self.update_caracteristique( "strength", value ) func _on_perception_value_changed(value): - self.update_caracteristique( "perception", value ) + self.update_caracteristique( "perception", value ) func _on_endurance_value_changed(value): - self.update_caracteristique( "endurance", value ) + self.update_caracteristique( "endurance", value ) func _on_constitution_value_changed(value): - self.update_caracteristique( "constitution", value ) + self.update_caracteristique( "constitution", value ) func _on_agility_value_changed(value): - self.update_caracteristique( "agility", value ) + self.update_caracteristique( "agility", value ) func _on_cleft_chin_value_changed(value): - emit_signal( "updated", "cleft_chin", value ) + emit_signal( "updated", "cleft_chin", value ) func _on_chin_angle_value_changed(value): - emit_signal( "updated", "chin_angle", value ) + emit_signal( "updated", "chin_angle", value ) func _on_mouth_horiz_value_changed(value): - emit_signal( "updated", "mouth_horiz", value ) + emit_signal( "updated", "mouth_horiz", value ) func _on_mouth_vert_value_changed(value): - emit_signal( "updated", "mouth_vert", value ) + emit_signal( "updated", "mouth_vert", value ) func _on_nose_galbe_value_changed(value): - emit_signal( "updated", "nose_galbe", value ) + emit_signal( "updated", "nose_galbe", value ) func _on_nose_grec_value_changed(value): - emit_signal( "updated", "nose_grec", value ) + emit_signal( "updated", "nose_grec", value ) func _on_nose_horiz_value_changed(value): - emit_signal( "updated", "nose_horiz", value ) + emit_signal( "updated", "nose_horiz", value ) func _on_nose_depth_value_changed(value): - emit_signal( "updated", "nose_depth", value ) + emit_signal( "updated", "nose_depth", value ) func _on_eyes_color_value_changed(value): - emit_signal( "updated", "eyes_color", value ) - + emit_signal( "updated", "eyes_color", value ) + func _on_eyes_vert_value_changed(value): - emit_signal( "updated", "eyes_vert", value ) + emit_signal( "updated", "eyes_vert", value ) func _on_eyes_gap_value_changed(value): - emit_signal( "updated", "eyes_gap", value ) + emit_signal( "updated", "eyes_gap", value ) func _on_earlobes_value_changed(value): - emit_signal( "updated", "earlobes", value ) + emit_signal( "updated", "earlobes", value ) func _on_ears_wing_value_changed(value): - emit_signal( "updated", "ears_wing", value ) + emit_signal( "updated", "ears_wing", value ) func _on_lips_up_shape_value_changed(value): - emit_signal( "updated", "lips_up_shape", value ) + emit_signal( "updated", "lips_up_shape", value ) func _on_lips_up_shape_2_value_changed(value): - emit_signal( "updated", "lips_up_shape_2", value ) + emit_signal( "updated", "lips_up_shape_2", value ) func _on_skin_value_changed(value): - emit_signal( "updated", "skin", value ) - + emit_signal( "updated", "skin", value ) + func _on_load_pressed(): - emit_signal( "load_pressed" ) - + emit_signal( "load_pressed" ) + func _on_save_pressed(): - emit_signal( "save_pressed" ) + emit_signal( "save_pressed" ) func _on_choose_pressed(): - emit_signal( "choose_pressed" ) + emit_signal( "choose_pressed" ) func _on_quit_pressed(): - emit_signal( "quit_pressed" ) + emit_signal( "quit_pressed" ) func _on_creature_creation_menu_mouse_entered(): - emit_signal( "mouse_exited_ui") + emit_signal( "mouse_exited_ui") func _on_creature_creation_menu_mouse_exited(): - emit_signal( "mouse_entered_ui") + emit_signal( "mouse_entered_ui") func _on_cloths_button_toggled(button_pressed): - emit_signal( "cloths_button_toggled", button_pressed ) - if button_pressed: - $margin_box/window_box/content_box/preview_box/v_box_container/cloths_button.modulate.a = 1.0 - else: - $margin_box/window_box/content_box/preview_box/v_box_container/cloths_button.modulate.a = 0.5 + emit_signal( "cloths_button_toggled", button_pressed ) + if button_pressed: + $margin_box/window_box/content_box/preview_box/v_box_container/cloths_button.modulate.a = 1.0 + else: + $margin_box/window_box/content_box/preview_box/v_box_container/cloths_button.modulate.a = 0.5 func _on_underwear_button_toggled(button_pressed): - emit_signal( "underwear_button_toggled", button_pressed ) - if button_pressed: - $margin_box/window_box/content_box/preview_box/v_box_container/underwear_button.modulate.a = 1.0 - else: - $margin_box/window_box/content_box/preview_box/v_box_container/underwear_button.modulate.a = 0.5 + emit_signal( "underwear_button_toggled", button_pressed ) + if button_pressed: + $margin_box/window_box/content_box/preview_box/v_box_container/underwear_button.modulate.a = 1.0 + else: + $margin_box/window_box/content_box/preview_box/v_box_container/underwear_button.modulate.a = 0.5 func _on_zoom_head_button_toggled(button_pressed): - emit_signal( "zoom_head_button_toggled", button_pressed ) + emit_signal( "zoom_head_button_toggled", button_pressed ) diff --git a/scenes/creatures/creature_creation_menu.tscn b/scenes/creatures/creature_creation_menu.tscn index dfe7418..99ffaf0 100644 --- a/scenes/creatures/creature_creation_menu.tscn +++ b/scenes/creatures/creature_creation_menu.tscn @@ -7,8 +7,6 @@ [ext_resource path="res://assets/interfaces/cloth_on_icon.png" type="Texture" id=5] [ext_resource path="res://assets/interfaces/zoom_head_icon.png" type="Texture" id=6] - - [sub_resource type="DynamicFont" id=1] size = 32 outline_size = 1 @@ -44,11 +42,11 @@ __meta__ = { } [node name="window_box" type="VBoxContainer" parent="margin_box"] -margin_right = 1024.0 -margin_bottom = 600.0 +margin_right = 1280.0 +margin_bottom = 720.0 [node name="title" type="Label" parent="margin_box/window_box"] -margin_right = 1024.0 +margin_right = 1280.0 margin_bottom = 64.0 rect_min_size = Vector2( 0, 64 ) size_flags_vertical = 0 @@ -59,104 +57,101 @@ valign = 1 [node name="content_box" type="HBoxContainer" parent="margin_box/window_box"] margin_top = 68.0 -margin_right = 1024.0 -margin_bottom = 552.0 +margin_right = 1280.0 +margin_bottom = 666.0 size_flags_horizontal = 7 size_flags_vertical = 3 [node name="tabs_box" type="TabContainer" parent="margin_box/window_box/content_box"] -margin_right = 510.0 -margin_bottom = 484.0 +margin_right = 638.0 +margin_bottom = 598.0 size_flags_horizontal = 3 [node name="definition" type="VBoxContainer" parent="margin_box/window_box/content_box/tabs_box"] anchor_right = 1.0 anchor_bottom = 1.0 -margin_left = 4.0 -margin_top = 39.0 -margin_right = -4.0 -margin_bottom = -4.0 +margin_top = 25.0 size_flags_horizontal = 6 size_flags_vertical = 6 [node name="race" type="HBoxContainer" parent="margin_box/window_box/content_box/tabs_box/definition"] -margin_right = 502.0 -margin_bottom = 27.0 +margin_right = 638.0 +margin_bottom = 33.0 size_flags_horizontal = 7 alignment = 1 [node name="label" type="Label" parent="margin_box/window_box/content_box/tabs_box/definition/race"] -margin_top = 3.0 -margin_right = 249.0 -margin_bottom = 24.0 +margin_top = 8.0 +margin_right = 317.0 +margin_bottom = 25.0 size_flags_horizontal = 11 text = "race" align = 2 [node name="value" type="MenuButton" parent="margin_box/window_box/content_box/tabs_box/definition/race"] -margin_left = 253.0 -margin_right = 502.0 -margin_bottom = 27.0 +margin_left = 321.0 +margin_right = 638.0 +margin_bottom = 33.0 rect_min_size = Vector2( 164, 0 ) size_flags_horizontal = 3 flat = false [node name="sex" type="HBoxContainer" parent="margin_box/window_box/content_box/tabs_box/definition"] -margin_top = 31.0 -margin_right = 502.0 -margin_bottom = 58.0 +margin_top = 37.0 +margin_right = 638.0 +margin_bottom = 70.0 size_flags_horizontal = 7 alignment = 1 [node name="label" type="Label" parent="margin_box/window_box/content_box/tabs_box/definition/sex"] -margin_top = 3.0 -margin_right = 249.0 -margin_bottom = 24.0 +margin_top = 8.0 +margin_right = 317.0 +margin_bottom = 25.0 size_flags_horizontal = 11 text = "Sexe" align = 2 [node name="value" type="MenuButton" parent="margin_box/window_box/content_box/tabs_box/definition/sex"] -margin_left = 253.0 -margin_right = 502.0 -margin_bottom = 27.0 +margin_left = 321.0 +margin_right = 638.0 +margin_bottom = 33.0 rect_min_size = Vector2( 164, 0 ) size_flags_horizontal = 3 flat = false [node name="name" type="HBoxContainer" parent="margin_box/window_box/content_box/tabs_box/definition"] -margin_top = 62.0 -margin_right = 502.0 -margin_bottom = 128.0 +margin_top = 74.0 +margin_right = 638.0 +margin_bottom = 144.0 size_flags_horizontal = 7 alignment = 1 [node name="label" type="Label" parent="margin_box/window_box/content_box/tabs_box/definition/name"] -margin_top = 22.0 -margin_right = 249.0 +margin_top = 26.0 +margin_right = 317.0 margin_bottom = 43.0 size_flags_horizontal = 3 text = "Nom" align = 2 [node name="value" type="VBoxContainer" parent="margin_box/window_box/content_box/tabs_box/definition/name"] -margin_left = 253.0 -margin_right = 502.0 -margin_bottom = 66.0 +margin_left = 321.0 +margin_right = 638.0 +margin_bottom = 70.0 rect_min_size = Vector2( 164, 0 ) size_flags_horizontal = 3 [node name="first_name" type="LineEdit" parent="margin_box/window_box/content_box/tabs_box/definition/name/value"] -margin_right = 249.0 -margin_bottom = 31.0 +margin_right = 317.0 +margin_bottom = 33.0 hint_tooltip = "Caractères interdits: : / \\ ? * \" | % < >" size_flags_horizontal = 3 placeholder_text = "First name" [node name="last_name" type="LineEdit" parent="margin_box/window_box/content_box/tabs_box/definition/name/value"] -margin_top = 35.0 -margin_right = 249.0 -margin_bottom = 66.0 +margin_top = 37.0 +margin_right = 317.0 +margin_bottom = 70.0 hint_tooltip = "Caractères interdits: : / \\ ? * \" | % < >" size_flags_horizontal = 3 placeholder_text = "Last name" @@ -165,16 +160,13 @@ placeholder_text = "Last name" visible = false anchor_right = 1.0 anchor_bottom = 1.0 -margin_left = 4.0 -margin_top = 39.0 -margin_right = -4.0 -margin_bottom = -4.0 +margin_top = 25.0 [node name="aspect" type="VBoxContainer" parent="margin_box/window_box/content_box/tabs_box/Corps"] -margin_left = 125.0 -margin_top = 22.0 -margin_right = 376.0 -margin_bottom = 418.0 +margin_left = 194.0 +margin_top = 120.0 +margin_right = 443.0 +margin_bottom = 452.0 size_flags_horizontal = 6 size_flags_vertical = 6 @@ -485,15 +477,13 @@ step = 0.1 visible = false anchor_right = 1.0 anchor_bottom = 1.0 -margin_left = 4.0 -margin_top = 39.0 -margin_right = -4.0 -margin_bottom = -4.0 +margin_top = 25.0 [node name="aspect" type="VBoxContainer" parent="margin_box/window_box/content_box/tabs_box/Tête"] -margin_left = 100.0 -margin_right = 402.0 -margin_bottom = 577.0 +margin_left = 166.0 +margin_top = 47.0 +margin_right = 472.0 +margin_bottom = 526.0 size_flags_horizontal = 6 size_flags_vertical = 6 @@ -959,10 +949,7 @@ step = 0.1 visible = false anchor_right = 1.0 anchor_bottom = 1.0 -margin_left = 4.0 -margin_top = 39.0 -margin_right = -4.0 -margin_bottom = -4.0 +margin_top = 25.0 size_flags_horizontal = 6 size_flags_vertical = 6 @@ -1100,18 +1087,18 @@ value = 5.0 align = 1 [node name="preview_box" type="VBoxContainer" parent="margin_box/window_box/content_box"] -margin_left = 514.0 -margin_right = 1024.0 -margin_bottom = 484.0 +margin_left = 642.0 +margin_right = 1280.0 +margin_bottom = 598.0 size_flags_horizontal = 11 size_flags_vertical = 3 alignment = 1 [node name="v_box_container" type="VBoxContainer" parent="margin_box/window_box/content_box/preview_box"] -margin_left = 446.0 -margin_top = 210.0 -margin_right = 510.0 -margin_bottom = 274.0 +margin_left = 574.0 +margin_top = 267.0 +margin_right = 638.0 +margin_bottom = 331.0 size_flags_horizontal = 10 size_flags_vertical = 5 @@ -1152,18 +1139,18 @@ icon = ExtResource( 1 ) expand_icon = true [node name="tools_box" type="HBoxContainer" parent="margin_box/window_box"] -margin_top = 556.0 -margin_right = 1024.0 -margin_bottom = 583.0 +margin_top = 670.0 +margin_right = 1280.0 +margin_bottom = 703.0 [node name="buttons_box" type="HBoxContainer" parent="margin_box/window_box/tools_box"] -margin_right = 510.0 -margin_bottom = 27.0 +margin_right = 638.0 +margin_bottom = 33.0 size_flags_horizontal = 3 [node name="load" type="Button" parent="margin_box/window_box/tools_box/buttons_box"] -margin_right = 66.0 -margin_bottom = 27.0 +margin_right = 74.0 +margin_bottom = 33.0 size_flags_horizontal = 4 custom_styles/focus = SubResource( 4 ) custom_colors/font_color_disabled = Color( 0, 0, 0, 0.501961 ) @@ -1173,9 +1160,9 @@ custom_colors/font_color_pressed = Color( 1, 1, 1, 1 ) text = "Charger" [node name="save" type="Button" parent="margin_box/window_box/tools_box/buttons_box"] -margin_left = 70.0 -margin_right = 159.0 -margin_bottom = 27.0 +margin_left = 78.0 +margin_right = 173.0 +margin_bottom = 33.0 size_flags_horizontal = 4 custom_styles/focus = SubResource( 4 ) custom_colors/font_color_disabled = Color( 0, 0, 0, 0.501961 ) @@ -1185,9 +1172,9 @@ custom_colors/font_color_pressed = Color( 1, 1, 1, 1 ) text = "Enregistrer" [node name="choose" type="Button" parent="margin_box/window_box/tools_box/buttons_box"] -margin_left = 163.0 -margin_right = 223.0 -margin_bottom = 27.0 +margin_left = 177.0 +margin_right = 242.0 +margin_bottom = 33.0 size_flags_horizontal = 4 custom_styles/focus = SubResource( 4 ) custom_colors/font_color_disabled = Color( 0, 0, 0, 0.501961 ) @@ -1197,9 +1184,9 @@ custom_colors/font_color_pressed = Color( 1, 1, 1, 1 ) text = "Choisir" [node name="quit" type="Button" parent="margin_box/window_box/tools_box/buttons_box"] -margin_left = 448.0 -margin_right = 510.0 -margin_bottom = 27.0 +margin_left = 573.0 +margin_right = 638.0 +margin_bottom = 33.0 size_flags_horizontal = 10 custom_styles/focus = SubResource( 4 ) custom_colors/font_color_disabled = Color( 0, 0, 0, 0.501961 ) @@ -1209,22 +1196,23 @@ custom_colors/font_color_pressed = Color( 1, 1, 1, 1 ) text = "Quitter" [node name="spacer" type="Label" parent="margin_box/window_box/tools_box"] -margin_left = 514.0 -margin_top = 3.0 -margin_right = 1024.0 -margin_bottom = 24.0 +margin_left = 642.0 +margin_top = 8.0 +margin_right = 1280.0 +margin_bottom = 25.0 size_flags_horizontal = 3 [node name="tooltips" type="Label" parent="margin_box/window_box"] -margin_top = 587.0 -margin_right = 1024.0 -margin_bottom = 600.0 +margin_top = 707.0 +margin_right = 1280.0 +margin_bottom = 720.0 size_flags_vertical = 8 custom_fonts/font = SubResource( 5 ) custom_colors/font_color = Color( 1, 1, 1, 0.501961 ) text = "Menu de création de créatures." align = 1 valign = 1 + [connection signal="mouse_entered" from="." to="." method="_on_creature_creation_menu_mouse_entered"] [connection signal="mouse_exited" from="." to="." method="_on_creature_creation_menu_mouse_exited"] [connection signal="text_changed" from="margin_box/window_box/content_box/tabs_box/definition/name/value/first_name" to="." method="_on_first_name_text_changed"] diff --git a/scenes/creatures/creatures_creation.gd b/scenes/creatures/creatures_creation.gd index 34dc147..fb477cb 100644 --- a/scenes/creatures/creatures_creation.gd +++ b/scenes/creatures/creatures_creation.gd @@ -5,161 +5,161 @@ var is_over_ui = false func _ready(): - - $creature_creation_menu._on_race_id_pressed( 0 ) - $creature_creation_menu._on_sex_id_pressed( 0 ) + + $creature_creation_menu._on_race_id_pressed( 0 ) + $creature_creation_menu._on_sex_id_pressed( 0 ) - if Globals.creatures_editor_mode == Globals.CREATURES_EDITOR_MODE.player: - $creature_creation_menu/margin_box/window_box/content_box/tabs_box/definition/race.hide() - elif Globals.creatures_editor_mode == Globals.CREATURES_EDITOR_MODE.npc: - $creature_creation_menu.max_caracteristiques_points = 999 - $creature_creation_menu/margin_box/window_box/tools_box/buttons_box/choose.hide() + if Globals.creatures_editor_mode == Globals.CREATURES_EDITOR_MODE.player: + $creature_creation_menu/margin_box/window_box/content_box/tabs_box/definition/race.hide() + elif Globals.creatures_editor_mode == Globals.CREATURES_EDITOR_MODE.npc: + $creature_creation_menu.max_caracteristiques_points = 999 + $creature_creation_menu/margin_box/window_box/tools_box/buttons_box/choose.hide() func _input( event ): - if event is InputEventMouseMotion and Input.is_mouse_button_pressed( 1 ): - if self.character and not self.is_over_ui: - self.character.rotate_y( event.relative.x *0.01 ) - - if event is InputEventMouseMotion and Input.is_mouse_button_pressed( 3 ): - if not self.is_over_ui: - if $camera.current: - $camera.translation.x -= event.relative.x *0.001 - $camera.translation.y += event.relative.y *0.001 - elif $camera_head.current: - $camera_head.translation.x -= event.relative.x *0.001 - $camera_head.translation.y += event.relative.y *0.001 - - if event.is_action_pressed( "camera_zoom_in" ) and not self.is_over_ui: - if $camera.current: - $camera.size -= 0.1 - elif $camera_head.current: - $camera_head.size -= 0.1 - - elif event.is_action_pressed( "camera_zoom_out" ) and not self.is_over_ui: - if $camera.current: - $camera.size += 0.1 - elif $camera_head.current: - $camera_head.size += 0.1 + if event is InputEventMouseMotion and Input.is_mouse_button_pressed( 1 ): + if self.character and not self.is_over_ui: + self.character.rotate_y( event.relative.x *0.01 ) + + if event is InputEventMouseMotion and Input.is_mouse_button_pressed( 3 ): + if not self.is_over_ui: + if $camera.current: + $camera.translation.x -= event.relative.x *0.001 + $camera.translation.y += event.relative.y *0.001 + elif $camera_head.current: + $camera_head.translation.x -= event.relative.x *0.001 + $camera_head.translation.y += event.relative.y *0.001 + + if event.is_action_pressed( "camera_zoom_in" ) and not self.is_over_ui: + if $camera.current: + $camera.size -= 0.1 + elif $camera_head.current: + $camera_head.size -= 0.1 + + elif event.is_action_pressed( "camera_zoom_out" ) and not self.is_over_ui: + if $camera.current: + $camera.size += 0.1 + elif $camera_head.current: + $camera_head.size += 0.1 func _on_creature_creation_menu_updated(value_name, value): - var need_model_change = false - if value_name == "race": - need_model_change = true - elif value_name == "sex": - need_model_change = true - - var need_creature_update =false - if self.character: - self.character.get_node( "creature" ).creature.set_data( value_name, value ) - need_creature_update = true - - if need_model_change: - var old_creature_datas = null - if self.character: - old_creature_datas = self.character.get_node( "creature" ).creature - var race = old_creature_datas.get_data( "race" ) - var sex = old_creature_datas.get_data( "sex" ) - if race == Globals.RACE.human and sex == Globals.SEX.female: - self.character.show() - self.character.change_creature( "res://scenes/creatures/human/human_female.tscn" ) - need_creature_update = true - elif race == Globals.RACE.human and sex == Globals.SEX.male: - self.character.show() - self.character.change_creature( "res://scenes/creatures/human/human_male.tscn" ) - need_creature_update = true - - if self.character and old_creature_datas: - self.character.get_node( "creature" ).creature = old_creature_datas - - if need_creature_update: - if self.character: - self.character.get_node( "creature" ).update() - + var need_model_change = false + if value_name == "race": + need_model_change = true + elif value_name == "sex": + need_model_change = true + + var need_creature_update =false + if self.character: + self.character.get_node( "creature" ).creature.set_data( value_name, value ) + need_creature_update = true + + if need_model_change: + var old_creature_datas = null + if self.character: + old_creature_datas = self.character.get_node( "creature" ).creature + var race = old_creature_datas.get_data( "race" ) + var sex = old_creature_datas.get_data( "sex" ) + if race == Globals.RACE.human and sex == Globals.SEX.female: + self.character.show() + self.character.change_creature( "res://scenes/creatures/human/human_female.tscn" ) + need_creature_update = true + elif race == Globals.RACE.human and sex == Globals.SEX.male: + self.character.show() + self.character.change_creature( "res://scenes/creatures/human/human_male.tscn" ) + need_creature_update = true + + if self.character and old_creature_datas: + self.character.get_node( "creature" ).creature = old_creature_datas + + if need_creature_update: + if self.character: + self.character.get_node( "creature" ).update() + func save_creature(): - if self.character: - var emplacement = "pc" - if Globals.creatures_editor_mode == Globals.CREATURES_EDITOR_MODE.npc: - emplacement = "res" - self.character.get_node( "creature" ).creature.save( emplacement ) - $creature_creation_menu/margin_box/window_box/tooltips.text = "Créature enregistrée." - $creature_creation_menu/margin_box/window_box/tooltips.set( "custom_colors/font_color", Color.green ) + if self.character: + var emplacement = "pc" + if Globals.creatures_editor_mode == Globals.CREATURES_EDITOR_MODE.npc: + emplacement = "res" + self.character.get_node( "creature" ).creature.save( emplacement ) + $creature_creation_menu/margin_box/window_box/tooltips.text = "Créature enregistrée." + $creature_creation_menu/margin_box/window_box/tooltips.set( "custom_colors/font_color", Color.green ) func load_creature( p_name = null ): - var creature = null - - var race = Globals.get_race_id( $creature_creation_menu/margin_box/window_box/content_box/tabs_box/definition/race/value.text ) - if race == Globals.RACE.human: - creature = Datas.Human.new() - else: - creature = Datas.Creature.new() - var filename = $creature_creation_menu/margin_box/window_box/content_box/tabs_box/definition/name/value/first_name.text + "_" + $creature_creation_menu/margin_box/window_box/content_box/tabs_box/definition/name/value/last_name.text+".creature" - if p_name: - filename = p_name + ".creature" - - if Globals.creatures_editor_mode == Globals.CREATURES_EDITOR_MODE.npc: - creature.load( "res://ressources/files/creatures/"+filename ) - else: - creature.load( "user://saves/save_temp/ressources/files/creatures/pc/"+filename ) - - if creature.get_filename() == "unknow.creature": - $creature_creation_menu/margin_box/window_box/tooltips.text = "Echec du chargement de la créature." - $creature_creation_menu/margin_box/window_box/tooltips.set( "custom_colors/font_color", Color.red ) - else: - $creature_creation_menu/margin_box/window_box/tooltips.text = "Créature chargée avec succès." - $creature_creation_menu/margin_box/window_box/tooltips.set( "custom_colors/font_color", Color.green ) + var creature = null + + var race = Globals.get_race_id( $creature_creation_menu/margin_box/window_box/content_box/tabs_box/definition/race/value.text ) + if race == Globals.RACE.human: + creature = Datas.Human.new() + else: + creature = Datas.Creature.new() + var filename = $creature_creation_menu/margin_box/window_box/content_box/tabs_box/definition/name/value/first_name.text + "_" + $creature_creation_menu/margin_box/window_box/content_box/tabs_box/definition/name/value/last_name.text+".creature" + if p_name: + filename = p_name + ".creature" + + if Globals.creatures_editor_mode == Globals.CREATURES_EDITOR_MODE.npc: + creature.load( "res://ressources/files/creatures/"+filename ) + else: + creature.load( "user://saves/save_temp/ressources/files/creatures/pc/"+filename ) + + if creature.get_filename() == "unknow.creature": + $creature_creation_menu/margin_box/window_box/tooltips.text = "Echec du chargement de la créature." + $creature_creation_menu/margin_box/window_box/tooltips.set( "custom_colors/font_color", Color.red ) + else: + $creature_creation_menu/margin_box/window_box/tooltips.text = "Créature chargée avec succès." + $creature_creation_menu/margin_box/window_box/tooltips.set( "custom_colors/font_color", Color.green ) - $creature_creation_menu.update_sliders( creature ) + $creature_creation_menu.update_sliders( creature ) func _on_creature_creation_menu_mouse_entered_ui(): - self.is_over_ui = true + self.is_over_ui = true func _on_creature_creation_menu_mouse_exited_ui(): - self.is_over_ui = false + self.is_over_ui = false func _on_creature_creation_menu_load_pressed(): - self.load_creature() + self.load_creature() func _on_creature_creation_menu_save_pressed(): - self.save_creature() + self.save_creature() func _on_creature_creation_menu_choose_pressed(): - self.save_creature() - Globals.player_name = $creature_creation_menu/margin_box/window_box/content_box/tabs_box/definition/name/value/first_name.text + "_" + $creature_creation_menu/margin_box/window_box/content_box/tabs_box/definition/name/value/last_name.text - Globals.goto_scene( "res://scenes/game/game.tscn" ) + self.save_creature() + Globals.player_name = $creature_creation_menu/margin_box/window_box/content_box/tabs_box/definition/name/value/first_name.text + "_" + $creature_creation_menu/margin_box/window_box/content_box/tabs_box/definition/name/value/last_name.text + Globals.goto_scene( "res://scenes/game/game.tscn" ) func _on_creature_creation_menu_quit_pressed(): - Globals.goto_scene( "res://scenes/main/main.tscn" ) + Globals.goto_scene( "res://scenes/main/main.tscn" ) func _on_creature_creation_menu_cloths_button_toggled(button_pressed): - if $character/creature.creature.get_data( "sex" ) == Globals.SEX.female: - if button_pressed: - $character/creature/cloths/mh_human_female_tshirt.show() - $character/creature/cloths/mh_human_female_pant.show() - $character/creature/cloths/mh_human_female_shoes.show() - else: - $character/creature/cloths/mh_human_female_tshirt.hide() - $character/creature/cloths/mh_human_female_pant.hide() - $character/creature/cloths/mh_human_female_shoes.hide() - elif $character/creature.creature.get_data( "sex" ) == Globals.SEX.male: - if button_pressed: - $character/creature/cloths/mh_human_male_tshirt.show() - $character/creature/cloths/mh_human_male_pant.show() - $character/creature/cloths/mh_human_male_shoes.show() - else: - $character/creature/cloths/mh_human_male_tshirt.hide() - $character/creature/cloths/mh_human_male_pant.hide() - $character/creature/cloths/mh_human_male_shoes.hide() + if $character/creature.creature.get_data( "sex" ) == Globals.SEX.female: + if button_pressed: + $character/creature/cloths/mh_human_female_tshirt.show() + $character/creature/cloths/mh_human_female_pant.show() + $character/creature/cloths/mh_human_female_shoes.show() + else: + $character/creature/cloths/mh_human_female_tshirt.hide() + $character/creature/cloths/mh_human_female_pant.hide() + $character/creature/cloths/mh_human_female_shoes.hide() + elif $character/creature.creature.get_data( "sex" ) == Globals.SEX.male: + if button_pressed: + $character/creature/cloths/mh_human_male_tshirt.show() + $character/creature/cloths/mh_human_male_pant.show() + $character/creature/cloths/mh_human_male_shoes.show() + else: + $character/creature/cloths/mh_human_male_tshirt.hide() + $character/creature/cloths/mh_human_male_pant.hide() + $character/creature/cloths/mh_human_male_shoes.hide() func _on_creature_creation_menu_underwear_button_toggled(button_pressed): - pass + pass # if button_pressed: # $character/creature/cloths/mh_human_female_underwear_top.show() # $character/creature/cloths/mh_human_female_underwear_bottom.show() @@ -169,7 +169,7 @@ func _on_creature_creation_menu_underwear_button_toggled(button_pressed): func _on_creature_creation_menu_zoom_head_button_toggled(button_pressed): - if button_pressed: - $camera_head.make_current() - else: - $camera.make_current() + if button_pressed: + $camera_head.make_current() + else: + $camera.make_current() diff --git a/scenes/creatures/creatures_creation.tscn b/scenes/creatures/creatures_creation.tscn index 04b9609..bd70fd3 100644 --- a/scenes/creatures/creatures_creation.tscn +++ b/scenes/creatures/creatures_creation.tscn @@ -26,6 +26,7 @@ gravity = 0.0 [node name="directional_light" type="DirectionalLight" parent="."] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.98872, 2.59328 ) light_specular = 0.1 + [connection signal="choose_pressed" from="creature_creation_menu" to="." method="_on_creature_creation_menu_choose_pressed"] [connection signal="cloths_button_toggled" from="creature_creation_menu" to="." method="_on_creature_creation_menu_cloths_button_toggled"] [connection signal="load_pressed" from="creature_creation_menu" to="." method="_on_creature_creation_menu_load_pressed"] diff --git a/scenes/game/game.gd b/scenes/game/game.gd index c6c2a21..3d2ce33 100644 --- a/scenes/game/game.gd +++ b/scenes/game/game.gd @@ -15,28 +15,28 @@ var heightmap = null var is_on_ui = false func _ready(): - - var player_ra = Ra.new() - var file = File.new() - if file.open("res://ressources/files/creatures/test.creature", File.READ) == OK: - player_ra.from_dict( JSON.parse( file.get_as_text() ).result ) + + var player_ra = Ra.new() + var file = File.new() + if file.open("res://ressources/files/creatures/test.creature", File.READ) == OK: + player_ra.from_dict( JSON.parse( file.get_as_text() ).result ) - $game_ui/inventory_window.get_content_child( "content_box/inventory_box" ).set_inventory( player_ra.inventory ) + $game_ui/inventory_window.get_content_child( "content_box/inventory_box" ).set_inventory( player_ra.inventory ) func _input( event ): - + # if event.is_action_released( "menu_pause" ): # Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) # $screen_box/windows/inventory_window.hide() # $screen_box/pause_menu.show() # self.get_tree().paused = true - - if event.is_action_pressed( "ui_show_head_infos" ): - $creatures/player/character/head_infos_frame.visible = not $player/character/head_infos_frame.visible - for npc in $creatures/npcs.get_children(): - npc.get_node( "head_infos_frame" ).visible = not npc.get_node( "head_infos_frame" ).visible + + if event.is_action_pressed( "ui_show_head_infos" ): + $creatures/player/character/head_infos_frame.visible = not $player/character/head_infos_frame.visible + for npc in $creatures/npcs.get_children(): + npc.get_node( "head_infos_frame" ).visible = not npc.get_node( "head_infos_frame" ).visible # @@ -88,9 +88,9 @@ func _input( event ): # else: # $game_ui/inventory_window.hide() # - + func _process( delta ): - + # $creatures/player.rotate_camera_arm( Vector3( 0.0, 1.0, 0.0 ), deg2rad( self.mouse_delta.x ) ) # # $creatures/player.move_camera( Vector3( 0.0, 0.0, camera_zoom ) ) @@ -99,44 +99,44 @@ func _process( delta ): # self.camera_zoom = 0.0 # self.mouse_delta = Vector2( 0.0, 0.0 ) - # Water fx. - if $creatures/player/character.global_transform.origin.y <= ($level/demo/water.translation.y-2.5): - $water_fx.get_surface_material( 0 ).set_shader_param( "mist_level", 1.0 ) - else: - $water_fx.get_surface_material( 0 ).set_shader_param( "mist_level", 0.0 ) + # Water fx. + if $creatures/player/character.global_transform.origin.y <= ($level/demo/water.translation.y-2.5): + $water_fx.get_surface_material( 0 ).set_shader_param( "mist_level", 1.0 ) + else: + $water_fx.get_surface_material( 0 ).set_shader_param( "mist_level", 0.0 ) - var trauma_value = ($game_ui/stats_window.get_content_child( "trauma" ).value / 6.0) - $trauma_fx.get_surface_material( 0 ).set_shader_param( "mist_level", trauma_value ) + var trauma_value = ($game_ui/stats_window.get_content_child( "trauma" ).value / 6.0) + $trauma_fx.get_surface_material( 0 ).set_shader_param( "mist_level", trauma_value ) - $sky/viewport/sky.day_time_hours += delta*((6.0/24.0)/3600.0) - if $sky/viewport/sky.day_time_hours >= 24.0: - $sky/viewport/sky.day_time_hours = $sky/viewport/sky.day_time_hours-24.0 + $sky/viewport/sky.day_time_hours += delta*((6.0/24.0)/3600.0) + if $sky/viewport/sky.day_time_hours >= 24.0: + $sky/viewport/sky.day_time_hours = $sky/viewport/sky.day_time_hours-24.0 func load_player( filename ): - $creatures/player.load_creature( filename ) + $creatures/player.load_creature( filename ) func _on_debug_window_time_of_day_changed(value): - $sky/viewport/sky.set_day_time_hours(( value )) + $sky/viewport/sky.set_day_time_hours(( value )) func _on_debug_window_mist_level_changed(value): - $mist_fx.get_surface_material( 0 ).set_shader_param( "mist_level", value ) + $mist_fx.get_surface_material( 0 ).set_shader_param( "mist_level", value ) func _on_debug_window_douleur_minus_pressed(): - $game_ui.change_douleur( -1 ) + $game_ui.change_douleur( -1 ) func _on_debug_window_douleur_plus_pressed(): - $game_ui.change_douleur( 1 ) + $game_ui.change_douleur( 1 ) func _on_debug_window_oubli_minus_pressed(): - $game_ui.change_oubli( -1 ) + $game_ui.change_oubli( -1 ) func _on_debug_window_oubli_plus_pressed(): - $game_ui.change_oubli( 1 ) + $game_ui.change_oubli( 1 ) diff --git a/scenes/interfaces/creatures_editor/creatures_editor_ui.gd b/scenes/interfaces/creatures_editor/creatures_editor_ui.gd index 3dc19e3..01d40b4 100644 --- a/scenes/interfaces/creatures_editor/creatures_editor_ui.gd +++ b/scenes/interfaces/creatures_editor/creatures_editor_ui.gd @@ -22,95 +22,95 @@ var ra = Creatures.Ra_old.new() var slot = null func _ready(): - $viewport/spring_arm/camera.make_current() - + $viewport/spring_arm/camera.make_current() + func _input( event ): - - if event is InputEventMouseButton: - - if event.is_action_pressed( "creatures_editor_rotate_view_y" ): - self.mouse_old_position = event.position - elif event.is_action_released( "creatures_editor_rotate_view_y" ): - self.mouse_old_position = null - self.mouse_delta = null - - if event.is_action( "creatures_editor_zoom_in" ): - self.camera_zoom += self.camera_zoom_speed - elif event.is_action( "creatures_editor_zoom_out" ): - self.camera_zoom -= self.camera_zoom_speed - - if event is InputEventMouseMotion: - if not mouse_old_position == null: - self.mouse_delta = mouse_old_position - event.position - self.mouse_old_position = event.position - - + + if event is InputEventMouseButton: + + if event.is_action_pressed( "creatures_editor_rotate_view_y" ): + self.mouse_old_position = event.position + elif event.is_action_released( "creatures_editor_rotate_view_y" ): + self.mouse_old_position = null + self.mouse_delta = null + + if event.is_action( "creatures_editor_zoom_in" ): + self.camera_zoom += self.camera_zoom_speed + elif event.is_action( "creatures_editor_zoom_out" ): + self.camera_zoom -= self.camera_zoom_speed + + if event is InputEventMouseMotion: + if not mouse_old_position == null: + self.mouse_delta = mouse_old_position - event.position + self.mouse_old_position = event.position + + func _process( delta ): - if self.mouse_delta: - $viewport/model/ra.rotate( Vector3( 0.0, 1.0, 0.0 ), deg2rad( -self.mouse_delta.x ) ) - self.mouse_delta = Vector2( 0.0, 0.0 ) - - if self.camera_zoom: - $viewport/spring_arm/camera.size += self.camera_zoom - self.camera_zoom = 0.0 + if self.mouse_delta: + $viewport/model/ra.rotate( Vector3( 0.0, 1.0, 0.0 ), deg2rad( -self.mouse_delta.x ) ) + self.mouse_delta = Vector2( 0.0, 0.0 ) + + if self.camera_zoom: + $viewport/spring_arm/camera.size += self.camera_zoom + self.camera_zoom = 0.0 func set_creature( p_creature ): - if p_creature is Creatures.Ra: - self.ra = p_creature - $screen_box/tools_box/boobs/value.value = p_creature.female_boobs - $screen_box/tools_box/hip/value.value = p_creature.female_hip - $screen_box/tools_box/male_scrotch/value.value = p_creature.male_pack - $screen_box/tools_box/male_throat/value.value = p_creature.male_throat - $screen_box/tools_box/pregnant/value.value = p_creature.female_pregnant - $screen_box/tools_box/color/value.value = p_creature.color + if p_creature is Creatures.Ra: + self.ra = p_creature + $screen_box/tools_box/boobs/value.value = p_creature.female_boobs + $screen_box/tools_box/hip/value.value = p_creature.female_hip + $screen_box/tools_box/male_scrotch/value.value = p_creature.male_pack + $screen_box/tools_box/male_throat/value.value = p_creature.male_throat + $screen_box/tools_box/pregnant/value.value = p_creature.female_pregnant + $screen_box/tools_box/color/value.value = p_creature.color func _on_name_text_changed( new_text ): - self.ra.pseudonym = new_text - + self.ra.pseudonym = new_text + func _on_boobs_value_changed( value ): - $viewport/model/ra/model/body.set( "blend_shapes/Boobs", value ) - self.ra.female_boobs = value + $viewport/model/ra/model/body.set( "blend_shapes/Boobs", value ) + self.ra.female_boobs = value func _on_hip_value_changed(value): - $viewport/model/ra/model/body.set( "blend_shapes/Female_hip", value ) - self.ra.female_hip = value + $viewport/model/ra/model/body.set( "blend_shapes/Female_hip", value ) + self.ra.female_hip = value func _on_male_scrotch_value_changed(value): - $viewport/model/ra/model/body.set( "blend_shapes/Male_Pack", value ) - self.ra.male_pack = value + $viewport/model/ra/model/body.set( "blend_shapes/Male_Pack", value ) + self.ra.male_pack = value func _on_male_throat_value_changed(value): - $viewport/model/ra/model/body.set( "blend_shapes/Male_Throat", value ) - self.ra.male_throat = value + $viewport/model/ra/model/body.set( "blend_shapes/Male_Throat", value ) + self.ra.male_throat = value func _on_pregnant_value_changed(value): - $viewport/model/ra/model/body.set( "blend_shapes/Pregnant", value ) - self.ra.female_pregnant = value + $viewport/model/ra/model/body.set( "blend_shapes/Pregnant", value ) + self.ra.female_pregnant = value func _on_valid_pressed(): - if not self.slot == null: - var directory = Directory.new() - if not directory.dir_exists( "user://creatures/" ): - directory.make_dir_recursive( "user://creatures/" ) + if not self.slot == null: + var directory = Directory.new() + if not directory.dir_exists( "user://creatures/" ): + directory.make_dir_recursive( "user://creatures/" ) - var creature_file = File.new() - creature_file.open("user://creatures/slot_"+str(self.slot)+".creature", File.WRITE) - creature_file.store_line(to_json(self.ra.to_dictionary())) - creature_file.close() + var creature_file = File.new() + creature_file.open("user://creatures/slot_"+str(self.slot)+".creature", File.WRITE) + creature_file.store_line(to_json(self.ra.to_dictionary())) + creature_file.close() - emit_signal( "valid_pressed" ) + emit_signal( "valid_pressed" ) func _on_cancel_pressed(): - emit_signal( "cancel_pressed" ) + emit_signal( "cancel_pressed" ) func _on_color_changed(color): - $viewport/model/ra/model/body.get_surface_material( 0 ).set_shader_param( "albedo", color ) - self.ra.color = color + $viewport/model/ra/model/body.get_surface_material( 0 ).set_shader_param( "albedo", color ) + self.ra.color = color diff --git a/scenes/interfaces/creatures_editor/creatures_editor_ui.tscn b/scenes/interfaces/creatures_editor/creatures_editor_ui.tscn index 5f80875..564f596 100644 --- a/scenes/interfaces/creatures_editor/creatures_editor_ui.tscn +++ b/scenes/interfaces/creatures_editor/creatures_editor_ui.tscn @@ -8,7 +8,6 @@ [ext_resource path="res://assets/interfaces/slider_minus.png" type="Texture" id=6] [ext_resource path="res://scenes/creatures/ra/ra.tscn" type="PackedScene" id=7] - [sub_resource type="ViewportTexture" id=1] viewport_path = NodePath("viewport") @@ -243,6 +242,7 @@ size = 2.0 [node name="model" type="Spatial" parent="viewport"] [node name="ra" parent="viewport/model" instance=ExtResource( 7 )] + [connection signal="text_changed" from="screen_box/tools_box/name/value" to="." method="_on_name_text_changed"] [connection signal="color_changed" from="screen_box/tools_box/color/value" to="." method="_on_color_changed"] [connection signal="value_changed" from="screen_box/tools_box/boobs/value" to="." method="_on_boobs_value_changed"] diff --git a/scenes/interfaces/creatures_menu/creature_box.gd b/scenes/interfaces/creatures_menu/creature_box.gd index e3b2915..65c6636 100644 --- a/scenes/interfaces/creatures_menu/creature_box.gd +++ b/scenes/interfaces/creatures_menu/creature_box.gd @@ -7,8 +7,8 @@ var slot = null var creature_filename = null func _on_select_pressed(): - emit_signal( "select_pressed", self.slot ) + emit_signal( "select_pressed", self.slot ) func _on_delete_pressed(): - emit_signal( "delete_pressed", self.slot ) + emit_signal( "delete_pressed", self.slot ) diff --git a/scenes/interfaces/creatures_menu/creature_box.tscn b/scenes/interfaces/creatures_menu/creature_box.tscn index ae2be16..d1cf571 100644 --- a/scenes/interfaces/creatures_menu/creature_box.tscn +++ b/scenes/interfaces/creatures_menu/creature_box.tscn @@ -12,30 +12,31 @@ __meta__ = { } [node name="label" type="Label" parent="."] -margin_left = 547.0 +margin_left = 549.0 margin_top = 353.0 -margin_right = 608.0 +margin_right = 610.0 margin_bottom = 367.0 size_flags_horizontal = 10 custom_colors/font_color = Color( 0.0627451, 0.0313726, 0.45098, 1 ) text = "Anonyme" [node name="select" type="Button" parent="."] -margin_left = 612.0 +margin_left = 614.0 margin_top = 350.0 -margin_right = 668.0 +margin_right = 665.0 margin_bottom = 370.0 size_flags_horizontal = 0 size_flags_vertical = 6 -text = "Choisir" +text = "Select" [node name="delete" type="Button" parent="."] -margin_left = 672.0 +margin_left = 669.0 margin_top = 350.0 -margin_right = 726.0 +margin_right = 733.0 margin_bottom = 370.0 size_flags_horizontal = 2 size_flags_vertical = 6 -text = "Effacer" +text = "Remove" + [connection signal="pressed" from="select" to="." method="_on_select_pressed"] [connection signal="pressed" from="delete" to="." method="_on_delete_pressed"] diff --git a/scenes/interfaces/creatures_menu/creatures_menu_ui.gd b/scenes/interfaces/creatures_menu/creatures_menu_ui.gd index 8bd4808..59ddaab 100644 --- a/scenes/interfaces/creatures_menu/creatures_menu_ui.gd +++ b/scenes/interfaces/creatures_menu/creatures_menu_ui.gd @@ -8,47 +8,47 @@ var slots_number = 0 var slots = {} func _ready(): - - var files = [] - var directory = Directory.new() - if directory.dir_exists( "user://creatures/" ): - directory.open( "user://creatures/" ) - directory.list_dir_begin() - while true: - var file = directory.get_next() - if file == "": - break - elif not file.begins_with( "." ) and not directory.current_is_dir(): - files.append( file ) - directory.list_dir_end() - - for file in files: - var creature_box = preload( "res://scenes/interfaces/creatures_menu/creature_box.tscn" ).instance() - creature_box.get_node( "label" ).text = file - creature_box.slot = self.slots_number - creature_box.creature_filename = file - creature_box.connect( "select_pressed", self, "_on_creature_box_select_pressed" ) - creature_box.connect( "delete_pressed", self, "_on_creature_box_delete_pressed" ) - $screen_box/scroll_container/v_box_container/creatures_box.add_child( creature_box ) - self.slots[ self.slots_number ] = creature_box - self.slots_number += 1 - - var creature = Creatures.Ra_old2.new() - creature.from_file( file ) - creature_box.get_node( "label" ).text = creature.pseudonym - + + var files = [] + var directory = Directory.new() + if directory.dir_exists( "user://creatures/" ): + directory.open( "user://creatures/" ) + directory.list_dir_begin() + while true: + var file = directory.get_next() + if file == "": + break + elif not file.begins_with( "." ) and not directory.current_is_dir(): + files.append( file ) + directory.list_dir_end() + + for file in files: + var creature_box = preload( "res://scenes/interfaces/creatures_menu/creature_box.tscn" ).instance() + creature_box.get_node( "label" ).text = file + creature_box.slot = self.slots_number + creature_box.creature_filename = file + creature_box.connect( "select_pressed", self, "_on_creature_box_select_pressed" ) + creature_box.connect( "delete_pressed", self, "_on_creature_box_delete_pressed" ) + $screen_box/scroll_container/v_box_container/creatures_box.add_child( creature_box ) + self.slots[ self.slots_number ] = creature_box + self.slots_number += 1 + + var creature = Creatures.Ra_old2.new() + creature.from_file( file ) + creature_box.get_node( "label" ).text = creature.pseudonym + func _on_new_pressed(): - emit_signal( "new_pressed", self.slots_number ) + emit_signal( "new_pressed", self.slots_number ) func _on_cancel_pressed(): - emit_signal( "cancel_pressed" ) + emit_signal( "cancel_pressed" ) func _on_creature_box_select_pressed( slot ): - emit_signal( "select_pressed", self.slots[ slot ].creature_filename ) - + emit_signal( "select_pressed", self.slots[ slot ].creature_filename ) + func _on_creature_box_delete_pressed( slot ): - if self.slots[ slot ].creature_filename: - var dir = Directory.new() - dir.remove( "user://creatures/" + self.slots[ slot ].creature_filename ) - self.slots[ slot ].queue_free() + if self.slots[ slot ].creature_filename: + var dir = Directory.new() + dir.remove( "user://creatures/" + self.slots[ slot ].creature_filename ) + self.slots[ slot ].queue_free() diff --git a/scenes/interfaces/creatures_menu/creatures_menu_ui.tscn b/scenes/interfaces/creatures_menu/creatures_menu_ui.tscn index 642dbee..8186653 100644 --- a/scenes/interfaces/creatures_menu/creatures_menu_ui.tscn +++ b/scenes/interfaces/creatures_menu/creatures_menu_ui.tscn @@ -48,19 +48,20 @@ size_flags_horizontal = 3 size_flags_vertical = 3 [node name="new" type="Button" parent="screen_box/scroll_container/v_box_container"] -margin_left = 196.0 +margin_left = 244.0 margin_top = 330.0 -margin_right = 404.0 +margin_right = 355.0 margin_bottom = 363.0 size_flags_horizontal = 4 -text = "Créer une nouvel créature." +text = "New creature" [node name="cancel" type="Button" parent="screen_box/scroll_container/v_box_container"] -margin_left = 268.0 +margin_left = 267.0 margin_top = 367.0 margin_right = 332.0 margin_bottom = 400.0 size_flags_horizontal = 4 -text = "Retour" +text = "Cancel" + [connection signal="pressed" from="screen_box/scroll_container/v_box_container/new" to="." method="_on_new_pressed"] [connection signal="pressed" from="screen_box/scroll_container/v_box_container/cancel" to="." method="_on_cancel_pressed"] diff --git a/scenes/interfaces/game_menu/game_ui.gd b/scenes/interfaces/game_menu/game_ui.gd index 1ee0563..e2629a1 100644 --- a/scenes/interfaces/game_menu/game_ui.gd +++ b/scenes/interfaces/game_menu/game_ui.gd @@ -2,46 +2,46 @@ extends Control func change_douleur( value ): - $stats_window.get_content_child( "douleur" ).value += value - if value > 0.0: - $stats_window.get_content_child( "oubli" ).value -= value/2 - + $stats_window.get_content_child( "douleur" ).value += value + if value > 0.0: + $stats_window.get_content_child( "oubli" ).value -= value/2 + func change_oubli( value ): - $stats_window.get_content_child( "oubli" ).value += value - if value > 0.0: - $stats_window.get_content_child( "douleur" ).value -= value/2 - + $stats_window.get_content_child( "oubli" ).value += value + if value > 0.0: + $stats_window.get_content_child( "douleur" ).value -= value/2 + func change_trauma( value ): - $stats_window.get_content_child( "trauma" ).self_modulate.a += value/6.0 - + $stats_window.get_content_child( "trauma" ).self_modulate.a += value/6.0 + func set_douleur( value ): - var delta = value - $stats_window.get_content_child( "douleur" ).value - $stats_window.get_content_child( "douleur" ).value = value - if delta > 0.0: - $stats_window.get_content_child( "oubli" ).value -= delta/2 + var delta = value - $stats_window.get_content_child( "douleur" ).value + $stats_window.get_content_child( "douleur" ).value = value + if delta > 0.0: + $stats_window.get_content_child( "oubli" ).value -= delta/2 func set_oubli( value ): - var delta = value - $stats_window.get_content_child( "oubli" ).value - $stats_window.get_content_child( "oubli" ).value = value - if delta > 0.0: - $stats_window.get_content_child( "douleur" ).value -= delta/2 + var delta = value - $stats_window.get_content_child( "oubli" ).value + $stats_window.get_content_child( "oubli" ).value = value + if delta > 0.0: + $stats_window.get_content_child( "douleur" ).value -= delta/2 func set_trauma( value ): - $stats_window.get_content_child( "trauma" ).self_modulate.a = value/6.0 + $stats_window.get_content_child( "trauma" ).self_modulate.a = value/6.0 func update_trauma(): - var trauma_value = (($stats_window.get_content_child( "oubli" ).value+$stats_window.get_content_child( "douleur" ).value)/2) - $stats_window.get_content_child( "trauma" ).value = trauma_value - $stats_window.get_content_child( "trauma" ).self_modulate.a = trauma_value/6.0 + var trauma_value = (($stats_window.get_content_child( "oubli" ).value+$stats_window.get_content_child( "douleur" ).value)/2) + $stats_window.get_content_child( "trauma" ).value = trauma_value + $stats_window.get_content_child( "trauma" ).self_modulate.a = trauma_value/6.0 func _on_douleur_value_changed(value): - $stats_window.get_content_child( "douleur" ).self_modulate.a = (value / 18.0) * (value / 18.0) - self.update_trauma() + $stats_window.get_content_child( "douleur" ).self_modulate.a = (value / 18.0) * (value / 18.0) + self.update_trauma() func _on_oubli_value_changed(value): - $stats_window.get_content_child( "oubli" ).self_modulate.a = (value / 18.0) * (value / 18.0) - self.update_trauma() + $stats_window.get_content_child( "oubli" ).self_modulate.a = (value / 18.0) * (value / 18.0) + self.update_trauma() func _on_trauma_value_changed(value): - $stats_window.get_content_child( "trauma" ).self_modulate.a = (value / 6.0) + $stats_window.get_content_child( "trauma" ).self_modulate.a = (value / 6.0) diff --git a/scenes/interfaces/game_menu/game_ui.tscn b/scenes/interfaces/game_menu/game_ui.tscn index 144f485..fc2ff98 100644 --- a/scenes/interfaces/game_menu/game_ui.tscn +++ b/scenes/interfaces/game_menu/game_ui.tscn @@ -74,6 +74,7 @@ __meta__ = { margin_left = 0.0 margin_right = 128.0 margin_bottom = 128.0 + [connection signal="value_changed" from="stats_window/douleur" to="." method="_on_douleur_value_changed"] [connection signal="value_changed" from="stats_window/oubli" to="." method="_on_oubli_value_changed"] [connection signal="value_changed" from="stats_window/trauma" to="." method="_on_trauma_value_changed"] diff --git a/scenes/interfaces/main_menu/main_menu.gd b/scenes/interfaces/main_menu/main_menu.gd index 2d34107..ade662c 100644 --- a/scenes/interfaces/main_menu/main_menu.gd +++ b/scenes/interfaces/main_menu/main_menu.gd @@ -5,11 +5,22 @@ signal play_pressed signal quit_pressed func close(): - self.hide() + self.hide() func _on_play_pressed(): - emit_signal( "play_pressed" ) - + emit_signal( "play_pressed" ) func _on_quitter_pressed(): - emit_signal( "quit_pressed" ) + emit_signal( "quit_pressed" ) + +func _on_control_quit_pressed(): + emit_signal( "quit_pressed" ) + +func _on_control_mute_pressed(): + #Config.msg_debug("") + #emit_signal( "mute_pressed" ) + pass + +#func _on_main_menu_mute_pressed(): +# Config.msg_debug("_on_main_menu_mute_pressed") +# emit_signal( "mute_pressed" ) diff --git a/scenes/interfaces/main_menu/main_menu.tscn b/scenes/interfaces/main_menu/main_menu.tscn index 8d5bcc1..de0d91a 100644 --- a/scenes/interfaces/main_menu/main_menu.tscn +++ b/scenes/interfaces/main_menu/main_menu.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=4 format=2] +[gd_scene load_steps=5 format=2] [ext_resource path="res://assets/interfaces/Login-Khanat-background.png" type="Texture" id=1] [ext_resource path="res://assets/interfaces/themes/khanat_theme.theme" type="Theme" id=2] [ext_resource path="res://scenes/interfaces/main_menu/main_menu.gd" type="Script" id=3] +[ext_resource path="res://scenes/interfaces/options/options.tscn" type="PackedScene" id=4] [node name="main_menu" type="Control"] anchor_right = 1.0 @@ -51,7 +52,7 @@ autowrap = true margin_top = 21.0 margin_right = 256.0 margin_bottom = 54.0 -text = "Jouer" +text = "MAIN_MENU_PLAY" [node name="username" type="LineEdit" parent="screen_box/login_box"] margin_top = 58.0 @@ -59,7 +60,7 @@ margin_right = 256.0 margin_bottom = 91.0 rect_min_size = Vector2( 256, 0 ) align = 1 -placeholder_text = "Username" +placeholder_text = "MAIN_MENU_USERNAME" [node name="password" type="LineEdit" parent="screen_box/login_box"] margin_top = 95.0 @@ -68,12 +69,21 @@ margin_bottom = 128.0 rect_min_size = Vector2( 256, 0 ) align = 1 secret = true -placeholder_text = "Password" +placeholder_text = "MAIN_MENU_PASSWORD" -[node name="quitter" type="Button" parent="screen_box/login_box"] +[node name="quit" type="Button" parent="screen_box/login_box"] margin_top = 132.0 margin_right = 256.0 margin_bottom = 165.0 -text = "Quitter" +text = "MAIN_MENU_QUIT" + +[node name="control" parent="." instance=ExtResource( 4 )] +anchor_left = 1.0 +anchor_bottom = 0.0 +margin_bottom = 0.0 +size_flags_horizontal = 8 +size_flags_vertical = 2 + [connection signal="pressed" from="screen_box/login_box/play" to="." method="_on_play_pressed"] -[connection signal="pressed" from="screen_box/login_box/quitter" to="." method="_on_quitter_pressed"] +[connection signal="pressed" from="screen_box/login_box/quit" to="." method="_on_quitter_pressed"] +[connection signal="quit_pressed" from="control" to="." method="_on_control_quit_pressed"] diff --git a/scenes/interfaces/music_manager/music_button.gd b/scenes/interfaces/music_manager/music_button.gd index 09c01fc..e803443 100644 --- a/scenes/interfaces/music_manager/music_button.gd +++ b/scenes/interfaces/music_manager/music_button.gd @@ -5,4 +5,4 @@ signal music_selected( filename ) var music_filename = "" func _on_music_button_pressed(): - emit_signal( "music_selected", self.music_filename ) + emit_signal( "music_selected", self.music_filename ) diff --git a/scenes/interfaces/music_manager/music_button.tscn b/scenes/interfaces/music_manager/music_button.tscn index 2452603..32d0b64 100644 --- a/scenes/interfaces/music_manager/music_button.tscn +++ b/scenes/interfaces/music_manager/music_button.tscn @@ -9,4 +9,5 @@ script = ExtResource( 1 ) __meta__ = { "_edit_use_anchors_": false } + [connection signal="pressed" from="." to="." method="_on_music_button_pressed"] diff --git a/scenes/interfaces/music_manager/music_manager.gd b/scenes/interfaces/music_manager/music_manager.gd index abfbf8f..d59945e 100644 --- a/scenes/interfaces/music_manager/music_manager.gd +++ b/scenes/interfaces/music_manager/music_manager.gd @@ -1,41 +1,117 @@ extends WindowDialog +onready var audio_player = $music + +func load_external_music(filepath): + var stream = null + Config.msg_debug("") + var file = File.new() + file.open(filepath, file.READ) + var ext = filepath.split(".")[-1].to_lower() + var buffer = file.get_buffer(file.get_len()) + Config.msg_debug(ext) + match ext: + "ogg": + stream = AudioStreamOGGVorbis.new() + "mp3": + stream = AudioStreamMP3.new() + #"wav": + # # We need decode message to get format + # stream = AudioStreamSample.new() + # stream.format = AudioStreamSample.FORMAT_16_BITS + # #stream.stereo = true + _: + Config.msg_error("Impossible to identify type of file (file:" + filepath + ", ext:" + ext + ")") + return + stream.data = buffer + audio_player.stream = stream + Config.msg_debug("") + func _ready(): - var directory = Directory.new() - - if not directory.dir_exists( "user://musics/" ): - directory.make_dir_recursive( "user://musics/" ) - directory.open( "user://musics/" ) - directory.list_dir_begin() - var files = [] - while true: - var file = directory.get_next() - if file == "": - break - elif not file.begins_with(".") and not directory.current_is_dir() and not file.ends_with( ".import" ): - files.append(file) - directory.list_dir_end() - - for file in files: - var button = preload( "res://scenes/interfaces/music_manager/music_button.tscn" ).instance() - button.music_filename = file - button.text = file - button.connect( "music_selected", self, "_on_music_pressed" ) - $window_box/scroll_box/musics_box.add_child( button ) + var directory = Directory.new() + get_tree().paused = false + Config.msg_debug("") + + if not directory.dir_exists( "user://musics/" ): + directory.make_dir_recursive( "user://musics/" ) + directory.open( "user://musics/" ) + directory.list_dir_begin() + var files = [] + while true: + var file = directory.get_next() + if file == "": + break + elif not file.begins_with(".") and not directory.current_is_dir() and not file.ends_with( ".import" ): + files.append(file) + directory.list_dir_end() + + for file in files: + var button = preload( "res://scenes/interfaces/music_manager/music_button.tscn" ).instance() + button.music_filename = "res://assets/musics/" + file + button.text = file + button.connect( "music_selected", self, "_on_music_pressed" ) + $window_box/scroll_box/musics_box.add_child( button ) + + audio_player.stream = load( "res://assets/musics/sangakanat_ames_voyageuses.ogg" ) + #add_music(audio_player) + #audio_player.set_volume_db(linear2db(0.5)) + #audio_player.set_volume_db(1.0) + audio_player.play() + #audio_player.set_volume_db(1.0) + #audioPlayer.play() + update_volume_db() + Config.msg_debug("Load End") + +func update_volume_db(): + if Config.mute: + audio_player.set_volume_db(linear2db(0.0)) + audio_player.set_pause_mode(true) + return + var lvl = Config.sound_lvl_global * Config.sound_lvl_music / 10000.0 + audio_player.set_volume_db(linear2db(lvl)) + audio_player.set_pause_mode(false) + +func set_sound_mute(value: bool): + Config.set_sound_mute(value) + update_volume_db() + +func set_level_global(value: int): + Config.sound_lvl_global = value + update_volume_db() + +func set_level_music(value: int): + Config.sound_lvl_music = value + update_volume_db() + +func set_level_effect(value: int): + Config.sound_lvl_effect = value + update_volume_db() + +func add_music(file): + var button = preload( "res://scenes/interfaces/music_manager/music_button.tscn" ).instance() + button.music_filename = file + button.text = file + button.connect( "music_selected", self, "_on_music_pressed" ) + $window_box/scroll_box/musics_box.add_child( button ) func open(): - self.popup() - + self.popup() + func close(): - self.hide() - + self.hide() + func toggle(): - if self.visible: - self.close() - else: - self.open() + if self.visible: + self.close() + else: + self.open() func _on_music_pressed( p_filename ): - $music.stream = load( "res://assets/musics/" + p_filename ) - $music.play() + Config.msg_debug(p_filename) + #audio_player.stream = load( p_filename ) + #audio_player.set_volume_db(1.0) + #audio_player.play() + + #$music.stream = load( p_filename ) + #$music.play() diff --git a/scenes/interfaces/music_manager/music_manager.tscn b/scenes/interfaces/music_manager/music_manager.tscn index 52e614e..38e4f4a 100644 --- a/scenes/interfaces/music_manager/music_manager.tscn +++ b/scenes/interfaces/music_manager/music_manager.tscn @@ -32,8 +32,8 @@ __meta__ = { } [node name="controls_box" type="HBoxContainer" parent="window_box"] -margin_left = 26.0 -margin_right = 102.0 +margin_left = 90.0 +margin_right = 166.0 margin_bottom = 16.0 size_flags_horizontal = 6 @@ -62,14 +62,14 @@ texture_normal = ExtResource( 3 ) [node name="scroll_box" type="ScrollContainer" parent="window_box"] margin_top = 20.0 -margin_right = 128.0 +margin_right = 256.0 margin_bottom = 128.0 size_flags_horizontal = 3 size_flags_vertical = 3 [node name="musics_box" type="VBoxContainer" parent="window_box/scroll_box"] -margin_left = 64.0 -margin_right = 64.0 +margin_left = 128.0 +margin_right = 128.0 size_flags_horizontal = 6 size_flags_vertical = 2 diff --git a/scenes/interfaces/options/option_info.gd b/scenes/interfaces/options/option_info.gd new file mode 100644 index 0000000..fac0803 --- /dev/null +++ b/scenes/interfaces/options/option_info.gd @@ -0,0 +1,72 @@ +extends Control + + +func read_license(key): + var file = File.new() + var filenews = "" + if key.empty(): + filenews = "res://LICENSE" + else: + filenews = "res://LICENSE_" + key + + if file.file_exists(filenews): + #print(filenews + " exist ! ") + file.open(filenews, File.READ) + var content = file.get_as_text() + file.close() + $window_dialog/margin_container/v_box_container/tab_container/OPTION_INFO_LICENSE.text = content + return true + return false + +func load_license(): + var current_locale = TranslationServer.get_locale() + var root_language = current_locale.split('_')[0] + var file = File.new() + var filenews = "" + + if read_license(current_locale): + pass + elif read_license(root_language): + pass + elif read_license(""): + pass + +func read_authors(key): + var file = File.new() + var filenews = "" + if key.empty(): + filenews = "res://AUTHORS" + else: + filenews = "res://AUTHORS_" + key + + if file.file_exists(filenews): + #print(filenews + " exist ! ") + file.open(filenews, File.READ) + var content = file.get_as_text() + file.close() + $window_dialog/margin_container/v_box_container/tab_container/OPTION_INFO_AUTHORS.text = content + return true + return false + +func load_authors(): + var current_locale = TranslationServer.get_locale() + var root_language = current_locale.split('_')[0] + var file = File.new() + var filenews = "" + + if read_authors(current_locale): + pass + elif read_authors(root_language): + pass + elif read_authors(""): + pass + + +# Called when the node enters the scene tree for the first time. +func _ready(): + load_authors() + load_license() + + +func _on_button_pressed(): + $window_dialog.hide() diff --git a/scenes/interfaces/options/option_info.tscn b/scenes/interfaces/options/option_info.tscn new file mode 100644 index 0000000..9417542 --- /dev/null +++ b/scenes/interfaces/options/option_info.tscn @@ -0,0 +1,80 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://scenes/interfaces/options/option_info.gd" type="Script" id=1] + +[node name="control" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="window_dialog" type="WindowDialog" parent="."] +visible = true +margin_left = 247.505 +margin_top = 164.032 +margin_right = 927.505 +margin_bottom = 558.032 +window_title = "OPTION_INFO_TITLE" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="margin_container" type="MarginContainer" parent="window_dialog"] +anchor_right = 1.0 +anchor_bottom = 1.0 +custom_constants/margin_right = 5 +custom_constants/margin_top = 5 +custom_constants/margin_left = 5 +custom_constants/margin_bottom = 5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="v_box_container" type="VBoxContainer" parent="window_dialog/margin_container"] +margin_left = 5.0 +margin_top = 5.0 +margin_right = 675.0 +margin_bottom = 389.0 +custom_constants/separation = 5 + +[node name="tab_container" type="TabContainer" parent="window_dialog/margin_container/v_box_container"] +margin_right = 670.0 +margin_bottom = 359.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="OPTION_INFO_AUTHORS" type="TextEdit" parent="window_dialog/margin_container/v_box_container/tab_container"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 32.0 +margin_right = -4.0 +margin_bottom = -4.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +readonly = true + +[node name="OPTION_INFO_LICENSE" type="TextEdit" parent="window_dialog/margin_container/v_box_container/tab_container"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 32.0 +margin_right = -4.0 +margin_bottom = -4.0 + +[node name="button" type="Button" parent="window_dialog/margin_container/v_box_container"] +margin_top = 364.0 +margin_right = 670.0 +margin_bottom = 384.0 +text = "OPTION_INFO_EXIT" +__meta__ = { +"_edit_use_anchors_": false +} + +[connection signal="pressed" from="window_dialog/margin_container/v_box_container/button" to="." method="_on_button_pressed"] diff --git a/scenes/interfaces/options/option_language.gd b/scenes/interfaces/options/option_language.gd new file mode 100644 index 0000000..e776457 --- /dev/null +++ b/scenes/interfaces/options/option_language.gd @@ -0,0 +1,46 @@ +extends Control + + +# Called when the node enters the scene tree for the first time. +func _ready(): + $window_dialog/margin_container/v_box_container/option_button.clear() + var id = 0 + var selected = -1 + var near_selected = -1 + var current_locale = TranslationServer.get_locale() + var root_language = current_locale.split('_')[0] + + for key in TranslationServer.get_loaded_locales(): + if key == TranslationServer.get_locale(): + selected = id + else: + var tmp = key.split("_") + # print("tmp:" + tmp[0]) + if tmp[0] == root_language: + if tmp.size() == 1: + near_selected = id + elif near_selected == -1: + near_selected = id + $window_dialog/margin_container/v_box_container/option_button.add_item(TranslationServer.get_locale_name(key) + " [" + key + "]", id) + id += 1 + if selected == -1 and near_selected != -1: + selected = near_selected + if selected == -1: + # Your language not exist, create it just for the form + var key = TranslationServer.get_locale() + $window_dialog/margin_container/v_box_container/option_button.add_item(TranslationServer.get_locale_name(key) + " (" + key + " !)", id) + selected = id + $window_dialog/margin_container/v_box_container/option_button.select(selected) + + +func _on_option_button_item_selected(index): + var id = 0 + for key in TranslationServer.get_loaded_locales(): + if id == $window_dialog/margin_container/v_box_container/option_button.get_selected(): + TranslationServer.set_locale(key) + return + id += 1 + + +func _on_button_pressed(): + $window_dialog.hide() diff --git a/scenes/interfaces/options/option_language.tscn b/scenes/interfaces/options/option_language.tscn new file mode 100644 index 0000000..736690c --- /dev/null +++ b/scenes/interfaces/options/option_language.tscn @@ -0,0 +1,66 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://scenes/interfaces/options/option_language.gd" type="Script" id=1] + +[node name="control" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="window_dialog" type="WindowDialog" parent="."] +margin_left = 448.0 +margin_top = 216.0 +margin_right = 795.0 +margin_bottom = 340.0 +popup_exclusive = true +window_title = "OPTION_LANGUAGE_SELECT_YOUR_LANGUAGE" +resizable = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="margin_container" type="MarginContainer" parent="window_dialog"] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/margin_right = 5 +custom_constants/margin_top = 5 +custom_constants/margin_left = 5 +custom_constants/margin_bottom = 5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="v_box_container" type="VBoxContainer" parent="window_dialog/margin_container"] +margin_left = 5.0 +margin_top = 5.0 +margin_right = 342.0 +margin_bottom = 119.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/separation = 5 + +[node name="option_button" type="OptionButton" parent="window_dialog/margin_container/v_box_container"] +margin_right = 337.0 +margin_bottom = 89.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="button" type="Button" parent="window_dialog/margin_container/v_box_container"] +margin_top = 94.0 +margin_right = 337.0 +margin_bottom = 114.0 +text = "OPTION_LANGUAGE_EXIT" +__meta__ = { +"_edit_use_anchors_": false +} + +[connection signal="item_selected" from="window_dialog/margin_container/v_box_container/option_button" to="." method="_on_option_button_item_selected"] +[connection signal="pressed" from="window_dialog/margin_container/v_box_container/button" to="." method="_on_button_pressed"] diff --git a/scenes/interfaces/options/option_news.gd b/scenes/interfaces/options/option_news.gd new file mode 100644 index 0000000..e95436d --- /dev/null +++ b/scenes/interfaces/options/option_news.gd @@ -0,0 +1,58 @@ +extends Control + + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + +func read_news(key): + var file = File.new() + var filenews = "" + if key.empty(): + filenews = "res://NEWS" + else: + filenews = "res://NEWS_" + key + + if file.file_exists(filenews): + #print(filenews + " exist ! ") + file.open(filenews, File.READ) + var content = file.get_as_text() + file.close() + #print(content) + #$accept_dialog.dialog_text = content + $window_dialog/margin_container/v_box_container/text_edit.text = content + return true + return false + + +func load_news(): + var current_locale = TranslationServer.get_locale() + var root_language = current_locale.split('_')[0] + var file = File.new() + var filenews = "" + + if read_news(current_locale): + pass + elif read_news(root_language): + pass + elif read_news(""): + pass + + +func _on_accept_dialog_visibility_changed(): + if $accept_dialog.visible: + print("show") + load_news() + + +func _on_accept_dialog_hide(): + $accept_dialog.dialog_text = "" + + +func _on_button_pressed(): + $window_dialog.hide() + + +func _on_window_dialog_visibility_changed(): + if $window_dialog.visible: + load_news() diff --git a/scenes/interfaces/options/option_news.tscn b/scenes/interfaces/options/option_news.tscn new file mode 100644 index 0000000..a8305da --- /dev/null +++ b/scenes/interfaces/options/option_news.tscn @@ -0,0 +1,74 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://scenes/interfaces/options/option_news.gd" type="Script" id=1] + +[node name="control" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 3.48987 +margin_top = -2.90425 +margin_right = 3.48987 +margin_bottom = -2.90424 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="window_dialog" type="WindowDialog" parent="."] +visible = true +margin_left = 362.868 +margin_top = 192.977 +margin_right = 944.868 +margin_bottom = 513.977 +window_title = "OPTION_NEWS_TITLE" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="margin_container" type="MarginContainer" parent="window_dialog"] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/margin_right = 5 +custom_constants/margin_top = 5 +custom_constants/margin_left = 5 +custom_constants/margin_bottom = 5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="v_box_container" type="VBoxContainer" parent="window_dialog/margin_container"] +margin_left = 5.0 +margin_top = 5.0 +margin_right = 577.0 +margin_bottom = 316.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/separation = 5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="text_edit" type="TextEdit" parent="window_dialog/margin_container/v_box_container"] +margin_right = 572.0 +margin_bottom = 286.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +readonly = true +syntax_highlighting = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="button" type="Button" parent="window_dialog/margin_container/v_box_container"] +margin_top = 291.0 +margin_right = 572.0 +margin_bottom = 311.0 +text = "OPTION_NEWS_EXIT" +__meta__ = { +"_edit_use_anchors_": false +} + +[connection signal="visibility_changed" from="window_dialog" to="." method="_on_window_dialog_visibility_changed"] +[connection signal="pressed" from="window_dialog/margin_container/v_box_container/button" to="." method="_on_button_pressed"] diff --git a/scenes/interfaces/options/option_settings.gd b/scenes/interfaces/options/option_settings.gd new file mode 100644 index 0000000..baaa5b2 --- /dev/null +++ b/scenes/interfaces/options/option_settings.gd @@ -0,0 +1,185 @@ +extends Control + +signal mute_pressed + +var slots_number = 0 +var slots = {} +var firstime = false + +# Called when the node enters the scene tree for the first time. +func _ready(): + # default video configuration + if Config.video_default: + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/h_box_container_8/default.pressed = true + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video.visible = false + else: + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/h_box_container_8/default.pressed = false + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video.visible = true + # Font size + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/h_box_container_9/font.value = Config.font_size + # window fullscreen + if ProjectSettings.has_setting( "display/window/size/fullscreen" ): + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container/fullscreen.pressed = Config.window_fullscreen + # ProjectSettings.get_setting( "display/window/size/fullscreen" ) + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container/fullscreen.disabled = false + else: + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container/fullscreen.disabled = true + # window borderless + if ProjectSettings.has_setting( "display/window/size/borderless" ): + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_2/borderless.pressed = Config.window_borderless + # ProjectSettings.get_setting( "display/window/size/borderless" ) + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_2/borderless.disabled = false + else: + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_2/borderless.disabled = true + # window resizable + if ProjectSettings.has_setting( "display/window/size/resizable" ): + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_3/resizable.pressed = Config.window_resizable + # ProjectSettings.get_setting( "display/window/size/resizable" ) + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_3/resizable.disabled = false + else: + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_3/resizable.disabled = true + # Screen number + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_4/screen.min_value = 0 + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_4/screen.max_value = OS.get_screen_count() - 1 + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_4/screen.value = OS.current_screen + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_4/screen.editable = true + # Screen orientation + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_5/orientation.value = OS.get_screen_orientation() + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_5/orientation.editable = true + # always_on_top + if ProjectSettings.has_setting( "display/window/size/always_on_top" ): + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_6/always_on_top.pressed = OS.is_keep_screen_on() + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_6/always_on_top.disabled = false + else: + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_6/always_on_top.disabled = true + # window maximized + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_7/window_maximized.pressed = Config.window_maximized + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_7/window_maximized.disabled = false + # Level sound + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_3/sound_lvl_global.value = Config.sound_lvl_global + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_6/sound_lvl_music.value = Config.sound_lvl_music + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_4/sound_lvl_effect.value = Config.sound_lvl_effect + # Mute + #$window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_2/mute.pressed = Config.mute + update_mute() + +func update_mute(): + Config.msg_debug("") + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_2/mute.pressed = Config.mute + +func _on_fullscreen_toggled(button_pressed): + Config.set_window_fullscreen(button_pressed) + +func _on_borderless_toggled(button_pressed): + Config.set_window_borderless(button_pressed) + +func _on_resizable_toggled(button_pressed): + Config.set_window_resizable(button_pressed) + +func _on_window_maximized_toggled(button_pressed): + Config.set_window_maximized(button_pressed) + +func _on_screen_value_changed(value): + Config.set_current_screen(value) + +# SCREEN_ORIENTATION_LANDSCAPE = 0 Landscape screen orientation. +# SCREEN_ORIENTATION_PORTRAIT = 1 Portrait screen orientation. +# SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 2 Reverse landscape screen orientation. +# SCREEN_ORIENTATION_REVERSE_PORTRAIT = 3 Reverse portrait screen orientation. +# SCREEN_ORIENTATION_SENSOR_LANDSCAPE = 4 Uses landscape or reverse landscape based on the hardware sensor. +# SCREEN_ORIENTATION_SENSOR_PORTRAIT = 5 Uses portrait or reverse portrait based on the hardware sensor. +# SCREEN_ORIENTATION_SENSOR = 6 Uses most suitable orientation based on + +func _on_orientation_value_changed(value): + # display/window/handheld/orientation + #print(OS.screen_orientation) + #print(ProjectSettings.get_setting("display/window/handheld/orientation")) + #if ProjectSettings.has_setting( "display/window/handheld/orientation" ): + # ProjectSettings.set_setting("display/window/handheld/orientation", value) + ##OS.screen_orientation = value + #print(OS.get_screen_orientation()) + Config.set_screen_orientation(value) + #OS.set_screen_orientation(value) + +func _on_always_on_top_toggled(button_pressed): + Config.set_window_always_on_top(button_pressed) + +func _on_add_music_pressed(): + pass # Replace with function body. + $file_dialog.show() + + +func _on_file_dialog_files_selected(paths): + print("multi files") + for path in paths: + var found = false + for slot in self.slots: + if self.slots[slot].music_filename == path: + found = true + continue + if found: + continue + var music_box = preload( "res://scenes/interfaces/options/option_settings_music_box.tscn" ).instance() + music_box.get_node( "label" ).text = path + #music_box.enable.pressed = true + #music_box.zone = "All" + music_box.slot = self.slots_number + music_box.music_filename = path + #creature_box.connect( "select_pressed", self, "_on_creature_box_select_pressed" ) + music_box.connect( "delete_pressed", self, "_on_music_box_delete_pressed" ) + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/scroll_container/list_music.add_child(music_box) + MusicManager.add_music(path) + self.slots[ self.slots_number ] = music_box + self.slots_number += 1 + +func _on_music_box_delete_pressed( slot ): + if self.slots[ slot ].music_filename: + #var dir = Directory.new() + #dir.remove( "user://creatures/" + self.slots[ slot ].creature_filename ) + pass + self.slots[ slot ].queue_free() + +func _on_default_toggled(button_pressed): + if button_pressed: + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/h_box_container_8/default.pressed = true + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video.visible = false + Config.enable_window_default() + else: + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/h_box_container_8/default.pressed = false + $window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video.visible = true + Config.disable_window_default() + Config.set_video_default(button_pressed) + +func _on_font_value_changed(value): + var valueint = int(value) + Config.set_font_size(value) + +func _on_sound_lvl_global_value_changed(value): + MusicManager.set_level_global(int(value)) + +func _on_sound_lvl_music_value_changed(value): + MusicManager.set_level_music(int(value)) + +func _on_sound_lvl_effect_value_changed(value): + MusicManager.set_level_effect(int(value)) + +func _on_ok_pressed(): + $file_dialog.hide() + $window_dialog.hide() + Config.save_config() + +func _on_window_dialog_hide(): + $file_dialog.hide() + if firstime: + Config.save_config() + +func _on_window_dialog_draw(): + firstime = true + +func _on_mute_toggled(button_pressed): + Config.msg_debug("") + MusicManager.set_sound_mute(button_pressed) + emit_signal( "mute_pressed" ) + +#func _on_control_mute_pressed(): +# update_mute() diff --git a/scenes/interfaces/options/option_settings.tscn b/scenes/interfaces/options/option_settings.tscn new file mode 100644 index 0000000..df47ef2 --- /dev/null +++ b/scenes/interfaces/options/option_settings.tscn @@ -0,0 +1,445 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://scenes/interfaces/options/option_settings.gd" type="Script" id=1] + +[node name="control" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="window_dialog" type="WindowDialog" parent="."] +margin_left = 55.2183 +margin_top = 62.4725 +margin_right = 1231.22 +margin_bottom = 674.473 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="margin_container" type="MarginContainer" parent="window_dialog"] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/margin_right = 5 +custom_constants/margin_top = 5 +custom_constants/margin_left = 5 +custom_constants/margin_bottom = 5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="v_box_container" type="VBoxContainer" parent="window_dialog/margin_container"] +margin_left = 5.0 +margin_top = 5.0 +margin_right = 1171.0 +margin_bottom = 607.0 +custom_constants/separation = 5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="tab_container" type="TabContainer" parent="window_dialog/margin_container/v_box_container"] +margin_right = 1166.0 +margin_bottom = 577.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/label_valign_fg = 0 +custom_constants/hseparation = 0 +custom_constants/label_valign_bg = 0 +custom_constants/top_margin = 0 +custom_constants/side_margin = 0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="OPTION_SETTINGS_VIDEO" type="VBoxContainer" parent="window_dialog/margin_container/v_box_container/tab_container"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 32.0 +margin_right = -4.0 +margin_bottom = -4.0 + +[node name="h_box_container_8" type="HBoxContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO"] +margin_right = 1158.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 + +[node name="label" type="Label" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/h_box_container_8"] +margin_left = 349.0 +margin_top = 5.0 +margin_right = 577.0 +margin_bottom = 19.0 +size_flags_horizontal = 10 +text = "OPTION_SETTINGS_VIDEO_DEFAULT" + +[node name="default" type="CheckBox" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/h_box_container_8"] +margin_left = 581.0 +margin_right = 605.0 +margin_bottom = 24.0 +size_flags_horizontal = 2 + +[node name="h_box_container_9" type="HBoxContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO"] +margin_top = 28.0 +margin_right = 1158.0 +margin_bottom = 52.0 +size_flags_horizontal = 3 + +[node name="label" type="Label" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/h_box_container_9"] +margin_left = 338.0 +margin_top = 5.0 +margin_right = 577.0 +margin_bottom = 19.0 +size_flags_horizontal = 10 +text = "OPTION_SETTINGS_VIDEO_SIZE_FONT" + +[node name="font" type="SpinBox" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/h_box_container_9"] +margin_left = 581.0 +margin_right = 655.0 +margin_bottom = 24.0 +size_flags_horizontal = 2 +min_value = 8.0 +value = 8.0 + +[node name="settings_video" type="GridContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO"] +margin_top = 56.0 +margin_right = 1158.0 +margin_bottom = 158.0 +custom_constants/vseparation = 2 +custom_constants/hseparation = 0 +columns = 2 + +[node name="h_box_container" type="HBoxContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video"] +margin_right = 579.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 + +[node name="label" type="Label" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container"] +margin_left = 38.0 +margin_top = 5.0 +margin_right = 287.0 +margin_bottom = 19.0 +size_flags_horizontal = 10 +text = "OPTION_SETTINGS_VIDEO_FULLSCREEN" + +[node name="fullscreen" type="CheckBox" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container"] +margin_left = 291.0 +margin_right = 315.0 +margin_bottom = 24.0 +size_flags_horizontal = 2 + +[node name="h_box_container_2" type="HBoxContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video"] +margin_left = 579.0 +margin_right = 1158.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 + +[node name="label" type="Label" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_2"] +margin_left = 35.0 +margin_top = 5.0 +margin_right = 287.0 +margin_bottom = 19.0 +size_flags_horizontal = 10 +text = "OPTION_SETTINGS_VIDEO_BORDERLESS" + +[node name="borderless" type="CheckBox" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_2"] +margin_left = 291.0 +margin_right = 315.0 +margin_bottom = 24.0 +size_flags_horizontal = 2 + +[node name="h_box_container_7" type="HBoxContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video"] +margin_top = 26.0 +margin_right = 579.0 +margin_bottom = 50.0 +size_flags_horizontal = 3 + +[node name="label" type="Label" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_7"] +margin_top = 5.0 +margin_right = 315.0 +margin_bottom = 19.0 +size_flags_horizontal = 10 +text = "OPTION_SETTINGS_VIDEO_WINDOW_MAXIMIZED" + +[node name="window_maximized" type="CheckBox" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_7"] +margin_left = 319.0 +margin_right = 343.0 +margin_bottom = 24.0 +size_flags_horizontal = 2 + +[node name="h_box_container_3" type="HBoxContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video"] +margin_left = 579.0 +margin_top = 26.0 +margin_right = 1158.0 +margin_bottom = 50.0 +size_flags_horizontal = 3 + +[node name="label" type="Label" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_3"] +margin_left = 49.0 +margin_top = 5.0 +margin_right = 287.0 +margin_bottom = 19.0 +size_flags_horizontal = 10 +text = "OPTION_SETTINGS_VIDEO_RESIZABLE" + +[node name="resizable" type="CheckBox" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_3"] +margin_left = 291.0 +margin_right = 315.0 +margin_bottom = 24.0 +size_flags_horizontal = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="h_box_container_4" type="HBoxContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video"] +margin_top = 52.0 +margin_right = 579.0 +margin_bottom = 76.0 +size_flags_horizontal = 3 + +[node name="label" type="Label" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_4"] +margin_left = 69.0 +margin_top = 5.0 +margin_right = 287.0 +margin_bottom = 19.0 +size_flags_horizontal = 10 +text = "OPTION_SETTINGS_VIDEO_SCREEN" + +[node name="screen" type="SpinBox" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_4"] +margin_left = 291.0 +margin_right = 365.0 +margin_bottom = 24.0 +size_flags_horizontal = 2 + +[node name="h_box_container_5" type="HBoxContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video"] +margin_left = 579.0 +margin_top = 52.0 +margin_right = 1158.0 +margin_bottom = 76.0 +size_flags_horizontal = 3 + +[node name="label" type="Label" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_5"] +margin_top = 5.0 +margin_right = 314.0 +margin_bottom = 19.0 +size_flags_horizontal = 10 +text = "OPTION_SETTINGS_VIDEO_SCREEN_ORIENTATION" + +[node name="orientation" type="SpinBox" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_5"] +margin_left = 318.0 +margin_right = 392.0 +margin_bottom = 24.0 +size_flags_horizontal = 2 +max_value = 6.0 + +[node name="h_box_container_6" type="HBoxContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video"] +margin_top = 78.0 +margin_right = 579.0 +margin_bottom = 102.0 +size_flags_horizontal = 3 + +[node name="label" type="Label" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_6"] +margin_top = 5.0 +margin_right = 350.0 +margin_bottom = 19.0 +size_flags_horizontal = 10 +text = "OPTION_SETTINGS_VIDEO_WINDOW_ALWAYS_ON_TOP" + +[node name="always_on_top" type="CheckBox" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_6"] +margin_left = 354.0 +margin_right = 579.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 + +[node name="OPTION_SETTINGS_SOUND" type="GridContainer" parent="window_dialog/margin_container/v_box_container/tab_container"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 32.0 +margin_right = -4.0 +margin_bottom = -4.0 + +[node name="h_box_container_2" type="HBoxContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND"] +margin_right = 1158.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 + +[node name="label" type="Label" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_2"] +margin_left = 363.0 +margin_top = 5.0 +margin_right = 577.0 +margin_bottom = 19.0 +size_flags_horizontal = 10 +text = "OPTION_SETTINGS_SOUND_MUTE" + +[node name="mute" type="CheckBox" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_2"] +margin_left = 581.0 +margin_right = 605.0 +margin_bottom = 24.0 +size_flags_horizontal = 2 + +[node name="h_box_container_3" type="HBoxContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND"] +margin_top = 28.0 +margin_right = 1158.0 +margin_bottom = 42.0 +size_flags_horizontal = 3 + +[node name="label" type="Label" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_3"] +margin_left = 304.0 +margin_right = 577.0 +margin_bottom = 14.0 +size_flags_horizontal = 10 +text = "OPTION_SETTINGS_SOUND_LEVEL_GLOBAL" + +[node name="sound_lvl_global" type="HScrollBar" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_3"] +margin_left = 581.0 +margin_right = 1158.0 +margin_bottom = 12.0 +size_flags_horizontal = 3 +step = 1.0 +rounded = true +custom_step = 10.0 + +[node name="h_box_container_6" type="HBoxContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND"] +margin_top = 46.0 +margin_right = 1158.0 +margin_bottom = 60.0 +size_flags_horizontal = 3 + +[node name="label" type="Label" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_6"] +margin_left = 315.0 +margin_right = 577.0 +margin_bottom = 14.0 +size_flags_horizontal = 10 +text = "OPTION_SETTINGS_SOUND_LEVEL_MUSIC" + +[node name="sound_lvl_music" type="HScrollBar" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_6"] +margin_left = 581.0 +margin_right = 1158.0 +margin_bottom = 12.0 +size_flags_horizontal = 3 +step = 1.0 + +[node name="h_box_container_4" type="HBoxContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND"] +margin_top = 64.0 +margin_right = 1158.0 +margin_bottom = 78.0 +size_flags_horizontal = 3 + +[node name="label" type="Label" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_4"] +margin_left = 314.0 +margin_right = 577.0 +margin_bottom = 14.0 +size_flags_horizontal = 10 +text = "OPTION_SETTINGS_SOUND_LEVEL_EFFECT" + +[node name="sound_lvl_effect" type="HScrollBar" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_4"] +margin_left = 581.0 +margin_right = 1158.0 +margin_bottom = 12.0 +size_flags_horizontal = 3 + +[node name="h_box_container_5" type="HBoxContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND"] +margin_top = 82.0 +margin_right = 1158.0 +margin_bottom = 106.0 +size_flags_horizontal = 3 + +[node name="label" type="Label" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_5"] +margin_left = 315.0 +margin_top = 5.0 +margin_right = 577.0 +margin_bottom = 19.0 +size_flags_horizontal = 10 +text = "OPTION_SETTINGS_SOUND_YOUR_MUSIC" + +[node name="mute" type="CheckBox" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_5"] +margin_left = 581.0 +margin_right = 605.0 +margin_bottom = 24.0 +size_flags_horizontal = 2 + +[node name="h_box_container" type="HBoxContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND"] +margin_top = 110.0 +margin_right = 1158.0 +margin_bottom = 130.0 +size_flags_horizontal = 3 + +[node name="label" type="Label" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container"] +margin_top = 3.0 +margin_right = 289.0 +margin_bottom = 17.0 +text = "OPTION_SETTINGS_SOUND_YOUR_SELECTION" + +[node name="add_music" type="Button" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container"] +margin_left = 293.0 +margin_right = 587.0 +margin_bottom = 20.0 +text = "OPTION_SETTINGS_SOUND_SELECTION_ADD" + +[node name="scroll_container" type="ScrollContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND"] +margin_top = 134.0 +margin_right = 1158.0 +margin_bottom = 541.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="list_music" type="VBoxContainer" parent="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/scroll_container"] +margin_right = 1158.0 +margin_bottom = 407.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/separation = 4 + +[node name="ok" type="Button" parent="window_dialog/margin_container/v_box_container"] +margin_top = 582.0 +margin_right = 1166.0 +margin_bottom = 602.0 +text = "OPTION_SETTINGS_EXIT" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="file_dialog" type="FileDialog" parent="."] +margin_left = 156.0 +margin_top = 237.0 +margin_right = 1102.0 +margin_bottom = 586.0 +popup_exclusive = true +window_title = "Ouvrir un ou plusieurs fichiers" +resizable = true +mode = 1 +access = 2 +filters = PoolStringArray( "*.mp3,*.ogg" ) +show_hidden_files = true +current_dir = "/home/aleajactaest/Projets/khanat/khanat-client-new" +current_path = "/home/aleajactaest/Projets/khanat/khanat-client-new/" +__meta__ = { +"_edit_use_anchors_": false +} + +[connection signal="mute_pressed" from="." to="." method="_on_control_mute_pressed"] +[connection signal="draw" from="window_dialog" to="." method="_on_window_dialog_draw"] +[connection signal="hide" from="window_dialog" to="." method="_on_window_dialog_hide"] +[connection signal="modal_closed" from="window_dialog" to="." method="_on_window_dialog_modal_closed"] +[connection signal="toggled" from="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/h_box_container_8/default" to="." method="_on_default_toggled"] +[connection signal="value_changed" from="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/h_box_container_9/font" to="." method="_on_font_value_changed"] +[connection signal="toggled" from="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container/fullscreen" to="." method="_on_fullscreen_toggled"] +[connection signal="toggled" from="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_2/borderless" to="." method="_on_borderless_toggled"] +[connection signal="toggled" from="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_7/window_maximized" to="." method="_on_window_maximized_toggled"] +[connection signal="toggled" from="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_3/resizable" to="." method="_on_resizable_toggled"] +[connection signal="value_changed" from="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_4/screen" to="." method="_on_screen_value_changed"] +[connection signal="value_changed" from="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_5/orientation" to="." method="_on_orientation_value_changed"] +[connection signal="toggled" from="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_VIDEO/settings_video/h_box_container_6/always_on_top" to="." method="_on_always_on_top_toggled"] +[connection signal="toggled" from="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_2/mute" to="." method="_on_mute_toggled"] +[connection signal="value_changed" from="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_3/sound_lvl_global" to="." method="_on_sound_lvl_global_value_changed"] +[connection signal="value_changed" from="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_6/sound_lvl_music" to="." method="_on_sound_lvl_music_value_changed"] +[connection signal="value_changed" from="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_4/sound_lvl_effect" to="." method="_on_sound_lvl_effect_value_changed"] +[connection signal="pressed" from="window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container/add_music" to="." method="_on_add_music_pressed"] +[connection signal="pressed" from="window_dialog/margin_container/v_box_container/ok" to="." method="_on_ok_pressed"] +[connection signal="files_selected" from="file_dialog" to="." method="_on_file_dialog_files_selected"] diff --git a/scenes/interfaces/options/option_settings_music_box.gd b/scenes/interfaces/options/option_settings_music_box.gd new file mode 100644 index 0000000..31753e2 --- /dev/null +++ b/scenes/interfaces/options/option_settings_music_box.gd @@ -0,0 +1,13 @@ +extends HBoxContainer + +signal select_pressed( slot ) +signal delete_pressed( slot ) + +var slot = null +var music_filename = null + +func _on_select_pressed(): + emit_signal( "select_pressed", self.slot ) + +func _on_delete_pressed(): + emit_signal( "delete_pressed", self.slot ) diff --git a/scenes/interfaces/options/option_settings_music_box.tscn b/scenes/interfaces/options/option_settings_music_box.tscn new file mode 100644 index 0000000..e0f4850 --- /dev/null +++ b/scenes/interfaces/options/option_settings_music_box.tscn @@ -0,0 +1,28 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://scenes/interfaces/options/option_settings_music_box.gd" type="Script" id=1] + +[node name="h_box_container" type="HBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +size_flags_horizontal = 3 +custom_constants/separation = 0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="delete" type="Button" parent="."] +margin_right = 310.0 +margin_bottom = 40.0 +text = "OPTION_SETTINGS_SOUND_SELECTION_DELETE" + +[node name="label" type="Label" parent="."] +margin_left = 310.0 +margin_top = 13.0 +margin_right = 330.0 +margin_bottom = 27.0 +size_flags_horizontal = 3 +text = "file" + +[connection signal="pressed" from="delete" to="." method="_on_delete_pressed"] diff --git a/scenes/interfaces/options/options.gd b/scenes/interfaces/options/options.gd new file mode 100644 index 0000000..0ffefda --- /dev/null +++ b/scenes/interfaces/options/options.gd @@ -0,0 +1,51 @@ +extends Control + + +signal quit_pressed +signal mute_pressed + + +func _ready(): + get_node("option_settings").connect("mute_pressed", self, "_on_control_mute_pressed") + update_sound_button() + + +func _on_quit_button_pressed(): + emit_signal( "quit_pressed" ) + + +func _on_language_button_pressed(): + $option_language/window_dialog.show() + + +func _on_news_button_pressed(): + #$option_news/accept_dialog.show() + $option_news/window_dialog.show() + +func _on_help_button_pressed(): + $option_info/window_dialog.show() + + +func _on_settings_button_pressed(): + $option_settings/window_dialog.show() + +func update_sound_button(): + Config.msg_debug("") + if Config.mute: + $options_reduce/h_box_container/sound_button.texture_normal = load ( "res://assets/interfaces/Login-Khanat-sound-muted-button.png") + $options_reduce/h_box_container/sound_button.texture_hover = load ( "res://assets/interfaces/Login-Khanat-sound-muted-button-hover.png") + else: + $options_reduce/h_box_container/sound_button.texture_normal = load ( "res://assets/interfaces/Login-Khanat-sound-button.png") + $options_reduce/h_box_container/sound_button.texture_hover = load ( "res://assets/interfaces/Login-Khanat-sound-button-hover.png") + + +func _on_sound_button_pressed(): + Config.msg_debug("") + MusicManager.set_sound_mute(not Config.mute) + emit_signal( "mute_pressed" ) + + +func _on_control_mute_pressed(): + Config.msg_debug("received signal mute") + update_sound_button() + $option_settings/window_dialog/margin_container/v_box_container/tab_container/OPTION_SETTINGS_SOUND/h_box_container_2/mute.pressed = Config.mute diff --git a/scenes/interfaces/options/options.tscn b/scenes/interfaces/options/options.tscn new file mode 100644 index 0000000..cf54127 --- /dev/null +++ b/scenes/interfaces/options/options.tscn @@ -0,0 +1,122 @@ +[gd_scene load_steps=19 format=2] + +[ext_resource path="res://scenes/interfaces/options/options.gd" type="Script" id=1] +[ext_resource path="res://assets/interfaces/Login-Khanat-help-button.png" type="Texture" id=2] +[ext_resource path="res://assets/interfaces/Login-Khanat-quit-button.png" type="Texture" id=3] +[ext_resource path="res://assets/interfaces/options.png" type="Texture" id=4] +[ext_resource path="res://assets/interfaces/Login-Khanat-settings-button.png" type="Texture" id=5] +[ext_resource path="res://assets/interfaces/Login-Khanat-sound-button.png" type="Texture" id=6] +[ext_resource path="res://assets/interfaces/Login-Khanat-help-button-hover.png" type="Texture" id=7] +[ext_resource path="res://assets/interfaces/Login-Khanat-news-button.png" type="Texture" id=8] +[ext_resource path="res://assets/interfaces/Login-Khanat-language-button.png" type="Texture" id=9] +[ext_resource path="res://assets/interfaces/Login-Khanat-quit-button-hover.png" type="Texture" id=10] +[ext_resource path="res://scenes/interfaces/options/option_language.tscn" type="PackedScene" id=11] +[ext_resource path="res://scenes/interfaces/options/option_news.tscn" type="PackedScene" id=12] +[ext_resource path="res://scenes/interfaces/options/option_info.tscn" type="PackedScene" id=13] +[ext_resource path="res://assets/interfaces/Login-Khanat-sound-button-hover.png" type="Texture" id=14] +[ext_resource path="res://assets/interfaces/Login-Khanat-news-button-hover.png" type="Texture" id=15] +[ext_resource path="res://assets/interfaces/Login-Khanat-language-button-hover.png" type="Texture" id=16] +[ext_resource path="res://assets/interfaces/Login-Khanat-settings-button-hover.png" type="Texture" id=17] +[ext_resource path="res://scenes/interfaces/options/option_settings.tscn" type="PackedScene" id=18] + +[node name="control" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_bottom = -651.0 +size_flags_horizontal = 9 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="options_reduce" type="TextureRect" parent="."] +anchor_left = 1.0 +anchor_right = 1.0 +margin_left = -416.0 +margin_bottom = 69.0 +mouse_default_cursor_shape = 5 +texture = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="h_box_container" type="HBoxContainer" parent="options_reduce"] +margin_left = 30.0 +margin_right = 396.0 +margin_bottom = 64.0 +alignment = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="news_button" type="TextureButton" parent="options_reduce/h_box_container"] +margin_left = 22.0 +margin_right = 76.0 +margin_bottom = 64.0 +texture_normal = ExtResource( 8 ) +texture_hover = ExtResource( 15 ) + +[node name="language_button" type="TextureButton" parent="options_reduce/h_box_container"] +margin_left = 80.0 +margin_right = 134.0 +margin_bottom = 64.0 +texture_normal = ExtResource( 9 ) +texture_hover = ExtResource( 16 ) + +[node name="sound_button" type="TextureButton" parent="options_reduce/h_box_container"] +margin_left = 138.0 +margin_right = 192.0 +margin_bottom = 64.0 +texture_normal = ExtResource( 6 ) +texture_hover = ExtResource( 14 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="help_button" type="TextureButton" parent="options_reduce/h_box_container"] +margin_left = 196.0 +margin_right = 250.0 +margin_bottom = 64.0 +texture_normal = ExtResource( 2 ) +texture_hover = ExtResource( 7 ) + +[node name="settings_button" type="TextureButton" parent="options_reduce/h_box_container"] +margin_left = 254.0 +margin_right = 308.0 +margin_bottom = 64.0 +texture_normal = ExtResource( 5 ) +texture_hover = ExtResource( 17 ) + +[node name="quit_button" type="TextureButton" parent="options_reduce/h_box_container"] +margin_left = 312.0 +margin_right = 366.0 +margin_bottom = 64.0 +texture_normal = ExtResource( 3 ) +texture_hover = ExtResource( 10 ) + +[node name="option_language" parent="." instance=ExtResource( 11 )] +visible = false +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -640.0 +margin_top = -34.5 +margin_right = 640.0 +margin_bottom = 34.5 + +[node name="option_news" parent="." instance=ExtResource( 12 )] +visible = false + +[node name="option_info" parent="." instance=ExtResource( 13 )] +visible = false + +[node name="option_settings" parent="." instance=ExtResource( 18 )] + +[connection signal="mute_pressed" from="." to="." method="_on_control_mute_pressed"] +[connection signal="pressed" from="options_reduce/h_box_container/news_button" to="." method="_on_news_button_pressed"] +[connection signal="pressed" from="options_reduce/h_box_container/language_button" to="." method="_on_language_button_pressed"] +[connection signal="pressed" from="options_reduce/h_box_container/sound_button" to="." method="_on_sound_button_pressed"] +[connection signal="pressed" from="options_reduce/h_box_container/help_button" to="." method="_on_help_button_pressed"] +[connection signal="pressed" from="options_reduce/h_box_container/settings_button" to="." method="_on_settings_button_pressed"] +[connection signal="pressed" from="options_reduce/h_box_container/quit_button" to="." method="_on_quit_button_pressed"] diff --git a/scenes/main/main.gd b/scenes/main/main.gd index 405f26f..62bbdbb 100644 --- a/scenes/main/main.gd +++ b/scenes/main/main.gd @@ -12,23 +12,23 @@ var creature_selected_slot = null var creature_selected_filename = null func _ready(): - Connection.connect( "connection_ok", self, "_on_connexion_ok" ) - Connection.connect( "connection_error", self, "_on_connection_error" ) + Connection.connect( "connection_ok", self, "_on_connexion_ok" ) + Connection.connect( "connection_error", self, "_on_connection_error" ) - Globals.ressource_queue.start() + Globals.ressource_queue.start() func _process(_time): - - if self.is_scene_loading: - if Globals.ressource_queue.is_ready( self.current_scene_path ): - print( "LOADING FINISHED") - self.set_new_scene( Globals.ressource_queue.get_resource( self.current_scene_path ) ) - $loading_screen.hide() - else: - self.update_progress() - $loading_screen.show() - - + + if self.is_scene_loading: + if Globals.ressource_queue.is_ready( self.current_scene_path ): + print( "LOADING FINISHED") + self.set_new_scene( Globals.ressource_queue.get_resource( self.current_scene_path ) ) + $loading_screen.hide() + else: + self.update_progress() + $loading_screen.show() + + # if loader == null: # # no need to process anymore # set_process(false) @@ -56,13 +56,13 @@ func _process(_time): # printerr( "Loading errors." ) # loader = null # break - + func _input( event ): - - if event.is_action_released( "music_manager" ): - MusicManager.toggle() - - + + if event.is_action_released( "music_manager" ): + MusicManager.toggle() + + #func load_scene( path ): # self.loader = ResourceLoader.load_interactive( path ) # if self.loader == null: @@ -81,43 +81,43 @@ func _input( event ): # self.wait_frames = 1 func set_new_scene( scene_resource ): - if scene_resource: - self.current_scene = scene_resource.instance() - self.get_node("scene").add_child(self.current_scene) - self.is_scene_loading = false - $loading_screen.hide() - $main_menu.hide() + if scene_resource: + self.current_scene = scene_resource.instance() + self.get_node("scene").add_child(self.current_scene) + self.is_scene_loading = false + $loading_screen.hide() + $main_menu.hide() - if self.has_node( "scene/creatures_menu_ui" ): - self.get_node( "scene/creatures_menu_ui" ).connect( "new_pressed", self, "_on_creatures_menu_ui_new_pressed" ) - self.get_node( "scene/creatures_menu_ui" ).connect( "cancel_pressed", self, "_on_creatures_menu_ui_cancel_pressed" ) - self.get_node( "scene/creatures_menu_ui" ).connect( "select_pressed", self, "_on_creatures_menu_ui_select_pressed" ) - elif self.has_node( "scene/creatures_editor_ui" ): - self.get_node( "scene/creatures_editor_ui" ).connect( "valid_pressed", self, "_on_creature_editor_ui_valid_pressed" ) - self.get_node( "scene/creatures_editor_ui" ).connect( "cancel_pressed", self, "_on_creature_editor_ui_cencel_pressed" ) - print( "slot: " + str( self.creature_selected_slot ) ) - self.get_node( "scene/creatures_editor_ui" ).slot = self.creature_selected_slot - # elif self.has_node( "scene/game" ): - # self.get_node( "scene/game" ).load_player( self.creature_selected_filename ) - + if self.has_node( "scene/creatures_menu_ui" ): + self.get_node( "scene/creatures_menu_ui" ).connect( "new_pressed", self, "_on_creatures_menu_ui_new_pressed" ) + self.get_node( "scene/creatures_menu_ui" ).connect( "cancel_pressed", self, "_on_creatures_menu_ui_cancel_pressed" ) + self.get_node( "scene/creatures_menu_ui" ).connect( "select_pressed", self, "_on_creatures_menu_ui_select_pressed" ) + elif self.has_node( "scene/creatures_editor_ui" ): + self.get_node( "scene/creatures_editor_ui" ).connect( "valid_pressed", self, "_on_creature_editor_ui_valid_pressed" ) + self.get_node( "scene/creatures_editor_ui" ).connect( "cancel_pressed", self, "_on_creature_editor_ui_cencel_pressed" ) + print( "slot: " + str( self.creature_selected_slot ) ) + self.get_node( "scene/creatures_editor_ui" ).slot = self.creature_selected_slot + # elif self.has_node( "scene/game" ): + # self.get_node( "scene/game" ).load_player( self.creature_selected_filename ) + func update_progress(): - var progress = float(Globals.ressource_queue.get_progress( self.current_scene_path )) + var progress = float(Globals.ressource_queue.get_progress( self.current_scene_path )) - self.get_node("loading_screen/background_player").play("loading") - self.get_node("loading_screen/background_player").stop() - self.get_node("loading_screen/background_player").seek( (progress*13.0)/100.0 ) - - + self.get_node("loading_screen/background_player").play("loading") + self.get_node("loading_screen/background_player").stop() + self.get_node("loading_screen/background_player").seek( (progress*13.0)/100.0 ) + + func goto_scene( p_path ): - - # Clean old scene. - if self.current_scene: - Globals.ressource_queue.cancel_resource( self.current_scene_path ) - self.current_scene.queue_free() - - Globals.ressource_queue.queue_resource( p_path ) - self.current_scene_path = p_path - self.is_scene_loading = true + + # Clean old scene. + if self.current_scene: + Globals.ressource_queue.cancel_resource( self.current_scene_path ) + self.current_scene.queue_free() + + Globals.ressource_queue.queue_resource( p_path ) + self.current_scene_path = p_path + self.is_scene_loading = true #func set_new_scene( scene_resource ): @@ -125,47 +125,55 @@ func goto_scene( p_path ): # self.current_scene = scene_resource.instance() # self.get_node("scene").add_child(self.current_scene) # self.is_scene_loading = false - + #func update_progress(): # self.get_node("loading_screen/progress_bar").value = Globals.ressource_queue.get_progress( self.current_scene_path ) # - - + + func _on_main_menu_play_pressed(): - var username = $main_menu/screen_box/login_box/username.text; - var password = $main_menu/screen_box/login_box/password.text; - if username != null and username != "" and password != null and password != "": - Connection.do_request(username, password) - else: - Globals.goto_scene( "res://scenes/interfaces/creatures_menu/creatures_menu_ui.tscn" ) - - + var username = $main_menu/screen_box/login_box/username.text; + var password = $main_menu/screen_box/login_box/password.text; + if username != null and username != "" and password != null and password != "": + Connection.do_request(username, password) + else: + Globals.goto_scene( "res://scenes/interfaces/creatures_menu/creatures_menu_ui.tscn" ) + + func _on_creatures_menu_ui_new_pressed( slot ): - self.creature_selected_slot = slot + self.creature_selected_slot = slot # Globals.goto_scene( "res://scenes/interfaces/creatures_editor/creatures_editor_ui.tscn" ) - Globals.goto_scene( "res://scenes/creatures/creatures_creation.tscn" ) + Globals.goto_scene( "res://scenes/creatures/creatures_creation.tscn" ) func _on_creatures_menu_ui_cancel_pressed(): - $main_menu.show() + $main_menu.show() func _on_creatures_menu_ui_select_pressed( filename ): - self.creature_selected_filename = filename - Globals.goto_scene( "res://scenes/game/game.tscn" ) - + self.creature_selected_filename = filename + Globals.goto_scene( "res://scenes/game/game.tscn" ) + func _on_creature_editor_ui_valid_pressed(): - Globals.goto_scene( "res://scenes/interfaces/creatures_menu/creatures_menu_ui.tscn" ) - + Globals.goto_scene( "res://scenes/interfaces/creatures_menu/creatures_menu_ui.tscn" ) + func _on_creature_editor_ui_cencel_pressed(): - Globals.goto_scene( "res://scenes/interfaces/creatures_menu/creatures_menu_ui.tscn" ) - + Globals.goto_scene( "res://scenes/interfaces/creatures_menu/creatures_menu_ui.tscn" ) + func _on_main_menu_quit_pressed(): - get_tree().quit() + get_tree().quit() func _on_connexion_ok(): - Globals.goto_scene( "res://scenes/interfaces/creatures_menu/creatures_menu_ui.tscn" ) - + Globals.goto_scene( "res://scenes/interfaces/creatures_menu/creatures_menu_ui.tscn" ) + func _on_connection_error( message ): - $main_menu/screen_box/login_box/error.text = message + $main_menu/screen_box/login_box/error.text = message + +func _on_mute_pressed(): + pass + # $main_menu/control/option_settings.update_sound_button() + +func _on_main_menu_mute_pressed(): + Config.msg_debug("_on_main_menu_mute_pressed") + $main_menu/control/option_settings.update_sound_button() diff --git a/scenes/main/main.tscn b/scenes/main/main.tscn index abe0520..c35f744 100644 --- a/scenes/main/main.tscn +++ b/scenes/main/main.tscn @@ -10,8 +10,11 @@ script = ExtResource( 3 ) [node name="scene" type="Spatial" parent="."] [node name="main_menu" parent="." instance=ExtResource( 1 )] +margin_top = 1.49832 +margin_bottom = 1.49829 [node name="loading_screen" parent="." instance=ExtResource( 2 )] visible = false + [connection signal="play_pressed" from="main_menu" to="." method="_on_main_menu_play_pressed"] [connection signal="quit_pressed" from="main_menu" to="." method="_on_main_menu_quit_pressed"] diff --git a/scenes/player/player.gd b/scenes/player/player.gd index dce3513..844bdb1 100644 --- a/scenes/player/player.gd +++ b/scenes/player/player.gd @@ -17,53 +17,53 @@ var focused_object = null var focus_index = 0 static func get_input_direction() -> Vector3: - return Vector3( - Input.get_action_strength("move_strafe_right") - Input.get_action_strength("move_strafe_left"), - 0, - Input.get_action_strength("move_backward") - Input.get_action_strength("move_forward") - ) - + return Vector3( + Input.get_action_strength("move_strafe_right") - Input.get_action_strength("move_strafe_left"), + 0, + Input.get_action_strength("move_backward") - Input.get_action_strength("move_forward") + ) + func _input( event ): - - # Run. - if event.is_action_pressed( "move_toggle_run" ): - $character.is_running = not $character.is_running + + # Run. + if event.is_action_pressed( "move_toggle_run" ): + $character.is_running = not $character.is_running - # Camera. - if event.is_action( "camera_zoom_in" ): - self.zoom_level += 1 - elif event.is_action( "camera_zoom_out" ): - self.zoom_level -= 1 - - if event.is_action_pressed( "camera_reset_view" ): - $character/spring_arm.rotation = Vector3.ZERO - self.zoom_level = 0 - - if event.is_action_pressed( "camera_switch" ): - if self.camera_tps.current: - self.camera_fps.make_current() - $character/spring_arm.rotation = Vector3.ZERO + # Camera. + if event.is_action( "camera_zoom_in" ): + self.zoom_level += 1 + elif event.is_action( "camera_zoom_out" ): + self.zoom_level -= 1 + + if event.is_action_pressed( "camera_reset_view" ): + $character/spring_arm.rotation = Vector3.ZERO + self.zoom_level = 0 + + if event.is_action_pressed( "camera_switch" ): + if self.camera_tps.current: + self.camera_fps.make_current() + $character/spring_arm.rotation = Vector3.ZERO # self.hide() - else: - self.camera_tps.make_current() + else: + self.camera_tps.make_current() # self.show() - + - if event is InputEventMouseMotion: - self.mouse_delta = event.relative - - # Jump. - if event.is_action_pressed( "move_jump" ) and not $character.is_falling: - $character.is_jump_started = true - + if event is InputEventMouseMotion: + self.mouse_delta = event.relative + + # Jump. + if event.is_action_pressed( "move_jump" ) and not $character.is_falling: + $character.is_jump_started = true + - if event.is_action_pressed( "interact" ): - self.interact() - - - if event.is_action_pressed( "focus_next" ): - self.focus_next() - + if event.is_action_pressed( "interact" ): + self.interact() + + + if event.is_action_pressed( "focus_next" ): + self.focus_next() + # if not self.get_tree().get_root().get_node( "main/scene/game" ).is_on_ui: # if event.is_action_pressed( "action_ready_weapon" ): # $character.is_readying_weapon = true @@ -73,23 +73,23 @@ func _input( event ): # if $character.is_weapon_ready: # if event.is_action_pressed( "action_attack" ): # $character.attack() - - + + func _process( delta ): - $character.direction = self.get_input_direction() + $character.direction = self.get_input_direction() - # Rotation. - if not Input.is_key_pressed( KEY_SHIFT ) and not $character.is_jump_started: - $character.orientation = (Input.get_action_strength("move_turn_left") - Input.get_action_strength("move_turn_right")) - else: - $character.orientation = 0.0 - - # Camera. - if not self.mouse_delta == Vector2.ZERO and self.camera_tps.current: - if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: - $character/spring_arm.rotate_y( -self.mouse_delta.x * 0.01 ) - self.camera_tps.rotate_x( self.mouse_delta.y * 0.01 ) + # Rotation. + if not Input.is_key_pressed( KEY_SHIFT ) and not $character.is_jump_started: + $character.orientation = (Input.get_action_strength("move_turn_left") - Input.get_action_strength("move_turn_right")) + else: + $character.orientation = 0.0 + + # Camera. + if not self.mouse_delta == Vector2.ZERO and self.camera_tps.current: + if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: + $character/spring_arm.rotate_y( -self.mouse_delta.x * 0.01 ) + self.camera_tps.rotate_x( self.mouse_delta.y * 0.01 ) # if not $character.velocity.x == 0.0 or not $character.velocity.z == 0.0: # var velocity_without_gravity = $character.velocity @@ -100,125 +100,125 @@ func _process( delta ): ## $crosshair.material.set_shader_param( "spread", 1 ) # $character/target_spring_arm/crosshair.scale = Vector3( 1.0, 1.0, 1.0 ) - if $character.is_weapon_ready: - if $character.get_main_weapon_node(): - $character/crosshair.show() - # $character/target_spring_arm.global_transform.origin = $character.get_main_weapon_node().get_node( "bullet_exit" ).global_transform.origin - # $character/target_spring_arm.look_at_from_position( $character.get_main_weapon_node().get_node( "bullet_exit" ).global_transform.origin, $character.get_main_weapon_node().get_node( "target" ).global_transform.origin, Vector3( 0.0, 0.0, -1.0 ) ) - # $character/target_spring_arm.global_transform.basis.y = $character.get_main_weapon_node().get_node( "bullet_exit" ).global_transform.basis.y - $character/crosshair.global_transform.origin = $character.get_main_weapon_node().get_node( "bullet_exit/target_spring_arm/target" ).global_transform.origin - else: - $character/target_spring_arm.hide() + if $character.is_weapon_ready: + if $character.get_main_weapon_node(): + $character/crosshair.show() + # $character/target_spring_arm.global_transform.origin = $character.get_main_weapon_node().get_node( "bullet_exit" ).global_transform.origin + # $character/target_spring_arm.look_at_from_position( $character.get_main_weapon_node().get_node( "bullet_exit" ).global_transform.origin, $character.get_main_weapon_node().get_node( "target" ).global_transform.origin, Vector3( 0.0, 0.0, -1.0 ) ) + # $character/target_spring_arm.global_transform.basis.y = $character.get_main_weapon_node().get_node( "bullet_exit" ).global_transform.basis.y + $character/crosshair.global_transform.origin = $character.get_main_weapon_node().get_node( "bullet_exit/target_spring_arm/target" ).global_transform.origin + else: + $character/target_spring_arm.hide() - # Values reset. - self.mouse_delta = Vector2.ZERO - + # Values reset. + self.mouse_delta = Vector2.ZERO + # Debug. #var old_collider = null func _physics_process(delta): - - var space_state = get_world().direct_space_state - # Camera. - self.camera_position = Vector3( 0.0, 2 - 0.1*self.zoom_level, -2 + 0.1*self.zoom_level ) - $character/spring_arm/camera_position.translation = self.camera_position - var global_camera_position = $character/spring_arm/camera_position.global_transform.origin - var result = space_state.intersect_ray($character/look_at.global_transform.origin, global_camera_position, [self]) - - - if result: - self.camera_tps.global_transform.origin = result.position + + var space_state = get_world().direct_space_state + # Camera. + self.camera_position = Vector3( 0.0, 2 - 0.1*self.zoom_level, -2 + 0.1*self.zoom_level ) + $character/spring_arm/camera_position.translation = self.camera_position + var global_camera_position = $character/spring_arm/camera_position.global_transform.origin + var result = space_state.intersect_ray($character/look_at.global_transform.origin, global_camera_position, [self]) + + + if result: + self.camera_tps.global_transform.origin = result.position # self.camera_tps.look_at( $character/look_at.global_transform.origin, Vector3( 0.0, 1.0, 0.0) ) - + - else: - self.camera_tps.translation = self.camera_position + else: + self.camera_tps.translation = self.camera_position # self.camera_tps.look_at( $character/look_at.global_transform.origin, Vector3( 0.0, 1.0, 0.0) ) - + func interact( p_object = null ): - if p_object and p_object.has_method( "interact" ): - p_object.interact( $character/creature.creature ) - else: - if self.focused_object and self.focused_object.has_method( "interact" ): - self.focused_object.interact( $character/creature.creature ) - elif self.focused_object and self.focused_object.get_parent() and self.focused_object.get_parent().has_method( "interact" ): - self.focused_object.get_parent().interact( $character/creature.creature ) + if p_object and p_object.has_method( "interact" ): + p_object.interact( $character/creature.creature ) + else: + if self.focused_object and self.focused_object.has_method( "interact" ): + self.focused_object.interact( $character/creature.creature ) + elif self.focused_object and self.focused_object.get_parent() and self.focused_object.get_parent().has_method( "interact" ): + self.focused_object.get_parent().interact( $character/creature.creature ) - if not self.focused_object: - self.proximity_objects.erase( self.focused_object ) - self.update_focused_object() + if not self.focused_object: + self.proximity_objects.erase( self.focused_object ) + self.update_focused_object() func focus_next(): - self.focus_index += 1 - if self.focus_index >= self.proximity_objects.size(): - self.focus_index = 0 - - self.update_focused_object() - - + self.focus_index += 1 + if self.focus_index >= self.proximity_objects.size(): + self.focus_index = 0 + + self.update_focused_object() + + func set_focus_on( p_object, p_focus ): - if p_object and p_object.has_method( "set_focus" ): - p_object.set_focus( p_focus ) - elif p_object and p_object.get_parent() and p_object.get_parent().has_method( "set_focus" ): - p_object.get_parent().set_focus( p_focus ) - + if p_object and p_object.has_method( "set_focus" ): + p_object.set_focus( p_focus ) + elif p_object and p_object.get_parent() and p_object.get_parent().has_method( "set_focus" ): + p_object.get_parent().set_focus( p_focus ) + func update_focused_object(): - - if self.focus_index >= self.proximity_objects.size(): - self.focus_index = 0 - - var old_focused_object = self.focused_object - if self.proximity_objects.size() > 0: - self.focused_object = self.proximity_objects[ self.focus_index ] - else: - self.focused_object = null - - if old_focused_object: - self.set_focus_on( old_focused_object, false ) - if self.focused_object: - self.set_focus_on( self.focused_object, true ) - emit_signal( "new_focused_object", self.focused_object.name ) + + if self.focus_index >= self.proximity_objects.size(): + self.focus_index = 0 + + var old_focused_object = self.focused_object + if self.proximity_objects.size() > 0: + self.focused_object = self.proximity_objects[ self.focus_index ] + else: + self.focused_object = null + + if old_focused_object: + self.set_focus_on( old_focused_object, false ) + if self.focused_object: + self.set_focus_on( self.focused_object, true ) + emit_signal( "new_focused_object", self.focused_object.name ) func _on_interact_area_body_entered(body): - if not body == $character: - self.proximity_objects.push_back( body ) - self.update_focused_object() + if not body == $character: + self.proximity_objects.push_back( body ) + self.update_focused_object() func _on_interact_area_body_exited(body): - if not body == $character: - self.proximity_objects.erase( body ) - self.update_focused_object() + if not body == $character: + self.proximity_objects.erase( body ) + self.update_focused_object() func _on_character_equip(p_slot, p_item): - emit_signal( "equip", p_slot, p_item ) - var weapons = $character.get_weapons() - if weapons.size() > 0: - - var min_range = null - for weapon in weapons: - if not min_range: - min_range = weapon.get_data( "range" ) - else: - min_range = min( min_range, weapon.get_data( "range" ) ) - $character.get_main_weapon_node().get_node( "bullet_exit/target_spring_arm" ).spring_length = min_range - + emit_signal( "equip", p_slot, p_item ) + var weapons = $character.get_weapons() + if weapons.size() > 0: + + var min_range = null + for weapon in weapons: + if not min_range: + min_range = weapon.get_data( "range" ) + else: + min_range = min( min_range, weapon.get_data( "range" ) ) + $character.get_main_weapon_node().get_node( "bullet_exit/target_spring_arm" ).spring_length = min_range + func _on_character_unequip(p_slot): - emit_signal( "unequip", p_slot ) + emit_signal( "unequip", p_slot ) func _on_crosshair_area_body_entered(body): - if not body == $character: - if body is preload( "res://scenes/characters/character.gd" ): - if body.player_relation == body.PLAYER_RELATION.ennemy: - $character/crosshair.get_surface_material( 0 ).albedo_color = Color.red - elif body.player_relation == body.PLAYER_RELATION.friend: - $character/crosshair.get_surface_material( 0 ).albedo_color = Color.green - else: - $character/crosshair.get_surface_material( 0 ).albedo_color = Color.white + if not body == $character: + if body is preload( "res://scenes/characters/character.gd" ): + if body.player_relation == body.PLAYER_RELATION.ennemy: + $character/crosshair.get_surface_material( 0 ).albedo_color = Color.red + elif body.player_relation == body.PLAYER_RELATION.friend: + $character/crosshair.get_surface_material( 0 ).albedo_color = Color.green + else: + $character/crosshair.get_surface_material( 0 ).albedo_color = Color.white func _on_crosshair_area_body_exited(body): - if not body == $character: - $character/target_spring_arm/crosshair.get_surface_material( 0 ).albedo_color = Color.white + if not body == $character: + $character/target_spring_arm/crosshair.get_surface_material( 0 ).albedo_color = Color.white