function game(d6, throwStrategy = "never") {
let destiny = 0;
let potatoes = 0;
let orcs = 0;
let darkness = 0;
let turns = 0;
let throws = 0;
let thrownPotatoes = 0;
let rolls = 0;
const maxTurns = 1000;
function roll() {
rolls += 1;
return d6();
}
function throwPotato() {
if (potatoes <= darkness) throw new Error("not enough potatoes");
if (orcs <= 0) throw new Error("no orcs");
orcs -= 1;
let amount = 1 + darkness;
potatoes -= amount;
throws += 1;
thrownPotatoes += amount;
}
while (destiny < 10 && potatoes < 10 && orcs < 10 && turns < maxTurns) {
const r1 = roll();
turns += 1;
if (r1 === 1 || r1 === 2) {
const r2 = roll();
if (r2 === 1) potatoes += 1;
else if (r2 === 2) {
potatoes += 1;
destiny += 1;
} else if (r2 === 3) {
destiny += 1;
orcs += 1;
} else if (r2 === 4) {
orcs += 1;
potatoes = Math.max(0, potatoes - 1);
} else if (r2 === 5) potatoes = Math.max(0, potatoes - 1);
else potatoes += 2;
} else if (r1 === 3 || r1 === 4) {
const r2 = roll();
if (r2 === 1) orcs += 1;
else if (r2 === 2) {
destiny += 1;
} else if (r2 === 3) {
destiny += 1;
orcs += 1;
} else if (r2 === 4) {
orcs += 2;
potatoes = Math.max(0, potatoes - 1);
} else if (r2 === 5) destiny += 1;
else potatoes += 2;
} else {
darkness += 1;
}
if (throwStrategy === "eager") {
while (orcs > 0 && potatoes > darkness) throwPotato();
} else if (throwStrategy === "desperate") {
while (orcs === 10 && potatoes > darkness) throwPotato();
} else if (throwStrategy === "cheap") {
while (orcs > 0 && potatoes > darkness && darkness < 3) throwPotato();
}
}
return {
destiny,
potatoes,
orcs,
darkness,
turns,
throws,
thrownPotatoes,
rolls,
result:
turns >= maxTurns
? "max-turns"
: orcs >= 10
? "orcs"
: destiny >= 10
? "destiny"
: potatoes >= 10
? "potatoes"
: null
};
}