@lain@kaia Takes less than seven seconds to generate a monster from nothing.
Several stats are generated in a program first using random weights then I feed those to the LLM to ask for a description. There are a lot of cases where I need to constrain the LLM more and it's really hard to do that. Like I can tell it "make the monster's hair red" and sometimes it will still make the monster's hair silver or something.
In some cases I fix up the data after I get it by regex. For example, I will tell it to make a tall monster and it will return that the monster is five foot three inches. so I regex and replace with a good height. it works most of the time but I can't predict every way it describes height.
I am breaking out more things into weighted random stats so that it's easier to feed them back into LLM later or generate onscreen lists. I am going to try to create "fusion" for two monsters. It would be cool to make it so it has hair color attributes of both and then can do a random pick or somehow mix the colors.
@kaia So what I am doing is, very randomly (like 1 in 1000) a monster in my game is a humanoid female with the tomboy attribute set.
When that value is true, I submit a custom prompt to my LLM that attempts to generate a good description of a tomboy for the monster.
It's hit-and-miss. Sometimes it generates great descriptions and sometimes it just says "this character is a tomboy"
Here's an example:
node dist/generate-humanoid.js --sex female --inspiration adventurer,puppy --tomboy true --eyes hazel --sexy
{
"sexy": true,
"humanoid": true,
"insubordinate": 0,
"height": "tall",
"sex": "female",
"inspirations": [
"adventurer",
"puppy"
],
"eyes": "hazel",
"tomboy": true,
"likes": "Hiking in the woods, chasing after her own tail, playing fetch with other Fedimon friends.",
"dislikes": "Being cooped up indoors for too long, being treated like a delicate flower, having her independence taken away.",
"name": "VixenPup",
"description": "Stands at 5 feet, 9 inches tall with a lean, athletic build.",
"personality": "The vixenpup is a bold and adventurous tomboy who loves to explore the wilderness.",
"moves": [
{
"move_type": "defense",
"move_name": "Tailchase",
"defensive_move_description": "The vixenpup uses her agility and speed to swiftly chase after her own tail, creating a whirlwind effect that protects her from incoming attacks.",
"move_raises_my_stat": "speed"
},
{
"move_type": "attack",
"move_name": "Playful growl",
"offensive_move_description": "The vixenpup lets out a deep, playful growl that intimidates her opponents and weakens their resolve to fight.",
"move_lowers_opponent_stat": "attack"
},
{
"move_type": "attack",
"move_name": "Fetch tug",
"offensive_move_description": "The vixenpup throws a small object at her opponent, then quickly pulls it back with a powerful tug.",
"move_lowers_opponent_stat": "accuracy"
}
]
}
I am now doing two calls to the local LLM: the first creates the character. Then I take the data and feed it back in to a second request to generate moves.
The moves aren't good enough to use as-is yet. They frequently mix up stats.
$ LLAMA_URL=http://192.168.0.168:8080 node dist/generate-humanoid.js --sex female --inspiration elf,lawyer --tomboy true --eyes blue --extra-description "She loves cookies and milk."
{
"sexy": false,
"humanoid": true,
"insubordinate": 0,
"height": "normal",
"sex": "female",
"inspirations": [
"elf",
"lawyer"
],
"eyes": "blue",
"tomboy": true,
"likes": "Baking cookies in the evening while enjoying milk as dessert, performing magic tricks using legal documents, watching legal dramas featuring strong female lawyers.",
"dislikes": "Disorganized environments and being called delicate or girly by others.",
"name": "Elyra",
"description": "She has long silver hair that flows like waterfalls, with two braids on either side of her head.",
"personality": "A tomboy at heart, yet she carries herself with grace and dignity.",
"moves": [
{
"move_type": "defense",
"move_name": "Legalese",
"defensive_move_description": "Elyra uses her knowledge of complex legal language to confuse and evade opponents.",
"move_raises_my_stat": "defense"
},
{
"move_type": "attack",
"move_name": "Bakerella",
"offensive_move_description": "Elyra mixes up a powerful concoction of cookie dough, throwing it at her opponent with great force.",
"move_lowers_opponent_stat": "speed"
},
{
"move_type": "attack",
"move_name": "Sleight oflaw",
"offensive_move_description": "Elyra swiftly maneuvers legal documents to create illusions and distract opponents, allowing her to strike.",
"move_lowers_opponent_stat": "accuracy",
"secondary_effect": "confusion"
}
]
}
I figured out if I give TWO inspirations for a monster, the result is more interesting and seems to generate better output.
Embed this noticeMoon (moon@fediffusion.art)'s status on Thursday, 08-Feb-2024 07:30:58 JST
Moon{
"sexy": true,
"humanoid": true,
"height": "tall",
"sex": "female",
"deredere": "yandere",
"inspiration": "slime and warrior",
"eyes": "brown",
"likes": "Loves to dance seductively, devouring her prey slowly and sensually.",
"dislikes": "Being rejected or ignored by her desired crush, other female Fedimon showing interest in her lover.",
"name": "SlimeWarrioress",
"description": "Her long, flowing hair cascades down her back like tendrils of dark seaweed.",
"personality": "Is a tall, voluptuous female Fedimon with slimy green skin that shimmers underneath the moonlight."
}
Local generation is now, as close to perfect as I think I'm going to get:
{
"sexy": true,
"humanoid": true,
"sex": "female",
"deredere": "deredere",
"monster_name": "Buffalove",
"physical_description": "Buffalove has a buffalo like body with two large ears and a short tail.",
"likes": "Hugging people, spending time outside in nature, making new friends.",
"dislikes": "Jealousy and drama, negative energy, being alone."
}
It took a lot of learning to get results this good.