From f22dcea5da9881f29e1d8169757478d632dd0871 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Tue, 6 Jan 2026 01:21:53 +0300 Subject: [PATCH] Added main menu and settings --- .editorconfig | 4 + .gitattributes | 2 + default_bus_layout.tres | 21 +++ game/levels/abstract_level.gd | 1 + game/levels/abstract_level.gd.uid | 1 + game/levels/abstract_level.tscn | 6 + game/managers/settings_manager.gd | 164 ++++++++++++++++++++++ game/managers/settings_manager.gd.uid | 1 + game/managers/settings_manager.tscn | 6 + game/managers/sound_manager.gd | 91 ++++++++++++ game/managers/sound_manager.gd.uid | 1 + game/managers/sound_manager.tscn | 12 ++ game/menu/main_menu.gd | 33 +++++ game/menu/main_menu.gd.uid | 1 + game/menu/main_menu.tscn | 65 +++++++++ game/menu/options_menu.gd | 118 ++++++++++++++++ game/menu/options_menu.gd.uid | 1 + game/menu/options_menu.tscn | 157 +++++++++++++++++++++ game/objects/b_w_object.gd | 10 ++ game/objects/b_w_object.gd.uid | 1 + game/objects/b_w_object.tscn | 10 ++ icon.svg | 1 + icon.svg.import | 43 ++++++ images/fonts/font16.png | 3 + images/fonts/font16.png.import | 25 ++++ images/fonts/font8.png | 3 + images/fonts/font8.png.import | 25 ++++ images/menu/buttons.png | 3 + images/menu/buttons.png.import | 40 ++++++ project.godot | 83 +++++++++++ themes/label.tres | 6 + themes/menu.tres | 195 ++++++++++++++++++++++++++ 32 files changed, 1133 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 default_bus_layout.tres create mode 100644 game/levels/abstract_level.gd create mode 100644 game/levels/abstract_level.gd.uid create mode 100644 game/levels/abstract_level.tscn create mode 100644 game/managers/settings_manager.gd create mode 100644 game/managers/settings_manager.gd.uid create mode 100644 game/managers/settings_manager.tscn create mode 100644 game/managers/sound_manager.gd create mode 100644 game/managers/sound_manager.gd.uid create mode 100644 game/managers/sound_manager.tscn create mode 100644 game/menu/main_menu.gd create mode 100644 game/menu/main_menu.gd.uid create mode 100644 game/menu/main_menu.tscn create mode 100644 game/menu/options_menu.gd create mode 100644 game/menu/options_menu.gd.uid create mode 100644 game/menu/options_menu.tscn create mode 100644 game/objects/b_w_object.gd create mode 100644 game/objects/b_w_object.gd.uid create mode 100644 game/objects/b_w_object.tscn create mode 100644 icon.svg create mode 100644 icon.svg.import create mode 100644 images/fonts/font16.png create mode 100644 images/fonts/font16.png.import create mode 100644 images/fonts/font8.png create mode 100644 images/fonts/font8.png.import create mode 100644 images/menu/buttons.png create mode 100644 images/menu/buttons.png.import create mode 100644 project.godot create mode 100644 themes/label.tres create mode 100644 themes/menu.tres diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f28239b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +charset = utf-8 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..0efdb8f --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.png filter=lfs diff=lfs merge=lfs -text lockable +*.wav filter=lfs diff=lfs merge=lfs -text lockable diff --git a/default_bus_layout.tres b/default_bus_layout.tres new file mode 100644 index 0000000..d835664 --- /dev/null +++ b/default_bus_layout.tres @@ -0,0 +1,21 @@ +[gd_resource type="AudioBusLayout" format=3 uid="uid://dcnu7cya2sckd"] + +[resource] +bus/1/name = &"UI" +bus/1/solo = false +bus/1/mute = false +bus/1/bypass_fx = false +bus/1/volume_db = 0.0 +bus/1/send = &"Master" +bus/2/name = &"SFX" +bus/2/solo = false +bus/2/mute = false +bus/2/bypass_fx = false +bus/2/volume_db = 0.0 +bus/2/send = &"Master" +bus/3/name = &"Music" +bus/3/solo = false +bus/3/mute = false +bus/3/bypass_fx = false +bus/3/volume_db = 0.0 +bus/3/send = &"Master" diff --git a/game/levels/abstract_level.gd b/game/levels/abstract_level.gd new file mode 100644 index 0000000..e251cf8 --- /dev/null +++ b/game/levels/abstract_level.gd @@ -0,0 +1 @@ +extends Node2D diff --git a/game/levels/abstract_level.gd.uid b/game/levels/abstract_level.gd.uid new file mode 100644 index 0000000..bb2c9f5 --- /dev/null +++ b/game/levels/abstract_level.gd.uid @@ -0,0 +1 @@ +uid://c737mx0kxva7i diff --git a/game/levels/abstract_level.tscn b/game/levels/abstract_level.tscn new file mode 100644 index 0000000..65d3d69 --- /dev/null +++ b/game/levels/abstract_level.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://mpsu4g2b5h3a"] + +[ext_resource type="Script" uid="uid://c737mx0kxva7i" path="res://game/levels/abstract_level.gd" id="1_o2mui"] + +[node name="Level" type="Node2D"] +script = ExtResource("1_o2mui") diff --git a/game/managers/settings_manager.gd b/game/managers/settings_manager.gd new file mode 100644 index 0000000..05b1da1 --- /dev/null +++ b/game/managers/settings_manager.gd @@ -0,0 +1,164 @@ +class_name CSettingsManager +extends Node + + +@export var config_file_path := "user://settings.cfg" +@export var window_base_size := Vector2i(640, 360) + + +const CATEGORY_VIDEO = "video" +const SETTING_FULLSCREEN = "fullscreen" +const SETTING_WINDOW_FACTOR = "window_factor" +const CATEGORY_AUDIO = "audio" +const SETTING_MASTER_VOLUME = "master_volume" +const SETTING_UI_VOLUME = "ui_volume" +const SETTING_SFX_VOLUME = "sfx_volume" +const SETTING_MUSIC_VOLUME = "music_volume" + + +var _config: ConfigFile + +var _fullscreen := false +var fullscreen : bool: + get(): + return _fullscreen + set(value): + _fullscreen = value + _apply_video_settings() + _save_settings() + +var _window_factor := 1 +var window_factor : int: + get(): + return _window_factor + set(value): + _window_factor = clampi(value, 1, 5) + _apply_video_settings() + _save_settings() + +var _master_volume := 100 +var master_volume : int: + get(): + return _master_volume + set(value): + _master_volume = clampi(value, 0, 100) + _apply_audio_settings() + _save_settings() + +var _ui_volume := 100 +var ui_volume : int: + get(): + return _ui_volume + set(value): + _ui_volume = clampi(value, 0, 100) + _apply_audio_settings() + _save_settings() + +var _sfx_volume := 100 +var sfx_volume : int: + get(): + return _sfx_volume + set(value): + _sfx_volume = clampi(value, 0, 100) + _apply_audio_settings() + _save_settings() + +var _music_volume := 100 +var music_volume : int: + get(): + return _music_volume + set(value): + _music_volume = clampi(value, 0, 100) + _apply_audio_settings() + _save_settings() + + +func _ready() -> void: + _config = ConfigFile.new() + + _load_settings() + _apply_all_settings() + + +func _load_settings() -> void: + if _config.load(config_file_path) == OK: + _fullscreen = _config.get_value(CATEGORY_VIDEO, SETTING_FULLSCREEN, _fullscreen) + _window_factor = _config.get_value(CATEGORY_VIDEO, SETTING_WINDOW_FACTOR, _window_factor) + + _master_volume = _config.get_value(CATEGORY_AUDIO, SETTING_MASTER_VOLUME, _master_volume) + _ui_volume = _config.get_value(CATEGORY_AUDIO, SETTING_UI_VOLUME, _ui_volume) + _sfx_volume = _config.get_value(CATEGORY_AUDIO, SETTING_SFX_VOLUME, _sfx_volume) + _music_volume = _config.get_value(CATEGORY_AUDIO, SETTING_MUSIC_VOLUME, _music_volume) + + _save_settings() + + +func _save_settings() -> void: + if _config == null: + _config = ConfigFile.new() + + _config.set_value(CATEGORY_VIDEO, SETTING_FULLSCREEN, _fullscreen) + _config.set_value(CATEGORY_VIDEO, SETTING_WINDOW_FACTOR, _window_factor) + + _config.set_value(CATEGORY_AUDIO, SETTING_MASTER_VOLUME, _master_volume) + _config.set_value(CATEGORY_AUDIO, SETTING_UI_VOLUME, _ui_volume) + _config.set_value(CATEGORY_AUDIO, SETTING_SFX_VOLUME, _sfx_volume) + _config.set_value(CATEGORY_AUDIO, SETTING_MUSIC_VOLUME, _music_volume) + + _config.save(config_file_path) + + +func _apply_all_settings() -> void: + _apply_video_settings() + _apply_audio_settings() + + +func _apply_video_settings() -> void: + if _fullscreen: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) + else: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) + _apply_window_scale() + + +func _apply_audio_settings() -> void: + var master_bus := AudioServer.get_bus_index(CSoundManager.MASTER_BUS) + var ui_bus := AudioServer.get_bus_index(CSoundManager.UI_BUS) + var sfx_bus := AudioServer.get_bus_index(CSoundManager.SFX_BUS) + var music_bus := AudioServer.get_bus_index(CSoundManager.MUSIC_BUS) + + AudioServer.set_bus_volume_linear(master_bus, _master_volume/100.0) + AudioServer.set_bus_volume_linear(ui_bus, _ui_volume/100.0) + AudioServer.set_bus_volume_linear(sfx_bus, _sfx_volume/100.0) + AudioServer.set_bus_volume_linear(music_bus, _music_volume/100.0) + + +func _apply_window_scale() -> void: + if _fullscreen: return + + var new_size := window_base_size * _window_factor + + var current_position := DisplayServer.window_get_position() + var current_size := DisplayServer.window_get_size() + + var current_center := current_position + current_size / 2 + var new_position := current_center - new_size / 2 + + DisplayServer.window_set_size(new_size) + DisplayServer.window_set_position(new_position) + + _ensure_window_on_screen() + + +func _ensure_window_on_screen() -> void: + if _fullscreen: return + + var window_position := DisplayServer.window_get_position() + var window_size := DisplayServer.window_get_size() + var screen_size := DisplayServer.screen_get_size() + + var new_x : int = clamp(window_position.x, 0, screen_size.x - window_size.x) + var new_y : int = clamp(window_position.y, 0, screen_size.y - window_size.y) + + if new_x != window_position.x or new_y != window_position.y: + DisplayServer.window_set_position(Vector2i(new_x, new_y)) diff --git a/game/managers/settings_manager.gd.uid b/game/managers/settings_manager.gd.uid new file mode 100644 index 0000000..b62717a --- /dev/null +++ b/game/managers/settings_manager.gd.uid @@ -0,0 +1 @@ +uid://btol0m8w0msxk diff --git a/game/managers/settings_manager.tscn b/game/managers/settings_manager.tscn new file mode 100644 index 0000000..d867d4b --- /dev/null +++ b/game/managers/settings_manager.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://djdt3ply0g5um"] + +[ext_resource type="Script" uid="uid://btol0m8w0msxk" path="res://game/managers/settings_manager.gd" id="1_4nipk"] + +[node name="SettingsManager" type="Node"] +script = ExtResource("1_4nipk") diff --git a/game/managers/sound_manager.gd b/game/managers/sound_manager.gd new file mode 100644 index 0000000..b0db8a9 --- /dev/null +++ b/game/managers/sound_manager.gd @@ -0,0 +1,91 @@ +class_name CSoundManager +extends Node + + +const MASTER_BUS = "Master" +const UI_BUS = "UI" +const SFX_BUS = "SFX" +const MUSIC_BUS = "Music" + + +@export_group("Pitch settings", "pitch") +@export_range(0.9, 1.1, 0.01) var putch_ui_min := 1.0 +@export_range(0.9, 1.1, 0.01) var putch_ui_max := 1.0 +@export_range(0.9, 1.1, 0.01) var putch_sfx_min := 1.0 +@export_range(0.9, 1.1, 0.01) var putch_sfx_max := 1.0 + +@export_group("Number of players", "player_count") +@export_range(1, 10) var player_count_ui := 1 +@export_range(1, 100) var player_count_sfx := 1 + + + +var _ui_players : Array[AudioStreamPlayer] = [] +var _sfx_players : Array[AudioStreamPlayer2D] = [] +var _music_player : AudioStreamPlayer + + +func _ready() -> void: + _create_ui_players() + _create_sfx_players() + _create_music_player() + + +func play_ui_stream(stream: AudioStream) -> AudioStreamPlayer: + var player := _get_free_player(_ui_players) + player.stream = stream + player.pitch_scale = randf_range(putch_ui_min, putch_ui_max) + player.play() + return player + + +func play_sfx_stream(stream: AudioStream, position: Vector2) -> AudioStreamPlayer2D: + var player := _get_free_2d_player(_sfx_players) + player.stream = stream + player.pitch_scale = randf_range(putch_ui_min, putch_ui_max) + player.position = position + player.play() + return player + + +func play_music_stream(stream: AudioStream) -> AudioStreamPlayer: + _music_player.stream = stream + _music_player.play() + return _music_player + + +func _create_ui_players() -> void: + for i in range(player_count_ui): + var player : AudioStreamPlayer = AudioStreamPlayer.new() + player.bus = UI_BUS + _ui_players.append(player) + add_child(player) + + +func _create_sfx_players() -> void: + for i in range(player_count_sfx): + var player : AudioStreamPlayer2D = AudioStreamPlayer2D.new() + player.bus = SFX_BUS + _sfx_players.append(player) + add_child(player) + + +func _create_music_player() -> void: + var player : AudioStreamPlayer = AudioStreamPlayer.new() + player.bus = MUSIC_BUS + _music_player = player + add_child(player) + + +func _get_free_player(players: Array[AudioStreamPlayer]) -> AudioStreamPlayer: + for player in players: + if not player.playing: + return player + return players[0] + + +func _get_free_2d_player(players: Array[AudioStreamPlayer2D]) -> AudioStreamPlayer2D: + for player in players: + if not player.playing: + return player + return players[0] diff --git a/game/managers/sound_manager.gd.uid b/game/managers/sound_manager.gd.uid new file mode 100644 index 0000000..921533c --- /dev/null +++ b/game/managers/sound_manager.gd.uid @@ -0,0 +1 @@ +uid://cx5qcukr66whc diff --git a/game/managers/sound_manager.tscn b/game/managers/sound_manager.tscn new file mode 100644 index 0000000..31c49f6 --- /dev/null +++ b/game/managers/sound_manager.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=2 format=3 uid="uid://drk4dvbn78dva"] + +[ext_resource type="Script" uid="uid://cx5qcukr66whc" path="res://game/managers/sound_manager.gd" id="1_cg0sy"] + +[node name="SoundManager" type="Node"] +script = ExtResource("1_cg0sy") +putch_ui_min = 0.9500000000000001 +putch_ui_max = 1.05 +putch_sfx_min = 0.9500000000000001 +putch_sfx_max = 1.05 +player_count_ui = 4 +player_count_sfx = 25 diff --git a/game/menu/main_menu.gd b/game/menu/main_menu.gd new file mode 100644 index 0000000..b06300b --- /dev/null +++ b/game/menu/main_menu.gd @@ -0,0 +1,33 @@ +class_name MainMenu +extends Control + + +@onready var start_button : Button = $%StartButton +@onready var options_button : Button = $%OptionsButton +@onready var quit_button : Button = $%QuitButton + + +func _ready() -> void: + _init_focus() + _setup_neighbors() + + +func _init_focus() -> void: + start_button.grab_focus() + + +func _setup_neighbors() -> void: + start_button.focus_neighbor_top = quit_button.get_path() + quit_button.focus_neighbor_bottom = start_button.get_path() + + +func _on_start_button_pressed() -> void: + pass + + +func _on_options_button_pressed() -> void: + get_tree().change_scene_to_file("res://game/menu/options_menu.tscn") + + +func _on_quit_button_pressed() -> void: + get_tree().quit() diff --git a/game/menu/main_menu.gd.uid b/game/menu/main_menu.gd.uid new file mode 100644 index 0000000..6bbddf8 --- /dev/null +++ b/game/menu/main_menu.gd.uid @@ -0,0 +1 @@ +uid://c3wyvemy5hxs2 diff --git a/game/menu/main_menu.tscn b/game/menu/main_menu.tscn new file mode 100644 index 0000000..93bd3f4 --- /dev/null +++ b/game/menu/main_menu.tscn @@ -0,0 +1,65 @@ +[gd_scene load_steps=4 format=3 uid="uid://c4iica45gnke0"] + +[ext_resource type="Script" uid="uid://c3wyvemy5hxs2" path="res://game/menu/main_menu.gd" id="1_5d27k"] +[ext_resource type="Theme" uid="uid://bh56my8b2htnr" path="res://themes/menu.tres" id="2_qnvmd"] +[ext_resource type="Theme" uid="uid://lkf8obv8x5ve" path="res://themes/label.tres" id="3_i4f54"] + +[node name="MainMenu" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("2_qnvmd") +script = ExtResource("1_5d27k") + +[node name="ColorRect" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 1) + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 + +[node name="StartButton" type="Button" parent="MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "Start" + +[node name="OptionsButton" type="Button" parent="MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "Options" + +[node name="QuitButton" type="Button" parent="MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "Quit" + +[node name="CopyrightLabel" type="Label" parent="MarginContainer"] +layout_mode = 2 +size_flags_vertical = 1 +theme = ExtResource("3_i4f54") +text = "(c) Ruslan Ignatov 2026 +Powered by Godot Engine" +horizontal_alignment = 2 +vertical_alignment = 2 + +[connection signal="pressed" from="MarginContainer/VBoxContainer/StartButton" to="." method="_on_start_button_pressed"] +[connection signal="pressed" from="MarginContainer/VBoxContainer/OptionsButton" to="." method="_on_options_button_pressed"] +[connection signal="pressed" from="MarginContainer/VBoxContainer/QuitButton" to="." method="_on_quit_button_pressed"] diff --git a/game/menu/options_menu.gd b/game/menu/options_menu.gd new file mode 100644 index 0000000..102e2ee --- /dev/null +++ b/game/menu/options_menu.gd @@ -0,0 +1,118 @@ +class_name OptionsMenu +extends Control + + +const WINDOW_FACTOR = "window_factor" + + +signal back + + +@onready var fullscreen_button : CheckButton = $%FullscreenCheckButton +@onready var window_factor_buttons : HBoxContainer = $%WindowFactorContainer +@onready var back_button : Button = $%BackButton +@onready var master_slider : Slider = $%MasterSlider +@onready var ui_slider : Slider = $%UISlider +@onready var sfx_slider : Slider = $%SFXSlider +@onready var music_slider : Slider = $%MusicSlider + + +func _ready() -> void: + _connect_window_factor_buttons() + _load_current_settings() + _init_focus() + _setup_neighbors() + + +func _play_left_sound() -> bool: + return _play_side_sound(1, 0) + + +func _play_right_sound() -> bool: + return _play_side_sound(0, 1) + + +func _play_side_sound(offset_begin: int, offset_end: int) -> bool: + for i in range(offset_begin, window_factor_buttons.get_child_count() - offset_end): + var child := window_factor_buttons.get_child(i) + if child is Button and child.has_focus(): + return true + return false + + +func _connect_window_factor_buttons() -> void: + for child in window_factor_buttons.get_children(): + if child is Button: + var button : Button = child + button.pressed.connect(_on_window_factor_button_pressed.bind(button)) + + +func _on_visibility_changed() -> void: + if not is_node_ready(): return + if not visible: return + + _load_current_settings() + _init_focus() + _setup_neighbors() + + +func _init_focus() -> void: + fullscreen_button.grab_focus() + + +func _setup_neighbors() -> void: + music_slider.focus_neighbor_bottom = back_button.get_path() + + +func _load_current_settings() -> void: + fullscreen_button.button_pressed = SettingsManager.fullscreen + for child in window_factor_buttons.get_children(): + if child is Button: + var button : Button = child + var window_factor : int = button.get_meta(WINDOW_FACTOR, 0) + if window_factor == SettingsManager.window_factor: + button.button_pressed = true + _update_window_factor_disabled() + + master_slider.value = SettingsManager.master_volume + ui_slider.value = SettingsManager.ui_volume + sfx_slider.value = SettingsManager.sfx_volume + music_slider.value = SettingsManager.music_volume + + +func _update_window_factor_disabled() -> void: + for child in window_factor_buttons.get_children(): + if not child is Button: continue + child.disabled = SettingsManager.fullscreen + child.focus_mode = Control.FOCUS_NONE if SettingsManager.fullscreen else Control.FOCUS_ALL + + +func _on_fullscreen_check_button_toggled(toggled: bool) -> void: + SettingsManager.fullscreen = toggled + _update_window_factor_disabled() + + +func _on_back_button_pressed() -> void: + get_tree().change_scene_to_file("res://game/menu/main_menu.tscn") + + +func _on_window_factor_button_pressed(button: Button) -> void: + var window_factor : int = button.get_meta(WINDOW_FACTOR, 0) + if window_factor > 0: + SettingsManager.window_factor = window_factor + + +func _on_master_volume_changed(value: float) -> void: + SettingsManager.master_volume = floor(value) + + +func _on_ui_volume_changed(value: float) -> void: + SettingsManager.ui_volume = floor(value) + + +func _on_sfx_volume_changed(value: float) -> void: + SettingsManager.sfx_volume = floor(value) + + +func _on_music_volume_changed(value: float) -> void: + SettingsManager.music_volume = floor(value) diff --git a/game/menu/options_menu.gd.uid b/game/menu/options_menu.gd.uid new file mode 100644 index 0000000..26318d5 --- /dev/null +++ b/game/menu/options_menu.gd.uid @@ -0,0 +1 @@ +uid://cesv42oxhq2px diff --git a/game/menu/options_menu.tscn b/game/menu/options_menu.tscn new file mode 100644 index 0000000..07d42ac --- /dev/null +++ b/game/menu/options_menu.tscn @@ -0,0 +1,157 @@ +[gd_scene load_steps=5 format=3 uid="uid://b0uhlmrggp8xx"] + +[ext_resource type="Script" uid="uid://cesv42oxhq2px" path="res://game/menu/options_menu.gd" id="1_lq2ks"] +[ext_resource type="Theme" uid="uid://bh56my8b2htnr" path="res://themes/menu.tres" id="2_e2bp2"] + +[sub_resource type="InputEventAction" id="InputEventAction_e2bp2"] +action = &"ui_cancel" + +[sub_resource type="Shortcut" id="Shortcut_j72d6"] +events = [SubResource("InputEventAction_e2bp2")] + +[node name="OptionsMenu" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("2_e2bp2") +script = ExtResource("1_lq2ks") + +[node name="ColorRect" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 1) + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("2_e2bp2") + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 + +[node name="GridContainer" type="GridContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 3 +theme_override_constants/h_separation = 12 +theme_override_constants/v_separation = 17 +columns = 2 + +[node name="FullscreenLabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer"] +layout_mode = 2 + +[node name="FullscreenCheckButton" type="CheckButton" parent="MarginContainer/VBoxContainer/GridContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "Fullscreen" + +[node name="WindowFactorLabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer"] +layout_mode = 2 +text = "Window +factor" + +[node name="WindowFactorContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer/GridContainer"] +unique_name_in_owner = true +layout_mode = 2 + +[node name="ButtonX1" type="Button" parent="MarginContainer/VBoxContainer/GridContainer/WindowFactorContainer"] +layout_mode = 2 +text = "*1" +metadata/window_factor = 1 + +[node name="ButtonX2" type="Button" parent="MarginContainer/VBoxContainer/GridContainer/WindowFactorContainer"] +layout_mode = 2 +text = "*2" +metadata/window_factor = 2 + +[node name="ButtonX3" type="Button" parent="MarginContainer/VBoxContainer/GridContainer/WindowFactorContainer"] +layout_mode = 2 +text = "*3" +metadata/window_factor = 3 + +[node name="ButtonX4" type="Button" parent="MarginContainer/VBoxContainer/GridContainer/WindowFactorContainer"] +layout_mode = 2 +text = "*4" +metadata/window_factor = 4 + +[node name="ButtonX5" type="Button" parent="MarginContainer/VBoxContainer/GridContainer/WindowFactorContainer"] +layout_mode = 2 +text = "*5" +metadata/window_factor = 5 + +[node name="MasterLabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer"] +layout_mode = 2 +text = "Master" + +[node name="MasterSlider" type="HSlider" parent="MarginContainer/VBoxContainer/GridContainer"] +unique_name_in_owner = true +layout_mode = 2 +step = 10.0 +value = 50.0 +tick_count = 11 +ticks_on_borders = true +ticks_position = 3 + +[node name="UILabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer"] +layout_mode = 2 +text = "UI" + +[node name="UISlider" type="HSlider" parent="MarginContainer/VBoxContainer/GridContainer"] +unique_name_in_owner = true +layout_mode = 2 +step = 10.0 +tick_count = 11 +ticks_on_borders = true +ticks_position = 3 + +[node name="SFXLabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer"] +layout_mode = 2 +text = "SFX" + +[node name="SFXSlider" type="HSlider" parent="MarginContainer/VBoxContainer/GridContainer"] +unique_name_in_owner = true +layout_mode = 2 +step = 10.0 +tick_count = 11 +ticks_on_borders = true +ticks_position = 3 + +[node name="MusicLabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer"] +layout_mode = 2 +text = "Music" + +[node name="MusicSlider" type="HSlider" parent="MarginContainer/VBoxContainer/GridContainer"] +unique_name_in_owner = true +layout_mode = 2 +step = 10.0 +tick_count = 11 +ticks_on_borders = true +ticks_position = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 +alignment = 1 + +[node name="BackButton" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +shortcut = SubResource("Shortcut_j72d6") +text = "Back" + +[connection signal="toggled" from="MarginContainer/VBoxContainer/GridContainer/FullscreenCheckButton" to="." method="_on_fullscreen_check_button_toggled"] +[connection signal="value_changed" from="MarginContainer/VBoxContainer/GridContainer/MasterSlider" to="." method="_on_master_volume_changed"] +[connection signal="value_changed" from="MarginContainer/VBoxContainer/GridContainer/UISlider" to="." method="_on_ui_volume_changed"] +[connection signal="value_changed" from="MarginContainer/VBoxContainer/GridContainer/SFXSlider" to="." method="_on_sfx_volume_changed"] +[connection signal="value_changed" from="MarginContainer/VBoxContainer/GridContainer/MusicSlider" to="." method="_on_music_volume_changed"] +[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/BackButton" to="." method="_on_back_button_pressed"] diff --git a/game/objects/b_w_object.gd b/game/objects/b_w_object.gd new file mode 100644 index 0000000..43b43c6 --- /dev/null +++ b/game/objects/b_w_object.gd @@ -0,0 +1,10 @@ +class_name BWObject +extends Node2D + + +@export var is_colored := true +@export var is_white := true + + +func invert() -> void: + is_white = not is_white diff --git a/game/objects/b_w_object.gd.uid b/game/objects/b_w_object.gd.uid new file mode 100644 index 0000000..74f0f23 --- /dev/null +++ b/game/objects/b_w_object.gd.uid @@ -0,0 +1 @@ +uid://b7qut5xhc5hxo diff --git a/game/objects/b_w_object.tscn b/game/objects/b_w_object.tscn new file mode 100644 index 0000000..7f69fce --- /dev/null +++ b/game/objects/b_w_object.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=3 uid="uid://bgtb7602a2260"] + +[ext_resource type="Script" uid="uid://b7qut5xhc5hxo" path="res://game/objects/b_w_object.gd" id="1_jpa1b"] + +[node name="BlackAndWhiteObject" type="Node2D"] +script = ExtResource("1_jpa1b") + +[node name="Black" type="Node2D" parent="."] + +[node name="White" type="Node2D" parent="."] diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..c6bbb7d --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..1a31d16 --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://25jplsnkf61p" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/images/fonts/font16.png b/images/fonts/font16.png new file mode 100644 index 0000000..658a949 --- /dev/null +++ b/images/fonts/font16.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5fe6bf53384e1050b2ca8e6e3fb6274d94f2d1a4b5a9c98e3173a00a38ebb6c +size 2090 diff --git a/images/fonts/font16.png.import b/images/fonts/font16.png.import new file mode 100644 index 0000000..50f5eac --- /dev/null +++ b/images/fonts/font16.png.import @@ -0,0 +1,25 @@ +[remap] + +importer="font_data_image" +type="FontFile" +uid="uid://b7myfapuyueyy" +path="res://.godot/imported/font16.png-8508fb402c2297494648b96d293d0e34.fontdata" + +[deps] + +source_file="res://images/fonts/font16.png" +dest_files=["res://.godot/imported/font16.png-8508fb402c2297494648b96d293d0e34.fontdata"] + +[params] + +character_ranges=PackedStringArray("\' \'-\'~\'") +kerning_pairs=PackedStringArray() +columns=94 +rows=1 +image_margin=Rect2i(0, 0, 0, 0) +character_margin=Rect2i(0, 0, 0, 0) +ascent=0 +descent=0 +fallbacks=[] +compress=true +scaling_mode=0 diff --git a/images/fonts/font8.png b/images/fonts/font8.png new file mode 100644 index 0000000..af50f6d --- /dev/null +++ b/images/fonts/font8.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7228f928f062c70f925192d4eb2bb04d52425f75961e396d6bcf3dbdc255516 +size 841 diff --git a/images/fonts/font8.png.import b/images/fonts/font8.png.import new file mode 100644 index 0000000..26cc405 --- /dev/null +++ b/images/fonts/font8.png.import @@ -0,0 +1,25 @@ +[remap] + +importer="font_data_image" +type="FontFile" +uid="uid://dxal4vyl0jy4c" +path="res://.godot/imported/font8.png-d37c339899adda35b5ea0bd08bc26657.fontdata" + +[deps] + +source_file="res://images/fonts/font8.png" +dest_files=["res://.godot/imported/font8.png-d37c339899adda35b5ea0bd08bc26657.fontdata"] + +[params] + +character_ranges=PackedStringArray("\' \'-\'~\'") +kerning_pairs=PackedStringArray() +columns=94 +rows=1 +image_margin=Rect2i(0, 0, 0, 0) +character_margin=Rect2i(0, 0, 0, 0) +ascent=0 +descent=0 +fallbacks=[] +compress=true +scaling_mode=0 diff --git a/images/menu/buttons.png b/images/menu/buttons.png new file mode 100644 index 0000000..8c27ab0 --- /dev/null +++ b/images/menu/buttons.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f91fb3eb315abeba8f10cef7df0a06dd121a4c7ce2b23d46122c6d8d37b2e7b9 +size 518 diff --git a/images/menu/buttons.png.import b/images/menu/buttons.png.import new file mode 100644 index 0000000..df97e1b --- /dev/null +++ b/images/menu/buttons.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cw83q4jr80n4d" +path="res://.godot/imported/buttons.png-ee0aaf8a4bfe900c7d5c12efe95cc11b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://images/menu/buttons.png" +dest_files=["res://.godot/imported/buttons.png-ee0aaf8a4bfe900c7d5c12efe95cc11b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..3473822 --- /dev/null +++ b/project.godot @@ -0,0 +1,83 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="OneBitGameJam8" +run/main_scene="uid://c4iica45gnke0" +config/features=PackedStringArray("4.5", "GL Compatibility") +config/icon="res://icon.svg" + +[autoload] + +SettingsManager="*res://game/managers/settings_manager.tscn" +SoundManager="*res://game/managers/sound_manager.tscn" + +[display] + +window/size/viewport_width=640 +window/size/viewport_height=360 +window/stretch/mode="viewport" +window/stretch/scale_mode="integer" + +[input] + +ui_accept={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194310,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null) +] +} +ui_cancel={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194305,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":1,"pressure":0.0,"pressed":true,"script":null) +] +} +ui_left={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null) +] +} +ui_right={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194321,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) +] +} +ui_up={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194320,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":11,"pressure":0.0,"pressed":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null) +] +} +ui_down={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194322,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) +] +} + +[rendering] + +textures/canvas_textures/default_texture_filter=0 +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" diff --git a/themes/label.tres b/themes/label.tres new file mode 100644 index 0000000..922c84a --- /dev/null +++ b/themes/label.tres @@ -0,0 +1,6 @@ +[gd_resource type="Theme" load_steps=2 format=3 uid="uid://lkf8obv8x5ve"] + +[ext_resource type="FontFile" uid="uid://dxal4vyl0jy4c" path="res://images/fonts/font8.png" id="1_uq1ai"] + +[resource] +default_font = ExtResource("1_uq1ai") diff --git a/themes/menu.tres b/themes/menu.tres new file mode 100644 index 0000000..123741f --- /dev/null +++ b/themes/menu.tres @@ -0,0 +1,195 @@ +[gd_resource type="Theme" load_steps=31 format=3 uid="uid://bh56my8b2htnr"] + +[ext_resource type="Texture2D" uid="uid://cw83q4jr80n4d" path="res://images/menu/buttons.png" id="1_6tgry"] +[ext_resource type="FontFile" uid="uid://b7myfapuyueyy" path="res://images/fonts/font16.png" id="1_xavh1"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_xavh1"] +texture = ExtResource("1_6tgry") +texture_margin_left = 4.0 +texture_margin_top = 6.0 +texture_margin_right = 4.0 +texture_margin_bottom = 6.0 +region_rect = Rect2(0, 32, 16, 16) + +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_im3bc"] +load_path = "res://.godot/imported/buttons.png-ee0aaf8a4bfe900c7d5c12efe95cc11b.ctex" + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_pw0cd"] +texture = SubResource("CompressedTexture2D_im3bc") +texture_margin_left = 4.0 +texture_margin_top = 6.0 +texture_margin_right = 4.0 +texture_margin_bottom = 6.0 +region_rect = Rect2(16, 32, 16, 16) + +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_6tgry"] +load_path = "res://.godot/imported/buttons.png-ee0aaf8a4bfe900c7d5c12efe95cc11b.ctex" + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_im3bc"] +texture = SubResource("CompressedTexture2D_6tgry") +texture_margin_left = 4.0 +texture_margin_top = 6.0 +texture_margin_right = 4.0 +texture_margin_bottom = 6.0 +region_rect = Rect2(16, 0, 16, 16) + +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_rukvw"] +load_path = "res://.godot/imported/buttons.png-ee0aaf8a4bfe900c7d5c12efe95cc11b.ctex" + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_0mtrw"] +texture = SubResource("CompressedTexture2D_rukvw") +texture_margin_left = 4.0 +texture_margin_top = 6.0 +texture_margin_right = 4.0 +texture_margin_bottom = 6.0 +region_rect = Rect2(16, 16, 16, 16) + +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_pw0cd"] +load_path = "res://.godot/imported/buttons.png-ee0aaf8a4bfe900c7d5c12efe95cc11b.ctex" + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_rukvw"] +texture = SubResource("CompressedTexture2D_pw0cd") +texture_margin_left = 4.0 +texture_margin_top = 6.0 +texture_margin_right = 4.0 +texture_margin_bottom = 6.0 +region_rect = Rect2(0, 0, 16, 16) + +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_be6oh"] +load_path = "res://.godot/imported/buttons.png-ee0aaf8a4bfe900c7d5c12efe95cc11b.ctex" + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_cg3em"] +texture = SubResource("CompressedTexture2D_be6oh") +texture_margin_left = 4.0 +texture_margin_top = 6.0 +texture_margin_right = 4.0 +texture_margin_bottom = 6.0 +region_rect = Rect2(0, 16, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6tgry"] +atlas = ExtResource("1_6tgry") +region = Rect2(112, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_im3bc"] +atlas = ExtResource("1_6tgry") +region = Rect2(112, 0, 16, 16) + +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_0mtrw"] +load_path = "res://.godot/imported/buttons.png-ee0aaf8a4bfe900c7d5c12efe95cc11b.ctex" + +[sub_resource type="AtlasTexture" id="AtlasTexture_be6oh"] +atlas = SubResource("CompressedTexture2D_0mtrw") +region = Rect2(128, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cg3em"] +atlas = SubResource("CompressedTexture2D_0mtrw") +region = Rect2(128, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pw0cd"] +atlas = ExtResource("1_6tgry") +region = Rect2(112, 32, 16, 16) + +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_cg3em"] +load_path = "res://.godot/imported/buttons.png-ee0aaf8a4bfe900c7d5c12efe95cc11b.ctex" + +[sub_resource type="AtlasTexture" id="AtlasTexture_2yrsw"] +atlas = SubResource("CompressedTexture2D_cg3em") +region = Rect2(128, 32, 16, 16) + +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_hd55h"] +load_path = "res://.godot/imported/buttons.png-ee0aaf8a4bfe900c7d5c12efe95cc11b.ctex" + +[sub_resource type="AtlasTexture" id="AtlasTexture_bpsgu"] +atlas = SubResource("CompressedTexture2D_hd55h") +region = Rect2(144, 32, 16, 16) + +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_cloxk"] +load_path = "res://.godot/imported/buttons.png-ee0aaf8a4bfe900c7d5c12efe95cc11b.ctex" + +[sub_resource type="AtlasTexture" id="AtlasTexture_fbcv1"] +atlas = SubResource("CompressedTexture2D_cloxk") +region = Rect2(160, 32, 16, 16) + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_pwq8t"] +texture = ExtResource("1_6tgry") +texture_margin_left = 2.0 +texture_margin_top = 1.0 +texture_margin_right = 2.0 +texture_margin_bottom = 1.0 +region_rect = Rect2(144, 16, 16, 16) + +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_ydsdf"] +load_path = "res://.godot/imported/buttons.png-ee0aaf8a4bfe900c7d5c12efe95cc11b.ctex" + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_l4uxn"] +texture = SubResource("CompressedTexture2D_ydsdf") +texture_margin_left = 3.0 +texture_margin_top = 5.0 +texture_margin_right = 3.0 +texture_margin_bottom = 5.0 +region_rect = Rect2(160, 16, 16, 16) + +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_8ha7l"] +load_path = "res://.godot/imported/buttons.png-ee0aaf8a4bfe900c7d5c12efe95cc11b.ctex" + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_6w2m0"] +texture = SubResource("CompressedTexture2D_8ha7l") +texture_margin_left = 3.0 +texture_margin_top = 7.0 +texture_margin_right = 3.0 +texture_margin_bottom = 7.0 +expand_margin_top = 1.0 +expand_margin_bottom = 1.0 +region_rect = Rect2(144, 0, 32, 16) + +[resource] +default_font = ExtResource("1_xavh1") +Button/colors/font_color = Color(1, 1, 1, 1) +Button/colors/font_disabled_color = Color(1, 1, 1, 1) +Button/colors/font_focus_color = Color(1, 1, 1, 1) +Button/colors/font_hover_color = Color(1, 1, 1, 1) +Button/colors/font_hover_pressed_color = Color(1, 1, 1, 1) +Button/colors/font_outline_color = Color(0, 0, 0, 1) +Button/colors/font_pressed_color = Color(1, 1, 1, 1) +Button/colors/icon_disabled_color = Color(1, 1, 1, 1) +Button/colors/icon_focus_color = Color(1, 1, 1, 1) +Button/colors/icon_hover_color = Color(1, 1, 1, 1) +Button/colors/icon_hover_pressed_color = Color(1, 1, 1, 1) +Button/colors/icon_normal_color = Color(1, 1, 1, 1) +Button/colors/icon_pressed_color = Color(1, 1, 1, 1) +Button/styles/disabled = SubResource("StyleBoxTexture_xavh1") +Button/styles/focus = SubResource("StyleBoxTexture_pw0cd") +Button/styles/hover = SubResource("StyleBoxTexture_im3bc") +Button/styles/hover_pressed = SubResource("StyleBoxTexture_0mtrw") +Button/styles/normal = SubResource("StyleBoxTexture_rukvw") +Button/styles/pressed = SubResource("StyleBoxTexture_cg3em") +CheckButton/colors/button_checked_color = Color(1, 1, 1, 1) +CheckButton/colors/button_unchecked_color = Color(1, 1, 1, 1) +CheckButton/colors/font_color = Color(1, 1, 1, 1) +CheckButton/colors/font_disabled_color = Color(1, 1, 1, 1) +CheckButton/colors/font_focus_color = Color(1, 1, 1, 1) +CheckButton/colors/font_hover_color = Color(1, 1, 1, 1) +CheckButton/colors/font_hover_pressed_color = Color(1, 1, 1, 1) +CheckButton/colors/font_outline_color = Color(0, 0, 0, 1) +CheckButton/colors/font_pressed_color = Color(1, 1, 1, 1) +CheckButton/colors/icon_disabled_color = Color(0, 0, 0, 1) +CheckButton/colors/icon_focus_color = Color(0, 0, 0, 1) +CheckButton/colors/icon_hover_color = Color(0, 0, 0, 1) +CheckButton/colors/icon_hover_pressed_color = Color(0, 0, 0, 1) +CheckButton/colors/icon_normal_color = Color(0, 0, 0, 1) +CheckButton/colors/icon_pressed_color = Color(0, 0, 0, 1) +CheckButton/icons/checked = SubResource("AtlasTexture_6tgry") +CheckButton/icons/checked_disabled = SubResource("AtlasTexture_im3bc") +CheckButton/icons/unchecked = SubResource("AtlasTexture_be6oh") +CheckButton/icons/unchecked_disabled = SubResource("AtlasTexture_cg3em") +HSlider/icons/grabber = SubResource("AtlasTexture_pw0cd") +HSlider/icons/grabber_disabled = SubResource("AtlasTexture_2yrsw") +HSlider/icons/grabber_highlight = SubResource("AtlasTexture_bpsgu") +HSlider/icons/tick = SubResource("AtlasTexture_fbcv1") +HSlider/styles/grabber_area = SubResource("StyleBoxTexture_pwq8t") +HSlider/styles/grabber_area_highlight = SubResource("StyleBoxTexture_l4uxn") +HSlider/styles/slider = SubResource("StyleBoxTexture_6w2m0") +MarginContainer/constants/margin_bottom = 10 +MarginContainer/constants/margin_left = 10 +MarginContainer/constants/margin_right = 10 +MarginContainer/constants/margin_top = 10