diff --git a/trailer.html b/trailer.html index 7d37b9e..15b073b 100644 --- a/trailer.html +++ b/trailer.html @@ -326,7 +326,7 @@ var undrawn = shots.filter(function (s) { return !s.opening_url; }).length; var unfilmed = shots.filter(function (s) { return !s.clip_url; }).length; var filmed = shots.length - unfilmed; - var imgs = cast.length * 3 + shots.length * 2; + var imgs = boardImages(shots, cast); var s = String(meta.draw_state || ""); var drawing = s && !/^(drawn|failed)/.test(s); var isLead = meta.writer === RUN.lead_writer; @@ -397,6 +397,35 @@ return a.join("") !== b.join(""); } + // What the storyboard will actually cost to draw. Three sheets for every + // character who is seen or heard, one more per extra day they are dressed + // differently, and two frames per shot. + function boardImages(shots, cast) { + var seen = {}; + shots.forEach(function (s) { + (s.visible_characters || []).forEach(function (c) { seen[String(c)] = 1; }); + (s.audio || []).forEach(function (a) { + if (String(a.text || "").trim()) seen[String(a.character_id)] = 1; }); + }); + var present = cast.filter(function (c) { return seen[String(c.id)]; }); + + var days = {}; + shots.forEach(function (s) { + var d = String(s.day || "").trim(); + if (!d) return; + (s.visible_characters || []).forEach(function (c) { + (days[String(c)] = days[String(c)] || {})[d] = 1; }); + }); + var extra = 0; + present.forEach(function (c) { + var wd = c.wardrobe_by_day || {}; + var base = Object.keys(wd).sort()[0] || ""; + Object.keys(days[String(c.id)] || {}).forEach(function (d) { + if (d !== base && wd[d]) extra += 1; }); + }); + return present.length * 3 + extra + shots.length * 2; + } + function mmss(n) { return Math.floor(n / 60) + ":" + String(Math.round(n % 60)).padStart(2, "0"); }