warlords
The hero figures of SENGOKU TRANCE. Four of them, built once at scene load and parked under `ST.anchor("Warlords")`: Oda Nobunaga, who is always on stage, and the three rivals, one of whom stands opposite him at a time.
game.warlords — Nobunaga and the three men across the decks
The hero figures of SENGOKU TRANCE. Four of them, built once at scene load
and parked under ST.anchor("Warlords"): Oda Nobunaga, who is always on
stage, and the three rivals, one of whom stands opposite him at a time.
local W = ST.need("game.warlords")
if W then
W.setRival("nagashino") -- a stage id, or a warlord key
W.breakRival() -- the staged collapse, with its own sound
W.restoreRival() -- put him back for a retry
local r = W.report() -- what the slice believes it is showing
end
Who they are, and how to tell them apart at 48 metres
Silhouette first. The gameplay camera never moves, and at that distance a figure is a shape before it is anything else, so each of the four is a different shape:
| figure | the shape | accent |
|---|---|---|
| Nobunaga | a great gold maedate flaring off a peaked namban helm, a jinbaori falling to the knee, and a set of decks he never takes his hands off | violet |
| Yoshimoto | a tall black court eboshi over shoulders twice the width of anybody else's, working a fan | cyan |
| Katsuyori | two swept horns and a sashimono standing a full body-height above his back, bringing a sword down on the beat | acid green |
| Mitsuhide | the narrowest figure in the game: a hood, and one straight line of naginata beside it | magenta |
They stand at heroic scale — about six metres on the stage deck, which puts them inside the torii opening. That number was tuned by capture against the real 1080x1440 viewport, not derived: a human-sized figure at 48 m is about eighty pixels tall and reads as a smudge.
How a figure is put together
A tree of pivots with geometry hung off them. The pivots are what the dance drives; the geometry never moves on its own. That is the whole difference between dancing and sliding.
WL_<key> root: world position, yaw, heroic scale
└── hips the bob and the weight shift
├── hipL / hipR → kneeL / kneeR
└── torso the lean and the counter-rotation
├── shL / shR → elL / elR arms; props hang off the elbows
├── head → helm the crown comes off in one piece
└── banner / cape lagging cloth
Local space: feet at y = 0, facing local -Z. That is measured, not
assumed — Transform.lookAtQuat(0,0,0, 0,0,-10) is the identity quaternion
on this engine, and the gameplay camera sits at -Z from the stage, so a
figure with no yaw looks straight down the highway.
Two rotation conventions the poses depend on, both measured the same way:
- a limb hanging along -Y swings forward for a positive pitch, and stands straight up at pitch = pi;
- a torso or head tips backward for a positive pitch.
So the kick crunches forward (negative), a flinch throws the head back (positive), and losing slumps forward.
What it listens to
Everything comes off ST.bus; this slice requires nobody.
| topic | what happens |
|---|---|
duel.begin | that stage's rival takes the stage, restored and upright |
duel.end | a break outcome runs the collapse |
note.spawn | the rival throws the arm on that side down the lane |
note.hit | the rival flinches, harder for a better judgement; Nobunaga accents |
note.miss | Nobunaga staggers |
meter.change | posture and glow follow RESOLVE and COMPOSURE; zero RESOLVE breaks him |
phase.change | the drop dances at 1.55x the groove, the intro at 0.55x |
screen.change | keeps the right rival on stage outside a duel |
Nothing here needs the conductor to exist. With no track bound, the beat comes from the slice's own clock at the current stage's BPM, so the figures dance on the title screen and in an empty scene — a warlord standing still reads as a broken game, not as a quiet moment.
The break
RESOLVE reaching zero is the moment the duel is won, so it is staged, not
faded: a white flash across the rival's accent surfaces, his helmet leaves
his head on a real arc, the banner goes over, and he goes down through an
arch and a fall in 2.4 seconds. restoreRival() puts him back, because a
retry has to start with a man on his feet.
It has its own sound. wl_break is synthesised on the CPU with
audio.encodePcm — lacquer plates letting go, a helmet on a wooden stage,
and the body behind it — so a failed generation somewhere else can never
make a warlord break in silence. wl_enter is the taiko hit under a rising
breath when a rival takes the stage. Both are PCM rather than Opus: an Opus
clip loses its first ~5 ms on decode (#8873) and both of these start on the
transient. The slice also emits the sfx topic, so the sound slice can
answer over the top when it wants to.
The art
/source/art/warlords/ — nineteen materials, fifteen meshes and two sound
clips, all authored by this slice and addressed by their folder-qualified
identity (art.warlords.wl_gold, never wl_gold).
Every surface carries a little emissive of its own. The scene's own lighting is near-black and the venue's rig swings between blackout and full laser; the fiction is UV-reactive pigment under a blacklight, and the effect is that a warlord is legible at every point in the light show rather than only the bright half. Each figure owns one accent material so its glow can be driven — beat pulse, damage dim, break flash — without touching anybody else's surfaces.
Three mesh generators cover what the primitives cannot: a tapered box (every armour plate and cap), a ribbon swept along an arc (crests, horns, blades) and a hanging cloth (banners, capes, robes). All flat-shaded on purpose — this is a woodblock print, not a render test.
W.authorArt(true) re-authors the whole art set in place, keeping every
guid; call it after changing a generator.
Scoped to this part · feeds back into the world's score.