Scene Entity - Horror
Pin Down One Monster, Then Drop It Into Any Scene
- entity_text
- entity
Optional node, and worth saying plainly: Scene Weaver - Horror already builds a complete scene with a fully-described subject. You only want Scene Entity when you need a second thing described just as deeply, or one monster you can reuse across a dozen scenes without it drifting into a different monster each render.
It describes exactly one entity - silhouette, material, colours, markings, close-range wear, appendages and how many, what glows and in what colour, weapons, how it watches, its aperture - and emits that as a payload a scene can consume.
What it gives you
Two outputs, and the split is the point:
entity_text- the entity as it will read inside a scene, in prose. Wire it to a Show Text node to read it. No setting, no action.entity- aSCENE_ENTITYpayload for one of the Scene Weaver's optionalentity_1_in…entity_4_insockets.
The absence is deliberate. No environment, no situation, no relations, because the scene owns all three. A wired entity that insisted on "crawling out of a well" would fight every scene you put it in. The scene decides where it is and what it's doing; the entity decides what it is.
That socket is genre-agnostic on purpose: a horror entity wires happily into a Fantasy or Sci-Fi Scene Weaver, and a sci-fi one wires into a haunted house. A cryptid built for a bog works fine standing in an elf glade, and the pack treats that as a feature. It's a dedicated socket type rather than a plain string, which is why you can't accidentally plug it into a text input and get silence.
How the vocabulary is scoped
Every field is Random / a value / None. kind governs the rest - it scopes the options and labels of everything beneath it - and horror's kinds are undead (ghoul, bog body, drowned revenant, walking skeleton), spirit (ghost, banshee, poltergeist, weeping apparition), cryptid (werewolf, antlered stalker, living scarecrow, moth-winged watcher), eldritch horror, mortal (hooded cultist, plague doctor, lantern-bearing warden), cursed object (porcelain doll, music box, spirit board) and haunted place (abandoned farmhouse, ruined chapel, derelict motel).
So a porcelain doll doesn't get a cleaver, and a manor doesn't get teeth. There's no gore filter on this node, deliberately: the gore setting belongs to the scene the entity lands in, not the entity, so No gore is set on the Weaver. Your own locks are still always kept.
What happens when you wire it in
- A field you locked is a choice. It beats that slot's own widgets and beats a coherence rule, and
prompt_json._metareports the rule and why it lost. - A field left on
Randomis a draw. The scene picks a place that can hold the whole wired subject first, and re-draws a drawn field only when no place can - naming what it re-drew on the node face. - Situation and relations never come from the entity. Those stay the scene's call.
- The wired slot gets the top detail allowance, but it's a promotion, not an exemption. A ghoul carries its whole component list; a haunted house only its silhouette, however many widgets you locked.
- Wiring a slot occupies it whatever
entity_countsays - connecting a node is the more explicit statement, and the count is raised to match.
The readout on this node shows exactly what it will contribute to a one-entity scene, so it works as a preview before you wire anything.
Why bother at all
Reuse. A diffusion model has no internal notion of this creature - there's no character identity hiding in the weights, just statistical patterns - so the only thing carrying your drowned revenant between scenes is the description. Lock the fields that made it work, fix the seed, and the creature comes back. Prompt-level consistency, no training required.
Install
Manager: search SceneWeaver, install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/EnragedAntelope/comfyui-sceneweaver
Keep the directory named comfyui-sceneweaver. Zero dependencies - standard library only, no requirements.txt, nothing to build - but it needs ComfyUI 0.25.0+ (the newer comfy_api.latest node API) and Python 3.10+. Nodes land under conditioning/sceneweaver.
Horror vocabulary is extendable via a user_options.json beside the pack (gitignored, survives updates) with a "horror" section. Tags there interact with the scene's filter: conflict_only is what No gore hides.
python scripts/builtin_options.py subkind --kind cryptid --pack horror
Traps
Expecting the entity to supply an action. If you want the thing doing something, that's entity1_situation on the Weaver. The entity never provides it, whatever you wire.
Wiring it into a text encoder. entity_text goes there. The entity socket doesn't and can't - wrong type by design.
A locked, shrunken detail list on a building. A structure speaks only its silhouette in a scene, so a haunted house with every widget pinned still reads shorter than a ghoul with half of them locked. Budget, not bug.
Import errors on older ComfyUI. Below 0.25.0 you'll see comfy_api.latest fail at load rather than a node appearing.
_default pools for kind-scoped fields. form, material, surface_detail and markings are overridden by every kind, so a _default entry is never read. Put them under a kind name - the console warns you when they're in the wrong place.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| seed | INT | 00–18446744073709550000 | Seed for reproducible scenes. The control below defaults to 'randomize' so every run differs; set it to 'fixed' to reproduce a scene. |
| kind | COMBO | Random | What this entity fundamentally is. Scopes every other field on this slot -- its options and its labels. Set to None to leave the slot empty. Identity | Random=randomize, value=lock, None=omit |
| subkind | COMBO | Random | The specific type within the kind -- a ghoul, a banshee, a porcelain doll. Identity | Random=randomize, value=lock, None=omit |
| scale | COMBO | Random | How big it is relative to a person. Identity | Random=randomize, value=lock, None=omit |
| condition | COMBO | Random | Age, decay and state -- rotting, freshly risen, entombed, boarded-up. Identity | Random=randomize, value=lock, None=omit |
| form | COMBO | Random | The silhouette: a gait, a build, a body plan, a building's shape. Form & Material | Random=randomize, value=lock, None=omit |
| material | COMBO | Random | What it is covered in, made of, or wearing. Form & Material | Random=randomize, value=lock, None=omit |
| primary_color | COMBO | Random | The colour of the thing itself -- skin, robes, wallpaper. Never the lighting. Surface & Colour | Random=randomize, value=lock, None=omit |
| accent_color | COMBO | Random | A secondary colour: trim, a stain, a sash. Surface & Colour | Random=randomize, value=lock, None=omit |
| markings | COMBO | Random | Scrawled sigils, stains, burn marks. Carries no readable lettering. Surface & Colour | Random=randomize, value=lock, None=omit |
| surface_detail | COMBO | Random | Finish and wear at close range -- cracked varnish, grave dirt, wet rot. Surface & Colour | Random=randomize, value=lock, None=omit |
| appendages | COMBO | Random | What sticks out: antlers, claws, tendrils, a lantern pole, a chimney. Components | Random=randomize, value=lock, None=omit |
| appendage_count | COMBO | Random | How many. Composed into the appendage phrase. Components | Random=randomize, value=lock, None=omit |
| emitters | COMBO | Random | What shines with its own light: eyes that catch the dark, a lantern, a cold spectral flame. Components | Random=randomize, value=lock, None=omit |
| emitter_count | COMBO | Random | How many. Components | Random=randomize, value=lock, None=omit |
| emitter_color | COMBO | Random | The colour of the unnatural light. Belongs to the subject, not the lighting. Components | Random=randomize, value=lock, None=omit |
| armament | COMBO | Random | Weapons and implements, carried or grown: a cleaver, a sickle, claws. Components | Random=randomize, value=lock, None=omit |
| armament_count | COMBO | Random | How many. Components | Random=randomize, value=lock, None=omit |
| sensors | COMBO | Random | How it watches: eyes, too many eyes, a blank stare. Components | Random=randomize, value=lock, None=omit |
| sensor_count | COMBO | Random | How many. Components | Random=randomize, value=lock, None=omit |
| aperture | COMBO | Random | The opening: a mouth, a mask, a door hanging open. Components | Random=randomize, value=lock, None=omit |
| extras | COMBO | Random | One more distinguishing thing -- a lantern, a satchel, a chain of keys. Components | Random=randomize, value=lock, None=omit |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| entity_text | STRING | — |
| entity | SCENE_ENTITY | — |