From f892d3967b9fa99e7d6235c2e6936fcf9753dea4 Mon Sep 17 00:00:00 2001 From: gator Date: Sun, 20 Sep 2026 18:49:58 +0000 Subject: [PATCH] Storyboard: how the film plays (timeline check) and one master picture per set-up --- trailer.html | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/trailer.html b/trailer.html index 5a09afa..bc8d9f8 100644 --- a/trailer.html +++ b/trailer.html @@ -361,6 +361,50 @@ + ''; } + // HOW THE FILM PLAYS. After every join the whole film is listened to, word by + // word with a time on each, and laid against the shots: what was dropped, where + // nothing is heard, where lips move with no sound. + function clock(t) { t = Math.max(0, Number(t) || 0); var m = Math.floor(t / 60), x = Math.floor(t - m * 60); return m + ":" + (x < 10 ? "0" : "") + x; } + function filmCheckHtml() { + var fc = PKG.film_check; + if (!fc || !(fc.rows || []).length) return ""; + var bad = fc.rows.filter(function (r) { return (r.faults || []).length; }); + var names = { dropped: "words dropped", spill: "line outside its shot", dead_air: "dead air", mute_talk: "lips move, no sound", unscripted: "unscripted words", silent_gap: "silence mid-conversation" }; + var head = '

How the film plays' + (fc.seconds ? ' · ' + clock(fc.seconds) : '') + '

' + + '

The finished film was listened to word by word and laid against the shots. ' + + (bad.length ? '' + bad.length + (bad.length === 1 ? ' shot needs' : ' shots need') + ' a look.' : 'Every line is heard, in its own shot, with nothing odd either side.') + + (fc.coverage != null ? ' ' + Math.round(fc.coverage * 100) + '% of the script is heard.' : '') + '

'; + function row(r) { + var f = (r.faults || []).map(function (x) { return '
' + esc(names[x.kind] || x.kind) + ' — ' + esc(x.what) + '
'; }).join(""); + return '' + clock(r.from) + '–' + clock(r.to) + '' + + '' + esc(r.shot) + '' + + '' + (r.says ? esc(r.says) : 'nobody speaks' + (r.title ? ' · ' + esc(r.title) : '') + '') + f + ''; + } + return '
' + head + + (bad.length ? '' + bad.map(row).join("") + '
' : '') + + '
Every shot, with its time in the film' + fc.rows.map(row).join("") + '
'; + } + + // ONE MASTER PICTURE PER SET-UP. Shots that start from the same place, people + // and things in hand get their first frames from one camera move off one + // picture, so the room and the telephone cannot change between them. + function viewsHtml(draft) { + var vs = PKG.views_state || {}, shots = PKG.shots || []; + if (vs.state === "working") return '

Photographing each set-up from one master picture… about five minutes. The page will show the new pictures when it is done.

'; + var places = {}, many = 0; + shots.forEach(function (x) { var k = String(x.scene || "").toLowerCase().trim(); if (k) places[k] = (places[k] || 0) + 1; }); + Object.keys(places).forEach(function (k) { if (places[k] > 1) many += 1; }); + var done = shots.filter(function (x) { return x.view_of; }).length; + if (!many || !shots.some(function (x) { return x.opening_url; })) return ""; + var ups = (PKG.setups || []).filter(function (u) { return (u.shots || []).length > 1 && u.master_url; }); + var strip = ups.map(function (u) { return ''; }).join(""); + return '

One master picture for each set-up

' + + (done ? '

' + done + ' of ' + shots.length + ' shots take their first frame from a camera move off their set-up’s master picture, so the room, the clothes and the things in hand are the same in every one.

' + strip + : '

' + many + ' places are seen in more than one shot. Drawn one at a time, a room and the things in it drift from picture to picture. This makes one wide master picture for each set-up (same place, same people, same things in hand), films a single camera move in from it, and gives each shot the frame at its own size of shot. About $0.70 a set-up. Shots already filmed will need filming again.

') + + (vs.state === "failed" ? '

' + esc(vs.note || "That did not work.") + '

' : '') + + '
'; + } + function partsHtml(draft) { var parts = DRAFTS.filter(function (d) { return /^part-/.test(String(d.writer)); }); var n = (PKG.shots || []).length; @@ -977,7 +1021,7 @@ DRAFTNOW = draft; return head + partsHtml(draft) + contestHtml() + guideHtml(meta) + probs + '
' + barHtml(meta) + '
' + '
' + reelHtml() + '
' - + spineHtml() + cutsHtml(meta) + reviewsHtml(meta) + wholeHtml() + speakerNoticeHtml(draft) + castHtml + propsHtml() + body; + + spineHtml() + cutsHtml(meta) + reviewsHtml(meta) + wholeHtml() + filmCheckHtml() + speakerNoticeHtml(draft) + viewsHtml(draft) + castHtml + propsHtml() + body; } // THINGS THAT MUST STAY THE SAME. A face is held steady by a reference @@ -1620,6 +1664,12 @@ } return; } + if ((el = hit("data-sceneviews"))) { + el.disabled = true; + r = await act("scene_views", { draft_id: el.getAttribute("data-sceneviews") }); + if (r) { showMsg("msg", "Photographing each set-up from one master picture. About five minutes.", "ok"); await refresh(); } + return; + } if ((el = hit("data-showspeakers"))) { r = await act("show_speakers", { draft_id: el.getAttribute("data-showspeakers") }); if (r) { showMsg("msg", "Re-framing " + (r.shots || []).length + " shots onto the person speaking. The words do not change.", "ok"); await refresh(); }