xiandie/manager/event_manager/event2d.gd

112 lines
3.0 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-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)