124 lines
3.9 KiB
Go
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)
|
|
}
|