Skip to content

πŸ¦„ feat(web,rom): Prepare_For_Transfer script with an editable morph list - #981

Open
polynaut wants to merge 2 commits into
mainfrom
feature/prepare-for-transfer-script
Open

πŸ¦„ feat(web,rom): Prepare_For_Transfer script with an editable morph list#981
polynaut wants to merge 2 commits into
mainfrom
feature/prepare-for-transfer-script

Conversation

@polynaut

Copy link
Copy Markdown
Owner

The DazToHue G8β†’G9 transfer guide's first step β€” zero every G8/8.1 morph that also exists on G9 β€” was a by-hand dial hunt per character. The studio now ships it as a bundled Content Library script, with the morph list editable in Settings.

Prepare_For_Transfer (runtime v105)

  • New visible script beside Kill_Animation/Scan_Frames: select the G8/8.1 figure, run it, and every dial matching the list is zeroed. Uses the runtime's two-namespace dial walk (DzMorph modifiers + node-owned float properties β€” the pass a modifiers-only walk provably misses, measured in the v101 work). Locked dials are unlocked β†’ zeroed β†’ re-locked; an ERC-driven dial that still shows a value is named in the summary (zero its controlling dial) instead of silently surviving. Morph assets on disk are never touched; removing cloth/brows/lashes stays manual.
  • Settings β†’ new "Daz scripts" tab: the list is editable (defaults = the guide's ten entries), matching is contains on the normalized dial name/label β€” Nipple is the family, Breasts Size also hits PBMBreastsSize. Reset-to-defaults included.
  • Saving re-bakes the installed script: the list is baked via a __DTH_TRANSFER_MORPHS__ token and joins the .dth-runtime-installed stamp, so an edit re-installs on the next save/generate without a version bump; the api saveSettings hook re-ensures the install (no-op when nothing changed).
  • RUNTIME_VERSION 104β†’105 per the runtime-hash guard's contract (schema-history entry added) β€” golden .dsa diffs are the version stamp only. The script tile artwork is a generated placeholder, same as Kill_Animation shipped with β€” swap in real art whenever.

Verified / not verified

Full local gate green: typecheck, lint, all JS tests (472 rom + 86 ui + web), 218 smoke (incl. a new spec driving defaults β†’ edit β†’ Save β†’ the baked file in the fake Daz library), guide build. No Rust changes. Never run in a real Daz Studio β€” the dial walk and clamp/lock dance reuse live-verified runtime patterns, but the acceptance check is a real run on a G8.1 character: the summary's zeroed/driven lists say whether the match list is right.

πŸ€– Generated with Claude Code

https://claude.ai/code/session_01YSDm9hBkod1w2KN8GAGGHu

…t (runtime v105)

The DazToHue G8->G9 transfer guide starts with zeroing every G8/G8.1 morph
that also exists on G9 (Areolae, Nipples, Navel, the Breasts dials,
Voluptuous, Pelvic/Legs/Torso Length) - a by-hand dial hunt per character.
The studio now ships that step as a visible Content Library script.

- New bundled visible script Prepare_For_Transfer.dsa (+ generated tile
  artwork): zeroes matching dials on the selected G8/G8.1 figure using the
  runtime's two-namespace dial walk (DzMorph modifiers + node-owned float
  properties - the place a modifiers-only pass provably misses dials, v101).
  Locked dials are unlocked/zeroed/re-locked; an ERC-driven dial that still
  shows a value is NAMED in the summary (zero its controlling dial) instead
  of silently surviving. Morph assets on disk are never touched.
- The morph list is editable: Settings -> new "Daz scripts" tab
  (settings.prepareTransferMorphs, defaults = the guide's list). Matching is
  CONTAINS on the normalized name/label (case/space/dash-blind), so "Nipple"
  is the family and "Breasts Size" also hits PBMBreastsSize.
- The list is baked at install time (__DTH_TRANSFER_MORPHS__ token, JSON
  array literal) and joins the .dth-runtime-installed stamp, so saving an
  edited list re-installs without a version bump; the api saveSettings hook
  re-ensures the install after every save (no-op when nothing changed).
- RUNTIME_VERSION 104 -> 105 per the runtime-hash guard's contract (history
  entry added); golden .dsa headers re-stamped - no generated character
  script changed beyond the marker.
- Tests: settings default/round-trip cases, copyRuntimeFiles bake + edited-
  list re-install, a smoke spec driving defaults -> edit -> Save -> the baked
  file in the fake Daz library. Guide: bundled-scripts section + tools note.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YSDm9hBkod1w2KN8GAGGHu
@github-actions

github-actions Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

πŸ” Site preview deployed

Preview (this PR) https://pr-981.dth-character-studio.pages.dev
Guide https://pr-981.dth-character-studio.pages.dev/guide/
Exactly this commit https://d36f4a5e.dth-character-studio.pages.dev

Redeploys on every push to this PR. Production stays on GitHub Pages.

… match preview

The Settings -> Daz scripts entries were plain text inputs. Each row is now
the same MorphNameCell autocomplete the character editor's Advanced options
use, fed the MERGED G8 + G8.1 Genesis index (both, because the script targets
"a G8/8.1 figure", not one character's generation; scene-scanned dials stay
out - no scenePath). A pick inserts the internal name; free text still
commits as typed, since entries are contains-patterns.

Under each field, the same small info line the Advanced options carry: which
indexed dials the entry would zero ("Zeroes 2 dials: Nipples, Nipples Tip
Adjust"), an explicit "matches no dial" callout, and a one-time hint to run
Build Genesis Index when no G8/8.1 index exists yet.

- lib/rom/transfer-morphs.ts: the TS mirror of the baked script's normalize +
  contains rule, unit-tested with the exact examples the script's comments
  promise (a JS mirror of a .dsa rule gets pinned by the same cases).
- MorphNameCell: optional ariaLabel; the bordered form-field class moves next
  to the cell (morphFieldClass) and frame-zero-fields imports it.
- Smoke: a second spec seeds a G8.1 index and drives suggestion -> pick ->
  preview; the save-rebake spec now goes through the commit-on-blur cell.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YSDm9hBkod1w2KN8GAGGHu
@polynaut

Copy link
Copy Markdown
Owner Author

Second commit: the morph entries are now the same MorphNameCell autocomplete the character editor's Advanced options use, fed the merged G8 + G8.1 Genesis index (scene-scanned dials excluded), with a match preview under each field β€” "Zeroes 2 dials: Nipples, Nipples Tip Adjust", an explicit "matches no dial" callout, and a hint to run Build Genesis Index when no G8/8.1 index exists. The contains rule is mirrored in lib/rom/transfer-morphs.ts and pinned by the same examples the baked script's comments promise. Gate re-run green: typecheck, lint, all tests, 219 smoke.

@polynaut polynaut changed the title feat(web,rom): Prepare_For_Transfer script with an editable morph list πŸ¦„ feat(web,rom): Prepare_For_Transfer script with an editable morph list Aug 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant