diff --git a/static/app.js b/static/app.js
index f1d6d5c..0477786 100644
--- a/static/app.js
+++ b/static/app.js
@@ -617,18 +617,19 @@ function actionCard(a) {
if (a.special === "drill") {
const s = S.favours.sergeant, boost = s.boost;
extra = !s.needed ? `
Only while a raid is coming.
`
- : `
${skillOf("combat").icon} +${+me.drill_per_action.toFixed(2)} drill · ${fmt(s.points)} / ${fmt(s.needed)} points, worth ${fmt(s.defence)} of ${fmt(s.cap)} defence${boost ? ` ×2 drill and XP for the next ${fmt(boost)}` : ""}
+ ${boostBar(s.points, s.needed, boost, "Drill sergeant: this stretch drills twice as fast")}`;
}
if (a.special === "recon") {
const boost = S.favours.informant.boost;
const ev = S.upcoming, full = ev && ev.recon >= ev.recon_full;
extra = full ? `
Fully scouted: XP only.
`
- : `
${skillOf("reconnaissance").icon} +${+me.recon_gain[a.id].toFixed(2)} recon${boost ? ` ×2 recon and XP for the next ${fmt(boost)}` : ""}
`;
@@ -782,6 +783,14 @@ function town() {
return html;
}
+// Progress towards a goal favour can boost. Favour doubles the next `boost` points players put
+// in, so the striped stretch behind the bar (twice the boost) is where work counts double.
+function boostBar(done, total, boost, tip) {
+ const pct = (x) => Math.min(100, x / total * 100);
+ return `
${boost
+ ? `` : ""}
`;
+}
+
// The building site: labour so far, who is helping, and ways to speed it up.
function siteBanner() {
const city = S.city, work = city.construction, me = S.me;
@@ -790,9 +799,6 @@ function siteBanner() {
const hire = S.favours.builders;
const working = me.action?.id === "labour";
const builders = S.players.filter((p) => p.skill === "construction" && p.doing === "Work on the building site").map((p) => esc(p.name));
- // A master builder doubles the next `boost` labour players put in: that stretch of the bar fills twice as fast.
- const done = Math.min(100, work.labour / work.needed * 100);
- const boosted = Math.min(100, (work.labour + 2 * hire.boost) / work.needed * 100);
return `