Nodes/SceneWeaver/Scene Entity - Horror
ComfyUI Node

Scene Entity - Horror

Pin Down One Monster, Then Drop It Into Any Scene

By EnragedAntelope·Created 29 days ago·Updated 2 days ago· 4
Scene Entity - Horror
    • entity_text
    • entity
    ◄seed0►
    ◄kindRandom►
    ◄subkindRandom►
    ◄scaleRandom►
    ◄conditionRandom►
    ◄formRandom►
    ◄materialRandom►
    ◄primary_colorRandom►
    ◄accent_colorRandom►
    ◄markingsRandom►
    ◄surface_detailRandom►
    ◄appendagesRandom►
    ◄appendage_countRandom►
    ◄emittersRandom►
    ◄emitter_countRandom►
    ◄emitter_colorRandom►
    ◄armamentRandom►
    ◄armament_countRandom►
    ◄sensorsRandom►
    ◄sensor_countRandom►
    ◄apertureRandom►
    ◄extrasRandom►

    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 - a SCENE_ENTITY payload for one of the Scene Weaver's optional entity_1_in … entity_4_in sockets.

    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._meta reports the rule and why it lost.
    • A field left on Random is 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_count says - 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.

    Categoryconditioning/sceneweaver

    Inputs (22)

    NameTypeDefaultDescription
    seedINT00–18446744073709550000Seed for reproducible scenes. The control below defaults to 'randomize' so every run differs; set it to 'fixed' to reproduce a scene.
    kindCOMBORandomWhat 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
    subkindCOMBORandomThe specific type within the kind -- a ghoul, a banshee, a porcelain doll. Identity | Random=randomize, value=lock, None=omit
    scaleCOMBORandomHow big it is relative to a person. Identity | Random=randomize, value=lock, None=omit
    conditionCOMBORandomAge, decay and state -- rotting, freshly risen, entombed, boarded-up. Identity | Random=randomize, value=lock, None=omit
    formCOMBORandomThe silhouette: a gait, a build, a body plan, a building's shape. Form & Material | Random=randomize, value=lock, None=omit
    materialCOMBORandomWhat it is covered in, made of, or wearing. Form & Material | Random=randomize, value=lock, None=omit
    primary_colorCOMBORandomThe colour of the thing itself -- skin, robes, wallpaper. Never the lighting. Surface & Colour | Random=randomize, value=lock, None=omit
    accent_colorCOMBORandomA secondary colour: trim, a stain, a sash. Surface & Colour | Random=randomize, value=lock, None=omit
    markingsCOMBORandomScrawled sigils, stains, burn marks. Carries no readable lettering. Surface & Colour | Random=randomize, value=lock, None=omit
    surface_detailCOMBORandomFinish and wear at close range -- cracked varnish, grave dirt, wet rot. Surface & Colour | Random=randomize, value=lock, None=omit
    appendagesCOMBORandomWhat sticks out: antlers, claws, tendrils, a lantern pole, a chimney. Components | Random=randomize, value=lock, None=omit
    appendage_countCOMBORandomHow many. Composed into the appendage phrase. Components | Random=randomize, value=lock, None=omit
    emittersCOMBORandomWhat shines with its own light: eyes that catch the dark, a lantern, a cold spectral flame. Components | Random=randomize, value=lock, None=omit
    emitter_countCOMBORandomHow many. Components | Random=randomize, value=lock, None=omit
    emitter_colorCOMBORandomThe colour of the unnatural light. Belongs to the subject, not the lighting. Components | Random=randomize, value=lock, None=omit
    armamentCOMBORandomWeapons and implements, carried or grown: a cleaver, a sickle, claws. Components | Random=randomize, value=lock, None=omit
    armament_countCOMBORandomHow many. Components | Random=randomize, value=lock, None=omit
    sensorsCOMBORandomHow it watches: eyes, too many eyes, a blank stare. Components | Random=randomize, value=lock, None=omit
    sensor_countCOMBORandomHow many. Components | Random=randomize, value=lock, None=omit
    apertureCOMBORandomThe opening: a mouth, a mask, a door hanging open. Components | Random=randomize, value=lock, None=omit
    extrasCOMBORandomOne more distinguishing thing -- a lantern, a satchel, a chain of keys. Components | Random=randomize, value=lock, None=omit

    Outputs (2)

    NameTypeDescription
    entity_textSTRING—
    entitySCENE_ENTITY—