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 '
' : '')
+ + '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(); }