Merge branch 'master' into skillParser
# Conflicts: # languages/en.css # languages/en.js # languages/ko.css # languages/zh-CN.js
23
README.md
|
@ -15,21 +15,26 @@ This tool can help you easily create and share Swipe Formation or Solo Formation
|
|||
|  |  |
|
||||
|
||||
# 如何使用 | HOW TO USE
|
||||
## 快速使用在线版 | Online Quick Start
|
||||
* <https://mapaler.github.io/PADDashFormation/> (Github Pages)
|
||||
[Firefox](https://www.mozilla.org/firefox/new/) is recommended on your phone for better performance. Chrome is very slow when searching for a large number of cards
|
||||
* <https://mapaler.gitee.io/paddashformation/> (码云的镜象,国内用这个更快 | Chinese mirror)
|
||||
手机上使用 [火狐浏览器](https://www.mozilla.org/firefox/new/) 具有更好的性能,Chrome 卡死了。
|
||||
推荐[火狐浏览器](https://www.mozilla.org/firefox/new/) | [Firefox](https://www.mozilla.org/firefox/new/) is recommended
|
||||
## 快速使用在线版(推荐) | Online Quick Start (Recommended)
|
||||
* <https://mapaler.github.io/PADDashFormation/> (Github Pages)
|
||||
* <https://mapaler.com/PADDashFormation/> (我自己的镜像 | my own mirror)
|
||||
> *Gitee* 的镜像已经停止更新。
|
||||
> The mirror of *Gitee* has stopped updating.
|
||||
|
||||
## 下载后使用本地版 | Use the local version after downloaded
|
||||
[下载压缩包](//gitee.com/mapaler/PADDashFormation/repository/archive/master)或`git clone`后使用浏览器打开`index.html`。
|
||||
[Download ZIP](//codeload.github.com/Mapaler/PADDashFormation/zip/master) or `git clone`, and open the `index.html` with Browser.
|
||||
## 创建你自己的镜像网站 | Create your own mirror web site
|
||||
`git clone`到你的 *http* 服务目录即可访问,将来更新时只需要`git pull`即可。
|
||||
`git clone` to your *http* service directory for visited, and `git pull` for future updates.
|
||||
|
||||
## 下载后使用本地版 | Use the local version after downloaded
|
||||
[下载压缩包](archive/refs/heads/master.zip)或`git clone`后使用浏览器打开`index.html`。
|
||||
[Download ZIP](archive/refs/heads/master.zip) or `git clone`, and open the `index.html` with Browser.
|
||||
* 火狐68.0及以后需要在`about:config`设定`privacy.file_unique_origin`为`false`。
|
||||
Firefox 68.0 or above need setting the `privacy.file_unique_origin` to `false` in `about:config`.
|
||||
* Chrome需要添加`--allow-file-access-from-files`启动参数。
|
||||
Chrome browser need start with the additional argument `--allow-file-access-from-files`.
|
||||
|
||||
## [帮助和提示 | Help and Tips](help.md)
|
||||
# [帮助和提示 | Help and Tips](help.md)
|
||||
|
||||
# 翻译我 | Translate me
|
||||
## 目前支持的语言 | Languages currently supported
|
||||
|
|
|
@ -2,11 +2,11 @@
|
|||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
|
||||
<metadata>
|
||||
Created by FontForge 20201107 at Tue Mar 16 10:15:04 2021
|
||||
Created by FontForge 20201107 at Wed Aug 4 12:25:29 2021
|
||||
By Robert Madole
|
||||
Copyright (c) Font Awesome
|
||||
</metadata>
|
||||
<!-- Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><defs>
|
||||
<!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><defs>
|
||||
<font id="FontAwesome5Free-Solid" horiz-adv-x="512" >
|
||||
<font-face
|
||||
font-family="Font Awesome 5 Free Solid"
|
||||
|
|
Before Width: | Height: | Size: 898 KiB After Width: | Height: | Size: 898 KiB |
Before Width: | Height: | Size: 952 KiB After Width: | Height: | Size: 971 KiB |
Before Width: | Height: | Size: 599 KiB After Width: | Height: | Size: 895 KiB |
Before Width: | Height: | Size: 798 KiB After Width: | Height: | Size: 885 KiB |
Before Width: | Height: | Size: 207 KiB After Width: | Height: | Size: 689 KiB |
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 631 KiB After Width: | Height: | Size: 902 KiB |
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 282 KiB |
Before Width: | Height: | Size: 952 KiB After Width: | Height: | Size: 971 KiB |
Before Width: | Height: | Size: 599 KiB After Width: | Height: | Size: 895 KiB |
Before Width: | Height: | Size: 798 KiB After Width: | Height: | Size: 885 KiB |
Before Width: | Height: | Size: 207 KiB After Width: | Height: | Size: 689 KiB |
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 80 KiB |
|
@ -376,7 +376,8 @@
|
|||
content: "Reset";
|
||||
}
|
||||
.search-box .awoken-clear::before,
|
||||
.search-box .sawoken-clear::before
|
||||
.search-box .sawoken-clear::before,
|
||||
.special-div .special-clear::before
|
||||
{
|
||||
content: "Clear";
|
||||
}
|
||||
|
@ -386,6 +387,12 @@
|
|||
.search-box .sawoken-div::before{
|
||||
content: "▼Super Awoken (OR)";
|
||||
}
|
||||
.search-box .special-div::before{
|
||||
content: "▼Special Search";
|
||||
}
|
||||
.special-div .special-add::before {
|
||||
content: "➕";
|
||||
}
|
||||
.control-div .search-start::before{
|
||||
content: "🔍Start Search";
|
||||
}
|
||||
|
@ -522,9 +529,9 @@
|
|||
content: "Generate QR code:";
|
||||
}
|
||||
|
||||
.formation-from-qrcode::before
|
||||
.formation-from-string::before
|
||||
{
|
||||
content: "A formation link read from a QR code";
|
||||
content: "A formation link read from string";
|
||||
}
|
||||
label[for="sourceSelect"]::before
|
||||
{
|
||||
|
@ -536,15 +543,18 @@ label[for="sourceSelect"]::before
|
|||
}
|
||||
#qr-code-frame .read-qr-camera::before
|
||||
{
|
||||
content: "\f030 Scan with the camera";
|
||||
content: "\f030 Scan with camera";
|
||||
}
|
||||
#qr-code-frame .read-qr-camera.running::before
|
||||
{
|
||||
content: "\f28d Stop using the camera";
|
||||
content: "\f28d Stop using camera";
|
||||
}
|
||||
#qr-code-frame .read-qr-file::before
|
||||
{
|
||||
content: "\f1c5 Read the image file";
|
||||
content: "\f1c5 Read image file";
|
||||
}
|
||||
#qr-code-frame .read-string::before {
|
||||
content: "\f891 Read string";
|
||||
}
|
||||
|
||||
label[for="qr-data-type-pdf"]::before
|
||||
|
@ -555,3 +565,6 @@ label[for="qr-data-type-pdc"]::before
|
|||
{
|
||||
content: "P&D Damage Caculater (PDC)";
|
||||
}
|
||||
label[for="qr-data-type-pdchu"]::before {
|
||||
content: "Valeria(pdchu)";
|
||||
}
|
|
@ -1,24 +1,25 @@
|
|||
localTranslating = {
|
||||
webpage_title: `P&D ${teamsCount}P Formation Maker`,
|
||||
title_blank: `Input Formation Title`,
|
||||
detail_blank: `Input Detail`,
|
||||
sort_name: {
|
||||
sort_none: `Nope`,
|
||||
sort_id: `Cards Id`,
|
||||
sort_attrs : `Attribute`,
|
||||
sort_evoRootId: `Cards Evolution Root`,
|
||||
sort_evoRoot_Attrs : `Cards Evolution Root's Attribute`,
|
||||
sort_rarity: `Rarity`,
|
||||
sort_cost: `Cost`,
|
||||
sort_skillLv1: `Maximum Skill Turn`,
|
||||
sort_skillLvMax: `Minimum Skill Turn`,
|
||||
sort_hpMax110: `Max HP`,
|
||||
sort_atkMax110: `Max ATK`,
|
||||
sort_rcvMax110: `Max RCV`,
|
||||
sort_hpMax110_awoken: `Max HP (+Awoken)`,
|
||||
sort_atkMax110_awoken: `Max ATK (+Awoken)`,
|
||||
sort_rcvMax110_awoken: `Max RCV (+Awoken)`,
|
||||
sort_abilityIndex_awoken: `Maximum Weighted Ability Index (+Awakening)`,
|
||||
addition_display: "Additional display",
|
||||
title_blank: "Input Formation Title",
|
||||
detail_blank: "Input Detail",
|
||||
sort_name:{
|
||||
sort_none: "Nope",
|
||||
sort_id: "Cards Id",
|
||||
sort_attrs : "Attribute",
|
||||
sort_evoRootId: "Cards Evolution Root",
|
||||
sort_evoRoot_Attrs : "Cards Evolution Root's Attribute",
|
||||
sort_rarity: "Rarity",
|
||||
sort_cost: "Cost",
|
||||
sort_skillLv1: "Maximum Skill Turn",
|
||||
sort_skillLvMax: "Minimum Skill Turn",
|
||||
sort_hpMax110: "Max HP",
|
||||
sort_atkMax110: "Max ATK",
|
||||
sort_rcvMax110: "Max RCV",
|
||||
sort_hpMax110_awoken: "Max HP (+Awoken)",
|
||||
sort_atkMax110_awoken: "Max ATK (+Awoken)",
|
||||
sort_rcvMax110_awoken: "Max RCV (+Awoken)",
|
||||
sort_abilityIndex_awoken: "Maximum Weighted Ability Index (+Awakening)",
|
||||
},
|
||||
force_reload_data: `Force refresh data`,
|
||||
skill_parse: {
|
||||
|
|
|
@ -368,7 +368,8 @@
|
|||
content: "リセット";
|
||||
}
|
||||
.search-box .awoken-clear::before,
|
||||
.search-box .sawoken-clear::before
|
||||
.search-box .sawoken-clear::before,
|
||||
.special-div .special-clear::before
|
||||
{
|
||||
content: "クリア";
|
||||
}
|
||||
|
@ -378,6 +379,12 @@
|
|||
.search-box .sawoken-div::before{
|
||||
content: "▼超覚醒(OR)";
|
||||
}
|
||||
.search-box .special-div::before{
|
||||
content: "▼特別な検索";
|
||||
}
|
||||
.special-div .special-add::before {
|
||||
content: "➕";
|
||||
}
|
||||
.control-div .search-start::before{
|
||||
content: "🔍検索の開始";
|
||||
}
|
||||
|
@ -486,9 +493,9 @@
|
|||
content: "QRコードを生成します:";
|
||||
}
|
||||
|
||||
.formation-from-qrcode::before
|
||||
.formation-from-string::before
|
||||
{
|
||||
content: "QRコードから読み取られたフォーメーションリンク";
|
||||
content: "文字列から読み取られた列リンク";
|
||||
}
|
||||
label[for="sourceSelect"]::before
|
||||
{
|
||||
|
@ -510,12 +517,18 @@ label[for="sourceSelect"]::before
|
|||
{
|
||||
content: "\f1c5 画像ファイルを読み取る";
|
||||
}
|
||||
#qr-code-frame .read-string::before {
|
||||
content: "\f891 文字列を読み取ります";
|
||||
}
|
||||
|
||||
label[for="qr-data-type-pdf"]::before
|
||||
{
|
||||
content: "パズドラチーム図作成ツール";
|
||||
content: "パズドラダッシュフォーメーション";
|
||||
}
|
||||
label[for="qr-data-type-pdc"]::before
|
||||
{
|
||||
content: "パズドラダメージ計算 (PDC)";
|
||||
}
|
||||
label[for="qr-data-type-pdchu"]::before {
|
||||
content: "Valeria(pdchu)";
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
localTranslating = {
|
||||
webpage_title: `パズル&ドラゴンズ${teamsCount}人のチーム図作成ツール`,
|
||||
addition_display: "追加の表示",
|
||||
title_blank: "入力タイトル",
|
||||
detail_blank: "入力詳細",
|
||||
sort_name:{
|
||||
|
@ -10,6 +11,7 @@
|
|||
sort_evoRoot_Attrs : "カード進化ルートの属性",
|
||||
sort_rarity: "レアリティ",
|
||||
sort_cost: "コスト",
|
||||
sort_mp: "MP",
|
||||
sort_skillLv1: "最大スキルターン",
|
||||
sort_skillLvMax: "最小スキルターン",
|
||||
sort_hpMax110: "最大 HP",
|
||||
|
|
|
@ -365,7 +365,8 @@
|
|||
content: "재설정";
|
||||
}
|
||||
.search-box .awoken-clear::before,
|
||||
.search-box .sawoken-clear::before
|
||||
.search-box .sawoken-clear::before,
|
||||
.special-div .special-clear::before
|
||||
{
|
||||
content: "명확한";
|
||||
}
|
||||
|
@ -375,6 +376,12 @@
|
|||
.search-box .sawoken-div::before{
|
||||
content: "▼슈퍼 각성(OR)";
|
||||
}
|
||||
.search-box .special-div::before{
|
||||
content: "▼특별 검색";
|
||||
}
|
||||
.special-div .special-add::before {
|
||||
content: "➕";
|
||||
}
|
||||
.control-div .search-start::before{
|
||||
content: "🔍검색 시작";
|
||||
}
|
||||
|
@ -480,9 +487,9 @@
|
|||
content: "QR 코드 생성:";
|
||||
}
|
||||
|
||||
.formation-from-qrcode::before
|
||||
.formation-from-string::before
|
||||
{
|
||||
content: "QR 코드에서 읽은 형성 링크";
|
||||
content: "문자열에서 읽은 팀 링크입니다";
|
||||
}
|
||||
label[for="sourceSelect"]::before
|
||||
{
|
||||
|
@ -504,12 +511,18 @@ label[for="sourceSelect"]::before
|
|||
{
|
||||
content: "\f1c5 이미지 파일 읽기";
|
||||
}
|
||||
#qr-code-frame .read-string::before {
|
||||
content: "\f891 문자열을 읽습니다";
|
||||
}
|
||||
|
||||
label[for="qr-data-type-pdf"]::before
|
||||
{
|
||||
content: "퍼즐앤드래곤 팀 다이어그램 생성 도구";
|
||||
content: "퍼즐앤드래곤 대시 형성";
|
||||
}
|
||||
label[for="qr-data-type-pdc"]::before
|
||||
{
|
||||
content: "퍼즐앤드래곤 데미지 카큐라터 (PDC)";
|
||||
}
|
||||
label[for="qr-data-type-pdchu"]::before {
|
||||
content: "Valeria(pdchu)";
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
localTranslating = {
|
||||
webpage_title: `퍼즐앤드래곤 ${teamsCount} 명의 팀 다이어그램 작성 도구`,
|
||||
addition_display: "추가 표시입니다",
|
||||
title_blank: "입력 제목",
|
||||
detail_blank: "입력 내용",
|
||||
sort_name:{
|
||||
|
@ -10,6 +11,7 @@
|
|||
sort_evoRoot_Attrs : "카드 진화 루트의 특성",
|
||||
sort_rarity: "래리티",
|
||||
sort_cost: "비용",
|
||||
sort_mp: "MP",
|
||||
sort_skillLv1: "최대 스킬 턴",
|
||||
sort_skillLvMax: "최소 스킬 턴",
|
||||
sort_hpMax110: "최대 HP",
|
||||
|
|
|
@ -7,31 +7,4 @@
|
|||
{
|
||||
font-family: "Microsoft Yahei","Source Han Sans",Arial, Helvetica, sans-serif;
|
||||
font-weight: bold;
|
||||
}
|
||||
.specialSearch {
|
||||
display: block !important;
|
||||
min-height: 35px;
|
||||
}
|
||||
.specialSearch::before {
|
||||
content: "▼暂时仅中文有的筛选(缺少翻译)";
|
||||
display: block;
|
||||
}
|
||||
.specialSearch li{
|
||||
margin-bottom: 5px;
|
||||
margin-right: 3px;
|
||||
}
|
||||
.specialSearch select{
|
||||
font-size: 20px;
|
||||
}
|
||||
.specialSearch .specialSearch-clear,
|
||||
.specialSearch .specialSearch-add
|
||||
{
|
||||
float: right;
|
||||
padding: 0;
|
||||
}
|
||||
.specialSearch .specialSearch-clear::before {
|
||||
content: "❌";
|
||||
}
|
||||
.specialSearch .specialSearch-add::before {
|
||||
content: "➕";
|
||||
}
|
2827
languages/zh-CN.js
|
@ -328,7 +328,7 @@
|
|||
content: "使用官方覺醒排序";
|
||||
}
|
||||
.search-box .search-list-length::before{
|
||||
content: "結果數量:";
|
||||
content: "結果數量:";
|
||||
}
|
||||
.search-box .sort-div::before{
|
||||
content: "排序:";
|
||||
|
@ -371,7 +371,8 @@
|
|||
content: "重置";
|
||||
}
|
||||
.search-box .awoken-clear::before,
|
||||
.search-box .sawoken-clear::before
|
||||
.search-box .sawoken-clear::before,
|
||||
.special-div .special-clear::before
|
||||
{
|
||||
content: "清除";
|
||||
}
|
||||
|
@ -381,6 +382,12 @@
|
|||
.search-box .sawoken-div::before{
|
||||
content: "▼超覺醒(OR)";
|
||||
}
|
||||
.search-box .special-div::before{
|
||||
content: "▼特殊搜索";
|
||||
}
|
||||
.special-div .special-add::before {
|
||||
content: "➕";
|
||||
}
|
||||
.control-div .search-start::before{
|
||||
content: "🔍開始搜索";
|
||||
}
|
||||
|
@ -418,52 +425,52 @@
|
|||
.base .evo-type::before,
|
||||
.base .evo-type::after
|
||||
{
|
||||
content: "基礎";
|
||||
content: "基礎";
|
||||
}
|
||||
.evolution .evo-type::before,
|
||||
.evolution .evo-type::after
|
||||
{
|
||||
content: "進化";
|
||||
content: "進化";
|
||||
}
|
||||
.ult-evo .evo-type::before,
|
||||
.ult-evo .evo-type::after
|
||||
{
|
||||
content: "究極進化";
|
||||
content: "究極進化";
|
||||
}
|
||||
.reincarnation .evo-type::before,
|
||||
.reincarnation .evo-type::after
|
||||
{
|
||||
content: "轉生進化";
|
||||
content: "轉生進化";
|
||||
}
|
||||
.pixel-evo .evo-type::before,
|
||||
.pixel-evo .evo-type::after
|
||||
{
|
||||
content: "像素進化";
|
||||
content: "像素進化";
|
||||
}
|
||||
.assist-evo .evo-type::before,
|
||||
.assist-evo .evo-type::after
|
||||
{
|
||||
content: "輔助進化";
|
||||
content: "輔助進化";
|
||||
}
|
||||
.super-reincarnation .evo-type::before,
|
||||
.super-reincarnation .evo-type::after
|
||||
{
|
||||
content: "超轉生進化";
|
||||
content: "超轉生進化";
|
||||
}
|
||||
.super-ult-evo .evo-type::before,
|
||||
.super-ult-evo .evo-type::after
|
||||
{
|
||||
content: "超究極進化";
|
||||
content: "超究極進化";
|
||||
}
|
||||
.henshin .evo-type::before,
|
||||
.henshin .evo-type::after
|
||||
{
|
||||
content: "變身";
|
||||
content: "變身";
|
||||
}
|
||||
.henshin-loop .evo-type::before,
|
||||
.henshin-loop .evo-type::after
|
||||
{
|
||||
content: "循環變身";
|
||||
content: "循環變身";
|
||||
}
|
||||
|
||||
.control-box .btn-qrcode::before{
|
||||
|
@ -479,36 +486,42 @@
|
|||
content: "生成二維碼:";
|
||||
}
|
||||
|
||||
.formation-from-qrcode::before
|
||||
.formation-from-string::before
|
||||
{
|
||||
content: "從二維碼中讀取的隊伍連結";
|
||||
content: "從字串中讀取的隊伍連結";
|
||||
}
|
||||
label[for="sourceSelect"]::before
|
||||
{
|
||||
content: "視頻源選擇:";
|
||||
content: "視頻源選擇:";
|
||||
}
|
||||
#qr-code-frame .save-qr-img::before
|
||||
{
|
||||
content: "\f0c7 保存二維碼圖片";
|
||||
content: "\f0c7 保存二維碼圖片";
|
||||
}
|
||||
#qr-code-frame .read-qr-camera::before
|
||||
{
|
||||
content: "\f030 使用相機掃描";
|
||||
content: "\f030 使用相機掃描";
|
||||
}
|
||||
#qr-code-frame .read-qr-camera.running::before
|
||||
{
|
||||
content: "\f28d 停止使用相機";
|
||||
content: "\f28d 停止使用相機";
|
||||
}
|
||||
#qr-code-frame .read-qr-file::before
|
||||
{
|
||||
content: "\f1c5 讀取二維碼圖片";
|
||||
content: "\f1c5 讀取二維碼圖片";
|
||||
}
|
||||
#qr-code-frame .read-string::before {
|
||||
content: "\f891 读取字符串";
|
||||
}
|
||||
|
||||
label[for="qr-data-type-pdf"]::before
|
||||
{
|
||||
content: "龍族拼圖隊伍圖製作工具";
|
||||
content: "龍圖急速陣型";
|
||||
}
|
||||
label[for="qr-data-type-pdc"]::before
|
||||
{
|
||||
content: "智龙迷城傷害計算器 (PDC)";
|
||||
content: "龍族拼圖傷害計算器(PDC)";
|
||||
}
|
||||
label[for="qr-data-type-pdchu"]::before {
|
||||
content: "Valeria(pdchu)";
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
localTranslating = {
|
||||
webpage_title: `龍族拼圖${teamsCount}人隊伍圖製作工具`,
|
||||
addition_display: "附加顯示",
|
||||
title_blank: "輸入隊伍標題",
|
||||
detail_blank: "輸入說明",
|
||||
sort_name:{
|
||||
|
@ -10,6 +11,7 @@
|
|||
sort_evoRoot_Attrs : "進化根怪物的屬性",
|
||||
sort_rarity: "稀有度",
|
||||
sort_cost: "消耗",
|
||||
sort_mp: "MP",
|
||||
sort_skillLv1: "技能最大冷卻時間",
|
||||
sort_skillLvMax: "技能最小冷卻時間",
|
||||
sort_hpMax110: "最大 HP",
|
||||
|
|
|
@ -328,7 +328,7 @@
|
|||
content: "使用官方觉醒排序";
|
||||
}
|
||||
.search-box .search-list-length::before{
|
||||
content: "结果数量:";
|
||||
content: "结果数量:";
|
||||
}
|
||||
.search-box .sort-div::before{
|
||||
content: "排序:";
|
||||
|
@ -371,7 +371,8 @@
|
|||
content: "重置";
|
||||
}
|
||||
.search-box .awoken-clear::before,
|
||||
.search-box .sawoken-clear::before
|
||||
.search-box .sawoken-clear::before,
|
||||
.special-div .special-clear::before
|
||||
{
|
||||
content: "清除";
|
||||
}
|
||||
|
@ -381,6 +382,12 @@
|
|||
.search-box .sawoken-div::before{
|
||||
content: "▼超觉醒(OR)";
|
||||
}
|
||||
.search-box .special-div::before{
|
||||
content: "▼特殊搜索";
|
||||
}
|
||||
.special-div .special-add::before {
|
||||
content: "➕";
|
||||
}
|
||||
.control-div .search-start::before{
|
||||
content: "🔍开始搜索";
|
||||
}
|
||||
|
@ -418,52 +425,52 @@
|
|||
.base .evo-type::before,
|
||||
.base .evo-type::after
|
||||
{
|
||||
content: "基礎";
|
||||
content: "基礎";
|
||||
}
|
||||
.evolution .evo-type::before,
|
||||
.evolution .evo-type::after
|
||||
{
|
||||
content: "進化";
|
||||
content: "進化";
|
||||
}
|
||||
.ult-evo .evo-type::before,
|
||||
.ult-evo .evo-type::after
|
||||
{
|
||||
content: "究極進化";
|
||||
content: "究極進化";
|
||||
}
|
||||
.reincarnation .evo-type::before,
|
||||
.reincarnation .evo-type::after
|
||||
{
|
||||
content: "轉生進化";
|
||||
content: "轉生進化";
|
||||
}
|
||||
.pixel-evo .evo-type::before,
|
||||
.pixel-evo .evo-type::after
|
||||
{
|
||||
content: "像素進化";
|
||||
content: "像素進化";
|
||||
}
|
||||
.assist-evo .evo-type::before,
|
||||
.assist-evo .evo-type::after
|
||||
{
|
||||
content: "輔助進化";
|
||||
content: "輔助進化";
|
||||
}
|
||||
.super-reincarnation .evo-type::before,
|
||||
.super-reincarnation .evo-type::after
|
||||
{
|
||||
content: "超轉生進化";
|
||||
content: "超轉生進化";
|
||||
}
|
||||
.super-ult-evo .evo-type::before,
|
||||
.super-ult-evo .evo-type::after
|
||||
{
|
||||
content: "超究極進化";
|
||||
content: "超究極進化";
|
||||
}
|
||||
.henshin .evo-type::before,
|
||||
.henshin .evo-type::after
|
||||
{
|
||||
content: "変身";
|
||||
content: "変身";
|
||||
}
|
||||
.henshin-loop .evo-type::before,
|
||||
.henshin-loop .evo-type::after
|
||||
{
|
||||
content: "循環変身";
|
||||
content: "循環変身";
|
||||
}
|
||||
|
||||
.control-box .btn-qrcode::before{
|
||||
|
@ -479,36 +486,42 @@
|
|||
content: "生成二维码:";
|
||||
}
|
||||
|
||||
.formation-from-qrcode::before
|
||||
.formation-from-string::before
|
||||
{
|
||||
content: "从二维码中读取的队伍链接";
|
||||
content: "从字符串中读取的队伍链接";
|
||||
}
|
||||
label[for="sourceSelect"]::before
|
||||
{
|
||||
content: "视频源选择:";
|
||||
content: "视频源选择:";
|
||||
}
|
||||
#qr-code-frame .save-qr-img::before
|
||||
{
|
||||
content: "\f0c7 保存二维码图片";
|
||||
content: "\f0c7 保存二维码图片";
|
||||
}
|
||||
#qr-code-frame .read-qr-camera::before
|
||||
{
|
||||
content: "\f030 使用相机扫描";
|
||||
content: "\f030 使用相机扫描";
|
||||
}
|
||||
#qr-code-frame .read-qr-camera.running::before
|
||||
{
|
||||
content: "\f28d 停止使用相机";
|
||||
content: "\f28d 停止使用相机";
|
||||
}
|
||||
#qr-code-frame .read-qr-file::before
|
||||
{
|
||||
content: "\f1c5 读取二维码图片";
|
||||
content: "\f1c5 读取二维码图片";
|
||||
}
|
||||
#qr-code-frame .read-string::before {
|
||||
content: "\f891 读取字符串";
|
||||
}
|
||||
|
||||
label[for="qr-data-type-pdf"]::before
|
||||
{
|
||||
content: "智龙迷城队伍图制作工具";
|
||||
content: "智龙急速阵型";
|
||||
}
|
||||
label[for="qr-data-type-pdc"]::before
|
||||
{
|
||||
content: "智龙迷城伤害计算器(PDC)";
|
||||
content: "智龙迷城伤害计算器(PDC)";
|
||||
}
|
||||
label[for="qr-data-type-pdchu"]::before {
|
||||
content: "Valeria(pdchu)";
|
||||
}
|
|
@ -1 +1,26 @@
|
|||
document.title = localTranslating.webpage_title;
|
||||
localTranslating = {
|
||||
webpage_title: `智龙迷城${teamsCount}人队伍图制作工具`,
|
||||
addition_display: "附加显示",
|
||||
title_blank: "输入队伍标题",
|
||||
detail_blank: "输入说明",
|
||||
sort_name:{
|
||||
sort_none: "无",
|
||||
sort_id: "怪物ID",
|
||||
sort_attrs: "属性",
|
||||
sort_evoRootId: "进化树",
|
||||
sort_evoRoot_Attrs : "进化根怪物的属性",
|
||||
sort_rarity: "稀有度",
|
||||
sort_cost: "消耗",
|
||||
sort_mp: "MP",
|
||||
sort_skillLv1: "技能最大冷却时间",
|
||||
sort_skillLvMax: "技能最小冷却时间",
|
||||
sort_hpMax110: "最大 HP",
|
||||
sort_atkMax110: "最大攻击",
|
||||
sort_rcvMax110: "最大回复",
|
||||
sort_hpMax110_awoken: "最大 HP(+觉醒)",
|
||||
sort_atkMax110_awoken: "最大攻击(+觉醒)",
|
||||
sort_rcvMax110_awoken: "最大回复(+觉醒)",
|
||||
sort_abilityIndex_awoken: "最大加权能力指数(+觉醒)",
|
||||
},
|
||||
force_reload_data: "强制刷新数据",
|
||||
}
|
|
@ -1 +1 @@
|
|||
[{"code":"ja","ckey":{"card":"eecd70bf4f222474f96f94f6c124559f","skill":"88598cd8a7056f5f932eb73bad2c7a82"},"updateTime":1626955227792},{"code":"en","ckey":{"card":"f968e7c08d9a708a236e956d7050e05a","skill":"fa1024dd36232eb43c030a2499814960"},"updateTime":1626352490457},{"code":"ko","ckey":{"card":"6b1f4e5b5f428ad3303257ac0b118bf2","skill":"17c7e55b774b6fed3eaea6bc5a0c027d"},"updateTime":1626352490457}]
|
||||
[{"code":"ja","ckey":{"card":"a9a5c763db8bc21d937e8fda0e021f82","skill":"725002e84c36054689659a929f1ebdbc"},"updateTime":1628249264288},{"code":"en","ckey":{"card":"0a0aa693ecc46fd263b8192b617f468a","skill":"456926fb7cd424120cbe220d248d1fa4"},"updateTime":1628249264288},{"code":"ko","ckey":{"card":"d28ac79158b25e6407bb8a964fa3bc85","skill":"8a4a72bc42cc25b27911a9fbc6be63bf"},"updateTime":1628249264288}]
|
12
multi.html
|
@ -918,6 +918,13 @@ var formation = new Formation(teamsCount,5);
|
|||
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="81" id="search-awoken-81" /><label class="awoken-icon" data-awoken-icon="81" for="search-awoken-81"></label><!--5色--></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="special-div">
|
||||
<button class="special-add brown-button"></button>
|
||||
<button class="special-clear brown-button"></button>
|
||||
<ul class="special-filter-list">
|
||||
<li><select class="special-filter"></select></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="control-div"><!--控制栏-->
|
||||
<button class="search-start"><!--开始搜索--></button>
|
||||
<button class="search-close"><!--关闭搜索--></button>
|
||||
|
@ -1153,6 +1160,10 @@ var formation = new Formation(teamsCount,5);
|
|||
<div class="mask-content">
|
||||
<div class="read-qr-box">
|
||||
<div class="action-button-box">
|
||||
<div class="read-text-box">
|
||||
<input class="string-input" type="text"/>
|
||||
<button class="read-string brown-button"><!--读字符串--></button>
|
||||
</div>
|
||||
<button class="read-qr-camera brown-button"><!--相机扫--></button>
|
||||
<button class="read-qr-file brown-button"><!--读文件--></button>
|
||||
<input type="file" accept="image/*" class="file-select display-none">
|
||||
|
@ -1168,6 +1179,7 @@ var formation = new Formation(teamsCount,5);
|
|||
<li><input type="radio" name="qr-data-type" class="qr-data-type-radio" value="pdf" id="qr-data-type-pdf" checked/><label for="qr-data-type-pdf"></label></li><!--本程序
|
||||
--><li><input type="radio" name="qr-data-type" class="qr-data-type-radio" value="pdc" id="qr-data-type-pdc" /><label for="qr-data-type-pdc"></label></li><!--PDC-->
|
||||
</ul>
|
||||
<input class="string-output" type="text" readonly/>
|
||||
<div class="qr-box"><img class="qr-code-image" /></div>
|
||||
<a download="" class="save-qr-img brown-button"><!--保存QR 图片--></a>
|
||||
</div>
|
||||
|
|
2615
script-json_data.js
|
@ -765,9 +765,9 @@ function getCardLeaderSkills(card, skillTypes) {
|
|||
return getActuallySkills(Skills[card.leaderSkillId], skillTypes, false);
|
||||
}
|
||||
//返回卡片的主动技能
|
||||
function getCardActiveSkills(card, skillTypes) {
|
||||
function getCardActiveSkills(card, skillTypes, searchRandom = false) {
|
||||
if (!card) return [];
|
||||
return getActuallySkills(Skills[card.activeSkillId], skillTypes, false);
|
||||
return getActuallySkills(Skills[card.activeSkillId], skillTypes, searchRandom);
|
||||
}
|
||||
//查找到真正起作用的那一个技能
|
||||
function getActuallySkills(skill, skillTypes, searchRandom = true) {
|
||||
|
@ -823,54 +823,55 @@ function tIf_Effect_poisonNoEffect(leader1id, leader2id) {
|
|||
}
|
||||
//计算队伍的+C
|
||||
function tIf_Effect_addCombo(leader1id, leader2id) {
|
||||
return [
|
||||
getSkillAddCombo(Cards[leader1id]),
|
||||
getSkillAddCombo(Cards[leader2id])
|
||||
];
|
||||
}
|
||||
function getSkillAddCombo(card) {
|
||||
const searchTypeArray = [192, 194, 206, 209, 210, 219, 220];
|
||||
const ls1 = getCardLeaderSkills(Cards[leader1id], searchTypeArray)[0];
|
||||
const ls2 = getCardLeaderSkills(Cards[leader2id], searchTypeArray)[0];
|
||||
|
||||
function getSkillAddCombo(skill) {
|
||||
if (!skill) return 0;
|
||||
switch (skill.type) {
|
||||
case 192:
|
||||
case 194:
|
||||
return skill.params[3];
|
||||
case 206:
|
||||
return skill.params[6];
|
||||
case 209:
|
||||
return skill.params[0];
|
||||
case 210:
|
||||
case 219:
|
||||
return skill.params[2];
|
||||
case 220:
|
||||
return skill.params[1];
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
const skill = getCardLeaderSkills(card, searchTypeArray)[0];
|
||||
if (!skill) return 0;
|
||||
switch (skill.type) {
|
||||
case 192:
|
||||
case 194:
|
||||
return skill.params[3];
|
||||
case 206:
|
||||
return skill.params[6];
|
||||
case 209:
|
||||
return skill.params[0];
|
||||
case 210:
|
||||
case 219:
|
||||
return skill.params[2];
|
||||
case 220:
|
||||
return skill.params[1];
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return [getSkillAddCombo(ls1), getSkillAddCombo(ls2)];
|
||||
}
|
||||
//计算队伍的追打
|
||||
function tIf_Effect_inflicts(leader1id, leader2id) {
|
||||
const searchTypeArray = [199, 200, 201, 223];
|
||||
const ls1 = getCardLeaderSkills(Cards[leader1id], searchTypeArray)[0];
|
||||
const ls2 = getCardLeaderSkills(Cards[leader2id], searchTypeArray)[0];
|
||||
|
||||
function getSkillFixedDamage(skill) {
|
||||
if (!skill) return 0;
|
||||
switch (skill.type) {
|
||||
case 199:
|
||||
case 200:
|
||||
return skill.params[2];
|
||||
case 201:
|
||||
return skill.params[5];
|
||||
case 223:
|
||||
return skill.params[1];
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return [
|
||||
getSkillFixedDamage(Cards[leader1id]),
|
||||
getSkillFixedDamage(Cards[leader2id])
|
||||
];
|
||||
}
|
||||
function getSkillFixedDamage(card) {
|
||||
const searchTypeArray = [199, 200, 201, 223];
|
||||
const skill = getCardLeaderSkills(card, searchTypeArray)[0];
|
||||
if (!skill) return 0;
|
||||
switch (skill.type) {
|
||||
case 199:
|
||||
case 200:
|
||||
return skill.params[2];
|
||||
case 201:
|
||||
return skill.params[5];
|
||||
case 223:
|
||||
return skill.params[1];
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return [getSkillFixedDamage(ls1), getSkillFixedDamage(ls2)];
|
||||
}
|
||||
//计算队伍操作时间
|
||||
function countMoveTime(team, leader1id, leader2id, teamIdx) {
|
||||
|
|
263
script.js
|
@ -27,6 +27,7 @@ if (location.search.includes('&')) {
|
|||
}
|
||||
let localTranslating = {
|
||||
webpage_title: `智龙迷城${teamsCount}人队伍图制作工具`,
|
||||
addition_display: "💬",
|
||||
}
|
||||
|
||||
//一开始就加载当前语言
|
||||
|
@ -328,12 +329,12 @@ Formation.prototype.loadObj = function(f) {
|
|||
if (f.b)
|
||||
this.teams[0][2] = f.b; //原来模式的徽章
|
||||
};
|
||||
Formation.prototype.getPdfQrObj = function(keepSource = true)
|
||||
Formation.prototype.getPdfQrObj = function(keepDataSource = true)
|
||||
{
|
||||
let qrObj = {
|
||||
d:this.outObj()
|
||||
};
|
||||
if (keepSource) qrObj.s = currentDataSource.code;
|
||||
if (keepDataSource) qrObj.s = currentDataSource.code;
|
||||
return qrObj;
|
||||
}
|
||||
Formation.prototype.getPdcQrStr = function()
|
||||
|
@ -384,16 +385,17 @@ Formation.prototype.getPdcQrStr = function()
|
|||
{
|
||||
if (membersArr[i].id > 0 || assistArr[i].id > 0)
|
||||
{
|
||||
let pdcMemberArr = Array.from(genMemberMap(membersArr[i], assistArr[i], (arr.length == 2 && idx == 1) ? i+1 : i)); //2人协力时,队伍2编号0是空的
|
||||
let pdcMemberMap = genMemberMap(membersArr[i], assistArr[i], (arr.length == 2 && idx == 1) ? i+1 : i); //2人协力时,队伍2编号0是空的
|
||||
let pdcMemberArr = Array.from(pdcMemberMap);
|
||||
pdcMemberStr = pdcMemberArr.map(item => {
|
||||
if (item[1] == undefined)
|
||||
{
|
||||
console.log(item[0])
|
||||
return null;
|
||||
}
|
||||
return [
|
||||
item[0].toString(36).prefix(2),
|
||||
item[1].toString(36).prefix(2)
|
||||
].join('')}).join(',');
|
||||
].join('')}).filter(item=>item).join(',');
|
||||
teamArr.push(pdcMemberStr);
|
||||
}
|
||||
}
|
||||
|
@ -694,8 +696,8 @@ ${navigator.userAgent}`);
|
|||
document.body.classList.add('guide-mod');
|
||||
}
|
||||
|
||||
const helpLink = controlBox.querySelector(".help-link");
|
||||
if (location.hostname.includes("gitee")) { helpLink.hostname = "gitee.com"; }
|
||||
//const helpLink = controlBox.querySelector(".help-link");
|
||||
//if (location.hostname.includes("gitee")) { helpLink.hostname = "gitee.com"; }
|
||||
|
||||
//▼添加语言列表开始
|
||||
const langSelectDom = controlBox.querySelector(".languages");
|
||||
|
@ -1121,83 +1123,85 @@ function inputFromQrString(string)
|
|||
re.message = "错误的 JSON 格式 | The illegal JSON format";
|
||||
}
|
||||
}
|
||||
else if (/^http/i.test(string))
|
||||
else if (/^(https?|file):\/\//i.test(string))
|
||||
{
|
||||
try{
|
||||
let url = new URL(string);
|
||||
if (url.searchParams.get('d'))
|
||||
{
|
||||
re.code = 1;
|
||||
re.message = "发现队伍数据 | Formation data founded";
|
||||
let url = new URL(string);
|
||||
if (url.searchParams.get('d'))
|
||||
{
|
||||
try{
|
||||
let jo = {
|
||||
d: JSON.parse(url.searchParams.get('d')),
|
||||
s: url.searchParams.get('s'),
|
||||
}
|
||||
re.code = 1;
|
||||
re.message = "发现队伍数据 | Formation data founded";
|
||||
re.url = ObjToUrl(jo);
|
||||
}else
|
||||
}catch(e)
|
||||
{
|
||||
re.code = 100;
|
||||
re.message = "无队伍数据 | No formation data";
|
||||
re.code = 112;
|
||||
re.message = "错误的 网址 格式 | The illegal URL format";
|
||||
}
|
||||
}catch(e)
|
||||
}
|
||||
else
|
||||
{
|
||||
re.code = 112;
|
||||
re.message = "错误的 网址 格式 | The illegal URL format";
|
||||
re.code = 100;
|
||||
re.message = "无队伍数据 | No formation data";
|
||||
}
|
||||
}
|
||||
else if(/^\d[\d\-\w,\]}]+}/.test(string))
|
||||
{ //PDC
|
||||
re.code = 2;
|
||||
re.message = "发现 PDC 二维码 | PDC QR code found";
|
||||
const pdcFotmation = readPDC(string);
|
||||
const newFotmation = pdcFotmationToPdfFotmation(pdcFotmation);
|
||||
re.message = "发现 PDC 格式 | PDC format found";
|
||||
const newFotmation = pdcFotmationToPdfFotmation(string);
|
||||
re.url = ObjToUrl(newFotmation.getPdfQrObj(false));
|
||||
}
|
||||
else
|
||||
{
|
||||
re.code = 110;
|
||||
re.message = "不是 JSON 格式 | Not JSON format";
|
||||
re.message = "不支持的格式 | Unsupported format";
|
||||
}
|
||||
return re;
|
||||
}
|
||||
|
||||
//解析PDC的数据
|
||||
function readPDC(string)
|
||||
function pdcFotmationToPdfFotmation(inputString)
|
||||
{
|
||||
let teamsStr = string.split("]");
|
||||
let baseInfo = teamsStr.shift().split(",");
|
||||
let teamsArr = teamsStr.map(teamStr=>
|
||||
{
|
||||
let membersStr = teamStr.split("}").filter(Boolean);
|
||||
const team = {
|
||||
badge: parseInt(membersStr.shift(),10) //徽章是10进制
|
||||
}
|
||||
team.members = membersStr.map(memberStr=>{
|
||||
let memberArr = memberStr.split(",").map(valueStr=>{
|
||||
let idx = parseInt(valueStr.substr(0,2),36);
|
||||
let value = valueStr.substr(2);
|
||||
if (idx !== 2)
|
||||
{
|
||||
value = parseInt(value,36);
|
||||
}else
|
||||
{
|
||||
value = value.split(/(\w{2})/).filter(Boolean).map(v=>parseInt(v,36));
|
||||
}
|
||||
return [idx, value];
|
||||
function readPDC(string)
|
||||
{
|
||||
let teamsStr = string.split(']');
|
||||
let baseInfo = teamsStr.shift().split(',');
|
||||
let teamsArr = teamsStr.map(teamStr=>
|
||||
{
|
||||
let membersStr = teamStr.split('}').filter(Boolean);
|
||||
const team = {
|
||||
badge: parseInt(membersStr.shift(),10) //徽章是10进制
|
||||
}
|
||||
team.members = membersStr.map(memberStr=>{
|
||||
let memberArr = memberStr.split(',').map(valueStr=>{
|
||||
let idx = parseInt(valueStr.substr(0,2),36);
|
||||
let value = valueStr.substr(2);
|
||||
if (idx !== 2)
|
||||
{
|
||||
value = parseInt(value,36);
|
||||
}else
|
||||
{
|
||||
value = value.split(/(\w{2})/).filter(Boolean).map(v=>parseInt(v,36));
|
||||
}
|
||||
return [idx, value];
|
||||
});
|
||||
return new Map(memberArr);
|
||||
});
|
||||
return new Map(memberArr);
|
||||
});
|
||||
return team;
|
||||
return team;
|
||||
}
|
||||
);
|
||||
let pdcFotmation = {
|
||||
version: parseInt(baseInfo[0],10),
|
||||
teamCount: parseInt(baseInfo[1],10)+1,
|
||||
teams: teamsArr
|
||||
}
|
||||
);
|
||||
let pdcFotmation = {
|
||||
version: parseInt(baseInfo[0],10),
|
||||
teamCount: parseInt(baseInfo[1],10)+1,
|
||||
teams: teamsArr
|
||||
return pdcFotmation;
|
||||
}
|
||||
return pdcFotmation;
|
||||
}
|
||||
function pdcFotmationToPdfFotmation(pdcFotmation)
|
||||
{
|
||||
let pdcFotmation = readPDC(inputString);
|
||||
const f = new Formation(pdcFotmation.teamCount, pdcFotmation.teamCount == 2 ? 5 : 6);
|
||||
if (pdcFotmation.teamCount == 2)
|
||||
{
|
||||
|
@ -1234,8 +1238,9 @@ function pdcFotmationToPdfFotmation(pdcFotmation)
|
|||
a.plus[0] = member.get(11) || 0;
|
||||
a.plus[1] = member.get(12) || 0;
|
||||
a.plus[2] = member.get(13) || 0;
|
||||
|
||||
m.awoken = member.get(7) >= 0 ? member.get(7) : Cards[m.id].awakenings.length;
|
||||
a.awoken = member.get(14) >= 0 ? member.get(14) : Cards[a.id].awakenings.length;
|
||||
a.awoken = member.get(14) >= 0 ? member.get(14) : (a.id > 0 ? Cards[a.id].awakenings.length : 0);
|
||||
m.sawoken = member.get(8) ? Cards[m.id].superAwakenings.indexOf(member.get(8)) : null;
|
||||
});
|
||||
});
|
||||
|
@ -1299,7 +1304,8 @@ function initialize() {
|
|||
readBox.videoBox.classList.add(className_displayNone);
|
||||
this.classList.remove(className_displayNone);
|
||||
|
||||
this.refreshQrCode(formation.getQrStr(saveBox.qrDataType.find(radio=>radio.checked).value));
|
||||
let qrTypeRadio = saveBox.qrDataType.find(radio=>radio.checked);
|
||||
if (qrTypeRadio) qrTypeRadio.onclick(); //打开二维码窗口就先产生二维码
|
||||
};
|
||||
qrCodeFrame.hide = function(){
|
||||
qrcodeReader.reset();
|
||||
|
@ -1311,6 +1317,7 @@ function initialize() {
|
|||
const qrContent = qrCodeFrame.content = qrCodeFrame.querySelector(".mask-content");
|
||||
const qrReadBox = qrContent.readBox = qrContent.querySelector(".read-qr-box");
|
||||
const qrSaveBox = qrContent.saveBox = qrContent.querySelector(".save-qr-box");
|
||||
qrReadBox.readString = qrReadBox.querySelector(".read-string");
|
||||
qrReadBox.readQrCamera = qrReadBox.querySelector(".read-qr-camera");
|
||||
qrReadBox.readQrFile = qrReadBox.querySelector(".read-qr-file");
|
||||
qrReadBox.filePicker = qrReadBox.querySelector(".file-select");
|
||||
|
@ -1318,11 +1325,35 @@ function initialize() {
|
|||
qrReadBox.video = qrReadBox.querySelector("#video");
|
||||
qrReadBox.videoBox = qrReadBox.querySelector(".video-box");
|
||||
qrReadBox.sourceSelect = qrReadBox.querySelector("#sourceSelect");
|
||||
qrReadBox.qrStr = qrReadBox.querySelector(".string-input");
|
||||
qrReadBox.readString.onclick = function()
|
||||
{
|
||||
let inputResult = inputFromQrString(qrReadBox.qrStr.value);
|
||||
if (inputResult.code < 100)
|
||||
{
|
||||
qrReadBox.info.textContent = 'Code ' + inputResult.code + ':' + inputResult.message;
|
||||
const newLink = document.createElement("a");
|
||||
newLink.className = "formation-from-string";
|
||||
newLink.href = inputResult.url;
|
||||
newLink.target = "_blank";
|
||||
qrReadBox.info.appendChild(newLink);
|
||||
}else
|
||||
{
|
||||
qrReadBox.info.textContent = 'Code ' + inputResult.code + ':' + inputResult.message;
|
||||
}
|
||||
}
|
||||
|
||||
qrSaveBox.qrImage = qrSaveBox.querySelector(".qr-code-image");
|
||||
qrSaveBox.qrStr = qrSaveBox.querySelector(".string-output");
|
||||
qrSaveBox.qrStr.onchange = function()
|
||||
{
|
||||
qrCodeFrame.refreshQrCode(this.value);
|
||||
}
|
||||
qrSaveBox.qrDataType = Array.from(qrSaveBox.querySelectorAll(".qr-data-type-radio"));
|
||||
qrSaveBox.qrDataType.forEach(radio=>radio.onclick = function(){
|
||||
qrCodeFrame.refreshQrCode(formation.getQrStr(this.value));
|
||||
let qrstr = formation.getQrStr(this.value);
|
||||
qrSaveBox.qrStr.value = qrstr;
|
||||
qrSaveBox.qrStr.onchange();
|
||||
});
|
||||
qrSaveBox.saveQrImg = qrSaveBox.querySelector(".save-qr-img");
|
||||
|
||||
|
@ -1395,18 +1426,9 @@ function initialize() {
|
|||
const file = myFiles[0];
|
||||
loadImage(URL.createObjectURL(file)).then(function(img) {
|
||||
qrcodeReader.decodeFromImage(img).then((result) => {
|
||||
console.log('Found QR code!', result);
|
||||
let inputResult = inputFromQrString(result.text);
|
||||
|
||||
qrReadBox.info.textContent = 'Code ' + inputResult.code + ':' + inputResult.message;
|
||||
if (inputResult.code < 100)
|
||||
{
|
||||
const newLink = document.createElement("a");
|
||||
newLink.className = "formation-from-qrcode";
|
||||
newLink.href = inputResult.url;
|
||||
newLink.target = "_blank";
|
||||
qrReadBox.info.appendChild(newLink);
|
||||
}
|
||||
console.debug('Found QR code!', result);
|
||||
qrReadBox.qrStr.value = result.text;
|
||||
qrReadBox.readString.onclick();
|
||||
}).catch((err) => {
|
||||
console.error(err);
|
||||
if (err) {
|
||||
|
@ -1423,9 +1445,9 @@ function initialize() {
|
|||
}
|
||||
}
|
||||
})
|
||||
console.log(`Started decode for image from ${img.src}`)
|
||||
console.debug(`Started decode for image from ${img.src}`)
|
||||
}, function(err) {
|
||||
console.log(err);
|
||||
console.debug(err);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1439,41 +1461,27 @@ function initialize() {
|
|||
}
|
||||
}else
|
||||
{
|
||||
|
||||
function scanContinuously()
|
||||
{
|
||||
qrcodeReader.decodeFromInputVideoDeviceContinuously(selectedDeviceId, 'video', (result, err) => {
|
||||
if (result) {
|
||||
// properly decoded qr code
|
||||
console.log('Found QR code!', result);
|
||||
let inputResult = inputFromQrString(result.text);
|
||||
|
||||
if (inputResult.code < 100)
|
||||
{ //成功后就关闭
|
||||
qrReadBox.readQrCamera.onclick();
|
||||
qrReadBox.info.textContent = 'Code ' + inputResult.code + ':' + inputResult.message;
|
||||
const newLink = document.createElement("a");
|
||||
newLink.className = "formation-from-qrcode";
|
||||
newLink.href = inputResult.url;
|
||||
newLink.target = "_blank";
|
||||
qrReadBox.info.appendChild(newLink);
|
||||
}else
|
||||
{
|
||||
qrReadBox.info.textContent = 'Code ' + inputResult.code + ':' + inputResult.message;
|
||||
}
|
||||
console.debug('Found QR code!', result);
|
||||
qrReadBox.qrStr.value = result.text;
|
||||
qrReadBox.readString.onclick();
|
||||
}
|
||||
|
||||
if (err) {
|
||||
if (err instanceof ZXing.NotFoundException) {
|
||||
console.log('No QR code found.')
|
||||
console.debug('No QR code found.')
|
||||
}
|
||||
|
||||
if (err instanceof ZXing.ChecksumException) {
|
||||
console.log('A code was found, but it\'s read value was not valid.')
|
||||
console.debug('A code was found, but it\'s read value was not valid.')
|
||||
}
|
||||
|
||||
if (err instanceof ZXing.FormatException) {
|
||||
console.log('A code was found, but it was in a invalid format.')
|
||||
console.debug('A code was found, but it was in a invalid format.')
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -2339,6 +2347,52 @@ function initialize() {
|
|||
});
|
||||
};
|
||||
|
||||
//特殊搜索部分
|
||||
const s_specialDiv = searchBox.querySelector(".special-div");
|
||||
const specialAdd = s_specialDiv.querySelector(".special-add");
|
||||
const specialClear = s_specialDiv.querySelector(".special-clear");
|
||||
const specialFilterUl = s_specialDiv.querySelector(".special-filter-list");
|
||||
const specialFilterFirstLi = specialFilterUl.querySelector("li");
|
||||
const specialFirstSelect = specialFilterFirstLi.querySelector(".special-filter");
|
||||
|
||||
function newSpecialSearchOption(func, idx1, idx2)
|
||||
{
|
||||
const funcName = returnMonsterNameArr(func, currentLanguage.searchlist, currentDataSource.code)[0];
|
||||
return new Option(funcName + (func.addition ? " " + localTranslating.addition_display : ""), idx1 + (idx2 != null ? "|" + idx2 : ""));
|
||||
}
|
||||
specialSearchFunctions.forEach((sfunc,idx)=>{
|
||||
if (sfunc.group)
|
||||
{
|
||||
const groupName = returnMonsterNameArr(sfunc, currentLanguage.searchlist, currentDataSource.code)[0];
|
||||
const optgroup = specialFirstSelect.appendChild(document.createElement("optgroup"));
|
||||
optgroup.label = groupName;
|
||||
if (sfunc.functions)
|
||||
{
|
||||
sfunc.functions.forEach((_sfunc,_idx)=>{
|
||||
optgroup.appendChild(newSpecialSearchOption(_sfunc, idx, _idx));
|
||||
});
|
||||
}
|
||||
}else
|
||||
{
|
||||
specialFirstSelect.options.add(newSpecialSearchOption(sfunc, idx));
|
||||
}
|
||||
});
|
||||
specialAdd.onclick = function()
|
||||
{
|
||||
specialFilterUl.appendChild(specialFilterFirstLi.cloneNode(true));
|
||||
}
|
||||
specialAdd.onclick(); //先运行一次产生两个
|
||||
specialClear.onclick = function()
|
||||
{
|
||||
/*for (let ci = specialFilterUl.children.length-1; ci>0; ci--)
|
||||
{
|
||||
specialFilterUl.children[ci].remove();
|
||||
}*/
|
||||
specialFilterUl.innerHTML = "";
|
||||
specialFilterUl.appendChild(specialFilterFirstLi);
|
||||
specialFirstSelect.selectedIndex = 0;
|
||||
}
|
||||
|
||||
const s_controlDiv = searchBox.querySelector(".control-div");
|
||||
const searchStart = s_controlDiv.querySelector(".search-start");
|
||||
const searchClose = s_controlDiv.querySelector(".search-close");
|
||||
|
@ -2394,7 +2448,7 @@ function initialize() {
|
|||
showAbilitiesWithAwoken: s_add_show_abilities_with_awoken.checked,
|
||||
customAddition: typeof customAdditionalFunction == "function" ?
|
||||
[customAdditionalFunction] :
|
||||
(Array.isArray(customAdditionalFunction) ? customAdditionalFunction : null)
|
||||
(Array.isArray(customAdditionalFunction) ? customAdditionalFunction : [])
|
||||
};
|
||||
searchMonList.originalHeads = searchArr.map(card => createCardHead(card.id, additionalOption));
|
||||
searchMonList.customAddition = additionalOption.customAddition;
|
||||
|
@ -2426,6 +2480,7 @@ function initialize() {
|
|||
s_add_show_abilities_with_awoken.onchange = reShowSearch;
|
||||
|
||||
const startSearch = function(cards, customAdditionalFunction) {
|
||||
if (customAdditionalFunction == undefined) customAdditionalFunction = [];
|
||||
const attr1Filter = s_attr1s.filter(returnCheckedInput).map(returnInputValue);
|
||||
const attr2Filter = s_attr2s.filter(returnCheckedInput).map(returnInputValue);
|
||||
let attr1, attr2;
|
||||
|
@ -2456,7 +2511,7 @@ function initialize() {
|
|||
num: parseInt(btn.getAttribute("data-awoken-count"), 10)
|
||||
};
|
||||
});
|
||||
const searchResult = searchCards(cards,
|
||||
let searchResult = searchCards(cards,
|
||||
attr1, attr2,
|
||||
s_fixMainColor.checked,
|
||||
typesFilter,
|
||||
|
@ -2467,7 +2522,20 @@ function initialize() {
|
|||
s_awokensEquivalent.checked,
|
||||
s_includeSuperAwoken.checked
|
||||
);
|
||||
//console.log("搜索结果", searchResult);
|
||||
|
||||
//进行特殊附加搜索
|
||||
const specialFilters = Array.from(specialFilterUl.querySelectorAll(".special-filter")).map(select=>{
|
||||
const indexs = select.value.split("|").map(Number);
|
||||
const funcObj = indexs.length > 1 ? specialSearchFunctions[indexs[0]].functions[indexs[1]] : specialSearchFunctions[indexs[0]];
|
||||
return funcObj;
|
||||
});
|
||||
searchResult = specialFilters.reduce((pre,funcObj)=>
|
||||
{
|
||||
if (!funcObj) return pre;
|
||||
if (funcObj.addition) customAdditionalFunction.push(funcObj.addition); //如果有附加显示,则添加到列表
|
||||
return funcObj.function(pre); //结果进一步筛选
|
||||
}, searchResult);
|
||||
|
||||
showSearch(searchResult, customAdditionalFunction);
|
||||
};
|
||||
searchBox.startSearch = startSearch;
|
||||
|
@ -2488,6 +2556,7 @@ function initialize() {
|
|||
|
||||
awokenClear.onclick();
|
||||
sawokenClear.onclick();
|
||||
specialClear.onclick();
|
||||
|
||||
searchMonList.originalHeads = null;
|
||||
searchResultCount.setAttribute("data-search-result-count", 0);
|
||||
|
|
12
solo.html
|
@ -772,6 +772,13 @@ var formation = new Formation(teamsCount,6);
|
|||
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="81" id="search-awoken-81" /><label class="awoken-icon" data-awoken-icon="81" for="search-awoken-81"></label><!--5色--></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="special-div">
|
||||
<button class="special-add brown-button"></button>
|
||||
<button class="special-clear brown-button"></button>
|
||||
<ul class="special-filter-list">
|
||||
<li><select class="special-filter"></select></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="control-div"><!--控制栏-->
|
||||
<button class="search-start"><!--开始搜索--></button>
|
||||
<button class="search-close"><!--关闭搜索--></button>
|
||||
|
@ -1007,6 +1014,10 @@ var formation = new Formation(teamsCount,6);
|
|||
<div class="mask-content">
|
||||
<div class="read-qr-box">
|
||||
<div class="action-button-box">
|
||||
<div class="read-text-box">
|
||||
<input class="string-input" type="text"/>
|
||||
<button class="read-string brown-button"><!--读字符串--></button>
|
||||
</div>
|
||||
<button class="read-qr-camera brown-button"><!--相机扫--></button>
|
||||
<button class="read-qr-file brown-button"><!--读文件--></button>
|
||||
<input type="file" accept="image/*" class="file-select display-none">
|
||||
|
@ -1022,6 +1033,7 @@ var formation = new Formation(teamsCount,6);
|
|||
<li><input type="radio" name="qr-data-type" class="qr-data-type-radio" value="pdf" id="qr-data-type-pdf" checked/><label for="qr-data-type-pdf"></label></li><!--本程序
|
||||
--><li><input type="radio" name="qr-data-type" class="qr-data-type-radio" value="pdc" id="qr-data-type-pdc" /><label for="qr-data-type-pdc"></label></li><!--PDC-->
|
||||
</ul>
|
||||
<input class="string-output" type="text" readonly/>
|
||||
<div class="qr-box"><img class="qr-code-image" /></div>
|
||||
<a download="" class="save-qr-img brown-button"><!--保存QR 图片--></a>
|
||||
</div>
|
||||
|
|
42
style.css
|
@ -1374,7 +1374,8 @@ icon.inflicts::after
|
|||
margin: 0.5px !important;
|
||||
}
|
||||
.awoken-preview .awoken-icon,
|
||||
.custom-addition .awoken-icon
|
||||
.custom-addition .awoken-icon,
|
||||
.custom-addition .type-icon
|
||||
{
|
||||
filter: unset;
|
||||
transform: scale(0.75);
|
||||
|
@ -1687,7 +1688,9 @@ icon.inflicts::after
|
|||
}
|
||||
.search-box .rare-clear::before,
|
||||
.search-box .awoken-clear::before,
|
||||
.search-box .sawoken-clear::before
|
||||
.search-box .sawoken-clear::before,
|
||||
.search-box .special-add::before,
|
||||
.search-box .special-clear::before
|
||||
{
|
||||
width: 80px;
|
||||
background-size: 100px 100px;
|
||||
|
@ -1698,7 +1701,9 @@ icon.inflicts::after
|
|||
padding: 0;
|
||||
vertical-align: top;
|
||||
}
|
||||
.search-box .sawoken-clear::before
|
||||
.search-box .sawoken-clear::before,
|
||||
.search-box .special-add::before,
|
||||
.search-box .special-clear::before
|
||||
{
|
||||
width: 50px;
|
||||
font-size: 14px;
|
||||
|
@ -1831,6 +1836,17 @@ icon.inflicts::after
|
|||
margin-top: 5px;
|
||||
}
|
||||
|
||||
|
||||
.special-filter-list>li{
|
||||
margin-bottom: 5px;
|
||||
margin-right: 3px;
|
||||
}
|
||||
.special-filter-list select{
|
||||
font-size: 20px;
|
||||
max-width: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.control-div button{
|
||||
font-size: 20px;
|
||||
}
|
||||
|
@ -2938,6 +2954,24 @@ table .orb-icon
|
|||
{
|
||||
color: white;
|
||||
}
|
||||
#qr-code-frame .string-input
|
||||
{
|
||||
width: calc(100% - 170px);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
#qr-code-frame .string-output
|
||||
{
|
||||
width: calc(100% - 20px);
|
||||
}
|
||||
#qr-code-frame .qr-box
|
||||
{
|
||||
margin: 5px;
|
||||
}
|
||||
.save-qr-box
|
||||
{
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
.read-qr-box::before,
|
||||
.save-qr-box::before
|
||||
{
|
||||
|
@ -2954,7 +2988,7 @@ table .orb-icon
|
|||
font-size: 20px;
|
||||
padding: 5px;
|
||||
}
|
||||
.formation-from-qrcode
|
||||
.formation-from-string
|
||||
{
|
||||
font-size: 1.5em;
|
||||
display: block;
|
||||
|
|
12
triple.html
|
@ -1705,6 +1705,13 @@ var formation = new Formation(teamsCount,6);
|
|||
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="81" id="search-awoken-81" /><label class="awoken-icon" data-awoken-icon="81" for="search-awoken-81"></label><!--5色--></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="special-div">
|
||||
<button class="special-add brown-button"></button>
|
||||
<button class="special-clear brown-button"></button>
|
||||
<ul class="special-filter-list">
|
||||
<li><select class="special-filter"></select></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="control-div"><!--控制栏-->
|
||||
<button class="search-start"><!--开始搜索--></button>
|
||||
<button class="search-close"><!--关闭搜索--></button>
|
||||
|
@ -1940,6 +1947,10 @@ var formation = new Formation(teamsCount,6);
|
|||
<div class="mask-content">
|
||||
<div class="read-qr-box">
|
||||
<div class="action-button-box">
|
||||
<div class="read-text-box">
|
||||
<input class="string-input" type="text"/>
|
||||
<button class="read-string brown-button"><!--读字符串--></button>
|
||||
</div>
|
||||
<button class="read-qr-camera brown-button"><!--相机扫--></button>
|
||||
<button class="read-qr-file brown-button"><!--读文件--></button>
|
||||
<input type="file" accept="image/*" class="file-select display-none">
|
||||
|
@ -1955,6 +1966,7 @@ var formation = new Formation(teamsCount,6);
|
|||
<li><input type="radio" name="qr-data-type" class="qr-data-type-radio" value="pdf" id="qr-data-type-pdf" checked/><label for="qr-data-type-pdf"></label></li><!--本程序
|
||||
--><li><input type="radio" name="qr-data-type" class="qr-data-type-radio" value="pdc" id="qr-data-type-pdc" /><label for="qr-data-type-pdc"></label></li><!--PDC-->
|
||||
</ul>
|
||||
<input class="string-output" type="text" readonly/>
|
||||
<div class="qr-box"><img class="qr-code-image" /></div>
|
||||
<a download="" class="save-qr-img brown-button"><!--保存QR 图片--></a>
|
||||
</div>
|
||||
|
|