2025-07-02 07:32:37 +00:00
|
|
|
@tool
|
2025-06-27 14:52:46 +00:00
|
|
|
extends Node2D
|
|
|
|
class_name Event2D
|
|
|
|
|
|
|
|
# 当前事件
|
2025-07-02 07:32:37 +00:00
|
|
|
@export var event: StringName
|
|
|
|
@export var hide_if_on_stage: Array[int] = []
|
|
|
|
# 前置依赖事件,为空时意味着无前置事件
|
|
|
|
@export var pre_event: StringName
|
|
|
|
@export var hide_if_pre_on_stage: 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-02 16:32:37 +00:00
|
|
|
# if event != &"":
|
|
|
|
# name = "Event_" + event
|
2025-07-02 07:32:37 +00:00
|
|
|
if Engine.is_editor_hint():
|
|
|
|
return
|
|
|
|
if event == &"":
|
|
|
|
printerr("[Event2D] event is not set. continue processing...")
|
2025-06-27 14:52:46 +00:00
|
|
|
stage = EventManager.get_stage(event)
|
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-02 07:32:37 +00:00
|
|
|
func refresh_visibility() -> void:
|
|
|
|
var should_show = not stage in hide_if_on_stage and not prev_stage in hide_if_pre_on_stage
|
|
|
|
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-06-27 14:52:46 +00:00
|
|
|
if e == pre_event:
|
2025-07-02 07:32:37 +00:00
|
|
|
pre_updated = prev_stage != s
|
2025-06-27 14:52:46 +00:00
|
|
|
prev_stage = s
|
|
|
|
print("[Event2D] Pre-event stage updated: %s, stage: %s" % [pre_event, prev_stage])
|
|
|
|
elif e == event:
|
2025-07-02 07:32:37 +00:00
|
|
|
updated = stage != s
|
2025-06-27 14:52:46 +00:00
|
|
|
stage = s
|
|
|
|
print("[Event2D] Event stage updated: %s, stage: %s" % [event, 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
|
|
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
if len(chapter) != 3:
|
|
|
|
printerr("[Event2D] _create_script chapter name error: %s" % ground.scene_name)
|
|
|
|
return
|
|
|
|
var file_name = name.to_snake_case() + ".gd"
|
|
|
|
var path = "res://scene/ground/script/" + chapter + "/" + file_name
|
|
|
|
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():
|
|
|
|
var text = 'EventManager.set_stage_if_greater(&"%s", 1)' % event
|
|
|
|
DisplayServer.clipboard_set(text)
|
|
|
|
print("Copied event greater setter: %s" % text)
|
|
|
|
|
|
|
|
func _copy_setter():
|
|
|
|
var text = 'EventManager.set_stage(&"%s", 1)' % event
|
|
|
|
DisplayServer.clipboard_set(text)
|
|
|
|
print("Copied event setter: %s" % text)
|
|
|
|
|
|
|
|
|
|
|
|
func _copy_getter():
|
|
|
|
var text = 'EventManager.get_stage(&"%s")' % event
|
|
|
|
DisplayServer.clipboard_set(text)
|
|
|
|
print("Copied event getter: %s" % text)
|