-
-
Save anonymous/b342e04728ecf8ab857ef9dcdf8c3797 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*============================= | |
各種定義 | |
=============================*/ | |
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