BvS BillyCon Success Calculator

Calculates the probability for each outcome of BillyCon events

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name           BvS BillyCon Success Calculator
// @namespace      Garyzx
// @description    Calculates the probability for each outcome of BillyCon events
// @version        1.2
// @history        1.2 New domain - animecubedgaming.com - Channel28
// @history        1.1 Now https compatible (Updated by Channel28)
// @include        http*://*animecubed.com/billy/bvs/billycon.html
// @include        http*://*animecubedgaming.com/billy/bvs/billycon.html
// @grant          none
// ==/UserScript==

var frac=[1];
for(var n=1; n<10; n++)
	frac[n]=frac[n-1]*n;

function calculate(){
	var base=1;		//Your base number of rolls, default is 1
	var range=10;	//Your range, default is 10, set to 11 if you have IO3
	var strength=0;	//Your strength, default is 0, set to 1 if you have IO3
	
	if(document.getElementById("useflow").checked)
		base++;
	
	var nodes=document.evaluate("//table[@cellpadding='3']/tbody/tr/td", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
	for(var n=0; n<nodes.snapshotLength; n++){
		var td=nodes.snapshotItem(n);
		if(td.wrappedJSObject.oldInnerHTML)
			td.innerHTML=td.wrappedJSObject.oldInnerHTML;
		else
			td.wrappedJSObject.oldInnerHTML=td.innerHTML;
		if(td.innerHTML.indexOf("Difficulty")==-1)
			continue;
		var rolls=base+parseInt(td.innerHTML.match(/Bonuses \(([0-9]+)\)/)[1]);
		if(rolls<0)
			rolls=0;
		var diff=parseInt(td.innerHTML.match(/Difficulty: <[bi<>]+>([0-9]+)/)[1]);
		var p=0;
		if(diff<=range)
			p=(range-diff+strength+1)/range;
		if(p>1)
			p=1;
		var prob=[];
		for(var k=0; k<=rolls; k++)
			prob[k]=Math.pow(p, k)*Math.pow(1-p, rolls-k)*frac[rolls]/(frac[k]*frac[rolls-k]);
		var matches=td.innerHTML.match(/<[bi<>]+>[0-9]+[+]*/g);
		var last=rolls+1;
		for(var i=matches.length-1; i>0; i--){
			var k=parseInt(matches[i].match(/[0-9]+/));
			var total=0;
			for(var j=k; j<last && j<=rolls; j++)
				total+=prob[j];
			last=k;
			td.innerHTML=td.innerHTML.replace(matches[i], matches[i]+" ("+Math.round(total*1000)/10+"%)");
		}
	}	
}

document.getElementById("useflow").addEventListener("click", calculate, true);
calculate();