Untitled
Anonymous
plain_text
02/22/2026 7:20 PM
14.7 KB
11
Indexable
extends Node2D
@export var oldlady_portrait: Texture2D
@export var spare_key_icon: Texture2D
var dialogue_ui
var note_ui
var fade_rect
var item_get_overlay
var item_icon_rect: TextureRect
var main_ref
@onready var player = $Player
@onready var oldlady = $OldLady
@onready var oldlady_eicon: CanvasItem = $OldLady/EIcon
@onready var exit_eicon: CanvasItem = $ExitToHub/EIcon
@onready var exit_to_hub = _get_exit_interactable()
var has_key := false
func _get_exit_interactable() -> Node:
var n := get_node_or_null("ExitToHub")
if n == null:
return null
# If ExitToHub itself is an Interactable
if n.has_signal("interacted"):
return n
# Or if it has an Interactable child
var child := n.get_node_or_null("Interactable")
if child != null and child.has_signal("interacted"):
return child
return null
func bind_ui(d, n, f, i, m) -> void:
dialogue_ui = d
note_ui = n
fade_rect = f
item_get_overlay = i
main_ref = m
if item_get_overlay != null:
item_icon_rect = item_get_overlay.get_node("Center/ItemIcon") as TextureRect
func _ready() -> void:
oldlady.interacted.connect(_on_oldlady_interacted)
if exit_to_hub != null:
exit_to_hub.interacted.connect(_on_exit_to_hub_interacted)
else:
push_error("ExitToHub: No Interactable found.")
# Exit prompt hidden until key is obtained
if exit_eicon:
exit_eicon.visible = false
func _on_exit_to_hub_interacted() -> void:
if not has_key:
return
if exit_eicon:
exit_eicon.visible = false
# Corridor -> Hub should enter hub from LEFT
if main_ref != null and main_ref.has_method("go_hub"):
main_ref.go_hub("left")
else:
push_error("Corridor_Gang: main_ref.go_hub missing")
# -------------------------------------------------
# Choice connection helper (prevents double replies)
# -------------------------------------------------
func _connect_choice_once(handler: Callable) -> void:
if dialogue_ui == null:
push_error("Corridor_Gang: dialogue_ui is null (bind_ui not called?)")
return
if dialogue_ui.choice_selected.is_connected(handler):
dialogue_ui.choice_selected.disconnect(handler)
dialogue_ui.choice_selected.connect(handler, CONNECT_ONE_SHOT)
# -------------------------------------------------
# Item get sequence: fade out -> icon glow -> fade in
# -------------------------------------------------
func _play_item_get_sequence(texture: Texture2D) -> void:
if fade_rect == null or item_get_overlay == null or item_icon_rect == null:
push_error("Corridor_Gang: Missing fade_rect / item_get_overlay / item_icon_rect")
return
if texture == null:
push_error("Corridor_Gang: Item texture is null")
return
player.set_can_move(false)
fade_rect.visible = true
fade_rect.modulate.a = 0.0
item_get_overlay.visible = true
item_icon_rect.visible = true
item_icon_rect.texture = texture
item_icon_rect.modulate = Color(1, 1, 1, 0)
item_icon_rect.scale = Vector2(1.0, 1.0)
var t := create_tween()
t.set_pause_mode(Tween.TWEEN_PAUSE_PROCESS)
t.tween_property(fade_rect, "modulate:a", 1.0, 0.25).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT)
await t.finished
var t2 := create_tween()
t2.set_pause_mode(Tween.TWEEN_PAUSE_PROCESS)
t2.tween_property(item_icon_rect, "modulate:a", 1.0, 0.18).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT)
t2.parallel().tween_property(item_icon_rect, "scale", Vector2(1.12, 1.12), 0.18).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT)
t2.tween_property(item_icon_rect, "scale", Vector2(1.0, 1.0), 0.18).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN)
t2.tween_property(item_icon_rect, "scale", Vector2(1.16, 1.16), 0.20).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT)
t2.tween_property(item_icon_rect, "scale", Vector2(1.0, 1.0), 0.20).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN)
t2.tween_interval(0.25)
t2.tween_property(item_icon_rect, "modulate:a", 0.0, 0.20).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN)
await t2.finished
item_icon_rect.visible = false
item_get_overlay.visible = false
var t3 := create_tween()
t3.set_pause_mode(Tween.TWEEN_PAUSE_PROCESS)
t3.tween_property(fade_rect, "modulate:a", 0.0, 0.25).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN)
await t3.finished
fade_rect.visible = false
player.set_can_move(true)
# --------------------------
# Entry point
# --------------------------
func _on_oldlady_interacted() -> void:
if has_key:
return
_start_gate()
func _start_gate() -> void:
player.set_can_move(false)
dialogue_ui.show_dialogue(
"Ibolya néni",
"„Na. Megjött.”\n„Akkor mondja, mit akar.”",
oldlady_portrait,
[
{"label": "Jó reggelt."},
{"label": "Sietek."},
{"label": "Itt lakom."},
{"label": "Csak észrevétlenül távoznék."}
]
)
_connect_choice_once(_gate_choice)
func _gate_choice(index: int) -> void:
match index:
0: _branch_good_morning()
1: _branch_hurry()
2: _branch_i_live_here()
3: _branch_leave_unnoticed()
func _branch_good_morning() -> void:
dialogue_ui.show_dialogue(
"Ibolya néni",
"„Jó reggelt?”\nMegforgatja a szót, mintha méreg lenne.\n„Minden reggelt, ami Isten kegyelmével életben találja az embert ki kell érdemelni.”\n„Indokolja meg, miért tartózkodik a folyosón.”",
oldlady_portrait,
[
{"label": "Itt lakom?"},
{"label": "A sarokban levő növény egész éjjel magához szólított."},
{"label": "Elfogyott odabent a levegő."},
{"label": "Takarítani jöttem a folyosó közös részét. De előtte dolgom van."}
]
)
_connect_choice_once(_good_morning_choice)
func _good_morning_choice(i: int) -> void:
match i:
0:
_return_to_gate("„Attól még hogy itt van egy ideje, ez nem biztos.”\n„Lakcímkártyát láttam már. Embert kevesebbet.”\n„Próbáld újra.”")
1:
_return_to_gate("„Ne humorizáljon.”\n„A vicceskedéssel jutnak be a betörők is az épületbe.”\n„Próbáld újra.”")
2:
_return_to_gate("A LEVEGŐ??\n“A levegő is társasházi tulajdon, remélem tudja.”\n“Próbáld újra.”")
3:
_midpoint_to_key("„Dolga.”\nBólint, mint aki jegyzőkönyvet vezet fejben.\n„Sorolja fel. Pontosan. Időrendben.”")
func _branch_hurry() -> void:
dialogue_ui.show_dialogue(
"Ibolya néni",
"„Siet?”\nFelhúzza a szemöldökét.\n„A sietség a hibák melegágya.”\n„És a hibák mindig valakinél landolnak.”\n„Mi ennyire sürgős?”",
oldlady_portrait,
[
{"label": "A busz nem vár meg."},
{"label": "Időre megyek."},
{"label": "Az élet halad."},
{"label": "Nem akarok beszélgetni."}
]
)
_connect_choice_once(_hurry_choice)
func _hurry_choice(i: int) -> void:
match i:
0:
_midpoint_to_key("„A busz.”\n„A busz menetrend szerint jár.”\n„Az ember ritkán.”\n„Melyik?”")
1:
_midpoint_to_key("„Idő.”\n„Az idő relatív.”\n„A számonkérés nem.”\n„Hova?”")
2:
_return_to_gate("„Az élet halad.”\n„Igen.”\n„De mindjárt megállítom én magának..”\n„Próbáljd újra.”")
3:
_return_to_gate("Megdermed.\n„A beszélgetés közösség.”\n„A közösség erő.”\n„Ne gyengítse.”\n„Próbálja újra.”")
func _branch_i_live_here() -> void:
dialogue_ui.show_dialogue(
"Ibolya néni",
"„Itt lakik.”\nÖsszeszűkíti a szemét.\n„Mondjon egy dolgot, amit csak az tud, aki valóban itt él.”",
oldlady_portrait,
[
{"label": "A félemeleti építkezés csak legenda."},
{"label": "A lépcsőháznak saját szaga van."},
{"label": "Mindig van szórólap, amit senki nem olvas."},
{"label": "Az előtér a pletyka epicentruma."}
]
)
_connect_choice_once(_live_here_choice)
func _live_here_choice(i: int) -> void:
match i:
0:
_return_to_gate("„Építik azt.”\n„De hogy be is fejezik-e?..”\n„Próbáld újra.”")
1:
_midpoint_to_key("Mélyet szippant a levegőbe.\n„Igen.”\n„Enyhe töltött káposzta, por és üvegvisszaváltás.”\n„Rendben.”\n„Mi a terve ma?”")
2:
_return_to_gate("„És magát nem érdeklik a szórólapok?”\n„Az érdektelenség az első lépés a bűnözés felé.”\n„Próbáld újra.”")
3:
_return_to_gate("„A pletyka intézmény.”\n„Nem játék.”\n„Próbáld újra.”")
func _branch_leave_unnoticed() -> void:
dialogue_ui.show_dialogue(
"Ibolya néni",
"„Észrevétlenül?”\nLassan végigmér.\n„Ebben a házban semmi nem észrevétlen.”\n„Még a huzatnak is neve van.”\n„Mit akar, hogy ne vegyenek észre?”",
oldlady_portrait,
[
{"label": "Hogy sietek."},
{"label": "Hogy hogy nincs kedvem beszélgetni."},
{"label": "Csak hogy leugrom a boltba."},
{"label": "Semmit. Csak nem akarok jelentős lenni."}
]
)
_connect_choice_once(_unnoticed_choice)
func _unnoticed_choice(i: int) -> void:
match i:
0:
_return_to_gate("„Siet.”\n„Mindig mindenki siet.”\n„Aztán visszajönnek ide panaszkodni. Hova siet ennyire?”")
1:
_midpoint_to_key("Nincs kedve beszélgetni?\n„Az baj.”\n„A közösség nem kívánságműsor.”\n„Hova megy ilyen nagy hallgatással?”")
2:
_midpoint_to_key("„Boltba.”\n„Melyikbe?”\n„Ne mondja, hogy mindegy.”")
3:
_return_to_gate("Csak menne.\n„Na így nem.”\n„Itt minden mozgásnak oka van.”\n„Próbáld újra.”")
func _return_to_gate(reply: String) -> void:
dialogue_ui.show_dialogue(
"Ibolya néni",
reply,
oldlady_portrait,
[
{"label": "Jó. Még egyszer."},
{"label": "Vissza."}
]
)
_connect_choice_once(_return_choice)
func _return_choice(i: int) -> void:
_start_gate()
func _midpoint_to_key(prompt: String) -> void:
dialogue_ui.show_dialogue(
"Ibolya néni",
prompt + "\nKözelebb hajol.\n„Utolsó kérdés.”\n„És most ne játsszon.”",
oldlady_portrait,
[
{"label": "Nem hozok fel senkit"},
{"label": "Nem lesz zaj."},
{"label": "Nem kerül szóba a nevem."},
{"label": "Visszajövök időben."}
]
)
_connect_choice_once(_final_question_choice)
func _final_question_choice(i: int) -> void:
match i:
0:
_grant_key()
1:
_grant_key()
2:
_return_to_gate("„A név mindig szóba kerül.”\n„Főleg, ha valaki azt hiszi, nem.”\n„Próbáld újra.”")
3:
_return_to_gate("„Időben?”\n„Az mit jelent magánál?”\n„Próbáld újra.”")
func _grant_key() -> void:
if has_key:
dialogue_ui.show_dialogue(
"Ibolya néni",
"„Már odaadtam a kulcsot.”\n„Menjen. Mielőtt meggondolom magam.”",
oldlady_portrait,
[]
)
player.set_can_move(true)
return
has_key = true
GameState.unlock_aurora = true
GameState.unlock_corridor = true
dialogue_ui.show_dialogue(
"Ibolya néni",
"Nagyot sóhajt, mintha valami megterhelőt kellett volna csinálnia.\n„Jól van.”\nA köténye zsebéből előhúz egy **kulcsot**.\n„Ezt az ajtója előtt találtam, egy cetlivel amire az volt ráírva -KERESD A SARKI FÉNYT-.”\n„Ha elhagyja, én fogom megtalálni. De magát, nem a kulcsot.”\n„Na menjen már. És ne csapja be az ajtót.”",
oldlady_portrait,
[]
)
await _play_item_get_sequence(spare_key_icon)
if dialogue_ui:
dialogue_ui.hide_dialogue()
if oldlady_eicon:
oldlady_eicon.visible = false
if exit_eicon:
exit_eicon.visible = true
player.set_can_move(true)Editor is loading...
Leave a Comment