From 6f5b0f4bbd5292294f36946681067d7cfadf7475 Mon Sep 17 00:00:00 2001 From: Kellan KOZUME Date: Sun, 19 Apr 2026 15:17:35 -0400 Subject: [PATCH] feat(intro): add terminal-style boot sequence before warehouse scene --- entities/items/item.gd | 4 ++- levels/entrepot/entrepot.gd | 4 --- levels/intro.gd | 51 +++++++++++++++++++++++++++++++++++++ levels/intro.gd.uid | 1 + levels/intro.tscn | 29 +++++++++++++++++++++ ui/hud.gd | 2 +- ui/hud.tscn | 10 ++++---- 7 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 levels/intro.gd create mode 100644 levels/intro.gd.uid create mode 100644 levels/intro.tscn diff --git a/entities/items/item.gd b/entities/items/item.gd index 5657c7b..87cbb79 100644 --- a/entities/items/item.gd +++ b/entities/items/item.gd @@ -6,5 +6,7 @@ extends Area2D func interact() -> void: GameState.add_item(item_id) - print("Ramassé : ", item_name) + var hud := get_tree().get_first_node_in_group("hud") + if hud and hud.has_method("show_log"): + hud.show_log("LOG %s récupéré. Inventaire mis à jour." % item_id) queue_free() diff --git a/levels/entrepot/entrepot.gd b/levels/entrepot/entrepot.gd index 07413d3..ebcf3a0 100644 --- a/levels/entrepot/entrepot.gd +++ b/levels/entrepot/entrepot.gd @@ -1,14 +1,10 @@ extends Node2D func _ready() -> void: - print(get_tree().get_nodes_in_group("dialogue_box")) await get_tree().process_frame for zone in get_tree().get_nodes_in_group("repair_zones"): if zone is RepairZone: zone.repair_requested.connect(_on_repair_requested) - func _on_repair_requested(npc_id: String) -> void: - # Test de trigger GameState.complete_repair(npc_id) - print("Flux réparation OK pour : ", npc_id) diff --git a/levels/intro.gd b/levels/intro.gd new file mode 100644 index 0000000..dfdcc13 --- /dev/null +++ b/levels/intro.gd @@ -0,0 +1,51 @@ +extends Node + +const LOGS := [ + "INITIALIZING SYSTEM...", + "LAST SAVE: 847 DAYS AGO.", + "MISSING DATA: 847 DAYS.", + "UNIT SCRAP-09... BACK ONLINE.", +] + +const CHAR_DELAY := 0.04 +const LINE_PAUSE := 2 +const CURSOR := "_" + +@onready var log_label := $CanvasLayer/LogLabel +@onready var background := $CanvasLayer/Background + +var _full_text := "" +var _cursor_visible := true + +func _ready() -> void: + log_label.text = "" + _start_cursor_blink() + _play_sequence() + +func _start_cursor_blink() -> void: + var t := create_tween().set_loops() + t.tween_callback(_toggle_cursor).set_delay(0.5) + +func _toggle_cursor() -> void: + _cursor_visible = !_cursor_visible + log_label.text = _full_text + (CURSOR if _cursor_visible else " ") + +func _play_sequence() -> void: + for line in LOGS: + await _type_line(line) + await get_tree().create_timer(LINE_PAUSE).timeout + _full_text += "\n" + + await get_tree().create_timer(1).timeout + + # Fade out + var tween := create_tween() + tween.tween_property(background, "modulate:a", 0.0, 1.2) + await tween.finished + get_tree().change_scene_to_file("res://levels/entrepot/entrepot.tscn") + +func _type_line(line: String) -> void: + for i in line.length(): + _full_text += line[i] + log_label.text = _full_text + CURSOR + await get_tree().create_timer(CHAR_DELAY).timeout diff --git a/levels/intro.gd.uid b/levels/intro.gd.uid new file mode 100644 index 0000000..d8f699d --- /dev/null +++ b/levels/intro.gd.uid @@ -0,0 +1 @@ +uid://c5x8jibky45hk diff --git a/levels/intro.tscn b/levels/intro.tscn new file mode 100644 index 0000000..beef87f --- /dev/null +++ b/levels/intro.tscn @@ -0,0 +1,29 @@ +[gd_scene format=3 uid="uid://t1g3j50wteuj"] + +[ext_resource type="Script" uid="uid://c5x8jibky45hk" path="res://levels/intro.gd" id="1_8o7kg"] + +[node name="Intro" type="Node" unique_id=1077364657] +script = ExtResource("1_8o7kg") + +[node name="CanvasLayer" type="CanvasLayer" parent="." unique_id=335424006] +follow_viewport_enabled = true + +[node name="Background" type="ColorRect" parent="CanvasLayer" unique_id=2005237130] +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="LogLabel" type="RichTextLabel" parent="CanvasLayer" unique_id=1899603309] +offset_right = 321.0 +offset_bottom = 182.0 +theme_override_colors/font_outline_color = Color(0, 1, 0.4, 1) +theme_override_font_sizes/normal_font_size = 6 +theme_override_font_sizes/bold_font_size = 6 +theme_override_font_sizes/bold_italics_font_size = 6 +theme_override_font_sizes/italics_font_size = 6 +theme_override_font_sizes/mono_font_size = 6 +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/ui/hud.gd b/ui/hud.gd index f3be8cb..eac1717 100644 --- a/ui/hud.gd +++ b/ui/hud.gd @@ -42,6 +42,6 @@ func show_log(message: String) -> void: # Disparaît après 3 secondes avec un fade out _log_tween = create_tween() - _log_tween.tween_interval(2.5) + _log_tween.tween_interval(3.5) _log_tween.tween_property(log_container, "modulate:a", 0.0, 0.5) _log_tween.tween_callback(log_container.hide) diff --git a/ui/hud.tscn b/ui/hud.tscn index 3981c94..800132b 100644 --- a/ui/hud.tscn +++ b/ui/hud.tscn @@ -75,11 +75,11 @@ theme_override_styles/panel = SubResource("StyleBoxFlat_546lt") [node name="LogLabel" type="RichTextLabel" parent="LogContainer" unique_id=957446787] layout_mode = 2 mouse_filter = 2 -theme_override_font_sizes/normal_font_size = 8 -theme_override_font_sizes/bold_font_size = 8 -theme_override_font_sizes/bold_italics_font_size = 8 -theme_override_font_sizes/italics_font_size = 8 -theme_override_font_sizes/mono_font_size = 8 +theme_override_font_sizes/normal_font_size = 6 +theme_override_font_sizes/bold_font_size = 6 +theme_override_font_sizes/bold_italics_font_size = 6 +theme_override_font_sizes/italics_font_size = 6 +theme_override_font_sizes/mono_font_size = 6 bbcode_enabled = true fit_content = true