Skip to content

Instantly share code, notes, and snippets.

Created November 15, 2017 10:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/b342e04728ecf8ab857ef9dcdf8c3797 to your computer and use it in GitHub Desktop.
Save anonymous/b342e04728ecf8ab857ef9dcdf8c3797 to your computer and use it in GitHub Desktop.
/*=============================
       各種定義
=============================*/
var tankRole = ["Gld", "Pld", "Mrd", "War", "Drk"];
var dpsRole = ["Pgl", "Mnk", "Lnc", "Drg", "Arc", "Brd", "Rog", "Nin", "Mch", "Acn", "Smn", "Thm", "Blm"];
var healerRole = ["Cnj", "Whm", "Sch", "Eos", "Sle", "Ast"];
var petRole = ["Cho", "Gar", "Ifr", "Tit", "Eos", "Sle", "Eme", "Tpz", "Atr", "Atb"];
var farce = [];
var ownerPlus = [];
var ownerPlusL60 = [];
var ownerDmg = [];
var ownerSort = [];
var dpsMax = 0;
var hpsMax = 0;
var xseedList = [];
var opModeFlg = 0;
var dpsModeFlg = 0;
var nameModeFlg = 0;
var farceModeFlg = 0;
var roleModeFlg = 0;
var timeModeFlg = 0;
var dmgModeFlg = 0;
/*=============================
      表示用スクリプト
=============================*/
// onOverlayStateUpdate イベントを購読
document.addEventListener("onOverlayStateUpdate", function (e) {
if (!e.detail.isLocked) {
displayResizeHandle();
} else {
hideResizeHandle();
}
});
// ウィンドウ幅調整つまみの表示非表示
function displayResizeHandle() {
document.documentElement.classList.add("resizeHandle");
}
function hideResizeHandle() {
document.documentElement.classList.remove("resizeHandle");
}
// ACT本体から情報が送られてきた時に更新開始
document.addEventListener("onOverlayDataUpdate", function (e) {
update(e.detail);
});
// 表示要素の更新
function update(data) {
if (timeModeFlg === 0){
getData(data);
updateData(data);
} else if (timeModeFlg == 1 && data.isActive === false){
timeModeFlg = 0;
getData(data);
updateData(data);
}
}
// 情報を取得していく
function getData(data) {
// 色々初期化
var L60D = 0;
var dpsBar = [0];
var hpsBar = [0];
var dpsList = [];
ownerPlus = [];
ownerSort = [];
dpsMax = 0;
// 個人が持つ乱数シードを初期化
if (data.Encounter.DURATION === 0) {
xseedList = [];
}
// PC情報を更新する
for (var combatantName in data.Combatant) {
// JobOrNameとOwnernameを取得する
var combatant = createJobAndName(data.Combatant[combatantName]);
// exname作成(エギの名前を省略する)
if (combatant.ownerName == "YOU") {
combatant.exName = "'" + omit[combatant.exJob] + omit["break"] + combatant.ownerName;
} else if (combatant.ownerName !== "") {
combatant.exName = omit[combatant.exJob] + omit["break"] + combatant.ownerName;
} else {
combatant.exName = combatant.name;
}
// 不明ENCDPSは0として扱う
if (combatant.ENCDPS === undefined || combatant.ENCDPS == "+∞" ||
combatant.ENCDPS == "---" || combatant.ENCDPS === "") {
combatant.ENCDPS = 0;
}
// リミットブレイクと不明Last60Dは0として扱う
if (combatant.Last60DPS === undefined || combatant.Last60DPS == "+∞" ||
combatant.Last60DPS == "---" || combatant.Last60DPS === "" || combatant.name == "Limit Break") {
combatant.Last60DPS = 0;
}
// ペット合算処理準備
var reg = new RegExp(omit["break"] + "(.+)");
var owner = combatant.exName.match(reg);
if (owner !== null && combatant.exJob != "Cho") {
if (ownerPlus[owner[1]] === undefined) {
ownerPlus[owner[1]] = 0;
ownerPlusL60[owner[1]] = 0;
ownerDmg[owner[1]] = 0;
}
ownerPlus[owner[1]] -= -combatant.ENCDPS;
ownerPlusL60[owner[1]] -= -combatant.Last60DPS;
ownerDmg[owner[1]] -= -combatant.damage;
}
// 名前表示モード
if (nameMode == 2 && combatant.name.indexOf("YOU") == -1) {
// 名前をfirstnameだけにする
var firstname = combatant.exName.match(/(.+)\s(.+)/);
if (firstname !== null) {
combatant.exName = firstname[1];
}
}
// 茶番名作成(シードは一度だけ取る)
if (xseedList[combatant.name] === undefined) {
xseedList[combatant.name] = to_seed_num(combatant.name + "Yej6Dx", data.Encounter.CurrentZoneName);
}
xors.seed(xseedList[combatant.name]);
if (farce[combatant.exJob] === undefined) {
combatant.exNameFarce = "NEET";
} else if (combatant.exName.indexOf("YOU") > -1) {
combatant.exNameFarce = "'" + farce[combatant.exJob][parseInt(xors.rand()*(farce[combatant.exJob].length))];
} else {
combatant.exNameFarce = farce[combatant.exJob][parseInt(xors.rand()*(farce[combatant.exJob].length))];
}
}
// ペット合算処理用にもう一度回す
for (var combatantNameSub in data.Combatant) {
var combatantSub;
if (plusPet == 2) {
combatantSub = data.Combatant[combatantNameSub];
// ペットDPS合算
if (ownerPlus[combatantSub.name] > 0) {
combatantSub.ENCDPS -= -ownerPlus[combatantSub.name];
combatantSub.ENCDPS = Math.floor(combatantSub.ENCDPS * 100) / 100;
ownerPlus[combatantSub.name] = "flag";
}
if (ownerPlusL60[combatantSub.name] > 0) {
combatantSub.Last60DPS -= -ownerPlusL60[combatantSub.name];
combatantSub.Last60DPS = Math.floor(combatantSub.Last60DPS * 100) / 100;
ownerPlusL60[combatantSub.name] = "flag";
}
if (ownerDmg[combatantSub.name] > 0) {
combatantSub.damage -= -ownerDmg[combatantSub.name];
ownerDmg[combatantSub.name] = "flag";
}
} else {
combatantSub = createJobAndName(data.Combatant[combatantNameSub]);
}
//表示順の取得
ownerSort.push([combatantNameSub, parseFloat(combatantSub.ENCDPS)]);
// 平均DPSロールDPS取得
if (dpsRole.indexOf(combatantSub.Job) > -1) {
dpsList.push(parseFloat(combatantSub.ENCDPS));
} else if (plusPet != 2 && petRole.indexOf(combatantSub.exJob) > -1 && combatantSub.exJob != "Cho" && dpsList.length > 0) {
dpsList[0] -= -combatantSub.ENCDPS;
}
if (combatantSub.ENCDPS > 0) {
// DPSバー用ENCDPS
dpsBar.push(combatantSub.ENCDPS);
}
if (combatantSub.enchps > 0) {
// DPSバー用enchps
hpsBar.push(combatantSub.enchps);
}
if (combatantSub.Last60DPS > 0) {
// 手動Last60DPS生成
L60D -= -combatantSub.Last60DPS;
if (data.isActive) {
// DPSバー用Last60DPS
dpsBar.push(combatantSub.Last60DPS);
}
}
}
// DPSロールの平均ダメージ
if (dpsList.length > 1) {
data.Encounter.dpsav = dpsList.reduce(function(i, j) {
if (j === dpsList[dpsList.length-1]) return Math.floor(100*((i + j)/dpsList.length))/100;
return i + j;
});
} else {
data.Encounter.dpsav = 0;
}
data.Encounter.dpsav.toFixed(2);
// 全体のLast60DPSが取得出来ない際は手動計算を入れる
if (data.Encounter.Last60DPS === undefined || data.Encounter.Last60DPS == "+∞" ||
data.Encounter.Last60DPS == "---" || data.Encounter.Last60DPS === "") {
data.Encounter.Last60DPS = L60D;
}
// DPSバー用の最大値を代入
dpsMax = Math.max.apply(null, dpsBar);
// HPSバー用の最大値を代入
hpsMax = Math.max.apply(null, hpsBar);
}
// 表示を更新する
function updateData(data) {
// エンカウント情報を更新
var header = document.getElementById('encounter');
header.classList.add('cellHeader');
header.innerText = "";
header.appendChild(writeHeaderCell(data.Encounter, data.isActive));
// キャラテーブル要素取得&作成
var table = document.getElementById('combatantTable');
var oldTableBody = table.tBodies.namedItem('combatantTableBody');
var newTableBody = document.createElement("tbody");
newTableBody.id = "combatantTableBody";
// 表示順の変更
if (sortList == 2){
ownerSort.sort(function(a,b){
var c = a[1];
var d = b[1];
if(c < d){return 1;}
if(c > d){return -1;}
return 0;
});
}
// tbody の内容を作成
var combatantIndex = 0;
for (var i = 0; i < ownerSort.length; i++){
var combatantName = ownerSort[i][0];
var combatant = data.Combatant[combatantName];
var tableRow = newTableBody.insertRow(newTableBody.rows.length);
if (tankRole.indexOf(combatant.exJob) > -1){
tableRow.classList.add('tankBlock');
} else if (healerRole.indexOf(combatant.exJob) > -1){
tableRow.classList.add('healerBlock');
} else {
tableRow.classList.add('dpsBlock');
}
if (combatantName == "YOU"){
tableRow.id = "youTag";
}
var jobCell = tableRow.insertCell();
var nameCell = tableRow.insertCell();
var opCell = tableRow.insertCell();
if (combatantIndex === 0) {
jobCell.style.width = "25px";
nameCell.style.width = "100%";
opCell.style.width = "50px";
}
// セルを埋めていく
jobCell.appendChild(writeJobCell(combatant));
nameCell.appendChild(writeNameCell(combatant, data.isActive, combatantIndex, data.Encounter.dpsav, data.Encounter.DURATION));
opCell.appendChild(writeOpCell(combatant));
combatantIndex++;
}
// tbody が既に存在していたら置換、そうでないならテーブルに追加
if (oldTableBody != void(0)) {
table.replaceChild(newTableBody, oldTableBody);
}
else {
table.appendChild(newTableBody);
}
// スイッチ状況を反映
if (opModeFlg == 1) {
opModeFlg = 0;
toggleOp();
}
if (dpsModeFlg == 1) {
dpsModeFlg = 0;
toggleDps();
}
if (nameModeFlg == 1) {
nameModeFlg = 0;
toggleName();
}
if (farceModeFlg == 1) {
farceModeFlg = 0;
toggleFarce();
}
if (roleModeFlg == 1) {
roleModeFlg = 0;
toggleRole();
}
if (dmgModeFlg == 1) {
dmgModeFlg = 0;
toggleDmg();
}
}
function writeHeaderCell(encounter, isActive) {
// 大枠
var cell = document.createElement('div');
// 切り替えメニュー
var cellTop = document.createElement('div');
cellTop.classList.add('symbol');
cellTop.classList.add('colorYellow');
cellTop.classList.add('cellHeaderTop');
var cellTopItem1 = document.createElement('span');
var cellTopItem2 = document.createElement('span');
var cellTopItem3 = document.createElement('span');
var cellTopItem4 = document.createElement('span');
var cellTopItem5 = document.createElement('span');
var cellTopItem7 = document.createElement('span');
cellTopItem1.innerText = "2";
cellTopItem2.innerText = "q";
cellTopItem3.innerText = "®";
cellTopItem4.innerText = "®";
cellTopItem5.innerText = "i";
cellTopItem7.innerText = "~";
cellTopItem1.id = "toggle1";
cellTopItem2.id = "toggle2";
cellTopItem3.id = "toggle3";
cellTopItem4.id = "toggle4";
cellTopItem5.id = "toggle5";
cellTopItem7.id = "toggle7";
var onMouse;
if (toggleMode == 1) {
onMouse = "onClick";
} else {
onMouse = "onMouseOver";
}
cellTopItem1.setAttribute(onMouse, 'toggleOp()');
cellTopItem2.setAttribute(onMouse, 'toggleDps()');
cellTopItem3.setAttribute(onMouse, 'toggleName()');
cellTopItem4.setAttribute(onMouse, 'toggleFarce()');
cellTopItem5.setAttribute(onMouse, 'toggleRole()');
cellTopItem7.setAttribute(onMouse, 'toggleDmg()');
if (maskMode == 1) {
cellTopItem4.style.display = "none";
} else if (maskMode == 2) {
cellTopItem3.style.display = "none";
} else {
cellTopItem3.style.display = "none";
cellTopItem4.style.display = "none";
}
if (filterkMode == 1){
cellTopItem5.style.display = "none";
}
if (dpsMode == 1){
cellTopItem2.style.display = "none";
}
if (opMode == 1){
cellTopItem1.style.display = "none";
}
if (dmgMode == 1){
cellTopItem7.style.display = "none";
}
cellTop.appendChild(cellTopItem7);
cellTop.appendChild(cellTopItem5);
cellTop.appendChild(cellTopItem4);
cellTop.appendChild(cellTopItem3);
cellTop.appendChild(cellTopItem2);
cellTop.appendChild(cellTopItem1);
// 時間と敵情報
var cellMiddle = document.createElement('div');
cellMiddle.classList.add('cellHeaderMiddle');
var cellMiddleItem = document.createElement('span');
cellMiddleItem.setAttribute(onMouse, 'toggleTime()');
cellMiddleItem.id = "toggle6";
cellMiddleItem.classList.add('symbol');
var cellMiddleValue = document.createElement('span');
cellMiddleValue.innerText = encounter.duration;
cellMiddleValue.classList.add('num');
cellMiddleValue.classList.add('timeHeader');
if (isActive) {
cellMiddleItem.innerText = "U";
cellMiddleItem.classList.add('colorGreen');
cellMiddleValue.classList.add('colorBlue');
} else {
cellMiddleItem.innerText = "V";
cellMiddleItem.classList.add('colorYellow');
cellMiddleValue.classList.add('colorYellow');
}
var cellMiddleEnemy = document.createElement('span');
if (encounter.title == "Encounter") {
cellMiddleEnemy.innerText = encounter.CurrentZoneName;
} else {
cellMiddleEnemy.innerText = encounter.title;
}
cellMiddleEnemy.classList.add('enemyHeader');
cellMiddleEnemy.classList.add('colorRed');
cellMiddle.appendChild(cellMiddleItem);
cellMiddle.appendChild(cellMiddleValue);
cellMiddle.appendChild(cellMiddleEnemy);
// DPS情報
var cellBottom = document.createElement('div');
cellBottom.id = "headerDps";
cellBottom.classList.add('cellHeaderBottom');
cellBottom.classList.add('colorYellow');
var cellBottomItem1 = document.createElement('span');
cellBottomItem1.innerText = "DPS:";
cellBottomItem1.classList.add('titleHeader');
var cellBottomItem2 = document.createElement('span');
//cellBottomItem2.innerText = "L60D:";
cellBottomItem2.classList.add('titleHeader');
cellBottomItem2.classList.add('floatRight');
//cellBottomItem2.classList.add('marginLeft');
if (isActive) {
if (parseInt(encounter.ENCDPS) < parseInt(encounter.Last60DPS) + 1) {
cellBottomItem2.innerText = "↑";
cellBottomItem2.classList.add('colorGreen');
} else {
cellBottomItem2.innerText = "↓";
cellBottomItem2.classList.add('colorRed');
}
}
var cellBottomValue1 = document.createElement('span');
cellBottomValue1.innerText = encounter.ENCDPS;
cellBottomValue1.classList.add('dpsHeader');
cellBottomValue1.classList.add('floatRight');
cellBottomValue1.classList.add('num');
if (isActive) {
cellBottomValue1.classList.add('colorGold');
}
//var cellBottomValue2 = document.createElement('span');
//cellBottomValue2.innerText = encounter.Last60DPS;
//cellBottomValue2.classList.add('dpsHeader');
//cellBottomValue2.classList.add('floatRight');
//cellBottomValue2.classList.add('num');
cellBottom.appendChild(cellBottomItem1);
//cellBottom.appendChild(cellBottomValue2);
cellBottom.appendChild(cellBottomItem2);
cellBottom.appendChild(cellBottomValue1);
// DPS情報サブ
var cellBottomSub = document.createElement('div');
cellBottomSub.id = "headerDpsSub";
cellBottomSub.classList.add('cellHeaderBottomSub');
cellBottomSub.classList.add('colorYellow');
cellBottomSub.classList.add('tggoleVisible');
var cellBottomSubItem1 = document.createElement('span');
cellBottomSubItem1.innerText = "DRA:";
cellBottomSubItem1.classList.add('titleHeader');
var cellBottomSubValue1 = document.createElement('span');
cellBottomSubValue1.innerText = encounter.dpsav.toFixed(0);
cellBottomSubValue1.classList.add('num');
var cellBottomSubItem2 = document.createElement('span');
cellBottomSubItem2.innerText = "T:";
cellBottomSubItem2.classList.add('titleHeader');
cellBottomSubItem2.classList.add('marginLeft');
var cellBottomSubValue2 = document.createElement('span');
cellBottomSubValue2.innerText = (encounter.dpsav * dpsAveTank / 100).toFixed(0) + "↑";
cellBottomSubValue2.classList.add('num');
var cellBottomSubItem3 = document.createElement('span');
cellBottomSubItem3.innerText = "H:";
cellBottomSubItem3.classList.add('titleHeader');
cellBottomSubItem3.classList.add('marginLeft');
var cellBottomSubValue3 = document.createElement('span');
cellBottomSubValue3.innerText = (encounter.dpsav * dpsAveHealer / 100).toFixed(0) + "↑";
cellBottomSubValue3.classList.add('num');
var cellBottomSubItem4 = document.createElement('span');
cellBottomSubItem4.innerText = "D:";
cellBottomSubItem4.classList.add('titleHeader');
cellBottomSubItem4.classList.add('marginLeft');
var cellBottomSubValue4 = document.createElement('span');
cellBottomSubValue4.innerText = (encounter.dpsav * cDpsLower / 100).toFixed(0) + "↓";
cellBottomSubValue4.classList.add('num');
cellBottomSub.appendChild(cellBottomSubItem1);
cellBottomSub.appendChild(cellBottomSubValue1);
cellBottomSub.appendChild(cellBottomSubItem2);
cellBottomSub.appendChild(cellBottomSubValue2);
cellBottomSub.appendChild(cellBottomSubItem3);
cellBottomSub.appendChild(cellBottomSubValue3);
cellBottomSub.appendChild(cellBottomSubItem4);
cellBottomSub.appendChild(cellBottomSubValue4);
// 結合する
cell.appendChild(cellTop);
cell.appendChild(cellMiddle);
cell.appendChild(cellBottom);
cell.appendChild(cellBottomSub);
return cell;
}
function writeJobCell(combatant) {
var cell = document.createElement('div');
cell.classList.add('cellJob');
// ジョブ表示モード
if (jobMode == 2) {
cell.innerHTML = "<img src='./jobicon/" + combatant.exJob + ".png' width='25' height='25'>";
} else {
if (tanJob[combatant.exJob] !== null) {
cell.innerText = tanJob[combatant.exJob];
} else {
cell.innerText = "-";
}
cell.classList.add('tankan');
cell.classList.add('colorYellow');
}
// ジョブ表示領域の背景色
if (dpsRole.indexOf(combatant.exJob) > -1){
cell.classList.add('cellJobDps');
} else if (tankRole.indexOf(combatant.exJob) > -1){
cell.classList.add('cellJobTank');
} else if (healerRole.indexOf(combatant.exJob) > -1){
cell.classList.add('cellJobHealer');
} else {
cell.classList.add('cellJobPet');
}
return cell;
}
function writeNameCell(combatant, isActive, index, dpsav, duration) {
var cell = document.createElement('div');
cell.classList.add('cell');
/* 名前 */
var name = document.createElement('div');
name.id = combatant.name;
name.innerHTML = combatant.exName;
name.classList.add('name');
name.classList.add('colorBlue');
name.setAttribute('onClick', 'nameCopy(this)');
var nameSub = document.createElement('div');
nameSub.innerText = combatant.exNameFarce;
nameSub.classList.add('nameSub');
nameSub.classList.add('colorBlue');
nameSub.classList.add('tggoleVisible');
// YOUの色を変更
if (combatant.exName == "YOU") {
name.classList.add('you');
} else if (combatant.exName.charAt(0) == "'") {
name.innerText = combatant.exName.slice(1);
name.classList.add('you');
}
if (combatant.exNameFarce.charAt(0) == "'") {
nameSub.innerText = combatant.exNameFarce.slice(1);
nameSub.classList.add('you');
}
/* DPS */
var dps = document.createElement('span');
dps.innerText = combatant.ENCDPS;
dps.classList.add('dps');
dps.classList.add('floatRight');
dps.classList.add('num');
dps.classList.add('colorBlue');
var dpsSub = document.createElement('span');
dpsSub.innerText = combatant.damage;
dpsSub.classList.add('dpsSub');
dpsSub.classList.add('floatRight');
dpsSub.classList.add('num');
dpsSub.classList.add('colorBlue');
dpsSub.classList.add('tggoleVisible');
// ペット合算表示
if (ownerPlus[combatant.name] == "flag" || ownerPlusL60[combatant.name] == "flag"){
var dpsPlus = document.createElement('span');
dpsPlus.innerText = "+";
dpsPlus.classList.add('plus');
dpsPlus.classList.add('floatLeft');
dps.appendChild(dpsPlus);
var dpsPlusSub = document.createElement('span');
dpsPlusSub.innerText = "+";
dpsPlusSub.classList.add('plus');
dpsPlusSub.classList.add('floatLeft');
dpsSub.appendChild(dpsPlusSub);
ownerPlus[combatant.name] = 0;
ownerPlusL60[combatant.name] = 0;
ownerDmg[combatant.name] = 0;
}
// 平均値を元に指定した条件でDPS色変化
if (dpsav > 0) {
/* DRAの指定値%以下で色変化 */
// DPS用
if ((duration >= cDuration && combatant.ENCDPS < dpsav * 0.75) && dpsRole.indexOf(combatant.exJob) > -1) {
dps.classList.add('colorRed');
}
// タンク&ヒーラー用
if (duration >= cDuration &&
((combatant.ENCDPS >= dpsav * dpsAveTank / 100 && tankRole.indexOf(combatant.Job) > -1) ||
(combatant.ENCDPS >= dpsav * dpsAveHealer / 100 && healerRole.indexOf(combatant.Job) > -1))) {
dps.classList.add('colorPurple');
}
// 共通
if (duration >= cDuration && combatant.ENCDPS >= dpsav * cDpsUpper / 100 ) {
dps.classList.add('colorGold');
}
}
/* バー内の値 */
var ex = document.createElement('span');
var exNum = document.createElement('span');
ex.classList.add('ex');
ex.classList.add('colorYellow');
exNum.classList.add('num');
exNum.classList.add('colorBlue');
exNum.classList.add('floatRight');
/* DPSバー */
var bar = document.createElement('span');
bar.classList.add('bar');
var barMax = 0;
var barMin = 0;
var barMinValue = 0;
var leftColor = "";
var rightColor = "";
var barSize = 100;
if (healerRole.indexOf(combatant.exJob) > -1 && healerBar == 2) {
// HPSバー
barMax = combatant.enchps;
if (combatant.OverHealPct === undefined) {
ex.innerText = "Unknown";
barMinValue = 0;
exNum.innerText = "";
} else {
ex.innerText = "tHPS:";
barMinValue = parseInt(barMax) - (parseInt(barMax) * (parseInt(combatant.OverHealPct.slice(0, -1)) / 100));
exNum.innerText = barMinValue.toFixed(0);
}
leftColor = "rgba(50,205,50,0.5)";
rightColor = "rgba(173,255,47,0.25)";
barMin = (parseInt(barMinValue) / parseInt(barMax));
barSize = (parseInt(barMax) * 100 / parseInt(hpsMax));
} else {
// DPSバー
if (parseInt(combatant.ENCDPS) > parseInt(combatant.Last60DPS)) {
// DPSが下降線の時にLast60DPS範囲の色を変える
barMax = combatant.ENCDPS;
barMinValue = combatant.Last60DPS;
if (tankRole.indexOf(combatant.exJob) > -1) {
// タンクロールのバー色
leftColor = "rgba(65,105,225,0.5)";
rightColor = "rgba(65,105,225,0.5)";
} else if (healerRole.indexOf(combatant.exJob) > -1) {
// ヒーラーロールのバー色
leftColor = "rgba(50,205,50,0.5)";
rightColor = "rgba(50,205,50,0.5)";
} else {
// DPSロールのバー色
leftColor = "rgba(220,20,60,0.5)";
rightColor = "rgba(220,20,60,0.5)";
}
} else {
barMax = combatant.Last60DPS;
barMinValue = combatant.ENCDPS;
if (tankRole.indexOf(combatant.exJob) > -1) {
// タンクロールのバー色
leftColor = "rgba(65,105,225,0.5)";
rightColor = "rgba(255,215,0,0.25)";
} else if (healerRole.indexOf(combatant.exJob) > -1) {
// ヒーラーロールのバー色
leftColor = "rgba(50,205,50,0.5)";
rightColor = "rgba(255,215,0,0.25)";
} else {
// DPSロールのバー色
leftColor = "rgba(220,20,60,0.5)";
rightColor = "rgba(255,215,0,0.25)";
}
}
barMin = (parseInt(barMinValue) / parseInt(barMax));
if (combatant.exJob == "LtB") {
ex.innerText = "Special Move";
exNum.innerText = "";
} else {
ex.innerText = "L60D:";
exNum.innerText = combatant.Last60DPS;
}
// 非アクティブ時は境界線を作らない
if (!isActive) {
barMax = combatant.ENCDPS;
if (tankRole.indexOf(combatant.exJob) > -1) {
leftColor = "rgba(65,105,225,0.5)";
rightColor = "rgba(65,105,225,0.5)";
} else if (healerRole.indexOf(combatant.exJob) > -1) {
leftColor = "rgba(50,205,50,0.5)";
rightColor = "rgba(50,205,50,0.5)";
} else {
leftColor = "rgba(220,20,60,0.5)";
rightColor = "rgba(220,20,60,0.5)";
}
ex.innerText = "";
exNum.innerText = "";
if (parseInt(combatant.Last60DPS) > parseInt(combatant.ENCDPS)) {
barMin = 1;
}
}
barSize = (parseInt(barMax) * 100 / parseInt(dpsMax));
}
bar.style.background = "-webkit-gradient(linear, left top,right top, color-stop(" + barMin + "," + leftColor + "), color-stop(" + barMin + "," + rightColor + "))";
bar.style.width = barSize + "%";
// L60Dや実HPSの位置を調整
var positionLeft = 100 * (barSize / 100 * barMin);
if (barSize <= 30 && combatant.exJob == "LtB") {
ex.style.left = barSize + "%";
} else if (healerRole.indexOf(combatant.exJob) == -1 && barSize > exPosition && positionLeft <= exPosition){
ex.style.left = "0%";
} else if (positionLeft >= exPosition) {
ex.style.left = positionLeft - exPosition + "%";
} else if ((barSize - positionLeft) > exPosition) {
ex.style.left = positionLeft + "%";
} else {
ex.style.left = barSize + "%";
}
/* DPS表示横のミス&デス表示 */
var opTop = document.createElement('div');
var opUnder = document.createElement('div');
opTop.classList.add('nameOpTop');
opUnder.classList.add('nameOpUnder');
opTop.classList.add('opClasses');
opUnder.classList.add('opClasses');
var opItem1 = document.createElement('span');
var opValue1 = document.createElement('span');
var opItem2 = document.createElement('span');
var opValue2 = document.createElement('span');
opItem1.classList.add('colorYellow');
opValue1.classList.add('num');
opValue1.classList.add('colorRed');
opItem2.classList.add('colorYellow');
opValue2.classList.add('num');
opValue2.classList.add('colorRed');
if (combatant.misses > 0) {
opItem1.innerHTML = "M.";
opValue1.innerHTML = combatant.misses;
}
if (combatant.deaths > 0) {
opItem2.innerHTML = "D.";
opValue2.innerHTML = combatant.deaths;
}
opTop.appendChild(opItem1);
opTop.appendChild(opValue1);
opUnder.appendChild(opItem2);
opUnder.appendChild(opValue2);
if (opItem == 1) {
opTop.classList.add('tggoleVisible');
opUnder.classList.add('tggoleVisible');
}
// 結合
ex.appendChild(exNum);
cell.appendChild(name);
cell.appendChild(nameSub);
cell.appendChild(dps);
cell.appendChild(dpsSub);
cell.appendChild(bar);
cell.appendChild(ex);
cell.appendChild(opTop);
cell.appendChild(opUnder);
return cell;
}
function writeOpCell(combatant) {
var displayMode = 0;
var toggleIcon = document.getElementById('toggle1');
if (toggleIcon.classList.contains('colorGreen')) {
displayMode = 1;
toggleIcon.classList.add('colorGreen');
}
var cell = document.createElement('div');
cell.classList.add('cell');
cell.classList.add('cellOp');
cell.classList.add('colorYellow');
// 項目
var top = document.createElement('div');
var under = document.createElement('div');
top.innerText = "Miss";
under.innerText = "Dead";
top.classList.add('cellOpTop');
under.classList.add('cellOpUnder');
top.classList.add('opClasses');
under.classList.add('opClasses');
// 値
var topValue = document.createElement('span');
var underValue = document.createElement('span');
topValue.innerText = combatant.misses;
underValue.innerText = combatant.deaths;
topValue.classList.add('floatRight');
underValue.classList.add('floatRight');
topValue.classList.add('numMissDeath');
underValue.classList.add('numMissDeath');
if (combatant.misses === '0') {
topValue.classList.add('num');
topValue.classList.add('colorBlue');
} else {
topValue.classList.add('num');
topValue.classList.add('colorRed');
}
if (combatant.deaths === '0') {
underValue.classList.add('num');
underValue.classList.add('colorBlue');
} else {
underValue.classList.add('num');
underValue.classList.add('colorRed');
}
// サブ項目
var topSub = document.createElement('div');
var underSub = document.createElement('div');
topSub.innerText = "Swg";
underSub.innerText = "Crt";
topSub.classList.add('cellOpTopSub');
underSub.classList.add('cellOpUnderSub');
topSub.classList.add('opClasses');
underSub.classList.add('opClasses');
// サブ値
var topValueSub = document.createElement('span');
var underValueSub = document.createElement('span');
topValueSub.innerText = combatant.swings;
underValueSub.innerText = combatant["crithit%"].slice(0, -1);
topValueSub.classList.add('num');
underValueSub.classList.add('num');
topValueSub.classList.add('colorBlue');
underValueSub.classList.add('colorBlue');
topValueSub.classList.add('floatRight');
underValueSub.classList.add('floatRight');
// クリティカルの%
var criPercent = document.createElement('span');
criPercent.classList.add('percent');
criPercent.classList.add('colorYellow');
criPercent.classList.add('floatRight');
criPercent.innerText = "%";
underValueSub.appendChild(criPercent);
if (opItem == 1) {
topSub.classList.add('tggoleVisible');
underSub.classList.add('tggoleVisible');
} else {
top.classList.add('tggoleVisible');
under.classList.add('tggoleVisible');
}
// 結合
top.appendChild(topValue);
under.appendChild(underValue);
topSub.appendChild(topValueSub);
underSub.appendChild(underValueSub);
cell.appendChild(top);
cell.appendChild(under);
cell.appendChild(topSub);
cell.appendChild(underSub);
return cell;
}
// JobOrNameとペットの省略表示を作成
function createJobAndName(combatant) {
if (combatant.Job === "") {
var owner = combatant.name.match(/[(](.+)[)]/);
if (owner !== null) {
for (var i=0; i<youNameList.length; i++) {
if (youNameList[i] == owner[1]) {
combatant.ownerName = "YOU";
break;
}
}
if (combatant.ownerName != "YOU") {
combatant.ownerName = owner[1];
}
} else {
combatant.ownerName = "";
}
if (combatant.name.indexOf("ガルーダ・エギ") === 0 || combatant.name.indexOf("Garuda-Egi") === 0) {
combatant.exJob = "Gar";
} else if (combatant.name.indexOf("イフリート・エギ") === 0 || combatant.name.indexOf("Ifrit-Egi") === 0) {
combatant.exJob = "Ifr";
} else if (combatant.name.indexOf("タイタン・エギ") === 0 || combatant.name.indexOf("Titan-Egi") === 0) {
combatant.exJob = "Tit";
} else if (combatant.name.indexOf("フェアリー・エオス") === 0 || combatant.name.indexOf("Eos") === 0) {
combatant.exJob = "Eos";
} else if (combatant.name.indexOf("フェアリー・セレネ") === 0 || combatant.name.indexOf("Selene") === 0) {
combatant.exJob = "Sle";
} else if (combatant.name.indexOf("カーバンクル・エメラルド") === 0 || combatant.name.indexOf("Emerald Carbuncle") === 0) {
combatant.exJob = "Eme";
} else if (combatant.name.indexOf("カーバンクル・トパーズ") === 0 || combatant.name.indexOf("Topaz Carbuncle") === 0) {
combatant.exJob = "Tpz";
} else if (combatant.name.indexOf("オートタレット・ルーク") === 0 || combatant.name.indexOf("Rook Autoturret") === 0) {
combatant.exJob = "Atr";
} else if (combatant.name.indexOf("オートタレット・ビショップ") === 0 || combatant.name.indexOf("Bishop Autoturret") === 0) {
combatant.exJob = "Atb";
} else if (combatant.name.indexOf("Limit Break") === 0) {
combatant.exJob = "LtB";
} else if (owner !== null && !combatant.name.match(/[^a-zA-Z()'\s]/)) {
combatant.exJob = "Cho";
} else {
combatant.exJob = "Err";
}
} else {
combatant.exJob = combatant.Job;
combatant.ownerName = "";
}
return combatant;
}
// オプション表示切り替え
function toggleOp() {
opModeFlg = 1 - opModeFlg;
var value = document.getElementsByClassName('opClasses');
for(var i = 0, j = value.length; i < j; i++) {
value[i].classList.toggle('tggoleVisible');
}
var toggleIcon = document.getElementById('toggle1');
toggleIcon.classList.toggle('colorGreen');
}
// DPS表示切り替え
function toggleDps() {
dpsModeFlg = 1 - dpsModeFlg;
var value = document.getElementById('headerDps');
if (value !== null) {
var valueSub = document.getElementById('headerDpsSub');
value.classList.toggle('tggoleVisible');
valueSub.classList.toggle('tggoleVisible');
}
var toggleIcon = document.getElementById('toggle2');
toggleIcon.classList.toggle('colorGreen');
}
// ダメージ表示切り替え
function toggleDmg() {
dmgModeFlg = 1 - dmgModeFlg;
var valueDps = document.getElementsByClassName('Dps');
var valueDpsSub = document.getElementsByClassName('DpsSub');
for(var i = 0, j = valueDps.length; i < j; i++) {
valueDps[i].classList.toggle('tggoleVisible');
valueDpsSub[i].classList.toggle('tggoleVisible');
}
var toggleIcon = document.getElementById('toggle7');
toggleIcon.classList.toggle('colorGreen');
}
// 名前表示切り替え
function toggleName() {
nameModeFlg = 1 - nameModeFlg;
var valueName = document.getElementsByClassName('name');
var valueNameSub = document.getElementsByClassName('nameSub');
var valueNameYou = document.getElementsByClassName('name you');
for(var i = 0, j = valueName.length; i < j; i++) {
valueName[i].classList.toggle('tggoleVisible');
}
valueNameYou[0].classList.remove('tggoleVisible');
var toggleIcon = document.getElementById('toggle3');
toggleIcon.classList.toggle('colorGreen');
}
// 茶番表示切り替え
function toggleFarce() {
farceModeFlg = 1 - farceModeFlg;
var valueName = document.getElementsByClassName('name');
var valueNameSub = document.getElementsByClassName('nameSub');
for(var i = 0, j = valueName.length; i < j; i++) {
valueName[i].classList.toggle('tggoleVisible');
valueNameSub[i].classList.toggle('tggoleVisible');
}
var toggleIcon = document.getElementById('toggle4');
toggleIcon.classList.toggle('colorGreen');
}
// ロール表示切り替え
function toggleRole() {
roleModeFlg = 1 - roleModeFlg;
var valueRole = document.getElementsByClassName('dpsBlock');
if (valueRole[1] !== undefined) {
for(var i = 1, j = valueRole.length; i < j; i++) {
valueRole[i].classList.toggle('tggoleDisplay');
}
}
var valueYou = document.getElementById('youTag');
if(valueYou !== null){
valueYou.classList.remove('tggoleDisplay');
}
var toggleIcon = document.getElementById('toggle5');
toggleIcon.classList.toggle('colorGreen');
}
// 時間停止切り替え表示切り替え
function toggleTime() {
var toggleIcon = document.getElementById('toggle6');
if (toggleIcon.classList.contains('colorGreen')) {
toggleIcon.classList.add('colorRed');
toggleIcon.classList.remove('colorGreen');
timeModeFlg = 1;
} else if (toggleIcon.classList.contains('colorRed')) {
toggleIcon.classList.add('colorGreen');
toggleIcon.classList.remove('colorRed');
timeModeFlg = 0;
} else {
timeModeFlg = 0;
}
}
// 名前を元にロドストの検索ページをコピーする
function nameCopy(name) {
var fullName = name.id.match(/(.+)\s(.+)/);
var byOwner = name.id.match(/\(.+\)$/);
if (fullName && !byOwner){
var url = "http://jp.finalfantasyxiv.com/lodestone/character/?q=" + fullName[1] + "+" + fullName[2] + "&worldname=&classjob=&race_tribe=&order=";
var tableBox = document.getElementById('table_box');
var nameBox = document.getElementById(name.id);
var copyArea = document.createElement('textarea');
copyArea.innerText = url;
tableBox.appendChild(copyArea);
copyArea.select();
document.execCommand("copy");
tableBox.removeChild(copyArea);
nameBox.classList.add('copy');
setTimeout( function() {
nameBox.classList.remove('copy');
}, 1000 );
}
}
// 省略Xorshift(一応xyzも定義)
xors = {
x: 123456789,
y: 362436069,
z: 521288629,
w: 88675123
};
xors.seed = function(s) {
xors.w = s;
};
xors.rand = function() {
var w;
for (var i=0; i<5; i++) {
var v = xors.x ^ (xors.x << 11);
w = (xors.w ^ (xors.w >> 19)) ^ (v ^ (v >> 8));
}
return w % 0x1000 / 0x1000;
};
// 名前と場所を適当な数字へ変換
function to_seed_num(name, zone) {
var n = 1;
var z = 1;
var m = [];
var o = "";
var DD = new Date();
for (var i=0, len=name.length ; i<len; i++) {
m[i] = name.charCodeAt(i);
n *= m[i];
}
for (var j=0; j<5; j++) {
o = n.toString();
o = Number( o.substr(2, 10));
n = Math.round(Math.pow(o,3) / m[j]*2);
}
n = n.toString();
return Number( n.substr(2, 8) * (z + DD.getFullYear() + DD.getMonth() + DD.getDate() + DD.getDay()));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment