diff --git a/languages/en.css b/languages/en.css index 53400167..fd8108b2 100644 --- a/languages/en.css +++ b/languages/en.css @@ -653,14 +653,14 @@ body:not(.external-link-support) #external-support::after label[for="qr-data-type-pdf"]::before { - content: "P&D Formation Maker"; + content: "P&D Dash Formation"; } label[for="qr-data-type-pdc"]::before { content: "P&D Damage Caculater (PDC)"; } -label[for="qr-data-type-pdchu"]::before { - content: "Valeria (pdchu)"; +label[for="qr-data-type-sanbon-v1"]::before { + content: "Sanbon v1 URL"; } label[for="qr-data-type-paddb"]::before { diff --git a/languages/ja.css b/languages/ja.css index 384412c1..cc35a2cc 100644 --- a/languages/ja.css +++ b/languages/ja.css @@ -611,14 +611,14 @@ body:not(.external-link-support) #external-support::after label[for="qr-data-type-pdf"]::before { - content: "パズドラダッシュフォーメーション"; + content: "P&D Dash Formation"; } label[for="qr-data-type-pdc"]::before { content: "パズドラダメージ計算 (PDC)"; } -label[for="qr-data-type-pdchu"]::before { - content: "Valeria (pdchu)"; +label[for="qr-data-type-sanbon-v1"]::before { + content: "Sanbon v1 URL"; } label[for="qr-data-type-paddb"]::before { diff --git a/languages/ko.css b/languages/ko.css index 15442d89..d65b807b 100644 --- a/languages/ko.css +++ b/languages/ko.css @@ -591,14 +591,14 @@ body:not(.external-link-support) #external-support::after label[for="qr-data-type-pdf"]::before { - content: "퍼즐앤드래곤 대시 형성"; + content: "P&D Dash Formation"; } label[for="qr-data-type-pdc"]::before { content: "퍼즐앤드래곤 데미지 카큐라터 (PDC)"; } -label[for="qr-data-type-pdchu"]::before { - content: "Valeria (pdchu)"; +label[for="qr-data-type-sanbon-v1"]::before { + content: "Sanbon v1 URL"; } label[for="qr-data-type-paddb"]::before { diff --git a/languages/zh-TW.css b/languages/zh-TW.css index b8af6714..5eff5504 100644 --- a/languages/zh-TW.css +++ b/languages/zh-TW.css @@ -609,8 +609,8 @@ label[for="qr-data-type-pdc"]::before { content: "龍族拼圖傷害計算器 (PDC)"; } -label[for="qr-data-type-pdchu"]::before { - content: "Valeria (pdchu)"; +label[for="qr-data-type-sanbon-v1"]::before { + content: "Sanbon v1 網址"; } label[for="qr-data-type-paddb"]::before { diff --git a/languages/zh.css b/languages/zh.css index aa0edbb2..8893b059 100644 --- a/languages/zh.css +++ b/languages/zh.css @@ -537,6 +537,10 @@ label[for="real-time-change-card"]::after { content: "生成二维码:"; } +.sanbon-me-transfer::before +{ + content: "Sanbon.me:"; +} .read-qr-box .result-code::before { content: "代码 "; @@ -608,8 +612,11 @@ label[for="qr-data-type-pdc"]::before { content: "智龙迷城伤害计算器 (PDC)"; } -label[for="qr-data-type-pdchu"]::before { - content: "Valeria (pdchu)"; +label[for="qr-data-type-sanbon-v1"]::before { + content: "Sanbon v1 网址"; +} +label[for="qr-data-type-sanbon-v2"]::before { + content: "Sanbon v2 测试脚本"; } label[for="qr-data-type-paddb"]::before { diff --git a/script.js b/script.js index 6e092c2f..37d7e943 100644 --- a/script.js +++ b/script.js @@ -626,6 +626,128 @@ Formation.prototype.getPaddbQrObj = function(keepDataSource = true) }; 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) { switch (type) { @@ -635,6 +757,12 @@ Formation.prototype.getQrStr = function(type) case 'paddb': { return JSON.stringify(this.getPaddbQrObj()); } + case 'sanbon-v1': { + return this.getSanbonV1Url(); + } + case 'sanbon-v2': { + return this.getSanbonV2Script(); + } case 'pdc': default: { return this.getPdcQrStr(); @@ -1977,6 +2105,11 @@ function initialize() { let qrTypeRadio = qrSaveBox.qrDataType.find(radio=>radio.checked); 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();}; @@ -2038,11 +2171,13 @@ function initialize() { qrCodeFrame.refreshQrCode(this.value); } qrSaveBox.qrDataType = Array.from(qrSaveBox.querySelectorAll(".qr-data-type-radio")); - qrSaveBox.qrDataType.forEach(radio=>radio.onclick = function(){ - let qrstr = formation.getQrStr(this.value); + function changeOutputType(){ + const type = this.value; + const qrstr = formation.getQrStr(type); qrSaveBox.qrStr.value = qrstr; qrSaveBox.qrStr.onchange(); - }); + } + qrSaveBox.qrDataType.forEach(radio=>radio.onclick = changeOutputType); qrSaveBox.saveQrImg = qrSaveBox.querySelector(".save-qr-img"); qrCodeFrame.ondragenter = ()=>false; @@ -5307,8 +5442,8 @@ function editBoxChangeMonId(id) { const latentSet = new Set(allowable_latent.common); allowable_latent.needAwoken.forEach(obj=>latentSet.add(obj.latent)); card.types.filter(i => i >= 0) - .map(type => typekiller_for_type.find(t=>t.type==type).allowableLatent) - .forEach(tA => tA.forEach(t => latentSet.add(t))); + .flatMap(type => typekiller_for_type.find(t=>t.type==type).allowableLatent) + .forEach(t => latentSet.add(t)); if (card.limitBreakIncr) { allowable_latent.v120.forEach(t => (t!==49 || t===49 && card.attrs[0]===6) && latentSet.add(t)); } diff --git a/service-worker.js b/service-worker.js index f54d160b..720bfe38 100644 --- a/service-worker.js +++ b/service-worker.js @@ -22843,11 +22843,11 @@ const cachesMap = new Map([ ], [ "script.js", - "51a45dedffded8db84da957b47a28c28" + "d90f5ce95461961deeaaa207fc674932" ], [ "solo.html", - "5dfa10024924d95cb1a32abd94a48418" + "89d57551dff65751b97686e126d3672c" ], [ "style-monsterimages.css", @@ -22855,7 +22855,7 @@ const cachesMap = new Map([ ], [ "style.css", - "10c3535a7ad7a4f3c01fa70c7c67d3b5" + "ccf520aa5d5e653c9c874a4f6ef18dd5" ], [ "temp.js", @@ -22867,7 +22867,7 @@ const cachesMap = new Map([ ], [ "languages/en.css", - "5c55ac4c8f478076425dc23c8e4b75c7" + "890c22795207a7ce48d94b81cb1c2da9" ], [ "languages/en.js", @@ -22875,7 +22875,7 @@ const cachesMap = new Map([ ], [ "languages/ja.css", - "6ac36a23d002754462c2d225c1b7cfab" + "60212f96389d2dcd52704ddefca000d4" ], [ "languages/ja.js", @@ -22883,7 +22883,7 @@ const cachesMap = new Map([ ], [ "languages/ko.css", - "0a845b5579580b336ed4e6b008026f2e" + "31800c79d96f2fbf0a1c36cf978e5282" ], [ "languages/ko.js", @@ -22895,7 +22895,7 @@ const cachesMap = new Map([ ], [ "languages/zh-TW.css", - "717ab281b26486b192defaa3bc068b15" + "a2fb307399710d6c9dc0a21b902a3e3d" ], [ "languages/zh-TW.js", @@ -22903,7 +22903,7 @@ const cachesMap = new Map([ ], [ "languages/zh.css", - "7320d52c192a768bd1d221073aa4573b" + "b02ff6a7cffea9e8cc8ae869600e9775" ], [ "languages/zh.js", diff --git a/solo.html b/solo.html index 8db0d710..652cde12 100644 --- a/solo.html +++ b/solo.html @@ -1243,6 +1243,14 @@ const teamsCount = 1;
+
+
+ Sanbon v1 URL +
+
+
+
+
diff --git a/style.css b/style.css index 724ed8bb..7cc95900 100644 --- a/style.css +++ b/style.css @@ -3533,9 +3533,16 @@ body:not(.external-link-support) #external-support::before { 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 .save-qr-box::before, +#qr-code-frame .sanbon-me-transfer::before, #qr-code-frame .paddb-team-edit::before { display: block;