WIP checkpoint: Implement avatar loader and customization UI in Godot
This commit is contained in:
@@ -47,9 +47,32 @@ const ATTACHMENT_SLOTS: PackedStringArray = [
|
||||
const MULTI_SLOT_IDS: PackedStringArray = ["accessory"]
|
||||
|
||||
|
||||
## Metadata for a single slot.
|
||||
class SlotDefinition:
|
||||
## The slot ID string (e.g. "head", "hair").
|
||||
var slot_key: String
|
||||
## "body_part" or "attachment".
|
||||
var category: String
|
||||
## Primary mount bone name(s).
|
||||
var mount_bones: PackedStringArray
|
||||
## Whether at most one item can occupy this slot.
|
||||
var exclusive: bool
|
||||
## Whether this slot replaces a base mesh.
|
||||
var is_body_part: bool
|
||||
|
||||
func _init(p_slot_key: String, p_category: String, p_mount_bones: PackedStringArray,
|
||||
p_exclusive: bool, p_is_body_part: bool) -> void:
|
||||
slot_key = p_slot_key
|
||||
category = p_category
|
||||
mount_bones = p_mount_bones
|
||||
exclusive = p_exclusive
|
||||
is_body_part = p_is_body_part
|
||||
|
||||
|
||||
# Slot metadata lookup tables (indexed by SLOT_IDS position).
|
||||
# Each entry: { category, mount_bones, exclusive, is_body_part }
|
||||
var _slot_data: Dictionary = {}
|
||||
var _slot_definitions: Array[SlotDefinition] = []
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
@@ -150,6 +173,18 @@ func _build_registry() -> void:
|
||||
},
|
||||
}
|
||||
|
||||
# Build SlotDefinition objects.
|
||||
for slot_id in SLOT_IDS:
|
||||
var data = _slot_data[slot_id]
|
||||
var def := SlotDefinition.new(
|
||||
slot_id,
|
||||
data["category"],
|
||||
PackedStringArray(data["mount_bones"]),
|
||||
data["exclusive"],
|
||||
data["is_body_part"],
|
||||
)
|
||||
_slot_definitions.append(def)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Public API
|
||||
@@ -165,6 +200,21 @@ static func has_slot(slot_id: String) -> bool:
|
||||
return slot_id in SLOT_IDS
|
||||
|
||||
|
||||
## Returns the SlotDefinition for a slot, or null if unknown.
|
||||
static func get_slot(slot_id: String) -> SlotDefinition:
|
||||
if not has_slot(slot_id):
|
||||
return null
|
||||
for def in _slot_definitions:
|
||||
if def.slot_key == slot_id:
|
||||
return def
|
||||
return null
|
||||
|
||||
|
||||
## Returns all SlotDefinition objects in canonical order.
|
||||
static func get_slot_definitions() -> Array[SlotDefinition]:
|
||||
return _slot_definitions
|
||||
|
||||
|
||||
## Returns the category for a slot ("body_part" or "attachment").
|
||||
static func get_category(slot_id: String) -> String:
|
||||
if not has_slot(slot_id):
|
||||
|
||||
Reference in New Issue
Block a user