Untitled
Anonymous
plain_text
02/22/2026 11:33 PM
16.1 KB
10
Indexable
extends Node2D
@export var guard_portrait: Texture2D
@export var proxy_icon: Texture2D # entrance pass icon
var dialogue_ui
var note_ui
var fade_rect
var item_get_overlay
var main_ref
@onready var player = $Player
@onready var guard_eicon: CanvasItem = get_node_or_null("BiztonsagiOr/EIcon")
@onready var exit_eicon: CanvasItem = get_node_or_null("ExitToHub/EIcon")
@onready var guard = _get_guard_interactable()
@onready var exit_to_hub = _get_exit_interactable()
var has_proxy := false
var _spawn_from := "left"
@onready var spawn_left: Marker2D = get_node_or_null("SpawnLeft")
@onready var spawn_right: Marker2D = get_node_or_null("SpawnRight")
func set_spawn_from(side: String) -> void:
_spawn_from = side
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
func _ready() -> void:
await _apply_spawn_if_present()
if guard != null:
guard.interacted.connect(_on_guard_interacted)
else:
push_error("BankCenter: BiztonsagiOr interactable not found.")
if exit_to_hub != null:
exit_to_hub.interacted.connect(_on_exit_to_hub)
if exit_eicon:
exit_eicon.visible = false
func _get_guard_interactable() -> Node:
var n := get_node_or_null("BiztonsagiOr")
if n == null:
return null
if n.has_signal("interacted"):
return n
var child := n.get_node_or_null("Interactable")
if child != null and child.has_signal("interacted"):
return child
return null
func _get_exit_interactable() -> Node:
var n := get_node_or_null("ExitToHub")
if n == null:
return null
if n.has_signal("interacted"):
return n
var child := n.get_node_or_null("Interactable")
if child != null and child.has_signal("interacted"):
return child
return null
func _apply_spawn_if_present() -> void:
if spawn_left == null or spawn_right == null:
return
var target := spawn_left if _spawn_from == "left" else spawn_right
player.set_can_move(false)
player.global_position = target.global_position
await get_tree().create_timer(0.2).timeout
player.set_can_move(true)
# -------------------------------------------------
# Dialogue connection helper
# -------------------------------------------------
func _connect_choice_once(handler: Callable) -> void:
if dialogue_ui == null:
push_error("BankCenter: 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)
# -------------------------------------------------
# Entry
# -------------------------------------------------
func _on_guard_interacted() -> void:
if has_proxy:
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Szia.\nMost már rendben vagy.\nCsak tényleg legyen nálad legközelebb, mert én nem szeretek magyarázkodni senkinek.",
guard_portrait,
[]
)
return
player.set_can_move(false)
_intro_question()
func _intro_question() -> void:
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Jó napot.\nKártyát nem látok.\n\nNem akarlak megállítani csak azért, mert ilyen napod van,\nviszont kártya nélkül én sem tudok úgy tenni, mintha nem láttam volna.\n\nHova mennél?",
guard_portrait,
[
{"label": "A 9.-re, a Warnerhez. Ott dolgozom."},
{"label": "A kondiba mennék le a -1-re."},
{"label": "Itt dolgozom a házban, csak nem a Warnernél."},
{"label": "Elhagytam a belépőm. Igen, ma."}
]
)
_connect_choice_once(_intro_choice)
func _intro_choice(i: int) -> void:
match i:
0:
_warner_branch()
1:
_deny_and_return(
"A kondi jó, értem.\nCsak az a gond, hogy ha most simán leengedlek, akkor onnantól bárki mondhatja, hogy „csak edzés”.\n\nNem veled van baj, hanem ezzel a mondattal.\nÉs én vagyok itt a mondat végén."
)
2:
_deny_and_return(
"Oké.\nAkkor most jön az a rész, hogy én kérdezem, melyik cég, és te azt mondod, hogy „mindegy, csak hadd menjek”.\n\nEzt a kört túl sokszor futottam.\nKártya nélkül nem tudom jó szívvel átlökni."
)
3:
_deny_and_return(
"Elhagytad.\nRendben.\nNem foglak leteremteni.\nCsak így most papíron egy ember vagy kártya nélkül, és az nekem nem jó helyzet.\n\nMondd inkább, hova mennél pontosan."
)
func _deny_and_return(text: String) -> void:
dialogue_ui.show_dialogue(
"Biztonsági őr",
text,
guard_portrait,
[
{"label": "Oké, akkor: a 9.-re mennék, Warner."},
{"label": "Értem. Akkor inkább visszafordulok."},
{"label": "Nem lehet valami ideiglenes megoldás?"}
]
)
_connect_choice_once(_deny_choice)
func _deny_choice(i: int) -> void:
match i:
0:
_warner_branch()
1:
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Rendben.\nNem haragszom.\nInkább így, mint hogy én járjak pórul.\nSzép napot.",
guard_portrait,
[]
)
player.set_can_move(true)
2:
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Ideiglenes van, csak ahhoz is kell, hogy tudjam, kinek és miért.\n\nNem kell nagy történet.\nCsak legyen valami, amibe bele tudok kapaszkodni.\nHova mennél?",
guard_portrait,
[
{"label": "A 9.-re, a Warnerhez."},
{"label": "Oké, hagyjuk. Majd máskor."}
]
)
_connect_choice_once(_temp_back)
func _temp_back(i: int) -> void:
match i:
0:
_warner_branch()
1:
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Jó.\nNem baj.\nNéha ez a legokosabb döntés.\nSzép napot.",
guard_portrait,
[]
)
player.set_can_move(true)
# -------------------------------------------------
# WARNER ARC
# -------------------------------------------------
func _warner_branch() -> void:
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Warner.\n\nOké.\nEz már egy konkrétum.\nMit csinálsz ott fent?",
guard_portrait,
[
{"label": "Grafikus vagyok."},
{"label": "Irodai meló, anyagok, ilyesmi."},
{"label": "Nem szeretném nagyon részletezni."}
]
)
_connect_choice_once(_warner_role)
func _warner_role(i: int) -> void:
match i:
0:
_actor_intro("Grafikus… oké.")
1:
_actor_intro("Jó, értem. Irodai.")
2:
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Oké, nem faggatlak.\nCsak tudd, hogy innen lent mindenki ugyanúgy hangzik, amikor nem akar részletezni.\n\nDe ha Warner, akkor… várj.\nKérdeznék valamit, és ha nem akarsz, nemet mondasz. Ennyi.",
guard_portrait,
[
{"label": "Kérdezd."},
{"label": "Inkább ne."}
]
)
_connect_choice_once(_ask_permission)
func _ask_permission(i: int) -> void:
match i:
0:
_actor_intro("Rendben.")
1:
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Oké.\nAkkor marad a hivatalos út.\nKártya nélkül most nem fog menni.\n\nSzép napot.",
guard_portrait,
[]
)
player.set_can_move(true)
func _actor_intro(prefix: String) -> void:
dialogue_ui.show_dialogue(
"Biztonsági őr",
prefix + "\n\nNézd, én nem szoktam ilyet mondani csak úgy.\nDe… amikor azt mondod, hogy Warner, én mindig kicsit felkapom a fejem.\n\nRégen próbálkoztam színészettel.\nNem „álmodozom a kávém felett” szinten, hanem tényleg.\nMeghallgatások, kisebb dolgok, egyszer még kaptam egy mondatot is.\nAztán valaki úgy döntött, hogy az a mondat mégse kell.\n\nAzóta itt vagyok.\nNem tragédia, csak… más műfaj.",
guard_portrait,
[
{"label": "Sajnálom. Ez biztos rohadt frusztráló."},
{"label": "Tök őszintén: én ebben nem tudok segíteni."},
{"label": "És mit szeretnél most? Mi lenne neked jó?"}
]
)
_connect_choice_once(_actor_choice)
func _actor_choice(i: int) -> void:
match i:
0:
_actor_open()
1:
_actor_block()
2:
_actor_open()
func _actor_block() -> void:
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Értem.\nTényleg.\nNem is azt várom, hogy bárki megoldja.\n\nCsak így akkor nincs miről beszélni.\nKártya nélkül most nem foglak átengedni.\n\nHa lesz rendes belépőd, onnantól nincs gond.",
guard_portrait,
[]
)
player.set_can_move(true)
func _actor_open() -> void:
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Nem nagy dologra gondolok.\nNem azt kérem, hogy holnap audition, meg fények.\n\nCsak… ha egyszer ott fent szóba kerül, hogy „valaki kellene ide-oda”,\nakkor mondd azt, hogy lent ül egy őr, aki próbálkozott, és még mindig nem utálja az egészet.\n\nTudom, kicsi esély.\nDe nekem ez egy mondat.\nNeked meg… egy mondat.\n\nCserébe csinálok egy ideiglenes proxyt, hogy ma ne állj itt tovább.",
guard_portrait,
[
{"label": "Oké. Megemlítem, de semmit nem ígérek."},
{"label": "Megemlítem, ha adódik alkalom. Ennyit tudok."},
{"label": "Nekem ez kellemetlen. Inkább ne."},
{"label": "Ha megemlítem, te meg tényleg csinálsz proxyt?"}
]
)
_connect_choice_once(_deal_choice)
func _deal_choice(i: int) -> void:
match i:
0:
_grant_proxy("Rendben.\nEnnyi bőven elég.\nTényleg.")
1:
_grant_proxy("Oké.\nNem akarok ebből többet.\nKöszi.")
2:
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Oké.\nAkkor nincs csere.\nNem sértődöm meg.\n\nCsak így proxy se lesz.\nMa nem fog menni.\n\nSzép napot.",
guard_portrait,
[]
)
player.set_can_move(true)
3:
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Igen.\nNem azért mondom, mert alkudozni akarok.\nCsak így mindkettőnknek van valami kapaszkodója.\n\nHa ez így belefér, akkor megcsinálom most.",
guard_portrait,
[
{"label": "Belefér. Megemlítem, de nem ígérek semmit."},
{"label": "Nem, inkább hagyjuk."}
]
)
_connect_choice_once(_confirm_deal)
func _confirm_deal(i: int) -> void:
match i:
0:
_grant_proxy("Oké.\nAkkor csináljuk.")
1:
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Rendben.\nAkkor marad úgy, ahogy van.\nSzép napot.",
guard_portrait,
[]
)
player.set_can_move(true)
# -------------------------------------------------
# Grant proxy + reward
# -------------------------------------------------
func _grant_proxy(pre_text: String) -> void:
dialogue_ui.show_dialogue(
"Biztonsági őr",
pre_text + "\n\nVárj egy pillanat.\nNem gyors, de megvan a menete.\n\nCsak tényleg: ne hagyd el. Én nem akarok ebből sorozatot.",
guard_portrait,
[]
)
_connect_choice_once(_grant_proxy_go) # if player presses E, it will close; we still want to continue
# If your DialogueUI doesn't emit choice_selected when there are no choices,
# we'll just proceed after typing finishes:
await _finish_proxy()
func _grant_proxy_go(_i: int) -> void:
# safety: not strictly needed; kept so the function exists if your UI emits something
pass
func _finish_proxy() -> void:
has_proxy = true
GameState.unlock_foxpost = true
while dialogue_ui != null and dialogue_ui.is_typing():
await get_tree().process_frame
await _play_item_get_sequence(proxy_icon)
if dialogue_ui != null:
dialogue_ui.hide_dialogue()
if exit_eicon:
exit_eicon.visible = true
player.set_can_move(true)
# -------------------------------------------------
# Exit
# -------------------------------------------------
func _on_exit_to_hub() -> void:
if not has_proxy:
return
if main_ref != null and main_ref.has_method("go_hub"):
main_ref.go_hub("left")
# -------------------------------------------------
# Reward animation
# -------------------------------------------------
func _play_item_get_sequence(texture: Texture2D) -> void:
if fade_rect == null or item_get_overlay == null:
return
var icon := item_get_overlay.get_node("Center/ItemIcon") as TextureRect
if icon == null:
return
fade_rect.visible = true
fade_rect.modulate.a = 0.0
item_get_overlay.visible = true
icon.visible = true
icon.texture = texture
icon.modulate = Color(1, 1, 1, 0)
var t := create_tween()
t.tween_property(fade_rect, "modulate:a", 1.0, 0.25)
await t.finished
var t2 := create_tween()
t2.tween_property(icon, "modulate:a", 1.0, 0.2)
await t2.finished
await get_tree().create_timer(0.4).timeout
var t3 := create_tween()
t3.tween_property(icon, "modulate:a", 0.0, 0.2)
await t3.finished
item_get_overlay.visible = false
var t4 := create_tween()
t4.tween_property(fade_rect, "modulate:a", 0.0, 0.25)
await t4.finished
fade_rect.visible = falseEditor is loading...
Leave a Comment