diff --git a/trailer.html b/trailer.html index 9513c23..5bad57e 100644 --- a/trailer.html +++ b/trailer.html @@ -339,11 +339,33 @@ return bits.join(" · "); } + // A CHAPTER IS FILMED IN PARTS of about 25 shots that share one cast and the + // same rooms. This says where each part has got to, and joins them. + function partsHtml(draft) { + var parts = DRAFTS.filter(function (d) { return /^part-/.test(String(d.writer)); }); + var n = (PKG.shots || []).length; + if (!parts.length) { + if (PKG.kind !== "chapter" || n <= 40) return ""; + return '

This is a whole chapter: ' + n + ' shots

' + + '

That is too much to draw and film in one go. Split it into parts of about 25 shots. The parts keep the same faces, voices, rooms and objects, and are joined into one film at the end.

' + + '
'; + } + var films = parts.filter(function (d) { return d.film_url; }).length; + return '

The chapter, part by part

' + + '

Work through the parts in order - each tab is one part. Draw it, look at it, film it, then “Make the trailer” on that tab makes that part’s film.

    ' + + parts.map(function (d) { + var st = d.film_url ? 'filmed ✓' : (/^drawn/.test(String(d.draw_state)) ? 'drawn, not filmed' : (d.draw_state ? esc(d.draw_state) : 'not drawn yet')); + return '
  1. ' + esc(d.label) + ' · ' + d.shots + ' shots · ' + Math.round(d.runtime_seconds / 6) / 10 + ' min · ' + st + + (d.film_url ? ' · watch' : '') + '
  2. '; }).join("") + + '
' + (films >= 2 ? '' : '') + + '
'; + } + // THE WRITERS SCORE EACH OTHER. Blind, against the checklist in the guide; // nobody marks their own script; the winner becomes head writer. function contestHtml() { var ready = DRAFTS.filter(function (d) { return /^ready/.test(String(d.state)) && Number(d.iteration || 1) === Number(RUN.iteration || 1); }); - if (ready.length < 2) return ""; + if (ready.length < 2 || DRAFTS.some(function (d) { return /^part-/.test(String(d.writer)); })) return ""; var c = RUN.contest, label = {}; DRAFTS.forEach(function (d) { label[d.writer] = d.label || d.writer; }); var btn = RUN.stage === "judging" @@ -932,7 +954,7 @@ body += pager; DRAFTNOW = draft; - return head + contestHtml() + guideHtml(meta) + probs + '
' + barHtml(meta) + '
' + return head + partsHtml(draft) + contestHtml() + guideHtml(meta) + probs + '
' + barHtml(meta) + '
' + '
' + reelHtml() + '
' + spineHtml() + cutsHtml(meta) + reviewsHtml(meta) + wholeHtml() + castHtml + propsHtml() + body; } @@ -1577,6 +1599,19 @@ } return; } + if ((el = hit("data-splitparts"))) { + el.disabled = true; + r = await act("split_parts", { run_id: runId, draft_id: el.getAttribute("data-splitparts") }); + if (r) { showMsg("msg", "Split into " + r.parts + " parts. They are the new tabs above.", "ok"); await load(); } + return; + } + if ((el = hit("data-joinparts"))) { + el.disabled = true; + r = await act("join_parts", { run_id: runId }); + if (r) { showMsg("msg", "Joining " + r.parts + " parts. It appears in My videos in a minute.", "ok"); + setTimeout(function () { location.href = "/videos.html"; }, 2500); } + return; + } if ((el = hit("data-judge"))) { el.disabled = true; r = await act("judge_scripts", { run_id: runId });