xiandie/manager/event_manager/event2d.gd

178 lines
5.3 KiB
GDScript3
Raw Normal View History

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:21:52 +00:00
@export var event_name: StringName:
2025-07-06 12:44:06 +00:00
set(val):
2025-07-07 03:21:52 +00:00
if event_name != val:
event_name = val
2025-07-06 12:44:06 +00:00
if is_node_ready() and Engine.is_editor_hint():
_auto_memo()
2025-07-07 03:16:19 +00:00
@export_enum("none", "show", "hide") var event_mode := "show"
2025-07-07 03:21:52 +00:00
@export var event_stages: Array[int] = []:
2025-07-06 12:44:06 +00:00
set(val):
2025-07-07 03:21:52 +00:00
if event_stages != val:
event_stages = val
2025-07-06 12:44:06 +00:00
if is_node_ready() and Engine.is_editor_hint():
_auto_memo()
2025-07-02 07:32:37 +00:00
# 前置依赖事件,为空时意味着无前置事件
2025-07-07 03:21:52 +00:00
@export var pre_event_name: StringName:
2025-07-06 12:44:06 +00:00
set(val):
2025-07-07 03:21:52 +00:00
if pre_event_name != val:
pre_event_name = val
2025-07-06 12:44:06 +00:00
if is_node_ready() and Engine.is_editor_hint():
_auto_memo()
2025-07-07 03:16:19 +00:00
@export_enum("none", "show", "hide") var pre_event_mode := "show"
2025-07-07 03:21:52 +00:00
@export var pre_event_stages: Array[int] = []:
2025-07-06 12:44:06 +00:00
set(val):
2025-07-07 03:21:52 +00:00
if pre_event_stages != val:
pre_event_stages = val
2025-07-06 12:44:06 +00:00
if is_node_ready() and Engine.is_editor_hint():
_auto_memo()
@export_multiline var event_memo := ""
@export_tool_button("auto memo") var auto_memo = _auto_memo
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 stage := 0
var prev_stage := 0
2025-06-27 14:52:46 +00:00
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():
_auto_memo()
2025-07-02 07:32:37 +00:00
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 11:01:12 +00:00
print("[Event2D] Pre-event stage updated: %s, stage: %s" % [pre_event_name, prev_stage])
2025-07-07 03:16:19 +00:00
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-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-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)
2025-07-06 12:44:06 +00:00
func _auto_memo() -> void:
2025-07-07 11:01:12 +00:00
var memo_str := ""
# if EventManager
2025-07-07 11:01:12 +00:00
if pre_event_name != &"" and pre_event_mode != "none":
memo_str += "当前置事件["
2025-07-07 03:21:52 +00:00
memo_str += pre_event_name
2025-07-07 11:01:12 +00:00
memo_str += "=" if pre_event_mode == "show" else "!="
var stages = await EventManager.map_event_stages(pre_event_name, pre_event_stages)
memo_str += "|".join(stages) + "]"
2025-07-07 11:01:12 +00:00
if event_name != &"" and event_mode != "none":
memo_str += "" if memo_str.is_empty() else "\n并且"
memo_str += "当事件["
memo_str += event_name
memo_str += "=" if event_mode == "show" else "!="
var stages = await EventManager.map_event_stages(event_name, event_stages)
memo_str += "|".join(stages) + "]时"
2025-07-07 11:01:12 +00:00
memo_str += "" if memo_str.is_empty() else "显示该节点"
2025-07-06 12:44:06 +00:00
var existing_lines = event_memo.split("\n")
# 保留 # 开头的 line
var kept_lines = []
for line in existing_lines:
if line.begins_with("#"):
kept_lines.append(line)
event_memo = "\n".join(kept_lines)
event_memo += "\n" if kept_lines else ""
event_memo += memo_str