Refactor console and scene structure; update resource paths and add configuration handling

This commit is contained in:
2025-05-03 19:49:23 +02:00
parent aa2bd7b3b0
commit f75d05dde1
59 changed files with 714 additions and 136 deletions

17
scripts/achievements.gd Normal file
View File

@@ -0,0 +1,17 @@
class_name Achievements
extends Node
func unlock_achievement(achievement_name: String) -> bool:
if not Steam.setAchievement(achievement_name):
print("Failed to unlock achievement: ", achievement_name)
return false
return true
func reset_achievement(achievement_name: String) -> bool:
if not Steam.clearAchievement(achievement_name):
print("Failed to reset achievement: ", achievement_name)
return false
return true

View File

@@ -0,0 +1 @@
uid://deguukal87gcb

View File

@@ -1,7 +1,7 @@
class_name PeriodicShootingComponent
class_name PeriodicShootingComponent
extends Node
@export var bullet_scene: PackedScene = preload("res://objects/bullet.tscn")
@export var bullet_scene: PackedScene = preload("res://objects/entities/bullet.tscn")
@export var shoot_interval: float = 1.0
@export var shoot_direction: Vector2 = Vector2.RIGHT
@export var side_to_side_movement: SideToSideMovement
@@ -45,4 +45,4 @@ func setup_timer() -> void:
timer.one_shot = false
timer.autostart = true
timer.timeout.connect(on_timer_timeout)
add_child(timer)
add_child(timer)

View File

@@ -22,14 +22,17 @@ func try_unlock_skill(skill_data: SkillData) -> bool:
return true
func unlock_all_skills() -> void:
var available_skills: Array[SkillData] = skill_manager.available_skills
var skills: Array[String] = []
for skill in available_skills:
skills.append(skill.name)
game_manager.unlock_skills(skills)
skill_manager.apply_unlocked_skills()
func _input(event: InputEvent) -> void:
if event.is_action_pressed("unlock_skills"):
var available_skills: Array[SkillData] = skill_manager.available_skills
var skills: Array[String] = []
for skill in available_skills:
skills.append(skill.name)
game_manager.unlock_skills(skills)
skill_manager.apply_unlocked_skills()
print("Unlocked skills: ", skills)
unlock_all_skills()

View File

@@ -0,0 +1,134 @@
class_name ConsoleManagement
extends Node
@export var player_health: HealthComponent
@export var skill_unlocker: SkillUnlockerComponent
@export var skill_manager: SkillManager
@onready var game_manager: GM = $"/root/GameManager"
@onready var achievements: Achievements = $"/root/AchievementsManager"
func _ready() -> void:
Console.pause_enabled = true
Console.add_command("add_coins", console_add_coins, ["amount"], 1, "Add coins to the player.")
Console.add_command("set_coins", console_set_coins, ["amount"], 1, "Set the player's coins.")
Console.add_command("set_lives", console_set_lives, ["amount"], 1, "Set the player's lives.")
Console.add_command("set_health", console_set_health, ["amount"], 1, "Set the player's health.")
Console.add_command("unlock_skill", console_unlock_skill, ["skill_name"], 1, "Unlock a skill for the player.")
Console.add_command("remove_skill", console_remove_skill, ["skill_name"], 1, "Remove a skill from the player.")
Console.add_command("remove_all_skills", console_remove_all_skills, [], 0, "Remove all skills from the player.")
Console.add_command("unlock_all_skills", console_unlock_all_skills, [], 0, "Unlock all skills for the player.")
Console.add_command("unlock_achievement", console_unlock_achievement, ["achievement_name"], 1, "Unlock an achievement for the player.")
Console.add_command("reset_achievement", console_reset_achievement, ["achievement_name"], 1, "Reset an achievement for the player.")
func console_add_coins(amount: Variant) -> void:
if not game_manager:
return
if not amount.is_valid_int():
Console.print_error("Invalid amount: " + str(amount))
return
game_manager.add_coins(int(amount))
Console.print_info("Added " + str(amount) + " coins.")
func console_set_coins(amount: Variant) -> void:
if not game_manager:
return
if not amount.is_valid_int():
Console.print_error("Invalid amount: " + str(amount))
return
game_manager.set_coins(int(amount))
Console.print_info("Set coins to " + str(amount))
func console_set_lives(amount: Variant) -> void:
if not game_manager:
return
if not amount.is_valid_int():
Console.print_error("Invalid amount: " + str(amount))
return
game_manager.set_lives(int(amount))
Console.print_info("Set lives to " + str(amount))
func console_set_health(amount: Variant) -> void:
if not player_health:
return
if not amount.is_valid_int():
Console.print_error("Invalid amount: " + str(amount))
return
player_health.set_health(int(amount))
Console.print_info("Set health to " + str(amount))
func console_unlock_skill(skill_name: Variant) -> void:
if not skill_manager or not skill_unlocker or not game_manager:
return
if not skill_name:
Console.print_error("Invalid skill name: " + str(skill_name))
return
game_manager.unlock_skill(skill_name)
var skill_data: SkillData = skill_manager.get_skill_by_name(skill_name)
if not skill_data:
Console.print_error("Skill not found: " + str(skill_name))
return
skill_manager.add_skill(skill_data)
Console.print_info("Unlocked skill: " + str(skill_name))
func console_unlock_all_skills() -> void:
if not skill_manager or not skill_unlocker or not game_manager:
return
skill_unlocker.unlock_all_skills()
Console.print_info("Unlocked all skills.")
func console_remove_skill(skill_name: Variant) -> void:
if not skill_manager or not skill_unlocker or not game_manager:
return
if not skill_name:
Console.print_error("Invalid skill name: " + str(skill_name))
return
game_manager.remove_skill(skill_name)
skill_manager.remove_skill(skill_name)
Console.print_info("Removed skill: " + str(skill_name))
func console_remove_all_skills() -> void:
if not skill_manager or not skill_unlocker or not game_manager:
return
for skill_name in skill_manager.active_components.keys():
game_manager.remove_skill(skill_name)
skill_manager.remove_skill(skill_name)
func console_unlock_achievement(achievement_name: Variant) -> void:
if not achievement_name:
Console.print_error("Invalid achievement name: " + str(achievement_name))
return
if not achievements:
Console.print_error("Achievements manager not found.")
return
if not achievements.unlock_achievement(achievement_name):
Console.print_error("Failed to unlock achievement: " + str(achievement_name))
Console.print_info("Unlocked achievement: " + str(achievement_name))
func console_reset_achievement(achievement_name: Variant) -> void:
if not achievement_name:
Console.print_error("Invalid achievement name: " + str(achievement_name))
return
if not achievements:
Console.print_error("Achievements manager not found.")
return
if not achievements.reset_achievement(achievement_name):
Console.print_error("Failed to reset achievement: " + str(achievement_name))
Console.print_info("Reset achievement: " + str(achievement_name))

View File

@@ -0,0 +1 @@
uid://8r1y8elyw7kt

View File

@@ -103,6 +103,11 @@ func unlock_skill(skill_name: String) -> void:
player_state["unlocked_skills"].append(skill_name)
func remove_skill(skill_name: String) -> void:
if is_skill_unlocked(skill_name):
player_state["unlocked_skills"].erase(skill_name)
func unlock_skills(skill_names: Array[String]) -> void:
for skill_name in skill_names:
unlock_skill(skill_name)

99
scripts/input_settings.gd Normal file
View File

@@ -0,0 +1,99 @@
class_name InputSettings
extends Control
@export var input_button_scene: PackedScene = preload("res://objects/ui/input_button.tscn")
@export var action_list: Container
@export var reset_to_default_button: Button
@export var input_actions: Dictionary = {
'left': 'Move left',
'right': 'Move right',
'up': 'Move up',
'down': 'Move down',
'jump': 'Jump',
'attack': 'Attack',
'show_marketplace': "Toggle marketplace",
}
var is_remapping: bool = false
var action_to_remap = null
var remapping_button = null
var buttons: Array[Button] = []
@onready var config_file_handler = $'/root/ConfigFileHandler'
func _ready() -> void:
create_action_list()
if buttons.size() > 0:
buttons[0].grab_focus()
if reset_to_default_button:
reset_to_default_button.pressed.connect(on_reset_button_pressed)
func _input(event: InputEvent) -> void:
if is_remapping:
if event is InputEventKey or (event is InputEventMouseButton and event.pressed) or event is InputEventJoypadButton:
if event is InputEventMouseButton and event.double_click:
event.double_click = false
InputMap.action_erase_events(action_to_remap)
InputMap.action_add_event(action_to_remap, event)
update_action_list(remapping_button, event)
is_remapping = false
action_to_remap = null
remapping_button = null
accept_event()
func create_action_list() -> void:
InputMap.load_from_project_settings()
for item in action_list.get_children():
item.queue_free()
for action in input_actions:
var button := input_button_scene.instantiate() as Button
var action_label := button.find_child("LabelAction") as Label
var input_label := button.find_child("LabelInput") as Label
action_label.text = input_actions[action]
var events := InputMap.action_get_events(action)
if events.size() > 0:
input_label.text = events[0].as_text().trim_suffix(" (Physical)")
else:
input_label.text = "None"
action_list.add_child(button)
button.pressed.connect(on_input_button_pressed.bind(button, action))
buttons.append(button)
func on_input_button_pressed(button: Button, action) -> void:
if is_remapping:
return
is_remapping = true
action_to_remap = action
remapping_button = button
button.find_child("LabelInput").text = "Press any key..."
func update_action_list(button: Button, event: InputEvent) -> void:
button.find_child("LabelInput").text = event.as_text().trim_suffix(" (Physical)")
func on_reset_button_pressed() -> void:
create_action_list()
func save_settings() -> void:
config_file_handler.settings_config.set_value("input_settings", "input_actions", input_actions)
config_file_handler.settings_config.save(config_file_handler.SETTINGS_FILE_PATH)
func load_settings() -> void:
pass

View File

@@ -0,0 +1 @@
uid://dppwl7xie2mh

View File

@@ -13,6 +13,7 @@ extends Node
var is_paused: bool = false
var is_console_open: bool = false
var settings_menu_instance: Control
func _ready() -> void:
@@ -42,6 +43,8 @@ func _ready() -> void:
quit_button.pressed.connect(_on_quit_button_pressed)
settings_button.pressed.connect(_on_settings_button_pressed)
exit_to_menu_button.pressed.connect(_on_exit_to_menu_button_pressed)
Console.console_opened.connect(_on_console_open)
Console.console_closed.connect(_on_console_close)
func _input(event: InputEvent) -> void:
@@ -57,6 +60,9 @@ func _input(event: InputEvent) -> void:
func _on_resume_button_pressed() -> void:
pause_menu_control.hide()
if settings_menu_instance:
settings_menu_instance.queue_free()
settings_menu_instance = null
gm.resume_game()
is_paused = false
@@ -71,9 +77,9 @@ func _on_settings_button_pressed() -> void:
return
var settings_instance: Control = settings_menu.instantiate()
get_tree().root.add_child(settings_instance)
add_child(settings_instance)
settings_instance.show()
pause_menu_control.hide()
settings_menu_instance = settings_instance
gm.pause_game()
is_paused = true
@@ -87,8 +93,8 @@ func _on_exit_to_menu_button_pressed() -> void:
func _on_console_open():
pass
is_console_open = true
func _on_console_close():
pass
is_console_open = false

8
scripts/settings_menu.gd Normal file
View File

@@ -0,0 +1,8 @@
class_name SettingsMenu
extends Node
@export var input_settings_scene: PackedScene = preload("res://objects/ui/input_settings.tscn")
@export var audio_settings_scene: PackedScene
@export var display_settings_scene: PackedScene
@export var gameplay_settings_scene: PackedScene
@export var settings_menu_control: Control

View File

@@ -0,0 +1 @@
uid://c506rigcjlm6x

View File

@@ -55,3 +55,10 @@ func apply_unlocked_skills() -> void:
add_skill(skill_data)
else:
remove_skill(skill_data.name)
func get_skill_by_name(skill_name: String) -> SkillData:
for skill_data in available_skills:
if skill_data.name == skill_name:
return skill_data
return null