Boom Beach Expected Crystals

by andrewlong

HTML

<label for="numPVP"># of PVP bases: </label>
<input id="numPVP" type="number" value="0" />
<br/>
<label for="numNPC"># of NPC bases: </label>
<input id="numNPC" type="number" value="0" />
<br/>
<label for="numTrop"># of Tropical Terror Bases: </label>
<input id="numTrop" type="number" value="0" />
<br/>
<label for="numVol"># of Volcano Terror Bases: </label>
<input id="numVol" type="number" value="0" />
<br/>
<button id="calcBuildings" type="button">Calculate # of buildings</button>

<br/>
<br/>


<label for="numHq"># of Headquarters: </label>
<input id="numHq" type="number" value="0" />
<br/>
<label for="numBuildings"># of Buildings: </label>
<input id="numBuildings" type="number" value="0" />
<br/>
<label for="pscBonus">PSC statue bonus: </label>
<input id="pscBonus" type="number" value="0" />
<br/>
<button id="calcEV" type="button">Calculate expected # of crystals</button>

<br/>
<br/>

<label for="numCrystalsNoStatue">Expected # of crystals without PSC statue: </label>
<input id="numCrystalsNoStatue" type="text" value="0" />
<br/>
<label for="numCrystals">Expected # of crystals with unboosted PSC statue: </label>
<input id="numCrystals" type="text" value="0" />
<br/>
<label for="numCrystalsBoosted">Expected # of crystals with boosted PSC statue: </label>
<input id="numCrystalsBoosted" type="text" value="0" />

JavaScript

$("#calcBuildings").click(function() {
  var numPVP = Number($("#numPVP").val());
  var numNPC = Number($("#numNPC").val());
  var tropicalTerror = parseInt($("#numTrop").val());
  var volcanoTerror = parseInt($("#numVol").val());

  var avgPVP = 62;
  var avgNPC = 45;

  var tropicalTerrorBuildings = [5, 10, 15, 20, 25, 30, 35];
  var volcanoTerrorBuildings = [15, 30, 40, 55, 70, 80, 90];

  var hq = numPVP + numNPC + tropicalTerror + volcanoTerror;
  var buildings = (numPVP * avgPVP) + (numNPC * avgNPC);
  if (tropicalTerror > 0) buildings = buildings + tropicalTerrorBuildings.slice(0, tropicalTerror).reduce(function(pv, cv) {
    return pv + cv;
  }, 0);
  if (volcanoTerror > 0) buildings = buildings + volcanoTerrorBuildings.slice(0, volcanoTerror).reduce(function(pv, cv) {
    return pv + cv;
  }, 0);

  $("#numHq").val(hq);
  $("#numBuildings").val(buildings);
})

$("#calcEV").click(function() {
  var numHq = parseInt($("#numHq").val());
  var numBuildings = parseInt($("#numBuildings").val());
  var pscBonus = Number($("#pscBonus").val());

  var evStone = (.03 * 1) + (.12 * 1 / 7) + (.85 * 1 / 49);

  var pHq = .25;
  var pBuilding = .02;

  var pHqStatue = pHq * (1 + pscBonus);
  var pBuildingStatue = pBuilding * (1 + pscBonus);

  var pHqBoosted = pHq * (1 + 2 * pscBonus);
  var pBuildingBoosted = pBuilding * (1 + 2 * pscBonus);

  var crystalsNoStatue = numHq * pHq * evStone + numBuildings * pBuilding * evStone;
  var crystalsStatue = numHq * pHqStatue * evStone + numBuildings * pBuildingStatue * evStone;
  var crystalsBoosted = numHq * pHqBoosted * evStone + numBuildings * pBuildingBoosted * evStone;

  $("#numCrystalsNoStatue").val(crystalsNoStatue.toFixed(2));
  $("#numCrystals").val(crystalsStatue.toFixed(2));
  $("#numCrystalsBoosted").val(crystalsBoosted.toFixed(2));
})