Merge branch 'master' into skillParser

# Conflicts:
#	languages/en.css
#	languages/ko.css
#	languages/zh-CN.js
#	script-universal_function.js
#	script.js
#	style.css
This commit is contained in:
枫谷剑仙 2021-07-20 14:04:18 +08:00
commit d7e6d9b1e7
110 changed files with 6852 additions and 357 deletions

View File

@ -1,16 +1,12 @@
智龙迷城队伍图制作工具 | Puzzle & Dragons Formation Maker
智龙急速阵型 | P&D Dash Formation
======
个工具可以帮助你方便的制作和分享车队阵型或单人队形。易用的编辑界面,电脑、手机上都可以轻松使用。
This tool can help you easily create and share Swipe Formation or Solo Formation. Easy to use editing interface and use on your PC and Phone.
是一个智龙迷城队伍图制作工具。
This is a Puzzle & Dragons Formation Maker.
### 目前支持的语言 | Supported Languages
1. 中文(简体)
1. 中文(繁體)
1. English
1. 日本語 (by Bing Microsoft Translator)
1. 한국어 (by Bing Microsoft Translator)
这个工具可以帮助你方便的制作和分享车队阵型或单人队形。电脑、智能手机上都可以轻松使用。
This tool can help you easily create and share Swipe Formation or Solo Formation. Easy to use on your PC and Smart Phone.
### 预览 \| Preview
### 预览 | Preview
| **单人 \| Solo** | **2人协力 \| 2P** |
| :---: | :---: |
@ -18,19 +14,13 @@ This tool can help you easily create and share Swipe Formation or Solo Formation
| **3人协力 \| 3P** | **手机 \| Mobile** |
| ![3人协力界面预览](document/preview-capture-3p.png) | ![手机端预览](document/preview-mobile.jpg) |
# 如何使用 | HOW TO USE
## 快速使用在线版 | Online Quick Start
* <https://mapaler.github.io/PADDashFormation/> (Github Pages)
[![](https://www.mozilla.org/media/img/firefox/favicon.ico)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
* http://mapaler.gitee.io/paddashformation/ (码云的镜象,国内用这个更快 | Chinese mirror)
* <https://mapaler.gitee.io/paddashformation/> (码云的镜象,国内用这个更快 | Chinese mirror)
手机上使用 [![](https://www.mozilla.org/media/img/firefox/favicon.ico)火狐浏览器](https://www.mozilla.org/firefox/new/) 具有更好的性能Chrome 卡死了。
### 示例链接 | Sample Link
* [单人示例](http://mapaler.gitee.io/paddashformation/solo.html?d={"t"%3A"千鸟^ff3600^【7×6版面】^p换队长打里·异形"%2C"d"%3A"%25{m5537}可以换%25{m3524}"%2C"f"%3A[[[[5537%2C110%2C9%2C99%2C[18%2C11%2C11%2C10%2C11]%2C1]%2C[5141%2C110%2C9%2C99%2C[11%2C11%2C11%2C11%2C11%2C10]%2C2]%2C[5004%2C110%2C9%2C99%2C[19%2C19%2C11%2C11]%2C0]%2C[5658%2C110%2C9%2C99%2C[19%2C11%2C11%2C11%2C11]%2C0]%2C[3898%2C110%2C9%2C99%2C[25%2C11%2C11%2C11%2C11]%2C0]%2C[5658%2C110%2C9%2C99%2C[19%2C19%2C11%2C11]%2C2]]%2C[[5573%2C1%2C7%2C99]%2C[5591%2C1%2C6%2C99]%2C[5582%2C1%2C6]%2C[5656%2C1%2C6]%2C[4897%2C99%2C5%2C99]%2C[5420%2C99%2C5%2Cnull%2Cnull%2Cnull%2C1]]]]%2C"b"%3A13}) | [Solo Sample](//mapaler.github.io/PADDashFormation/solo.html?d={"t"%3A"千鸟^ff3600^【7×6版面】^p换队长打里·异形"%2C"d"%3A"%25{m5537}可以换%25{m3524}"%2C"f"%3A[[[[5537%2C110%2C9%2C99%2C[18%2C11%2C11%2C10%2C11]%2C1]%2C[5141%2C110%2C9%2C99%2C[11%2C11%2C11%2C11%2C11%2C10]%2C2]%2C[5004%2C110%2C9%2C99%2C[19%2C19%2C11%2C11]%2C0]%2C[5658%2C110%2C9%2C99%2C[19%2C11%2C11%2C11%2C11]%2C0]%2C[3898%2C110%2C9%2C99%2C[25%2C11%2C11%2C11%2C11]%2C0]%2C[5658%2C110%2C9%2C99%2C[19%2C19%2C11%2C11]%2C2]]%2C[[5573%2C1%2C7%2C99]%2C[5591%2C1%2C6%2C99]%2C[5582%2C1%2C6]%2C[5656%2C1%2C6]%2C[4897%2C99%2C5%2C99]%2C[5420%2C99%2C5%2Cnull%2Cnull%2Cnull%2C1]]]]%2C"b"%3A13})
* [2P车队示例](http://mapaler.gitee.io/paddashformation/multi.html?d={"t"%3A"我的^2288FF^水^p车队%20|%20My%20^2288FF^Water^p%20Swip%20Formation"%2C"d"%3A"%25{m2186}最好换%25{m4877}\n%25{m4877}%20is%20better%20than%20%25{m2186}"%2C"f"%3A[[[[4691%2C104%2C9%2C99%2C[19%2C19%2C11%2C11]%2C1]%2C[2186%2C101%2C8%2C99%2C[20%2C20%2C20]%2C0]%2C[4877%2C101%2C9%2C99%2C[19%2C19%2C11%2C11]]%2C[4793%2C99%2C7%2C99]%2C[4877%2C101%2C9%2C99%2C[23%2C23%2C11%2C11]]]%2C[[4252%2C38%2C9]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4155%2C1%2C7%2Cnull%2Cnull%2Cnull%2C1]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]]]%2C[[[4691%2C110%2C9%2C99%2C[19%2C19%2C11%2C11]%2C1]%2C[4877%2C102%2C9%2C99%2C[19%2C19%2C11%2C11]]%2C[4877%2C101%2C9%2C99%2C[23%2C23%2C11%2C11]]%2C[4793%2C99%2C7%2C99%2C[21%2C21%2C21]]%2C[2186%2C101%2C8%2C99%2Cnull%2C0]]%2C[[4394%2C12%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4394%2C1%2C3%2C99%2Cnull%2Cnull%2C1]%2C[4155%2C1%2C7%2Cnull%2Cnull%2Cnull%2C1]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]]]]}) | [2P Multi Formation Sample](//mapaler.github.io/PADDashFormation/multi.html?d={"t"%3A"我的^2288FF^水^p车队%20|%20My%20^2288FF^Water^p%20Swip%20Formation"%2C"d"%3A"%25{m2186}最好换%25{m4877}\n%25{m4877}%20is%20better%20than%20%25{m2186}"%2C"f"%3A[[[[4691%2C104%2C9%2C99%2C[19%2C19%2C11%2C11]%2C1]%2C[2186%2C101%2C8%2C99%2C[20%2C20%2C20]%2C0]%2C[4877%2C101%2C9%2C99%2C[19%2C19%2C11%2C11]]%2C[4793%2C99%2C7%2C99]%2C[4877%2C101%2C9%2C99%2C[23%2C23%2C11%2C11]]]%2C[[4252%2C38%2C9]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4155%2C1%2C7%2Cnull%2Cnull%2Cnull%2C1]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]]]%2C[[[4691%2C110%2C9%2C99%2C[19%2C19%2C11%2C11]%2C1]%2C[4877%2C102%2C9%2C99%2C[19%2C19%2C11%2C11]]%2C[4877%2C101%2C9%2C99%2C[23%2C23%2C11%2C11]]%2C[4793%2C99%2C7%2C99%2C[21%2C21%2C21]]%2C[2186%2C101%2C8%2C99%2Cnull%2C0]]%2C[[4394%2C12%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4394%2C1%2C3%2C99%2Cnull%2Cnull%2C1]%2C[4155%2C1%2C7%2Cnull%2Cnull%2Cnull%2C1]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]]]]})
* [3P协力示例](http://mapaler.gitee.io/paddashformation/triple.html?d={"t"%3A"3P%20Sample"%2C"d"%3A"3P没啥好的例子"%2C"f"%3A[[[[4691%2C104%2C9%2C99%2C[19%2C19%2C11%2C11]%2C1]%2C[2186%2C101%2C8%2C99%2C[20%2C20%2C20]%2C0]%2C[4877%2C101%2C9%2C99%2C[19%2C19%2C11%2C11]]%2C[4793%2C99%2C7%2C99]%2C[5322%2C101%2C9%2C99%2C[20%2C20%2C20]]%2C[4691%2C110%2C9%2C99%2C[19%2C19%2C11%2C11]%2C1]]%2C[[4252%2C38%2C9]%2C[5632%2C1%2C6%2C99]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4155%2C1%2C7%2Cnull%2Cnull%2Cnull%2C1]%2C[4828%2C5%2C3]%2C[4394%2C12%2C3%2Cnull%2Cnull%2Cnull%2C1]]]%2C[[[4691%2C110%2C9%2C99%2C[19%2C19%2C11%2C11]%2C1]%2C[2186%2C101%2C8%2C99%2Cnull%2C0]%2C[4877%2C102%2C9%2C99%2C[19%2C19%2C11%2C11]]%2C[4793%2C99%2C7%2C99%2C[21%2C21%2C21]]%2C[4877%2C101%2C9%2C99%2C[23%2C23%2C11%2C11]]%2C[4691%2C104%2C9%2C99%2C[19%2C19%2C11%2C11]%2C1]]%2C[[4394%2C12%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4155%2C1%2C7%2Cnull%2Cnull%2Cnull%2C1]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4252%2C38%2C9]]]%2C[[[5888%2C110%2C9%2C99%2C[19%2C19%2C11%2C11]]%2C[4877%2C99%2C9%2C99]%2C[4877%2C99%2C9%2C99]%2C[4877%2C99%2C9%2C99]%2C[2540%2C110%2C8%2C99%2C[11%2C11%2C11%2C11%2C11%2C11]%2C0]%2C[5887%2C99%2C9%2Cnull%2C[11%2C11%2C11%2C11%2C11%2C11]]]%2C[[0%2C0%2C0]%2C[0%2C0%2C0]%2C[0%2C0%2C0]%2C[0%2C0%2C0]%2C[0%2C0%2C0]%2C[0%2C0%2C0]]]]}) | [3P Multi Formation Sample](//mapaler.github.io/PADDashFormation/triple.html?d={"t"%3A"3P%20Sample"%2C"d"%3A"3P没啥好的例子"%2C"f"%3A[[[[4691%2C104%2C9%2C99%2C[19%2C19%2C11%2C11]%2C1]%2C[2186%2C101%2C8%2C99%2C[20%2C20%2C20]%2C0]%2C[4877%2C101%2C9%2C99%2C[19%2C19%2C11%2C11]]%2C[4793%2C99%2C7%2C99]%2C[5322%2C101%2C9%2C99%2C[20%2C20%2C20]]%2C[4691%2C110%2C9%2C99%2C[19%2C19%2C11%2C11]%2C1]]%2C[[4252%2C38%2C9]%2C[5632%2C1%2C6%2C99]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4155%2C1%2C7%2Cnull%2Cnull%2Cnull%2C1]%2C[4828%2C5%2C3]%2C[4394%2C12%2C3%2Cnull%2Cnull%2Cnull%2C1]]]%2C[[[4691%2C110%2C9%2C99%2C[19%2C19%2C11%2C11]%2C1]%2C[2186%2C101%2C8%2C99%2Cnull%2C0]%2C[4877%2C102%2C9%2C99%2C[19%2C19%2C11%2C11]]%2C[4793%2C99%2C7%2C99%2C[21%2C21%2C21]]%2C[4877%2C101%2C9%2C99%2C[23%2C23%2C11%2C11]]%2C[4691%2C104%2C9%2C99%2C[19%2C19%2C11%2C11]%2C1]]%2C[[4394%2C12%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4155%2C1%2C7%2Cnull%2Cnull%2Cnull%2C1]%2C[4394%2C1%2C3%2Cnull%2Cnull%2Cnull%2C1]%2C[4252%2C38%2C9]]]%2C[[[5888%2C110%2C9%2C99%2C[19%2C19%2C11%2C11]]%2C[4877%2C99%2C9%2C99]%2C[4877%2C99%2C9%2C99]%2C[4877%2C99%2C9%2C99]%2C[2540%2C110%2C8%2C99%2C[11%2C11%2C11%2C11%2C11%2C11]%2C0]%2C[5887%2C99%2C9%2Cnull%2C[11%2C11%2C11%2C11%2C11%2C11]]]%2C[[0%2C0%2C0]%2C[0%2C0%2C0]%2C[0%2C0%2C0]%2C[0%2C0%2C0]%2C[0%2C0%2C0]%2C[0%2C0%2C0]]]]})
## 下载后使用本地版 | 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.
@ -41,7 +31,14 @@ Chrome browser need start with the additional argument `--allow-file-access-from
## [帮助和提示 | Help and Tips](help.md)
# 翻译我 | TRANSLATE ME
# 翻译我 | Translate me
## 目前支持的语言 | Languages currently supported
1. 中文(简体)
1. 中文(繁體)
1. English
1. 日本語 (by Bing Microsoft Translator)
1. 한국어 (by Bing Microsoft Translator)
## How to **Pull requests**
1. Click **Fork** In the page top right corner. Fork your own copy of this repository to your account.
1. Use Git to clone/pull repository locally for modification (How to modify please see below).
@ -56,14 +53,16 @@ Chrome browser need start with the additional argument `--allow-file-access-from
This is an Object for a language list item.
```js
{
name:"English",
i18n:"en",
searchlist:["en","ja"],
guideURL:id=>`http://www.puzzledragonx.com/en/monster.asp?n=${id}`
name: "English",
i18n: "en",
i18n_RegExp: /^en/i,
searchlist: ["en","ja"],
guideURL: id=>`http://www.puzzledragonx.com/en/monster.asp?n=${id}`
}
```
* `name` is the name shown in the list.
* `i18n` is the language-tag for your language.
* `name` is the showed name in the list.
* `i18n` is the language-tag for your language. You need to make sure that the file names are the same.
* `i18n_RegExp` is a *Regular Expressions* to match multiple `navigator.language` (like `/^en/i` can match `en-US`, `en-CA` and `en-AU`).
* `searchlist` is the search candidate list string order when you search monster in edit window.
Currently only `ja`,`en`,`ko`,`cht`,`chs` languages.(See [monsters-info](monsters-info))
* `guideURL` is a **Function(cardId,cardName)** to return game guide URL for your language.
@ -101,7 +100,9 @@ Please refer to existing files.
# 使用开源软件 | Open source software used
* [Puzzle-and-Dragons-Texture-Tool](//github.com/codywatts/Puzzle-and-Dragons-Texture-Tool) //Extract Images
* [pad-rikuu](//github.com/kiootic/pad-rikuu) //Parse data
* [zxing-js](//github.com/zxing-js/library) //Read, Write QR Code
* [html2canvas](//github.com/niklasvh/html2canvas) //Capture Image
* [aaa](//github.com/jy4340132/aaa) //Play voice(ADPCM wav)
* [Font Awesome Free](https://github.com/FortAwesome/Font-Awesome) //Font Icon
* [Zpix (最像素)](//github.com/SolidZORO/zpix-pixel-font) //Pixel Font
* [font-spider](//github.com/aui/font-spider) //Compression Font file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
document/tips-qr-found.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
document/tips-qr-pdc.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
document/tips-qr-pdf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
document/tips-qr-read.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
fonts/fa-solid-900.eot Normal file

Binary file not shown.

5034
fonts/fa-solid-900.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 898 KiB

BIN
fonts/fa-solid-900.ttf Normal file

Binary file not shown.

BIN
fonts/fa-solid-900.woff Normal file

Binary file not shown.

BIN
fonts/fa-solid-900.woff2 Normal file

Binary file not shown.

86
help.md
View File

@ -1,38 +1,84 @@
智龙迷城队伍图制作工具帮助<br>Help of *Puzzle & Dragons Formation Maker*
智龙迷城队伍图制作工具使用技巧<br>Tips of *Puzzle & Dragons Formation Maker*
======
* 直接复制网址即可分享组队或自己添加收藏夹保存。你可以使用*短网址服务*进一步缩短网址。
Copy the URL directly to share the Formation, or add a Bookmark to archives. You can use any *Short URL Service* to further shorten the URL.
## 目录 | Index
* [分享队伍 | Share your team](#分享--share)
* [队伍编辑技巧 | Convenient tips for edit](#编辑技巧--editing-tips)
* [搜索图鉴 | Search cards](#搜索图鉴--search-cards)
* [文字说明的高级功能 | Advanced of the description](#文字的高级功能--advanced-of-text-detail)
* [其他 | Others](#其他--others)
* [报告BUG | Report BUG](#报告bug--report-bug)
## 分享 | Share
### 通过网址分享和收藏队伍 | Share and collect teams by URL
直接复制网址即可分享组队或自己添加收藏夹保存。
Copy the URL directly to share the Formation, or add a Bookmark to collect.
![分享组队](document/tips-share.png)
你也可以使用浏览器扩展生成二维码来分享网址。
You can also share the URL in QR code by browser extensions.
![生成二维码](document/tips-qrcode.png)
* 使用后退即可撤销上一次修改。
Use back to undo the last edit.
为了更方便的分享,你可以使用任意第三方*短网址服务*进一步缩短网址。
For easier sharing, you can further shorten your URL using any third-party *Short URL Service*. Like, [bitly](https://bitly.com/).
### 二维码分享 | Share by QR Code
可以使用摄像头读取队伍二维码
You can use the camera to read the Formation QR code
![使用摄像头读取二维码](document/tips-qr-read.webp)
读取到的队伍会显示为链接
The read Formation appears as a link
![成功读取到二维码](document/tips-qr-read-found.png)
目前可以读取 | Currently can read:
1. 本程序自有格式的二维码
This program's own format QR code
![PDF二维码](document/tips-qr-pdf.png)
1. 使用浏览器扩展生成本程序组队网址链接的二维码
QR code of this program Formation URL which generated by browser extension.
![URL二维码](document/tips-qr-url.png)
1. PDC 的二维码
PDC format QR code
![PDC二维码](document/tips-qr-pdc.webp)
## 编辑技巧 | Editing tips
* 使用**后退**即可撤销上一次修改,需要重做则使用前进。
Use **Back** to undo the last edit, redo with Forward.
![撤銷修改](document/tips-undo.png)
* 拖拽怪物头像即可快速交换位置或复制怪物,也支持手机触屏。
Drag monster avatars to quickly swap positions or copy monster, also supports mobile touch screen.
![切换位置](document/tips-interchangeCard.png)
* **拖拽**卡片头像即可快速交换位置,也支持手机触屏。
**Drag** card avatars to quickly swap member's positions, also supports mobile touch screen.
![切换位置](document/tips-interchangeCard.png)
使用顶部的开关可以切换到复制模式
Use the switch at the top can switch to copy mode.
* 如果你希望使用技能切换队长使用切换按钮。这样可以保留原始队长强调边框和76版面图标。
If you want switch leader by skill, use the switch button. This preserves the original leader accent border, and the 76 board icon.
![切换位置](document/tips-switch-leader.png)
* 可以在编辑界面的怪物ID输入**怪物名称**或**标签**来搜索怪物。(键入回车以执行)
You can search for monsters by entering the **Monster Name** or **Tags** in the monster ID of the editing interface.(Type Enter to execute)
* 使用`Ctrl + ←/→`,或小键盘上的`←/→`(需关闭`NumLock`)可以快速切换变身。
You can using `Ctrl + ←/→` or `←/→` on keypad (turn `NumLock` off) to quickly change Henshin.
![按键切换变身](document/tips-arrow-change-henshin.png)
![关闭小键盘](document/tips-arrow-close-numlock.webp)
## 搜索图鉴 | Search cards
* 可以在编辑界面的怪物ID输入**怪物名称**或**标签**来搜索卡片。
You can search for card by entering the **Monster Name** or **Tags** in the monster ID of the editing interface.
![搜索怪物名称](document/tips-search-name.png)
点击**系列ID**或**标签**,可搜索该系列
Clisk the **Series ID** or **Tags** to search for series.
![搜索怪物系列](document/tips-search-series.png)
* 点击编辑界面的怪物头像可以跳转到攻略网站。
Click on the monster avatar in the editing interface to jump to the Guide.
* 点击**技能名称**,可搜索相同主动技能宠物
Click on **Skill Name** to search for the same active skills Cards.
![搜索怪物主动技能](document/tips-search-skills.png)
* 点击**系列ID**或**标签**,可搜索该系列
Click the **Series ID** or **Tags** to search for series.
![搜索怪物系列](document/tips-search-series.webp)
* 复制本版本游戏数据的**标签**,可在游戏中搜索系列名称
Copy the **Tag** of this version of the game data can search for the series in the game.
![在游戏中搜索怪物系列](document/tips-search-TagInGame.png)
* 点击编辑界面的卡片头像可以跳转到攻略网站。
Click on the card avatar in the editing interface to jump to the Guide.
![攻略网站](document/tips-guide.png)
在队伍界面和搜索结果的怪物头像上,点击鼠标中键也可以跳转到攻略网站。在手机上则是长按怪物头像然后选择在新标签页打开。
Or click the middle mouse button on the monster avatar of the formation interface and search results to jump to the Guide. On your phone, you're long-pressing the monster avatar and then selecting to open it in a new tab.
![攻略网站2](document/tips-guide2.png)
## 文字的高级功能 | Advanced of text detail
* 队伍标题与队伍说明可以使用`^16进制颜色代码^内容^p`来改变内容颜色;
Formation Title and Detail can use the `^[Hex Color Code]^Content^p` to change the color of the Content.
![文字颜色](document/tips-advanced-color.png)
`%{m怪物ID}`可以显示怪物头像。
`%{m[Monster ID]}` can display the monster avatar.
![怪物头像](document/tips-advanced-card.png)
## 其他 | Others
* 2人只显示部分共用的觉醒的统计不包括超觉醒单人和三人则全部显示。
The 2P Multi Games Mode shows only several common awoken statistics (excluding super-awakening), but the Solo and 3P Mode shows all.
* 内建的截图按钮依靠 [html2canvas](https://github.com/niklasvh/html2canvas/),会有一些绘制错误,浏览器的截图扩展能够更加还原显示的真实样子。
@ -41,5 +87,5 @@ Built-in screenshot button relies on [html2canvas](https://github.com/niklasvh/h
If you just want to use this program as a simple guide, you can add `guide=1` to the parameters, such as `https://mapaler.github.io/PADDashFormation/solo.html?guide=1`. When you enter the page in guide mode, the monster modification interface opens directly and the background is opaque.
## 报告BUG | Report BUG
如果发现 BUG请先按 Ctrl+F5 强制刷新后测试,如仍有问题可以在 [Issues](//github.com/Mapaler/PADDashFormation/issues) 报告。
If a BUG is found, first test again after force refresh by Ctrl-F5, if there is still a problem, you can report it at the [Issues](//github.com/Mapaler/PADDashFormation/issues).
如果发现 BUG请先按 Ctrl+F5 强制刷新,并点击数据更新时间按钮强制更新数据。如仍存在问题可以在 [Issues](//github.com/Mapaler/PADDashFormation/issues) 报告。
If a BUG is found, first test again after force refresh by Ctrl-F5, then click the Data Update Time button to force update the data. If there is still a problem, you can report it at the [Issues](//github.com/Mapaler/PADDashFormation/issues).

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 704 KiB

After

Width:  |  Height:  |  Size: 725 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 950 KiB

After

Width:  |  Height:  |  Size: 970 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 508 KiB

After

Width:  |  Height:  |  Size: 774 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 KiB

After

Width:  |  Height:  |  Size: 599 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 798 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 877 KiB

After

Width:  |  Height:  |  Size: 874 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 791 KiB

After

Width:  |  Height:  |  Size: 834 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 689 KiB

After

Width:  |  Height:  |  Size: 904 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 820 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 711 KiB

After

Width:  |  Height:  |  Size: 732 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 950 KiB

After

Width:  |  Height:  |  Size: 970 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 508 KiB

After

Width:  |  Height:  |  Size: 774 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 KiB

After

Width:  |  Height:  |  Size: 599 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 798 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 374 KiB

After

Width:  |  Height:  |  Size: 387 KiB

1
images/qrcode-solid.svg Normal file
View File

@ -0,0 +1 @@
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="qrcode" class="svg-inline--fa fa-qrcode fa-w-14" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" width="14" height="14"><path fill="currentColor" d="M0 224h192V32H0v192zM64 96h64v64H64V96zm192-64v192h192V32H256zm128 128h-64V96h64v64zM0 480h192V288H0v192zm64-128h64v64H64v-64zm352-64h32v128h-96v-32h-32v96h-64V288h96v32h64v-32zm0 160h32v32h-32v-32zm-64 0h32v32h-32v-32z"></path></svg>

After

Width:  |  Height:  |  Size: 474 B

View File

@ -308,9 +308,6 @@
content: "Dark Attribute Enemy";
}
.setting-box .row-mon-id .open-search::before{
content: "Simple Search";
}
.search-box::before{
content: "Search Cards";
}
@ -415,6 +412,10 @@
{
content: "⛓Evo Search";
}
.search-evolution-by-this::after
{
content: "Cards that need this card as evolutionary material";
}
.real-time-change-card-label::after
{
content: "Real-Time change card";
@ -505,6 +506,52 @@
transform: scaleX(0.6);
margin: calc(-100px * (1 - 0.6) / 2);
}
.control-box .btn-qrcode::before{
content: "\f029 QR Code";
}
.read-qr-box::before
{
content: "Read QR code:";
}
.save-qr-box::before
{
content: "Generate QR code:";
}
.formation-from-qrcode::before
{
content: "A formation link read from a QR code";
}
label[for="sourceSelect"]::before
{
content: "Video source selection:";
}
#qr-code-frame .save-qr-img::before
{
content: "\f0c7 Save QR code image";
}
#qr-code-frame .read-qr-camera::before
{
content: "\f030 Scan with the camera";
}
#qr-code-frame .read-qr-camera.running::before
{
content: "\f28d Stop using the camera";
}
#qr-code-frame .read-qr-file::before
{
content: "\f1c5 Read the image file";
}
label[for="qr-data-type-pdf"]::before
{
content: "P&D Formation Maker";
}
label[for="qr-data-type-pdc"]::before
{
content: "P&D Damage Caculater (PDC)";
}
.icon-skill[data-icon-type="resolve"] {
background-position-x: calc(-36px * 1);
}
background-position-x: calc(-36px * 1);
}}

View File

@ -1,4 +1,4 @@
const localTranslating = {
localTranslating = {
webpage_title: `P&D ${teamsCount}P Formation Maker`,
title_blank: `Input Formation Title`,
detail_blank: `Input Detail`,

View File

@ -300,9 +300,6 @@
content: "暗属性の敵";
}
.setting-box .row-mon-id .open-search::before{
content: "簡単な検索";
}
.search-box::before{
content: "モンスターの検索";
}
@ -407,6 +404,10 @@
{
content: "⛓️進化サーチ";
}
.search-evolution-by-this::after
{
content: "このカードを進化的な素材として必要とするカード";
}
.real-time-change-card-label::after
{
content: "カードを即座に更新します";
@ -470,4 +471,51 @@
.henshin-loop .evo-type::after
{
content: "ループ変身";
}
.control-box .btn-qrcode::before{
content: "\f029 QRコード";
}
.read-qr-box::before
{
content: "QRコードを読み取る:";
}
.save-qr-box::before
{
content: "QRコードを生成します:";
}
.formation-from-qrcode::before
{
content: "QRコードから読み取られたフォーメーションリンク";
}
label[for="sourceSelect"]::before
{
content: "ビデオ ソースの選択:";
}
#qr-code-frame .save-qr-img::before
{
content: "\f0c7 QRコードイメージを保存";
}
#qr-code-frame .read-qr-camera::before
{
content: "\f030 カメラでスキャンする";
}
#qr-code-frame .read-qr-camera.running::before
{
content: "\f28d カメラの使用を停止します";
}
#qr-code-frame .read-qr-file::before
{
content: "\f1c5 画像ファイルを読み取る";
}
label[for="qr-data-type-pdf"]::before
{
content: "パズドラチーム図作成ツール";
}
label[for="qr-data-type-pdc"]::before
{
content: "パズドラダメージ計算 (PDC)";
}

View File

@ -1,4 +1,4 @@
const localTranslating = {
localTranslating = {
webpage_title: `パズル&ドラゴンズ${teamsCount}人のチーム図作成ツール`,
title_blank: "入力タイトル",
detail_blank: "入力詳細",

View File

@ -297,9 +297,6 @@
content: "숨겨진 속성의 적";
}
.setting-box .row-mon-id .open-search::before{
content: "간단한 검색";
}
.search-box::before{
content: "몬스터 검색";
}
@ -404,6 +401,10 @@
{
content: "⛓️진화 계통";
}
.search-evolution-by-this::after
{
content: "진화 자료로이 카드를 필요로하는 카드";
}
.real-time-change-card-label::after
{
content: "카드를 즉시 업데이트합니다";
@ -462,6 +463,53 @@
{
content: "루프 변신";
}
.control-box .btn-qrcode::before{
content: "\f029 QR 코드";
}
.read-qr-box::before
{
content: "QR 코드 읽기:";
}
.save-qr-box::before
{
content: "QR 코드 생성:";
}
.formation-from-qrcode::before
{
content: "QR 코드에서 읽은 형성 링크";
}
label[for="sourceSelect"]::before
{
content: "비디오 소스 선택:";
}
#qr-code-frame .save-qr-img::before
{
content: "\f0c7 QR 코드 이미지 저장";
}
#qr-code-frame .read-qr-camera::before
{
content: "\f030 카메라로 스캔";
}
#qr-code-frame .read-qr-camera.running::before
{
content: "\f28d 카메라 사용을 중지합니다";
}
#qr-code-frame .read-qr-file::before
{
content: "\f1c5 이미지 파일 읽기";
}
label[for="qr-data-type-pdf"]::before
{
content: "퍼즐앤드래곤 팀 다이어그램 생성 도구";
}
label[for="qr-data-type-pdc"]::before
{
content: "퍼즐앤드래곤 데미지 카큐라터 (PDC)";
}
.icon-skill[data-icon-type="resolve"] {
background-position-x: calc(-36px * 2);
}
background-position-x: calc(-36px * 2);
}}

View File

@ -1,4 +1,4 @@
const localTranslating = {
localTranslating = {
webpage_title: `퍼즐앤드래곤 ${teamsCount} 명의 팀 다이어그램 작성 도구`,
title_blank: "입력 제목",
detail_blank: "입력 내용",

View File

@ -1,20 +1,19 @@
var languageList = [
const languageList = [
{
name:"English",i18n:"en",searchlist:["en","ja"],
guideURL:id=>`http://www.puzzledragonx.com/en/monster.asp?n=${id}` //or (id,name)=>`http://www.puzzledragonx.com/en/search.asp?q=${name}`
},
{
name:"中文(繁體)",i18n:"zh-TW",searchlist:["cht","ja"],
guideURL:id=>`http://pad.skyozora.com/pets/${id}`
name:"中文(繁體)",i18n:"zh-TW",i18n_RegExp:/^zh-(?:hant-)?TW/i,searchlist:["cht","ja"],
guideURL:id=>`https://pad.skyozora.com/pets/${id}`
},
{
name:"中文(简体)技能解析",i18n:"zh-CN",searchlist:["chs","ja"],
guideURL:id=>`http://pad.skyozora.com/pets/${id}`
//guideURL:id=>{const url = new URL(location);url.search = '';url.searchParams.set("guide",1);url.searchParams.set("id",id); return url;}
name:"中文(简体)技能解析",i18n:"zh-CN",i18n_RegExp:/^zh-(?:hans-)?/i,searchlist:["chs","ja"],
guideURL:id=>`https://pad.skyozora.com/pets/${id}`
},
{
name:"中文(简体)原版技能",i18n:"zh",searchlist:["chs","ja"],
guideURL:id=>`http://pad.skyozora.com/pets/${id}`
guideURL:id=>`https://pad.skyozora.com/pets/${id}`
},
{
name:"日本語",i18n:"ja",searchlist:["ja"],

View File

@ -1,5 +1,5 @@
document.title = `智龙迷城${teamsCount}人队伍图制作工具`;
const localTranslating = {
document.title = localTranslating.webpage_title;
localTranslating = {
skill_parse: {
skill: {
unknown: tp`未知的技能类型:${'type'}`, //type
@ -249,7 +249,7 @@ function parseSkillDescription(skill) {
}
const mulName = ["HP", "攻击力", "回复力"];
//获取固定的三维成长的名称
function getFixedHpAtkRcvString(values) {
function getFixedHpAtkRcvString(values, scale = true) {
let mulArr = null;
if (Array.isArray(values)) {
mulArr = [
@ -269,7 +269,7 @@ function parseSkillDescription(skill) {
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("");
str += mulArr.map((m, i) => (m > 0 && m != 1) ? (mulName[i] + (scale ? (m >= 1 ? `×${m}` : `变为${m*100}%`) : `增加${m*100}%`)) : null).filter(s => s != null).join("");
} else {
let hasMulName = mulName.filter((n, i) => mulArr[i] != 1);
if (hasMulName.length >= 3) {
@ -277,7 +277,7 @@ function parseSkillDescription(skill) {
} else {
str += hasMulName.join("和");
}
str += hasMul[0] >= 1 ? `×${hasMul[0]}` : `变为${hasMul[0]*100}%`;
str += scale ? (hasMul[0] >= 1 ? `×${hasMul[0]}` : `变为${hasMul[0]*100}%`) : `增加${hasMul[0]*100}%`;
}
} else {
str += "能力值没有变化";
@ -808,7 +808,7 @@ function parseSkillDescription(skill) {
return fragment;
break;
case 126:
str = `${sk[1]}${sk[1] != sk[2]?`~${sk[2]}`:""}回合内,${nb(sk[0], attrsName).join("、")}宝珠的掉落率提高${sk[3]}%`;
str = `${sk[1]}${sk[1] != sk[2]?`~${sk[2]}`:""}回合内,${nb(sk[0], attrsName).join("、")}宝珠的掉落率提高${sk[3]}%`;
break;
case 127: //生成竖列
strArr = [];
@ -1210,8 +1210,9 @@ function parseSkillDescription(skill) {
break;
case 169: //5COMBO或以上時受到的傷害減少25%、攻擊力6倍
str = `${sk[0]}连击或以上时`;
if (sk[1] && sk[1] !== 100) str += `,所有宠物的${getFixedHpAtkRcvString({atk:sk[1]})}`;
if (sk[1] && sk[1] !== 100) str += `,所有宠物的攻击力×${sk[1]/100}`;
if (sk[2]) str += `,受到的伤害减少${sk[2]}%`;
if (sk[4]) str += `此后每多1连击攻击力+${sk[3]/100}倍,最大${sk[4]}连击时×${(sk[4] - sk[0]) * sk[3]/100 + sk[1]/100}`;
break;
case 170:
fullColor = nb(sk[0], attrsName);
@ -1231,9 +1232,9 @@ function parseSkillDescription(skill) {
if (!atSameTime) str+=`${sk[1]}种属性以上`;
else if(sk[0] == 31) str += `5色`;
str += `同时攻击时`;
if (sk[2] && sk[2] !== 100 || sk[4]) str += `,所有宠物的攻击力×${sk[2]/100}`;
if (sk[4]) str += `每多1种属性+${sk[4]/100}倍,最大${sk[1] + (sk[5] - 1)}种属性时${(sk[5] - 1) * sk[4]/100 + sk[2]/100}`;
if (sk[2] && sk[2] !== 100) str += `,所有宠物的攻击力×${sk[2]/100}`;
if (sk[3]) str += `,受到的伤害减少${sk[3]}%`;
if (sk[4]) str += `此后每多1种属性攻击力+${sk[4]/100}倍,最大${sk[1] + (sk[5] - 1)}种属性时×${(sk[5] - 1) * sk[4]/100 + sk[2]/100}`;
break;
case 171:
fullColor = sk.slice(0,4).filter(c=>c>0); //最多4串珠
@ -1544,6 +1545,15 @@ function parseSkillDescription(skill) {
case 223:
str = `${sk[0]}连击以上时,追加${sk[1].bigNumberToString()}点固定伤害`;
break;
case 224:
str = `${sk[0]}回合内,敌人全体变为${attrN(sk[1])}属性。(不受防护盾的影响)`;
break;
case 228:
str = `${sk[0]}回合内队伍中每存在1个${getAttrTypeString(flags(sk[1]), flags(sk[2]))}时,${getFixedHpAtkRcvString({atk:sk[3],rcv:sk[4]}, false)}`;
break;
case 229:
str = `队伍中每存在1个${getAttrTypeString(flags(sk[0]), flags(sk[1]))}时,${getFixedHpAtkRcvString({hp:sk[2],atk:sk[3],rcv:sk[4]}, false)}`;
break;
default:
str = `未知的技能类型${type}(No.${id})`;
//开发部分
@ -3114,7 +3124,7 @@ function parseSkillDescription(skill) {
}
})},
{name:"以觉醒数量为倍率类技能(宝石姬)",function:cards=>cards.filter(card=>{
const searchTypeArray = [156,168];
const searchTypeArray = [156,168,228];
const skill = Skills[card.activeSkillId];
if (searchTypeArray.includes(skill.type))
return true;
@ -3126,11 +3136,17 @@ function parseSkillDescription(skill) {
{
name:"回复力 buff顶降回复",
function:cards=>{
const searchTypeArray = [50,90];
const searchTypeArray = [50,90,228];
function getRecScale(as)
{
const sk = as.params;
return sk.slice(1,sk.length>2?-1:undefined).includes(5) && sk.length > 2 ? sk[sk.length-1] : 0;
if (as.type == 228)
{
return sk[4] || 0;
}else
{
return sk.slice(1,sk.length>2?-1:undefined).includes(5) && sk.length > 2 ? sk[sk.length-1] : 0;
}
}
return cards.filter(card=>{
const skills = getCardActiveSkills(card, searchTypeArray);
@ -3145,11 +3161,17 @@ function parseSkillDescription(skill) {
});
},
addition:card=>{
const searchTypeArray = [50,90];
const searchTypeArray = [50,90,228];
function getRecScale(as)
{
const sk = as.params;
return sk.slice(1,sk.length>2?-1:undefined).includes(5) && sk.length > 2 ? sk[sk.length-1] : 0;
if (as.type == 228)
{
return sk[4] || 0;
}else
{
return sk.slice(1,sk.length>2?-1:undefined).includes(5) && sk.length > 2 ? sk[sk.length-1] : 0;
}
}
const skills = getCardActiveSkills(card, searchTypeArray);
const skill = skills.find(as=>getRecScale(as) > 0);
@ -3161,11 +3183,13 @@ function parseSkillDescription(skill) {
88,92, //类型的
50,90, //属性的,要排除回复力
156,168, //宝石姬
228, //属性、类型数量
];
const skill = Skills[card.activeSkillId];
if ((skill.type==88 || skill.type==92) || //类型的
(skill.type==50 || skill.type==90) && skill.params.slice(1,skill.params.length>2?-1:undefined).some(sk=>sk!=5) || //属性的,要排除回复力
skill.type==156 && skill.params[4] == 2 || skill.type==168 //宝石姬的
skill.type==156 && skill.params[4] == 2 || skill.type==168 || //宝石姬的
skill.type==228 && skill.params[3] > 0 //属性、类型数量
)
return true;
else if (skill.type == 116 || skill.type == 118){
@ -3173,7 +3197,8 @@ function parseSkillDescription(skill) {
return subskills.some(subskill=>
(subskill.type==88 || subskill.type==92) || //类型的
(subskill.type==50 || subskill.type==90) && subskill.params.slice(1,subskill.params.length>2?-1:undefined).some(sk=>sk!=5) || //属性的,要排除回复力
subskill.type==156 && subskill.params[4] == 2 || subskill.type==168 //宝石姬的
subskill.type==156 && subskill.params[4] == 2 || subskill.type==168 ||//宝石姬的
subskill.type==228 && subskill.params[3] > 0 //属性、类型数量
);
}
})},
@ -3603,37 +3628,62 @@ function parseSkillDescription(skill) {
b_s.params.map(id=>Skills[id]).find(subskill => subskill.type == searchType).params[0];
return a_pC - b_pC;
})},
{name:"改变敌人属性(按属性排序)",function:cards=>cards.filter(card=>{
const searchType = 153;
const skill = Skills[card.activeSkillId];
if (skill.type == searchType)
return true;
else if (skill.type == 116 || skill.type == 118){
const subskills = skill.params.map(id=>Skills[id]);
return subskills.some(subskill=>subskill.type == searchType);
{name:"改变敌人属性(按属性排序)",
function:cards=>{
//获取属性变化
function getAttrChange(ls)
{
if (!ls) return null;
const sk = ls.params;
switch (ls.type)
{
case 153: //永久变色
return sk[0];
case 224: //回合变色
return sk[1] || 0;
default:
return null;
}
}
const searchTypeArray = [153, 224];
return cards.filter(card=>{
const skill = getCardActiveSkill(card, searchTypeArray);
return getAttrChange(skill) != null;
}).sort((a,b)=>{
const a_s = getCardActiveSkill(a, searchTypeArray), b_s = getCardActiveSkill(b, searchTypeArray);
let a_pC = getAttrChange(a_s),b_pC = getAttrChange(b_s);
return a_pC - b_pC;
})
},
addition:card=>{
//获取属性变化
function getAttrChange(ls)
{
if (!ls) return null;
const sk = ls.params;
switch (ls.type)
{
case 153: //永久变色
return sk[0];
case 224: //回合变色
return sk[1] || 0;
default:
return null;
}
}
const searchTypeArray = [153, 224];
const skill = getCardActiveSkill(card, searchTypeArray);
const sk = skill.params;
const colors = [getAttrChange(skill)];
const fragment = document.createDocumentFragment();
if (skill.type == 224)
fragment.appendChild(document.createTextNode(`${sk[0]}T,`));
fragment.appendChild(document.createTextNode(`敌→`));
fragment.appendChild(createOrbsList(colors));
return fragment;
}
}).sort((a,b)=>{
const searchType = 153;
const a_s = Skills[a.activeSkillId], b_s = Skills[b.activeSkillId];
let a_pC = 0,b_pC = 0;
a_pC = (a_s.type == searchType) ?
a_s.params[0] :
a_s.params.map(id=>Skills[id]).find(subskill => subskill.type == searchType).params[0];
b_pC = (b_s.type == searchType) ?
b_s.params[0] :
b_s.params.map(id=>Skills[id]).find(subskill => subskill.type == searchType).params[0];
return a_pC - b_pC;
}),addition:card=>{
const searchTypeArray = [153];
const skill = getCardSkill(card, searchTypeArray);
const sk = skill.params;
const colors = [sk[0]];
const fragment = document.createDocumentFragment();
fragment.appendChild(document.createTextNode(`敌→`));
fragment.appendChild(createOrbsList(colors));
return fragment;
}},
},
{name:"受伤反击 buff",function:cards=>cards.filter(card=>{
const searchType = 60;
const skill = Skills[card.activeSkillId];

View File

@ -303,9 +303,6 @@
content: "暗屬性敵人";
}
.setting-box .row-mon-id .open-search::before{
content: "簡易搜索";
}
.search-box::before{
content: "搜索怪物";
}
@ -410,6 +407,10 @@
{
content: "⛓️進化鏈";
}
.search-evolution-by-this::after
{
content: "需要此寵物作為進化素材的寵物";
}
.real-time-change-card-label::after
{
content: "即時更新卡片";
@ -463,4 +464,51 @@
.henshin-loop .evo-type::after
{
content: "循環變身";
}
.control-box .btn-qrcode::before{
content: "\f029 二維碼";
}
.read-qr-box::before
{
content: "讀取二維碼:";
}
.save-qr-box::before
{
content: "生成二維碼:";
}
.formation-from-qrcode::before
{
content: "從二維碼中讀取的隊伍連結";
}
label[for="sourceSelect"]::before
{
content: "視頻源選擇:";
}
#qr-code-frame .save-qr-img::before
{
content: "\f0c7 保存二維碼圖片";
}
#qr-code-frame .read-qr-camera::before
{
content: "\f030 使用相機掃描";
}
#qr-code-frame .read-qr-camera.running::before
{
content: "\f28d 停止使用相機";
}
#qr-code-frame .read-qr-file::before
{
content: "\f1c5 讀取二維碼圖片";
}
label[for="qr-data-type-pdf"]::before
{
content: "龍族拼圖隊伍圖製作工具";
}
label[for="qr-data-type-pdc"]::before
{
content: "智龙迷城傷害計算器 (PDC)";
}

View File

@ -1,4 +1,4 @@
const localTranslating = {
localTranslating = {
webpage_title: `龍族拼圖${teamsCount}人隊伍圖製作工具`,
title_blank: "輸入隊伍標題",
detail_blank: "輸入說明",

View File

@ -234,6 +234,7 @@
.control-box .btn-capture::before{
content: "📷截图";
}
.control-box .btn-swap-AB-team::before{
content: "🔄交换AB队";
}
@ -302,9 +303,6 @@
content: "暗属性敵人";
}
.setting-box .row-mon-id .open-search::before{
content: "简易搜索";
}
.search-box::before{
content: "搜索怪物";
}
@ -409,6 +407,10 @@
{
content: "⛓️进化链";
}
.search-evolution-by-this::after
{
content: "需要此宠物作为进化素材的宠物";
}
.real-time-change-card-label::after
{
content: "即时更新卡片";
@ -462,4 +464,51 @@
.henshin-loop .evo-type::after
{
content: "循環変身";
}
.control-box .btn-qrcode::before{
content: "\f029 二维码";
}
.read-qr-box::before
{
content: "读取二维码:";
}
.save-qr-box::before
{
content: "生成二维码:";
}
.formation-from-qrcode::before
{
content: "从二维码中读取的队伍链接";
}
label[for="sourceSelect"]::before
{
content: "视频源选择:";
}
#qr-code-frame .save-qr-img::before
{
content: "\f0c7 保存二维码图片";
}
#qr-code-frame .read-qr-camera::before
{
content: "\f030 使用相机扫描";
}
#qr-code-frame .read-qr-camera.running::before
{
content: "\f28d 停止使用相机";
}
#qr-code-frame .read-qr-file::before
{
content: "\f1c5 读取二维码图片";
}
label[for="qr-data-type-pdf"]::before
{
content: "智龙迷城队伍图制作工具";
}
label[for="qr-data-type-pdc"]::before
{
content: "智龙迷城伤害计算器PDC";
}

View File

@ -1 +1 @@
document.title = `智龙迷城${teamsCount}人队伍图制作工具`;
document.title = localTranslating.webpage_title;

15
library/zxing.umd.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
[{"code":"ja","ckey":{"card":"d0a44e4f4a6ac30454d5f2e39a5cc718","skill":"24cc7521c9973e5b5ae2d0909614de15"},"updateTime":1622180465888},{"code":"en","ckey":{"card":"b5341eecf21fac29395b459adf19be84","skill":"56135d3695cf89fef75d3561a5c4fc3a"},"updateTime":1622180465888},{"code":"ko","ckey":{"card":"aa64f926dfb2f7c4e4a5d61c607ba471","skill":"568c69fa8779d12f175d68135ab49a29"},"updateTime":1622180465888}]
[{"code":"ja","ckey":{"card":"1662af91b3c6c65dcacd7c5f59e3779c","skill":"fbbceb29e8fa54610addce49e5a4c627"},"updateTime":1626437692992},{"code":"en","ckey":{"card":"f968e7c08d9a708a236e956d7050e05a","skill":"fa1024dd36232eb43c030a2499814960"},"updateTime":1626352490457},{"code":"ko","ckey":{"card":"6b1f4e5b5f428ad3303257ac0b118bf2","skill":"17c7e55b774b6fed3eaea6bc5a0c027d"},"updateTime":1626352490457}]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -33,6 +33,13 @@ class monInfo
this.tags = [];
}
}
const chsTranDiff = [
{reg:"铁甲奇侠",chs:"钢铁侠"},
{reg:"变形侠医",chs:"绿巨人"},
{reg:"毒魔",chs:"毒液"},
{reg:"魁隆",chs:"灭霸"},
{reg:"福瑞",chs:"弗瑞"},
];
//根据文件路径读取文件,返回文件列表
fs.readdir(sourceFolder,function(err,files){
@ -104,6 +111,7 @@ fs.readdir(sourceFolder,function(err,files){
{
const m = new monInfo(m_cht.id);
m.name = converter.convertSync(m_cht.name);
chsTranDiff.forEach(o=>m.name = m.name.replace(new RegExp(o.reg,"ig"),o.chs));
m_cht.tags.forEach(tag=> m.tags.push(converter.convertSync(tag)) );
monArr_chs.push(m);
}

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

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

@ -18,6 +18,7 @@ const teamsCount = 2;
<script type="text/javascript" src="script-skill-parser.js"></script>
<script type="text/javascript" src="script.js"></script>
<script type="text/javascript" src="library/html2canvas.min.js"></script>
<script type="text/javascript" src="library/zxing.umd.min.js"></script>
<!--▼ADPCM播放相关-->
<script type="text/javascript" src="library/jy4340132-aaa/std.js"></script>
<script type="text/javascript" src="library/jy4340132-aaa/pcm_player.js"></script>
@ -28,9 +29,7 @@ var formation = new Formation(teamsCount,5);
</script>
<style type="text/css">
.show-team-name-right .team-total-info .team-awoken,
.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
{
@ -59,11 +58,11 @@ var formation = new Formation(teamsCount,5);
<div>
<button class="btn-clear-data" onclick="clearData();"></button>
<button class="btn-capture" onclick="capture();"></button>
<button class="btn-qrcode"></button>
<a class="down-capture display-none" target="_blank"></a>
<button class="btn-solo-link" onclick="turnPage(1,arguments[0]);"></button>
<button class="btn-triple-link" onclick="turnPage(3,arguments[0]);"></button>
<button class="btn-swap-AB-team" onclick="swapABCteam();"></button>
<span class="lbl-henshin-change"><button class="btn-henshin-back" onclick="henshinStep(-1);"></button><button class="btn-henshin-forward" onclick="henshinStep(+1);"></button></span>
<a class="help-link" target="_blank" href="https://github.com/Mapaler/PADDashFormation/blob/master/help.md"></a>
</div>
<div>
@ -73,6 +72,9 @@ var formation = new Formation(teamsCount,5);
<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>
<div>
<span class="lbl-henshin-change"><button class="btn-henshin-back" onclick="henshinStep(-1);"></button><button class="btn-henshin-forward" onclick="henshinStep(+1);"></button></span>
</div>
</div>
<div class="formation-box">
<div class="title-box edit"><input type="text" class="title" placeholder="输入队伍标题" /><h1 class="title-display"></h1></div>
@ -98,6 +100,29 @@ var formation = new Formation(teamsCount,5);
<ul class="teams">
<li class="team-bigbox team-1 show-team-name-right">
<div class="team-total-info">
<div class="tIf-addition-info">
<ul class="tIf-attrs">
<li><icon class="attr" data-attr-icon="0"><!----></icon></li>
<li><icon class="attr" data-attr-icon="1"><!----></icon></li>
<li><icon class="attr" data-attr-icon="2"><!----></icon></li>
<li><icon class="attr" data-attr-icon="3"><!----></icon></li>
<li><icon class="attr" data-attr-icon="4"><!----></icon></li>
</ul>
<ul class="tIf-types">
<li><icon class="type-icon" data-type-icon="4"><!----></icon></li>
<li><icon class="type-icon" data-type-icon="5"><!----></icon></li>
<li><icon class="type-icon" data-type-icon="7"><!--惡魔--></icon></li>
<li><icon class="type-icon" data-type-icon="8"><!--机械--></icon></li>
<li><icon class="type-icon" data-type-icon="1"><!--平衡--></icon></li>
<li><icon class="type-icon" data-type-icon="6"><!--攻撃--></icon></li>
<li><icon class="type-icon" data-type-icon="2"><!--体力--></icon></li>
<li><icon class="type-icon" data-type-icon="3"><!--回復--></icon></li>
<li><icon class="type-icon" data-type-icon="0"><!--進化用--></icon></li>
<li><icon class="type-icon" data-type-icon="12"><!--能力覺醒用--></icon></li>
<li><icon class="type-icon" data-type-icon="14"><!--強化合成用--></icon></li>
<li><icon class="type-icon" data-type-icon="15"><!--販賣用--></icon></li>
</ul>
</div>
<div class="tIf-total-move">
<span class="general"></span>
<span class="awoken-bind"></span>
@ -602,6 +627,29 @@ var formation = new Formation(teamsCount,5);
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="50"></span><span class="count"></span></li><!--方块心追-->
</ul>
</div>
<div class="tIf-addition-info">
<ul class="tIf-attrs">
<li><icon class="attr" data-attr-icon="0"><!----></icon></li>
<li><icon class="attr" data-attr-icon="1"><!----></icon></li>
<li><icon class="attr" data-attr-icon="2"><!----></icon></li>
<li><icon class="attr" data-attr-icon="3"><!----></icon></li>
<li><icon class="attr" data-attr-icon="4"><!----></icon></li>
</ul>
<ul class="tIf-types">
<li><icon class="type-icon" data-type-icon="4"><!----></icon></li>
<li><icon class="type-icon" data-type-icon="5"><!----></icon></li>
<li><icon class="type-icon" data-type-icon="7"><!--惡魔--></icon></li>
<li><icon class="type-icon" data-type-icon="8"><!--机械--></icon></li>
<li><icon class="type-icon" data-type-icon="1"><!--平衡--></icon></li>
<li><icon class="type-icon" data-type-icon="6"><!--攻撃--></icon></li>
<li><icon class="type-icon" data-type-icon="2"><!--体力--></icon></li>
<li><icon class="type-icon" data-type-icon="3"><!--回復--></icon></li>
<li><icon class="type-icon" data-type-icon="0"><!--進化用--></icon></li>
<li><icon class="type-icon" data-type-icon="12"><!--能力覺醒用--></icon></li>
<li><icon class="type-icon" data-type-icon="14"><!--強化合成用--></icon></li>
<li><icon class="type-icon" data-type-icon="15"><!--販賣用--></icon></li>
</ul>
</div>
</div>
</li>
</ul>
@ -701,14 +749,16 @@ var formation = new Formation(teamsCount,5);
</div>
<div class="awoken-div"><!--觉醒-->
<ul class="awoken-ul all-awokens">
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="49" data-max-count="1"></button><!--武器觉醒--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="21"></button><!--SB--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="52" data-max-count="1"></button><!--大防封--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="43"></button><!--7c--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="61"></button><!--10c--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="58"></button><!--下半血强化--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="48"></button><!--破无效--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="27"></button><!--U--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="21"></button><!--SB--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="49" data-max-count="1"></button><!--武器觉醒--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="52" data-max-count="1"></button><!--大防封--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="60"></button><!--L解锁--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="58"></button><!--下半血强化--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="57"></button><!--上半血强化--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="11" data-max-count="5"></button><!--防暗--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="12" data-max-count="5"></button><!--防废--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="13" data-max-count="5"></button><!--防毒--></li>
@ -717,7 +767,6 @@ var formation = new Formation(teamsCount,5);
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="45" data-max-count="1"></button><!--心追--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="50"></button><!--方块心追--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="19"></button><!--手指--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="60"></button><!--L解锁--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="1"></button><!--HP+--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="2"></button><!--攻击+--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="3"></button><!--回复+--></li>
@ -760,7 +809,6 @@ var formation = new Formation(teamsCount,5);
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="51"></button><!--5色溜--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="53"></button><!--大手指--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="56"></button><!--大SB--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="57"></button><!--满血强化--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="59"></button><!--L盾--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="62"></button><!--c珠--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="63" data-max-count="1"></button><!--语音--></li>
@ -779,18 +827,23 @@ var formation = new Formation(teamsCount,5);
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="76"></button><!--2串光--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="77"></button><!--2串暗--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="78"></button><!--十字--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="79"></button><!--3色--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="80"></button><!--4色--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="81"></button><!--5色--></li>
</ul>
</div>
<div class="sawoken-div"><!--超觉醒-->
<button class="sawoken-clear brown-button" ></button>
<ul class="sawoken-ul">
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="43" id="search-awoken-43" /><label class="awoken-icon" data-awoken-icon="43" for="search-awoken-43"></label><!--7c--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="61" id="search-awoken-61" /><label class="awoken-icon" data-awoken-icon="61" for="search-awoken-61"></label><!--10c--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="58" id="search-awoken-58" /><label class="awoken-icon" data-awoken-icon="58" for="search-awoken-58"></label><!--下半血强化--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="48" id="search-awoken-48" /><label class="awoken-icon" data-awoken-icon="48" for="search-awoken-48"></label><!--破无效--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="27" id="search-awoken-27" /><label class="awoken-icon" data-awoken-icon="27" for="search-awoken-27"></label><!--U--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="21" id="search-awoken-21" /><label class="awoken-icon" data-awoken-icon="21" for="search-awoken-21"></label><!--SB--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="52" id="search-awoken-52" /><label class="awoken-icon" data-awoken-icon="52" for="search-awoken-52"></label><!--大防封--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="43" id="search-awoken-43" /><label class="awoken-icon" data-awoken-icon="43" for="search-awoken-43"></label><!--7c--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="61" id="search-awoken-61" /><label class="awoken-icon" data-awoken-icon="61" for="search-awoken-61"></label><!--10c--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="48" id="search-awoken-48" /><label class="awoken-icon" data-awoken-icon="48" for="search-awoken-48"></label><!--破无效--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="27" id="search-awoken-27" /><label class="awoken-icon" data-awoken-icon="27" for="search-awoken-27"></label><!--U--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="60" id="search-awoken-60" /><label class="awoken-icon" data-awoken-icon="60" for="search-awoken-60"></label><!--L解锁--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="58" id="search-awoken-58" /><label class="awoken-icon" data-awoken-icon="58" for="search-awoken-58"></label><!--下半血强化--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="57" id="search-awoken-57" /><label class="awoken-icon" data-awoken-icon="57" for="search-awoken-57"></label><!--上半血强化--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="68" id="search-awoken-68" /><label class="awoken-icon" data-awoken-icon="68" for="search-awoken-68"></label><!--大防暗--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="69" id="search-awoken-69" /><label class="awoken-icon" data-awoken-icon="69" for="search-awoken-69"></label><!--大防废--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="70" id="search-awoken-70" /><label class="awoken-icon" data-awoken-icon="70" for="search-awoken-70"></label><!--大防毒--></li>
@ -799,7 +852,6 @@ var formation = new Formation(teamsCount,5);
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="45" id="search-awoken-45" /><label class="awoken-icon" data-awoken-icon="45" for="search-awoken-45"></label><!--心追--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="50" id="search-awoken-50" /><label class="awoken-icon" data-awoken-icon="50" for="search-awoken-50"></label><!--方块心追--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="19" id="search-awoken-19" /><label class="awoken-icon" data-awoken-icon="19" for="search-awoken-19"></label><!--手指--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="60" id="search-awoken-60" /><label class="awoken-icon" data-awoken-icon="60" for="search-awoken-60"></label><!--L解锁--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="1" id="search-awoken-1" /><label class="awoken-icon" data-awoken-icon="1" for="search-awoken-1"></label><!--HP+--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="2" id="search-awoken-2" /><label class="awoken-icon" data-awoken-icon="2" for="search-awoken-2"></label><!--攻击+--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="3" id="search-awoken-3" /><label class="awoken-icon" data-awoken-icon="3" for="search-awoken-3"></label><!--回复+--></li>
@ -846,7 +898,6 @@ var formation = new Formation(teamsCount,5);
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="51" id="search-awoken-51" /><label class="awoken-icon" data-awoken-icon="51" for="search-awoken-51"></label><!--5色溜--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="53" id="search-awoken-53" /><label class="awoken-icon" data-awoken-icon="53" for="search-awoken-53"></label><!--大手指--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="56" id="search-awoken-56" /><label class="awoken-icon" data-awoken-icon="56" for="search-awoken-56"></label><!--大SB--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="57" id="search-awoken-57" /><label class="awoken-icon" data-awoken-icon="57" for="search-awoken-57"></label><!--满血强化--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="59" id="search-awoken-59" /><label class="awoken-icon" data-awoken-icon="59" for="search-awoken-59"></label><!--L盾--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="62" id="search-awoken-62" /><label class="awoken-icon" data-awoken-icon="62" for="search-awoken-62"></label><!--c珠--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="63" id="search-awoken-63" /><label class="awoken-icon" data-awoken-icon="63" for="search-awoken-63"></label><!--语音--></li>
@ -862,6 +913,9 @@ var formation = new Formation(teamsCount,5);
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="76" id="search-awoken-76" /><label class="awoken-icon" data-awoken-icon="76" for="search-awoken-76"></label><!--2串光--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="77" id="search-awoken-77" /><label class="awoken-icon" data-awoken-icon="77" for="search-awoken-77"></label><!--2串暗--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="78" id="search-awoken-78" /><label class="awoken-icon" data-awoken-icon="78" for="search-awoken-78"></label><!--十字--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="79" id="search-awoken-79" /><label class="awoken-icon" data-awoken-icon="79" for="search-awoken-79"></label><!--3色--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="80" id="search-awoken-80" /><label class="awoken-icon" data-awoken-icon="80" for="search-awoken-80"></label><!--4色--></li>
<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="control-div"><!--控制栏-->
@ -915,7 +969,7 @@ var formation = new Formation(teamsCount,5);
<div class="setting-row row-mon-id">
<input type="checkbox" class="config-checkbox-ipt" name="real-time-change-card" id="real-time-change-card"><label class="config-checkbox-lbl real-time-change-card-label" for="real-time-change-card"><div class="config-checkbox-lbl-cicle"></div></label>
<button class="open-evolutionary-tree"></button>
<button class="open-search"></button><!--搜索怪物按钮-->
<button class="search-evolution-by-this"><icon class="type-icon" data-type-icon="0"></icon></button>
<input type="search" class="m-id" list="monsters-name-list"/><button class="search-by-string"></button>
<datalist id="monsters-name-list"></datalist>
<ul class="evo-card-list"></ul>
@ -1094,5 +1148,30 @@ var formation = new Formation(teamsCount,5);
<line />
</g>
</svg>
<div id="qr-code-frame" class="mask display-none">
<button class="mask-close brown-button"></button>
<div class="mask-content">
<div class="read-qr-box">
<div class="action-button-box">
<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">
</div>
<div class="info"></div>
<div class="video-box display-none">
<div><label for="sourceSelect"><!--视频源选择--></label><select id="sourceSelect"></select></div>
<video id="video" width="500" height="500"></video>
</div>
</div>
<div class="save-qr-box">
<ul class="qr-data-type-ul">
<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>
<div class="qr-box"><img class="qr-code-image" /></div>
<a download="" class="save-qr-img brown-button"><!--保存QR 图片--></a>
</div>
</div>
</div>
</body>
</html>

View File

@ -68,7 +68,79 @@ const official_awoken_sorting = [
4, 5, 6, 7, 8, 35, 36, 37, 38,
1, 2, 3, 46, 47, 39, 40, 41, 42,
65, 66, 67, 9, 71, 72, 30, 64, 63,
73, 74, 75, 76, 77, 78];
73, 74, 75, 76, 77, 78, 79, 80, 81
];
//pdc的徽章对应数字
const pdcBadgeMap = [
{pdf:0,pdc:10}, //无限cost
{pdf:1,pdc:12}, //小手指
{pdf:2,pdc:9}, //全体攻击
{pdf:3,pdc:5}, //小回复
{pdf:4,pdc:1}, //小血量
{pdf:5,pdc:3}, //小攻击
{pdf:6,pdc:8}, //SB
{pdf:7,pdc:18}, //队长防封
{pdf:8,pdc:19}, //SX
{pdf:9,pdc:7}, //无天降
{pdf:10,pdc:6}, //大回复
{pdf:11,pdc:2}, //大血量
{pdf:12,pdc:4}, //大攻击
{pdf:13,pdc:13}, //大手指
{pdf:14,pdc:11}, //加经验
{pdf:15,pdc:15}, //墨镜
{pdf:16,pdc:17}, //防废
{pdf:17,pdc:16}, //防毒
{pdf:18,pdc:14}, //月卡
];
//pdc的潜觉对应数字
const pdcLatentMap = [
{pdf:1,pdc:1}, //HP
{pdf:2,pdc:0}, //攻击
{pdf:3,pdc:2}, //回复
{pdf:4,pdc:19}, //手指
{pdf:5,pdc:13}, //自回
{pdf:6,pdc:14}, //火盾
{pdf:7,pdc:15}, //水盾
{pdf:8,pdc:16}, //木盾
{pdf:9,pdc:17}, //光盾
{pdf:10,pdc:18}, //暗盾
{pdf:11,pdc:12}, //防坐
{pdf:12,pdc:3}, //三维
{pdf:13,pdc:35}, //不被换队长
{pdf:14,pdc:37}, //不掉废
{pdf:15,pdc:36}, //不掉毒
{pdf:16,pdc:24}, //进化杀
{pdf:17,pdc:25}, //觉醒杀
{pdf:18,pdc:26}, //强化杀
{pdf:19,pdc:27}, //卖钱杀
{pdf:20,pdc:4}, //神杀
{pdf:21,pdc:5}, //龙杀
{pdf:22,pdc:6}, //恶魔杀
{pdf:23,pdc:7}, //机械杀
{pdf:24,pdc:8}, //平衡杀
{pdf:25,pdc:9}, //攻击杀
{pdf:26,pdc:10}, //体力杀
{pdf:27,pdc:11}, //回复杀
{pdf:28,pdc:20}, //大HP
{pdf:29,pdc:21}, //大攻击
{pdf:30,pdc:22}, //大回复
{pdf:31,pdc:23}, //大手指
{pdf:32,pdc:28}, //大火盾
{pdf:33,pdc:29}, //大水盾
{pdf:34,pdc:30}, //大木盾
{pdf:35,pdc:31}, //大光盾
{pdf:36,pdc:32}, //大暗盾
{pdf:37,pdc:33}, //6色破无效
{pdf:38,pdc:34}, //3色破属吸
{pdf:39,pdc:40}, //C珠破吸
{pdf:40,pdc:39}, //心横解转转
{pdf:41,pdc:38}, //U解禁消
{pdf:42,pdc:41}, //伤害上限解除
{pdf:43,pdc:42}, //HP++
{pdf:44,pdc:43}, //攻击++
{pdf:45,pdc:44}, //回复++
];
//排序程序列表
const sort_function_list = [
{tag:"sort_none",name:"无",function:()=>0},
@ -87,6 +159,7 @@ const sort_function_list = [
}},
{tag:"sort_rarity",name:"稀有度",function:(a,b)=>a.rarity-b.rarity},
{tag:"sort_cost",name:"消耗",function:(a,b)=>a.cost-b.cost},
{tag:"sort_mp",name:"MP",function:(a,b)=>a.mp-b.mp},
{tag:"sort_skillLv1",name:"技能最大冷却时间",function:(a,b)=>Skills[a.activeSkillId].initialCooldown-Skills[b.activeSkillId].initialCooldown},
{tag:"sort_skillLvMax",name:"技能最小冷却时间",function:(a,b)=>{
const skill_a = Skills[a.activeSkillId],skill_b = Skills[b.activeSkillId];

View File

@ -30,27 +30,32 @@ const GM_xmlhttpRequest = function(GM_param) {
//获取URL参数
function getQueryString(name, url) {
if (!!(window.URL && window.URLSearchParams)) { //浏览器原生支持的API
const urlObj = new URL(url || document.location);
return urlObj.searchParams.get(name);
} else {
const reg = new RegExp(`(?:^|&)${name}=([^&]*)(?:&|$)`, "i");
const searchStr = url || location.search.substr(1);
const r = searchStr.match(reg);
if (r != null) {
return decodeURIComponent(r[1]);
} else {
return null;
const urlObj = new URL(url || document.location);
if (!Array.isArray(name)) name = [name];
let n_e = name.entries(), n;
let value;
do
{
n = n_e.next();
if (!n.done)
{
value = urlObj.searchParams.get(n.value[1]);
}
}
}while(!n.done && value == undefined)
return value;
}
//数字补前导0
Number.prototype.prefixInteger = function(length, useGrouping = false) {
return this.toLocaleString(undefined, {
useGrouping: useGrouping,
minimumIntegerDigits: length
});
return this.toLocaleString(undefined, {
useGrouping: useGrouping,
minimumIntegerDigits: length
});
}
//数字补前导0
String.prototype.prefix = function(length = 2, prefix = '0') {
let needAddLength = Math.max(length - this.length, 0);
return new Array(needAddLength).fill(prefix).join('') + this;
}
//大数字缩短长度,默认返回本地定义字符串
Number.prototype.bigNumberToString = function() {
@ -135,6 +140,25 @@ fetch("library/jy4340132-aaa/adpcm.wasm").then((response) => response.arrayBuffe
}*/
});
//▲ADPCM播放相关
// 加载 image
function loadImage(url) {
return new Promise(function(resolve, reject) {
var image = new Image();
image.src = url;
image.type = "svg"
image.crossOrigin = 'Anonymous';
image.onload = function() {
resolve(this);
};
image.onerror = function(err) {
reject(err);
};
});
}
function latentUseHole(latentId) {
switch (true) {
case (latentId === 12):
@ -691,6 +715,17 @@ function countTeamHp(memberArr, leader1id, leader2id, solo, noAwoken = false) {
break;
}
break;
case 229:{ //队员中存在每个属性或Type都算一次
let cardsArr = memberArr.filter(m => m.id > 0).map(m => Cards[m.id]); //所有的卡片
let attrsArr = cardsArr.flatMap(card => card.attr); //所有卡片的属性
let typesArr = cardsArr.flatMap(card => card.types); //所有卡片的类型
let correspondingAttrs = flags(sk[0]); //符合的属性
let correspondingTypes = flags(sk[1]); //符合的类型
let correspondingTimes = attrsArr.filter(a=>correspondingAttrs.includes(a)).length + typesArr.filter(t=>correspondingTypes.includes(t)).length; //符合的次数
scale = sk[2] * correspondingTimes / 100 + 1;
//console.log('属性、类型个数动态倍率当前队长HP倍率为 %s',scale);
break;
}
case 138: //调用其他队长技
scale = sk.reduce((pmul, skid) => pmul * memberHpMul(card, Skills[skid], memberArr, solo), 1)
break;

687
script.js
View File

@ -12,8 +12,12 @@ let statusLine; //储存状态栏
let formationBox; //储存整个formationBox
let editBox; //储存整个editBox
let showSearch; //整个程序都可以用的显示搜索函数
let qrcodeReader; //二维码读取
let qrcodeWriter; //二维码输出
let selectedDeviceId; //视频源id
const dataStructure = 3; //阵型输出数据的结构版本
const cfgPrefix = "PADDF-"; //设置名称的前缀
const className_displayNone = "display-none";
const dataAttrName = "data-value"; //用于储存默认数据的属性名
const isGuideMod = Boolean(Number(getQueryString("guide"))); //是否以图鉴模式启动
@ -21,19 +25,31 @@ const isGuideMod = Boolean(Number(getQueryString("guide"))); //是否以图鉴
if (location.search.includes('&amp;')) {
location.search = location.search.replace(/&amp;/ig, '&');
}
let localTranslating = {
webpage_title: `智龙迷城${teamsCount}人队伍图制作工具`,
}
//一开始就加载当前语言
if (currentLanguage == undefined)
{
const parameter_i18n = getQueryString("l") || getQueryString("lang"); //获取参数指定的语言
const browser_i18n = (navigator.language || navigator.userLanguage); //获取浏览器语言
currentLanguage = languageList.find(lang => { //筛选出符合的语言
if (parameter_i18n) //如果已指定就用指定的语言
return parameter_i18n.includes(lang.i18n);
else //否则筛选浏览器默认语言
return browser_i18n.includes(lang.i18n);
}) ||
languageList[0]; //没有找到指定语言的情况下,自动用第一个语言(英语)
const parameter_i18n = getQueryString(["l","lang"]); //获取参数指定的语言
const browser_i18n = navigator.language; //获取浏览器语言
if (parameter_i18n) //有指定语言的话只找i18n完全相同的
{
currentLanguage = languageList.find(lang => lang.i18n == parameter_i18n) || languageList[0];
}
if (!currentLanguage) //如果还没有就直接搜索浏览器语言
{
currentLanguage = languageList.find(lang => { //筛选出符合的语言
if (lang.i18n_RegExp)
{
return lang.i18n_RegExp.test(browser_i18n); //匹配正则表达式
}else
{
return browser_i18n.includes(lang.i18n); //文字上的搜索包含
}
}) || languageList[0]; //没有找到指定语言的情况下,自动用第一个语言(英语)
}
//因为Script在Head里面所以可以这里head已经加载好可以使用
document.head.querySelector("#language-css").href = `languages/${currentLanguage.i18n}.css`;
}
@ -42,13 +58,11 @@ if (currentLanguage == undefined)
if (currentDataSource == undefined)
{
const parameter_dsCode = getQueryString("s"); //获取参数指定的数据来源
currentDataSource = parameter_dsCode ?
(dataSourceList.find(ds => ds.code == parameter_dsCode) || dataSourceList[0]) : //筛选出符合的数据源
dataSourceList[0]; //没有指定,直接使用日服
currentDataSource = dataSourceList.find(ds => ds.code == parameter_dsCode) || dataSourceList[0]; //筛选出符合的数据源
}
const dbName = "PADDF";
var db = null;
let db = null;
const DBOpenRequest = indexedDB.open(dbName,2);
DBOpenRequest.onsuccess = function(event) {
@ -170,10 +184,10 @@ Member.prototype.loadObj = function(m, dataVersion) {
} else {
this.plus = m.plus;
}
if (!(Array.isArray(this.plus))) this.plus = [0, 0, 0]; //如果加值不是数组,则改变
if (!Array.isArray(this.plus)) this.plus = [0, 0, 0]; //如果加值不是数组,则改变
this.latent = dataVersion > 1 ? m[4] : m.latent;
if (Array.isArray(this.latent) && dataVersion <= 2) this.latent = this.latent.map(l => l >= 13 ? l + 3 : l); //修复以前自己编的潜觉编号为官方编号
if (!(Array.isArray(this.latent))) this.latent = []; //如果潜觉不是数组,则改变
if (!Array.isArray(this.latent)) this.latent = []; //如果潜觉不是数组,则改变
this.sawoken = dataVersion > 1 ? m[5] : m.sawoken;
this.skilllevel = m[6] || null;
};
@ -314,6 +328,99 @@ Formation.prototype.loadObj = function(f) {
if (f.b)
this.teams[0][2] = f.b; //原来模式的徽章
};
Formation.prototype.getPdfQrObj = function(keepSource = true)
{
let qrObj = {
d:this.outObj()
};
if (keepSource) qrObj.s = currentDataSource.code;
return qrObj;
}
Formation.prototype.getPdcQrStr = function()
{
function genMemberMap(m, a, position = 0)
{
const o = new Map();
o.set(0, m.id);
if (m.latent.length)
o.set(2, m.latent.map(pdfLtent=>pdcLatentMap.find(latent=>latent.pdf === pdfLtent).pdc.toString(36).prefix(2)).join('')); //潜觉
o.set(3, m.level);
o.set(4, m.plus[0]);
o.set(5, m.plus[1]);
o.set(6, m.plus[2]);
o.set(7, (m.awoken != null && m.awoken >= Cards[m.id].awakenings.length) ? -1 : m.awoken);
o.set(8, (m.sawoken != null && m.sawoken >= 0) ? Cards[m.id].superAwakenings[m.sawoken] : 0);
if (a.id != 0)
{
o.set(9, a.id);
o.set(10, a.level);
o.set(11, a.plus[0]);
o.set(12, a.plus[1]);
o.set(13, a.plus[2]);
o.set(14, (a.awoken != null && a.awoken >= Cards[a.id].awakenings.length) ? -1 : a.awoken);
}
o.set(15, position);
return o;
}
let outArr = [
[1,this.teams.length - 1]
];
if (this.teams.length == 2)
{
const team1 = this.teams[0];
const team2 = this.teams[1];
team1[0].push(team2[0].shift());
team1[1].push(team2[1].shift());
}
let pdcTeamsStr = this.teams.map((t,idx,arr)=>{
let teamArr = [
pdcBadgeMap.find(badge=>badge.pdf === t[2]).pdc //徽章
];
const membersArr = t[0];
const assistArr = t[1];
for (let i=0;i<membersArr.length;i++)
{
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是空的
pdcMemberStr = pdcMemberArr.map(item => {
if (item[1] == undefined)
{
console.log(item[0])
}
return [
item[0].toString(36).prefix(2),
item[1].toString(36).prefix(2)
].join('')}).join(',');
teamArr.push(pdcMemberStr);
}
}
return teamArr.join('}');
});
if (this.teams.length == 2)
{
const team1 = this.teams[0];
const team2 = this.teams[1];
team2[0].splice(0,0,team1[0].pop());
team2[1].splice(0,0,team1[1].pop());
}
outArr = outArr.concat(pdcTeamsStr);
return outArr.join(']');
}
Formation.prototype.getQrStr = function(type)
{
if (type == 'pdf' || type == 0)
{
return JSON.stringify(this.getPdfQrObj());
}else
{
return this.getPdcQrStr();
}
}
//进化树
class EvoTree
@ -569,6 +676,9 @@ window.onload = function(event) {
alert("请更新您的浏览器。\nPlease update your browser.");
}
qrcodeReader = new ZXing.BrowserQRCodeReader(); //二维码读取
qrcodeWriter = new ZXing.BrowserQRCodeSvgWriter(); //二维码生成
controlBox = document.body.querySelector(".control-box");
statusLine = controlBox.querySelector(".status"); //显示当前状态的
formationBox = document.body.querySelector(".formation-box");
@ -610,20 +720,20 @@ window.onload = function(event) {
//记录显示CD开关的状态
const showMonSkillCd_id = "show-mon-skill-cd";
const btnShowMonSkillCd = controlBox.querySelector(`#btn-${showMonSkillCd_id}`);
btnShowMonSkillCd.checked = Boolean(Number(localStorage.getItem("PADDF-" + showMonSkillCd_id)));
btnShowMonSkillCd.checked = Boolean(Number(localStorage.getItem(cfgPrefix + showMonSkillCd_id)));
btnShowMonSkillCd.onclick = function(){
toggleDomClassName(this, showMonSkillCd_id);
localStorage.setItem("PADDF-" + showMonSkillCd_id, Number(this.checked));
localStorage.setItem(cfgPrefix + showMonSkillCd_id, Number(this.checked));
};
btnShowMonSkillCd.onclick();
//记录显示觉醒开关的状态
const showMonAwoken_id = "show-mon-awoken";
const btnShowMonAwoken = controlBox.querySelector(`#btn-${showMonAwoken_id}`);
btnShowMonAwoken.checked = Boolean(Number(localStorage.getItem("PADDF-" + showMonAwoken_id)));
btnShowMonAwoken.checked = Boolean(Number(localStorage.getItem(cfgPrefix + showMonAwoken_id)));
btnShowMonAwoken.onclick = function(){
toggleDomClassName(this, showMonAwoken_id);
localStorage.setItem("PADDF-" + showMonAwoken_id, Number(this.checked));
localStorage.setItem(cfgPrefix + showMonAwoken_id, Number(this.checked));
};
btnShowMonAwoken.onclick();
@ -673,7 +783,7 @@ function loadData(force = false)
lastCkeys = localStorage.getItem("PADDF-ckey"); //读取本地储存的原来的ckey
try {
lastCkeys = JSON.parse(lastCkeys);
if (lastCkeys == null || !(Array.isArray(lastCkeys)))
if (lastCkeys == null || !Array.isArray(lastCkeys))
lastCkeys = [];
} catch (e) {
console.error("旧的 Ckey 数据 JSON 解码出错。", e);
@ -882,7 +992,7 @@ function reloadFormationData(event) {
}else
{
try {
const parameterDataString = getQueryString("d") || getQueryString("data");
const parameterDataString = getQueryString(["d","data"]);
formationData = JSON.parse(parameterDataString);
//console.log("从URL读取",formationData);
@ -922,7 +1032,7 @@ window.addEventListener('popstate',reloadFormationData); //前进后退时修改
function creatNewUrl(arg) {
if (arg == undefined) arg = {};
if (!!(window.history && history.pushState)) { // 支持History API
const language_i18n = arg.language || getQueryString("l") || getQueryString("lang"); //获取参数指定的语言
const language_i18n = arg.language || getQueryString(["l","lang"]); //获取参数指定的语言
const datasource = arg.datasource || getQueryString("s");
const outObj = formation.outObj();
@ -946,6 +1056,186 @@ function creatNewUrl(arg) {
}
}
}
//解析从QR图里获取的字符串
function inputFromQrString(string)
{
const re = {code: 0, message: null};
function ObjToUrl(obj)
{
let fileName;
switch (obj.d.f.length)
{
case 1:{
fileName = "solo.html";
break;
}
case 2:{
fileName = "multi.html";
break;
}
case 3:{
fileName = "triple.html";
break;
}
}
const newUrl = new URL(fileName, location);
newUrl.searchParams.set("d",JSON.stringify(obj.d));
if (!obj.s || obj.s == "ja")
{
newUrl.searchParams.delete("s");
}else
{
newUrl.searchParams.set("s", obj.s);
}
let l = getQueryString("l");
if (l)
{
newUrl.searchParams.set("l", l);
}
return newUrl;
}
//code 1~99 为各种编码
if (string.substr(0,1) == "{" && string.substr(-1,1) == "}")
{
try{
let jo = JSON.parse(string);
if (jo.d && typeof jo.d == "object")
{
re.code = 1;
re.message = "发现队伍数据 | Formation data founded";
re.url = ObjToUrl(jo);
}else
{
re.code = 100;
re.message = "无队伍数据 | No formation data";
}
}catch(e)
{
re.code = 111;
re.message = "错误的 JSON 格式 | The illegal JSON format";
}
}
else if (/^http/i.test(string))
{
try{
let url = new URL(string);
if (url.searchParams.get('d'))
{
re.code = 1;
re.message = "发现队伍数据 | Formation data founded";
let jo = {
d: JSON.parse(url.searchParams.get('d')),
s: url.searchParams.get('s'),
}
re.url = ObjToUrl(jo);
}else
{
re.code = 100;
re.message = "无队伍数据 | No formation data";
}
}catch(e)
{
re.code = 112;
re.message = "错误的 网址 格式 | The illegal URL format";
}
}
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.url = ObjToUrl(newFotmation.getPdfQrObj(false));
}
else
{
re.code = 110;
re.message = "不是 JSON 格式 | Not JSON format";
}
return re;
}
//解析PDC的数据
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 team;
}
);
let pdcFotmation = {
version: parseInt(baseInfo[0],10),
teamCount: parseInt(baseInfo[1],10)+1,
teams: teamsArr
}
return pdcFotmation;
}
function pdcFotmationToPdfFotmation(pdcFotmation)
{
const f = new Formation(pdcFotmation.teamCount, pdcFotmation.teamCount == 2 ? 5 : 6);
if (pdcFotmation.teamCount == 2)
{
const team1 = pdcFotmation.teams[0].members;
const team2 = pdcFotmation.teams[1].members;
let team2Leader = team1.find(member=>member.get(15) == 5);
if (team2Leader)
{
team2Leader.set(15,0);
team2.splice(0,0,team2Leader);
team1.splice(team1.indexOf(team2Leader),1);
}
}
pdcFotmation.teams.forEach((pdcTeam,ti)=>{
const t = f.teams[ti];
const membersArr = t[0];
const assistArr = t[1];
//队伍徽章
t[2] = pdcTeam.badge === 0 ? 0 : pdcBadgeMap.find(badge=>badge.pdc === pdcTeam.badge).pdf;
pdcTeam.members.forEach((member)=>{
const m = membersArr[member.get(15) || 0];
const a = assistArr[member.get(15) || 0];
m.id = member.get(0) || 0;
a.id = member.get(9) || 0; //延迟是-1刚好一样
if (member.get(2))
{
m.latent = member.get(2).map(pdcLatent=>pdcLatentMap.find(latent=>latent.pdc === pdcLatent).pdf);
}
m.level = member.get(3) || 1;
a.level = member.get(10) || 1;
m.plus[0] = member.get(4) || 0;
m.plus[1] = member.get(5) || 0;
m.plus[2] = member.get(6) || 0;
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;
m.sawoken = member.get(8) ? Cards[m.id].superAwakenings.indexOf(member.get(8)) : null;
});
});
return f;
}
//截图
function capture() {
statusLine.classList.add("prepare-cauture");
@ -991,6 +1281,248 @@ function initialize() {
line.setAttribute("y2", p2.y);
};
const qrCodeFrame = document.body.querySelector("#qr-code-frame");
const btnQrCode = controlBox.querySelector(`.btn-qrcode`);
btnQrCode.onclick = function(){
qrCodeFrame.show();
};
qrCodeFrame.show = function(){
const saveBox = this.content.saveBox;
const readBox = this.content.readBox;
readBox.info.textContent = "";
readBox.videoBox.classList.add(className_displayNone);
this.classList.remove(className_displayNone);
this.refreshQrCode(formation.getQrStr(saveBox.qrDataType.find(radio=>radio.checked).value));
};
qrCodeFrame.hide = function(){
qrcodeReader.reset();
this.classList.add(className_displayNone);
};
qrCodeFrame.close = qrCodeFrame.querySelector(".mask-close");
qrCodeFrame.close.onclick = function(){qrCodeFrame.hide()};
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.readQrCamera = qrReadBox.querySelector(".read-qr-camera");
qrReadBox.readQrFile = qrReadBox.querySelector(".read-qr-file");
qrReadBox.filePicker = qrReadBox.querySelector(".file-select");
qrReadBox.info = qrReadBox.querySelector(".info");
qrReadBox.video = qrReadBox.querySelector("#video");
qrReadBox.videoBox = qrReadBox.querySelector(".video-box");
qrReadBox.sourceSelect = qrReadBox.querySelector("#sourceSelect");
qrSaveBox.qrImage = qrSaveBox.querySelector(".qr-code-image");
qrSaveBox.qrDataType = Array.from(qrSaveBox.querySelectorAll(".qr-data-type-radio"));
qrSaveBox.qrDataType.forEach(radio=>radio.onclick = function(){
qrCodeFrame.refreshQrCode(formation.getQrStr(this.value));
});
qrSaveBox.saveQrImg = qrSaveBox.querySelector(".save-qr-img");
qrCodeFrame.ondragenter = ()=>false;
qrCodeFrame.ondragover = ()=>false;
qrCodeFrame.ondrop = function(e)
{
imagesSelected(e.dataTransfer.files);
e.stopPropagation();
e.preventDefault();
}
qrCodeFrame.refreshQrCode = function(string)
{
const qrImg = this.content.saveBox.qrImage;
URL.revokeObjectURL(qrImg.src);
const EncodeHintType = ZXing.EncodeHintType;
const hints = new Map();
hints.set(EncodeHintType.MARGIN, 0);
//hints.set(EncodeHintType.CHARACTER_SET, "UTF8");
const qrWidth = 500,qrHeight = 500;
let svgElement = qrcodeWriter.write(string, qrWidth, qrHeight, hints);
let svgData = new XMLSerializer().serializeToString(svgElement);
let blob = new Blob([svgData], {type : 'image/svg+xml'});
let svgUrl = URL.createObjectURL(blob);
qrImg.src = svgUrl;
loadImage(svgUrl).then(function(img) {
let cavansWidth = qrWidth * 2, cavansHeight = qrHeight * 2;
let cavans = document.createElement("canvas");
cavans.width = cavansWidth;
cavans.height = cavansHeight;
let ctx = cavans.getContext('2d');
ctx.fillStyle="white";
ctx.fillRect(0, 0, cavansWidth, cavansHeight)
ctx.drawImage(img, 0, 0, cavansWidth, cavansHeight);
cavans.toBlob(function(blob) {
const saveQrImg = qrSaveBox.saveQrImg;
URL.revokeObjectURL(saveQrImg.href);
const downLink = URL.createObjectURL(blob);
saveQrImg.download = formation.title || "PAD Dash Formation QR";
saveQrImg.href = downLink;
});
svgElement = null;
svgData = null;
blob = null;
img = null;
cavans = null;
ctx = null;
}, function(err) {
console.log(err);
});
}
qrReadBox.readQrFile.onclick = function()
{
qrReadBox.filePicker.click();
}
qrReadBox.filePicker.onchange = function()
{
imagesSelected(this.files);
}
function imagesSelected(myFiles) {
if (myFiles.length < 1) return;
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);
}
}).catch((err) => {
console.error(err);
if (err) {
if (err instanceof ZXing.NotFoundException) {
qrReadBox.info.textContent = 'No QR code found.';
}
if (err instanceof ZXing.ChecksumException) {
qrReadBox.info.textContent = 'A code was found, but it\'s read value was not valid.';
}
if (err instanceof ZXing.FormatException) {
qrReadBox.info.textContent = 'A code was found, but it was in a invalid format.';
}
}
})
console.log(`Started decode for image from ${img.src}`)
}, function(err) {
console.log(err);
});
}
if (location.protocol == "http:" && location.host != "localhost" && location.host != "127.0.0.1")
{ //http不支持攝像頭
//qrReadBox.readQrCamera.classList.add(className_displayNone);
qrReadBox.readQrCamera.onclick = function()
{
if(confirm("需要 https 环境下才支持调用摄像头,是否跳转?\nCalling the camera is required in an https environment, do you want to jump?"))
location.protocol = "https:" //跳到https
}
}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;
}
}
if (err) {
if (err instanceof ZXing.NotFoundException) {
console.log('No QR code found.')
}
if (err instanceof ZXing.ChecksumException) {
console.log('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.')
}
}
});
}
qrcodeReader.getVideoInputDevices()
.then((videoInputDevices) => {
const sourceSelect_id = "selected-device-id";
selectedDeviceId = localStorage.getItem(cfgPrefix + sourceSelect_id);
if (videoInputDevices.every(device=>device.deviceId != selectedDeviceId))
{
selectedDeviceId = videoInputDevices[0].deviceId;
}
if (videoInputDevices.length >= 1) {
videoInputDevices.forEach((element) => {
const sourceOption = document.createElement('option');
sourceOption.text = element.label
sourceOption.value = element.deviceId
qrReadBox.sourceSelect.appendChild(sourceOption)
});
qrReadBox.sourceSelect.selectedIndex = videoInputDevices.findIndex(device=>device.deviceId == selectedDeviceId);
qrReadBox.sourceSelect.onchange = function() {
selectedDeviceId = this.value;
localStorage.setItem(cfgPrefix + sourceSelect_id, this.value);
if (qrReadBox.readQrCamera.classList.contains("running"))
{
qrcodeReader.reset();
scanContinuously();
}
};
}
qrReadBox.readQrCamera.onclick = function()
{
if (this.classList.contains("running"))
{
qrcodeReader.reset();
qrReadBox.videoBox.classList.add(className_displayNone);
qrReadBox.info.textContent = "";
}else
{
qrReadBox.videoBox.classList.remove(className_displayNone);
scanContinuously();
}
this.classList.toggle("running");
}
})
.catch((err) => {
console.error(err)
});
}
//标题和介绍文本框
const titleBox = formationBox.querySelector(".title-box");
const detailBox = formationBox.querySelector(".detail-box");
@ -1001,6 +1533,8 @@ function initialize() {
txtTitle.onchange = function() {
formation.title = this.value;
txtTitleDisplay.innerHTML = descriptionToHTML(this.value);
let titleStr = txtTitleDisplay.textContent.trim();
document.title = titleStr.length > 0 ? `${titleStr.trim()} - ${localTranslating.webpage_title}` : localTranslating.webpage_title;
creatNewUrl();
};
txtTitle.onblur = function() {
@ -1590,21 +2124,16 @@ function initialize() {
maskContent.appendChild(fragment);
this.classList.remove(className_displayNone);
}
evolutionaryTreeMask.close = function()
evolutionaryTreeMask.hide = function()
{
this.classList.add(className_displayNone);
}
const evolutionaryTreeMask_Close = evolutionaryTreeMask.querySelector(".mask-close");
evolutionaryTreeMask_Close.onclick = function(){evolutionaryTreeMask.close();};
evolutionaryTreeMask_Close.onclick = function(){evolutionaryTreeMask.hide();};
const openEvolutionaryTree = settingBox.querySelector(".row-mon-id .open-evolutionary-tree");
openEvolutionaryTree.onclick = function() {evolutionaryTreeMask.show(editBox.mid)};
const searchOpen = settingBox.querySelector(".row-mon-id .open-search");
searchOpen.onclick = function() {
s_includeSuperAwoken.onchange();
s_canAssist.onchange();
searchBox.classList.toggle(className_displayNone);
};
const searchEvolutionByThis = settingBox.querySelector(".row-mon-id .search-evolution-by-this");
searchEvolutionByThis.onclick = function() {showSearch(Cards.filter(card=>card.evoMaterials.includes(editBox.mid)))};
const s_attr1s = Array.from(searchBox.querySelectorAll(".attrs-div .attr-list-1 .attr-radio"));
const s_attr2s = Array.from(searchBox.querySelectorAll(".attrs-div .attr-list-2 .attr-radio"));
@ -1718,7 +2247,7 @@ function initialize() {
const officialSortingClassName = 'show-official-awoken-sorting';
const s_showOfficialAwokenSorting = searchBox.querySelector(`#${officialSortingClassName}`); //显示官方排序的觉醒
s_showOfficialAwokenSorting.onchange = function(){
localStorage.setItem("PADDF-" + officialSortingClassName, Number(this.checked));
localStorage.setItem(cfgPrefix + officialSortingClassName, Number(this.checked));
let fragmentAwoken = document.createDocumentFragment();
let fragmentSawoken = document.createDocumentFragment();
const awokenSorting = this.checked ? official_awoken_sorting : s_awokensUl.originalSorting;
@ -1743,7 +2272,7 @@ function initialize() {
s_awokensUl.appendChild(fragmentAwoken);
s_sawokensUl.appendChild(fragmentSawoken);
};
s_showOfficialAwokenSorting.checked = Boolean(Number(localStorage.getItem("PADDF-" + officialSortingClassName)));
s_showOfficialAwokenSorting.checked = Boolean(Number(localStorage.getItem(cfgPrefix + officialSortingClassName)));
s_showOfficialAwokenSorting.onchange();
const s_selectedAwokensUl = searchBox.querySelector(".selected-awokens");
@ -1815,7 +2344,7 @@ function initialize() {
const searchResultCount = searchBox.querySelector(".search-list-length");
showSearch = function(searchArr, customAdditionalFunction)
{
if (!(Array.isArray(searchArr)))
if (!Array.isArray(searchArr))
{ //如果不是数组就直接取消下一步
return;
}
@ -2022,6 +2551,8 @@ function initialize() {
//如果键入回车字符串长度大于0且不是数字则执行字符串搜索
if (e.key == "Enter" && this.value.length > 0 && !/^\d+$/.test(this.value))
{
s_includeSuperAwoken.onchange();
s_canAssist.onchange();
showSearch(searchByString(this.value));
}
}
@ -2030,13 +2561,15 @@ function initialize() {
const s_realTimeChangeCard = settingBox.querySelector(`#${realTimeClassName}`);
s_realTimeChangeCard.onchange = function() {
monstersID.oninput = this.checked ? idChange : null;
localStorage.setItem("PADDF-" + realTimeClassName, Number(this.checked));
localStorage.setItem(cfgPrefix + realTimeClassName, Number(this.checked));
}
s_realTimeChangeCard.checked = Boolean(Number(localStorage.getItem("PADDF-" + realTimeClassName)));
s_realTimeChangeCard.checked = Boolean(Number(localStorage.getItem(cfgPrefix + realTimeClassName)));
s_realTimeChangeCard.onchange();
//字符串搜索
btnSearchByString.onclick = function() {
s_includeSuperAwoken.onchange();
s_canAssist.onchange();
showSearch(searchByString(monstersID.value));
};
//觉醒
@ -2170,9 +2703,9 @@ function initialize() {
const s_hideLessUseLetent = settingBox.querySelector(`#${hideClassName}`);
s_hideLessUseLetent.onchange = function() {
toggleDomClassName(this, hideClassName, true, monEditLatentAllowableUl);
localStorage.setItem("PADDF-" + hideClassName, Number(this.checked));
localStorage.setItem(cfgPrefix + hideClassName, Number(this.checked));
}
s_hideLessUseLetent.checked = Boolean(Number(localStorage.getItem("PADDF-" + hideClassName)));
s_hideLessUseLetent.checked = Boolean(Number(localStorage.getItem(cfgPrefix + hideClassName)));
s_hideLessUseLetent.onchange();
const rowSkill = settingBox.querySelector(".row-mon-skill");
@ -2301,8 +2834,7 @@ function initialize() {
mon.plus[1] = parseInt(monEditAddAtk.value) || 0;
mon.plus[2] = parseInt(monEditAddRcv.value) || 0;
if (!editBox.isAssist) { //如果不是辅助,则可以设定潜觉
mon.latent = editBox.latent.concat()
.sort((a, b) => latentUseHole(b) - latentUseHole(a)); //并排序
mon.latent = editBox.latent.concat();
}
}
@ -2343,11 +2875,26 @@ function initialize() {
editBox.hide();
};
window.addEventListener("keydown",function(event) {
if (!editBox.classList.contains(className_displayNone)) {
if (!editBox.classList.contains(className_displayNone))
{ //编辑窗打开
if (event.key === "Escape") { //按下ESC时自动关闭编辑窗
btnCancel.onclick();
}
}
else
{
//如果按Ctrl+左右方向键或者是小键盘上的左右方向键关闭Num快速切换变身
if (event.key === "ArrowLeft"
&& (event.code == "Numpad4" || event.ctrlKey))
{
henshinStep(-1);
}
else if (event.key === "ArrowRight"
&& (event.code == "Numpad6" || event.ctrlKey))
{
henshinStep(+1);
}
}
});
btnNull.onclick = function() { //空位置
const mon = new Member();
@ -2521,7 +3068,7 @@ function changeid(mon, monDom, latentDom) {
awokenIcon.setAttribute(dataAttrName, mon.awoken || 0);
if (mon.awoken != null) //如果提供了觉醒
{
if (mon.awoken > 0 && mon.awoken == card.awakenings.length) {
if (card.awakenings.length > 0 && mon.awoken >= card.awakenings.length) {
awokenIcon.classList.add("full-awoken");
} else {
awokenIcon.classList.remove("full-awoken");
@ -2609,6 +3156,7 @@ function changeid(mon, monDom, latentDom) {
//刷新潜觉
function refreshLatent(latent, monid, iconArr) {
const maxLatentCount = getMaxLatentCount(monid); //最大潜觉数量
latent = latent.concat().sort((a, b) => latentUseHole(b) - latentUseHole(a));
let latentIndex = 0,
usedHoleN = 0;
for (let ai = 0; ai < iconArr.length; ai++) {
@ -2622,6 +3170,7 @@ function refreshLatent(latent, monid, iconArr) {
} else if (ai < usedHoleN) //多格潜觉后方隐藏
{
icon.classList.add(className_displayNone);
icon.removeAttribute("data-latent-icon");
} else if (ai < maxLatentCount) //没有使用的空格觉醒
{
icon.removeAttribute("data-latent-icon");
@ -2629,6 +3178,7 @@ function refreshLatent(latent, monid, iconArr) {
} else //不需要显示的部分
{
icon.classList.add(className_displayNone);
icon.removeAttribute("data-latent-icon");
}
}
};
@ -2818,6 +3368,14 @@ function editBoxChangeMonId(id) {
{
openEvolutionaryTree.classList.add(className_displayNone); //隐藏进化树按钮
}
const searchEvolutionByThis = settingBox.querySelector(".row-mon-id .search-evolution-by-this");
if (card.types.includes(0))
{
searchEvolutionByThis.classList.remove(className_displayNone);
}else
{
searchEvolutionByThis.classList.add(className_displayNone);
}
const mType = monInfoBox.querySelectorAll(".monster-type li");
for (let ti = 0; ti < mType.length; ti++) {
@ -3005,6 +3563,8 @@ function refreshAll(formationData) {
const txtTitleDisplay = titleBox.querySelector(".title-display");
const txtDetailDisplay = detailBox.querySelector(".detail-display");
txtTitleDisplay.innerHTML = descriptionToHTML(txtTitle.value);
let titleStr = txtTitleDisplay.textContent.trim();
document.title = titleStr.length > 0 ? `${titleStr.trim()} - ${localTranslating.webpage_title}` : localTranslating.webpage_title;
txtDetailDisplay.innerHTML = descriptionToHTML(txtDetail.value);
if (txtTitle.value.length == 0)
titleBox.classList.add("edit");
@ -3048,13 +3608,13 @@ function refreshAll(formationData) {
{
return;
}
if (leaderIdx > 0 && ti == 0)
if (leaderIdx > 0 && ti == 0) //队长
{
dom.style.transform = `translateX(${leaderIdx*108}px)`;
dom.style.transform = formation.teams.length == 2 && teamNum == 1 ? `translateX(${(5-leaderIdx)*-108}px)` : `translateX(${leaderIdx*108}px)`;
}
else if (leaderIdx > 0 && ti == leaderIdx)
else if (leaderIdx > 0 && ti == leaderIdx) //队长员
{
dom.style.transform = `translateX(${ti*-108}px)`;
dom.style.transform = formation.teams.length == 2 && teamNum == 1 ? `translateX(${(5-ti)*108}px)` : `translateX(${ti*-108}px)`;
}else
{
dom.style.transform = null;
@ -3324,6 +3884,8 @@ function refreshTeamTotalHP(totalDom, team, teamIdx) {
const leader1id = team[0][team[3] || 0].id;
const leader2id = teamsCount===2 ? (teamIdx === 1 ? teams[0][0][teams[0][3] || 0].id : teams[1][0][teams[1][3] || 0].id) : team[0][5].id;
const team_2p = teamsCount===2 ? team[0].concat((teamIdx === 1 ? teams[0][0] : teams[1][0])) : team[0];
if (tHpDom) {
const reduceScales1 = getReduceScales(leader1id);
const reduceScales2 = getReduceScales(leader2id);
@ -3404,6 +3966,39 @@ function refreshTeamTotalHP(totalDom, team, teamIdx) {
}
}
const tAttrsDom = totalDom.querySelector(".tIf-attrs");
const tTypesDom = totalDom.querySelector(".tIf-types");
//统计队伍颜色个数
if (tAttrsDom)
{
const attrDoms = Array.from(tAttrsDom.querySelectorAll(".attr"));
attrDoms.forEach(attrDom=>{
const attrId = parseInt(attrDom.getAttribute("data-attr-icon"));
const attrCount = team_2p.reduce((pre,member)=>{
if (member.id <= 0) return pre;
const card = Cards[member.id] || Cards[0];
const attrNum = card.attrs.filter(a=>a==attrId).length;
return pre + attrNum;
},0);
attrDom.setAttribute(dataAttrName, attrCount);
});
}
//统计队伍类型个数
if (tTypesDom)
{
const typeDoms = Array.from(tTypesDom.querySelectorAll(".type-icon"));
typeDoms.forEach(typeDom=>{
const typeId = parseInt(typeDom.getAttribute("data-type-icon"));
const typeCount = team_2p.reduce((pre,member)=>{
if (member.id <= 0) return pre;
const card = Cards[member.id] || Cards[0];
const typeNum = card.types.filter(a=>a==typeId).length;
return pre + typeNum;
},0);
typeDom.setAttribute(dataAttrName, typeCount);
});
}
if (tEffectDom) {
const _76board = tEffectDom.querySelector("._76board");
//76版队长技能不被欢队长所影响

137
solo.html
View File

@ -18,6 +18,7 @@ const teamsCount = 1;
<script type="text/javascript" src="script-skill-parser.js"></script>
<script type="text/javascript" src="script.js"></script>
<script type="text/javascript" src="library/html2canvas.min.js"></script>
<script type="text/javascript" src="library/zxing.umd.min.js"></script>
<!--▼ADPCM播放相关-->
<script type="text/javascript" src="library/jy4340132-aaa/std.js"></script>
<script type="text/javascript" src="library/jy4340132-aaa/pcm_player.js"></script>
@ -38,10 +39,10 @@ var formation = new Formation(teamsCount,6);
<div>
<button class="btn-clear-data" onclick="clearData();"></button>
<button class="btn-capture" onclick="capture();"></button>
<button class="btn-qrcode"></button>
<a class="down-capture display-none" target="_blank"></a>
<button class="btn-multi-link" onclick="turnPage(2,arguments[0]);"></button>
<button class="btn-triple-link" onclick="turnPage(3,arguments[0]);"></button>
<span class="lbl-henshin-change"><button class="btn-henshin-back" onclick="henshinStep(-1);"></button><button class="btn-henshin-forward" onclick="henshinStep(+1);"></button></span>
<a class="help-link" target="_blank" href="https://github.com/Mapaler/PADDashFormation/blob/master/help.md"></a>
</div>
<div>
@ -51,6 +52,9 @@ var formation = new Formation(teamsCount,6);
<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>
<div>
<span class="lbl-henshin-change"><button class="btn-henshin-back" onclick="henshinStep(-1);"></button><button class="btn-henshin-forward" onclick="henshinStep(+1);"></button></span>
</div>
</div>
<div class="formation-box">
<div class="title-box edit"><input type="text" class="title" placeholder="输入队伍标题" /><h1 class="title-display"></h1></div>
@ -76,30 +80,53 @@ var formation = new Formation(teamsCount,6);
<li><input type="radio" name="team-1-badge" class="badge-radio" value="16" id="team-1-badge-16"><label class="badge" data-badge-icon="16" for="team-1-badge-16"></label></li>
<li><input type="radio" name="team-1-badge" class="badge-radio" value="17" id="team-1-badge-17"><label class="badge" data-badge-icon="17" for="team-1-badge-17"></label></li>
<li><input type="radio" name="team-1-badge" class="badge-radio" value="18" id="team-1-badge-18"><label class="badge" data-badge-icon="18" for="team-1-badge-18"></label></li>
<div class="team-total-info">
<div class="tIf-total-hp">
<span class="general"></span>
<span class="awoken-bind"></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-total-info">
<div class="tIf-addition-info">
<ul class="tIf-attrs">
<li><icon class="attr" data-attr-icon="0"><!----></icon></li>
<li><icon class="attr" data-attr-icon="1"><!----></icon></li>
<li><icon class="attr" data-attr-icon="2"><!----></icon></li>
<li><icon class="attr" data-attr-icon="3"><!----></icon></li>
<li><icon class="attr" data-attr-icon="4"><!----></icon></li>
</ul>
<ul class="tIf-types">
<li><icon class="type-icon" data-type-icon="4"><!----></icon></li>
<li><icon class="type-icon" data-type-icon="5"><!----></icon></li>
<li><icon class="type-icon" data-type-icon="7"><!--惡魔--></icon></li>
<li><icon class="type-icon" data-type-icon="8"><!--机械--></icon></li>
<li><icon class="type-icon" data-type-icon="1"><!--平衡--></icon></li>
<li><icon class="type-icon" data-type-icon="6"><!--攻撃--></icon></li>
<li><icon class="type-icon" data-type-icon="2"><!--体力--></icon></li>
<li><icon class="type-icon" data-type-icon="3"><!--回復--></icon></li>
<li><icon class="type-icon" data-type-icon="0"><!--進化用--></icon></li>
<li><icon class="type-icon" data-type-icon="12"><!--能力覺醒用--></icon></li>
<li><icon class="type-icon" data-type-icon="14"><!--強化合成用--></icon></li>
<li><icon class="type-icon" data-type-icon="15"><!--販賣用--></icon></li>
</ul>
</div>
<div class="tIf-total-hp">
<span class="general"></span>
<span class="awoken-bind"></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>
<div class="team-box-name">
<div class="team-box">
<ul class="team-assist">
@ -485,6 +512,9 @@ var formation = new Formation(teamsCount,6);
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="76"></span><span class="count"></span></li><!--2串光-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="77"></span><span class="count"></span></li><!--2串暗-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="78"></span><span class="count"></span></li><!--十字-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="79"></span><span class="count"></span></li><!--3色-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="80"></span><span class="count"></span></li><!--4色-->
<li class="awoken-count display-none"><span class="awoken-icon" data-awoken-icon="81"></span><span class="count"></span></li><!--5色-->
</ul>
</div>
</li>
@ -573,14 +603,16 @@ var formation = new Formation(teamsCount,6);
</div>
<div class="awoken-div"><!--觉醒-->
<ul class="awoken-ul all-awokens">
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="49" data-max-count="1"></button><!--武器觉醒--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="21"></button><!--SB--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="52" data-max-count="1"></button><!--大防封--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="43"></button><!--7c--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="61"></button><!--10c--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="58"></button><!--下半血强化--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="48"></button><!--破无效--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="27"></button><!--U--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="21"></button><!--SB--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="49" data-max-count="1"></button><!--武器觉醒--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="52" data-max-count="1"></button><!--大防封--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="60"></button><!--L解锁--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="58"></button><!--下半血强化--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="57"></button><!--上半血强化--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="11" data-max-count="5"></button><!--防暗--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="12" data-max-count="5"></button><!--防废--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="13" data-max-count="5"></button><!--防毒--></li>
@ -589,7 +621,6 @@ var formation = new Formation(teamsCount,6);
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="45" data-max-count="1"></button><!--心追--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="50"></button><!--方块心追--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="19"></button><!--手指--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="60"></button><!--L解锁--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="1"></button><!--HP+--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="2"></button><!--攻击+--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="3"></button><!--回复+--></li>
@ -632,7 +663,6 @@ var formation = new Formation(teamsCount,6);
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="51"></button><!--5色溜--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="53"></button><!--大手指--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="56"></button><!--大SB--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="57"></button><!--满血强化--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="59"></button><!--L盾--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="62"></button><!--c珠--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="63" data-max-count="1"></button><!--语音--></li>
@ -651,18 +681,23 @@ var formation = new Formation(teamsCount,6);
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="76"></button><!--2串光--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="77"></button><!--2串暗--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="78"></button><!--十字--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="79"></button><!--3色--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="80"></button><!--4色--></li>
<li class="awoken-count"><button class="awoken-icon" data-awoken-icon="81"></button><!--5色--></li>
</ul>
</div>
<div class="sawoken-div"><!--超觉醒-->
<button class="sawoken-clear brown-button" ></button>
<ul class="sawoken-ul">
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="43" id="search-awoken-43" /><label class="awoken-icon" data-awoken-icon="43" for="search-awoken-43"></label><!--7c--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="61" id="search-awoken-61" /><label class="awoken-icon" data-awoken-icon="61" for="search-awoken-61"></label><!--10c--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="58" id="search-awoken-58" /><label class="awoken-icon" data-awoken-icon="58" for="search-awoken-58"></label><!--下半血强化--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="48" id="search-awoken-48" /><label class="awoken-icon" data-awoken-icon="48" for="search-awoken-48"></label><!--破无效--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="27" id="search-awoken-27" /><label class="awoken-icon" data-awoken-icon="27" for="search-awoken-27"></label><!--U--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="21" id="search-awoken-21" /><label class="awoken-icon" data-awoken-icon="21" for="search-awoken-21"></label><!--SB--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="52" id="search-awoken-52" /><label class="awoken-icon" data-awoken-icon="52" for="search-awoken-52"></label><!--大防封--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="43" id="search-awoken-43" /><label class="awoken-icon" data-awoken-icon="43" for="search-awoken-43"></label><!--7c--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="61" id="search-awoken-61" /><label class="awoken-icon" data-awoken-icon="61" for="search-awoken-61"></label><!--10c--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="48" id="search-awoken-48" /><label class="awoken-icon" data-awoken-icon="48" for="search-awoken-48"></label><!--破无效--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="27" id="search-awoken-27" /><label class="awoken-icon" data-awoken-icon="27" for="search-awoken-27"></label><!--U--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="60" id="search-awoken-60" /><label class="awoken-icon" data-awoken-icon="60" for="search-awoken-60"></label><!--L解锁--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="58" id="search-awoken-58" /><label class="awoken-icon" data-awoken-icon="58" for="search-awoken-58"></label><!--下半血强化--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="57" id="search-awoken-57" /><label class="awoken-icon" data-awoken-icon="57" for="search-awoken-57"></label><!--上半血强化--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="68" id="search-awoken-68" /><label class="awoken-icon" data-awoken-icon="68" for="search-awoken-68"></label><!--大防暗--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="69" id="search-awoken-69" /><label class="awoken-icon" data-awoken-icon="69" for="search-awoken-69"></label><!--大防废--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="70" id="search-awoken-70" /><label class="awoken-icon" data-awoken-icon="70" for="search-awoken-70"></label><!--大防毒--></li>
@ -671,7 +706,6 @@ var formation = new Formation(teamsCount,6);
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="45" id="search-awoken-45" /><label class="awoken-icon" data-awoken-icon="45" for="search-awoken-45"></label><!--心追--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="50" id="search-awoken-50" /><label class="awoken-icon" data-awoken-icon="50" for="search-awoken-50"></label><!--方块心追--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="19" id="search-awoken-19" /><label class="awoken-icon" data-awoken-icon="19" for="search-awoken-19"></label><!--手指--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="60" id="search-awoken-60" /><label class="awoken-icon" data-awoken-icon="60" for="search-awoken-60"></label><!--L解锁--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="1" id="search-awoken-1" /><label class="awoken-icon" data-awoken-icon="1" for="search-awoken-1"></label><!--HP+--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="2" id="search-awoken-2" /><label class="awoken-icon" data-awoken-icon="2" for="search-awoken-2"></label><!--攻击+--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="3" id="search-awoken-3" /><label class="awoken-icon" data-awoken-icon="3" for="search-awoken-3"></label><!--回复+--></li>
@ -718,7 +752,6 @@ var formation = new Formation(teamsCount,6);
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="51" id="search-awoken-51" /><label class="awoken-icon" data-awoken-icon="51" for="search-awoken-51"></label><!--5色溜--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="53" id="search-awoken-53" /><label class="awoken-icon" data-awoken-icon="53" for="search-awoken-53"></label><!--大手指--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="56" id="search-awoken-56" /><label class="awoken-icon" data-awoken-icon="56" for="search-awoken-56"></label><!--大SB--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="57" id="search-awoken-57" /><label class="awoken-icon" data-awoken-icon="57" for="search-awoken-57"></label><!--满血强化--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="59" id="search-awoken-59" /><label class="awoken-icon" data-awoken-icon="59" for="search-awoken-59"></label><!--L盾--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="62" id="search-awoken-62" /><label class="awoken-icon" data-awoken-icon="62" for="search-awoken-62"></label><!--c珠--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="63" id="search-awoken-63" /><label class="awoken-icon" data-awoken-icon="63" for="search-awoken-63"></label><!--语音--></li>
@ -734,6 +767,9 @@ var formation = new Formation(teamsCount,6);
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="76" id="search-awoken-76" /><label class="awoken-icon" data-awoken-icon="76" for="search-awoken-76"></label><!--2串光--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="77" id="search-awoken-77" /><label class="awoken-icon" data-awoken-icon="77" for="search-awoken-77"></label><!--2串暗--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="78" id="search-awoken-78" /><label class="awoken-icon" data-awoken-icon="78" for="search-awoken-78"></label><!--十字--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="79" id="search-awoken-79" /><label class="awoken-icon" data-awoken-icon="79" for="search-awoken-79"></label><!--3色--></li>
<li class="awoken-count"><input type="checkbox" class="sawoken-check" name="types" value="80" id="search-awoken-80" /><label class="awoken-icon" data-awoken-icon="80" for="search-awoken-80"></label><!--4色--></li>
<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="control-div"><!--控制栏-->
@ -787,7 +823,7 @@ var formation = new Formation(teamsCount,6);
<div class="setting-row row-mon-id">
<input type="checkbox" class="config-checkbox-ipt" name="real-time-change-card" id="real-time-change-card"><label class="config-checkbox-lbl real-time-change-card-label" for="real-time-change-card"><div class="config-checkbox-lbl-cicle"></div></label>
<button class="open-evolutionary-tree"></button>
<button class="open-search"></button><!--搜索怪物按钮-->
<button class="search-evolution-by-this"><icon class="type-icon" data-type-icon="0"></icon></button>
<input type="search" class="m-id" list="monsters-name-list"/><button class="search-by-string"></button>
<datalist id="monsters-name-list"></datalist>
<ul class="evo-card-list"></ul>
@ -966,5 +1002,30 @@ var formation = new Formation(teamsCount,6);
<line />
</g>
</svg>
<div id="qr-code-frame" class="mask display-none">
<button class="mask-close brown-button"></button>
<div class="mask-content">
<div class="read-qr-box">
<div class="action-button-box">
<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">
</div>
<div class="info"></div>
<div class="video-box display-none">
<div><label for="sourceSelect"><!--视频源选择--></label><select id="sourceSelect"></select></div>
<video id="video" width="500" height="500"></video>
</div>
</div>
<div class="save-qr-box">
<ul class="qr-data-type-ul">
<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>
<div class="qr-box"><img class="qr-code-image" /></div>
<a download="" class="save-qr-img brown-button"><!--保存QR 图片--></a>
</div>
</div>
</div>
</body>
</html>

BIN
sound/voice/en/padv109.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv110.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv282.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv283.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv284.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv285.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv286.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv287.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv288.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv289.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv290.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv291.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv292.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv293.wav Normal file

Binary file not shown.

BIN
sound/voice/en/padv294.wav Normal file

Binary file not shown.

BIN
sound/voice/ko/padv109.wav Normal file

Binary file not shown.

BIN
sound/voice/ko/padv110.wav Normal file

Binary file not shown.

BIN
sound/voice/ko/padv282.wav Normal file

Binary file not shown.

BIN
sound/voice/ko/padv283.wav Normal file

Binary file not shown.

BIN
sound/voice/ko/padv284.wav Normal file

Binary file not shown.

BIN
sound/voice/ko/padv285.wav Normal file

Binary file not shown.

BIN
sound/voice/ko/padv286.wav Normal file

Binary file not shown.

BIN
sound/voice/ko/padv287.wav Normal file

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More