Merge branch 'master' into skillParser

# Conflicts:
#	languages/icon-en.css
#	script-universal_function.js
#	script.js
#	style.css
This commit is contained in:
枫谷剑仙 2021-03-17 15:56:05 +08:00
commit 1eed1cfadc
27 changed files with 2183 additions and 897 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 492 KiB

After

Width:  |  Height:  |  Size: 511 KiB

BIN
images/icon-76board.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 847 B

BIN
images/icon-add-combo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
images/icon-inflicts.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
images/icon-no-skyfall.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
images/icon-poison.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@ -255,6 +255,9 @@
.control-box .btn-show-mon-skill-cd-lbl::after{
content:"❄Show full skill's cooldown";
}
.control-box .btn-show-mon-awoken-lbl::after{
content:"👁Show card awoken";
}
.control-box .btn-show-awoken-count-lbl::after{
content:"⚔Show awoken count and ability";
}
@ -268,6 +271,43 @@
content: " sec";
}
.dialog-hp-detail .dialog-title::before
{
content: "HP Range Reduction Details";
}
.hp-range-table .hp-range th::before
{
content: "HP Range";
}
.hp-range-table .reduce-scale .reduce-probability:before
{
content: "Odds ";
}
.hp-range-table caption::before
{
content: "All Attribute Enemy";
}
.hp-range-table[data-attr="0"] caption::before
{
content: "Fire Attribute Enemy";
}
.hp-range-table[data-attr="1"] caption::before
{
content: "Water Attribute Enemy";
}
.hp-range-table[data-attr="2"] caption::before
{
content: "Wood Attribute Enemy";
}
.hp-range-table[data-attr="3"] caption::before
{
content: "Light Attribute Enemy";
}
.hp-range-table[data-attr="4"] caption::before
{
content: "Dark Attribute Enemy";
}
.setting-box .row-mon-id .open-search::before{
content: "Simple Search";
}

View File

@ -22,12 +22,10 @@
}
.tIf-total-hp .awoken-bind::before,
.tIf-total-move .awoken-bind::before
.tIf-total-move .awoken-bind::before,
.tIf-total-hp .reduce .reduce-scale::before
{
background-position-x: -16px;
}
.tIf-total-hp .reduce::before{
background-position-x: -16px;
background-position-x: -20px;
}
.icon-skill[data-icon-type="mass-attack"] {
background-position-x: calc(-36px * 1);

View File

@ -247,6 +247,9 @@
.control-box .btn-show-mon-skill-cd-lbl::after{
content:"❄️フル スキル クールを表示";
}
.control-box .btn-show-mon-awoken-lbl::after{
content:"👁カードの覚醒を表示します";
}
.control-box .btn-show-awoken-count-lbl::after{
content:"⚔️総覚醒と能力値の表示";
}
@ -260,6 +263,43 @@
content: " 秒";
}
.dialog-hp-detail .dialog-title::before
{
content: "HP 範囲減傷の詳細";
}
.hp-range-table .hp-range th::before
{
content: "HP 範囲";
}
.hp-range-table .reduce-scale .reduce-probability:before
{
content: "確率 ";
}
.hp-range-table caption::before
{
content: "すべての属性の敵";
}
.hp-range-table[data-attr="0"] caption::before
{
content: "火属性の敵";
}
.hp-range-table[data-attr="1"] caption::before
{
content: "水属性の敵";
}
.hp-range-table[data-attr="2"] caption::before
{
content: "木属性の敵";
}
.hp-range-table[data-attr="3"] caption::before
{
content: "光属性の敵";
}
.hp-range-table[data-attr="4"] caption::before
{
content: "暗属性の敵";
}
.setting-box .row-mon-id .open-search::before{
content: "簡単な検索";
}

View File

@ -244,6 +244,9 @@
.control-box .btn-show-mon-skill-cd-lbl::after{
content:"❄️전체 스킬 쿨을 표시";
}
.control-box .btn-show-mon-awoken-lbl::after{
content:"👁카드 각성을 표시합니다";
}
.control-box .btn-show-awoken-count-lbl::after{
content:"⚔️각성 통계 및 기능 값 표시";
}
@ -257,6 +260,43 @@
content: " 초";
}
.dialog-hp-detail .dialog-title::before
{
content: "HP 범위 손상 감소 세부 정보";
}
.hp-range-table .hp-range th::before
{
content: "HP 범위";
}
.hp-range-table .reduce-scale .reduce-probability:before
{
content: "확률 ";
}
.hp-range-table caption::before
{
content: "모든 속성의 적";
}
.hp-range-table[data-attr="0"] caption::before
{
content: "화재 속성의 적";
}
.hp-range-table[data-attr="1"] caption::before
{
content: "물 속성의 적";
}
.hp-range-table[data-attr="2"] caption::before
{
content: "나무 속성의 적";
}
.hp-range-table[data-attr="3"] caption::before
{
content: "빛의 속성의 적";
}
.hp-range-table[data-attr="4"] caption::before
{
content: "숨겨진 속성의 적";
}
.setting-box .row-mon-id .open-search::before{
content: "간단한 검색";
}

View File

@ -48,310 +48,290 @@ const localTranslating = {
}
//大数字缩短长度
Number.prototype.bigNumberToString = function()
{
let numTemp = this.valueOf();
if (!numTemp) return "0";
const grouping = Math.pow(10, 4);
const unit = ['','万','亿','兆','京','垓'];
const numParts = [];
do{
numParts.push(numTemp % grouping);
numTemp = Math.floor(numTemp / grouping);
}while(numTemp>0 && numParts.length<(unit.length-1))
if (numTemp>0)
{
numParts.push(numTemp);
}
let numPartsStr = numParts.map((num,idx)=>{
if (num > 0)
{
return (num < 1e3 ? "零" : "") + num.toLocaleString() + unit[idx];
}else
return "零";
});
Number.prototype.bigNumberToString = function() {
let numTemp = this.valueOf();
if (!numTemp) return "0";
const grouping = Math.pow(10, 4);
const unit = ['', '万', '亿', '兆', '京', '垓'];
const numParts = [];
do {
numParts.push(numTemp % grouping);
numTemp = Math.floor(numTemp / grouping);
} while (numTemp > 0 && numParts.length < (unit.length - 1))
if (numTemp > 0) {
numParts.push(numTemp);
}
let numPartsStr = numParts.map((num, idx) => {
if (num > 0) {
return (num < 1e3 ? "零" : "") + num + unit[idx];
} else
return "零";
});
numPartsStr.reverse(); //反向
let outStr = numPartsStr.join("");
outStr = outStr.replace(/(^零+|零+$)/g,''); //去除开头的零
outStr = outStr.replace(/零{2,}/g,'零'); //去除多个连续的零
return outStr;
numPartsStr.reverse(); //反向
let outStr = numPartsStr.join("");
outStr = outStr.replace(/(^零+|零+$)/g, ''); //去除开头的零
outStr = outStr.replace(/零{2,}/g, '零'); //去除多个连续的零
return outStr;
}
//查找原先完整技能
function findFullSkill(subSkill){
const parentSkill = Skills.find(ss=>(ss.type === 116 || ss.type === 118 || ss.type === 138) && ss.params.includes(subSkill.id)) || subSkill;
const aCard = Cards.find(card=>card.activeSkillId == parentSkill.id || card.leaderSkillId == parentSkill.id);
return {skill:parentSkill,card:aCard};
function findFullSkill(subSkill) {
const parentSkill = Skills.find(ss => (ss.type === 116 || ss.type === 118 || ss.type === 138) && ss.params.includes(subSkill.id)) || subSkill;
const aCard = Cards.find(card => card.activeSkillId == parentSkill.id || card.leaderSkillId == parentSkill.id);
return { skill: parentSkill, card: aCard };
}
//document.querySelector(".edit-box .row-mon-id .m-id").type = "number";
//console.table(Skills.filter(s=>{const sk = s.params; return s.type == 156;}).map(findFullSkill));
/*
var result = Skills.filter(s=>{const sk = s.params; return [130,131].includes(s.type);}).map(findFullSkill);
showSearch(result.map(o=>o.card).filter(c=>c));
console.table(result);
*/
//返回flag里值为true的数组如[1,4,7]
function flags(num){
/*
return Array.from(new Array(32),(i,n)=>n).filter(n => num & (1 << n)); //性能太差
return new Array(32).fill(null).map((i,n)=>n).filter(n => num & (1 << n)); //性能比上者好,但还是不够快
*/
const arr = [];
for (let i = 0; i<32;i++)
{
if (num & (1<<i))
{
arr.push(i);
}
}
return arr;
function flags(num) {
/*
return Array.from(new Array(32),(i,n)=>n).filter(n => num & (1 << n)); //性能太差
return new Array(32).fill(null).map((i,n)=>n).filter(n => num & (1 << n)); //性能比上者好,但还是不够快
*/
const arr = [];
for (let i = 0; i < 32; i++) {
if (num & (1 << i)) {
arr.push(i);
}
}
return arr;
}
//按住Ctrl点击技能在控制台输出技能的对象
function fastShowSkill(event)
{
if (event.ctrlKey)
{
const skillId = parseInt(this.getAttribute("data-skillid"), 10);
console.log(Skills[skillId]);
}
function fastShowSkill(event) {
if (event.ctrlKey) {
const skillId = parseInt(this.getAttribute("data-skillid"), 10);
console.log(Skills[skillId]);
}
}
//技能介绍里的头像的切换
function changeToIdInSkillDetail(event)
{
const settingBox = editBox.querySelector(".setting-box");
const monstersID = settingBox.querySelector(".row-mon-id .m-id");
const mid = this.getAttribute("data-cardid");
monstersID.value = mid;
monstersID.onchange();
return false; //取消链接的默认操作
function changeToIdInSkillDetail(event) {
const settingBox = editBox.querySelector(".setting-box");
const monstersID = settingBox.querySelector(".row-mon-id .m-id");
const mid = this.getAttribute("data-cardid");
monstersID.value = mid;
monstersID.onchange();
return false; //取消链接的默认操作
}
//insertAdjacentHTML 可以只增加部分 HTML
//高级技能解释
function parseSkillDescription(skill)
{
const id = skill.id;
let fragment = document.createDocumentFragment(); //创建节点用的临时空间
if (id == 0) return fragment;
const type = skill.type;
const sk = skill.params;
//珠子名和属性名数组
const attrsName = ["火","水","木","光","暗","回复","废","毒","剧毒","炸弹"];
//类型名数组
const typeName = ["进化","平衡","体力","回复","龙","神","攻击","恶魔","机械","特别保护","10","11","觉醒","13","强化","卖钱"];
//觉醒名数组
const awokenName = ["HP+","攻击+","回复+","火盾","水盾","木盾","光盾","暗盾","自回","防封","防暗","防废","防毒","火+","水+","木+","光+","暗+","手指","心解","SB","火横","水横","木横","光横","暗横","U","SX","心+","协力","龙杀","神杀","恶魔杀","机杀","平衡杀","攻击杀","体力杀","回复杀","进化杀","觉醒杀","强化杀","卖钱杀","7c","5色破防","心追","全体 HP ","全体回复","破无效","武器觉醒","方块心追","5色溜","大防封","大手指","防云","防封条","大SB","满血强化","下半血强化","L盾","L解锁","10c","c珠","语音","奖励增加"," HP -","攻击-","回复-","大防暗","大防废","大防毒","掉废","掉毒","2串火","2串水","2串木","2串光","2串暗"];
const ClumsN = ["左边第1竖列","左边第2竖列","左边第3竖列","右边第3竖列","右边第2竖列","右边第1竖列"];
const RowsN = ["最上1横行","上方第2横行","下方第3横行","下方第2横行","最下1横行"];
//返回属性名
function attrN(i){return attrsName[i || 0] || ("未知属性" + i);}
//返回类型名
function typeN(i){return typeName[i || 0] || ("未知类型" + i);}
//返回觉醒名
function awokenN(i){return awokenName[(i || 0)-1] || ("未知觉醒" + i);}
//从二进制的数字中获得有哪些内容
function getNamesFromBinary(num,dataArr)
{ /*num2N21N0
如果num和2的N次方同时存在某位1则返回这个数逻辑上转换为true
filter就可以返回所有有这个数的数据*/
/*num10465=>111010001
二进制数从低位到高位表示火水木光暗
用逻辑运算AND序号来获得有没有这个值*/
var results = dataArr.filter(function(pn,pi){
return num & Math.pow(2,pi); //Math.pow(x,y)计算以x为底的y次方值
});
return results;
}
const nb = getNamesFromBinary; //化简名称
function parseSkillDescription(skill) {
const id = skill.id;
let fragment = document.createDocumentFragment(); //创建节点用的临时空间
if (id == 0) return fragment;
const type = skill.type;
const sk = skill.params;
function getAttrTypeString(attrsArray = [],typesArray = [])
{
let outArr = [];
if (attrsArray && attrsArray.indexOf(0)>=0 &&
attrsArray.indexOf(1)>=0 &&
attrsArray.indexOf(2)>=0 &&
attrsArray.indexOf(3)>=0 &&
attrsArray.indexOf(4)>=0)
{
return "所有属性";
}
if (attrsArray && attrsArray.length)
{
outArr.push(attrsArray.map(attrN).join("、") + "属性");
}
if (typesArray && typesArray.length)
{
outArr.push(typesArray.map(typeN).join("、") + "类型");
}
return outArr.join("和");
}
function getOrbsAttrString(orbFlag,isOr = false)
{
let outStr = ``;
if ((orbFlag & 1023) == 1023) //1023-1111111111
{ //单纯5色
outStr += '任何';
}else if (orbFlag == 31) //31-11111
{ //单纯5色
outStr += '5色';
}else if((orbFlag & 31) == 31)
{ //5色加其他色
outStr += `5色+${nb(orbFlag ^ 31, attrsName).join(isOr?"或":"、")}`;
}else
{
outStr += `${nb(orbFlag, attrsName).join(isOr?"或":"、")}`;
}
return outStr;
}
function stats(value, statTypes)
{
return [
statTypes.indexOf(1) >= 0 ? value : 100, //攻击
statTypes.indexOf(2) >= 0 ? value : 100 //回复
];
}
const mulName = ["HP","攻击力","回复力"];
//获取固定的三维成长的名称
function getFixedHpAtkRcvString(values)
{
let mulArr = null;
if (Array.isArray(values)) {
mulArr = [
1,
values[0] / 100,
values[1] / 100,
];
} else
{
mulArr = [
(values.hp || 100) / 100,
(values.atk || 100) / 100,
(values.rcv || 100) / 100
];
}
const hasMul = mulArr.filter(m=>m != 1); //不是1的数值
let str = "";
if (hasMul.length>0)
{
const hasDiff = hasMul.filter(m=>m != hasMul[0]).length > 0; //存在不一样的值
if (hasDiff)
{
str += mulArr.map((m,i)=>(m>0 && m!=1)?(mulName[i]+(m>=1?`×${m}`:`变为${m*100}%`)):null).filter(s=>s!=null).join("");
}else
{
let hasMulName = mulName.filter((n,i)=>mulArr[i] != 1);
if (hasMulName.length>=3)
{
str+=hasMulName.slice(0,hasMulName.length-1).join("、") + "和" + hasMulName[hasMulName.length-1];
}else
{
str+=hasMulName.join("和");
}
str += hasMul[0]>=1?`×${hasMul[0]}`:`变为${hasMul[0]*100}%`;
}
}else
{
str += "能力值没有变化";
}
return str;
}
const mul = getFixedHpAtkRcvString;
//技能介绍里的头像的切换
function createBoard(boardData)
{
const table = document.createElement("table");
table.className = "board fixed-shape-orb";
//console.table(boardData);
boardData.forEach((rowData,ri,rArr) => {
const row = table.insertRow();
if (ri == 2 && rArr.length > 5) row.classList.add("board-row4");
//珠子名和属性名数组
const attrsName = ["火", "水", "木", "光", "暗", "回复", "废", "毒", "剧毒", "炸弹"];
//类型名数组
const typeName = ["进化", "平衡", "体力", "回复", "龙", "神", "攻击", "恶魔", "机械", "特别保护", "10", "11", "觉醒", "13", "强化", "卖钱"];
//觉醒名数组
const awokenName = ["HP+", "攻击+", "回复+", "火盾", "水盾", "木盾", "光盾", "暗盾", "自回", "防封", "防暗", "防废", "防毒", "火+", "水+", "木+", "光+", "暗+", "手指", "心解", "SB", "火横", "水横", "木横", "光横", "暗横", "U", "SX", "心+", "协力", "龙杀", "神杀", "恶魔杀", "机杀", "平衡杀", "攻击杀", "体力杀", "回复杀", "进化杀", "觉醒杀", "强化杀", "卖钱杀", "7c", "5色破防", "心追", "全体 HP ", "全体回复", "破无效", "武器觉醒", "方块心追", "5色溜", "大防封", "大手指", "防云", "防封条", "大SB", "满血强化", "下半血强化", "L盾", "L解锁", "10c", "c珠", "语音", "奖励增加", " HP -", "攻击-", "回复-", "大防暗", "大防废", "大防毒", "掉废", "掉毒", "2串火", "2串水", "2串木", "2串光", "2串暗"];
const ClumsN = ["左边第1竖列", "左边第2竖列", "左边第3竖列", "右边第3竖列", "右边第2竖列", "右边第1竖列"];
const RowsN = ["最上1横行", "上方第2横行", "下方第3横行", "下方第2横行", "最下1横行"];
//返回属性名
function attrN(i) { return attrsName[i || 0] || ("未知属性" + i); }
//返回类型名
function typeN(i) { return typeName[i || 0] || ("未知类型" + i); }
//返回觉醒名
function awokenN(i) { return awokenName[(i || 0) - 1] || ("未知觉醒" + i); }
//从二进制的数字中获得有哪些内容
function getNamesFromBinary(num, dataArr) {
/*num2N21N0
如果num和2的N次方同时存在某位1则返回这个数逻辑上转换为true
filter就可以返回所有有这个数的数据*/
/*num10465=>111010001
二进制数从低位到高位表示火水木光暗
用逻辑运算AND序号来获得有没有这个值*/
var results = dataArr.filter(function(pn, pi) {
return num & Math.pow(2, pi); //Math.pow(x,y)计算以x为底的y次方值
});
return results;
}
rowData.forEach((orbType,ci,cArr)=>{
const cell = row.insertCell();
cell.className = "orb-icon";
if (orbType != null)
{
cell.setAttribute("data-orb-icon", orbType);
}
if (ci == 3 && cArr.length > 6) cell.classList.add("board-cell5");
});
});
table.onclick = function(){
this.classList.toggle("board-76");
};
return table;
}
const nb = getNamesFromBinary; //化简名称
function boardData_fixed(dataArr,orbType)
{
const data = dataArr.map(flag=>new Array(6).fill(null).map((a,i)=> (1<<i & flag) ? (orbType || 0) : null));
data.splice(3,0,data[2].concat()); //将第2行复制插入为第3行
data.forEach(rowData =>
rowData.splice(4,0,rowData[3]) //将第3个复制插入为第4个
);
return data;
}
function boardData_line(data)
{
data.splice(3,0,data[2].concat()); //将第2行复制插入为第3行
data.forEach(row=>row.splice(3,0,null)); //插入全空为第4个
return data;
}
function boardData_row(data)
{
data.splice(2,0,new Array(6).fill(null)); //插入全空为第3行
data.forEach(row=>row.splice(4,0,row[3])); //将第3个复制插入为第4个
return data;
}
function getAttrTypeString(attrsArray = [], typesArray = []) {
let outArr = [];
if (attrsArray && attrsArray.indexOf(0) >= 0 &&
attrsArray.indexOf(1) >= 0 &&
attrsArray.indexOf(2) >= 0 &&
attrsArray.indexOf(3) >= 0 &&
attrsArray.indexOf(4) >= 0) {
return "所有属性";
}
if (attrsArray && attrsArray.length) {
outArr.push(attrsArray.map(attrN).join("、") + "属性");
}
if (typesArray && typesArray.length) {
outArr.push(typesArray.map(typeN).join("、") + "类型");
}
return outArr.join("和");
}
let str = null;
let strArr = null,fullColor = null,atSameTime = null,hasDiffOrbs = null;
switch(type)
{
case 0:
str = `对敌方全体造成自身攻击力×${sk[1]/100}倍的${attrN(sk[0])}属性伤害`;
break;
case 1:
str = `对敌方全体造成${sk[1].bigNumberToString()}${attrN(sk[0])}属性伤害`;
break;
case 2:
str = `对敌方1体造成自身攻击力×${sk[0]/100}${sk[1]&&sk[1]!=sk[0]?'~'+sk[1]/100:''}倍的自身属性伤害`;
break;
case 3:
str = `${sk[0]}回合内,受到的伤害减少${sk[1]}%`;
break;
case 4:
str = `使敌方全体中毒,每回合损失宠物自身攻击力×${sk[0]/100}倍的 HP `;
break;
case 5:
str = `${sk[0]}秒内时间停止,可以任意移动宝珠`;
break;
case 6:
str = `敌人的 HP 减少${sk[0]}%`;
break;
case 7:
str = `回复宠物自身回复力×${sk[0]/100}倍的 HP`;
break;
case 8:
str = `回复${sk[0]} HP `;
break;
case 9:
str = `${attrN(sk[0])}宝珠变为${attrN(sk[1])}宝珠`;
break;
case 10:
str = `全版刷新`;
break;
case 11:
str = `${attrN(sk[0])}属性宠物的攻击力×${sk[1]/100}`;
break;
case 12:
str = `消除宝珠的回合,以自身攻击力×${sk[0]/100}倍的伤害追打敌人`;
break;
case 13:
str = `消除宝珠的回合,回复自身回复力×${sk[0]/100}倍的 HP `;
break;
case 14:
str = `如当前 HP 在 HP 上限的${sk[0]}%以上的话,受到单一次致命攻击时,${sk[1]<100?`${sk[1]}的几率`:"将"}会以1点 HP 生还`;
function getOrbsAttrString(orbFlag, isOr = false) {
let outStr = ``;
if ((orbFlag & 1023) == 1023) //1023-1111111111
{ //单纯5色
outStr += '任何';
} else if (orbFlag == 31) //31-11111
{ //单纯5色
outStr += '5色';
} else if ((orbFlag & 31) == 31) { //5色加其他色
outStr += `5色+${nb(orbFlag ^ 31, attrsName).join(isOr?"或":"、")}`;
} else {
outStr += `${nb(orbFlag, attrsName).join(isOr?"或":"、")}`;
}
return outStr;
}
function stats(value, statTypes) {
return [
statTypes.indexOf(1) >= 0 ? value : 100, //攻击
statTypes.indexOf(2) >= 0 ? value : 100 //回复
];
}
const mulName = ["HP", "攻击力", "回复力"];
//获取固定的三维成长的名称
function getFixedHpAtkRcvString(values) {
let mulArr = null;
if (Array.isArray(values)) {
mulArr = [
1,
values[0] / 100,
values[1] / 100,
];
} else {
mulArr = [
(values.hp || 100) / 100,
(values.atk || 100) / 100,
(values.rcv || 100) / 100
];
}
const hasMul = mulArr.filter(m => m != 1); //不是1的数值
let str = "";
if (hasMul.length > 0) {
const hasDiff = hasMul.filter(m => m != hasMul[0]).length > 0; //存在不一样的值
if (hasDiff) {
str += mulArr.map((m, i) => (m > 0 && m != 1) ? (mulName[i] + (m >= 1 ? `×${m}` : `变为${m*100}%`)) : null).filter(s => s != null).join("");
} else {
let hasMulName = mulName.filter((n, i) => mulArr[i] != 1);
if (hasMulName.length >= 3) {
str += hasMulName.slice(0, hasMulName.length - 1).join("、") + "和" + hasMulName[hasMulName.length - 1];
} else {
str += hasMulName.join("和");
}
str += hasMul[0] >= 1 ? `×${hasMul[0]}` : `变为${hasMul[0]*100}%`;
}
} else {
str += "能力值没有变化";
}
return str;
}
const mul = getFixedHpAtkRcvString;
//技能介绍里的头像的切换
function createBoard(boardData) {
const table = document.createElement("table");
table.className = "board fixed-shape-orb";
//console.table(boardData);
boardData.forEach((rowData, ri, rArr) => {
const row = table.insertRow();
if (ri == 2 && rArr.length > 5) row.classList.add("board-row4");
rowData.forEach((orbType, ci, cArr) => {
const cell = row.insertCell();
cell.className = "orb-icon";
if (orbType != null) {
cell.setAttribute("data-orb-icon", orbType);
}
if (ci == 3 && cArr.length > 6) cell.classList.add("board-cell5");
});
});
table.onclick = function() {
this.classList.toggle("board-76");
};
return table;
}
function boardData_fixed(dataArr, orbType) {
const data = dataArr.map(flag => new Array(6).fill(null).map((a, i) => (1 << i & flag) ? (orbType || 0) : null));
data.splice(3, 0, data[2].concat()); //将第2行复制插入为第3行
data.forEach(rowData =>
rowData.splice(4, 0, rowData[3]) //将第3个复制插入为第4个
);
return data;
}
function boardData_line(data) {
data.splice(3, 0, data[2].concat()); //将第2行复制插入为第3行
data.forEach(row => row.splice(3, 0, null)); //插入全空为第4个
return data;
}
function boardData_row(data) {
data.splice(2, 0, new Array(6).fill(null)); //插入全空为第3行
data.forEach(row => row.splice(4, 0, row[3])); //将第3个复制插入为第4个
return data;
}
let str = null;
let strArr = null,
fullColor = null,
atSameTime = null,
hasDiffOrbs = null;
switch (type) {
case 0:
str = `对敌方全体造成自身攻击力×${sk[1]/100}倍的${attrN(sk[0])}属性伤害`;
break;
case 1:
str = `对敌方全体造成${sk[1].bigNumberToString()}${attrN(sk[0])}属性伤害`;
break;
case 2:
str = `对敌方1体造成自身攻击力×${sk[0]/100}${sk[1]&&sk[1]!=sk[0]?'~'+sk[1]/100:''}倍的自身属性伤害`;
break;
case 3:
str = `${sk[0]}回合内,受到的伤害减少${sk[1]}%`;
break;
case 4:
str = `使敌方全体中毒,每回合损失宠物自身攻击力×${sk[0]/100}倍的 HP `;
break;
case 5:
str = `${sk[0]}秒内时间停止,可以任意移动宝珠`;
break;
case 6:
str = `敌人的 HP 减少${sk[0]}%`;
break;
case 7:
str = `回复宠物自身回复力×${sk[0]/100}倍的 HP`;
break;
case 8:
str = `回复${sk[0]} HP `;
break;
case 9:
str = `${attrN(sk[0])}宝珠变为${attrN(sk[1])}宝珠`;
break;
case 10:
str = `全版刷新`;
break;
case 11:
str = `${attrN(sk[0])}属性宠物的攻击力×${sk[1]/100}`;
break;
case 12:
str = `消除宝珠的回合,以自身攻击力×${sk[0]/100}倍的伤害追打敌人`;
break;
case 13:
str = `消除宝珠的回合,回复自身回复力×${sk[0]/100}倍的 HP `;
break;
case 14:
str = `如当前 HP 在 HP 上限的${sk[0]}%以上的话,受到单一次致命攻击时,${sk[1]<100?`${sk[1]}的几率`:"将"}会以1点 HP 生还`;
break;
case 15:
str = `操作时间${sk[0]>0?`延长`:`减少`}${Math.abs(sk[0]/100)}`;
@ -519,12 +499,49 @@ function parseSkillDescription(skill)
break;
case 71:
//这个类型,所有颜色是直接显示的,但是最后一位有个-1表示结束
strArr = sk;
if (sk.includes(-1))
let attrArr = sk.includes(-1) ? sk.slice(0,sk.indexOf(-1)) : sk;
strArr = [];
strArr.push(`全画面的宝珠变成${attrArr.map(o=>attrN(o)).join("、")}`);
const rowC = 5, columC = 6;
let valueArray = new Uint8Array(rowC * columC);
window.crypto.getRandomValues(valueArray); //获取符合密码学要求的安全的随机值
valueArray = Array.from(valueArray.map(x => attrArr[x % attrArr.length])); //用所有宝珠填充
//之后用每种颜色填充前3个
attrArr.forEach((attr,idx)=>{
valueArray.fill(attr, idx * 3, idx * 3 + 3);
});
//将上方数据重新乱序排列
let dataArray = [];
while(valueArray.length > 0)
{
strArr = sk.slice(0,sk.indexOf(-1));
dataArray.push(valueArray.splice(Math.randomInteger(valueArray.length - 1),1));
}
str = "全画面的宝珠变成" + strArr.map(o=>attrN(o)).join("、");
//创建版面数据,依次填入
var data = new Array(5).fill(null).map(()=>new Array(6).fill(null));
let da = dataArray.entries();
for (let ri=0;ri<rowC;ri++)
{
for (let ci=0;ci<columC;ci++)
{
let v = da.next().value;
if (v == undefined)
{
atrr = attrArr.entries();
v = atrr.next().value;
}
data[ri][ci] = v[1];
}
}
data = boardData_row(data);
fragment.appendChild(document.createTextNode(strArr.join("")));
var table = createBoard(data);
fragment.appendChild(table);
return fragment;
break;
case 73:
str = `${getAttrTypeString([sk[0]],[sk[1]])}宠物的${getFixedHpAtkRcvString({hp:sk[2],atk:sk[2]})}`;

View File

@ -250,6 +250,9 @@
.control-box .btn-show-mon-skill-cd-lbl::after{
content:"❄️顯示已滿技能冷卻";
}
.control-box .btn-show-mon-awoken-lbl::after{
content:"👁顯示卡片覺醒";
}
.control-box .btn-show-awoken-count-lbl::after{
content:"⚔️顯示覺醒統計和能力值";
}
@ -263,6 +266,43 @@
content: " 秒";
}
.dialog-hp-detail .dialog-title::before
{
content: "HP 階段減傷詳情";
}
.hp-range-table .hp-range th::before
{
content: "HP 範圍";
}
.hp-range-table .reduce-scale .reduce-probability:before
{
content: "幾率 ";
}
.hp-range-table caption::before
{
content: "全屬性敵人";
}
.hp-range-table[data-attr="0"] caption::before
{
content: "火屬性敵人";
}
.hp-range-table[data-attr="1"] caption::before
{
content: "水屬性敵人";
}
.hp-range-table[data-attr="2"] caption::before
{
content: "木屬性敵人";
}
.hp-range-table[data-attr="3"] caption::before
{
content: "光屬性敵人";
}
.hp-range-table[data-attr="4"] caption::before
{
content: "暗屬性敵人";
}
.setting-box .row-mon-id .open-search::before{
content: "簡易搜索";
}

View File

@ -249,6 +249,9 @@
.control-box .btn-show-mon-skill-cd-lbl::after{
content:"❄️显示已满技能冷却";
}
.control-box .btn-show-mon-awoken-lbl::after{
content:"👁显示卡片觉醒";
}
.control-box .btn-show-awoken-count-lbl::after{
content:"⚔️显示觉醒统计和能力值";
}
@ -262,6 +265,43 @@
content: " 秒";
}
.dialog-hp-detail .dialog-title::before
{
content: "HP 階段減傷詳情";
}
.hp-range-table .hp-range th::before
{
content: "HP 范围";
}
.hp-range-table .reduce-scale .reduce-probability:before
{
content: "几率 ";
}
.hp-range-table caption::before
{
content: "全属性敵人";
}
.hp-range-table[data-attr="0"] caption::before
{
content: "火属性敵人";
}
.hp-range-table[data-attr="1"] caption::before
{
content: "水属性敵人";
}
.hp-range-table[data-attr="2"] caption::before
{
content: "木属性敵人";
}
.hp-range-table[data-attr="3"] caption::before
{
content: "光属性敵人";
}
.hp-range-table[data-attr="4"] caption::before
{
content: "暗属性敵人";
}
.setting-box .row-mon-id .open-search::before{
content: "简易搜索";
}

View File

@ -1 +1 @@
[{"code":"ja","ckey":{"card":"56aa8093f01c096740c2561dcc2a1aa8","skill":"90e66ac2abd3cc1403097f525866017a"},"updateTime":1615452037445},{"code":"en","ckey":{"card":"54beee631776eb495753a65626804a6b","skill":"9a79c6dc157b11a9ef5cd0d453ae00ab"},"updateTime":1615452037445},{"code":"ko","ckey":{"card":"9327ddea61597f4c78f592a01e4e9f57","skill":"cebdcb32c4eede9bc07311480951a52f"},"updateTime":1615452037445}]
[{"code":"ja","ckey":{"card":"ff5fe66914f601505bd863da9ed47bdf","skill":"808d8ea31fa4806d7a9454ba65d5380c"},"updateTime":1615544553272},{"code":"en","ckey":{"card":"54beee631776eb495753a65626804a6b","skill":"9a79c6dc157b11a9ef5cd0d453ae00ab"},"updateTime":1615452037445},{"code":"ko","ckey":{"card":"9327ddea61597f4c78f592a01e4e9f57","skill":"cebdcb32c4eede9bc07311480951a52f"},"updateTime":1615452037445}]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -31,6 +31,8 @@ var formation = new Formation(teamsCount,5);
.show-team-name-right .team-total-info>div,
.show-team-name-left .team-total-info .team-awoken,
.show-team-name-left .team-total-info>div
.formation-total-info .tIf-effect,
.formation-total-info .tIf-total-hp
{
display: inline-block;
}
@ -39,6 +41,11 @@ var formation = new Formation(teamsCount,5);
{
display: none;
}
.show-team-name-left .team-menber-awoken,
.show-team-name-left .team-assist-awoken
{
padding-left: var(--head-block-width);
}
</style>
</head>
@ -60,8 +67,9 @@ var formation = new Formation(teamsCount,5);
<a class="help-link" target="_blank" href="https://github.com/Mapaler/PADDashFormation/blob/master/help.md"></a>
</div>
<div>
<input type="checkbox" class="config-checkbox-ipt" name="show-mon-id" id="show-mon-id" onclick="toggleDomClassName(this,'not-show-mon-id',false);" checked><label class="config-checkbox-lbl show-mon-id-lbl" for="show-mon-id"><div class="config-checkbox-lbl-cicle"></div></label>
<input type="checkbox" class="config-checkbox-ipt" name="btn-show-mon-skill-cd" id="btn-show-mon-skill-cd"><label class="config-checkbox-lbl btn-show-mon-skill-cd-lbl" for="btn-show-mon-skill-cd"><div class="config-checkbox-lbl-cicle"></div></label>
<input type="checkbox" class="config-checkbox-ipt" name="btn-show-mon-awoken" id="btn-show-mon-awoken"><label class="config-checkbox-lbl btn-show-mon-awoken-lbl" for="btn-show-mon-awoken"><div class="config-checkbox-lbl-cicle"></div></label>
<input type="checkbox" class="config-checkbox-ipt" name="show-mon-id" id="show-mon-id" onclick="toggleDomClassName(this,'not-show-mon-id',false);" checked><label class="config-checkbox-lbl show-mon-id-lbl" for="show-mon-id"><div class="config-checkbox-lbl-cicle"></div></label>
<input type="checkbox" class="config-checkbox-ipt" name="change-swap-to-copy" id="change-swap-to-copy"><label class="config-checkbox-lbl change-swap-to-copy-lbl" for="change-swap-to-copy"><div class="config-checkbox-lbl-cicle"></div></label>
</div>
<div class="status"><span class="icon"></span><span class="text"></span></div>
@ -72,7 +80,19 @@ var formation = new Formation(teamsCount,5);
<div class="tIf-total-hp">
<span class="general"></span>
<span class="awoken-bind"></span>
<span class="reduce"></span>
<span class="reduce">
<span class="reduce-scale"></span>
<span class="general"></span>
<span class="awoken-bind"></span>
<canvas height="20" width="100" class="reduce-details display-none"></canvas>
</span>
</div>
<div class="tIf-effect">
<icon class="_76board display-none"></icon>
<icon class="no-skyfall display-none"></icon>
<icon class="poison-no-effect display-none"></icon>
<icon class="add-combo display-none"></icon>
<icon class="inflicts display-none"></icon>
</div>
</div>
<ul class="teams">
@ -90,6 +110,50 @@ var formation = new Formation(teamsCount,5);
</ul>
</div>
</div>
<ul class="team-menber-awoken">
<li class="menber-awoken menber-awoken-1">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-2">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-3">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-4">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-5">
<ul class="awoken-ul">
</ul>
</li>
</ul>
<ul class="team-assist-awoken">
<li class="menber-awoken menber-awoken-1">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-2">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-3">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-4">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-5">
<ul class="awoken-ul">
</ul>
</li>
</ul>
<div class="team-box-name">
<div class="team-box">
<ul class="team-assist">
@ -462,6 +526,50 @@ var formation = new Formation(teamsCount,5);
</ul>
</div>
</div>
<ul class="team-menber-awoken">
<li class="menber-awoken menber-awoken-2">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-3">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-4">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-5">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-1">
<ul class="awoken-ul">
</ul>
</li>
</ul>
<ul class="team-assist-awoken">
<li class="menber-awoken menber-awoken-2">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-3">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-4">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-5">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-1">
<ul class="awoken-ul">
</ul>
</li>
</ul>
<div class="team-total-info">
<div class="tIf-total-move">
<span class="general"></span>
@ -490,6 +598,11 @@ var formation = new Formation(teamsCount,5);
</ul>
</div>
<div class="detail-box edit"><textarea class="detail" placeholder="输入说明"></textarea><div class="detail-display"></div></div>
<div class="dialog dialog-hp-detail display-none">
<div class="dialog-title"></div>
<div class="dialog-content"></div>
<div class="dialog-control"><button class="dialog-close brown-button"></button></div>
</div>
</div>
<div class="edit-box display-none">
<div class="edit-box-title"><!--修改怪物--></div>

File diff suppressed because it is too large Load Diff

457
script.js
View File

@ -607,6 +607,16 @@ window.onload = function(event) {
localStorage.setItem("PADDF-" + showMonSkillCd_id, this.checked ? 1 : 0);
};
btnShowMonSkillCd.onclick();
//记录显示觉醒开关的状态
const showMonAwoken_id = "show-mon-awoken";
const btnShowMonAwoken = controlBox.querySelector(`#btn-${showMonAwoken_id}`);
btnShowMonAwoken.checked = Boolean(parseInt(localStorage.getItem("PADDF-" + showMonAwoken_id)));
btnShowMonAwoken.onclick = function(){
toggleDomClassName(this, showMonAwoken_id);
localStorage.setItem("PADDF-" + showMonAwoken_id, this.checked ? 1 : 0);
};
btnShowMonAwoken.onclick();
toggleDomClassName(controlBox.querySelector("#btn-show-awoken-count"), 'not-show-awoken-count', false);
@ -1063,6 +1073,103 @@ function initialize() {
badges.forEach(badge => badge.onclick = setBadge);
});
//显示HP的详细值
const hpDetailDialog = formationBox.querySelector(".dialog-hp-detail");
hpDetailDialog.show = function(reduceAttrRanges, tHP, tHPNoAwoken)
{
const dialogContent = this.querySelector(".dialog-content");
const fragment = document.createDocumentFragment();
function insertHpRangeTable(reduceRanges, tHP, tHPNoAwoken, attr)
{
const table = document.createElement("table");
table.className = "hp-range-table";
table.setAttribute("data-attr", attr);
table.createCaption();
const tHead = table.createTHead();
const tBody = table.createTBody();
const rangeRow = tHead.insertRow();
rangeRow.className = "hp-range";
rangeRow.appendChild(document.createElement("th"));
const rageHpRow = tBody.insertRow();
rageHpRow.className = "general";
rageHpRow.appendChild(document.createElement("th"));
const rageHpNoAwokenRow = tBody.insertRow();
rageHpNoAwokenRow.className = "awoken-bind";
rageHpNoAwokenRow.appendChild(document.createElement("th"));
const reduceRow = tBody.insertRow();
reduceRow.className = "reduce-scale";
reduceRow.appendChild(document.createElement("th"));
const reduceHpRow = tBody.insertRow();
reduceHpRow.className = "reduce-general";
reduceHpRow.appendChild(document.createElement("th"));
const reduceHpNoAwokenRow = tBody.insertRow();
reduceHpNoAwokenRow.className = "reduce-awoken-bind";
reduceHpNoAwokenRow.appendChild(document.createElement("th"));
reduceRanges.forEach(range=>{
const hpRange = rangeRow.insertCell();
const hpRangeMin = hpRange.appendChild(document.createElement("span"));
hpRangeMin.className = "hp-range-min";
hpRangeMin.textContent = range.min;
hpRange.appendChild(document.createTextNode(" ~ "));
const hpRangeMax = hpRange.appendChild(document.createElement("span"));
hpRangeMax.className = "hp-range-max";
hpRangeMax.textContent = range.max;
const hpGeneral = rageHpRow.insertCell();
hpGeneral.textContent = `${Math.round(tHP * (range.min / 100))} ~ ${Math.round(tHP * (range.max/100))}`;
const hpAwokenBind = rageHpNoAwokenRow.insertCell();
hpAwokenBind.textContent = `${Math.round(tHPNoAwoken * (range.min / 100))} ~ ${Math.round(tHPNoAwoken * (range.max/100))}`;
const reduce = reduceRow.insertCell();
const reduceScale = reduce.appendChild(document.createElement("span"));
reduceScale.textContent = `${parseFloat((range.scale * 100).toFixed(2))}`;
if (range.probability < 1)
{
reduce.appendChild(document.createTextNode("("));
const reduceProb = reduce.appendChild(document.createElement("span"));
reduceProb.className = "reduce-probability";
reduceProb.textContent = `${(range.probability * 100).toFixed(0)}`;
reduce.appendChild(document.createTextNode(")"));
}
const reduceGeneral = reduceHpRow.insertCell();
reduceGeneral.textContent = `${Math.round(tHP * (range.min / 100) / (1 - range.scale))} ~ ${Math.round(tHP * (range.max/100) / (1 - range.scale))}`;
const reduceAwokenBind = reduceHpNoAwokenRow.insertCell();
reduceAwokenBind.textContent = `${Math.round(tHPNoAwoken * (range.min / 100) / (1 - range.scale))} ~ ${Math.round(tHPNoAwoken * (range.max/100) / (1 - range.scale))}`;
});
return table;
}
if (reduceAttrRanges.some(r=>r != reduceAttrRanges[0])) //有指定属性减伤
{
reduceAttrRanges.forEach((reduceRanges, ridx)=>fragment.appendChild(insertHpRangeTable(reduceRanges, tHP, tHPNoAwoken, ridx)));
}
else //只有阶梯盾
{
const reduceRanges = reduceAttrRanges[0];
fragment.appendChild(insertHpRangeTable(reduceRanges, tHP, tHPNoAwoken, 31));
}
dialogContent.innerHTML = "";
dialogContent.appendChild(fragment);
this.classList.remove(className_displayNone);
}
hpDetailDialog.close = function()
{
this.classList.add(className_displayNone);
}
const hpDetailDialog_Close = hpDetailDialog.querySelector(".dialog-close");
hpDetailDialog_Close.onclick = function(){hpDetailDialog.close();};
const reduceDetailsBars = Array.from(formationBox.querySelectorAll(".tIf-total-hp .reduce-details"));
reduceDetailsBars.forEach(bar => {
bar.onclick = function(){
hpDetailDialog.show(this.reduceAttrRanges, this.tHP, this.tHPNoAwoken);
};
});
//编辑框
editBox.mid = null; //储存怪物id
editBox.latent = []; //储存潜在觉醒
@ -1403,25 +1510,6 @@ function initialize() {
Math.max(thisValue,rangeHigh)
)
)).checked = true;
/*
if (rangeLow == rangeHigh)
{
if (thisValue == rangeLow)
{
s_rareLows.find(radio=>parseInt(radio.value,10) == 1).checked = true;
s_rareHighs.find(radio=>parseInt(radio.value,10) == 10).checked = true;
}else
{
s_rareLows.find(radio=>parseInt(radio.value,10) == Math.min(thisValue,rangeLow)).checked = true;
s_rareHighs.find(radio=>parseInt(radio.value,10) == Math.max(thisValue,rangeLow)).checked = true;
}
}else
{
console.log("恢复单选");
s_rareLows.find(radio=>parseInt(radio.value,10) == thisValue).checked = true;
s_rareHighs.find(radio=>parseInt(radio.value,10) == thisValue).checked = true;
}
*/
}
s_rareIcons.forEach(icon=>icon.onclick = s_rareIcons_onclick);
const s_rareClear = s_rareDiv.querySelector(".rare-clear");
@ -1493,11 +1581,11 @@ function initialize() {
const s_selectedAwokensUl = searchBox.querySelector(".selected-awokens");
function search_awokenAdd1() {
let count = parseInt(this.value || 0, 10);
let count = parseInt(this.getAttribute("data-awoken-count") || 0, 10);
const maxCount = parseInt(this.getAttribute("data-max-count") || 9, 10);
if (count < maxCount) {
count++;
this.setAttribute("value", count);
this.setAttribute("data-awoken-count", count);
const iconLi = document.createElement("li");
const icon = iconLi.appendChild(document.createElement("icon"))
@ -1510,16 +1598,13 @@ function initialize() {
function search_awokenSub1() {
const awokenId = this.getAttribute("data-awoken-icon");
const awokenIcon = s_awokensIcons.find(icon=>icon.getAttribute("data-awoken-icon") == awokenId);
let count = parseInt(awokenIcon.value || 0, 10);
let count = parseInt(awokenIcon.getAttribute("data-awoken-count") || 0, 10);
if (count > 0) {
count--;
awokenIcon.setAttribute("value", count);
awokenIcon.setAttribute("data-awoken-count", count);
}
this.parentNode.remove();
}
function search_awokenClear() {
this.setAttribute("value", 0);
}
s_awokensIcons.forEach(b => {
b.onclick = search_awokenAdd1; //每种觉醒增加1
});
@ -1528,7 +1613,7 @@ function initialize() {
const sawokenClear = searchBox.querySelector(".sawoken-clear");
awokenClear.onclick = function() { //清空觉醒选项
s_awokensIcons.forEach(t => {
t.setAttribute("value", 0);
t.setAttribute("data-awoken-count", 0);
});
s_selectedAwokensUl.innerHTML = "";
};
@ -1648,11 +1733,11 @@ function initialize() {
s_rareHighs.filter(returnCheckedInput).map(returnInputValue).map(Str2Int)[0],
];
const sawokensFilter = s_sawokens.filter(returnCheckedInput).map(returnInputValue).map(Str2Int);
const awokensFilter = s_awokensIcons.filter(btn => parseInt(btn.value, 10) > 0).map(btn => {
const awokensFilter = s_awokensIcons.filter(btn => parseInt(btn.getAttribute("data-awoken-count"), 10) > 0).map(btn => {
const awokenIndex = parseInt(btn.getAttribute("data-awoken-icon"), 10);
return {
id: awokenIndex,
num: parseInt(btn.value, 10)
num: parseInt(btn.getAttribute("data-awoken-count"), 10)
};
});
const searchResult = searchCards(cards,
@ -2020,7 +2105,7 @@ function initialize() {
teamData[editBox.memberIdx[1]][editBox.memberIdx[2]] = mon;
mon.id = parseInt(monstersID.value, 10);
mon.id = editBox.mid;
const card = Cards[mon.id] || Cards[0];
const skill = Skills[card.activeSkillId];
@ -2067,6 +2152,10 @@ function initialize() {
const formationTotalInfoDom = formationBox.querySelector(".formation-total-info"); //所有队伍能力值合计
if (formationTotalInfoDom) refreshFormationTotalHP(formationTotalInfoDom, formation.teams);
const teamMenberAwokenDom = teamBigBox.querySelector(".team-menber-awoken"); //队员觉醒
const teamAssistAwokenDom = teamBigBox.querySelector(".team-assist-awoken"); //辅助觉醒
if (teamMenberAwokenDom && teamAssistAwokenDom) refreshMenberAwoken(teamMenberAwokenDom, teamAssistAwokenDom, teamData, editBox.memberIdx[2]); //刷新本人觉醒
const teamAwokenDom = teamBigBox.querySelector(".team-awoken"); //队伍觉醒合计
if (teamAwokenDom) refreshTeamAwokenCount(teamAwokenDom, teamData);
const formationAwokenDom = formationBox.querySelector(".formation-awoken"); //所有队伍觉醒合计
@ -2102,6 +2191,10 @@ function initialize() {
const formationTotalInfoDom = formationBox.querySelector(".formation-total-info"); //所有队伍能力值合计
if (formationTotalInfoDom) refreshFormationTotalHP(formationTotalInfoDom, formation.teams);
const teamMenberAwokenDom = teamBigBox.querySelector(".team-menber-awoken"); //队员觉醒
const teamAssistAwokenDom = teamBigBox.querySelector(".team-assist-awoken"); //辅助觉醒
if (teamMenberAwokenDom && teamAssistAwokenDom) refreshMenberAwoken(teamMenberAwokenDom, teamAssistAwokenDom, teamData, editBox.memberIdx[2]); //刷新本人觉醒
const teamAwokenDom = teamBigBox.querySelector(".team-awoken"); //队伍觉醒合计
if (teamAwokenDom) refreshTeamAwokenCount(teamAwokenDom, teamData);
const formationAwokenDom = formationBox.querySelector(".formation-awoken"); //所有队伍觉醒合计
@ -2129,6 +2222,10 @@ function initialize() {
const formationTotalInfoDom = formationBox.querySelector(".formation-total-info"); //所有队伍能力值合计
if (formationTotalInfoDom) refreshFormationTotalHP(formationTotalInfoDom, formation.teams);
const teamMenberAwokenDom = teamBigBox.querySelector(".team-menber-awoken"); //队员觉醒
const teamAssistAwokenDom = teamBigBox.querySelector(".team-assist-awoken"); //辅助觉醒
if (teamMenberAwokenDom && teamAssistAwokenDom) refreshMenberAwoken(teamMenberAwokenDom, teamAssistAwokenDom, teamData, editBox.memberIdx[2]); //刷新本人觉醒
const teamAwokenDom = teamBigBox.querySelector(".team-awoken"); //队伍觉醒合计
if (teamAwokenDom) refreshTeamAwokenCount(teamAwokenDom, teamData);
const formationAwokenDom = formationBox.querySelector(".formation-awoken"); //所有队伍觉醒合计
@ -2869,6 +2966,8 @@ function refreshAll(formationData) {
const latentsDom = teamBox.querySelector(".team-latents");
const assistsDom = teamBox.querySelector(".team-assist");
const teamAbilityDom = teamBigBox.querySelector(".team-ability");
const teamMenberAwokenDom = teamBigBox.querySelector(".team-menber-awoken"); //队员觉醒
const teamAssistAwokenDom = teamBigBox.querySelector(".team-assist-awoken"); //辅助觉醒
for (let ti = 0, ti_len = membersDom.querySelectorAll(".member").length; ti < ti_len; ti++) {
const member = membersDom.querySelector(`.member-${ti+1} .monster`);
const latent = latentsDom.querySelector(`.latents-${ti+1} .latent-ul`);
@ -2877,6 +2976,7 @@ function refreshAll(formationData) {
changeid(teamData[1][ti], assist); //辅助
refreshMemberSkillCD(teamBox, teamData, ti); //技能CD
refreshAbility(teamAbilityDom, teamData, ti); //本人能力值
refreshMenberAwoken(teamMenberAwokenDom, teamAssistAwokenDom, teamData, ti); //本人觉醒
}
const teamTotalInfoDom = teamBigBox.querySelector(".team-total-info"); //队伍能力值合计
if (teamTotalInfoDom) refreshTeamTotalHP(teamTotalInfoDom, teamData, teamNum);
@ -2998,6 +3098,73 @@ function refreshAbility(abilityDom, team, idx) {
}
});
}
//刷新队员觉醒
function refreshMenberAwoken(menberAwokenDom, assistAwokenDom, team, idx) {
if (!menberAwokenDom) return; //如果没有dom直接跳过
const memberData = team[0][idx];
const assistData = team[1][idx];
//队员觉醒
let menberAwokens = Cards[memberData.id].awakenings.slice(0,memberData.awoken);
//单人和三人为队员增加超觉醒
if ((solo || teamsCount === 3) && memberData.sawoken >= 0) menberAwokens.push(Cards[memberData.id].superAwakenings[memberData.sawoken]);
//menberAwokens.sort();
//武器觉醒
let assistAwokens = Cards[assistData.id].awakenings.slice(0,assistData.awoken);
if (!assistAwokens.includes(49)) assistAwokens = []; //清空非武器的觉醒
//assistAwokens.sort();
/*if (assistAwokens.includes(49))
{
menberAwokens = menberAwokens.concat(assistAwokens);
}*/
const menberAwokenUl = menberAwokenDom.querySelector(`.menber-awoken-${idx + 1} .awoken-ul`);
const assistAwokenUl = assistAwokenDom.querySelector(`.menber-awoken-${idx + 1} .awoken-ul`);
/* //通用的
function countNum(arr) {
const map = arr.reduce(function(preMap, value){
return preMap.set(value, (preMap.get(value) || 0) + 1);
}, new Map());
return Array.from(map);
};*/
function countAwokenNum(arr) {
const map = arr.reduce(function(preMap, value){
const eak = equivalent_awoken.find(eako => eako.big === value);
if (eak)
{
return preMap.set(eak.small, (preMap.get(eak.small) || 0) + eak.times);
}else
{
return preMap.set(value, (preMap.get(value) || 0) + 1);
}
}, new Map());
return Array.from(map);
};
/*const hideAwokens = [49,1,2,3,63];
if (solo) hideAwokens.push(30); //协力觉醒
if (!solo) hideAwokens.push(63); //掉落觉醒
menberAwokens = menberAwokens.filter(ak=>!hideAwokens.includes(ak));*/
let menberAwokensCount = countAwokenNum(menberAwokens);
menberAwokenUl.innerHTML = '';
menberAwokensCount.forEach(akc=>{
const iconLi = document.createElement("li");
const icon = iconLi.appendChild(document.createElement("icon"))
icon.className = "awoken-icon";
icon.setAttribute("data-awoken-icon", akc[0]);
icon.setAttribute("data-awoken-count", akc[1]);
menberAwokenUl.appendChild(iconLi);
});
let assistAwokensCount = countAwokenNum(assistAwokens);
assistAwokenUl.innerHTML = '';
assistAwokensCount.forEach(akc=>{
const iconLi = document.createElement("li");
const icon = iconLi.appendChild(document.createElement("icon"))
icon.className = "awoken-icon";
icon.setAttribute("data-awoken-icon", akc[0]);
icon.setAttribute("data-awoken-count", akc[1]);
assistAwokenUl.appendChild(iconLi);
});
}
function setTextContentAndAttribute(dom,str)
{
@ -3006,13 +3173,49 @@ function setTextContentAndAttribute(dom,str)
dom.setAttribute(dataAttrName, str);
}
function drawHpInfo(hpBarDom, reduceAttrRanges)
{
const width = hpBarDom.width, height = hpBarDom.height;
let ctx = hpBarDom.getContext("2d");
if (reduceAttrRanges.some(r=>r != reduceAttrRanges[0])) //有指定属性减伤
{
const attrColors = ['crimson','cornflowerblue','green','goldenrod','purple'];
reduceAttrRanges.forEach((reduceRanges, ridx)=>{
//console.table(reduceRanges);
ctx.fillStyle = attrColors[ridx];
ctx.fillRect(0, height / 5 * ridx, width, height / 5 * (ridx + 1));
reduceRanges.forEach(range=>{
ctx.fillStyle = `rgba(0, 0, 0, 0.5)`;
ctx.fillRect(width * (range.min / 100), height / 5 * ridx, width * (range.max / 100), height / 5 * (1 - range.scale));
});
});
}
else //只有阶梯盾
{
const reduceRanges = reduceAttrRanges[0];
//创建线性颜色渐变对象
const canvasGradient = ctx.createLinearGradient(0, 0, 0, height);
canvasGradient.addColorStop(0, "#EE99AA");
canvasGradient.addColorStop(0.4, "#FFDDEE");
canvasGradient.addColorStop(1, "#EE9999");
ctx.fillStyle = canvasGradient;
ctx.fillRect(0, 0, width, height);
reduceRanges.forEach(range=>{
ctx.fillStyle = `rgba(204, 0 ,85, 0.7)`;
ctx.fillRect(width * (range.min / 100), 0, width * ((range.max - range.min) / 100), height * (1 - range.scale));
});
}
}
//刷新队伍能力值合计
function refreshTeamTotalHP(totalDom, team, teamIdx) {
//计算总的生命值
if (!totalDom) return;
const tHpDom = totalDom.querySelector(".tIf-total-hp");
const tRcvDom = totalDom.querySelector(".tIf-total-rcv");
const tMoveDom = totalDom.querySelector(".tIf-total-move");
const tEffectDom = totalDom.querySelector(".tIf-effect");
const teams = formation.teams;
@ -3020,9 +3223,24 @@ function refreshTeamTotalHP(totalDom, team, teamIdx) {
const leader2id = teamsCount===2 ? (teamIdx === 1 ? teams[0][0][0].id : teams[1][0][0].id) : team[0][5].id;
if (tHpDom) {
const reduceScale1 = getReduceScale(Skills[Cards[leader1id].leaderSkillId],true,true,true);
const reduceScale2 = getReduceScale(Skills[Cards[leader2id].leaderSkillId],true,true,true);
const totalReduce = 1 - (1 - reduceScale1) * (1 - reduceScale2);
const reduceScales1 = getReduceScales(leader1id);
const reduceScales2 = getReduceScales(leader2id);
const reduceAttrRanges = getReduceRange(reduceScales1.concat(reduceScales2));
//将所有范围平铺,然后选择盾最少那个作为基础盾值
const leastScale = reduceAttrRanges.flat().sort((a,b)=>a.scale-b.scale)[0];
const hpBar = totalDom.querySelector(".reduce-details");
if (reduceAttrRanges.some(r=>r != reduceAttrRanges[0]) || reduceAttrRanges[0].length > 1 || reduceAttrRanges[0][0].probability < 1) //有阶梯盾或者有指定属性减伤或者减伤比例不是100%
{
drawHpInfo(hpBar, reduceAttrRanges);
hpBar.classList.remove(className_displayNone);
}else
{
hpBar.classList.add(className_displayNone);
}
const totalReduce = leastScale.scale;
const teamHPArr = countTeamHp(team[0], leader1id, leader2id, solo);
const teamHPNoAwokenArr = countTeamHp(team[0], leader1id, leader2id, solo, true);
@ -3031,7 +3249,6 @@ function refreshTeamTotalHP(totalDom, team, teamIdx) {
let tHP = teamHPArr.reduce((pv, v) => pv + v); //队伍计算的总HP
let tHPNoAwoken = teamHPNoAwokenArr.reduce((pv, v) => pv + v); //队伍计算的总HP无觉醒
const teamHPAwoken = awokenCountInTeam(team, 46, solo, teamsCount); //全队大血包个数
let badgeHPScale = 1; //徽章倍率
@ -3044,18 +3261,27 @@ function refreshTeamTotalHP(totalDom, team, teamIdx) {
tHP = Math.round(Math.round(tHP * (1 + 0.05 * teamHPAwoken)) * badgeHPScale);
tHPNoAwoken = Math.round(Math.round(tHPNoAwoken) * badgeHPScale);
const tReduceHP = Math.round(tHP / (1 - reduceScale1) / (1 - reduceScale2)); //队伍正常满血加上盾能承受的最大伤害
const tReduceHPNoAwoken = Math.round(tHPNoAwoken / (1 - reduceScale1) / (1 - reduceScale2)); //队伍封觉醒满血加上盾能承受的最大伤害
//记录到bar中方便打开详情时调用
hpBar.reduceAttrRanges = reduceAttrRanges;
hpBar.tHP = tHP;
hpBar.tHPNoAwoken = tHPNoAwoken;
const tReduceHP = Math.round(tHP / (1 - totalReduce)); //队伍正常满血加上盾能承受的最大伤害
const tReduceHPNoAwoken = Math.round(tHPNoAwoken / (1 - totalReduce)); //队伍封觉醒满血加上盾能承受的最大伤害
const tHpDom_general = tHpDom.querySelector(".general");
const tHpDom_noAwoken = tHpDom.querySelector(".awoken-bind");
const tHpDom_reduce = tHpDom.querySelector(".reduce");
setTextContentAndAttribute(tHpDom_general, tHP);
setTextContentAndAttribute(tHpDom_noAwoken, tHPNoAwoken);
setTextContentAndAttribute(tHpDom_reduce, (totalReduce * 100).keepCounts());
tHpDom_reduce.setAttribute("data-max-equal-general", tReduceHP);
tHpDom_reduce.setAttribute("data-max-equal-awoken-bind", tReduceHPNoAwoken);
setTextContentAndAttribute(tHpDom_general, tHP.bigNumberToString());
setTextContentAndAttribute(tHpDom_noAwoken, tHPNoAwoken.bigNumberToString());
if (totalReduce > 0)
tHpDom_reduce.classList.remove("no-reduce");
else
tHpDom_reduce.classList.add("no-reduce");
setTextContentAndAttribute(tHpDom_reduce.querySelector(".reduce-scale"), (totalReduce * 100).toFixed(2));
setTextContentAndAttribute(tHpDom_reduce.querySelector(".general"), tReduceHP.bigNumberToString());
setTextContentAndAttribute(tHpDom_reduce.querySelector(".awoken-bind"), tReduceHPNoAwoken.bigNumberToString());
}
if (tMoveDom) {
@ -3075,22 +3301,85 @@ function refreshTeamTotalHP(totalDom, team, teamIdx) {
setTextContentAndAttribute(tMoveDom_noAwoken, (moveTime.duration.default + moveTime.duration.leader + moveTime.duration.badge).keepCounts());
}
}
if (tEffectDom) {
const _76board = tEffectDom.querySelector("._76board");
if (tIf_Effect_76board(leader1id,leader2id))
{
_76board.classList.remove(className_displayNone);
}else
{
_76board.classList.add(className_displayNone);
}
const noSkyfall = tEffectDom.querySelector(".no-skyfall");
if (tIf_Effect_noSkyfall(leader1id,leader2id))
{
noSkyfall.classList.remove(className_displayNone);
}else
{
noSkyfall.classList.add(className_displayNone);
}
const poisonNoEffect = tEffectDom.querySelector(".poison-no-effect");
if (tIf_Effect_poisonNoEffect(leader1id,leader2id))
{
poisonNoEffect.classList.remove(className_displayNone);
}else
{
poisonNoEffect.classList.add(className_displayNone);
}
const addCombo = tEffectDom.querySelector(".add-combo");
const addComboValue = tIf_Effect_addCombo(leader1id,leader2id);
if ((addComboValue[0] | addComboValue[1]) > 0)
{
addCombo.classList.remove(className_displayNone);
addCombo.setAttribute("data-add-combo", addComboValue.filter(v=>v).join("/"));
}else
{
addCombo.classList.add(className_displayNone);
}
const inflicts = tEffectDom.querySelector(".inflicts");
const inflictsValue = tIf_Effect_inflicts(leader1id,leader2id);
if ((inflictsValue[0] | inflictsValue[1]) > 0)
{
inflicts.classList.remove(className_displayNone);
inflicts.setAttribute("data-inflicts", inflictsValue.filter(v=>v).map(v=>v.bigNumberToString()).join("/"));
}else
{
inflicts.classList.add(className_displayNone);
}
}
}
//刷新所有队伍能力值合计
function refreshFormationTotalHP(totalDom, teams) {
//计算总的生命值
if (!totalDom) return;
const tHpDom = totalDom.querySelector(".tIf-total-hp");
const tRcvDom = totalDom.querySelector(".tIf-total-rcv");
const tEffectDom = totalDom.querySelector(".tIf-effect");
//因为目前仅用于2P所以直接在外面固定写了
const leader1id = teams[0][0][0].id;
const leader2id = teams[1][0][0].id;
if (tHpDom) {
//因为目前仅用于2P所以直接在外面固定写了
const leader1id = teams[0][0][0].id;
const leader2id = teams[1][0][0].id;
const reduceScale1 = getReduceScale(Skills[Cards[leader1id].leaderSkillId],true,true,true);
const reduceScale2 = getReduceScale(Skills[Cards[leader2id].leaderSkillId],true,true,true);
const totalReduce = 1 - (1 - reduceScale1) * (1 - reduceScale2);
const reduceScales1 = getReduceScales(leader1id);
const reduceScales2 = getReduceScales(leader2id);
const reduceAttrRanges = getReduceRange(reduceScales1.concat(reduceScales2));
//将所有范围平铺,然后选择盾最少那个作为基础盾值
const leastScale = reduceAttrRanges.flat().sort((a,b)=>a.scale-b.scale)[0];
const hpBar = totalDom.querySelector(".reduce-details");
if (reduceAttrRanges.some(r=>r != reduceAttrRanges[0]) || reduceAttrRanges[0].length > 1 || reduceAttrRanges[0][0].probability < 1) //有阶梯盾或者有指定属性减伤或者减伤比例不是100%
{
drawHpInfo(hpBar, reduceAttrRanges);
hpBar.classList.remove(className_displayNone);
}else
{
hpBar.classList.add(className_displayNone);
}
const totalReduce = leastScale.scale;
const tHPArr = teams.map(function(team) {
const teamHPArr = countTeamHp(team[0], leader1id, leader2id, solo);
@ -3110,18 +3399,74 @@ function refreshFormationTotalHP(totalDom, teams) {
const tHP = tHPArr.reduce((pv, v) => pv + v);
const tHPNoAwoken = tHPNoAwokenArr.reduce((pv, v) => pv + v);
const tReduceHP = Math.round(tHP / (1 - reduceScale1) / (1 - reduceScale2)); //队伍正常满血加上盾能承受的最大伤害
const tReduceHPNoAwoken = Math.round(tHPNoAwoken / (1 - reduceScale1) / (1 - reduceScale2)); //队伍封觉醒满血加上盾能承受的最大伤害
//记录到bar中方便打开详情时调用
hpBar.reduceAttrRanges = reduceAttrRanges;
hpBar.tHP = tHP;
hpBar.tHPNoAwoken = tHPNoAwoken;
const tReduceHP = Math.round(tHP / totalReduce); //队伍正常满血加上盾能承受的最大伤害
const tReduceHPNoAwoken = Math.round(tHPNoAwoken / totalReduce); //队伍封觉醒满血加上盾能承受的最大伤害
const tHpDom_general = tHpDom.querySelector(".general");
const tHpDom_noAwoken = tHpDom.querySelector(".awoken-bind");
const tHpDom_reduce = tHpDom.querySelector(".reduce");
setTextContentAndAttribute(tHpDom_general, tHP);
setTextContentAndAttribute(tHpDom_noAwoken, tHPNoAwoken);
setTextContentAndAttribute(tHpDom_reduce, (totalReduce * 100).keepCounts());
tHpDom_reduce.setAttribute("data-max-equal-general", tReduceHP);
tHpDom_reduce.setAttribute("data-max-equal-awoken-bind", tReduceHPNoAwoken);
setTextContentAndAttribute(tHpDom_general, tHP.bigNumberToString());
setTextContentAndAttribute(tHpDom_noAwoken, tHPNoAwoken.bigNumberToString());
if (totalReduce > 0)
tHpDom_reduce.classList.remove("no-reduce");
else
tHpDom_reduce.classList.add("no-reduce");
setTextContentAndAttribute(tHpDom_reduce.querySelector(".reduce-scale"), (totalReduce * 100).toFixed(2));
setTextContentAndAttribute(tHpDom_reduce.querySelector(".general"), tReduceHP.bigNumberToString());
setTextContentAndAttribute(tHpDom_reduce.querySelector(".awoken-bind"), tReduceHPNoAwoken.bigNumberToString());
}
if (tEffectDom) {
const _76board = tEffectDom.querySelector("._76board");
if (tIf_Effect_76board(leader1id,leader2id))
{
_76board.classList.remove(className_displayNone);
}else
{
_76board.classList.add(className_displayNone);
}
const noSkyfall = tEffectDom.querySelector(".no-skyfall");
if (tIf_Effect_noSkyfall(leader1id,leader2id))
{
noSkyfall.classList.remove(className_displayNone);
}else
{
noSkyfall.classList.add(className_displayNone);
}
const poisonNoEffect = tEffectDom.querySelector(".poison-no-effect");
if (tIf_Effect_poisonNoEffect(leader1id,leader2id))
{
poisonNoEffect.classList.remove(className_displayNone);
}else
{
poisonNoEffect.classList.add(className_displayNone);
}
const addCombo = tEffectDom.querySelector(".add-combo");
const addComboValue = tIf_Effect_addCombo(leader1id,leader2id);
if ((addComboValue[0] | addComboValue[1]) > 0)
{
addCombo.classList.remove(className_displayNone);
addCombo.setAttribute("data-add-combo", addComboValue.filter(v=>v).join("/"));
}else
{
addCombo.classList.add(className_displayNone);
}
const inflicts = tEffectDom.querySelector(".inflicts");
const inflictsValue = tIf_Effect_inflicts(leader1id,leader2id);
if ((inflictsValue[0] | inflictsValue[1]) > 0)
{
inflicts.classList.remove(className_displayNone);
inflicts.setAttribute("data-inflicts", inflictsValue.filter(v=>v).map(v=>v.bigNumberToString()).join("/"));
}else
{
inflicts.classList.add(className_displayNone);
}
}
}
//刷新单人技能CD

View File

@ -45,8 +45,9 @@ var formation = new Formation(teamsCount,6);
<a class="help-link" target="_blank" href="https://github.com/Mapaler/PADDashFormation/blob/master/help.md"></a>
</div>
<div>
<input type="checkbox" class="config-checkbox-ipt" name="show-mon-id" id="show-mon-id" onclick="toggleDomClassName(this,'not-show-mon-id',false);" checked><label class="config-checkbox-lbl show-mon-id-lbl" for="show-mon-id"><div class="config-checkbox-lbl-cicle"></div></label>
<input type="checkbox" class="config-checkbox-ipt" name="btn-show-mon-skill-cd" id="btn-show-mon-skill-cd"><label class="config-checkbox-lbl btn-show-mon-skill-cd-lbl" for="btn-show-mon-skill-cd"><div class="config-checkbox-lbl-cicle"></div></label>
<input type="checkbox" class="config-checkbox-ipt" name="btn-show-mon-awoken" id="btn-show-mon-awoken"><label class="config-checkbox-lbl btn-show-mon-awoken-lbl" for="btn-show-mon-awoken"><div class="config-checkbox-lbl-cicle"></div></label>
<input type="checkbox" class="config-checkbox-ipt" name="show-mon-id" id="show-mon-id" onclick="toggleDomClassName(this,'not-show-mon-id',false);" checked><label class="config-checkbox-lbl show-mon-id-lbl" for="show-mon-id"><div class="config-checkbox-lbl-cicle"></div></label>
<input type="checkbox" class="config-checkbox-ipt" name="change-swap-to-copy" id="change-swap-to-copy"><label class="config-checkbox-lbl change-swap-to-copy-lbl" for="change-swap-to-copy"><div class="config-checkbox-lbl-cicle"></div></label>
</div>
<div class="status"><span class="icon"></span><span class="text"></span></div>
@ -79,12 +80,24 @@ var formation = new Formation(teamsCount,6);
<div class="tIf-total-hp">
<span class="general"></span>
<span class="awoken-bind"></span>
<span class="reduce"></span>
<span class="reduce">
<span class="reduce-scale"></span>
<span class="general"></span>
<span class="awoken-bind"></span>
<canvas height="20" width="100" class="reduce-details display-none"></canvas>
</span>
</div>
<div class="tIf-total-move">
<span class="general"></span>
<span class="awoken-bind"></span>
</div>
<div class="tIf-effect">
<icon class="_76board display-none"></icon>
<icon class="no-skyfall display-none"></icon>
<icon class="poison-no-effect display-none"></icon>
<icon class="add-combo display-none"></icon>
<icon class="inflicts display-none"></icon>
</div>
</div>
</ul>
<div class="team-box-name">
@ -307,6 +320,58 @@ var formation = new Formation(teamsCount,6);
</ul>
</div>
</div>
<ul class="team-menber-awoken">
<li class="menber-awoken menber-awoken-1">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-2">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-3">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-4">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-5">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-6">
<ul class="awoken-ul">
</ul>
</li>
</ul>
<ul class="team-assist-awoken">
<li class="menber-awoken menber-awoken-1">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-2">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-3">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-4">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-5">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-6">
<ul class="awoken-ul">
</ul>
</li>
</ul>
<ul class="team-ability">
<li class="abilitys abilitys-1">
<div class="hp"></div><div class="atk"></div><div class="rcv"></div>
@ -413,6 +478,11 @@ var formation = new Formation(teamsCount,6);
</li>
</ul>
<div class="detail-box edit"><textarea class="detail" placeholder="输入说明"></textarea><div class="detail-display"></div></div>
<div class="dialog dialog-hp-detail display-none">
<div class="dialog-title"></div>
<div class="dialog-content"></div>
<div class="dialog-control"><button class="dialog-close brown-button"></button></div>
</div>
</div>
<div class="edit-box display-none">
<div class="edit-box-title"><!--修改怪物--></div>

437
style.css
View File

@ -184,6 +184,119 @@ ul{
min-width: 648px;
}
/*弹出窗口相关*/
.dialog
{
color: white;
position: absolute;
padding: 5px;
border: 2px ridge #D1D398;
top: 0;
background-image: linear-gradient(to bottom,#788321f0,#3E4D14f0);
border-radius: 6px;
box-shadow: black 2px 0px 1px,black 0px 2px 1px,black -2px 0px 1px,black 0px -2px 1px;
margin-left: calc(50% - 200px);
margin-top: 30px;
font-family: var(--game-font-family);
text-shadow: black 2px 2px 0;
}
.dialog .dialog-title
{
font-size: 20px;
line-height: 20px;
text-align: center;
margin-bottom: 5px;
}
.dialog .dialog-content .additional-string
{
border-top: 2px solid white;
margin-top: 5px;
}
/*.dialog .dialog-content .additional-string::before
{
content: "其他語言";
}*/
.dialog .dialog-control
{
text-align: center;
margin-top:10px;
}
.brown-button
{
background-image: linear-gradient(to bottom,#C38E5F,#2F2008);
border: none;
border-radius: 5px;
padding: 2px;
cursor: pointer;
transition: transform 0.1s;
}
.brown-button:active
{
transform: scale(1.1);
}
.brown-button::before
{
display: inline-block;
box-sizing: border-box;
width: 100px;
padding: 5px;
background-color: #956A42;
background-image: url(images/slate.svg);
background-size: 120px 120px;
border-radius: 2px;
font-size: 20px;
line-height: 20px;
vertical-align: middle;
color: white;
font-family: var(--game-font-family);
text-shadow: black 2px 2px 0;
}
/*
.dialog-search-string .dialog-title::before
{
content: "以字符串搜索";
}
.dialog-close::before
{
content: "关闭";
}
*/
.dialog-search-string
{
width: 260px;
}
.dialog-search-string .string-copy,
.dialog-search-string .string-search
{
box-sizing: border-box;
width: 45px;
margin-left: 5px;
cursor: pointer;
background-color: #994433;
border: 2px solid #FFCC88;
box-shadow: black 1px 0 1px,black -1px 0 1px,black 0 -1px 1px,black 0 3px 2px;
border-radius: 5px;
padding: 0;
}
.dialog-search-string .string-copy::before
{
content: "📋";
}
.dialog-search-string .string-search::before
{
content: "🔍";
}
.dialog-search-string .string-value
{
box-sizing: border-box;
width: calc(100% - 50px * 2);
}
.dialog-search-string .additional-string .string-value
{
box-sizing: border-box;
width: calc(100% - 50px * 1);
}
/*单个怪物*/
.monster{
font-family: var(--game-font-family);
@ -576,40 +689,128 @@ ul{
display: inline-block;
}
/*各种信息统计的图标*/
.tIf-total-hp::before,
.tIf-total-move::before,
.tIf-total-move,
.tIf-effect
{
display: inline-block;
}
.tIf-total-hp .general::before,
.tIf-total-hp .awoken-bind::before,
.tIf-total-hp .reduce .reduce-scale::before,
.tIf-total-hp .reduce .general::before,
.tIf-total-hp .reduce .awoken-bind::before,
.tIf-total-move .general::before,
.tIf-total-move .awoken-bind::before,
.tIf-total-move.fixed-move-time::after,
.tIf-total-hp .reduce::before
.tIf-effect icon::before,
icon.poison-no-effect::after,
.hp-range-table th::before
{
content: " ";
background-size: cover;
display: inline-block;
width: 16px;
height: 16px;
width: 20px;
height: 20px;
vertical-align: bottom;
}
.tIf-total-hp .awoken-bind::before,
.tIf-total-move .awoken-bind::before
.tIf-total-hp .reduce .awoken-bind::before,
.tIf-total-move .awoken-bind::before,
.hp-range-table .awoken-bind th::before,
.hp-range-table .reduce-awoken-bind th::before
{
background-image: url(images/icon-awoken-bind.png);
}
.tIf-total-hp::before{
.tIf-total-hp .general::before,
.tIf-total-hp .reduce .general::before,
.hp-range-table .general th::before,
.hp-range-table .reduce-general th::before
{
background-image: url(images/icon-HP.png);
}
.tIf-total-hp .reduce::before{
.tIf-total-hp .reduce .reduce-scale::before,
.hp-range-table .reduce-scale th::before
{
background-image: url(images/icon-reduce.png);
}
.tIf-total-hp .reduce::after{
.tIf-total-hp .reduce .reduce-scale::after{
content: "%⇔";
}
.tIf-total-hp .reduce.no-reduce .reduce-scale::after,
.hp-range-table .hp-range td span:after,
.hp-range-table .reduce-scale td span:after
{
content: "%";
}
.tIf-total-hp .reduce:not([data-value="0"])::after{
.tIf-total-hp .reduce.no-reduce .general,
.tIf-total-hp .reduce.no-reduce .awoken-bind
{
display: none;
}
.tIf-total-hp .reduce:not([data-value="0"])::after
{
content: "%⇔" attr(data-max-equal-general) "/" attr(data-max-equal-awoken-bind);
}
.tIf-total-move::before{
.reduce-details
{
cursor: pointer;
vertical-align: bottom;
}
.reduce-details:hover
{
box-shadow: red 0 0 3px;
}
.dialog-hp-detail
{
margin-left: calc(50% - 200px);
margin-top: 100px;
}
.hp-range-table
{
font-family: var(--font-family);
border: 1px solid white;
background-color: saddlebrown;
}
.hp-range-table caption::before
{
font-family: var(--game-font-family);
}
.hp-range-table td,
.hp-range-table th
{
border: 1px solid white;
padding: 0 4px;
}
.hp-range-table .hp-range th::before
{
width: unset;
height: unset;
}
.hp-range-table[data-attr="0"]
{
background-color: crimson;
}
.hp-range-table[data-attr="1"]
{
background-color: cornflowerblue;
}
.hp-range-table[data-attr="2"]
{
background-color: green;
}
.hp-range-table[data-attr="3"]
{
background-color: goldenrod;
}
.hp-range-table[data-attr="4"]
{
background-color: purple;
}
.tIf-total-move .general::before{
background-image: url(images/icon-orb-move-time.png);
}
/*固定手指的情况*/
@ -628,12 +829,13 @@ ul{
opacity: 0;
}
}
.tIf-total-move.fixed-move-time::after
.tIf-total-move.fixed-move-time::after,
icon.poison-no-effect::after
{
background-image: url(images/icon-bind.png);
position: absolute;
left:0;
top:2px;
left: 0;
top: 0;
animation: hidden-visible-animate 0.5s infinite ease-in alternate;
}
/*单人时的协力觉醒和多人时的掉落觉醒显示无效*/
@ -649,6 +851,50 @@ body:not(.solo) .awoken-icon[data-awoken-icon="64"]::after
animation: hidden-visible-animate 0.5s infinite ease-in alternate;
}
.tIf-effect icon
{
position: relative;
}
icon._76board::before
{
background-image: url(images/icon-76board.png);
}
icon.no-skyfall::before
{
background-image: url(images/icon-no-skyfall.png);
}
icon.poison-no-effect::before
{
background-image: url(images/icon-poison.png);
}
icon.add-combo
{
margin-right: 7px;
}
icon.add-combo::before
{
background-image: url(images/icon-add-combo.png);
}
icon.add-combo::after
{
color: white;
text-shadow: black 1px 1px 0,black -1px 0px 0,black 0 0 1px;
font-family: var(--game-font-family);
font-size: 12px;
position: absolute;
top: -7px;
left: 10px;
content: attr(data-add-combo);
}
icon.inflicts::before
{
background-image: url(images/icon-inflicts.png);
}
icon.inflicts::after
{
content: attr(data-inflicts);
}
/*队伍的潜觉*/
.team-latents .latents{
width: var(--head-block-width);
@ -826,7 +1072,42 @@ body:not(.solo) .awoken-icon[data-awoken-icon="64"]::after
.abilitys .rcv::before{
content: "回复:";
}*/
/*队员觉醒统计*/
.menber-awoken
{
width: var(--head-block-width);
display: inline-block;
vertical-align: top;
}
.team-menber-awoken,
.team-assist-awoken
{
margin-top: 3px;
display : none;
}
.menber-awoken .awoken-ul
{
display: inline-block;
}
.menber-awoken .awoken-ul>li
{
display: inline-block;
}
.menber-awoken .awoken-icon
{
filter: unset;
transform: scale(0.80);
margin: calc(-32px * (1 - 0.80) / 2);
}
.show-mon-awoken .team-assist-awoken,
.show-mon-awoken .team-menber-awoken
{
display : block;
}
.show-mon-awoken .monster .super-awoken
{
filter: grayscale(100%);
}
/*编辑窗口*/
.blur-bg{
@ -997,8 +1278,8 @@ body:not(.solo) .awoken-icon[data-awoken-icon="64"]::after
.custom-addition .awoken-icon
{
filter: unset;
transform: scale(0.75);
margin: calc(-32px * (1 - 0.75) / 2);
transform: scale(0.75);
margin: calc(-32px * (1 - 0.75) / 2);
}
.cd-preview .cd-max,
@ -1373,7 +1654,7 @@ body:not(.solo) .awoken-icon[data-awoken-icon="64"]::after
{
content: "×";
}
.search-box .awoken-div .awoken-icon
.awoken-icon
{
position: relative;
border: none;
@ -1386,16 +1667,15 @@ body:not(.solo) .awoken-icon[data-awoken-icon="64"]::after
text-align: left;
}
.search-box .awoken-div .awoken-icon:not([value]),
.search-box .awoken-div .awoken-icon[value="0"],
.search-box .awoken-div .awoken-icon:not([value])~.awoken-sub1,
.search-box .awoken-div .awoken-icon[value="0"]~.awoken-sub1
.search-box .awoken-div .awoken-icon:not([data-awoken-count]),
.search-box .awoken-div .awoken-icon[data-awoken-count="0"]
{
opacity: var(--search-icon-unchecked);
}
.awoken-div .awoken-icon:not([value="0"])::before
.awoken-icon:not([data-awoken-count="0"])::before
{
content: attr(value);
content: attr(data-awoken-count);
display: inline-block;
position: absolute;
line-height: 18px;
@ -1403,7 +1683,6 @@ body:not(.solo) .awoken-icon[data-awoken-icon="64"]::after
right: 0;
bottom: 0;
-webkit-text-stroke: 1px black;
text-stroke: 1px black;
text-shadow: black 1px 1px 1px;
}
.search-box .awoken-ul .awoken-count.zero{
@ -2332,114 +2611,6 @@ table .orb-icon
display: table-cell;
}
/*弹出窗口相关*/
.dialog
{
position: absolute;
padding: 5px;
border: 2px ridge #D1D398;
top: 0;
background-image: linear-gradient(to bottom,#788321f0,#3E4D14f0);
border-radius: 6px;
box-shadow: black 2px 0px 1px,black 0px 2px 1px,black -2px 0px 1px,black 0px -2px 1px;
width: 260px;
margin-left: calc(50% - 130px);
margin-top: 30px;
font-family: var(--game-font-family);
text-shadow: black 2px 2px 0;
}
.dialog .dialog-title
{
font-size: 20px;
line-height: 20px;
text-align: center;
margin-bottom: 5px;
}
.dialog .dialog-content .additional-string
{
border-top: 2px solid white;
margin-top: 5px;
}
/*.dialog .dialog-content .additional-string::before
{
content: "其他語言";
}*/
.dialog .dialog-control
{
text-align: center;
margin-top:10px;
}
.brown-button
{
background-image: linear-gradient(to bottom,#C38E5F,#2F2008);
border: none;
border-radius: 5px;
padding: 2px;
cursor: pointer;
transition: transform 0.1s;
}
.brown-button:active
{
transform: scale(1.1);
}
.brown-button::before
{
display: inline-block;
box-sizing: border-box;
width: 100px;
padding: 5px;
background-color: #956A42;
background-image: url(images/slate.svg);
background-size: 120px 120px;
border-radius: 2px;
font-size: 20px;
line-height: 20px;
vertical-align: middle;
color: white;
font-family: var(--game-font-family);
text-shadow: black 2px 2px 0;
}
/*
.dialog-search-string .dialog-title::before
{
content: "以字符串搜索";
}
.dialog-close::before
{
content: "关闭";
}
*/
.dialog-search-string .string-copy,
.dialog-search-string .string-search
{
box-sizing: border-box;
width: 45px;
margin-left: 5px;
cursor: pointer;
background-color: #994433;
border: 2px solid #FFCC88;
box-shadow: black 1px 0 1px,black -1px 0 1px,black 0 -1px 1px,black 0 3px 2px;
border-radius: 5px;
padding: 0;
}
.dialog-search-string .string-copy::before
{
content: "📋";
}
.dialog-search-string .string-search::before
{
content: "🔍";
}
.dialog-search-string .string-value
{
box-sizing: border-box;
width: calc(100% - 50px * 2);
}
.dialog-search-string .additional-string .string-value
{
box-sizing: border-box;
width: calc(100% - 50px * 1);
}
/*.open-evolutionary-tree::before
{

View File

@ -59,8 +59,9 @@ var formation = new Formation(teamsCount,6);
<a class="help-link" target="_blank" href="https://github.com/Mapaler/PADDashFormation/blob/master/help.md"></a>
</div>
<div>
<input type="checkbox" class="config-checkbox-ipt" name="show-mon-id" id="show-mon-id" onclick="toggleDomClassName(this,'not-show-mon-id',false);" checked><label class="config-checkbox-lbl show-mon-id-lbl" for="show-mon-id"><div class="config-checkbox-lbl-cicle"></div></label>
<input type="checkbox" class="config-checkbox-ipt" name="btn-show-mon-skill-cd" id="btn-show-mon-skill-cd"><label class="config-checkbox-lbl btn-show-mon-skill-cd-lbl" for="btn-show-mon-skill-cd"><div class="config-checkbox-lbl-cicle"></div></label>
<input type="checkbox" class="config-checkbox-ipt" name="btn-show-mon-awoken" id="btn-show-mon-awoken"><label class="config-checkbox-lbl btn-show-mon-awoken-lbl" for="btn-show-mon-awoken"><div class="config-checkbox-lbl-cicle"></div></label>
<input type="checkbox" class="config-checkbox-ipt" name="show-mon-id" id="show-mon-id" onclick="toggleDomClassName(this,'not-show-mon-id',false);" checked><label class="config-checkbox-lbl show-mon-id-lbl" for="show-mon-id"><div class="config-checkbox-lbl-cicle"></div></label>
<input type="checkbox" class="config-checkbox-ipt" name="btn-show-awoken-count" id="btn-show-awoken-count" onclick="toggleDomClassName(this,'not-show-awoken-count',false);" checked><label class="config-checkbox-lbl btn-show-awoken-count-lbl" for="btn-show-awoken-count"><div class="config-checkbox-lbl-cicle"></div></label>
<input type="checkbox" class="config-checkbox-ipt" name="change-swap-to-copy" id="change-swap-to-copy"><label class="config-checkbox-lbl change-swap-to-copy-lbl" for="change-swap-to-copy"><div class="config-checkbox-lbl-cicle"></div></label>
</div>
@ -94,12 +95,24 @@ var formation = new Formation(teamsCount,6);
<div class="tIf-total-hp">
<span class="general"></span>
<span class="awoken-bind"></span>
<span class="reduce"></span>
<span class="reduce">
<span class="reduce-scale"></span>
<span class="general"></span>
<span class="awoken-bind"></span>
<canvas height="20" width="100" class="reduce-details display-none"></canvas>
</span>
</div>
<div class="tIf-total-move">
<span class="general"></span>
<span class="awoken-bind"></span>
</div>
<div class="tIf-effect">
<icon class="_76board display-none"></icon>
<icon class="no-skyfall display-none"></icon>
<icon class="poison-no-effect display-none"></icon>
<icon class="add-combo display-none"></icon>
<icon class="inflicts display-none"></icon>
</div>
</div>
</ul>
<div class="team-box-name">
@ -322,6 +335,58 @@ var formation = new Formation(teamsCount,6);
</ul>
</div>
</div>
<ul class="team-menber-awoken">
<li class="menber-awoken menber-awoken-1">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-2">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-3">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-4">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-5">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-6">
<ul class="awoken-ul">
</ul>
</li>
</ul>
<ul class="team-assist-awoken">
<li class="menber-awoken menber-awoken-1">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-2">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-3">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-4">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-5">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-6">
<ul class="awoken-ul">
</ul>
</li>
</ul>
<ul class="team-ability">
<li class="abilitys abilitys-1">
<div class="hp"></div><div class="atk"></div><div class="rcv"></div>
@ -451,12 +516,24 @@ var formation = new Formation(teamsCount,6);
<div class="tIf-total-hp">
<span class="general"></span>
<span class="awoken-bind"></span>
<span class="reduce"></span>
<span class="reduce">
<span class="reduce-scale"></span>
<span class="general"></span>
<span class="awoken-bind"></span>
<canvas height="20" width="100" class="reduce-details display-none"></canvas>
</span>
</div>
<div class="tIf-total-move">
<span class="general"></span>
<span class="awoken-bind"></span>
</div>
<div class="tIf-effect">
<icon class="_76board display-none"></icon>
<icon class="no-skyfall display-none"></icon>
<icon class="poison-no-effect display-none"></icon>
<icon class="add-combo display-none"></icon>
<icon class="inflicts display-none"></icon>
</div>
</div>
</ul>
<div class="team-box-name">
@ -679,6 +756,58 @@ var formation = new Formation(teamsCount,6);
</ul>
</div>
</div>
<ul class="team-menber-awoken">
<li class="menber-awoken menber-awoken-1">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-2">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-3">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-4">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-5">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-6">
<ul class="awoken-ul">
</ul>
</li>
</ul>
<ul class="team-assist-awoken">
<li class="menber-awoken menber-awoken-1">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-2">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-3">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-4">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-5">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-6">
<ul class="awoken-ul">
</ul>
</li>
</ul>
<ul class="team-ability">
<li class="abilitys abilitys-1">
<div class="hp"></div><div class="atk"></div><div class="rcv"></div>
@ -808,12 +937,24 @@ var formation = new Formation(teamsCount,6);
<div class="tIf-total-hp">
<span class="general"></span>
<span class="awoken-bind"></span>
<span class="reduce"></span>
<span class="reduce">
<span class="reduce-scale"></span>
<span class="general"></span>
<span class="awoken-bind"></span>
<canvas height="20" width="100" class="reduce-details display-none"></canvas>
</span>
</div>
<div class="tIf-total-move">
<span class="general"></span>
<span class="awoken-bind"></span>
</div>
<div class="tIf-effect">
<icon class="_76board display-none"></icon>
<icon class="no-skyfall display-none"></icon>
<icon class="poison-no-effect display-none"></icon>
<icon class="add-combo display-none"></icon>
<icon class="inflicts display-none"></icon>
</div>
</div>
</ul>
<div class="team-box-name">
@ -1036,6 +1177,58 @@ var formation = new Formation(teamsCount,6);
</ul>
</div>
</div>
<ul class="team-menber-awoken">
<li class="menber-awoken menber-awoken-1">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-2">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-3">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-4">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-5">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-6">
<ul class="awoken-ul">
</ul>
</li>
</ul>
<ul class="team-assist-awoken">
<li class="menber-awoken menber-awoken-1">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-2">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-3">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-4">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-5">
<ul class="awoken-ul">
</ul>
</li>
<li class="menber-awoken menber-awoken-6">
<ul class="awoken-ul">
</ul>
</li>
</ul>
<ul class="team-ability">
<li class="abilitys abilitys-1">
<div class="hp"></div><div class="atk"></div><div class="rcv"></div>
@ -1142,6 +1335,11 @@ var formation = new Formation(teamsCount,6);
</li>
</ul>
<div class="detail-box edit"><textarea class="detail" placeholder="输入说明"></textarea><div class="detail-display"></div></div>
<div class="dialog dialog-hp-detail display-none">
<div class="dialog-title"></div>
<div class="dialog-content"></div>
<div class="dialog-control"><button class="dialog-close brown-button"></button></div>
</div>
</div>
<div class="edit-box display-none">
<div class="edit-box-title"><!--修改怪物--></div>