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 = false
Editor is loading...
Leave a Comment