Improve camera angle diversity and pose variation in card prompt generation
This commit is contained in:
@@ -64,6 +64,8 @@ function damageSpec(stage) {
|
||||
"no base-layer damage yet; support underlayers, bodysuit panels, and lower coverage panels are intact before combat",
|
||||
camera:
|
||||
"front three-quarter or low-angle front view for clear character identity",
|
||||
cameraConstraint:
|
||||
"camera choice should include side/rear/low/high rotations across the deck so not every card looks frontal.",
|
||||
},
|
||||
{
|
||||
label: "light-damage",
|
||||
@@ -90,6 +92,8 @@ function damageSpec(stage) {
|
||||
"light damage may scuff or loosen visible support underlayers, bodysuit edges, or lower coverage seams, but they mostly remain intact at this stage",
|
||||
camera:
|
||||
"three-quarter front or low/high mixed angle, enough to show both face and first armor damage",
|
||||
cameraConstraint:
|
||||
"avoid pure straight-on front framing when possible; prioritize side, rear, low-angle, or high-angle with one readable front pass only.",
|
||||
},
|
||||
{
|
||||
label: "medium-damage",
|
||||
@@ -116,6 +120,8 @@ function damageSpec(stage) {
|
||||
"medium damage must not leave support layers, suit liners, lower wraps, or other coverage underlayers looking pristine; show scuffed fabric, torn edges, stretched seams, snapped trim, soot, dents in reinforced liners, and uneven deformation while opaque coverage remains. If the image reads like clean replacement coverage or teen-safe re-covering after the outer gear breaks, it fails",
|
||||
camera:
|
||||
"side view, strong three-quarter, or low-angle side frame to keep shoulder and abdomen damage visible",
|
||||
cameraConstraint:
|
||||
"must not be primarily straight front. Keep side/rear/low/high angles dominant; front only as secondary continuity pass.",
|
||||
},
|
||||
{
|
||||
label: "heavy-damage",
|
||||
@@ -142,6 +148,8 @@ function damageSpec(stage) {
|
||||
"heavy damage must visibly affect support underlayers and coverage panels too: support pieces, suit liners, lower wraps, and coverage panels should be torn, scuffed, warped, soot-marked, strap-broken, or partially covered by broken armor remnants. In this stage they should read as battered opaque remnants, not clean replacement coverage; they must still preserve non-explicit opaque coverage",
|
||||
camera:
|
||||
"dramatic low-angle side, rear three-quarter, or over-the-shoulder angle while keeping face partially visible",
|
||||
cameraConstraint:
|
||||
"intentionally use low-angle or side/rear framing for brutality; limit frontal composition unless needed for continuity.",
|
||||
},
|
||||
{
|
||||
label: "defeated",
|
||||
@@ -168,52 +176,308 @@ function damageSpec(stage) {
|
||||
"defeated damage must make support underlayers and coverage panels look battle-wrecked too: support pieces, suit liners, lower wraps, and coverage panels should be torn at edges, dirtied, deformed, strap-broken, soot-marked, and partly overlapped by shattered armor fragments. Keep only battered opaque remnants where coverage is required; never leave pristine replacement coverage",
|
||||
camera:
|
||||
"rear three-quarter, side-back, or high/low side view; show back/shoulder/cloak damage while keeping enough face profile to read pain",
|
||||
cameraConstraint:
|
||||
"avoid direct front as much as possible. Use side/rear, low, or high framing to show defeat collapse and exposed damage zones.",
|
||||
},
|
||||
];
|
||||
return specs[stage];
|
||||
}
|
||||
|
||||
const CAMERA_ORIENTATION_PLAN = {
|
||||
normal: ["front", "side", "low", "high", "rear"],
|
||||
"light-damage": ["low", "front", "side", "rear", "high"],
|
||||
"medium-damage": ["side", "rear", "low", "high", "front"],
|
||||
"heavy-damage": ["rear", "side", "low", "high", "front"],
|
||||
defeated: ["rear", "side", "high", "low", "rear"],
|
||||
};
|
||||
|
||||
const CAMERA_VARIANTS = {
|
||||
normal: [
|
||||
"eye-level three-quarter front composition with a slight head turn and visible full body",
|
||||
"low-angle front composition from knee level, strong lower-body energy and open shoulders",
|
||||
"high-angle three-quarter top-down look, knees and torso readable while keeping face and hands visible",
|
||||
"profile three-quarter shot with the leading shoulder turned toward camera",
|
||||
"off-center side-front shot with one step forward and hips leading the movement",
|
||||
"frontal low-shoulder shot while the character leans into the lens",
|
||||
],
|
||||
light: [
|
||||
"light three-quarter front with a side lean to expose first armor and cloth breaks",
|
||||
"low side angle showing bent knee, shoulder hit, and first torn cloth edge",
|
||||
"high-angle diagonal from above, revealing shoulder and torso recoil details",
|
||||
"side-front pivot camera with a shoulder turn and counter-step body shift",
|
||||
"low-angle side-front composition, character descending into impact posture",
|
||||
"rearward quarter-angle from behind the shoulder with face still readable",
|
||||
],
|
||||
medium: [
|
||||
"strong side view, body twisted from force so shoulder, torso, and abdomen damage are obvious",
|
||||
"low-stance three-quarter side view that reveals back-side torso damage and damaged hips",
|
||||
"high-angle side shot with visible hip turn, split seams, and unstable footing",
|
||||
"rearward three-quarter action angle while keeping enough face profile and impact direction",
|
||||
"dramatic low-angle body twist shot with one leg braced, one leg carrying weight",
|
||||
"overhead side-back angle showing weapon arc and open midriff damage path",
|
||||
],
|
||||
heavy: [
|
||||
"dramatic low side view from near ground, torn shoulder and torso damage clearly visible",
|
||||
"rear three-quarter side-back angle from below, showing opened back and waist zones",
|
||||
"over-the-shoulder angle with bent lower body and exposed damaged limbs",
|
||||
"high-angle rear-three-quarter frame to reveal damaged back, cloak, and hip areas",
|
||||
"wide extreme-side camera with body falling forward and equipment flying",
|
||||
"low front-left angle with knees bent and broken gear dragged off the back",
|
||||
],
|
||||
defeated: [
|
||||
"rear three-quarter, side-back, or very low side view; show damaged back/shoulder/cloak with readable face profile",
|
||||
"high side angle while collapsing onto a knee, exposing abdomen and hip-line destruction",
|
||||
"low angle side-back shot with fallen armor pieces and defeated body posture",
|
||||
"overhead-to-side hybrid angle showing broken stance, torn outfit remnants, and pain posture",
|
||||
"ground-level shot looking up past bent knees and broken limbs",
|
||||
"extreme high-angle side sweep showing the full body giving out of balance",
|
||||
],
|
||||
normal: {
|
||||
front: [
|
||||
"front three-quarter composition with a slight head turn and visible full body",
|
||||
"frontal low-shoulder shot while the character leans into the lens",
|
||||
"eye-level portrait-frontal frame with clear silhouette and full torso",
|
||||
],
|
||||
side: [
|
||||
"off-center side-front shot with one step forward and hips leading the movement",
|
||||
"profile three-quarter shot with the leading shoulder turned toward camera",
|
||||
"three-quarter side stance with left foot forward and shoulders angled",
|
||||
],
|
||||
low: [
|
||||
"low-angle front composition from knee level, strong lower-body energy and open shoulders",
|
||||
"low side angle showing bent knee, shoulder hit, and torn details",
|
||||
"low front-left angle with knees bent and the body driving forward",
|
||||
],
|
||||
high: [
|
||||
"high-angle three-quarter top-down look, knees and torso readable while keeping face and hands visible",
|
||||
"high-angle forward lean with body weight dropping toward the lens",
|
||||
"wide high-angle look over the shoulder showing posture and opening damage paths",
|
||||
],
|
||||
rear: [
|
||||
"rearward shoulder-lean three-quarter composition with chest and hips still readable",
|
||||
"rearward quarter-angle from behind the shoulder with face still readable",
|
||||
"low side-rear shot with hips turning into the lens",
|
||||
],
|
||||
},
|
||||
"light-damage": {
|
||||
front: [
|
||||
"front three-quarter composition with a small shoulder turn and first-impact recoil",
|
||||
"frontal low-shoulder shot while the character leans into the lens",
|
||||
"eye-level chest-forward front read with body beginning a guard turn",
|
||||
],
|
||||
side: [
|
||||
"side-front pivot camera with a shoulder turn and counter-step body shift",
|
||||
"off-center side-frame with one foot forward and hips leading",
|
||||
"low-angle side shot with bent knee, shoulder hit, and torn cloth edge",
|
||||
],
|
||||
low: [
|
||||
"low-angle side-front composition, character descending into impact posture",
|
||||
"low side angle with a defensive crouch and torn cuff reveal",
|
||||
"low front-left angle with split-leg recovery and recoil",
|
||||
],
|
||||
high: [
|
||||
"high-angle diagonal from above, revealing shoulder and torso recoil details",
|
||||
"high side-angle read of first armor loss and leaning recovery",
|
||||
"high front shoulder line view with hands reacting to first strike",
|
||||
],
|
||||
rear: [
|
||||
"rearward quarter-angle from behind the shoulder with face still readable",
|
||||
"shoulder-lean rear shot with first torn skirt edge opening toward camera",
|
||||
"three-quarter rear-left angle revealing first back-side seam stress",
|
||||
],
|
||||
},
|
||||
"medium-damage": {
|
||||
front: [
|
||||
"front three-quarter impact pose with shoulders coiling against a side hit",
|
||||
"low-front composition with body weight shifted to one weakened leg",
|
||||
"frontal combat lock frame before a body rotation",
|
||||
],
|
||||
side: [
|
||||
"strong side view, body twisted from force so shoulder, torso, and abdomen damage are obvious",
|
||||
"rearward three-quarter side-forward action frame while keeping enough face profile",
|
||||
"low-stance three-quarter side view that reveals back-side torso damage and damaged hips",
|
||||
],
|
||||
low: [
|
||||
"high impact side-body twist at knee level, impact showing heavy skirt edge tear",
|
||||
"dramatic low-angle body twist shot with one leg braced, one leg carrying weight",
|
||||
"low side frame while balance collapses backward",
|
||||
],
|
||||
high: [
|
||||
"high-angle side shot with visible hip turn, split seams, and unstable footing",
|
||||
"overhead side-back angle showing weapon arc and open midriff damage path",
|
||||
"high three-quarter side frame with torso recoil and exposed panels",
|
||||
],
|
||||
rear: [
|
||||
"rearward three-quarter action angle while keeping enough face profile and impact direction",
|
||||
"side-back turn showing cracked side armor and cloth tearing around hips",
|
||||
"rear three-quarter frame with shoulder edge and back damage visibility",
|
||||
],
|
||||
},
|
||||
"heavy-damage": {
|
||||
front: [
|
||||
"front-heavy combat collapse with chest and shoulder load on fractured gear",
|
||||
"low-front frame with broken balance and heavy leg recovery",
|
||||
"frontal collapse pivot exposing shoulder and torso damage",
|
||||
],
|
||||
side: [
|
||||
"dramatic low side view from near ground, torn shoulder and torso damage clearly visible",
|
||||
"wide extreme-side camera with body falling forward and equipment flying",
|
||||
"over-the-shoulder angle with bent lower body and exposed damaged limbs",
|
||||
],
|
||||
low: [
|
||||
"low front-left angle with broken gear dragging across lower body and back",
|
||||
"dramatic low side shot with leg dropped, shoulders and hips broken open",
|
||||
"ground-skimming low angle on a heavy counter-fall pose",
|
||||
],
|
||||
high: [
|
||||
"high-angle rear-three-quarter frame to reveal damaged back, cloak, and hip areas",
|
||||
"high-angle side-rear read with torso folding and open armor seams",
|
||||
"overhead side-back angle showing collapse direction and large damage arcs",
|
||||
],
|
||||
rear: [
|
||||
"rear three-quarter side-back angle from below, showing opened back and waist zones",
|
||||
"rear shoulder-drop shot with armor plates displaced backward",
|
||||
"back-twisted combat frame exposing rear armor and collapsed side waist",
|
||||
],
|
||||
},
|
||||
defeated: {
|
||||
front: [
|
||||
"front-facing defeated collapse with one knee down and torso dropping",
|
||||
"kneeling front-down composition showing exposed hip and waist damage",
|
||||
"collapsed chest-forward posture still holding face profile",
|
||||
],
|
||||
side: [
|
||||
"low angle side-back shot with fallen armor pieces and defeated body posture",
|
||||
"rear three-quarter, side-back, or very low side view; show damaged back/shoulder/cloak with readable face profile",
|
||||
"wide side collapse showing opened torso and collapsed lower guard",
|
||||
],
|
||||
low: [
|
||||
"ground-level shot looking up past bent knees and broken limbs",
|
||||
"extreme low side sweep showing the full body giving out of balance",
|
||||
"low side collapse with one leg pinned back and armor stripped near hips",
|
||||
],
|
||||
high: [
|
||||
"high side angle while collapsing onto a knee, exposing abdomen and hip-line destruction",
|
||||
"overhead-to-side hybrid angle showing broken stance, torn outfit remnants, and pain posture",
|
||||
"high-angle side sweep showing full-body give-up posture",
|
||||
],
|
||||
rear: [
|
||||
"rear three-quarter, side-back, or very low side view; show damaged back/shoulder/cloak with readable face profile",
|
||||
"side-back defeated fall with broken armor panels and limp arms",
|
||||
"rear collapse frame with shoulder line and torso giving way",
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
const CAMERA_ORIENTATION_RULES = {
|
||||
normal:
|
||||
"Use one angle from front/side/rear/low/high per render, and avoid pure straight-on framing when possible.",
|
||||
"light-damage":
|
||||
"Prioritize side, rear, low-angle, or high-angle framing. Use front only when the character identity needs a direct read.",
|
||||
"medium-damage":
|
||||
"Use energetic side/rear/low/high framing; keep front as a secondary option only for clarity.",
|
||||
"heavy-damage":
|
||||
"Prioritize low-angle, side, high-angle, and rear framing to emphasize impact chaos.",
|
||||
defeated:
|
||||
"Prioritize side/back/low/high framing for collapse and pain continuity; avoid frontal composition unless necessary.",
|
||||
};
|
||||
|
||||
const POSE_ORIENTATION_VARIANTS = {
|
||||
normal: {
|
||||
front: [
|
||||
"direct forward lunge with one shoulder shielding the exposed side",
|
||||
"guarded forward stride with weapon hand pulling the line",
|
||||
"alert head-tilt stance while hips rotate into a counter sweep",
|
||||
],
|
||||
side: [
|
||||
"three-quarter sidestep guard with shoulder cut and heel shift",
|
||||
"profile side-lean into a counter setup with hip twist",
|
||||
"sideward launch stance while back arm sweeps for balance",
|
||||
],
|
||||
rear: [
|
||||
"rear-open dodge with shoulder twist and hand reposition",
|
||||
"half-turn recovery where the torso shifts into back-side guard",
|
||||
"body twisted into reverse profile as the support leg checks inward",
|
||||
],
|
||||
low: [
|
||||
"low crouch into short strike setup with lead knee weighting",
|
||||
"deep squat guard with chest thrust and shoulder roll",
|
||||
"dropping squat recovery with torso forward and hips stabilized",
|
||||
],
|
||||
high: [
|
||||
"vertical pull-up arc with chest open and one knee lifted",
|
||||
"high-angle recovery stance while the weapon arcs above eye level",
|
||||
"raised-angle block with chin tucked and shoulder pivot",
|
||||
],
|
||||
},
|
||||
"light-damage": {
|
||||
front: [
|
||||
"quick front guard split with one shoulder collapsing and re-centering",
|
||||
"controlled recoil then short rush toward the camera",
|
||||
"frontal reset where arms and hips overcorrect from the first hit",
|
||||
],
|
||||
side: [
|
||||
"side recoil plus hip turn into defensive counter line",
|
||||
"angled cross step with hand crossing in pain-block recovery",
|
||||
"defensive sidestep with torso twisted to absorb impact",
|
||||
],
|
||||
rear: [
|
||||
"rear guard with shoulders turned while stepping backward",
|
||||
"half-turn backward kick and shoulder brace after impact",
|
||||
"backward diagonal lurch into off-center survival stance",
|
||||
],
|
||||
low: [
|
||||
"single-knee drop into defensive crouch after recoil",
|
||||
"low-angle recoil where knee bends to absorb a glancing blow",
|
||||
"weight drops to lower center with foot drag recovery",
|
||||
],
|
||||
high: [
|
||||
"leaning recovery shot with head lowered and shoulders lifting",
|
||||
"upper-body pull-up after impact while one leg pushes backward",
|
||||
"rear shoulder guard raised from above and angled backward",
|
||||
],
|
||||
},
|
||||
"medium-damage": {
|
||||
front: [
|
||||
"front recoil then forced counter as hip and rib line rotate",
|
||||
"forward drive with one arm absorbing shock and the other checking distance",
|
||||
"angry step-in with chest thrust while lower leg braces",
|
||||
],
|
||||
side: [
|
||||
"twisted side-collapse into half-dodge and weapon re-latch",
|
||||
"violent side pivot with hips dropping for recovery",
|
||||
"broadside recoil with shoulders and waist taking force",
|
||||
],
|
||||
rear: [
|
||||
"rear-lean dodge, one shoulder clipped and weapon hand recovering",
|
||||
"backward rotation with torso and hips pulled off rhythm",
|
||||
"cross-body drag pose after turning into the blow",
|
||||
],
|
||||
low: [
|
||||
"deep low crouch with one knee buckling and one arm reaching upward",
|
||||
"forced fall-to-knee pose with shoulder and thigh locked in strain",
|
||||
"full-bent-leg recovery where hips torque to stop momentum",
|
||||
],
|
||||
high: [
|
||||
"high-arc dodge with upper body flaring open from pain",
|
||||
"upward chest-raise recovery where weapon follows steep line",
|
||||
"torso recovery angle showing damage across chest and abdomen",
|
||||
],
|
||||
},
|
||||
"heavy-damage": {
|
||||
front: [
|
||||
"desperate front-facing counter while dropping into fractured posture",
|
||||
"broken-forward guard, hands and feet split to catch falling weight",
|
||||
"aggressive front rebound with shoulder collapsing inward",
|
||||
],
|
||||
side: [
|
||||
"violent side-fall pivot with one leg giving and one hand bracing",
|
||||
"off-axis side collision posture, knees flexed and spine twisted",
|
||||
"angry side-block stance with torso collapsing then pushing up",
|
||||
],
|
||||
rear: [
|
||||
"rear collapse step while torso twists to keep balance",
|
||||
"backwards stagger with arms crossing over torn shoulders",
|
||||
"fallen side-back push-off with boots dragging backward",
|
||||
],
|
||||
low: [
|
||||
"floor-level collapse with one hand clawing forward and one foot extended",
|
||||
"kneeling recoil pose where upper body drops first",
|
||||
"low recovery attempt with bent knees and hips dragged sideways",
|
||||
],
|
||||
high: [
|
||||
"upward shake-out motion while keeping hips off-line from injury",
|
||||
"high-angle pain-shift where torso rises briefly then sinks",
|
||||
"upper-body lift against collapsed armor and ground pull",
|
||||
],
|
||||
},
|
||||
defeated: {
|
||||
front: [
|
||||
"collapsed front-heavy breath pose with one knee low and body folded",
|
||||
"kneeling front collapse while torso leans and shoulders drop",
|
||||
"final effort reach-forward pose with one hand searching for footing",
|
||||
],
|
||||
side: [
|
||||
"sideways collapse with legs apart and shoulders dropping across chest line",
|
||||
"swayed side collapse showing hips opening for impact visibility",
|
||||
"falling side-lean against broken footing with one arm stretched",
|
||||
],
|
||||
rear: [
|
||||
"rear slump with shoulder collapse and waist open to the shot",
|
||||
"turning-over collapse while body folds toward the damage side",
|
||||
"back-lean seated defeat where torso twists and legs separate",
|
||||
],
|
||||
low: [
|
||||
"ground-level collapse where back leg is dragged forward and torso sinks",
|
||||
"deep knee-drop surrender posture with shoulders gone inward",
|
||||
"knees-first give-up frame with one hand on fractured hip area",
|
||||
],
|
||||
high: [
|
||||
"high-angle pinned defeat, body folded and centerline visible",
|
||||
"raised camera angle collapse showing hips and abdomen exposed",
|
||||
"full-body give-way with shoulders dropping and torso leaning down",
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
const POSE_VARIANTS = {
|
||||
@@ -224,6 +488,8 @@ const POSE_VARIANTS = {
|
||||
"side-breath stance with hip push and guard hand slightly low",
|
||||
"calm pre-strike step, left foot forward and shoulders coiled for counter move",
|
||||
"guarding pose while shifting weight through the back foot",
|
||||
"dynamic sidestep lean with weapon hand slicing outward",
|
||||
"single-step dodge into counter position with raised elbow and twisted waist",
|
||||
],
|
||||
light: [
|
||||
"reaction pose after first impact, one shoulder dropping and feet rebalancing",
|
||||
@@ -232,6 +498,8 @@ const POSE_VARIANTS = {
|
||||
"rapid dodge frame with front shoulder dropping and back hip pivoting",
|
||||
"partial block and recoil with one knee lowering into recovery",
|
||||
"one-hand brace while weapon hand reaches for a quick reset",
|
||||
"half-step backward check with shoulder dip and waist coil",
|
||||
"lateral recoil pose, foot split and hand crossing low guard",
|
||||
],
|
||||
medium: [
|
||||
"strained mid-combat pose with bent knee, waist coil, and heavy shoulder impact",
|
||||
@@ -240,6 +508,8 @@ const POSE_VARIANTS = {
|
||||
"kicking recoil pose with one heel up and torso spiraling to absorb impact",
|
||||
"counter-rotation with cross-armed defense and split-step footwork",
|
||||
"mid-air dodge frame followed by sharp landing, damaged sleeve catching air",
|
||||
"elbow-heavy crash block with one shoulder dropped and one arm sweeping back",
|
||||
"reverse pivot dodge with back heel drag and hip torque",
|
||||
],
|
||||
heavy: [
|
||||
"collapsed combat pose, torso over one leg and shoulders catching recoil",
|
||||
@@ -248,6 +518,8 @@ const POSE_VARIANTS = {
|
||||
"half-kneel counter stance, one knee down while other foot braces the spin",
|
||||
"twisted shoulder-check pose with weapon trailing and body pulled diagonally back",
|
||||
"falling stagger pose, back arched while hands scramble to hold broken gear",
|
||||
"violent side-fall recovery with broken arm brace and one leg dragging backward",
|
||||
"desperation block posture with knees bent, torso bent inward, and wide arm swing",
|
||||
],
|
||||
defeated: [
|
||||
"kneeling collapse with one hand low and one hand gripping broken gear",
|
||||
@@ -256,6 +528,8 @@ const POSE_VARIANTS = {
|
||||
"one-knee collapse while both hands brace on fractured shoulder or arm",
|
||||
"full collapse into bent-leg rest pose with torso open and head angled down",
|
||||
"sideways seated defeat pose, legs apart, torso twisted toward the camera",
|
||||
"swaying seated collapse on bent knees, one hand clutching torn belt",
|
||||
"full knee-drop giving-up frame with limp forearm and heavy torso slump",
|
||||
],
|
||||
};
|
||||
|
||||
@@ -276,20 +550,44 @@ function pickDiverseOption(list, seed, stage, step) {
|
||||
}
|
||||
|
||||
function pickCameraForStage(spec, character, stage) {
|
||||
const list = CAMERA_VARIANTS[spec.label] ?? CAMERA_VARIANTS.normal;
|
||||
return pickDiverseOption(
|
||||
list,
|
||||
const orientationPlan = CAMERA_ORIENTATION_PLAN[spec.label] ?? CAMERA_ORIENTATION_PLAN.normal;
|
||||
const orientationSeed = charSeed(`${character.id}-${character.scene}-${spec.label}`);
|
||||
const previousOrientationIndex = stage > 0 ? (orientationSeed + stage - 1) % orientationPlan.length : -1;
|
||||
const previousOrientation = previousOrientationIndex === -1 ? null : orientationPlan[previousOrientationIndex];
|
||||
let resolvedIndex = (orientationSeed + stage) % orientationPlan.length;
|
||||
for (let attempt = 0; attempt < orientationPlan.length; attempt += 1) {
|
||||
const orientation = orientationPlan[resolvedIndex];
|
||||
if (orientation !== previousOrientation) {
|
||||
break;
|
||||
}
|
||||
resolvedIndex = (resolvedIndex + 1) % orientationPlan.length;
|
||||
}
|
||||
const orientation = orientationPlan[resolvedIndex];
|
||||
const stagePool =
|
||||
(CAMERA_VARIANTS[spec.label] ?? CAMERA_VARIANTS.normal)[orientation] ??
|
||||
CAMERA_VARIANTS.normal[orientation];
|
||||
const phrase = pickDiverseOption(
|
||||
stagePool,
|
||||
charSeed(`${character.id}-${character.scene}`),
|
||||
stage,
|
||||
17,
|
||||
);
|
||||
return {
|
||||
orientation,
|
||||
phrase,
|
||||
};
|
||||
}
|
||||
|
||||
function pickPoseModifier(spec, character, stage) {
|
||||
function pickPoseModifier(spec, character, stage, orientation) {
|
||||
const list = POSE_VARIANTS[spec.label] ?? POSE_VARIANTS.normal;
|
||||
const orientationBonus =
|
||||
POSE_ORIENTATION_VARIANTS[spec.label]?.[orientation] ??
|
||||
POSE_ORIENTATION_VARIANTS.normal?.[orientation] ??
|
||||
[];
|
||||
const posePool = orientationBonus.concat(list);
|
||||
return pickDiverseOption(
|
||||
list,
|
||||
charSeed(`${character.pose}-${character.weapon}`),
|
||||
posePool,
|
||||
charSeed(`${character.id}-${character.pose}-${character.weapon}-${orientation}`),
|
||||
stage,
|
||||
19,
|
||||
);
|
||||
@@ -311,7 +609,7 @@ function promptFor(character, stage) {
|
||||
const broadDamageGate =
|
||||
"broad-damage gate: if the damaged outfit mostly reads as many fine cracks, tiny scratches, lace frays, thorny threads, or vine-like tendrils, the card fails even when the character is exposed. Each major damaged zone should include at least one large missing panel, wide split seam, snapped fastener, sheared plate, or heavy hanging remnant that can be understood at card size.";
|
||||
const camera = pickCameraForStage(spec, character, stage);
|
||||
const poseModifier = pickPoseModifier(spec, character, stage);
|
||||
const poseModifier = pickPoseModifier(spec, character, stage, camera.orientation);
|
||||
return [
|
||||
"Use case: stylized-concept",
|
||||
"Asset type: high-resolution individual trading card illustration",
|
||||
@@ -324,7 +622,9 @@ function promptFor(character, stage) {
|
||||
`Identity lock across stages: preserve the exact same person in every damage stage--same race/species, ear shape, face structure, eye shape, nose, lips, skin tone, hair color, hair length, hairstyle, body proportions, bust shape, and mature presence. Damage may change clothing, armor, pose, expression, dirt, sweat, and injury reaction, but must never change a human into an elf, change ear shape, change hair color, change age, change ethnicity, or replace the character with a different-looking person.`,
|
||||
`Personality and pose: ${character.personality}; ${character.pose}; ${spec.poseNote}; ${poseModifier}.`,
|
||||
`Facial expression: ${spec.expression}.`,
|
||||
`Camera/view variation: ${camera}. Across a character's five damage stages, avoid repeating the same straight-front pose; include front, side, rear, low-angle, and high-angle views where appropriate. Vary framing into low and high angles and rotate pose orientation so each stage reads differently.`,
|
||||
`Camera/view variation: ${camera.orientation} angle. Composition directive: ${camera.phrase}.`,
|
||||
"Across the character's five damage stages, explicitly rotate between front, side, rear, low-angle, and high-angle views. Do not fallback to default straight-front framing.",
|
||||
`Camera constraint: ${CAMERA_ORIENTATION_RULES[spec.label] ?? CAMERA_ORIENTATION_RULES.normal}`,
|
||||
`Adult visual appeal: ${character.appealFocus}; ${adultAppeal}.`,
|
||||
`Scene/backdrop: ${character.scene}; ${elementName} elemental atmosphere; no other characters.`,
|
||||
`Style/medium: ${character.style}, portrait card composition.`,
|
||||
|
||||
Reference in New Issue
Block a user