2025-12-30 17:22:29 +08:00
|
|
|
|
@tool
|
|
|
|
|
|
@icon("res://addons/reedscene/prop/icon/prop_state_icon.svg")
|
|
|
|
|
|
class_name ReedPropState extends Node
|
|
|
|
|
|
|
2025-12-31 13:07:31 +08:00
|
|
|
|
##状态编号,默认为-1,-1是不可用编号,状态编号由StateManager发布,不可以自己修改。
|
|
|
|
|
|
@export_custom(PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_READ_ONLY) var state_id: int = -1
|
2025-12-30 17:22:29 +08:00
|
|
|
|
##该State的信息是否需要被存入Save中
|
|
|
|
|
|
@export var save_game: bool = false
|
|
|
|
|
|
|
|
|
|
|
|
##预装的一些Effect,可以用来对State进行一些初始化
|
|
|
|
|
|
@export var effects: Array[ReedPropEffect] = []
|
|
|
|
|
|
|
2026-01-03 23:21:04 +08:00
|
|
|
|
const DEFAULT_NAME = "Default"
|
|
|
|
|
|
|
2025-12-30 17:22:29 +08:00
|
|
|
|
##State的拥有者
|
|
|
|
|
|
var _owner
|
|
|
|
|
|
##State的prop comp
|
|
|
|
|
|
var _owner_prop_comp
|
|
|
|
|
|
## 是否已经初始化
|
|
|
|
|
|
var _inited: bool = false
|
2026-01-04 21:21:01 +08:00
|
|
|
|
## State的真实name,默认会去掉ID
|
|
|
|
|
|
var _true_name: StringName = ""
|
|
|
|
|
|
|
|
|
|
|
|
func _enter_tree() -> void:
|
|
|
|
|
|
_true_name = _get_true_name()
|
|
|
|
|
|
|
|
|
|
|
|
if not self.renamed.is_connected(_on_renamed):
|
|
|
|
|
|
self.renamed.connect(_on_renamed)
|
|
|
|
|
|
|
|
|
|
|
|
## 在命名修改的时候,会自动的更正缓存的TrueName
|
|
|
|
|
|
func _on_renamed() -> void:
|
|
|
|
|
|
_true_name = _get_true_name()
|
|
|
|
|
|
|
|
|
|
|
|
func _get_true_name() -> String:
|
|
|
|
|
|
var s = get_parent()
|
|
|
|
|
|
if s and s.has_method(&"_strip_id_prefix"):
|
|
|
|
|
|
return s._strip_id_prefix(self.name)
|
|
|
|
|
|
return self.name
|
2025-12-30 17:22:29 +08:00
|
|
|
|
|
|
|
|
|
|
##初始化State
|
|
|
|
|
|
func init(owner: Node, prop_comp: Node) -> bool:
|
|
|
|
|
|
# 防止重复初始化
|
|
|
|
|
|
if _inited:
|
|
|
|
|
|
push_warning("ReedPropState [%s] already initialized." % name)
|
|
|
|
|
|
return false
|
|
|
|
|
|
|
|
|
|
|
|
if owner == null:
|
|
|
|
|
|
push_error("ReedPropState [%s] init failed: owner is null." % name)
|
|
|
|
|
|
return false
|
|
|
|
|
|
|
|
|
|
|
|
if prop_comp == null:
|
|
|
|
|
|
push_error("ReedPropState [%s] init failed: prop_comp is null." % name)
|
|
|
|
|
|
return false
|
|
|
|
|
|
|
|
|
|
|
|
_owner = owner
|
|
|
|
|
|
_owner_prop_comp = prop_comp
|
|
|
|
|
|
_inited = true
|
|
|
|
|
|
return true
|
|
|
|
|
|
|
|
|
|
|
|
##是否可以进入此状态,默认为真
|
|
|
|
|
|
func can_enter(_current: ReedPropState, _ctx: Dictionary) -> bool:
|
|
|
|
|
|
return true
|
|
|
|
|
|
|
|
|
|
|
|
##State进入
|
|
|
|
|
|
func on_enter(_from: ReedPropState, _ctx: Dictionary) -> void:
|
|
|
|
|
|
if not _inited:
|
|
|
|
|
|
push_error("ReedPropState [%s] entered before init!" % name)
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
for e in effects:
|
|
|
|
|
|
e.apply(_owner, _owner_prop_comp, _ctx)
|
|
|
|
|
|
|
|
|
|
|
|
##State退出
|
|
|
|
|
|
func on_exit(_to: ReedPropState, _ctx: Dictionary) -> void:
|
|
|
|
|
|
pass
|
2026-01-04 21:21:01 +08:00
|
|
|
|
|
|
|
|
|
|
## 外部可以通过state的引用返回真实名
|
|
|
|
|
|
func get_state_name() -> StringName:
|
|
|
|
|
|
return _true_name
|