Expand camera and pose variation in card generation

This commit is contained in:
2026-06-18 00:16:54 +09:00
parent d52fad552a
commit 4fa98ea4e5
3 changed files with 5057 additions and 5019 deletions

View File

@@ -48,6 +48,7 @@ The game art direction is adult-oriented multi-world pinup:
- High-damage stages should make the combat feel intense through missing or destroyed hand, foot, shoulder, abdomen, hip, and torso armor/clothing. Strong adult damaged-costume presentation should be used wherever possible, and the composition should be built to show it clearly.
- Adult pinup body language is strongly encouraged when it remains framed as battle damage, defeat, or damaged-costume card art. Use arched backs, twisted torsos, hip-forward stances, side-back views, exposed-leg kneeling, strained chest/shoulder posture, damaged-costume torso silhouettes, and defeated poses that emphasize mature curves. Do not depict intimate acts, penetration, minors, gore, or explicit closeups.
- Do not keep every card as a straight front shot. Use camera variety across stages: front/three-quarter for baseline, side or twisted side for abdomen impacts, and rear three-quarter or side-back views for heavy damage and defeated art when it helps show shoulder, back, cloak, and armor destruction.
- For each character, force low-angle or high-angle framing somewhere in every consecutive damage-set. Stages should not read as a mirrored front-facing sequence even when same movement language is used.
All damage-state art must use adult characters only. Intimate acts, penetration, childlike characters, and gore are out of scope; adult-only damaged-costume presentation, adult pinup posing, mature body language, and visible non-sensitive body areas are allowed and encouraged when framed as battle damage, defeat, or damaged-costume card art. Do not make the roster feel like a teen-safe or modest game; high-damage cards should read unmistakably as adult-only card art while remaining non-explicit.

File diff suppressed because one or more lines are too long

View File

@@ -175,34 +175,44 @@ function damageSpec(stage) {
const CAMERA_VARIANTS = {
normal: [
"front three-quarter composition, clean face visibility, full body centered",
"low-angle front composition from knee-height, upward energy on the stance and hips",
"high-angle three-quarter look-down view, knees and torso readable while still showing face",
"soft side-front camera, weight shifted into the lead foot",
"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: [
"three-quarter front shot with slight side angle, enough to show first damage marks",
"low side angle showing bent knee, shoulder hit, and first torn fabric edge",
"high-angle diagonal from above, showing torso recoil and waist/arm damage",
"dynamic side-front camera with a small shoulder turn",
"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",
"high-angle side view with visible hip turn and split seams",
"rearward three-quarter action angle while keeping enough face profile",
"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, torn shoulder and torso damage visible under impact",
"rear three-quarter side-back angle from slightly below, showing opened back and waist zones",
"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",
],
};
@@ -211,26 +221,41 @@ const POSE_VARIANTS = {
"combat-ready neutral launch stance with even weight and a controlled torso twist",
"alert guard pose with one hand forward, weapon ready at half-step",
"forward-bent readiness pose, shoulders aligned for immediate counterattack",
"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",
],
light: [
"reaction pose after first impact, one shoulder dropping and feet rebalancing",
"counter-step pose with hip pivot and hand reposition around weapon",
"upper-body twist and short recoil, keeping face and weapon in view",
"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",
],
medium: [
"strained mid-combat pose with bent knee, waist coil, and heavy shoulder impact",
"arm-blocking, torso-rotating hit reaction showing exposed flank",
"charging recovery pose while the damaged arm pushes and the hips shift backward",
"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",
],
heavy: [
"collapsed combat pose, torso over one leg and shoulders catching recoil",
"weapon-gripped recovery pose with broken stance and side body collapse",
"wounded counterpose, upper body twisted, one shoulder dropped low from impact",
"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",
],
defeated: [
"kneeling collapse with one hand low and one hand gripping broken gear",
"half-fallen arched-back pose showing loss of balance and pain",
"seated back-leaning defeat pose with heavy breathing and exposed impact line",
"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",
],
};
@@ -243,19 +268,31 @@ function charSeed(text) {
return hash >>> 0;
}
function pickDeterministic(list, seed, salt = 0) {
const value = (seed + salt * 2654435761) >>> 0;
return list[value % list.length];
function pickDiverseOption(list, seed, stage, step) {
const baseIndex = (seed + stage * step) % list.length;
const prevIndex = stage > 0 ? (seed + (stage - 1) * step) % list.length : -1;
const index = stage > 0 && baseIndex === prevIndex ? (baseIndex + 1) % list.length : baseIndex;
return list[index];
}
function pickCameraForStage(spec, character, stage) {
const list = CAMERA_VARIANTS[spec.label] ?? CAMERA_VARIANTS.normal;
return pickDeterministic(list, charSeed(`${character.id}-${character.scene}`), stage * 17 + list.length);
return pickDiverseOption(
list,
charSeed(`${character.id}-${character.scene}`),
stage,
17,
);
}
function pickPoseModifier(spec, character, stage) {
const list = POSE_VARIANTS[spec.label] ?? POSE_VARIANTS.normal;
return pickDeterministic(list, charSeed(`${character.pose}-${character.weapon}`), stage * 19 + 11);
return pickDiverseOption(
list,
charSeed(`${character.pose}-${character.weapon}`),
stage,
19,
);
}
function promptFor(character, stage) {
@@ -287,7 +324,7 @@ 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.`,
`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.`,
`Adult visual appeal: ${character.appealFocus}; ${adultAppeal}.`,
`Scene/backdrop: ${character.scene}; ${elementName} elemental atmosphere; no other characters.`,
`Style/medium: ${character.style}, portrait card composition.`,