"use strict";
//List of species and their number of villagers.
var species = { "イヌ": 16,
"カエル": 18,
"アリクイ": 7,
"ゴリラ": 9,
"ネコ": 23,
"クマ": 15,
"オオカミ": 11,
"リス": 18,
"ニワトリ": 9,
"ワシ": 9,
"ブタ": 15,
"ウマ": 15,
"タコ": 3,
"シカ": 10,
"ライオン": 7,
"トリ": 13,
"オウシ": 6,
"コグマ": 16,
"ワニ": 7,
"メウシ": 4,
"ヒツジ": 13,
"ヤギ": 8,
"アヒル": 17,
"サル": 8,
"ネズミ": 15,
"カンガルー": 8,
"ゾウ": 11,
"サイ": 6,
"コアラ": 9,
"ダチョウ": 10,
"ウサギ": 20,
"ペンギン": 13,
"カバ": 7,
"ハムスター": 8,
"トラ": 7,
};
var speciesSelector = document.getElementById('species-select');
var result = document.getElementById('result');
var currentFormula = document.getElementById('formula-span');
//Create Chart
var ctx = document.getElementById('myChart').getContext('2d');
var myChart = new Chart(ctx, {
type: 'line',
data: {
datasets: [{
label: '確率',
data: [],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
],
borderColor: [
'rgba(255, 99, 132, 1)',
],
pointRadius: 0,
borderWidth: 1
}]
},
options: {
title: {
display: true,
text: "確率/チケット数"
}
}
});
//Creates the entries in the villager species select.
for (var villagerKind in species) {
var opt = document.createElement('option');
opt.value = villagerKind;
opt.innerHTML = villagerKind;
speciesSelector.appendChild(opt);
}
function calculateVillagersOdds() {
//Get the user inputs.
var numberOfVillager = species[document.getElementById("species-select").value];
var selectedSpecies = document.getElementById("species-select").value.toLowerCase();
var numberOwned = +document.getElementById("villager-number").value;
var nmtNumber = +document.getElementById("nmt-number").value;
var decimalPlaces = +document.getElementById("decimal-places").value;
//Limits the number of decimal places to 1 (would also break toFixed() if user entered something smaller than 1).
if (decimalPlaces < 1) {
decimalPlaces = 1;
}
//Update the number of species that can be found if the user has complete species on his island (eg: all octopi and all cows...).
var numberOfSpecies = Object.keys(species).length;
if (document.getElementById('has-1-species').checked || document.getElementById('has-2-species').checked) {
numberOfSpecies--;
if (document.getElementById('has-2-species').checked) {
numberOfSpecies--;
}
}
var percent = (1 / numberOfSpecies * 1 / (numberOfVillager - numberOwned) * 100).toFixed(decimalPlaces);
//Calculate the odds of finding a specific villager based on the number of tickets.
var bernoulli = (100 - Math.pow((100 - (1 / numberOfSpecies * 1 / (numberOfVillager - numberOwned) * 100)) / 100, nmtNumber) * 100).toFixed(decimalPlaces);
//Don't blame me if you don't get Raymond in 40000 islands.
if (bernoulli == 100) {
bernoulli = 99.99;
}
//Calcalates the fractional odds.
var fractionalOdd = 1 / ((1 / numberOfSpecies * 1 / (numberOfVillager - numberOwned) * 100) / 100);
//Check if the percent is positive and not equal to 0. Which would mean that the number of villager entered is greater than the number within the species.
if (Math.sign(percent) !== -1 && Math.sign(percent) !== 0 && isFinite(percent)) {
result.innerHTML = "あなたがゲームプレイをして "+selectedSpecies +"" + " 種一匹に会う確率は " + percent + "% (1:" + Math.round(fractionalOdd) + ") です。
マイルりょこうけん一つあたり " + (1/numberOfSpecies * 100).toFixed(decimalPlaces) + "% (1:" + numberOfSpecies + ") の確率を持っています。 ";
currentFormula.innerHTML = "
公式: 1/" + numberOfSpecies + " * 1/(" + numberOfVillager + "-" + numberOwned + ")";
//Check if the entered number of NMT is greater than 1. Otherwise the result would be the same as the line above.
if (Math.sign(nmtNumber) !== -1 && Math.sign(nmtNumber) !== 0 && nmtNumber !== 1 && !isNaN(nmtNumber)) {
result.innerHTML += "
あなたはマイルりょこうけん "+nmtNumber+"個を使用であれば、当該住民に会う確率は" + bernoulli + "% です。 ";
}
} else {
result.innerHTML = "入力した数は、その種内の村人の数よりも多くなっています。";
currentFormula.innerHTML = "";
}
updateChart(nmtNumber, numberOfSpecies, numberOwned, decimalPlaces, numberOfVillager);
}
function updateChart(nmtNumber, numberOfSpecies, numberOwned, decimalPlaces, numberOfVillager) {
var probArray = [];
var labelArray = [];
if(nmtNumber < 1000) {
for (let index = 0; index <= nmtNumber; index++) {
probArray.push((100 - Math.pow((100 - (1 / numberOfSpecies * 1 / (numberOfVillager - numberOwned) * 100)) / 100, index) * 100).toFixed(decimalPlaces))
labelArray.push("" + index);
}
} else if (nmtNumber < 10000) {
for (let index = 0; index <= nmtNumber; index+=10) {
probArray.push((100 - Math.pow((100 - (1 / numberOfSpecies * 1 / (numberOfVillager - numberOwned) * 100)) / 100, index) * 100).toFixed(decimalPlaces))
labelArray.push("" + index);
}
} else if (nmtNumber < 50000){
for (let index = 0; index <= nmtNumber; index+=100) {
probArray.push((100 - Math.pow((100 - (1 / numberOfSpecies * 1 / (numberOfVillager - numberOwned) * 100)) / 100, index) * 100).toFixed(decimalPlaces))
labelArray.push("" + index);
}
} else {
for (let index = 0; index <= nmtNumber; index+=1000) {
probArray.push((100 - Math.pow((100 - (1 / numberOfSpecies * 1 / (numberOfVillager - numberOwned) * 100)) / 100, index) * 100).toFixed(decimalPlaces))
labelArray.push("" + index);
}
}
myChart.data.datasets[0].data = probArray;
myChart.data.labels = labelArray;
myChart.update();
}