Added main menu

This commit is contained in:
2026-06-27 17:31:24 +03:00
parent 67db40fa46
commit f9c4bd373a
28 changed files with 926 additions and 0 deletions
+150
View File
@@ -0,0 +1,150 @@
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 := 50
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 OS.get_name() == "Web": return
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 + Vector2i(current_size / 2.0)
var new_position := current_center - Vector2i(new_size / 2.0)
DisplayServer.window_set_size(new_size)
DisplayServer.window_set_position(new_position)
+1
View File
@@ -0,0 +1 @@
uid://bygmkd5m8mfxn
+6
View File
@@ -0,0 +1,6 @@
[gd_scene format=3 uid="uid://cuyv26utj07j4"]
[ext_resource type="Script" uid="uid://bygmkd5m8mfxn" path="res://game/managers/settings_manager.gd" id="1_4nipk"]
[node name="SettingsManager" type="Node" unique_id=261462227]
script = ExtResource("1_4nipk")
+103
View File
@@ -0,0 +1,103 @@
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
@export_group("UI Streams", "ui_stream")
@export var ui_stream_accept : AudioStream
@export var ui_stream_decline : AudioStream
@export var ui_stream_select : AudioStream
@export_group("SFX Streams", "sfx_stream")
@export_group("Music Streams", "music_stream")
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:
if _music_player.stream == stream: return
_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]
+1
View File
@@ -0,0 +1 @@
uid://dh2awtco3curi
+14
View File
@@ -0,0 +1,14 @@
[gd_scene format=3 uid="uid://b5wqc1hgwcdm4"]
[ext_resource type="Script" uid="uid://dh2awtco3curi" path="res://game/managers/sound_manager.gd" id="1_cg0sy"]
[ext_resource type="AudioStream" uid="uid://cwmibbhy2fpq2" path="res://sound/ui/accept.wav" id="2_ge1il"]
[ext_resource type="AudioStream" uid="uid://d2tsomsqmhf0h" path="res://sound/ui/decline.wav" id="3_agyxs"]
[ext_resource type="AudioStream" uid="uid://cfb2adf5hft7b" path="res://sound/ui/select.wav" id="4_0i6kl"]
[node name="SoundManager" type="Node" unique_id=1576371552]
script = ExtResource("1_cg0sy")
player_count_ui = 8
player_count_sfx = 32
ui_stream_accept = ExtResource("2_ge1il")
ui_stream_decline = ExtResource("3_agyxs")
ui_stream_select = ExtResource("4_0i6kl")