BvS Ally Checker

Are you missing an ally?

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name           BvS Ally Checker
// @namespace      TheSpy
// @description    Are you missing an ally?
// @include        http*://*animecubed.com/billy/bvs/team.html
// @include        http*://*animecubedgaming.com/billy/bvs/team.html
// @version        1.19
// @history        1.19 New domain - animecubedgaming.com - Channel28
// @history        1.18 Added: ElevenCats (Updated by Channel28)
// @history        1.17 Now https compatible (Updated by Channel28)
// @history        1.16 Added: Hero Quest allies (Mimi & BugMan Lvl 2), Poker allies (Potatoes & A A Ron), more MJ allies (Dora & Mafuru) - (Updated by MeP & Channel28)
// @history        1.15 Added grant permissions (Updated by Channel28)
// @history        1.14 Added: Hanafuda allies
// @history        1.13 Fixed: BurgerNinja allies
// @history        1.12 Fixed: Ol' Whitey
// @history        1.11 Fixed: BurgerNinja now show up
// @history        1.10 Moved: Bruce Sr., Lil' Ro, Mr. Smith, Nadeshiko from General to Glowslinging
// @history        1.10 Added: Bucketface to Glowslinging
// @history        1.09 Fixed: Bruce Jr.'s max level was 1, fixed to 2 now
// @history        1.08 Fixed: Flutie, Sticky, Tobby, The Twins, Karen all show as (max 2) if you have them at level 2
// @history        1.07 Fixed: Cipher showed up as max 2 if you had him level 1
// @history        1.07 Fixed: Completed categories can be displayed again
// @history        1.06 Added: You may now hide completed categories
// @history        1.05 Fixed: K-Dog & Triple H, Pandabear
// @history        1.04 Changed: Headers show how many level ups you're missing
// @history        1.04 Added: The HoClaus
// @history        1.04 Fixed: Trapchan is now maximum level 2
// @history        1.03 Added: K-Dog & Tiple H to Mahjong
// @history        1.03 Added: Level checking
// @history        1.02 Fixed: The block doesn't show up on the "Corfirm team" page anymore
// @history        1.02 Fixed: Ol' Whitey doesn't show up when Rayne/Touchy or Olmek (no Ol' Whitey) are found
// @history        1.02 Fixed: K.Y./Smokey the Bear issue (regular expression: smo[k]e[y])
// @history        1.01 Moved the whole block to the bottom
// @history        1.01 Fixed: Strawberry Lvl. 3/Mister Tea Lvl. 3, Right Lvl. 2/Anonymous Lvl. 2, Cipher/Cipher Lvl. 2/Lulu Lvl. 2/Su-chan Lvl. 2
// @history        1.00 Initial release
// @licence        MIT; http://www.opensource.org/licenses/mit-license.php
// @copyright      2011, Lunatrius
// @grant          GM_log
// ==/UserScript==

// browser compatibility
function addStyle(css){
	var head = document.getElementsByTagName("head")[0];
	if (!head)
		return;
	var style = document.createElement("style");
	style.type = "text/css";
	style.textContent = css;
	head.appendChild(style);
}

// nifty stuff
var divMain = null;
var myAllies = [];
var specialAllies = [];
var listAllies = [];
var levelAllies = [];

// table style
addStyle([
	".alliesNormal {width: 95%; border-spacing: 1px; font-size:12px; background-color: #000000; margin-bottom: 4px;}",
	".alliesNormal thead {background-color: #DCB48C;}",
	".alliesNormal thead tr th {border: 1px outset #DCB48C; cursor: pointer;}",
	".alliesNormal tbody {background-color: #DCB48C;}",
	".alliesNormal tbody tr th {background-color: #DCB48C; border: 1px outset #DCB48C; width: 50%;}",
	".alliesNormal tbody tr td {background-color: #EAD8C3; padding: 3px;}",
	".alliesNormal a {color: #A10000;}"
].join("\n"));

// remove an element from the array (with the given value)
Array.prototype.remove = function(arrayItem) {
	for(var arrayIndex = 0; arrayIndex < this.length; arrayIndex++) {
		if((new RegExp(this[arrayIndex].replace(/\./gi, "\\."), "i")).test(arrayItem)) {
			this.splice(arrayIndex, 1);
			return true;
		}
	}
	return false;
}

// is an element in the array?
Array.prototype.inArray = function(arrayItem) {
	for(var arrayIndex = 0; arrayIndex < this.length; arrayIndex++) {
		if(this[arrayIndex] == arrayItem) {
			return true;
		}
	}
	return false;
}

// create the table containing item information
function generateTable(caption, have, need, type) {
	if(!divMain)
		return;

	// table
	var table = document.createElement("table");
	table.className = ["allies", type].join("");
	divMain.appendChild(table);

	// table header
	var thead = document.createElement("thead");
	table.appendChild(thead);

	// table header - row
	var thead_tr = document.createElement("tr");
	thead.appendChild(thead_tr);

	// table header column
	var thead_tr_th = document.createElement("th");
	thead_tr_th.setAttribute("colspan", "2");
	thead_tr_th.innerHTML = caption;
	thead_tr.appendChild(thead_tr_th);

	// table body
	var tbody = document.createElement("tbody");
	tbody.style.display = "none";
	table.appendChild(tbody);

	// table body - sub header row
	var tbody_tr = document.createElement("tr");
	tbody.appendChild(tbody_tr);

	// table body - sub header column 1
	var tbody_tr_th1 = document.createElement("th");
	tbody_tr_th1.innerHTML = "Already have";
	tbody_tr.appendChild(tbody_tr_th1);

	// table body - sub header column 2
	var tbody_tr_th2 = document.createElement("th");
	tbody_tr_th2.innerHTML = "Still need";
	tbody_tr.appendChild(tbody_tr_th2);

	// table body row
	var tbody_tr = document.createElement("tr");
	tbody.appendChild(tbody_tr);

	// table body column 1
	var tbody_tr_td1 = document.createElement("td");
	tbody_tr_td1.setAttribute("valign", "top");
	tbody_tr_td1.innerHTML = have;
	tbody_tr.appendChild(tbody_tr_td1);

	// table body column 2
	var tbody_tr_td2 = document.createElement("td");
	tbody_tr_td2.setAttribute("valign", "top");
	tbody_tr_td2.innerHTML = need;
	tbody_tr.appendChild(tbody_tr_td2);

	// add the click handler
	thead_tr_th.addEventListener('click', function() {
		if(tbody.style.display == "none") {
			tbody.style.display = "";
			thead_tr_th.style.borderStyle = "inset";
			thead_tr_th.style.color = "yellow";
		}
		else {
			tbody.style.display = "none";
			thead_tr_th.style.borderStyle = "outset";
			thead_tr_th.style.color = "";
		}
	}, true);
}

// ...
function levelCheck(ally) {
	for(var i in myAllies) {
		if((new RegExp(ally.replace(/\./gi, "\\."), "i")).test(myAllies[i])) {
			if(levelAllies[ally]) {
				if(levelAllies[ally] == 1) {
					if(ally == myAllies[i]) {
						return 0;
					}
					else {
						return levelAllies[ally];
					}
				}
				else {
					if([ally, " Lvl. ", levelAllies[ally]].join("") == myAllies[i]) {
						return 0;
					}
					else {
						return levelAllies[ally];
					}
				}
			}
			else {
				// GM_log(["missing: ", ally].join("")); // debug
				return "???";
			}
		}
	}
}

// ...
function normalCheck(caption, allies) {
	var have = "";
	var need = "";
	var levels = 0;
	var allies2 = [];

	// seperate allies
	for(var i in myAllies) {
		if(allies.remove(myAllies[i])) {
			allies2.push(myAllies[i]);
		}
	}

	// have
	allies2.sort();
	for(var i = 0; i < allies2.length; i++) {
		var level = levelCheck(allies2[i].replace(/ Lvl. \d/i, ""));
		if(level == 0) {
			have = [have, "<a href=\"http://bvs.wikidot.com/allies:", allies2[i], "\" target=\"_blank\">", allies2[i], "</a><br/>"].join("");
		}
		else {
			have = [have, "<a href=\"http://bvs.wikidot.com/allies:", allies2[i], "\" target=\"_blank\" style=\"color: red; font-weight: bold;\">", allies2[i], " (max ", level, ")", "</a><br/>"].join("");
			levels++;
		}
	}

	// need
	allies.sort();
	for(var i = 0; i < allies.length; i++) {
		need = [need, "<a href=\"http://bvs.wikidot.com/allies:", allies[i], "\" target=\"_blank\">", allies[i], "</a><br/>"].join("");
	}

	generateTable([caption, ((need.length > 0 || levels > 0) ? "" : " [Complete]"), (levels > 0 ? [" [", levels, " level up(s) missing]"].join("") : "")].join(""), have.length > 0 ? have : "<i>None</i>", need.length > 0 ? need : "<i>None</i>", "Normal");
}

// main stuff
function main() {
	var node = null;
	var snap = document.evaluate("//td[contains(.,'-Current Team-')]/p/a/b[contains(text(),'Back to Top')]/../..", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
	for (var i = 0; i < snap.snapshotLength; i++) {
		node = snap.snapshotItem(i);
	}

	if(node == null) {
		return;
	}

	divMain = document.createElement("div");
	divMain.setAttribute("align", "center");
	divMain.setAttribute("style", "margin-top: 5px;");
	node.parentNode.insertBefore(divMain, node);

	var snap = document.evaluate("//div[@id='teamrep']/table/tbody/tr/td/label/b/text()", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
	for (var i = 0; i < snap.snapshotLength; i++) {
		myAllies.push(snap.snapshotItem(i).nodeValue);
	}

	levelAllies["Annie"] = 2;
	levelAllies["Big Bo"] = 2;
	levelAllies["Big Ro"] = 2;
	levelAllies["Big Shammy"] = 2;
	levelAllies["Billy"] = 3;
	levelAllies["Bruce Jr."] = 2;
	levelAllies["Bugman"] = 1;
	if(myAllies.inArray("Bugman Lvl. 2")) levelAllies["Bugman"] = 2;
	levelAllies["Emosuke"] = 3;
	levelAllies["Flipper"] = 1;
	levelAllies["J-Diddy"] = 1;
	levelAllies["K-Dog"] = 2;
	levelAllies["K.Y."] = 2;
	levelAllies["Lil' Bo"] = 2;
	levelAllies["Lil' Shammy"] = 2;
	levelAllies["Lil' Whitey"] = 3;
	levelAllies["Master P"] = 1;
	levelAllies["Meatballs"] = 2;
	levelAllies["Mr. Sandman"] = 2;
	levelAllies["Pandabear"] = 2;
	levelAllies["Pinky"] = 3;
	levelAllies["Red Rover"] = 2;
	levelAllies["Rover's Mom"] = 1;
	levelAllies["Sicko"] = 1;
	levelAllies["Smokey the Bear"] = 2;
	levelAllies["SNAKEMAN"] = 1;
	levelAllies["Spot"] = 2;
	levelAllies["Stalkergirl"] = 3;
	levelAllies["Terri"] = 3;
	levelAllies["The Rack"] = 1;
	levelAllies["The Scar"] = 1;
	levelAllies["Timmy"] = 2;
	levelAllies["Trapchan"] = 2;
	levelAllies["Triple H"] = 2;
	levelAllies["Yuri"] = 3;
	levelAllies["Z-Dog"] = 1;

	levelAllies["The HoClaus"] = 1;

	levelAllies["Tsukasa"] = 2;
	levelAllies["Kagamin"] = 1;
	levelAllies["Kona-chan"] = 1;
	levelAllies["Yuki-chan"] = 1;

	levelAllies["Dora"] = 1;
	levelAllies["Mafuru"] = 1;
	levelAllies["Lil' Rack"] = 1;
	levelAllies["Sue"] = 2;
	levelAllies["TACOS"] = 1;

	levelAllies["Cato"] = 2;
	levelAllies["Doughman"] = 3;
	levelAllies["Olmek"] = 1;
	levelAllies["Tempest Kitsune"] = 1;

	levelAllies["Proof Reader"] = 1;

	levelAllies["Hyuk"] = 1;
	levelAllies["Anonymous"] = 2;
	levelAllies["Right"] = 2;
	levelAllies["LisaLisa"] = 2;

	levelAllies["Fletch"] = 1;
	levelAllies["Hermano"] = 1;
	levelAllies["MC Stripeypants"] = 2;
	levelAllies["Mister Six"] = 1;
	levelAllies["Robogirl"] = 3;
	levelAllies["Shorty"] = 2;
	levelAllies["Strawberry"] = 3;
	if(myAllies.inArray("Mister Tea Lvl. 3")) levelAllies["Strawberry"] = 2;
	levelAllies["Tats"] = 1;
	levelAllies["TicTac"] = 1;

	levelAllies["Blind Fury"] = 1;
	levelAllies["Hotsumoto"] = 1;
	levelAllies["Miss Kitty"] = 2;
	levelAllies["Mister Tea"] = 3;
	levelAllies["Scary"] = 1;
	levelAllies["Smiley"] = 1;
	levelAllies["Sporty"] = 2;
	levelAllies["Vanilla"] = 1;

	levelAllies["Bones"] = 1;
	if(myAllies.inArray("Bones Lvl. 2")) levelAllies["Bones"] = 2;
	levelAllies["Flutie"] = 1;
	if(myAllies.inArray("Flutie Lvl. 2")) levelAllies["Flutie"] = 2;
	levelAllies["Good Boy"] = 3;
	levelAllies["Haro"] = 1;
	levelAllies["Haus"] = 1;
	levelAllies["Larry"] = 1;
	levelAllies["Sticky"] = 1;
	if(myAllies.inArray("Sticky Lvl. 2")) levelAllies["Sticky"] = 2;
	levelAllies["The Twins"] = 1;
	if(myAllies.inArray("The Twins Lvl. 2")) levelAllies["The Twins"] = 2;
	levelAllies["Tubby"] = 1;
	if(myAllies.inArray("Tubby Lvl. 2")) levelAllies["Tubby"] = 2;

	levelAllies["Chunks"] = 1;
	levelAllies["Jaws"] = 1;
	levelAllies["Palmface"] = 1;
	levelAllies["The Paper"] = 1;
	levelAllies["Threads"] = 1;
	levelAllies["Venus"] = 1;

	levelAllies["Cici"] = 2;
	levelAllies["Lulu"] = 2;
	levelAllies["Su-chan"] = 2;

	levelAllies["Blondie"] = 1;
	levelAllies["Cipher"] = 1;
	if(myAllies.inArray("Cipher Lvl. 2")) levelAllies["Cipher"] = 2;
	levelAllies["Euthanasia"] = 1;
	levelAllies["Karen"] = 1;
	if(myAllies.inArray("Karen Lvl. 2")) levelAllies["Karen"] = 2;
	levelAllies["Nana"] = 1;

	levelAllies["Bruce Sr."] = 2;
	levelAllies["Bucketface"] = 1;
	levelAllies["Lil' Ro"] = 3;
	levelAllies["Mr. Smith"] = 2;
	levelAllies["Nadeshiko"] = 2;

	levelAllies["Grandmaster P"] = 1;
	levelAllies["Rayne"] = 1;
	levelAllies["Touchy"] = 1;
	levelAllies["Ol' Whitey"] = 1;
	
	levelAllies["Potatoes"] = 1;
	if(myAllies.inArray("Potatoes Lvl. 2")) levelAllies["Potatoes"] = 2;
	levelAllies["A A Ron"] = 1;
	if(myAllies.inArray("A A Ron Lvl. 2")) levelAllies["A A Ron"] = 2;
	levelAllies["Mafuru"] = 1;
  
  levelAllies["Mimi"] = 1;
  
  levelAllies["ElevenCats"] = 1;

	listAllies["regular"] = [
		"Annie",
		"Big Bo",
		"Big Ro",
		"Big Shammy",
		"Billy",
		"Bruce Jr.",
		"Bugman",
		"Emosuke",
		"Flipper",
		"J-Diddy",
		"K-Dog",
		"K.Y.",
		"Lil' Bo",
		"Lil' Shammy",
		"Lil' Whitey",
		"Master P",
		"Meatballs",
		"Mr. Sandman",
		"Pandabear",
		"Pinky",
		"Red Rover",
		"Rover's Mom",
		"Sicko",
		"Smokey the Bear",
		"SNAKEMAN",
		"Spot",
		"Stalkergirl",
		"Terri",
		"The Rack",
		"The Scar",
		"Timmy",
		"Trapchan",
		"Triple H",
		"Yuri",
		"Z-Dog"
	];
	if(!((myAllies.inArray("Rayne") || myAllies.inArray("Touchy")) || (myAllies.inArray("Olmek") && !myAllies.inArray("Ol' Whitey"))))
		listAllies["regular"].push("Ol' Whitey");

	listAllies["partyhouse"] = [
		"Yuri",
		"The Rack",
		"J-Diddy",
		"Kagamin",
		"Kona-chan",
		"Tsukasa",
		"Yuki-chan"
	];

	listAllies["partyhousehf"] = [
		"Big Ro Lvl. 2",
		"Big Shammy Lvl. 2",
		"Big Bo Lvl. 2",
		"Yuri Lvl. 3",
		"Cato lvl. 2"
	];

	listAllies["partyhousemj"] = [
		"Lil' Rack",
		"TACOS",
		"Dora",
		"Sue Lvl. 2",
		"Mafuru",
		"K-Dog Lvl. 2",
		"Triple H Lvl. 2"
	];

	listAllies["holiday"] = [
		"The HoClaus"
	];

	listAllies["season2"] = [
		"Cato",
		"Doughman",
		"Olmek",
		"Tempest Kitsune"
	];

	listAllies["season4"] = [
		"Proof Reader"
	];

	listAllies["thetrade"] = [
		"Hyuk",
		"LisaLisa"
	];
	if(myAllies.inArray("Right Lvl. 2"))
		listAllies["thetrade"].push("Right");
	else if(myAllies.inArray("Anonymous Lvl. 2"))
		listAllies["thetrade"].push("Anonymous");
	else {
		listAllies["thetrade"].push("Right");
		listAllies["thetrade"].push("Anonymous");
	}

	listAllies["reaper"] = [
		"Fletch",
		"Hermano",
		"MC Stripeypants",
		"Mister Six",
		"Robogirl",
		"Shorty",
		"Strawberry",
		"Tats",
		"TicTac"
	];

	listAllies["monochrome"] = [
		"Blind Fury",
		"Hotsumoto",
		"Miss Kitty",
		"Scary",
		"Smiley",
		"Sporty",
		"Vanilla"
	];
	if(!myAllies.inArray("Strawberry Lvl. 3"))
		listAllies["monochrome"].push("Mister Tea");

	listAllies["outskirts"] = [
		"Bones",
		"Haro",
		"Haus",
		"Flutie",
		"Good Boy",
		"Larry",
		"Sticky",
		"The Twins",
		"Tubby"
	];

	listAllies["wasteland"] = [
		"Jaws",
		"The Paper",
		"Venus",
		"Chunks",
		"Palmface",
		"Threads"
	];

	listAllies["burgerninja"] = [
		"Cici"
	];
	if(!(myAllies.inArray("Cipher") || myAllies.inArray("Cipher Lvl. 2"))) {
		listAllies["burgerninja"].push("Lulu");
		listAllies["burgerninja"].push("Su-chan");
	}

	listAllies["pizzawitch"] = [
		"Blondie",
		"Cipher",
		"Euthanasia",
		"Karen",
		"Nana"
	];

	listAllies["eots"] = [
	];
	if(myAllies.inArray("Grandmaster P"))
		listAllies["eots"].push("Grandmaster P");
	else if(myAllies.inArray("Rayne"))
		listAllies["eots"].push("Rayne");
	else if(myAllies.inArray("Touchy"))
		listAllies["eots"].push("Touchy");
	else {
		listAllies["eots"].push("Grandmaster P");
		listAllies["eots"].push("Rayne");
		listAllies["eots"].push("Touchy");
	}

	listAllies["glowslinging"] = [
		"Bruce Sr.",
		"Bucketface",
		"Lil' Ro",
		"Mr. Smith",
		"Nadeshiko"
	];

	listAllies["perfectpoker"] = [
		"Potatoes",
		"A A Ron",
	];
       
	listAllies["heroquest"] = [
		"Bugman Lvl. 2",
		"Mimi"
	];
       
	listAllies["arena"] = [
		"ElevenCats"
	];


	var a = document.createElement("a");
	a.style.color = "#A10000";
	a.style.fontWeight = "bold";
	a.style.fontSize = "12px";
	a.style.cursor = "pointer";
	a.innerHTML = "Hide/Show completed";
	a.addEventListener('click', function() {
		var snap = document.evaluate("//table[contains(.//text(),'[Complete]')]", divMain, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
		for (var i = 0; i < snap.snapshotLength; i++) {
			if(snap.snapshotItem(i).style.display == "")
				snap.snapshotItem(i).style.display = "none";
			else
				snap.snapshotItem(i).style.display = "";
		}
	}, true);
	divMain.appendChild(a);

	normalCheck("Regular", listAllies["regular"]);
	normalCheck("Partyhouse", listAllies["partyhouse"]);
	normalCheck("Partyhouse - Hanafuda", listAllies["partyhousehf"]);
	normalCheck("Partyhouse - Mahjong", listAllies["partyhousemj"]);
	normalCheck("Holiday", listAllies["holiday"]);
	normalCheck("Season 2+", listAllies["season2"]);
	normalCheck("Season 4+", listAllies["season4"]);
	normalCheck("The Trade", listAllies["thetrade"]);
	normalCheck("Reaper", listAllies["reaper"]);
	normalCheck("Monochrome", listAllies["monochrome"]);
	normalCheck("Outskirts", listAllies["outskirts"]);
	normalCheck("Wasteland", listAllies["wasteland"]);
	normalCheck("BurgerNinja", listAllies["burgerninja"]);
	normalCheck("PizzaWitch", listAllies["pizzawitch"]);
	normalCheck("Glowslinging", listAllies["glowslinging"]);
	normalCheck("Eye of the Storm", listAllies["eots"]);
	normalCheck("Shop - Perfect Poker", listAllies["perfectpoker"]);
	normalCheck("Hero Quest", listAllies["heroquest"]);
	normalCheck("Arena", listAllies["arena"]);
}

// ...
main();