Storyboard: film prices from the engine's real per-second rate

This commit is contained in:
gator 2026-09-21 01:56:43 +00:00
parent 69c4728465
commit f20ae8231e

View file

@ -405,6 +405,11 @@
+ '<button type="button" class="btn' + (done ? '' : ' primary') + '" data-sceneviews="' + esc(draft.id) + '">' + (done ? 'Do it again for shots that have changed' : 'Photograph each set-up from one master') + '</button></div>'; + '<button type="button" class="btn' + (done ? '' : ' primary') + '" data-sceneviews="' + esc(draft.id) + '">' + (done ? 'Do it again for shots that have changed' : 'Photograph each set-up from one master') + '</button></div>';
} }
// What a take really costs: the engine bills by the second (7 cents), five
// seconds at least, and a speaking shot runs its line plus the slate words.
function filmCost(x) { return Math.max(5, Math.ceil((Number(x.edit_seconds) || 5) + 1.5)) * 0.07; }
function filmCostAll(list) { return list.reduce(function (a, x) { return a + filmCost(x); }, 0); }
function partsHtml(draft) { function partsHtml(draft) {
var parts = DRAFTS.filter(function (d) { return /^part-/.test(String(d.writer)); }); var parts = DRAFTS.filter(function (d) { return /^part-/.test(String(d.writer)); });
var n = (PKG.shots || []).length; var n = (PKG.shots || []).length;
@ -583,6 +588,7 @@
// A clip filmed from a picture or words that have since changed is not the shot any more. // A clip filmed from a picture or words that have since changed is not the shot any more.
var unfilmed = shots.filter(function (s) { return !s.clip_url || s.clip_stale; }).length; var unfilmed = shots.filter(function (s) { return !s.clip_url || s.clip_stale; }).length;
var changed = shots.filter(function (s) { return s.clip_url && s.clip_stale; }).length; var changed = shots.filter(function (s) { return s.clip_url && s.clip_stale; }).length;
var unfilmedUsd = filmCostAll(shots.filter(function (s) { return !s.clip_url || s.clip_stale; }));
var filmed = shots.length - unfilmed; var filmed = shots.length - unfilmed;
var imgs = boardImages(shots, cast); var imgs = boardImages(shots, cast);
var s = String(meta.draw_state || ""); var s = String(meta.draw_state || "");
@ -662,7 +668,7 @@
if (unfilmed && !undrawn) if (unfilmed && !undrawn)
out.push('<button type="button" class="btn primary" data-film="' + esc(meta.id) out.push('<button type="button" class="btn primary" data-film="' + esc(meta.id)
+ '">Film ' + (changed ? 'the ' + unfilmed + ' shots that are new or have changed' : (filmed ? 'the ' + unfilmed + ' remaining shots' : 'all ' + shots.length + ' shots')) + '">Film ' + (changed ? 'the ' + unfilmed + ' shots that are new or have changed' : (filmed ? 'the ' + unfilmed + ' remaining shots' : 'all ' + shots.length + ' shots'))
+ ' &middot; $' + (unfilmed * 0.75).toFixed(2) + '</button>'); + ' &middot; about $' + unfilmedUsd.toFixed(2) + '</button>');
if (filmed) if (filmed)
out.push('<button type="button" class="btn primary" data-assemble="' + esc(meta.id) out.push('<button type="button" class="btn primary" data-assemble="' + esc(meta.id)
+ '">Make the trailer &middot; ' + filmed + ' of ' + shots.length + ' shots</button>'); + '">Make the trailer &middot; ' + filmed + ' of ' + shots.length + ' shots</button>');
@ -1104,6 +1110,7 @@
var checking = ps && ps !== "ready"; var checking = ps && ps !== "ready";
var reelReady = String(PKG.reel_state || "") === "ready"; var reelReady = String(PKG.reel_state || "") === "ready";
var unfilmed = shots.filter(function (x) { return !x.clip_url || x.clip_stale; }).length; var unfilmed = shots.filter(function (x) { return !x.clip_url || x.clip_stale; }).length;
var unfilmedUsd2 = filmCostAll(shots.filter(function (x) { return !x.clip_url || x.clip_stale; }));
var objections = String((DRAFTNOW || {}).problems || "").split("\n").filter(Boolean).length; var objections = String((DRAFTNOW || {}).problems || "").split("\n").filter(Boolean).length;
var price = function (n) { return "$" + n.toFixed(2); }; var price = function (n) { return "$" + n.toFixed(2); };
@ -1146,7 +1153,7 @@
if (s3.done && unfilmed) if (s3.done && unfilmed)
s6.btn = '<button type="button" class="btn' + (s4.done && reelReady ? ' primary' : '') s6.btn = '<button type="button" class="btn' + (s4.done && reelReady ? ' primary' : '')
+ '" data-film="' + esc(meta.id) + '">Film ' + unfilmed + ' shot' + (unfilmed === 1 ? '' : 's') + '" data-film="' + esc(meta.id) + '">Film ' + unfilmed + ' shot' + (unfilmed === 1 ? '' : 's')
+ ' \u00b7 ' + price(unfilmed * 0.75) + '</button>'; + ' \u00b7 ' + price(unfilmedUsd2) + '</button>';
steps.push(s6); steps.push(s6);
var nowSet = false; var nowSet = false;
@ -1438,7 +1445,7 @@
+ '<button type="button" class="btn" data-drawone="' + esc(s.id) + '">' + '<button type="button" class="btn" data-drawone="' + esc(s.id) + '">'
+ (s.opening_url ? 'Redraw' : 'Draw') + ' &middot; $0.14</button>' + (s.opening_url ? 'Redraw' : 'Draw') + ' &middot; $0.14</button>'
+ (s.opening_url ? '<button type="button" class="btn" data-filmone="' + esc(s.id) + '">' + (s.opening_url ? '<button type="button" class="btn" data-filmone="' + esc(s.id) + '">'
+ (s.clip_url ? 'Film it again' : 'Film this shot') + ' &middot; $0.75</button>' : '') + (s.clip_url ? 'Film it again' : 'Film this shot') + ' &middot; about $' + filmCost(s).toFixed(2) + '</button>' : '')
+ (s.clip_url && s.take_url ? '<button type="button" class="btn" data-recut="' + esc(s.id) + (s.clip_url && s.take_url ? '<button type="button" class="btn" data-recut="' + esc(s.id)
+ '" title="Cuts and mixes the shot again from the footage already paid for">Cut it again from the same footage &middot; free</button>' : '') + '" title="Cuts and mixes the shot again from the footage already paid for">Cut it again from the same footage &middot; free</button>' : '')
+ chkHtml + eyeHtml + chkHtml + eyeHtml
@ -1471,7 +1478,7 @@
+ (s.film_unchanged && !s.filming ? '<p class="cont">Nothing that reaches the camera has changed since ' + (s.film_unchanged && !s.filming ? '<p class="cont">Nothing that reaches the camera has changed since '
+ 'the last take - same pictures, same words, same voices - so it was not filmed again and nothing ' + 'the last take - same pictures, same words, same voices - so it was not filmed again and nothing '
+ 'was charged. <button type="button" class="btn" data-filmanyway="' + esc(s.id) + 'was charged. <button type="button" class="btn" data-filmanyway="' + esc(s.id)
+ '">Film another take anyway &middot; $0.75</button></p>' : '') + '">Film another take anyway &middot; about $' + filmCost(s).toFixed(2) + '</button></p>' : '')
+ '<textarea class="note" rows="2" data-note="' + esc(s.id) + '" ' + '<textarea class="note" rows="2" data-note="' + esc(s.id) + '" '
+ 'placeholder="Your note on this shot, for the next full revision.">' + 'placeholder="Your note on this shot, for the next full revision.">'
+ esc(NOTES[s.id] || "") + '</textarea>' + esc(NOTES[s.id] || "") + '</textarea>'