Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
53d14c4
[FEATURE] Convert Hard-Coded Globals to Godot Resource #285
ikostan Feb 27, 2026
1982061
Update game_settings_resource.gd
ikostan Feb 27, 2026
400e78a
Update globals.gd
ikostan Feb 27, 2026
e212545
Update game_settings_resource.gd
ikostan Feb 27, 2026
1ca05bd
Constrain current_log_level to valid enum range (0–4).
ikostan Feb 27, 2026
f382531
Update scripts/globals.gd
ikostan Feb 27, 2026
b6d3623
Merge branch 'convert-hard-coded-globals-to-godot-resource' of https:…
ikostan Feb 27, 2026
968ac38
Update test_globals_resource.gd
ikostan Feb 27, 2026
158f433
Update .deepsource.toml
ikostan Feb 27, 2026
ad03e14
Update .deepsource.toml
ikostan Feb 27, 2026
358337e
Update .deepsource.toml
ikostan Feb 27, 2026
23b2b92
Update test_combined_multi_manager_loads.gd
ikostan Feb 27, 2026
c5a163c
Update input_remap_button.gd
ikostan Feb 27, 2026
9a00740
Update test_error_edge_cases.gd
ikostan Feb 27, 2026
37889b8
Update input_remap_button.gd
ikostan Feb 27, 2026
2941379
Update input_remap_button.gd
ikostan Feb 27, 2026
a8ee991
Update test_input_remap_ec.gd
ikostan Feb 27, 2026
0f4aa3d
Update test_key_mapping_menu.gd
ikostan Feb 27, 2026
dbd0e20
Update test_preserve_other_sections.gd
ikostan Feb 27, 2026
d2f9a84
Update input_remap_button.gd
ikostan Feb 27, 2026
de68efd
Update test_difficulty_integration.gd
ikostan Feb 28, 2026
b300599
Update test_options_teardown.gd
ikostan Feb 28, 2026
c91143b
Update test_difficulty.gd
ikostan Feb 28, 2026
41fc04c
Update test_load_options_reentrancy.gd
ikostan Feb 28, 2026
b384a90
Update test_player.gd
ikostan Feb 28, 2026
e810f19
Update test_settings_persistence.gd
ikostan Feb 28, 2026
2a3e3cb
Update test_globals.gd
ikostan Feb 28, 2026
78cd5b4
Update test_globals.gd
ikostan Feb 28, 2026
e598dbf
Update test_settings_persistence.gd
ikostan Feb 28, 2026
5a61f35
Update test_load_options_reentrancy.gd
ikostan Feb 28, 2026
da96cb4
Update test_player.gd
ikostan Feb 28, 2026
944c4c3
Update test_difficulty.gd
ikostan Feb 28, 2026
883285a
Update test_player.gd
ikostan Feb 28, 2026
9307cbc
Update test_difficulty_integration.gd
ikostan Feb 28, 2026
8e81887
Update test_globals.gd
ikostan Feb 28, 2026
5d528f8
Update test_player.gd
ikostan Feb 28, 2026
20786ce
Update test_settings_persistence.gd
ikostan Feb 28, 2026
b62b457
Update .deepsource.toml
ikostan Feb 28, 2026
bd36f56
Update .deepsource.toml
ikostan Feb 28, 2026
1d6e00a
Update .deepsource.toml
ikostan Feb 28, 2026
b7ec7c3
Update game_settings_resource.gd
ikostan Mar 1, 2026
175cb87
Range-warning logic is unreachable after setter clamping.
ikostan Mar 1, 2026
a73fdcf
Update game_settings_resource.gd
ikostan Mar 1, 2026
4056d9b
test_logging_default_level is tautological right now.
ikostan Mar 1, 2026
82a5183
Update test_globals_resource.gd
ikostan Mar 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions .deepsource.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,14 @@ name = "python"
enabled = true

[analyzers.meta]
runtime_version = "3.12"
# Path to your Playwright tests
# If 3.x.x is rejected, "3" is the most stable alias for the latest 3.x runtime.
runtime_version = "3"
test_patterns = ["tests/**/*.py", "**/test_*.py"]

[[analyzers]]
name = "javascript"
enabled = true

[[analyzers]]
name = "html"
enabled = true

[[transformers]]
name = "black"
enabled = true
Expand Down
6 changes: 3 additions & 3 deletions scripts/advanced_settings.gd
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ func _ready() -> void:
log_lvl_option.add_item(level) # "Debug", "Info", etc.
log_lvl_option.add_item("NONE") # Manual for title case
# Set to current log level (find index by enum value)
var current_value: int = Globals.current_log_level
var current_value: int = Globals.settings.current_log_level
var index: int = Globals.LogLevel.values().find(current_value)
if index != -1:
log_lvl_option.selected = index
Expand Down Expand Up @@ -162,7 +162,7 @@ func _unset_advanced_window_callbacks() -> void:
func _on_advanced_reset_button_pressed() -> void:
Globals.log_message("Advanced Settings reset pressed.", Globals.LogLevel.DEBUG)
# Log level should be reset to INFO
Globals.current_log_level = Globals.LogLevel.INFO
Globals.settings.current_log_level = Globals.LogLevel.INFO
log_lvl_option.selected = Globals.LogLevel.values().find(Globals.LogLevel.INFO)
Globals._save_settings()

Expand Down Expand Up @@ -264,7 +264,7 @@ func _on_log_level_item_selected(index: int) -> void:
var selected_enum: Globals.LogLevel = log_level_display_to_enum.get(
selected_name, Globals.LogLevel.INFO
)
Globals.current_log_level = selected_enum
Globals.settings.current_log_level = selected_enum
log_lvl_option.selected = Globals.LogLevel.values().find(selected_enum)
# Temporary raw print to bypass log_message
Globals.log_message("Log level changed to: " + selected_name, Globals.LogLevel.DEBUG)
Expand Down
2 changes: 1 addition & 1 deletion scripts/bullet.gd
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func fire() -> void:
return
can_fire = false

var scaled_cooldown: float = fire_rate * Globals.difficulty
var scaled_cooldown: float = fire_rate * Globals.settings.difficulty
timer.start(scaled_cooldown)

# LOG
Expand Down
39 changes: 39 additions & 0 deletions scripts/game_settings_resource.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
## Copyright (C) 2026 Egor Kostan
## SPDX-License-Identifier: GPL-3.0-or-later
## game_settings_resource.gd
##
## DATA CONTAINER: This Resource serves as the central "Source of Truth" for game configuration.
## It decouples static data (difficulty, paths, log levels) from logic found in Globals.gd.
## By using a Resource instead of hard-coded variables, settings can be swapped at runtime
## or modified visually via the Godot Inspector without touching the codebase.

class_name GameSettingsResource
extends Resource

@export_group("Logging")
# Current log level: 0=DEBUG, 1=INFO, 2=WARNING, 3=ERROR, 4=NONE
@export_range(0, 4, 1) var current_log_level: int = 1
@export var enable_debug_logging: bool = false

@export_group("Gameplay")
# Multiplier: 1.0=Normal, <1=Easy, >1=Hard
# In globals.gd, change the difficulty variable in the Resource script:
# game_settings_resource.gd
@export var difficulty: float = 1.0:
set(value):
if value < 0.5 or value > 2.0:
Globals.log_message(
"Invalid difficulty loaded (" + str(value) + ") - clamping to valid range.",
Globals.LogLevel.WARNING
)
_difficulty = clamp(value, 0.5, 2.0)
get:
return _difficulty

@export_group("UI & Scenes")
@export var remap_prompt_keyboard: String = "Press a key..."
@export var remap_prompt_gamepad: String = "Press a gamepad button/axis..."
@export var key_mapping_scene: PackedScene = preload("res://scenes/key_mapping_menu.tscn")
@export var options_scene: PackedScene = preload("res://scenes/options_menu.tscn")
Comment thread
coderabbitai[bot] marked this conversation as resolved.

var _difficulty: float = 1.0
1 change: 1 addition & 0 deletions scripts/game_settings_resource.gd.uid
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://cgtk0ximoo5ty
8 changes: 4 additions & 4 deletions scripts/gameplay_settings.gd
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ func _ready() -> void:

difficulty_slider.value_changed.connect(_on_difficulty_value_changed)
# Set initial difficulty label (sync with global)
difficulty_slider.value = Globals.difficulty
difficulty_label.text = "{" + str(Globals.difficulty) + "}"
difficulty_slider.value = Globals.settings.difficulty
difficulty_label.text = "{" + str(Globals.settings.difficulty) + "}"
# Back button
if not gameplay_back_button.pressed.is_connected(_on_gameplay_back_button_pressed):
gameplay_back_button.pressed.connect(_on_gameplay_back_button_pressed)
Expand Down Expand Up @@ -238,8 +238,8 @@ func _on_difficulty_value_changed(value: float) -> void:
## :param value: The new slider value.
## :type value: float
## :rtype: void
Globals.difficulty = value
difficulty_slider.value = Globals.difficulty
Globals.settings.difficulty = value
difficulty_slider.value = Globals.settings.difficulty
difficulty_label.text = "{" + str(value) + "}"
Globals.log_message("Difficulty changed to: " + str(value), Globals.LogLevel.DEBUG)
Globals._save_settings()
Expand Down
65 changes: 33 additions & 32 deletions scripts/globals.gd
Original file line number Diff line number Diff line change
Expand Up @@ -11,32 +11,35 @@ enum LogLevel { DEBUG, INFO, WARNING, ERROR, NONE = 4 }
# Shared constants
## Device-specific remap prompts to avoid layout shift.
# const REMAP_PROMPT_TEXT: String = "Press a key or controller button/axis..."
const REMAP_PROMPT_KEYBOARD: String = "Press a key..."
const REMAP_PROMPT_GAMEPAD: String = "Press a gamepad button/axis..."
# const REMAP_PROMPT_KEYBOARD: String = "Press a key..."
# const REMAP_PROMPT_GAMEPAD: String = "Press a gamepad button/axis..."

@export var current_log_level: LogLevel = LogLevel.INFO # Default: Show INFO and above
@export var enable_debug_logging: bool = false # Toggle in Inspector or settings
@export var difficulty: float = 1.0 # Multiplier: 1.0=Normal, <1=Easy, >1=Hard
# @export var current_log_level: LogLevel = LogLevel.INFO # Default: Show INFO and above
# @export var enable_debug_logging: bool = false # Toggle in Inspector or settings
# @export var difficulty: float = 1.0 # Multiplier: 1.0=Normal, <1=Easy, >1=Hard

# Add the resource reference here
@export var settings: GameSettingsResource = preload("res://settings/default_settings.tres")

# In globals.gd (add after @export vars)
var options_instance: CanvasLayer = null
# var hidden_menu: Node = null
var hidden_menus: Array[Node] = []
var options_open: bool = false
## Key Mapping scene for direct loading from warning dialogs.
var key_mapping_scene: PackedScene = preload("res://scenes/key_mapping_menu.tscn")
# var key_mapping_scene: PackedScene = preload("res://scenes/key_mapping_menu.tscn")
var previous_scene: String = "res://scenes/main_menu.tscn" # Default fallback
var options_scene: PackedScene = preload("res://scenes/options_menu.tscn")
# var options_scene: PackedScene = preload("res://scenes/options_menu.tscn")
var next_scene: String = "" # Path to the next scene to load via loading screen.
## Last selected input device for UI messages and labels.
## Updated when player toggles Keyboard/Gamepad in Key Mapping.
var current_input_device: String = "keyboard" # "keyboard" or "gamepad"


func _ready() -> void:
if Engine.is_editor_hint() or enable_debug_logging:
current_log_level = LogLevel.DEBUG
log_message("Log level set to: " + LogLevel.keys()[current_log_level], LogLevel.DEBUG)
if Engine.is_editor_hint() or settings.enable_debug_logging:
settings.current_log_level = LogLevel.DEBUG
log_message("Log level set to: " + LogLevel.keys()[settings.current_log_level], LogLevel.DEBUG)
_load_settings() # Load persisted settings first
Comment thread
coderabbitai[bot] marked this conversation as resolved.
# Load last input device early to fix unbound warning on first load when
# gamepad is saved preference.
Expand Down Expand Up @@ -98,8 +101,15 @@ func load_key_mapping(menu_to_hide: Node) -> void:
if is_instance_valid(video):
video.visible = true
video.process_mode = Node.PROCESS_MODE_ALWAYS # keep playing

var km_instance: CanvasLayer = key_mapping_scene.instantiate()
# FIX: We must call .instantiate() on the PackedScene inside settings
if settings.key_mapping_scene == null:
log_message("Error: Key mapping scene not configured.", LogLevel.ERROR)
if not hidden_menus.is_empty():
var prev_menu: Node = hidden_menus.pop_back()
if is_instance_valid(prev_menu):
prev_menu.visible = true
return
var km_instance: CanvasLayer = settings.key_mapping_scene.instantiate()
get_tree().root.add_child(km_instance)
Comment thread
ikostan marked this conversation as resolved.


Expand All @@ -118,9 +128,10 @@ func _load_settings(path: String = Settings.CONFIG_PATH) -> void:
and loaded_log_level >= LogLevel.DEBUG
and loaded_log_level <= LogLevel.NONE
):
current_log_level = loaded_log_level
settings.current_log_level = loaded_log_level
log_message(
"Loaded saved log level: " + LogLevel.keys()[current_log_level], LogLevel.DEBUG
"Loaded saved log level: " + LogLevel.keys()[settings.current_log_level],
LogLevel.DEBUG
)
else:
log_message(
Expand All @@ -131,19 +142,9 @@ func _load_settings(path: String = Settings.CONFIG_PATH) -> void:
if config.has_section_key("Settings", "difficulty"):
var loaded_difficulty: Variant = config.get_value("Settings", "difficulty")
if (loaded_difficulty is float) or (loaded_difficulty is int):
difficulty = loaded_difficulty
# Validate and clamp difficulty to slider range (0.5-2.0)
if difficulty < 0.5 or difficulty > 2.0:
log_message(
(
"Invalid difficulty loaded ("
+ str(difficulty)
+ ") - clamping to valid range."
),
LogLevel.WARNING
)
difficulty = clamp(difficulty, 0.5, 2.0)
log_message("Loaded saved difficulty: " + str(difficulty), LogLevel.DEBUG)
settings.difficulty = loaded_difficulty
log_message("Loaded saved difficulty: " + str(settings.difficulty), LogLevel.DEBUG)
else:
log_message(
"Invalid type for difficulty: " + str(typeof(loaded_difficulty)),
Expand All @@ -165,8 +166,8 @@ func _save_settings(path: String = Settings.CONFIG_PATH) -> void:
)
return

config.set_value("Settings", "log_level", current_log_level)
config.set_value("Settings", "difficulty", difficulty)
config.set_value("Settings", "log_level", settings.current_log_level)
config.set_value("Settings", "difficulty", settings.difficulty)
err = config.save(path)
if err != OK:
log_message("Failed to save settings: " + str(err), LogLevel.ERROR)
Expand Down Expand Up @@ -216,11 +217,11 @@ func load_options(menu_to_hide: Node) -> void:
menu_to_hide.visible = false
log_message("Hiding menu: " + menu_to_hide.name, LogLevel.DEBUG)

if options_scene:
if settings.options_scene:
## Set flag before adding child to block pause immediately.
options_open = true # Set early as before

options_instance = options_scene.instantiate()
# FIX: Assign the instance to the global variable
options_instance = settings.options_scene.instantiate()
if options_instance == null:
log_message("Failed to instantiate options scene—resetting flag.", LogLevel.ERROR)
options_open = false # Reset to avoid stuck state
Expand All @@ -246,7 +247,7 @@ func load_options(menu_to_hide: Node) -> void:
# @param message: The string message to log.
# @param level: The log level (default INFO).
func log_message(message: String, level: LogLevel = LogLevel.INFO) -> void:
if level < current_log_level:
if level < settings.current_log_level:
return # Skip if below threshold
var level_str: String = LogLevel.keys()[level] # Converts enum to string: "INFO", etc.
var timestamp: String = Time.get_datetime_string_from_system()
Expand Down
6 changes: 3 additions & 3 deletions scripts/input_remap_button.gd
Original file line number Diff line number Diff line change
Expand Up @@ -116,11 +116,11 @@ func _ready() -> void:
func _on_pressed() -> void:
listening = button_pressed
if listening:
# Use tailored prompt based on current device (no layout expansion)
# FIXED: Check the actual current_device to return the correct prompt
text = (
Globals.REMAP_PROMPT_KEYBOARD
Globals.settings.remap_prompt_keyboard
if current_device == DeviceType.KEYBOARD
else Globals.REMAP_PROMPT_GAMEPAD
else Globals.settings.remap_prompt_gamepad
)
else:
update_button_text()
Expand Down
2 changes: 1 addition & 1 deletion scripts/main_scene.gd
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ func setup_decor_layer(viewport: Vector2) -> void:


func _process(delta: float) -> void:
var scroll_speed: float = player.speed["speed"] * delta * Globals.difficulty * 0.8
var scroll_speed: float = player.speed["speed"] * delta * Globals.settings.difficulty * 0.8
background.scroll_offset.y += scroll_speed
if player.fuel["fuel"] <= 0:
background.scroll_offset = Vector2(0, 0)
Expand Down
2 changes: 1 addition & 1 deletion scripts/player.gd
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,7 @@ func _on_fuel_timer_timeout() -> void:
# to avoid excessive drain at out-of-range speeds
var normalized_speed: float = clamp(speed["speed"] / MAX_SPEED, 0.0, 1.0)
var fuel_left: float = (
fuel["fuel"] - ((base_fuel_drain * normalized_speed) * Globals.difficulty)
fuel["fuel"] - ((base_fuel_drain * normalized_speed) * Globals.settings.difficulty)
)
#
# Clamp and update current_fuel first
Expand Down
9 changes: 9 additions & 0 deletions settings/default_settings.tres
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[gd_resource type="Resource" script_class="GameSettingsResource" load_steps=4 format=3 uid="uid://28t4yno1suni"]

[ext_resource type="PackedScene" uid="uid://dxep4xm1sl8im" path="res://scenes/key_mapping_menu.tscn" id="1_qho2n"]
[ext_resource type="PackedScene" uid="uid://cl4m4q2eurcn0" path="res://scenes/options_menu.tscn" id="2_b4w4u"]
[ext_resource type="Script" uid="uid://cgtk0ximoo5ty" path="res://scripts/game_settings_resource.gd" id="3_qb8m4"]

[resource]
script = ExtResource("3_qb8m4")
metadata/_custom_type_script = "uid://cgtk0ximoo5ty"
18 changes: 9 additions & 9 deletions test/gdunit4/test_difficulty.gd
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ const TestHelpers = preload("res://test/gdunit4/test_helpers.gd")
var original_difficulty: float # Snapshot holder

func before_test() -> void:
original_difficulty = Globals.difficulty # Snapshot before each test
original_difficulty = Globals.settings.difficulty # Snapshot before each test

func after_test() -> void:
Globals.difficulty = original_difficulty # Restore after each test
Globals.settings.difficulty = original_difficulty # Restore after each test


## Tests fuel depletion scaling with difficulty levels.
Expand All @@ -27,26 +27,26 @@ func test_fuel_depletion_with_difficulty() -> void:
var player_inst: Variant = main_scene.get_node("Player")

# Save original difficulty for reset
var original_difficulty: float = Globals.difficulty
var original_difficulty: float = Globals.settings.difficulty

# Reset fuel before each sim for independent tests
player_inst.fuel["fuel"] = 100.0
Globals.difficulty = 1.0
Globals.settings.difficulty = 1.0
var normalized_speed: float = player_inst.speed["speed"] / player_inst.MAX_SPEED
var dep_1: float = player_inst.base_fuel_drain * normalized_speed * Globals.difficulty
var dep_1: float = player_inst.base_fuel_drain * normalized_speed * Globals.settings.difficulty
player_inst._on_fuel_timer_timeout()
assert_float(player_inst.fuel["fuel"]).is_equal_approx(100.0 - dep_1, 0.01) # Larger delta for precision

player_inst.fuel["fuel"] = 100.0
Globals.difficulty = 2.0
Globals.settings.difficulty = 2.0
normalized_speed = player_inst.speed["speed"] / player_inst.MAX_SPEED # Re-derive
var dep_2: float = player_inst.base_fuel_drain * normalized_speed * Globals.difficulty
var dep_2: float = player_inst.base_fuel_drain * normalized_speed * Globals.settings.difficulty
player_inst._on_fuel_timer_timeout()
assert_float(player_inst.fuel["fuel"]).is_equal_approx(100.0 - dep_2, 0.01)

player_inst.fuel["fuel"] = 100.0
Globals.difficulty = 0.5
Globals.settings.difficulty = 0.5
normalized_speed = player_inst.speed["speed"] / player_inst.MAX_SPEED
var dep_05: float = player_inst.base_fuel_drain * normalized_speed * Globals.difficulty
var dep_05: float = player_inst.base_fuel_drain * normalized_speed * Globals.settings.difficulty
player_inst._on_fuel_timer_timeout()
assert_float(player_inst.fuel["fuel"]).is_equal_approx(100.0 - dep_05, 0.01)
12 changes: 6 additions & 6 deletions test/gdunit4/test_difficulty_integration.gd
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ const TestHelpers = preload("res://test/gdunit4/test_helpers.gd")
var original_difficulty: float # Snapshot holder

func before_test() -> void:
original_difficulty = Globals.difficulty # Snapshot before each test
original_difficulty = Globals.settings.difficulty # Snapshot before each test

func after_test() -> void:
Globals.difficulty = original_difficulty # Restore after each test
Globals.settings.difficulty = original_difficulty # Restore after each test

func test_difficulty_scales_fuel_and_weapon() -> void:
# Setup: Load main_scene for full context (PlayerStatsPanel for fuel_bar path)
Expand All @@ -28,13 +28,13 @@ func test_difficulty_scales_fuel_and_weapon() -> void:
var weapon: Node2D = player.get_node("CharacterBody2D/Weapon")
assert_object(weapon).is_not_null()

var original_difficulty: float = Globals.difficulty
Globals.difficulty = 2.0
var original_difficulty: float = Globals.settings.difficulty
Globals.settings.difficulty = 2.0

# TEST 1: Fuel depletion scales (derive from constants)
player.fuel["fuel"] = 100.0
var normalized_speed: float = player.speed["speed"] / player.MAX_SPEED
var expected_depletion: float = player.base_fuel_drain * normalized_speed * Globals.difficulty
var expected_depletion: float = player.base_fuel_drain * normalized_speed * Globals.settings.difficulty
player._on_fuel_timer_timeout()
var expected_fuel: float = 100.0 - expected_depletion
assert_float(player.fuel["fuel"]).is_equal_approx(expected_fuel, 0.01) # Larger delta for precision
Expand All @@ -45,4 +45,4 @@ func test_difficulty_scales_fuel_and_weapon() -> void:
var cooldown_timer: Timer = bullet_firer.get_node("CooldownTimer")
assert_float(cooldown_timer.wait_time).is_equal_approx(0.30, 0.001) # Tolerance for float

Globals.difficulty = original_difficulty
Globals.settings.difficulty = original_difficulty
4 changes: 2 additions & 2 deletions test/gdunit4/test_globals.gd
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ func test_save_settings_preserves_other_sections() -> void:
config.save(test_path)

# Save settings
globals.difficulty = 1.2
globals.settings.difficulty = 1.2
globals._save_settings(test_path)

# Reload and check both preserved
Expand All @@ -54,5 +54,5 @@ func test_load_settings_with_other_sections() -> void:

# Load and verify settings loaded, others ignored
globals._load_settings(test_path)
assert_float(globals.difficulty).is_equal(0.8)
assert_float(globals.settings.difficulty).is_equal(0.8)
# No assert on audio, as it's not loaded here
Loading
Loading