xiandie/scene/ux/prop_inventory_resource.gd
2025-07-31 05:07:26 +08:00

105 lines
3.2 KiB
GDScript

class_name PropInventory extends Resource
signal current_item_changed(prop_key: String)
@export var owner := ""
# 在外部可读不可写,因为需要按角色更新道具
@export var current_index := 0:
set(val):
if current_index != val:
# virtual id
val = wrapi(val, 0, virtual_items.size())
current_index = val
if virtual_items.size() > 0:
current_item_changed.emit(virtual_items[current_index])
else:
current_item_changed.emit("")
# 重要物品,不可丢弃,在背包可见
@export var important_items := [] as Array[String]
# 未查看的重要物品,红点效果
@export var unviewed_important_items := [] as Array[String]
@export var default_enabled_items := [] as Array[String]
@export var xdie_enabled_items := [] as Array[String]
@export var xxdie_enabled_items := [] as Array[String]
@export var xxxdie_enabled_items := [] as Array[String]
var enabled_items: Array[String]
var virtual_items: Array[String]
# virtual
var disabled_tmp_props := [] as Array[String]
func checkout(character: String):
# @export_enum("吕萍", "吕萍爬行", "吕萍带小猫", "吕萍推柜子", "小小蝶", "盒子猫", "小小小蝶") var character := "吕萍":
if character.begins_with("小小小蝶"):
enabled_items = xxxdie_enabled_items
elif character.begins_with("小小蝶"):
enabled_items = xxdie_enabled_items
elif character.begins_with("吕萍"):
enabled_items = xdie_enabled_items
else:
enabled_items = default_enabled_items
virtual_items = virtual_enabled_items(true)
func enable_important_item(prop_key: String) -> void:
if not important_items.has(prop_key):
important_items.append(prop_key)
unviewed_important_items.append(prop_key)
func has_prop(prop_key: String) -> bool:
if not virtual_items.has(prop_key):
return false
return not disabled_tmp_props.has(prop_key)
# return current virtual item key
func current_item_key() -> String:
if virtual_items.is_empty():
return ""
current_index = wrapi(current_index, 0, virtual_items.size())
return virtual_items[current_index]
func enable_item(prop_key: String, inspect := true) -> void:
# 重复 enable 无负面影响
if not enabled_items.has(prop_key):
enabled_items.append(prop_key)
# 消除临时禁用
disabled_tmp_props.erase(prop_key)
virtual_items = virtual_enabled_items(true)
# 如果 inspect, 则直接选中为当前条目
if inspect:
current_index = virtual_items.find(prop_key)
func disable_item(prop_key: String) -> void:
disabled_tmp_props.erase(prop_key)
# if enabled_items.has(prop_key):
enabled_items.erase(prop_key)
virtual_items = virtual_enabled_items(true)
# wrap index
current_index = clampi(current_index, 0, virtual_items.size())
func disable_item_temp(prop_key: String) -> void:
disabled_tmp_props.append(prop_key)
virtual_items = virtual_enabled_items(true)
# return true if the index changed
func index_wrap_add(delta: int) -> void:
# auto wrapped in setter
current_index = wrapi(current_index + delta, 0, virtual_items.size())
func virtual_enabled_items(refresh := false, clear_tmps := false) -> Array[String]:
if clear_tmps:
disabled_tmp_props.clear()
if refresh:
virtual_items = enabled_items.duplicate()
for k in disabled_tmp_props:
virtual_items.erase(k)
return virtual_items