persona-community-5/pkg/persona/morphology.go
jordan bd2f591b98
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
ci/woodpecker/manual/woodpecker Pipeline was successful
Initialize project from skeleton template
2026-02-24 07:39:46 +00:00

124 lines
3.9 KiB
Go

package persona
// MorphologyHints describes non-human physical features for humanoid characters.
// These are only applied when MorphLevel >= 25, allowing progressive creature
// features based on the transformation intensity.
type MorphologyHints struct {
// EarType specifies non-human ear style.
// Values: "pointed", "elf", "wolf", "cat", "fox", "bat", "rabbit"
EarType string `json:"ear_type,omitempty" yaml:"ear_type,omitempty"`
// TailType specifies tail style if present.
// Values: "wolf", "cat", "fox", "demon", "dragon", "fluffy"
TailType string `json:"tail_type,omitempty" yaml:"tail_type,omitempty"`
// FangType specifies fang/teeth style.
// Values: "subtle", "vampire", "wolf", "cat", "demon"
FangType string `json:"fang_type,omitempty" yaml:"fang_type,omitempty"`
// FurPatterns describes fur distribution at higher morph levels.
// Example: ["light dusting on forearms", "along spine", "full coverage"]
FurPatterns []string `json:"fur_patterns,omitempty" yaml:"fur_patterns,omitempty"`
// ScalePattern describes scale distribution for reptilian creatures.
// Example: "iridescent patches on shoulders and cheeks"
ScalePattern string `json:"scale_pattern,omitempty" yaml:"scale_pattern,omitempty"`
// WingType specifies wing style if present.
// Values: "feathered", "bat", "fairy", "demon", "dragon"
WingType string `json:"wing_type,omitempty" yaml:"wing_type,omitempty"`
// HornType specifies horn style if present.
// Values: "small_curved", "ram", "demon", "unicorn", "antlers"
HornType string `json:"horn_type,omitempty" yaml:"horn_type,omitempty"`
// ClawType specifies claw/nail style.
// Values: "subtle", "retractable", "prominent", "talons"
ClawType string `json:"claw_type,omitempty" yaml:"claw_type,omitempty"`
}
// HasFeatures returns true if any morphology features are defined.
func (m *MorphologyHints) HasFeatures() bool {
if m == nil {
return false
}
return m.EarType != "" ||
m.TailType != "" ||
m.FangType != "" ||
len(m.FurPatterns) > 0 ||
m.ScalePattern != "" ||
m.WingType != "" ||
m.HornType != "" ||
m.ClawType != ""
}
// ValidEarTypes are the supported ear type values.
var ValidEarTypes = []string{
"pointed", "elf", "wolf", "cat", "fox", "bat", "rabbit",
}
// ValidTailTypes are the supported tail type values.
var ValidTailTypes = []string{
"wolf", "cat", "fox", "demon", "dragon", "fluffy",
}
// ValidFangTypes are the supported fang type values.
var ValidFangTypes = []string{
"subtle", "vampire", "wolf", "cat", "demon",
}
// ValidWingTypes are the supported wing type values.
var ValidWingTypes = []string{
"feathered", "bat", "fairy", "demon", "dragon",
}
// ValidHornTypes are the supported horn type values.
var ValidHornTypes = []string{
"small_curved", "ram", "demon", "unicorn", "antlers",
}
// ValidClawTypes are the supported claw type values.
var ValidClawTypes = []string{
"subtle", "retractable", "prominent", "talons",
}
// isValidType checks if a value is in the allowed list.
func isValidType(value string, allowed []string) bool {
for _, v := range allowed {
if v == value {
return true
}
}
return false
}
// IsValidEarType returns true if the ear type is valid.
func IsValidEarType(t string) bool {
return t == "" || isValidType(t, ValidEarTypes)
}
// IsValidTailType returns true if the tail type is valid.
func IsValidTailType(t string) bool {
return t == "" || isValidType(t, ValidTailTypes)
}
// IsValidFangType returns true if the fang type is valid.
func IsValidFangType(t string) bool {
return t == "" || isValidType(t, ValidFangTypes)
}
// IsValidWingType returns true if the wing type is valid.
func IsValidWingType(t string) bool {
return t == "" || isValidType(t, ValidWingTypes)
}
// IsValidHornType returns true if the horn type is valid.
func IsValidHornType(t string) bool {
return t == "" || isValidType(t, ValidHornTypes)
}
// IsValidClawType returns true if the claw type is valid.
func IsValidClawType(t string) bool {
return t == "" || isValidType(t, ValidClawTypes)
}