initial
This commit is contained in:
75
cutscene/actions/DialogueAction.gd
Normal file
75
cutscene/actions/DialogueAction.gd
Normal file
@@ -0,0 +1,75 @@
|
||||
class_name DialogueAction
|
||||
extends "res://cutscene/Action.gd"
|
||||
|
||||
# Properties
|
||||
var character: Node2D # The speaking character (optional)
|
||||
var text: String # Dialogue text
|
||||
var duration: float = 0.0 # Duration to display (0 = manual advance)
|
||||
|
||||
func _init(speaking_character: Node2D, dialogue_text: String, display_duration: float = 0.0) -> void:
|
||||
character = speaking_character
|
||||
text = dialogue_text
|
||||
duration = display_duration
|
||||
name = "DialogueAction"
|
||||
|
||||
func start() -> void:
|
||||
# Display the dialogue text
|
||||
_display_dialogue()
|
||||
self._set_running()
|
||||
|
||||
# If duration is 0, this is a manual advance action
|
||||
if duration <= 0:
|
||||
# For demo purposes, we'll complete immediately
|
||||
# In a real game, this would wait for player input
|
||||
self._set_completed()
|
||||
else:
|
||||
# Start a timer for automatic completion
|
||||
var timer = Timer.new()
|
||||
timer.wait_time = duration
|
||||
timer.one_shot = true
|
||||
timer.connect("timeout", _on_timer_timeout)
|
||||
|
||||
# Add timer as a child to ensure it processes
|
||||
if Engine.get_main_loop().current_scene:
|
||||
Engine.get_main_loop().current_scene.add_child(timer)
|
||||
#else:
|
||||
## Fallback if we can't access the main scene
|
||||
#var root = get_tree().root if get_tree() else null
|
||||
#if root and root.get_child_count() > 0:
|
||||
#root.get_child(0).add_child(timer)
|
||||
#else:
|
||||
## Last resort - connect directly and manage manually
|
||||
#timer.connect("timeout", _on_timer_timeout_direct)
|
||||
#timer.start(duration)
|
||||
#return
|
||||
|
||||
timer.connect("timeout", _cleanup_timer.bind(timer))
|
||||
timer.start()
|
||||
|
||||
func _display_dialogue() -> void:
|
||||
# In a real implementation, this would interface with a dialogue system
|
||||
# For now, we'll simulate by printing to console
|
||||
var character_name = character.name if character and character.name else "Unknown"
|
||||
print("%s: %s" % [character_name, text])
|
||||
|
||||
func _on_timer_timeout() -> void:
|
||||
self._set_completed()
|
||||
|
||||
func _on_timer_timeout_direct() -> void:
|
||||
# Direct timeout handler for when we can't add the timer to the scene tree
|
||||
self._set_completed()
|
||||
|
||||
func _cleanup_timer(timer: Timer) -> void:
|
||||
# Clean up the timer
|
||||
if timer and timer.get_parent():
|
||||
timer.get_parent().remove_child(timer)
|
||||
if timer:
|
||||
timer.queue_free()
|
||||
self._set_completed()
|
||||
|
||||
func is_completed() -> bool:
|
||||
return state == State.COMPLETED
|
||||
|
||||
func stop() -> void:
|
||||
# Clean up any timers when stopping
|
||||
super.stop()
|
||||
Reference in New Issue
Block a user