2025-07-02 07:32:37 +00:00
|
|
|
@tool
|
2025-06-27 14:52:46 +00:00
|
|
|
extends Node2D
|
|
|
|
class_name Event2D
|
|
|
|
|
|
|
|
# 当前事件
|
2025-07-07 03:16:19 +00:00
|
|
|
@export_group("event")
|
|
|
|
@export var event_name: StringName
|
|
|
|
@export_enum("none", "show", "hide") var event_mode := "show"
|
|
|
|
@export var event_stages: Array[int] = []
|
2025-07-02 07:32:37 +00:00
|
|
|
# 前置依赖事件,为空时意味着无前置事件
|
2025-07-07 03:16:19 +00:00
|
|
|
@export_group("pre_event")
|
|
|
|
@export var pre_event_name: StringName
|
|
|
|
@export_enum("none", "show", "hide") var pre_event_mode := "show"
|
|
|
|
@export var pre_event_stages: Array[int] = []
|
2025-07-02 11:58:36 +00:00
|
|
|
@export_tool_button("创建脚本") var create_script = _create_script
|
|
|
|
@export_tool_button("复制 greater setter") var copy_greater_setter = _copy_greater_setter
|
|
|
|
@export_tool_button("复制 setter") var copy_setter = _copy_setter
|
|
|
|
@export_tool_button("复制 getter") var copy_getter = _copy_getter
|
2025-06-27 14:52:46 +00:00
|
|
|
|
|
|
|
var prev_stage := 0
|
|
|
|
var stage := 0
|
|
|
|
|
|
|
|
|
|
|
|
func _ready() -> void:
|
2025-07-07 03:16:19 +00:00
|
|
|
# if event_name != &"":
|
|
|
|
# name = "Event_" + event_name
|
2025-07-02 07:32:37 +00:00
|
|
|
if Engine.is_editor_hint():
|
|
|
|
return
|
2025-07-07 03:16:19 +00:00
|
|
|
if event_name != "":
|
|
|
|
stage = EventManager.get_stage(event_name)
|
|
|
|
if pre_event_name != "":
|
|
|
|
prev_stage = EventManager.get_stage(pre_event_name)
|
2025-07-02 07:32:37 +00:00
|
|
|
refresh_visibility()
|
2025-06-27 14:52:46 +00:00
|
|
|
SceneManager.ground_ready.connect(_on_ground_ready)
|
|
|
|
EventManager.stage_updated.connect(_on_global_stage_updated)
|
|
|
|
|
|
|
|
|
2025-07-07 03:16:19 +00:00
|
|
|
# 前置允许显示了,后续才可以显示
|
2025-07-02 07:32:37 +00:00
|
|
|
func refresh_visibility() -> void:
|
2025-07-07 03:16:19 +00:00
|
|
|
var should_show = true
|
|
|
|
if pre_event_name != &"" and pre_event_mode != "none":
|
|
|
|
should_show = prev_stage in pre_event_stages
|
|
|
|
if pre_event_mode == "hide":
|
|
|
|
should_show = !should_show
|
|
|
|
if should_show and event_name != &"" and event_mode != "none":
|
|
|
|
should_show = stage in event_stages
|
|
|
|
if event_mode == "hide":
|
|
|
|
should_show = !should_show
|
2025-07-02 07:32:37 +00:00
|
|
|
if visible != should_show:
|
|
|
|
visible = should_show
|
|
|
|
|
|
|
|
|
2025-06-27 14:52:46 +00:00
|
|
|
func _on_global_stage_updated(e: StringName, s: int):
|
2025-07-02 07:32:37 +00:00
|
|
|
var updated = false
|
|
|
|
var pre_updated = false
|
2025-07-07 03:16:19 +00:00
|
|
|
if e == pre_event_name:
|
2025-07-02 07:32:37 +00:00
|
|
|
pre_updated = prev_stage != s
|
2025-06-27 14:52:46 +00:00
|
|
|
prev_stage = s
|
2025-07-07 03:16:19 +00:00
|
|
|
print(
|
|
|
|
"[Event2D] Pre-event_name stage updated: %s, stage: %s" % [pre_event_name, prev_stage]
|
|
|
|
)
|
|
|
|
elif e == event_name:
|
2025-07-02 07:32:37 +00:00
|
|
|
updated = stage != s
|
2025-06-27 14:52:46 +00:00
|
|
|
stage = s
|
2025-07-07 03:16:19 +00:00
|
|
|
print("[Event2D] Event stage updated: %s, stage: %s" % [event_name, stage])
|
2025-07-02 07:32:37 +00:00
|
|
|
refresh_visibility()
|
|
|
|
if pre_updated:
|
|
|
|
_on_pre_stage_updated()
|
|
|
|
if updated:
|
2025-06-27 14:52:46 +00:00
|
|
|
_on_stage_updated()
|
|
|
|
|
|
|
|
|
|
|
|
func _on_ground_ready(ground: Ground2D):
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
func _on_pre_stage_updated():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
func _on_stage_updated():
|
|
|
|
pass
|
2025-07-02 07:32:37 +00:00
|
|
|
|
|
|
|
|
|
|
|
###### TOOL BUTTON
|
|
|
|
|
|
|
|
var script_template = preload("uid://bmxsei74o3pyw") as Script
|
2025-07-04 13:02:27 +00:00
|
|
|
var script_root_dir = "res://scene/ground/script/"
|
2025-07-02 07:32:37 +00:00
|
|
|
|
2025-07-07 03:16:19 +00:00
|
|
|
|
2025-07-02 07:32:37 +00:00
|
|
|
func _create_script():
|
|
|
|
var script = script_template.duplicate(true) as Script
|
|
|
|
var ground = get_node("..")
|
|
|
|
while ground and not ground is Ground2D:
|
|
|
|
ground = ground.get_node("..")
|
|
|
|
if not ground:
|
|
|
|
printerr("[Event2D] _create_script Ground2D not found.")
|
|
|
|
return
|
|
|
|
var chapter = ground.scene_name.substr(0, 3)
|
2025-07-04 13:02:27 +00:00
|
|
|
var section = ground.scene_name.substr(4, 3)
|
|
|
|
if len(chapter) != 3 or len(section) != 3:
|
|
|
|
printerr("[Event2D] ground scene_name error: %s" % ground.scene_name)
|
2025-07-02 07:32:37 +00:00
|
|
|
return
|
2025-07-04 13:02:27 +00:00
|
|
|
var file_name = section + "_" + name.to_snake_case() + ".gd"
|
|
|
|
var path = script_root_dir + chapter + "/" + file_name
|
2025-07-02 07:32:37 +00:00
|
|
|
if FileAccess.file_exists(path):
|
|
|
|
print("file exists, reattach the script to node: %s" % path)
|
|
|
|
set_script(load(path))
|
|
|
|
return
|
|
|
|
ResourceSaver.save(script, path)
|
|
|
|
set_script(load(path))
|
|
|
|
print("[Event2D] Script created: %s" % path)
|
2025-07-02 11:58:36 +00:00
|
|
|
|
|
|
|
|
|
|
|
func _copy_greater_setter():
|
2025-07-07 03:16:19 +00:00
|
|
|
var text = 'EventManager.set_stage_if_greater(&"%s", 1)' % event_name
|
2025-07-02 11:58:36 +00:00
|
|
|
DisplayServer.clipboard_set(text)
|
|
|
|
print("Copied event greater setter: %s" % text)
|
|
|
|
|
2025-07-07 03:16:19 +00:00
|
|
|
|
2025-07-02 11:58:36 +00:00
|
|
|
func _copy_setter():
|
2025-07-07 03:16:19 +00:00
|
|
|
var text = 'EventManager.set_stage(&"%s", 1)' % event_name
|
2025-07-02 11:58:36 +00:00
|
|
|
DisplayServer.clipboard_set(text)
|
|
|
|
print("Copied event setter: %s" % text)
|
|
|
|
|
|
|
|
|
|
|
|
func _copy_getter():
|
2025-07-07 03:16:19 +00:00
|
|
|
var text = 'EventManager.get_stage(&"%s")' % event_name
|
2025-07-02 11:58:36 +00:00
|
|
|
DisplayServer.clipboard_set(text)
|
|
|
|
print("Copied event getter: %s" % text)
|