Advertisement
Guest User

Untitled

a guest
Nov 15th, 2017
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 35.50 KB | None | 0 0
  1. /*=============================
  2.        各種定義
  3. =============================*/
  4. var tankRole = ["Gld", "Pld", "Mrd", "War", "Drk"];
  5. var dpsRole = ["Pgl", "Mnk", "Lnc", "Drg", "Arc", "Brd", "Rog", "Nin", "Mch", "Acn", "Smn", "Thm", "Blm"];
  6. var healerRole = ["Cnj", "Whm", "Sch", "Eos", "Sle", "Ast"];
  7. var petRole = ["Cho", "Gar", "Ifr", "Tit", "Eos", "Sle", "Eme", "Tpz", "Atr", "Atb"];
  8.  
  9. var farce = [];
  10. var ownerPlus = [];
  11. var ownerPlusL60 = [];
  12. var ownerDmg = [];
  13. var ownerSort = [];
  14. var dpsMax = 0;
  15. var hpsMax = 0;
  16. var xseedList = [];
  17.  
  18. var opModeFlg = 0;
  19. var dpsModeFlg = 0;
  20. var nameModeFlg = 0;
  21. var farceModeFlg = 0;
  22. var roleModeFlg = 0;
  23. var timeModeFlg = 0;
  24. var dmgModeFlg = 0;
  25.  
  26. /*=============================
  27.       表示用スクリプト
  28. =============================*/
  29. // onOverlayStateUpdate イベントを購読
  30. document.addEventListener("onOverlayStateUpdate", function (e) {
  31. if (!e.detail.isLocked) {
  32. displayResizeHandle();
  33. } else {
  34. hideResizeHandle();
  35. }
  36. });
  37.  
  38. // ウィンドウ幅調整つまみの表示非表示
  39. function displayResizeHandle() {
  40. document.documentElement.classList.add("resizeHandle");
  41. }
  42.  
  43. function hideResizeHandle() {
  44. document.documentElement.classList.remove("resizeHandle");
  45. }
  46.  
  47. // ACT本体から情報が送られてきた時に更新開始
  48. document.addEventListener("onOverlayDataUpdate", function (e) {
  49. update(e.detail);
  50. });
  51.  
  52. // 表示要素の更新
  53. function update(data) {
  54. if (timeModeFlg === 0){
  55. getData(data);
  56. updateData(data);
  57. } else if (timeModeFlg == 1 && data.isActive === false){
  58. timeModeFlg = 0;
  59. getData(data);
  60. updateData(data);
  61. }
  62. }
  63.  
  64. // 情報を取得していく
  65. function getData(data) {
  66. // 色々初期化
  67. var L60D = 0;
  68. var dpsBar = [0];
  69. var hpsBar = [0];
  70. var dpsList = [];
  71. ownerPlus = [];
  72. ownerSort = [];
  73. dpsMax = 0;
  74.  
  75. // 個人が持つ乱数シードを初期化
  76. if (data.Encounter.DURATION === 0) {
  77. xseedList = [];
  78. }
  79.  
  80. // PC情報を更新する
  81. for (var combatantName in data.Combatant) {
  82. // JobOrNameとOwnernameを取得する
  83. var combatant = createJobAndName(data.Combatant[combatantName]);
  84.  
  85. // exname作成(エギの名前を省略する)
  86. if (combatant.ownerName == "YOU") {
  87. combatant.exName = "'" + omit[combatant.exJob] + omit["break"] + combatant.ownerName;
  88. } else if (combatant.ownerName !== "") {
  89. combatant.exName = omit[combatant.exJob] + omit["break"] + combatant.ownerName;
  90. } else {
  91. combatant.exName = combatant.name;
  92. }
  93.  
  94. // 不明ENCDPSは0として扱う
  95. if (combatant.ENCDPS === undefined || combatant.ENCDPS == "+∞" ||
  96. combatant.ENCDPS == "---" || combatant.ENCDPS === "") {
  97. combatant.ENCDPS = 0;
  98. }
  99.  
  100. // リミットブレイクと不明Last60Dは0として扱う
  101. if (combatant.Last60DPS === undefined || combatant.Last60DPS == "+∞" ||
  102. combatant.Last60DPS == "---" || combatant.Last60DPS === "" || combatant.name == "Limit Break") {
  103. combatant.Last60DPS = 0;
  104. }
  105.  
  106. // ペット合算処理準備
  107. var reg = new RegExp(omit["break"] + "(.+)");
  108. var owner = combatant.exName.match(reg);
  109. if (owner !== null && combatant.exJob != "Cho") {
  110. if (ownerPlus[owner[1]] === undefined) {
  111. ownerPlus[owner[1]] = 0;
  112. ownerPlusL60[owner[1]] = 0;
  113. ownerDmg[owner[1]] = 0;
  114. }
  115. ownerPlus[owner[1]] -= -combatant.ENCDPS;
  116. ownerPlusL60[owner[1]] -= -combatant.Last60DPS;
  117. ownerDmg[owner[1]] -= -combatant.damage;
  118. }
  119.  
  120. // 名前表示モード
  121. if (nameMode == 2 && combatant.name.indexOf("YOU") == -1) {
  122. // 名前をfirstnameだけにする
  123. var firstname = combatant.exName.match(/(.+)\s(.+)/);
  124. if (firstname !== null) {
  125. combatant.exName = firstname[1];
  126. }
  127. }
  128.  
  129. // 茶番名作成(シードは一度だけ取る)
  130. if (xseedList[combatant.name] === undefined) {
  131. xseedList[combatant.name] = to_seed_num(combatant.name + "Yej6Dx", data.Encounter.CurrentZoneName);
  132. }
  133. xors.seed(xseedList[combatant.name]);
  134. if (farce[combatant.exJob] === undefined) {
  135. combatant.exNameFarce = "NEET";
  136. } else if (combatant.exName.indexOf("YOU") > -1) {
  137. combatant.exNameFarce = "'" + farce[combatant.exJob][parseInt(xors.rand()*(farce[combatant.exJob].length))];
  138. } else {
  139. combatant.exNameFarce = farce[combatant.exJob][parseInt(xors.rand()*(farce[combatant.exJob].length))];
  140. }
  141. }
  142.  
  143. // ペット合算処理用にもう一度回す
  144. for (var combatantNameSub in data.Combatant) {
  145. var combatantSub;
  146.  
  147. if (plusPet == 2) {
  148. combatantSub = data.Combatant[combatantNameSub];
  149.  
  150. // ペットDPS合算
  151. if (ownerPlus[combatantSub.name] > 0) {
  152. combatantSub.ENCDPS -= -ownerPlus[combatantSub.name];
  153. combatantSub.ENCDPS = Math.floor(combatantSub.ENCDPS * 100) / 100;
  154. ownerPlus[combatantSub.name] = "flag";
  155. }
  156.  
  157. if (ownerPlusL60[combatantSub.name] > 0) {
  158. combatantSub.Last60DPS -= -ownerPlusL60[combatantSub.name];
  159. combatantSub.Last60DPS = Math.floor(combatantSub.Last60DPS * 100) / 100;
  160. ownerPlusL60[combatantSub.name] = "flag";
  161. }
  162.  
  163. if (ownerDmg[combatantSub.name] > 0) {
  164. combatantSub.damage -= -ownerDmg[combatantSub.name];
  165. ownerDmg[combatantSub.name] = "flag";
  166. }
  167.  
  168. } else {
  169. combatantSub = createJobAndName(data.Combatant[combatantNameSub]);
  170. }
  171.  
  172. //表示順の取得
  173. ownerSort.push([combatantNameSub, parseFloat(combatantSub.ENCDPS)]);
  174.  
  175. // 平均DPSロールDPS取得
  176. if (dpsRole.indexOf(combatantSub.Job) > -1) {
  177. dpsList.push(parseFloat(combatantSub.ENCDPS));
  178. } else if (plusPet != 2 && petRole.indexOf(combatantSub.exJob) > -1 && combatantSub.exJob != "Cho" && dpsList.length > 0) {
  179. dpsList[0] -= -combatantSub.ENCDPS;
  180. }
  181.  
  182. if (combatantSub.ENCDPS > 0) {
  183. // DPSバー用ENCDPS
  184. dpsBar.push(combatantSub.ENCDPS);
  185. }
  186.  
  187. if (combatantSub.enchps > 0) {
  188. // DPSバー用enchps
  189. hpsBar.push(combatantSub.enchps);
  190. }
  191.  
  192. if (combatantSub.Last60DPS > 0) {
  193. // 手動Last60DPS生成
  194. L60D -= -combatantSub.Last60DPS;
  195.  
  196. if (data.isActive) {
  197. // DPSバー用Last60DPS
  198. dpsBar.push(combatantSub.Last60DPS);
  199. }
  200. }
  201. }
  202.  
  203. // DPSロールの平均ダメージ
  204. if (dpsList.length > 1) {
  205. data.Encounter.dpsav = dpsList.reduce(function(i, j) {
  206. if (j === dpsList[dpsList.length-1]) return Math.floor(100*((i + j)/dpsList.length))/100;
  207. return i + j;
  208. });
  209. } else {
  210. data.Encounter.dpsav = 0;
  211. }
  212. data.Encounter.dpsav.toFixed(2);
  213.  
  214. // 全体のLast60DPSが取得出来ない際は手動計算を入れる
  215. if (data.Encounter.Last60DPS === undefined || data.Encounter.Last60DPS == "+∞" ||
  216. data.Encounter.Last60DPS == "---" || data.Encounter.Last60DPS === "") {
  217. data.Encounter.Last60DPS = L60D;
  218. }
  219.  
  220. // DPSバー用の最大値を代入
  221. dpsMax = Math.max.apply(null, dpsBar);
  222.  
  223. // HPSバー用の最大値を代入
  224. hpsMax = Math.max.apply(null, hpsBar);
  225. }
  226.  
  227. // 表示を更新する
  228. function updateData(data) {
  229. // エンカウント情報を更新
  230. var header = document.getElementById('encounter');
  231. header.classList.add('cellHeader');
  232. header.innerText = "";
  233.  
  234. header.appendChild(writeHeaderCell(data.Encounter, data.isActive));
  235.  
  236. // キャラテーブル要素取得&作成
  237. var table = document.getElementById('combatantTable');
  238. var oldTableBody = table.tBodies.namedItem('combatantTableBody');
  239. var newTableBody = document.createElement("tbody");
  240. newTableBody.id = "combatantTableBody";
  241.  
  242. // 表示順の変更
  243. if (sortList == 2){
  244. ownerSort.sort(function(a,b){
  245. var c = a[1];
  246. var d = b[1];
  247. if(c < d){return 1;}
  248. if(c > d){return -1;}
  249. return 0;
  250. });
  251. }
  252.  
  253. // tbody の内容を作成
  254. var combatantIndex = 0;
  255. for (var i = 0; i < ownerSort.length; i++){
  256. var combatantName = ownerSort[i][0];
  257. var combatant = data.Combatant[combatantName];
  258.  
  259. var tableRow = newTableBody.insertRow(newTableBody.rows.length);
  260. if (tankRole.indexOf(combatant.exJob) > -1){
  261. tableRow.classList.add('tankBlock');
  262. } else if (healerRole.indexOf(combatant.exJob) > -1){
  263. tableRow.classList.add('healerBlock');
  264. } else {
  265. tableRow.classList.add('dpsBlock');
  266. }
  267.  
  268. if (combatantName == "YOU"){
  269. tableRow.id = "youTag";
  270. }
  271.  
  272. var jobCell = tableRow.insertCell();
  273. var nameCell = tableRow.insertCell();
  274. var opCell = tableRow.insertCell();
  275.  
  276. if (combatantIndex === 0) {
  277. jobCell.style.width = "25px";
  278. nameCell.style.width = "100%";
  279. opCell.style.width = "50px";
  280. }
  281.  
  282. // セルを埋めていく
  283. jobCell.appendChild(writeJobCell(combatant));
  284. nameCell.appendChild(writeNameCell(combatant, data.isActive, combatantIndex, data.Encounter.dpsav, data.Encounter.DURATION));
  285. opCell.appendChild(writeOpCell(combatant));
  286.  
  287. combatantIndex++;
  288. }
  289.  
  290. // tbody が既に存在していたら置換、そうでないならテーブルに追加
  291. if (oldTableBody != void(0)) {
  292. table.replaceChild(newTableBody, oldTableBody);
  293. }
  294. else {
  295. table.appendChild(newTableBody);
  296. }
  297.  
  298. // スイッチ状況を反映
  299. if (opModeFlg == 1) {
  300. opModeFlg = 0;
  301. toggleOp();
  302. }
  303. if (dpsModeFlg == 1) {
  304. dpsModeFlg = 0;
  305. toggleDps();
  306. }
  307. if (nameModeFlg == 1) {
  308. nameModeFlg = 0;
  309. toggleName();
  310. }
  311. if (farceModeFlg == 1) {
  312. farceModeFlg = 0;
  313. toggleFarce();
  314. }
  315. if (roleModeFlg == 1) {
  316. roleModeFlg = 0;
  317. toggleRole();
  318. }
  319. if (dmgModeFlg == 1) {
  320. dmgModeFlg = 0;
  321. toggleDmg();
  322. }
  323. }
  324.  
  325. function writeHeaderCell(encounter, isActive) {
  326. // 大枠
  327. var cell = document.createElement('div');
  328.  
  329. // 切り替えメニュー
  330. var cellTop = document.createElement('div');
  331. cellTop.classList.add('symbol');
  332. cellTop.classList.add('colorYellow');
  333. cellTop.classList.add('cellHeaderTop');
  334. var cellTopItem1 = document.createElement('span');
  335. var cellTopItem2 = document.createElement('span');
  336. var cellTopItem3 = document.createElement('span');
  337. var cellTopItem4 = document.createElement('span');
  338. var cellTopItem5 = document.createElement('span');
  339. var cellTopItem7 = document.createElement('span');
  340. cellTopItem1.innerText = "2";
  341. cellTopItem2.innerText = "q";
  342. cellTopItem3.innerText = "®";
  343. cellTopItem4.innerText = "®";
  344. cellTopItem5.innerText = "i";
  345. cellTopItem7.innerText = "~";
  346. cellTopItem1.id = "toggle1";
  347. cellTopItem2.id = "toggle2";
  348. cellTopItem3.id = "toggle3";
  349. cellTopItem4.id = "toggle4";
  350. cellTopItem5.id = "toggle5";
  351. cellTopItem7.id = "toggle7";
  352.  
  353. var onMouse;
  354. if (toggleMode == 1) {
  355. onMouse = "onClick";
  356. } else {
  357. onMouse = "onMouseOver";
  358. }
  359. cellTopItem1.setAttribute(onMouse, 'toggleOp()');
  360. cellTopItem2.setAttribute(onMouse, 'toggleDps()');
  361. cellTopItem3.setAttribute(onMouse, 'toggleName()');
  362. cellTopItem4.setAttribute(onMouse, 'toggleFarce()');
  363. cellTopItem5.setAttribute(onMouse, 'toggleRole()');
  364. cellTopItem7.setAttribute(onMouse, 'toggleDmg()');
  365.  
  366. if (maskMode == 1) {
  367. cellTopItem4.style.display = "none";
  368. } else if (maskMode == 2) {
  369. cellTopItem3.style.display = "none";
  370. } else {
  371. cellTopItem3.style.display = "none";
  372. cellTopItem4.style.display = "none";
  373. }
  374. if (filterkMode == 1){
  375. cellTopItem5.style.display = "none";
  376. }
  377. if (dpsMode == 1){
  378. cellTopItem2.style.display = "none";
  379. }
  380. if (opMode == 1){
  381. cellTopItem1.style.display = "none";
  382. }
  383. if (dmgMode == 1){
  384. cellTopItem7.style.display = "none";
  385. }
  386.  
  387. cellTop.appendChild(cellTopItem7);
  388. cellTop.appendChild(cellTopItem5);
  389. cellTop.appendChild(cellTopItem4);
  390. cellTop.appendChild(cellTopItem3);
  391. cellTop.appendChild(cellTopItem2);
  392. cellTop.appendChild(cellTopItem1);
  393.  
  394. // 時間と敵情報
  395. var cellMiddle = document.createElement('div');
  396. cellMiddle.classList.add('cellHeaderMiddle');
  397. var cellMiddleItem = document.createElement('span');
  398. cellMiddleItem.setAttribute(onMouse, 'toggleTime()');
  399. cellMiddleItem.id = "toggle6";
  400. cellMiddleItem.classList.add('symbol');
  401. var cellMiddleValue = document.createElement('span');
  402. cellMiddleValue.innerText = encounter.duration;
  403. cellMiddleValue.classList.add('num');
  404. cellMiddleValue.classList.add('timeHeader');
  405. if (isActive) {
  406. cellMiddleItem.innerText = "U";
  407. cellMiddleItem.classList.add('colorGreen');
  408. cellMiddleValue.classList.add('colorBlue');
  409. } else {
  410. cellMiddleItem.innerText = "V";
  411. cellMiddleItem.classList.add('colorYellow');
  412. cellMiddleValue.classList.add('colorYellow');
  413. }
  414.  
  415. var cellMiddleEnemy = document.createElement('span');
  416. if (encounter.title == "Encounter") {
  417. cellMiddleEnemy.innerText = encounter.CurrentZoneName;
  418. } else {
  419. cellMiddleEnemy.innerText = encounter.title;
  420. }
  421. cellMiddleEnemy.classList.add('enemyHeader');
  422. cellMiddleEnemy.classList.add('colorRed');
  423.  
  424. cellMiddle.appendChild(cellMiddleItem);
  425. cellMiddle.appendChild(cellMiddleValue);
  426. cellMiddle.appendChild(cellMiddleEnemy);
  427.  
  428. // DPS情報
  429. var cellBottom = document.createElement('div');
  430. cellBottom.id = "headerDps";
  431. cellBottom.classList.add('cellHeaderBottom');
  432. cellBottom.classList.add('colorYellow');
  433. var cellBottomItem1 = document.createElement('span');
  434. cellBottomItem1.innerText = "DPS:";
  435. cellBottomItem1.classList.add('titleHeader');
  436. var cellBottomItem2 = document.createElement('span');
  437. //cellBottomItem2.innerText = "L60D:";
  438. cellBottomItem2.classList.add('titleHeader');
  439. cellBottomItem2.classList.add('floatRight');
  440. //cellBottomItem2.classList.add('marginLeft');
  441. if (isActive) {
  442. if (parseInt(encounter.ENCDPS) < parseInt(encounter.Last60DPS) + 1) {
  443. cellBottomItem2.innerText = "↑";
  444. cellBottomItem2.classList.add('colorGreen');
  445. } else {
  446. cellBottomItem2.innerText = "↓";
  447. cellBottomItem2.classList.add('colorRed');
  448. }
  449. }
  450.  
  451. var cellBottomValue1 = document.createElement('span');
  452. cellBottomValue1.innerText = encounter.ENCDPS;
  453. cellBottomValue1.classList.add('dpsHeader');
  454. cellBottomValue1.classList.add('floatRight');
  455. cellBottomValue1.classList.add('num');
  456. if (isActive) {
  457. cellBottomValue1.classList.add('colorGold');
  458. }
  459. //var cellBottomValue2 = document.createElement('span');
  460. //cellBottomValue2.innerText = encounter.Last60DPS;
  461. //cellBottomValue2.classList.add('dpsHeader');
  462. //cellBottomValue2.classList.add('floatRight');
  463. //cellBottomValue2.classList.add('num');
  464.  
  465. cellBottom.appendChild(cellBottomItem1);
  466. //cellBottom.appendChild(cellBottomValue2);
  467. cellBottom.appendChild(cellBottomItem2);
  468. cellBottom.appendChild(cellBottomValue1);
  469.  
  470. // DPS情報サブ
  471. var cellBottomSub = document.createElement('div');
  472. cellBottomSub.id = "headerDpsSub";
  473. cellBottomSub.classList.add('cellHeaderBottomSub');
  474. cellBottomSub.classList.add('colorYellow');
  475. cellBottomSub.classList.add('tggoleVisible');
  476.  
  477. var cellBottomSubItem1 = document.createElement('span');
  478. cellBottomSubItem1.innerText = "DRA:";
  479. cellBottomSubItem1.classList.add('titleHeader');
  480. var cellBottomSubValue1 = document.createElement('span');
  481. cellBottomSubValue1.innerText = encounter.dpsav.toFixed(0);
  482. cellBottomSubValue1.classList.add('num');
  483. var cellBottomSubItem2 = document.createElement('span');
  484. cellBottomSubItem2.innerText = "T:";
  485. cellBottomSubItem2.classList.add('titleHeader');
  486. cellBottomSubItem2.classList.add('marginLeft');
  487. var cellBottomSubValue2 = document.createElement('span');
  488. cellBottomSubValue2.innerText = (encounter.dpsav * dpsAveTank / 100).toFixed(0) + "↑";
  489. cellBottomSubValue2.classList.add('num');
  490. var cellBottomSubItem3 = document.createElement('span');
  491. cellBottomSubItem3.innerText = "H:";
  492. cellBottomSubItem3.classList.add('titleHeader');
  493. cellBottomSubItem3.classList.add('marginLeft');
  494. var cellBottomSubValue3 = document.createElement('span');
  495. cellBottomSubValue3.innerText = (encounter.dpsav * dpsAveHealer / 100).toFixed(0) + "↑";
  496. cellBottomSubValue3.classList.add('num');
  497. var cellBottomSubItem4 = document.createElement('span');
  498. cellBottomSubItem4.innerText = "D:";
  499. cellBottomSubItem4.classList.add('titleHeader');
  500. cellBottomSubItem4.classList.add('marginLeft');
  501. var cellBottomSubValue4 = document.createElement('span');
  502. cellBottomSubValue4.innerText = (encounter.dpsav * cDpsLower / 100).toFixed(0) + "↓";
  503. cellBottomSubValue4.classList.add('num');
  504.  
  505. cellBottomSub.appendChild(cellBottomSubItem1);
  506. cellBottomSub.appendChild(cellBottomSubValue1);
  507. cellBottomSub.appendChild(cellBottomSubItem2);
  508. cellBottomSub.appendChild(cellBottomSubValue2);
  509. cellBottomSub.appendChild(cellBottomSubItem3);
  510. cellBottomSub.appendChild(cellBottomSubValue3);
  511. cellBottomSub.appendChild(cellBottomSubItem4);
  512. cellBottomSub.appendChild(cellBottomSubValue4);
  513.  
  514. // 結合する
  515. cell.appendChild(cellTop);
  516. cell.appendChild(cellMiddle);
  517. cell.appendChild(cellBottom);
  518. cell.appendChild(cellBottomSub);
  519.  
  520. return cell;
  521. }
  522.  
  523. function writeJobCell(combatant) {
  524. var cell = document.createElement('div');
  525. cell.classList.add('cellJob');
  526.  
  527. // ジョブ表示モード
  528. if (jobMode == 2) {
  529. cell.innerHTML = "<img src='./jobicon/" + combatant.exJob + ".png' width='25' height='25'>";
  530. } else {
  531. if (tanJob[combatant.exJob] !== null) {
  532. cell.innerText = tanJob[combatant.exJob];
  533. } else {
  534. cell.innerText = "-";
  535. }
  536. cell.classList.add('tankan');
  537. cell.classList.add('colorYellow');
  538. }
  539.  
  540. // ジョブ表示領域の背景色
  541. if (dpsRole.indexOf(combatant.exJob) > -1){
  542. cell.classList.add('cellJobDps');
  543. } else if (tankRole.indexOf(combatant.exJob) > -1){
  544. cell.classList.add('cellJobTank');
  545. } else if (healerRole.indexOf(combatant.exJob) > -1){
  546. cell.classList.add('cellJobHealer');
  547. } else {
  548. cell.classList.add('cellJobPet');
  549. }
  550.  
  551. return cell;
  552. }
  553.  
  554. function writeNameCell(combatant, isActive, index, dpsav, duration) {
  555. var cell = document.createElement('div');
  556. cell.classList.add('cell');
  557.  
  558. /* 名前 */
  559. var name = document.createElement('div');
  560. name.id = combatant.name;
  561. name.innerHTML = combatant.exName;
  562. name.classList.add('name');
  563. name.classList.add('colorBlue');
  564. name.setAttribute('onClick', 'nameCopy(this)');
  565. var nameSub = document.createElement('div');
  566. nameSub.innerText = combatant.exNameFarce;
  567. nameSub.classList.add('nameSub');
  568. nameSub.classList.add('colorBlue');
  569. nameSub.classList.add('tggoleVisible');
  570.  
  571. // YOUの色を変更
  572. if (combatant.exName == "YOU") {
  573. name.classList.add('you');
  574. } else if (combatant.exName.charAt(0) == "'") {
  575. name.innerText = combatant.exName.slice(1);
  576. name.classList.add('you');
  577. }
  578.  
  579. if (combatant.exNameFarce.charAt(0) == "'") {
  580. nameSub.innerText = combatant.exNameFarce.slice(1);
  581. nameSub.classList.add('you');
  582. }
  583.  
  584. /* DPS */
  585. var dps = document.createElement('span');
  586. dps.innerText = combatant.ENCDPS;
  587. dps.classList.add('dps');
  588. dps.classList.add('floatRight');
  589. dps.classList.add('num');
  590. dps.classList.add('colorBlue');
  591. var dpsSub = document.createElement('span');
  592. dpsSub.innerText = combatant.damage;
  593. dpsSub.classList.add('dpsSub');
  594. dpsSub.classList.add('floatRight');
  595. dpsSub.classList.add('num');
  596. dpsSub.classList.add('colorBlue');
  597. dpsSub.classList.add('tggoleVisible');
  598.  
  599. // ペット合算表示
  600. if (ownerPlus[combatant.name] == "flag" || ownerPlusL60[combatant.name] == "flag"){
  601. var dpsPlus = document.createElement('span');
  602. dpsPlus.innerText = "+";
  603. dpsPlus.classList.add('plus');
  604. dpsPlus.classList.add('floatLeft');
  605. dps.appendChild(dpsPlus);
  606. var dpsPlusSub = document.createElement('span');
  607. dpsPlusSub.innerText = "+";
  608. dpsPlusSub.classList.add('plus');
  609. dpsPlusSub.classList.add('floatLeft');
  610. dpsSub.appendChild(dpsPlusSub);
  611.  
  612. ownerPlus[combatant.name] = 0;
  613. ownerPlusL60[combatant.name] = 0;
  614. ownerDmg[combatant.name] = 0;
  615. }
  616.  
  617. // 平均値を元に指定した条件でDPS色変化
  618. if (dpsav > 0) {
  619. /* DRAの指定値%以下で色変化 */
  620.  
  621. // DPS用
  622. if ((duration >= cDuration && combatant.ENCDPS < dpsav * 0.75) && dpsRole.indexOf(combatant.exJob) > -1) {
  623. dps.classList.add('colorRed');
  624. }
  625.  
  626. // タンク&ヒーラー用
  627. if (duration >= cDuration &&
  628. ((combatant.ENCDPS >= dpsav * dpsAveTank / 100 && tankRole.indexOf(combatant.Job) > -1) ||
  629. (combatant.ENCDPS >= dpsav * dpsAveHealer / 100 && healerRole.indexOf(combatant.Job) > -1))) {
  630. dps.classList.add('colorPurple');
  631. }
  632.  
  633. // 共通
  634. if (duration >= cDuration && combatant.ENCDPS >= dpsav * cDpsUpper / 100 ) {
  635. dps.classList.add('colorGold');
  636. }
  637. }
  638.  
  639. /* バー内の値 */
  640. var ex = document.createElement('span');
  641. var exNum = document.createElement('span');
  642. ex.classList.add('ex');
  643. ex.classList.add('colorYellow');
  644. exNum.classList.add('num');
  645. exNum.classList.add('colorBlue');
  646. exNum.classList.add('floatRight');
  647.  
  648. /* DPSバー */
  649. var bar = document.createElement('span');
  650. bar.classList.add('bar');
  651.  
  652. var barMax = 0;
  653. var barMin = 0;
  654. var barMinValue = 0;
  655. var leftColor = "";
  656. var rightColor = "";
  657. var barSize = 100;
  658. if (healerRole.indexOf(combatant.exJob) > -1 && healerBar == 2) {
  659. // HPSバー
  660. barMax = combatant.enchps;
  661. if (combatant.OverHealPct === undefined) {
  662. ex.innerText = "Unknown";
  663. barMinValue = 0;
  664. exNum.innerText = "";
  665. } else {
  666. ex.innerText = "tHPS:";
  667. barMinValue = parseInt(barMax) - (parseInt(barMax) * (parseInt(combatant.OverHealPct.slice(0, -1)) / 100));
  668. exNum.innerText = barMinValue.toFixed(0);
  669. }
  670. leftColor = "rgba(50,205,50,0.5)";
  671. rightColor = "rgba(173,255,47,0.25)";
  672. barMin = (parseInt(barMinValue) / parseInt(barMax));
  673. barSize = (parseInt(barMax) * 100 / parseInt(hpsMax));
  674. } else {
  675. // DPSバー
  676. if (parseInt(combatant.ENCDPS) > parseInt(combatant.Last60DPS)) {
  677. // DPSが下降線の時にLast60DPS範囲の色を変える
  678. barMax = combatant.ENCDPS;
  679. barMinValue = combatant.Last60DPS;
  680. if (tankRole.indexOf(combatant.exJob) > -1) {
  681. // タンクロールのバー色
  682. leftColor = "rgba(65,105,225,0.5)";
  683. rightColor = "rgba(65,105,225,0.5)";
  684. } else if (healerRole.indexOf(combatant.exJob) > -1) {
  685. // ヒーラーロールのバー色
  686. leftColor = "rgba(50,205,50,0.5)";
  687. rightColor = "rgba(50,205,50,0.5)";
  688. } else {
  689. // DPSロールのバー色
  690. leftColor = "rgba(220,20,60,0.5)";
  691. rightColor = "rgba(220,20,60,0.5)";
  692. }
  693. } else {
  694. barMax = combatant.Last60DPS;
  695. barMinValue = combatant.ENCDPS;
  696. if (tankRole.indexOf(combatant.exJob) > -1) {
  697. // タンクロールのバー色
  698. leftColor = "rgba(65,105,225,0.5)";
  699. rightColor = "rgba(255,215,0,0.25)";
  700. } else if (healerRole.indexOf(combatant.exJob) > -1) {
  701. // ヒーラーロールのバー色
  702. leftColor = "rgba(50,205,50,0.5)";
  703. rightColor = "rgba(255,215,0,0.25)";
  704. } else {
  705. // DPSロールのバー色
  706. leftColor = "rgba(220,20,60,0.5)";
  707. rightColor = "rgba(255,215,0,0.25)";
  708. }
  709. }
  710. barMin = (parseInt(barMinValue) / parseInt(barMax));
  711.  
  712. if (combatant.exJob == "LtB") {
  713. ex.innerText = "Special Move";
  714. exNum.innerText = "";
  715. } else {
  716. ex.innerText = "L60D:";
  717. exNum.innerText = combatant.Last60DPS;
  718. }
  719.  
  720. // 非アクティブ時は境界線を作らない
  721. if (!isActive) {
  722. barMax = combatant.ENCDPS;
  723. if (tankRole.indexOf(combatant.exJob) > -1) {
  724. leftColor = "rgba(65,105,225,0.5)";
  725. rightColor = "rgba(65,105,225,0.5)";
  726. } else if (healerRole.indexOf(combatant.exJob) > -1) {
  727. leftColor = "rgba(50,205,50,0.5)";
  728. rightColor = "rgba(50,205,50,0.5)";
  729. } else {
  730. leftColor = "rgba(220,20,60,0.5)";
  731. rightColor = "rgba(220,20,60,0.5)";
  732. }
  733. ex.innerText = "";
  734. exNum.innerText = "";
  735. if (parseInt(combatant.Last60DPS) > parseInt(combatant.ENCDPS)) {
  736. barMin = 1;
  737. }
  738. }
  739.  
  740. barSize = (parseInt(barMax) * 100 / parseInt(dpsMax));
  741. }
  742.  
  743. bar.style.background = "-webkit-gradient(linear, left top,right top, color-stop(" + barMin + "," + leftColor + "), color-stop(" + barMin + "," + rightColor + "))";
  744. bar.style.width = barSize + "%";
  745.  
  746. // L60Dや実HPSの位置を調整
  747. var positionLeft = 100 * (barSize / 100 * barMin);
  748. if (barSize <= 30 && combatant.exJob == "LtB") {
  749. ex.style.left = barSize + "%";
  750. } else if (healerRole.indexOf(combatant.exJob) == -1 && barSize > exPosition && positionLeft <= exPosition){
  751. ex.style.left = "0%";
  752. } else if (positionLeft >= exPosition) {
  753. ex.style.left = positionLeft - exPosition + "%";
  754. } else if ((barSize - positionLeft) > exPosition) {
  755. ex.style.left = positionLeft + "%";
  756. } else {
  757. ex.style.left = barSize + "%";
  758. }
  759.  
  760. /* DPS表示横のミス&デス表示 */
  761. var opTop = document.createElement('div');
  762. var opUnder = document.createElement('div');
  763. opTop.classList.add('nameOpTop');
  764. opUnder.classList.add('nameOpUnder');
  765. opTop.classList.add('opClasses');
  766. opUnder.classList.add('opClasses');
  767. var opItem1 = document.createElement('span');
  768. var opValue1 = document.createElement('span');
  769. var opItem2 = document.createElement('span');
  770. var opValue2 = document.createElement('span');
  771. opItem1.classList.add('colorYellow');
  772. opValue1.classList.add('num');
  773. opValue1.classList.add('colorRed');
  774. opItem2.classList.add('colorYellow');
  775. opValue2.classList.add('num');
  776. opValue2.classList.add('colorRed');
  777.  
  778. if (combatant.misses > 0) {
  779. opItem1.innerHTML = "M.";
  780. opValue1.innerHTML = combatant.misses;
  781. }
  782. if (combatant.deaths > 0) {
  783. opItem2.innerHTML = "D.";
  784. opValue2.innerHTML = combatant.deaths;
  785. }
  786.  
  787. opTop.appendChild(opItem1);
  788. opTop.appendChild(opValue1);
  789. opUnder.appendChild(opItem2);
  790. opUnder.appendChild(opValue2);
  791.  
  792. if (opItem == 1) {
  793. opTop.classList.add('tggoleVisible');
  794. opUnder.classList.add('tggoleVisible');
  795. }
  796.  
  797. // 結合
  798. ex.appendChild(exNum);
  799. cell.appendChild(name);
  800. cell.appendChild(nameSub);
  801. cell.appendChild(dps);
  802. cell.appendChild(dpsSub);
  803. cell.appendChild(bar);
  804. cell.appendChild(ex);
  805. cell.appendChild(opTop);
  806. cell.appendChild(opUnder);
  807. return cell;
  808. }
  809.  
  810. function writeOpCell(combatant) {
  811. var displayMode = 0;
  812. var toggleIcon = document.getElementById('toggle1');
  813. if (toggleIcon.classList.contains('colorGreen')) {
  814. displayMode = 1;
  815. toggleIcon.classList.add('colorGreen');
  816. }
  817.  
  818. var cell = document.createElement('div');
  819. cell.classList.add('cell');
  820. cell.classList.add('cellOp');
  821. cell.classList.add('colorYellow');
  822.  
  823. // 項目
  824. var top = document.createElement('div');
  825. var under = document.createElement('div');
  826. top.innerText = "Miss";
  827. under.innerText = "Dead";
  828. top.classList.add('cellOpTop');
  829. under.classList.add('cellOpUnder');
  830. top.classList.add('opClasses');
  831. under.classList.add('opClasses');
  832.  
  833. // 値
  834. var topValue = document.createElement('span');
  835. var underValue = document.createElement('span');
  836. topValue.innerText = combatant.misses;
  837. underValue.innerText = combatant.deaths;
  838. topValue.classList.add('floatRight');
  839. underValue.classList.add('floatRight');
  840. topValue.classList.add('numMissDeath');
  841. underValue.classList.add('numMissDeath');
  842.  
  843. if (combatant.misses === '0') {
  844. topValue.classList.add('num');
  845. topValue.classList.add('colorBlue');
  846. } else {
  847. topValue.classList.add('num');
  848. topValue.classList.add('colorRed');
  849. }
  850.  
  851. if (combatant.deaths === '0') {
  852. underValue.classList.add('num');
  853. underValue.classList.add('colorBlue');
  854. } else {
  855. underValue.classList.add('num');
  856. underValue.classList.add('colorRed');
  857. }
  858.  
  859. // サブ項目
  860. var topSub = document.createElement('div');
  861. var underSub = document.createElement('div');
  862. topSub.innerText = "Swg";
  863. underSub.innerText = "Crt";
  864. topSub.classList.add('cellOpTopSub');
  865. underSub.classList.add('cellOpUnderSub');
  866. topSub.classList.add('opClasses');
  867. underSub.classList.add('opClasses');
  868.  
  869. // サブ値
  870. var topValueSub = document.createElement('span');
  871. var underValueSub = document.createElement('span');
  872. topValueSub.innerText = combatant.swings;
  873. underValueSub.innerText = combatant["crithit%"].slice(0, -1);
  874. topValueSub.classList.add('num');
  875. underValueSub.classList.add('num');
  876. topValueSub.classList.add('colorBlue');
  877. underValueSub.classList.add('colorBlue');
  878. topValueSub.classList.add('floatRight');
  879. underValueSub.classList.add('floatRight');
  880.  
  881. // クリティカルの%
  882. var criPercent = document.createElement('span');
  883. criPercent.classList.add('percent');
  884. criPercent.classList.add('colorYellow');
  885. criPercent.classList.add('floatRight');
  886. criPercent.innerText = "%";
  887. underValueSub.appendChild(criPercent);
  888.  
  889. if (opItem == 1) {
  890. topSub.classList.add('tggoleVisible');
  891. underSub.classList.add('tggoleVisible');
  892. } else {
  893. top.classList.add('tggoleVisible');
  894. under.classList.add('tggoleVisible');
  895. }
  896.  
  897. // 結合
  898. top.appendChild(topValue);
  899. under.appendChild(underValue);
  900. topSub.appendChild(topValueSub);
  901. underSub.appendChild(underValueSub);
  902. cell.appendChild(top);
  903. cell.appendChild(under);
  904. cell.appendChild(topSub);
  905. cell.appendChild(underSub);
  906. return cell;
  907. }
  908.  
  909. // JobOrNameとペットの省略表示を作成
  910. function createJobAndName(combatant) {
  911. if (combatant.Job === "") {
  912. var owner = combatant.name.match(/[(](.+)[)]/);
  913. if (owner !== null) {
  914. for (var i=0; i<youNameList.length; i++) {
  915. if (youNameList[i] == owner[1]) {
  916. combatant.ownerName = "YOU";
  917. break;
  918. }
  919. }
  920. if (combatant.ownerName != "YOU") {
  921. combatant.ownerName = owner[1];
  922. }
  923. } else {
  924. combatant.ownerName = "";
  925. }
  926.  
  927. if (combatant.name.indexOf("ガルーダ・エギ") === 0 || combatant.name.indexOf("Garuda-Egi") === 0) {
  928. combatant.exJob = "Gar";
  929. } else if (combatant.name.indexOf("イフリート・エギ") === 0 || combatant.name.indexOf("Ifrit-Egi") === 0) {
  930. combatant.exJob = "Ifr";
  931. } else if (combatant.name.indexOf("タイタン・エギ") === 0 || combatant.name.indexOf("Titan-Egi") === 0) {
  932. combatant.exJob = "Tit";
  933. } else if (combatant.name.indexOf("フェアリー・エオス") === 0 || combatant.name.indexOf("Eos") === 0) {
  934. combatant.exJob = "Eos";
  935. } else if (combatant.name.indexOf("フェアリー・セレネ") === 0 || combatant.name.indexOf("Selene") === 0) {
  936. combatant.exJob = "Sle";
  937. } else if (combatant.name.indexOf("カーバンクル・エメラルド") === 0 || combatant.name.indexOf("Emerald Carbuncle") === 0) {
  938. combatant.exJob = "Eme";
  939. } else if (combatant.name.indexOf("カーバンクル・トパーズ") === 0 || combatant.name.indexOf("Topaz Carbuncle") === 0) {
  940. combatant.exJob = "Tpz";
  941. } else if (combatant.name.indexOf("オートタレット・ルーク") === 0 || combatant.name.indexOf("Rook Autoturret") === 0) {
  942. combatant.exJob = "Atr";
  943. } else if (combatant.name.indexOf("オートタレット・ビショップ") === 0 || combatant.name.indexOf("Bishop Autoturret") === 0) {
  944. combatant.exJob = "Atb";
  945. } else if (combatant.name.indexOf("Limit Break") === 0) {
  946. combatant.exJob = "LtB";
  947. } else if (owner !== null && !combatant.name.match(/[^a-zA-Z()'\s]/)) {
  948. combatant.exJob = "Cho";
  949. } else {
  950. combatant.exJob = "Err";
  951. }
  952. } else {
  953. combatant.exJob = combatant.Job;
  954. combatant.ownerName = "";
  955. }
  956.  
  957. return combatant;
  958. }
  959.  
  960. // オプション表示切り替え
  961. function toggleOp() {
  962. opModeFlg = 1 - opModeFlg;
  963.  
  964. var value = document.getElementsByClassName('opClasses');
  965. for(var i = 0, j = value.length; i < j; i++) {
  966. value[i].classList.toggle('tggoleVisible');
  967. }
  968.  
  969. var toggleIcon = document.getElementById('toggle1');
  970. toggleIcon.classList.toggle('colorGreen');
  971. }
  972.  
  973. // DPS表示切り替え
  974. function toggleDps() {
  975. dpsModeFlg = 1 - dpsModeFlg;
  976.  
  977. var value = document.getElementById('headerDps');
  978. if (value !== null) {
  979. var valueSub = document.getElementById('headerDpsSub');
  980. value.classList.toggle('tggoleVisible');
  981. valueSub.classList.toggle('tggoleVisible');
  982. }
  983.  
  984. var toggleIcon = document.getElementById('toggle2');
  985. toggleIcon.classList.toggle('colorGreen');
  986. }
  987.  
  988. // ダメージ表示切り替え
  989. function toggleDmg() {
  990. dmgModeFlg = 1 - dmgModeFlg;
  991.  
  992. var valueDps = document.getElementsByClassName('Dps');
  993. var valueDpsSub = document.getElementsByClassName('DpsSub');
  994. for(var i = 0, j = valueDps.length; i < j; i++) {
  995. valueDps[i].classList.toggle('tggoleVisible');
  996. valueDpsSub[i].classList.toggle('tggoleVisible');
  997. }
  998.  
  999. var toggleIcon = document.getElementById('toggle7');
  1000. toggleIcon.classList.toggle('colorGreen');
  1001. }
  1002.  
  1003. // 名前表示切り替え
  1004. function toggleName() {
  1005. nameModeFlg = 1 - nameModeFlg;
  1006.  
  1007. var valueName = document.getElementsByClassName('name');
  1008. var valueNameSub = document.getElementsByClassName('nameSub');
  1009. var valueNameYou = document.getElementsByClassName('name you');
  1010. for(var i = 0, j = valueName.length; i < j; i++) {
  1011. valueName[i].classList.toggle('tggoleVisible');
  1012. }
  1013. valueNameYou[0].classList.remove('tggoleVisible');
  1014.  
  1015. var toggleIcon = document.getElementById('toggle3');
  1016. toggleIcon.classList.toggle('colorGreen');
  1017. }
  1018.  
  1019. // 茶番表示切り替え
  1020. function toggleFarce() {
  1021. farceModeFlg = 1 - farceModeFlg;
  1022.  
  1023. var valueName = document.getElementsByClassName('name');
  1024. var valueNameSub = document.getElementsByClassName('nameSub');
  1025. for(var i = 0, j = valueName.length; i < j; i++) {
  1026. valueName[i].classList.toggle('tggoleVisible');
  1027. valueNameSub[i].classList.toggle('tggoleVisible');
  1028. }
  1029.  
  1030. var toggleIcon = document.getElementById('toggle4');
  1031. toggleIcon.classList.toggle('colorGreen');
  1032. }
  1033.  
  1034. // ロール表示切り替え
  1035. function toggleRole() {
  1036. roleModeFlg = 1 - roleModeFlg;
  1037.  
  1038. var valueRole = document.getElementsByClassName('dpsBlock');
  1039. if (valueRole[1] !== undefined) {
  1040. for(var i = 1, j = valueRole.length; i < j; i++) {
  1041. valueRole[i].classList.toggle('tggoleDisplay');
  1042. }
  1043. }
  1044. var valueYou = document.getElementById('youTag');
  1045. if(valueYou !== null){
  1046. valueYou.classList.remove('tggoleDisplay');
  1047. }
  1048.  
  1049. var toggleIcon = document.getElementById('toggle5');
  1050. toggleIcon.classList.toggle('colorGreen');
  1051. }
  1052.  
  1053. // 時間停止切り替え表示切り替え
  1054. function toggleTime() {
  1055. var toggleIcon = document.getElementById('toggle6');
  1056. if (toggleIcon.classList.contains('colorGreen')) {
  1057. toggleIcon.classList.add('colorRed');
  1058. toggleIcon.classList.remove('colorGreen');
  1059. timeModeFlg = 1;
  1060. } else if (toggleIcon.classList.contains('colorRed')) {
  1061. toggleIcon.classList.add('colorGreen');
  1062. toggleIcon.classList.remove('colorRed');
  1063. timeModeFlg = 0;
  1064. } else {
  1065. timeModeFlg = 0;
  1066. }
  1067. }
  1068.  
  1069. // 名前を元にロドストの検索ページをコピーする
  1070. function nameCopy(name) {
  1071. var fullName = name.id.match(/(.+)\s(.+)/);
  1072. var byOwner = name.id.match(/\(.+\)$/);
  1073. if (fullName && !byOwner){
  1074. var url = "http://jp.finalfantasyxiv.com/lodestone/character/?q=" + fullName[1] + "+" + fullName[2] + "&worldname=&classjob=&race_tribe=&order=";
  1075. var tableBox = document.getElementById('table_box');
  1076. var nameBox = document.getElementById(name.id);
  1077. var copyArea = document.createElement('textarea');
  1078. copyArea.innerText = url;
  1079. tableBox.appendChild(copyArea);
  1080. copyArea.select();
  1081. document.execCommand("copy");
  1082. tableBox.removeChild(copyArea);
  1083.  
  1084. nameBox.classList.add('copy');
  1085. setTimeout( function() {
  1086. nameBox.classList.remove('copy');
  1087. }, 1000 );
  1088. }
  1089. }
  1090.  
  1091. // 省略Xorshift(一応xyzも定義)
  1092. xors = {
  1093. x: 123456789,
  1094. y: 362436069,
  1095. z: 521288629,
  1096. w: 88675123
  1097. };
  1098. xors.seed = function(s) {
  1099. xors.w = s;
  1100. };
  1101. xors.rand = function() {
  1102. var w;
  1103. for (var i=0; i<5; i++) {
  1104. var v = xors.x ^ (xors.x << 11);
  1105. w = (xors.w ^ (xors.w >> 19)) ^ (v ^ (v >> 8));
  1106. }
  1107. return w % 0x1000 / 0x1000;
  1108. };
  1109.  
  1110. // 名前と場所を適当な数字へ変換
  1111. function to_seed_num(name, zone) {
  1112. var n = 1;
  1113. var z = 1;
  1114. var m = [];
  1115. var o = "";
  1116. var DD = new Date();
  1117. for (var i=0, len=name.length ; i<len; i++) {
  1118. m[i] = name.charCodeAt(i);
  1119. n *= m[i];
  1120. }
  1121. for (var j=0; j<5; j++) {
  1122. o = n.toString();
  1123. o = Number( o.substr(2, 10));
  1124. n = Math.round(Math.pow(o,3) / m[j]*2);
  1125. }
  1126.  
  1127. n = n.toString();
  1128. return Number( n.substr(2, 8) * (z + DD.getFullYear() + DD.getMonth() + DD.getDate() + DD.getDay()));
  1129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement