加入sanbon的数据跳转功能

This commit is contained in:
枫谷剑仙 2024-02-19 22:01:20 +08:00
parent eb2cc9751e
commit 82ae4060f8
9 changed files with 183 additions and 26 deletions

View File

@ -653,14 +653,14 @@ body:not(.external-link-support) #external-support::after
label[for="qr-data-type-pdf"]::before label[for="qr-data-type-pdf"]::before
{ {
content: "P&D Formation Maker"; content: "P&D Dash Formation";
} }
label[for="qr-data-type-pdc"]::before label[for="qr-data-type-pdc"]::before
{ {
content: "P&D Damage Caculater (PDC)"; content: "P&D Damage Caculater (PDC)";
} }
label[for="qr-data-type-pdchu"]::before { label[for="qr-data-type-sanbon-v1"]::before {
content: "Valeria (pdchu)"; content: "Sanbon v1 URL";
} }
label[for="qr-data-type-paddb"]::before label[for="qr-data-type-paddb"]::before
{ {

View File

@ -611,14 +611,14 @@ body:not(.external-link-support) #external-support::after
label[for="qr-data-type-pdf"]::before label[for="qr-data-type-pdf"]::before
{ {
content: "パズドラダッシュフォーメーション"; content: "P&D Dash Formation";
} }
label[for="qr-data-type-pdc"]::before label[for="qr-data-type-pdc"]::before
{ {
content: "パズドラダメージ計算 (PDC)"; content: "パズドラダメージ計算 (PDC)";
} }
label[for="qr-data-type-pdchu"]::before { label[for="qr-data-type-sanbon-v1"]::before {
content: "Valeria (pdchu)"; content: "Sanbon v1 URL";
} }
label[for="qr-data-type-paddb"]::before label[for="qr-data-type-paddb"]::before
{ {

View File

@ -591,14 +591,14 @@ body:not(.external-link-support) #external-support::after
label[for="qr-data-type-pdf"]::before label[for="qr-data-type-pdf"]::before
{ {
content: "퍼즐앤드래곤 대시 형성"; content: "P&D Dash Formation";
} }
label[for="qr-data-type-pdc"]::before label[for="qr-data-type-pdc"]::before
{ {
content: "퍼즐앤드래곤 데미지 카큐라터 (PDC)"; content: "퍼즐앤드래곤 데미지 카큐라터 (PDC)";
} }
label[for="qr-data-type-pdchu"]::before { label[for="qr-data-type-sanbon-v1"]::before {
content: "Valeria (pdchu)"; content: "Sanbon v1 URL";
} }
label[for="qr-data-type-paddb"]::before label[for="qr-data-type-paddb"]::before
{ {

View File

@ -609,8 +609,8 @@ label[for="qr-data-type-pdc"]::before
{ {
content: "龍族拼圖傷害計算器 (PDC)"; content: "龍族拼圖傷害計算器 (PDC)";
} }
label[for="qr-data-type-pdchu"]::before { label[for="qr-data-type-sanbon-v1"]::before {
content: "Valeria (pdchu)"; content: "Sanbon v1 網址";
} }
label[for="qr-data-type-paddb"]::before label[for="qr-data-type-paddb"]::before
{ {

View File

@ -537,6 +537,10 @@ label[for="real-time-change-card"]::after
{ {
content: "生成二维码:"; content: "生成二维码:";
} }
.sanbon-me-transfer::before
{
content: "Sanbon.me";
}
.read-qr-box .result-code::before { .read-qr-box .result-code::before {
content: "代码 "; content: "代码 ";
@ -608,8 +612,11 @@ label[for="qr-data-type-pdc"]::before
{ {
content: "智龙迷城伤害计算器 (PDC)"; content: "智龙迷城伤害计算器 (PDC)";
} }
label[for="qr-data-type-pdchu"]::before { label[for="qr-data-type-sanbon-v1"]::before {
content: "Valeria (pdchu)"; content: "Sanbon v1 网址";
}
label[for="qr-data-type-sanbon-v2"]::before {
content: "Sanbon v2 测试脚本";
} }
label[for="qr-data-type-paddb"]::before label[for="qr-data-type-paddb"]::before
{ {

145
script.js
View File

@ -626,6 +626,128 @@ Formation.prototype.getPaddbQrObj = function(keepDataSource = true)
}; };
return qrObj; return qrObj;
} }
Formation.prototype.getSanbonV1Url = function()
{
const region = ((code)=>{
switch (code) {
case "ja": return "jp";
case "ko": return "kr";
case "en": return "na";
}
})(currentDataSource.code);
const sanbonUrl = new URL(`https://sanbon.me/${region}/team-builder`);
const search = sanbonUrl.searchParams;
//sanbon目前只支持单人队伍
const [members,assists,badge] = this.teams[0];
for (let i = 0; i < members.length; i++) {
const m = members[i], a = assists[i];
m.id > 0 && search.set(`${i}`, m.id);
m.sawoken > 0 && search.set(`${i}s`, m.sawoken);
m?.latent?.length > 0 && search.set(`${i}l`, m.latent.join());
a.id > 0 && search.set(`${i}a`, a.id);
}
badge > 0 && search.set(`badge`, badge & 0x7f);
return sanbonUrl;
}
Formation.prototype.getSanbonV2Script = function()
{
function translateRegion(code) {
switch (code) {
case "ja": return "jp";
case "ko": return "kr";
case "en": return "na";
}
};
function cardFlattened(card) {
if (typeof(card) == 'undefined') return 0;
const available_killers = {};
for (let i = 20; i <= 27; i++) {
available_killers[i] = false;
}
card.types.filter(i => i >= 0)
.flatMap(type => typekiller_for_type.find(t=>t.type==type).allowableLatent)
.forEach(t => available_killers[t] = true);
const o = {
region: translateRegion(currentDataSource.code),
num: card.id,
name: card.name,
rarity: card.rarity,
cost: card.cost,
attributes: card.attrs,
types: card.types,
awokens: card.awakenings,
super_awokens: card.superAwakenings,
available_killers: available_killers,
level_final: card.limitBreakIncr ? 120 : card.maxLevel,
stat_final: {
"hp": card.hp.max,
"atk": card.atk.max,
"rcv": card.rcv.max,
},
assistable: card.canAssist,
latent_extendable: card.is8Latent,
showing_active_skills: [],
showing_leader_skills: [],
}
return o;
}
//sanbon目前只支持单人队伍
const [members,assists,badge] = this.teams[0];
const scriptLines = [`(()=>{
"use strict";
const tbs = JSON.parse(sessionStorage.getItem("team-build-store"));
const team = tbs.state;
team.badge = ${badge & 0x7F};`];
const _members = {};
for (let i = 0; i < members.length; i++) {
const m = members[i], a = assists[i];
const _m = {
num: m.id,
level: m.level,
superAwoken: m.sawoken,
latentAwokens: m.latent.concat(),
awokenCount: m.awoken,
hpPlus: m.plus[0],
atkPlus: m.plus[1],
rcvPlus: m.plus[2],
assistNum: a.id,
assistLevel: a.level,
assistPlus: a?.plus?.every(p=>p>=99) ?? false,
flattened: cardFlattened(m.card),
assistFlattened: cardFlattened(a.card),
}
_members[i] = _m;
/*
scriptLines.push(`const m${i} = team.members[${i}];
m${i}.num = ${m.id};
m${i}.level = ${m.level};
m${i}.superAwoken = ${m.sawoken};
m${i}.latentAwokens = ${JSON.stringify(m.latent)};
m${i}.awokenCount = ${m.awoken};
m${i}.hpPlus = ${m.plus[0]};
m${i}.atkPlus = ${m.plus[1]};
m${i}.rcvPlus = ${m.plus[2]};
m${i}.assistNum = ${a.id};
m${i}.assistLevel = ${a.level};
m${i}.assistPlus = ${a.plus.every(p=>p>=99) ? 'true' : 'false'};
if (m${i}.flattened == 0) m${i}.flattened = {};
m${i}.flattened.awokens = ${JSON.stringify(m.card.awakenings)};
m${i}.flattened.super_awokens = ${JSON.stringify(m.card.superAwakenings)};
m${i}.flattened.available_killers = ${JSON.stringify(m.card.superAwakenings)};
if (m${i}.assistFlattened == 0) m${i}.assistFlattened = {};
m${i}.assistFlattened.awokens = ${JSON.stringify(a.id > 0 ? a.card.awakenings : [])};
m${i}.assistFlattened.super_awokens = ${JSON.stringify(a.id > 0 ? a.card.superAwakenings : [])};
`);*/
}
scriptLines.push(`team.members = ${JSON.stringify(_members)}`);
scriptLines.push(`sessionStorage.setItem("team-build-store", JSON.stringify(tbs));
location.reload();
})();`);
return scriptLines.join('\n');
}
Formation.prototype.getQrStr = function(type) Formation.prototype.getQrStr = function(type)
{ {
switch (type) { switch (type) {
@ -635,6 +757,12 @@ Formation.prototype.getQrStr = function(type)
case 'paddb': { case 'paddb': {
return JSON.stringify(this.getPaddbQrObj()); return JSON.stringify(this.getPaddbQrObj());
} }
case 'sanbon-v1': {
return this.getSanbonV1Url();
}
case 'sanbon-v2': {
return this.getSanbonV2Script();
}
case 'pdc': case 'pdc':
default: { default: {
return this.getPdcQrStr(); return this.getPdcQrStr();
@ -1977,6 +2105,11 @@ function initialize() {
let qrTypeRadio = qrSaveBox.qrDataType.find(radio=>radio.checked); let qrTypeRadio = qrSaveBox.qrDataType.find(radio=>radio.checked);
if (qrTypeRadio) qrTypeRadio.onclick(); //打开二维码窗口就先产生二维码 if (qrTypeRadio) qrTypeRadio.onclick(); //打开二维码窗口就先产生二维码
//生成sanbon v1链接
qrCodeFrame.querySelector("#sanbon-v1-link").href = formation.getSanbonV1Url();
qrCodeFrame.querySelector("#sanbon-v2-script").value = formation.getSanbonV2Script();
}; };
qrCodeFrame.hide = function(){qrcodeReader.reset();}; qrCodeFrame.hide = function(){qrcodeReader.reset();};
@ -2038,11 +2171,13 @@ function initialize() {
qrCodeFrame.refreshQrCode(this.value); qrCodeFrame.refreshQrCode(this.value);
} }
qrSaveBox.qrDataType = Array.from(qrSaveBox.querySelectorAll(".qr-data-type-radio")); qrSaveBox.qrDataType = Array.from(qrSaveBox.querySelectorAll(".qr-data-type-radio"));
qrSaveBox.qrDataType.forEach(radio=>radio.onclick = function(){ function changeOutputType(){
let qrstr = formation.getQrStr(this.value); const type = this.value;
const qrstr = formation.getQrStr(type);
qrSaveBox.qrStr.value = qrstr; qrSaveBox.qrStr.value = qrstr;
qrSaveBox.qrStr.onchange(); qrSaveBox.qrStr.onchange();
}); }
qrSaveBox.qrDataType.forEach(radio=>radio.onclick = changeOutputType);
qrSaveBox.saveQrImg = qrSaveBox.querySelector(".save-qr-img"); qrSaveBox.saveQrImg = qrSaveBox.querySelector(".save-qr-img");
qrCodeFrame.ondragenter = ()=>false; qrCodeFrame.ondragenter = ()=>false;
@ -5307,8 +5442,8 @@ function editBoxChangeMonId(id) {
const latentSet = new Set(allowable_latent.common); const latentSet = new Set(allowable_latent.common);
allowable_latent.needAwoken.forEach(obj=>latentSet.add(obj.latent)); allowable_latent.needAwoken.forEach(obj=>latentSet.add(obj.latent));
card.types.filter(i => i >= 0) card.types.filter(i => i >= 0)
.map(type => typekiller_for_type.find(t=>t.type==type).allowableLatent) .flatMap(type => typekiller_for_type.find(t=>t.type==type).allowableLatent)
.forEach(tA => tA.forEach(t => latentSet.add(t))); .forEach(t => latentSet.add(t));
if (card.limitBreakIncr) { if (card.limitBreakIncr) {
allowable_latent.v120.forEach(t => (t!==49 || t===49 && card.attrs[0]===6) && latentSet.add(t)); allowable_latent.v120.forEach(t => (t!==49 || t===49 && card.attrs[0]===6) && latentSet.add(t));
} }

View File

@ -22843,11 +22843,11 @@ const cachesMap = new Map([
], ],
[ [
"script.js", "script.js",
"51a45dedffded8db84da957b47a28c28" "d90f5ce95461961deeaaa207fc674932"
], ],
[ [
"solo.html", "solo.html",
"5dfa10024924d95cb1a32abd94a48418" "89d57551dff65751b97686e126d3672c"
], ],
[ [
"style-monsterimages.css", "style-monsterimages.css",
@ -22855,7 +22855,7 @@ const cachesMap = new Map([
], ],
[ [
"style.css", "style.css",
"10c3535a7ad7a4f3c01fa70c7c67d3b5" "ccf520aa5d5e653c9c874a4f6ef18dd5"
], ],
[ [
"temp.js", "temp.js",
@ -22867,7 +22867,7 @@ const cachesMap = new Map([
], ],
[ [
"languages/en.css", "languages/en.css",
"5c55ac4c8f478076425dc23c8e4b75c7" "890c22795207a7ce48d94b81cb1c2da9"
], ],
[ [
"languages/en.js", "languages/en.js",
@ -22875,7 +22875,7 @@ const cachesMap = new Map([
], ],
[ [
"languages/ja.css", "languages/ja.css",
"6ac36a23d002754462c2d225c1b7cfab" "60212f96389d2dcd52704ddefca000d4"
], ],
[ [
"languages/ja.js", "languages/ja.js",
@ -22883,7 +22883,7 @@ const cachesMap = new Map([
], ],
[ [
"languages/ko.css", "languages/ko.css",
"0a845b5579580b336ed4e6b008026f2e" "31800c79d96f2fbf0a1c36cf978e5282"
], ],
[ [
"languages/ko.js", "languages/ko.js",
@ -22895,7 +22895,7 @@ const cachesMap = new Map([
], ],
[ [
"languages/zh-TW.css", "languages/zh-TW.css",
"717ab281b26486b192defaa3bc068b15" "a2fb307399710d6c9dc0a21b902a3e3d"
], ],
[ [
"languages/zh-TW.js", "languages/zh-TW.js",
@ -22903,7 +22903,7 @@ const cachesMap = new Map([
], ],
[ [
"languages/zh.css", "languages/zh.css",
"7320d52c192a768bd1d221073aa4573b" "b02ff6a7cffea9e8cc8ae869600e9775"
], ],
[ [
"languages/zh.js", "languages/zh.js",

View File

@ -1243,6 +1243,14 @@ const teamsCount = 1;
<div class="qr-box"><img class="qr-code-image" /></div> <div class="qr-box"><img class="qr-code-image" /></div>
<a download="" class="save-qr-img brown-button fa"><!--保存QR 图片--></a> <a download="" class="save-qr-img brown-button fa"><!--保存QR 图片--></a>
</div> </div>
<div class="sanbon-me-transfer">
<div class="sanbon-v1">
<a id="sanbon-v1-link">Sanbon v1 URL</a>
</div>
<div class="sanbon-v2">
<label for="sanbon-v2-script"><a href="https://sanbon.me/v2/en-jp/team-builder" target="_blank">Sanbon v2</a> JavaScript (Test function, paste in Browser Console, Maybe Not available | 测试功能,粘贴到浏览器控制台,但基本无法使用)</label><br><textarea id="sanbon-v2-script"></textarea>
</div>
</div>
<div class="paddb-team-edit"> <div class="paddb-team-edit">
<div class="user"> <div class="user">
<label for="paddb-username"></label><input id="paddb-username" type="text" placeholder="ID (2~12)"> <label for="paddb-username"></label><input id="paddb-username" type="text" placeholder="ID (2~12)">

View File

@ -3533,9 +3533,16 @@ body:not(.external-link-support) #external-support::before
{ {
padding-bottom: 10px; padding-bottom: 10px;
} }
#qr-code-frame #sanbon-v2-script
{
width: calc(100% - 20px);
height: 4em;
resize: vertical;
}
#qr-code-frame .read-qr-box::before, #qr-code-frame .read-qr-box::before,
#qr-code-frame .save-qr-box::before, #qr-code-frame .save-qr-box::before,
#qr-code-frame .sanbon-me-transfer::before,
#qr-code-frame .paddb-team-edit::before #qr-code-frame .paddb-team-edit::before
{ {
display: block; display: block;