bb_extra

Display extra information in the Blood Brothers wikia familiar pages

当前为 2014-05-13 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name bb_extra
  3. // @version 0.6.5.3
  4. // @description Display extra information in the Blood Brothers wikia familiar pages
  5. // @include http://bloodbrothersgame.wikia.com/wiki/*
  6. // @copyright 2014, Chin
  7. // @run-at document-end
  8. // @grant none
  9. // @namespace https://greasyfork.org/users/1048
  10. // ==/UserScript==
  11.  
  12. /////////////////////////////////////////////////////////////////////////////////////
  13. // Preference section
  14. // Change to false if you don't want something to be displayed
  15. /////////////////////////////////////////////////////////////////////////////////////
  16.  
  17. var displayTotalPE = true;
  18. var displayTotalPOPE = true;
  19. var displayTier = true;
  20. var displaySkill = true;
  21. var displayPOPE = true;
  22.  
  23.  
  24. /////////////////////////////////////////////////////////////////////////////////////
  25. // Code section
  26. /////////////////////////////////////////////////////////////////////////////////////
  27.  
  28. var data = {
  29. hpMax: 0,
  30. atkMax: 0,
  31. defMax: 0,
  32. wisMax: 0,
  33. agiMax: 0,
  34.  
  35. hpPE: 0,
  36. atkPE: 0,
  37. defPE: 0,
  38. wisPE: 0,
  39. agiPE: 0,
  40.  
  41. hpPOPE: 0,
  42. atkPOPE: 0,
  43. defPOPE: 0,
  44. wisPOPE: 0,
  45. agiPOPE: 0,
  46.  
  47. pvpTier: "N/A",
  48. raidTier: "N/A",
  49. towerTier: "N/A",
  50.  
  51. category: "",
  52. statTable: "",
  53. isFinalEvolution: false
  54. };
  55.  
  56. var tierURL = [];
  57. tierURL.pvp = "http://bloodbrothersgame.wikia.com/index.php?title=Familiar_Tier_List/PvP&action=render";
  58. tierURL.raid = "http://bloodbrothersgame.wikia.com/index.php?title=Familiar_Tier_List/Raid&action=render";
  59. tierURL.tower = "http://bloodbrothersgame.wikia.com/index.php?title=Familiar_Tier_List/Tower&action=render";
  60.  
  61. function numberWithCommas(x) {
  62. return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  63. }
  64.  
  65. function getStats () {
  66. function pope() {
  67. // parse the response text into DOM
  68. var doc = document.implementation.createHTMLDocument("POPE");
  69. doc.documentElement.innerHTML = sessionStorage.popeTable;
  70. var famName = (document.getElementById("WikiaPageHeader").getElementsByTagName("h1"))[0].innerHTML.trim();
  71. var table = (doc.getElementsByClassName("wikitable"))[0];
  72. var rows = (table.getElementsByTagName("tbody"))[0].getElementsByTagName("tr");
  73. for (var i = rows.length - 1; i >= 2; i--) {
  74. try {
  75. var cells = rows[i].getElementsByTagName("td");
  76. var cellFam = (cells[1].innerText || cells[1].textContent).trim();
  77. if (cellFam == famName) {
  78. data.hpPOPE = parseInt((cells[3].innerText || cells[3].textContent).replace(/,/g, ""));
  79. data.atkPOPE = parseInt((cells[4].innerText || cells[4].textContent).replace(/,/g, ""));
  80. data.defPOPE = parseInt((cells[5].innerText || cells[5].textContent).replace(/,/g, ""));
  81. data.wisPOPE = parseInt((cells[6].innerText || cells[6].textContent).replace(/,/g, ""));
  82. data.agiPOPE = parseInt((cells[7].innerText || cells[7].textContent).replace(/,/g, ""));
  83. }
  84. } catch (e) {}
  85. }
  86. if (displayPOPE) addPOPEStats();
  87. if (displayTotalPE || displayTotalPOPE) addTotalStats();
  88. }
  89. data.statTable = document.getElementsByClassName("article-table");
  90. var rowPE = ((data.statTable[0].getElementsByTagName("tbody"))[0].getElementsByTagName("tr"))[3];
  91. //PE stats
  92. data.hpPE = parseInt((rowPE.getElementsByTagName("td"))[1].childNodes[0].nodeValue.replace(/,/g, ""));
  93. data.atkPE = parseInt((rowPE.getElementsByTagName("td"))[2].childNodes[0].nodeValue.replace(/,/g, ""));
  94. data.defPE = parseInt((rowPE.getElementsByTagName("td"))[3].childNodes[0].nodeValue.replace(/,/g, ""));
  95. data.wisPE = parseInt((rowPE.getElementsByTagName("td"))[4].childNodes[0].nodeValue.replace(/,/g, ""));
  96. data.agiPE = parseInt((rowPE.getElementsByTagName("td"))[5].childNodes[0].nodeValue.replace(/,/g, ""));
  97.  
  98. data.isFinalEvolution = (document.getElementsByClassName("container")[0]).innerHTML.indexOf("Final Evolution") != -1;
  99.  
  100. if (data.isFinalEvolution) {
  101. // fetch the POPE stat table
  102. if (sessionStorage.popeTable == null) {
  103. var xmlhttp = new XMLHttpRequest();
  104. xmlhttp.onreadystatechange = function() {
  105. if (xmlhttp.readyState==4 && xmlhttp.status==200) {
  106. sessionStorage.popeTable = xmlhttp.responseText;
  107. pope();
  108. }
  109. };
  110. xmlhttp.open("GET", "http://bloodbrothersgame.wikia.com/wiki/POPE_Stats_Table", true);
  111. xmlhttp.send();
  112. console.log("Fetching POPE table");
  113. }
  114. else {
  115. pope();
  116. }
  117. }
  118. }
  119.  
  120. function addPOPEStats() {
  121.  
  122. if (data.isFinalEvolution) {
  123.  
  124. var newText = "<tr><td style='text-align:center;padding:0em;'><span style='border-bottom: 1px dotted; font-weight: bold; padding: 0em' title='POPE stats (OPE400 for EP4, OPE100 for EP2, L2, L3 and M2)'><a>POPE</a></span></td><td>"
  125. + numberWithCommas(data.hpPOPE) + "</td><td>"
  126. + numberWithCommas(data.atkPOPE) + "</td><td>"
  127. + numberWithCommas(data.defPOPE) + "</td><td>"
  128. + numberWithCommas(data.wisPOPE) + "</td><td>"
  129. + numberWithCommas(data.agiPOPE) + "</td></tr>";
  130. // add the new row to tbody
  131. (data.statTable[0].getElementsByTagName("tbody"))[0].innerHTML += newText;
  132. }
  133. }
  134. function addTotalStats() {
  135. var totalPE = data.hpPE + data.atkPE + data.defPE + data.wisPE + data.agiPE;
  136. var totalPEText = (isNaN(totalPE) || totalPE == 0)? "N/A" : numberWithCommas(totalPE);
  137.  
  138. var totalPOPE = data.hpPOPE + data.atkPOPE + data.defPOPE + data.wisPOPE + data.agiPOPE;
  139. var totalPOPEText = (isNaN(totalPOPE) || totalPOPE == 0)? "N/A" : numberWithCommas(totalPOPE);
  140. var newText = "";
  141.  
  142. if (!displayTotalPOPE && displayTotalPE)
  143. newText = "<tr><td style='text-align:center;padding:0em;'><span style='border-bottom: 1px dotted; font-weight: bold; padding: 0em' title='Total PE stats'><a>Total</a></span></td><td></td><td></td><td></td><td></td><td>"
  144. + totalPEText + "</td></tr>";
  145. else if (displayTotalPOPE && !displayTotalPE)
  146. newText = "<tr><td style='text-align:center;padding:0em;'><span style='border-bottom: 1px dotted; font-weight: bold; padding: 0em' title='Total POPE stats'><a>Total</a></span></td><td></td><td></td><td></td><td></td><td>"
  147. + totalPOPEText + "</td></tr>";
  148. else if (displayTotalPOPE && displayTotalPE)
  149. newText = "<tr><td style='text-align:center;padding:0em;'><span style='border-bottom: 1px dotted; font-weight: bold; padding: 0em' title='Total PE stats and total POPE stats'><a>Total</a></span></td><td></td><td></td><td></td><td>"
  150. + totalPEText + "</td><td>"
  151. + totalPOPEText + "</td></tr>";
  152.  
  153. // add the new row to tbody
  154. (data.statTable[0].getElementsByTagName("tbody"))[0].innerHTML += newText;
  155.  
  156. // or add it directly to the PE row, but can cause overflow in small screens
  157. //var addedPETotalText = "<td>" + numberWithCommas(totalPE) + "</td>";
  158. //rowPE.innerHTML += addedPETotalText;
  159. }
  160.  
  161. /*
  162. * Initially, call getPvP(), which has getRaid() as callback,
  163. * getRaid() has getTower() as callback
  164. * and finally, getTower() has addTierInfo() as callback
  165. * Ideally, getPvP(), getRaid() and getTower() should be done in parallel instead of
  166. * being done serially like this, but that's for later
  167. */
  168. function getTierInfo () {
  169.  
  170. function getPvP() {
  171. // fetch the pvp tier page
  172. if (sessionStorage.pvp == null) {
  173. var xmlhttp = new XMLHttpRequest();
  174. xmlhttp.onreadystatechange = function() {
  175. if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  176. sessionStorage.pvp = xmlhttp.responseText;
  177. data.pvp = getTier("pvp");
  178. getRaid();
  179. }
  180. };
  181. xmlhttp.open("GET", tierURL.pvp, true);
  182. xmlhttp.send();
  183. sessionStorage.pvp = xmlhttp.responseText;
  184. console.log("Fetching pvp tier");
  185. }
  186. else {
  187. data.pvp = getTier("pvp");
  188. getRaid();
  189. }
  190. }
  191.  
  192. function getRaid() {
  193. // fetch the raid tier page
  194. if (sessionStorage.raid == null) {
  195. var xmlhttp = new XMLHttpRequest();
  196. xmlhttp.onreadystatechange = function() {
  197. if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  198. sessionStorage.raid = xmlhttp.responseText;
  199. data.raid = getTier("raid");
  200. getTower();
  201. }
  202. };
  203. xmlhttp.open("GET", tierURL.raid, true);
  204. xmlhttp.send();
  205. sessionStorage.raid = xmlhttp.responseText;
  206. console.log("Fetching raid tier");
  207. }
  208. else {
  209. data.raid = getTier("raid");
  210. getTower();
  211. }
  212. }
  213.  
  214. function getTower() {
  215. // fetch the tower tier page
  216. if (sessionStorage.tower == null) {
  217. var xmlhttp = new XMLHttpRequest();
  218. xmlhttp.onreadystatechange = function() {
  219. if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  220. sessionStorage.tower = xmlhttp.responseText;
  221. data.tower = getTier("tower");
  222. addTierInfo();
  223. }
  224. };
  225. xmlhttp.open("GET", tierURL.tower, true);
  226. xmlhttp.send();
  227. sessionStorage.tower = xmlhttp.responseText;
  228. console.log("Fetching tower tier");
  229. }
  230. else {
  231. data.tower = getTier("tower");
  232. addTierInfo();
  233. }
  234. }
  235.  
  236. function getTier(category) {
  237. // parse the response text into DOM
  238. var tierResult = "N/A";
  239. var doc = document.implementation.createHTMLDocument("Tier");
  240. doc.documentElement.innerHTML = sessionStorage[category];
  241.  
  242. var tables = doc.getElementsByClassName("wikitable");
  243. if (!tables) {
  244. return tierResult;
  245. }
  246.  
  247. var tiers = ['X', 'S+', 'S', 'A+', 'A', 'B', 'C', 'D', 'E'];
  248. var famName = (document.getElementById("WikiaPageHeader").getElementsByTagName("h1"))[0].innerHTML;
  249.  
  250. for (var i = 0; i < 9; i++){ // 9 tables
  251. if (!tables[i])
  252. break;
  253. var items = tables[i].innerHTML;
  254. if (items.indexOf(famName) != -1) {
  255. tierResult = tiers[i];
  256. break;
  257. }
  258. }
  259. return tierResult;
  260. }
  261.  
  262. getPvP();
  263. }
  264.  
  265. /*
  266. * Add the tier info row to the stat table
  267. * This has to be called AFTER the tiers info have all been fetched
  268. */
  269. function addTierInfo () {
  270. var table = (document.getElementsByClassName("article-table"))[0];
  271.  
  272. var newText = "<tr>" +
  273. "<td style='text-align:center;padding:0em;'><span style='border-bottom: 1px dotted; font-weight: bold; padding: 0em' title='PVP tier'><a>PVP</a></span></td><td>"
  274. + data.pvp + "</td><td style='text-align:center;padding:0em;'><span style='border-bottom: 1px dotted; font-weight: bold; padding: 0em' title='Raid tier'><a>Raid</a></span></td><td>"
  275. + data.raid + "</td><td style='text-align:center;padding:0em;'><span style='border-bottom: 1px dotted; font-weight: bold; padding: 0em' title='Tower tier'><a>Tower</a></span></td><td>"
  276. + data.tower + "</td></tr>";
  277. // add the new row to tbody
  278. (table.getElementsByTagName("tbody"))[0].innerHTML += newText;
  279. }
  280.  
  281. function addSkillInfo () {
  282.  
  283. // get the list of skills
  284. var skillList = (((document.getElementsByClassName("infobox"))[0].getElementsByTagName("tr"))[3]).getElementsByTagName("a");
  285.  
  286. var skillLink1 = skillList[0].getAttribute("href");
  287. if (sessionStorage[skillLink1] == null) {
  288. var xmlhttp = new XMLHttpRequest();
  289. xmlhttp.onreadystatechange = function() {
  290. if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  291. sessionStorage[skillLink1] = xmlhttp.responseText;
  292. skill1();
  293. }
  294. };
  295. xmlhttp.open("GET", skillLink1, true);
  296. xmlhttp.send();
  297. }
  298. else {
  299. skill1();
  300. }
  301.  
  302. function skill1 () {
  303. // parse the response text into DOM
  304. var doc = document.implementation.createHTMLDocument("Skill");
  305. doc.documentElement.innerHTML = sessionStorage[skillLink1];
  306.  
  307. // get the skill info box
  308. var infoBox = (doc.getElementsByClassName("infobox"))[0];
  309.  
  310. // insert the skill box to the side
  311. var searchBox = document.getElementById("WikiaSearch");
  312. searchBox.parentNode.insertBefore(infoBox, searchBox.nextSibling);
  313. }
  314. function skill2 () {
  315. // parse the response text into DOM
  316. var doc = document.implementation.createHTMLDocument("Skill");
  317. doc.documentElement.innerHTML = sessionStorage[skillLink2];
  318. // get the skill info box
  319. var infoBox = (doc.getElementsByClassName("infobox"))[0];
  320. // insert the skill box to the side
  321. var searchBox = document.getElementById("WikiaSearch");
  322. searchBox.parentNode.insertBefore(infoBox, searchBox.nextSibling);
  323. }
  324.  
  325. // if there's a second skill, add it too
  326. if (!(typeof skillList[1] === 'undefined')) {
  327.  
  328. var skillLink2 = skillList[1].getAttribute("href");
  329. if (sessionStorage[skillLink2] == null) {
  330. var xmlhttp2 = new XMLHttpRequest();
  331. xmlhttp2.onreadystatechange = function() {
  332. if (xmlhttp2.readyState == 4 && xmlhttp2.status == 200) {
  333. sessionStorage[skillLink2] = xmlhttp2.responseText;
  334. skill2();
  335. }
  336. };
  337. xmlhttp2.open("GET", skillLink2, true);
  338. xmlhttp2.send();
  339. }
  340. else {
  341. skill2();
  342. }
  343. }
  344. }
  345.  
  346. try {
  347. if (displayPOPE || displayTotalPE) getStats();
  348. if (displayTier) getTierInfo();
  349. if (displaySkill) addSkillInfo();
  350. }
  351. catch (err) {
  352. console.log("error: " + err);
  353. console.log("bb_extra error: probably not a fam page");
  354. }