'
- + spineHtml() + cutsHtml(meta) + reviewsHtml(meta) + wholeHtml() + castHtml + body;
+ + spineHtml() + cutsHtml(meta) + reviewsHtml(meta) + wholeHtml() + castHtml + propsHtml() + body;
+ }
+
+ // THINGS THAT MUST STAY THE SAME. A face is held steady by a reference
+ // picture; so is an urn, and so is a car. Without one, the object the whole
+ // story is about was three different objects in three shots.
+ function propsHtml() {
+ var props = PKG.props, busy = String(PKG.props_state || "");
+ var head = '
Things that must look the same in every shot
';
+ if (busy) head += '
' + esc(busy) + '\u2026 about a minute.
';
+ if (PKG.props_note) head += '
' + esc(PKG.props_note) + '
';
+ if (!props || !props.length)
+ return head + '
An object or a car that appears in more than one shot needs a reference '
+ + 'picture, the way each character has one - otherwise it is drawn differently every time. '
+ + (busy ? '' : '')
+ + '
'
+ + (busy ? '' : '')
+ + '';
}
// Every look a character has, in the order the story reaches them: the
@@ -976,16 +1013,24 @@
var rows = dup.map(function (d) {
return { what: "The same person appears twice: " + d, serious: true }; })
.concat(faults.map(function (f) { return { what: f.what, serious: f.severity === "serious", zoom: f.zoom_url || "" }; }));
- return '
'
- + 'The checker looked at this picture and sees:' + retried
- + rows.map(function (r, i) {
+ var line = function (r, i) {
// The close-up the checker was looking at. Nobody should have to
// take "six fingers" on trust - and sometimes it is simply wrong.
var zm = r.zoom ? '' : '';
return '' + zm + esc(r.what)
+ ' ';
- }).join("")
+ };
+ // What matters is said out loud. What merely differs from the description
+ // is there for anyone who wants it, and is not an alarm.
+ var big = "", small = "", nsmall = 0;
+ rows.forEach(function (r, i) { if (r.serious) big += line(r, i); else { small += line(r, i); nsmall++; } });
+ return '
'
+ + (big ? 'The checker looked at this picture and sees:' + retried + big
+ : '\u2713 picture checked - nothing that needs fixing' + retried)
+ + (nsmall ? ''
+ + nsmall + ' small thing' + (nsmall === 1 ? '' : 's') + ' it noticed \u2014 look only if the picture bothers you'
+ + small + '' : '')
+ '
';
}
@@ -1467,6 +1512,32 @@
+ "automatically. This takes a few minutes." : (r.note || "Already checked."), "ok"); await refresh(); }
return;
}
+ if ((el = hit("data-findprops"))) {
+ el.disabled = true;
+ r = await act("find_props", { draft_id: CUR });
+ if (r) { showMsg("msg", "Reading the script for objects that appear more than once, then drawing a reference for each. About two minutes.", "ok"); await refresh(); }
+ return;
+ }
+ if ((el = hit("data-propsave"))) {
+ var ppid = el.getAttribute("data-propsave");
+ var pta = document.querySelector('[data-propdesc="' + ppid + '"]');
+ el.disabled = true;
+ r = await act("set_prop", { draft_id: CUR, prop_id: ppid, description: pta ? pta.value : "", force: true });
+ if (r) { showMsg("msg", "Drawing the reference picture, about $" + r.usd + ". When it looks right, redraw the shots that show it.", "ok"); await refresh(); }
+ return;
+ }
+ if ((el = hit("data-propshots"))) {
+ el.disabled = true;
+ r = await act("redraw_prop_shots", { draft_id: CUR, prop_id: el.getAttribute("data-propshots") });
+ if (r) { showMsg("msg", "Redrawing those shots one after another, about $" + r.usd + ". A few minutes.", "ok"); await refresh(); }
+ return;
+ }
+ if ((el = hit("data-propdel"))) {
+ if (!confirm("Stop keeping this object the same from shot to shot?")) return;
+ el.disabled = true;
+ r = await act("remove_prop", { draft_id: CUR, prop_id: el.getAttribute("data-propdel") });
+ if (r) await refresh(); return;
+ }
if ((el = hit("data-fixfault"))) {
var ff = el.getAttribute("data-fixfault").split("|");
var fs = (PKG.shots || []).filter(function (x) { return String(x.id) === ff[0]; })[0] || {};