diff --git a/scripts/debug_menu.gd b/scripts/debug_menu.gd new file mode 100644 index 0000000..293b185 --- /dev/null +++ b/scripts/debug_menu.gd @@ -0,0 +1,119 @@ +extends CanvasLayer + +@onready var _spawn_control = get_node("/root/Game/SpawnControl") +@onready var _witch = get_node("/root/Game/Witch") +@onready var _drop_manager = get_node("/root/Game/DropManager") + +var _spell_library := SpellLibrary.new() +var _spell_dispatch: Dictionary +var _lvl_disable_btn: Button + +func _ready() -> void: + layer = 10 + _spell_dispatch = { + SpellLibrary.FIREBALL: _witch.shoot_fireballs, + SpellLibrary.SHURIKEN: _witch.shoot_shuriken, + SpellLibrary.FIRE_SWIRL: _witch.shoot_fire_swirl, + SpellLibrary.TORNADO: _witch.shoot_tornado, + } + _build_ui() + hide() + +func _exit_tree() -> void: + Engine.time_scale = 1.0 + +func _unhandled_input(event: InputEvent) -> void: + if event is InputEventKey and event.pressed and not event.echo: + if event.keycode == KEY_D and event.ctrl_pressed: + visible = not visible + get_viewport().set_input_as_handled() + +func _build_ui() -> void: + var panel := PanelContainer.new() + var style := StyleBoxFlat.new() + style.bg_color = Color(0.0, 0.0, 0.0, 0.75) + panel.add_theme_stylebox_override("panel", style) + panel.anchor_left = 1.0 + panel.anchor_right = 1.0 + panel.anchor_top = 0.0 + panel.anchor_bottom = 1.0 + panel.offset_left = -220 + panel.offset_right = 0 + add_child(panel) + + var scroll := ScrollContainer.new() + scroll.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED + panel.add_child(scroll) + + var vbox := VBoxContainer.new() + vbox.custom_minimum_size = Vector2(210, 0) + vbox.add_theme_constant_override("separation", 4) + scroll.add_child(vbox) + + _add_section(vbox, "ENEMIES") + _add_button(vbox, "Kill All", _kill_all_enemies) + + _add_section(vbox, "TIME SCALE") + var hbox_scale := HBoxContainer.new() + vbox.add_child(hbox_scale) + for s in [1, 2, 5, 10]: + var btn := Button.new() + btn.text = "%dx" % s + btn.size_flags_horizontal = Control.SIZE_EXPAND_FILL + btn.pressed.connect(_set_time_scale.bind(float(s))) + hbox_scale.add_child(btn) + + _add_section(vbox, "SKIP TIME") + var hbox_time := HBoxContainer.new() + vbox.add_child(hbox_time) + for secs in [30, 60]: + var btn := Button.new() + btn.text = "+%ds" % secs + btn.size_flags_horizontal = Control.SIZE_EXPAND_FILL + btn.pressed.connect(_skip_time.bind(float(secs))) + hbox_time.add_child(btn) + + _add_section(vbox, "SPELLS") + for spell_id in _spell_library.recipes.keys(): + if _spell_dispatch.has(spell_id): + _add_button(vbox, spell_id.capitalize(), _spell_dispatch[spell_id]) + + _add_section(vbox, "LEVEL") + _add_button(vbox, "Level Up", _force_level_up) + _lvl_disable_btn = Button.new() + _lvl_disable_btn.text = "Disable Level Up: OFF" + _lvl_disable_btn.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _lvl_disable_btn.pressed.connect(_toggle_level_up_disabled) + vbox.add_child(_lvl_disable_btn) + +func _add_section(parent: VBoxContainer, title: String) -> void: + var label := Label.new() + label.text = title + label.add_theme_color_override("font_color", Color.YELLOW) + label.add_theme_font_size_override("font_size", 11) + parent.add_child(label) + +func _add_button(parent: VBoxContainer, label: String, callback: Callable) -> void: + var btn := Button.new() + btn.text = label + btn.size_flags_horizontal = Control.SIZE_EXPAND_FILL + btn.pressed.connect(callback) + parent.add_child(btn) + +func _kill_all_enemies() -> void: + for enemy in get_tree().get_nodes_in_group("enemies"): + if is_instance_valid(enemy): + enemy.die() + +func _set_time_scale(scale: float) -> void: + Engine.time_scale = scale + +func _skip_time(secs: float) -> void: + _spawn_control.elapsed_time += secs + +func _force_level_up() -> void: + _drop_manager.force_level_up() + +func _toggle_level_up_disabled() -> void: + _drop_manager.level_up_disabled = not _drop_manager.level_up_disabled + _lvl_disable_btn.text = "Disable Level Up: " + ("ON" if _drop_manager.level_up_disabled else "OFF")