xiandie/manager/event_manager/event2d.gd
2025-07-02 15:32:37 +08:00

90 lines
2.3 KiB
GDScript

@tool
extends Node2D
class_name Event2D
# 当前事件
@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] = []
@export_tool_button("创建脚本") var create_script := _create_script
var prev_stage := 0
var stage := 0
func _ready() -> void:
if Engine.is_editor_hint():
return
if event == &"":
printerr("[Event2D] event is not set. continue processing...")
stage = EventManager.get_stage(event)
refresh_visibility()
SceneManager.ground_ready.connect(_on_ground_ready)
EventManager.stage_updated.connect(_on_global_stage_updated)
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
func _on_global_stage_updated(e: StringName, s: int):
var updated = false
var pre_updated = false
if e == pre_event:
pre_updated = prev_stage != s
prev_stage = s
print("[Event2D] Pre-event stage updated: %s, stage: %s" % [pre_event, prev_stage])
elif e == event:
updated = stage != s
stage = s
print("[Event2D] Event stage updated: %s, stage: %s" % [event, stage])
refresh_visibility()
if pre_updated:
_on_pre_stage_updated()
if updated:
_on_stage_updated()
func _on_ground_ready(ground: Ground2D):
pass
func _on_pre_stage_updated():
pass
func _on_stage_updated():
pass
###### 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)