diff --git a/src/games/arimaa.ts b/src/games/arimaa.ts index a37de9ed7..e62688e6b 100644 --- a/src/games/arimaa.ts +++ b/src/games/arimaa.ts @@ -1800,7 +1800,15 @@ export class ArimaaGame extends GameBase { } public sidebarStatuses(): IStatus[] { - return [{ key: this.neutralAreaLabel("apgames:status.arimaa.HARLOG"), value: [this.harlog().toFixed(2)] } as IStatus]; + const key = this.neutralAreaLabel("apgames:status.arimaa.HARLOG"); + const harlog = this.harlog(); + const magnitude = Math.abs(harlog).toFixed(2); + // The glyph's colour stands in for the sign, so omit it when the displayed value is all zeros + if (Number.isNaN(harlog) || Number(magnitude) === 0) { + return [{ key, value: [magnitude] }]; + } + const glyph = { glyph: "piece", colour: this.getPlayerColour(harlog > 0 ? 1 : 2) }; + return [{ key, value: [glyph, magnitude] }]; } diff --git a/test/games/arimaa.test.ts b/test/games/arimaa.test.ts index d8e79eeeb..0081fa0da 100644 --- a/test/games/arimaa.test.ts +++ b/test/games/arimaa.test.ts @@ -222,6 +222,50 @@ describe("Arimaa", () => { expect(result.valid).to.be.true; expect(result.complete).to.equal(1); }); + + it ("Harlog status shows the leader's colour instead of a sign", () => { + // balanced material: no glyph + let g = new ArimaaGame(undefined, ["free"]); + g.move("Ed2,Rd3"); + g.move("ed7,rd6"); + let [status] = g.sidebarStatuses(); + expect(status.value).to.deep.equal(["0.00"]); + + // nonzero but displayed as all zeros: no glyph, no sign + g.harlog = () => -0.004; + [status] = g.sidebarStatuses(); + expect(status.value).to.deep.equal(["0.00"]); + + // gold ahead + g = new ArimaaGame(undefined, ["free"]); + g.move("Ed2,Mg2,Rd3"); + g.move("ed7,rd6"); + [status] = g.sidebarStatuses(); + expect(g.harlog()).to.be.greaterThan(0); + expect(status.value).to.deep.equal([ + { glyph: "piece", colour: g.getPlayerColour(1) }, + g.harlog().toFixed(2), + ]); + + // silver ahead: the number is unsigned + g = new ArimaaGame(undefined, ["free"]); + g.move("Ed2,Rd3"); + g.move("ed7,mg7,rd6"); + [status] = g.sidebarStatuses(); + expect(g.harlog()).to.be.lessThan(0); + expect(status.value).to.deep.equal([ + { glyph: "piece", colour: g.getPlayerColour(2) }, + Math.abs(g.harlog()).toFixed(2), + ]); + + // infinite values keep the leader's glyph; NaN has no leader + g.harlog = () => Infinity; + expect(g.sidebarStatuses()[0].value).to.deep.equal([{ glyph: "piece", colour: g.getPlayerColour(1) }, "Infinity"]); + g.harlog = () => -Infinity; + expect(g.sidebarStatuses()[0].value).to.deep.equal([{ glyph: "piece", colour: g.getPlayerColour(2) }, "Infinity"]); + g.harlog = () => NaN; + expect(g.sidebarStatuses()[0].value).to.deep.equal(["NaN"]); + }); });