Untitled
Anonymous
plain_text
02/22/2026 10:49 PM
14.7 KB
11
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 jó vagy. Csak ne felejtsd el megint, mert akkor megint én leszek a rossz rendőr.",
guard_portrait,
[]
)
return
player.set_can_move(false)
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Jó napot.\nA belépőkártya… az nincs.\n\nNekem mindegy, csak nem enged át a rendszer.\nMi a sztori?",
guard_portrait,
[
{"label": "Fent dolgozom a 9-en, a Warnernél."},
{"label": "Csak leugrottam a kondiba a -1-re."},
{"label": "Elhagytam a belépőm."},
{"label": "Nem volt még. Új vagyok / vendég vagyok."}
]
)
_connect_choice_once(_first_choice)
func _first_choice(i: int) -> void:
match i:
0:
_warner_hook()
1:
_gym_branch()
2:
_lost_branch()
3:
_new_branch()
# -------------------------------------------------
# Branches
# -------------------------------------------------
func _warner_hook() -> void:
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Warner…?\n\nNa jó. Ezt nem sokan mondják itt ki hangosan.\nMelyik iroda, grafika, ilyesmi?",
guard_portrait,
[
{"label": "Igen, grafikus vagyok ott fent."},
{"label": "Irodai meló, igen. Nem nagy sztori."},
{"label": "Inkább csak dolgozom, nem szeretném túlragozni."}
]
)
_connect_choice_once(_warner_followup)
func _warner_followup(i: int) -> void:
match i:
0:
_actor_slide_in("Aha. Grafikus.")
1:
_actor_slide_in("Oké, értem. Irodai.")
2:
_actor_slide_in("Jó, értem. Nem ragozzuk.")
func _actor_slide_in(prefix: String) -> void:
dialogue_ui.show_dialogue(
"Biztonsági őr",
prefix + "\n\nFigyelj… most lehet hülyén hangzik.\nÉn régen próbálkoztam színészettel.\nMeghallgatások, statisztálás, minden.\nAztán… hát, nem lett belőle semmi.\n\nDe ha tényleg Warner: ott vannak emberek, akik néha castingolnak, nem?\nVagy legalább ismernek valakit, aki ismer valakit.",
guard_portrait,
[
{"label": "Őszintén? Én csak grafikus vagyok, semmi ráhatásom."},
{"label": "Nem ígérek semmit, de megemlíthetem, hogy itt vagy."},
{"label": "Nem szeretnék ilyesmibe belefolyni."},
{"label": "Milyen szerepekre mentél? (kíváncsiság)"}
]
)
_connect_choice_once(_actor_deal)
func _actor_deal(i: int) -> void:
match i:
0:
_deal_stage("Persze, persze.\nÉrtem én.\nCsak gondoltam… mindegy.")
1:
_deal_stage("Tényleg? Ennyi nekem már több, mint a semmi.\nNem kell nagy dolog, csak… hogy tudjanak rólam.")
2:
_deal_stage("Rendben.\nNem erőltetem.\nCsak néha az ember bepróbálja, tudod.")
3:
_deal_stage("Á, mindenre.\nVolt, hogy 'fiatal apa' voltam a papíron.\nHarminchárom voltam és szakáll.\nAzt mondták: „köszönjük, majd hívjuk”.\nNem hívtak.\n\nNa mindegy.")
# --- Non-Warner branches converge toward “I can only do this if you’re legit”
func _gym_branch() -> void:
dialogue_ui.show_dialogue(
"Biztonsági őr",
"A kondi oké.\nCsak oda is kártya kell lefelé meg vissza is.\n\nFent dolgozol itt valahol, vagy tényleg csak edzés?",
guard_portrait,
[
{"label": "Fent dolgozom a 9-en, a Warnernél."},
{"label": "Nem, tényleg csak edzés. De régóta járok ide."},
{"label": "Most nehéz elmagyarázni… inkább segítesz?"}
]
)
_connect_choice_once(_gym_followup)
func _gym_followup(i: int) -> void:
match i:
0:
_warner_hook()
1:
_deal_stage("Értem.\nCsak én nem tudok 'régóta járok ide'-t beütni a gépbe.\nNév nélkül nincs mozgástér.")
2:
_deal_stage("Segíteni tudok, csak kell valami kapaszkodó.\nMert ha ide bejön valaki kártya nélkül, azt nekem kell magyarázni.")
func _lost_branch() -> void:
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Elhagytad.\nOké.\nNem te vagy az első.\n\nHol dolgozol itt? Az alapján tudok intézni újat.",
guard_portrait,
[
{"label": "9. emelet, Warner."},
{"label": "Itt a házban, csak nem a Warner. (hazudnék inkább nem)"},
{"label": "Nem akarok hazudni. 9. emelet, de nincs nálam semmi."}
]
)
_connect_choice_once(_lost_followup)
func _lost_followup(i: int) -> void:
match i:
0:
_warner_hook()
1:
_deal_stage("Oké.\nAkkor most vagy mondasz egy céget, vagy nem.\nDe én nem fogok találgatni helyetted.")
2:
_warner_hook()
func _new_branch() -> void:
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Új / vendég.\nOké.\nA vendéget általában felírják előre.\n\nKihez jöttél, vagy hol dolgozol?",
guard_portrait,
[
{"label": "9. emelet, Warner. Csak nincs még rendes kártyám."},
{"label": "Nem tudom a nevet / nem akarok kellemetlen helyzetet."},
{"label": "Inkább őszinte leszek: elbénáztam."}
]
)
_connect_choice_once(_new_followup)
func _new_followup(i: int) -> void:
match i:
0:
_warner_hook()
1:
_deal_stage("Értem.\nCsak így meg én kerülök kellemetlen helyzetbe.")
2:
_deal_stage("Oké.\nEzt legalább értem.\nNa, akkor csináljuk normálisan.")
# -------------------------------------------------
# Deal stage: guard offers proxy, wants a “mention”
# -------------------------------------------------
func _deal_stage(lead: String) -> void:
dialogue_ui.show_dialogue(
"Biztonsági őr",
lead + "\n\nNézd.\nTudok csinálni egy ideiglenes proxyt.\nDe kell hozzá valami, hogy ne én szívjam meg.\n\nHa tényleg Warner és ott vagy: annyit kérek, hogy említs meg egyszer.\nNem kell nagy dolog. Egy mondat.\nHogy itt ül egy ember, aki próbálkozott.\nEnnyi.",
guard_portrait,
[
{"label": "Oké. Megemlítem, de semmit nem ígérek."},
{"label": "Megemlítem… de ez tényleg nem az én asztalom."},
{"label": "Inkább ne keverjünk bele engem ebbe."},
{"label": "Adhatod így is? Ma tényleg kellene felmennem."}
]
)
_connect_choice_once(_deal_choice)
func _deal_choice(i: int) -> void:
match i:
0:
_final_stage("Rendben.\nEnnyi elég.\nTényleg. Nem kérek csodát.")
1:
_final_stage("Persze.\nÉn sem azt kérem, hogy holnap főszerep.\nCsak… hogy ne legyek teljesen láthatatlan.")
2:
# still allow progress, but make it feel like he's choosing to be nice
_final_stage("Jó.\nNem erőltetem.\nCsak gondoltam megpróbálom.\n\nNa mindegy.\nMegcsinálom, de legközelebb tényleg legyen nálad valami.")
3:
_final_stage("Ma?…\nOké.\nMegcsinálom.\nCsak ne legyen belőle szokás, jó?")
func _final_stage(prompt: String) -> void:
dialogue_ui.show_dialogue(
"Biztonsági őr",
prompt + "\n\nVárj.\nMindjárt összerakok egy proxyt.",
guard_portrait,
[
{"label": "Köszi."},
{"label": "Rendben. És… sok sikert."},
{"label": "Majd szólok, ha bármi van."}
]
)
_connect_choice_once(_grant_proxy)
func _grant_proxy(i: int) -> void:
has_proxy = true
GameState.unlock_foxpost = true
dialogue_ui.show_dialogue(
"Biztonsági őr",
"Elővesz egy nyakpántot meg egy kártyát.\nPötyög, néz, megint pötyög.\n\nKicsit tovább tart, mint kellene, de végül odanyújtja.\n„Na. Ideiglenes. Ne hagyd el.”",
guard_portrait,
[]
)
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