A chapter is filmed in parts and joined

This commit is contained in:
gator 2026-09-20 15:42:47 +00:00
parent 84c63587e3
commit af96c095dd

View file

@ -339,11 +339,33 @@
return bits.join(" · "); 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 '<div class="guide" style="margin-bottom:12px"><h4>This is a whole chapter: ' + n + ' shots</h4>'
+ '<p class="cont">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.</p>'
+ '<button type="button" class="btn primary" data-splitparts="' + esc(draft.id) + '">Split it into parts</button></div>';
}
var films = parts.filter(function (d) { return d.film_url; }).length;
return '<div class="guide" style="margin-bottom:12px"><h4>The chapter, part by part</h4>'
+ '<p class="cont">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.</p><ol style="margin:6px 0 8px 18px">'
+ 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 '<li><b>' + esc(d.label) + '</b> &middot; ' + d.shots + ' shots &middot; ' + Math.round(d.runtime_seconds / 6) / 10 + ' min &middot; ' + st
+ (d.film_url ? ' &middot; <a href="' + esc(d.film_url) + '" target="_blank">watch</a>' : '') + '</li>'; }).join("")
+ '</ol>' + (films >= 2 ? '<button type="button" class="btn primary" data-joinparts="1">Join the ' + films + ' filmed parts into one film</button>' : '')
+ '</div>';
}
// THE WRITERS SCORE EACH OTHER. Blind, against the checklist in the guide; // THE WRITERS SCORE EACH OTHER. Blind, against the checklist in the guide;
// nobody marks their own script; the winner becomes head writer. // nobody marks their own script; the winner becomes head writer.
function contestHtml() { function contestHtml() {
var ready = DRAFTS.filter(function (d) { return /^ready/.test(String(d.state)) && Number(d.iteration || 1) === Number(RUN.iteration || 1); }); 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 = {}; var c = RUN.contest, label = {};
DRAFTS.forEach(function (d) { label[d.writer] = d.label || d.writer; }); DRAFTS.forEach(function (d) { label[d.writer] = d.label || d.writer; });
var btn = RUN.stage === "judging" var btn = RUN.stage === "judging"
@ -932,7 +954,7 @@
body += pager; body += pager;
DRAFTNOW = draft; DRAFTNOW = draft;
return head + contestHtml() + guideHtml(meta) + probs + '<div class="bar">' + barHtml(meta) + '</div>' return head + partsHtml(draft) + contestHtml() + guideHtml(meta) + probs + '<div class="bar">' + barHtml(meta) + '</div>'
+ '<div id="reelhost">' + reelHtml() + '</div>' + '<div id="reelhost">' + reelHtml() + '</div>'
+ spineHtml() + cutsHtml(meta) + reviewsHtml(meta) + wholeHtml() + castHtml + propsHtml() + body; + spineHtml() + cutsHtml(meta) + reviewsHtml(meta) + wholeHtml() + castHtml + propsHtml() + body;
} }
@ -1577,6 +1599,19 @@
} }
return; 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"))) { if ((el = hit("data-judge"))) {
el.disabled = true; el.disabled = true;
r = await act("judge_scripts", { run_id: runId }); r = await act("judge_scripts", { run_id: runId });