├── .dockerignore ├── .editorconfig ├── .github-ignored └── workflows │ ├── autoupdate.yml │ └── main.yml ├── .gitignore ├── Dockerfile ├── HOWTOHELP.md ├── README.md ├── angular.json ├── browserslist ├── default.conf ├── e2e ├── protractor.conf.js ├── src │ ├── app.e2e-spec.ts │ └── app.po.ts └── tsconfig.json ├── karma.conf.js ├── ngsw-config.json ├── package-lock.json ├── package.json ├── publish.sh.example ├── src ├── README.md ├── app │ ├── app-routing.module.ts │ ├── app.component.html │ ├── app.component.scss │ ├── app.component.spec.ts │ ├── app.component.ts │ ├── app.module.ts │ ├── auto-detect-hash │ │ ├── auto-detect-hash.component.html │ │ ├── auto-detect-hash.component.scss │ │ ├── auto-detect-hash.component.spec.ts │ │ ├── auto-detect-hash.component.ts │ │ └── detect.worker.ts │ ├── auto-detect │ │ ├── auto-detect.component.html │ │ ├── auto-detect.component.scss │ │ ├── auto-detect.component.spec.ts │ │ ├── auto-detect.component.ts │ │ └── itemList.js │ ├── char-mat-charcard │ │ ├── char-mat-charcard.component.html │ │ ├── char-mat-charcard.component.scss │ │ ├── char-mat-charcard.component.spec.ts │ │ └── char-mat-charcard.component.ts │ ├── char-mat-matcard │ │ ├── char-mat-matcard.component.html │ │ ├── char-mat-matcard.component.scss │ │ ├── char-mat-matcard.component.spec.ts │ │ └── char-mat-matcard.component.ts │ ├── char-mat │ │ ├── char-mat.component.html │ │ ├── char-mat.component.scss │ │ ├── char-mat.component.spec.ts │ │ └── char-mat.component.ts │ ├── detect-setting │ │ ├── detect-setting.component.html │ │ ├── detect-setting.component.scss │ │ ├── detect-setting.component.spec.ts │ │ └── detect-setting.component.ts │ ├── fetch.service.spec.ts │ ├── fetch.service.ts │ ├── help │ │ ├── help.component.html │ │ ├── help.component.scss │ │ ├── help.component.spec.ts │ │ └── help.component.ts │ ├── hr-comb │ │ ├── hr-comb.component.html │ │ ├── hr-comb.component.scss │ │ ├── hr-comb.component.spec.ts │ │ └── hr-comb.component.ts │ ├── hr-tags │ │ ├── hr-tags.component.html │ │ ├── hr-tags.component.scss │ │ ├── hr-tags.component.spec.ts │ │ └── hr-tags.component.ts │ ├── hr │ │ ├── hr.component.html │ │ ├── hr.component.scss │ │ ├── hr.component.spec.ts │ │ └── hr.component.ts │ ├── lvlup │ │ ├── lvlup.component.html │ │ ├── lvlup.component.scss │ │ ├── lvlup.component.spec.ts │ │ └── lvlup.component.ts │ ├── main │ │ ├── main.component.html │ │ ├── main.component.scss │ │ ├── main.component.spec.ts │ │ └── main.component.ts │ ├── material-card │ │ ├── material-card.component.html │ │ ├── material-card.component.scss │ │ ├── material-card.component.spec.ts │ │ └── material-card.component.ts │ ├── material │ │ ├── material.component.html │ │ ├── material.component.scss │ │ ├── material.component.spec.ts │ │ └── material.component.ts │ ├── model │ │ ├── hrcomb.ts │ │ ├── hrdata.ts │ │ ├── hrtagrow.ts │ │ ├── materialinfo.ts │ │ ├── materialitem.ts │ │ └── materialitemdata.ts │ ├── settings │ │ ├── settings.component.html │ │ ├── settings.component.scss │ │ ├── settings.component.spec.ts │ │ └── settings.component.ts │ ├── stage-chooser │ │ ├── stage-chooser.component.html │ │ ├── stage-chooser.component.scss │ │ ├── stage-chooser.component.spec.ts │ │ └── stage-chooser.component.ts │ ├── styles │ │ ├── custom.scss │ │ └── themes │ │ │ ├── dark.scss │ │ │ └── light.scss │ ├── switch-theme.service.spec.ts │ └── switch-theme.service.ts ├── assets │ ├── .gitkeep │ ├── data │ │ ├── StageList.json │ │ ├── akhr.json │ │ ├── aklevel.json │ │ ├── akmaterial.json │ │ ├── charMaterials.json │ │ ├── detectdata.json │ │ └── material.json │ ├── icons │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── apple-touch-icon.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── mstile-150x150.png │ │ └── safari-pinned-tab.svg │ └── img │ │ ├── chara │ │ ├── 12F.png │ │ ├── Adnachiel.png │ │ ├── Ansel.png │ │ ├── Beagle.png │ │ ├── Blue Poison.png │ │ ├── Castle-3.png │ │ ├── Cliffheart.png │ │ ├── Croissant.png │ │ ├── Cuora.png │ │ ├── Dobermann.png │ │ ├── Durin.png │ │ ├── Earthspirit.png │ │ ├── Estelle.png │ │ ├── Exusiai.png │ │ ├── FEater.png │ │ ├── Fang.png │ │ ├── Firewatch.png │ │ ├── Frostleaf.png │ │ ├── Gitano.png │ │ ├── Gravel.png │ │ ├── Haze.png │ │ ├── Hibiscus.png │ │ ├── Hoshiguma.png │ │ ├── Ifrit.png │ │ ├── Indra.png │ │ ├── Jessica.png │ │ ├── Kroos.png │ │ ├── Lancet-2.png │ │ ├── Lava.png │ │ ├── Liskarm.png │ │ ├── Manticore.png │ │ ├── Matoimaru.png │ │ ├── Matterhorn.png │ │ ├── Mayer.png │ │ ├── Melantha.png │ │ ├── Meteor.png │ │ ├── Meteorite.png │ │ ├── Mousse.png │ │ ├── Myrrh.png │ │ ├── Nearl.png │ │ ├── Nightingale.png │ │ ├── Noir Corne.png │ │ ├── Orchid.png │ │ ├── Perfumer.png │ │ ├── Platinum.png │ │ ├── Plume.png │ │ ├── Pramanix.png │ │ ├── Projekt Red.png │ │ ├── Provence.png │ │ ├── Ptilopsis.png │ │ ├── Rangers.png │ │ ├── Rope.png │ │ ├── Saria.png │ │ ├── Scavenger.png │ │ ├── Shaw.png │ │ ├── Shining.png │ │ ├── ShiraYuki.png │ │ ├── Siege.png │ │ ├── Silence.png │ │ ├── SilverAsh.png │ │ ├── Specter.png │ │ ├── Steward.png │ │ ├── Texas.png │ │ ├── Vanilla.png │ │ ├── Vigna.png │ │ ├── Vulcan.png │ │ ├── Warfarin.png │ │ ├── Yato.png │ │ ├── ГУМ.png │ │ ├── Истина.png │ │ └── зима.png │ │ ├── help │ │ ├── add-to-homescreen-01.jpg │ │ ├── add-to-homescreen-02.jpg │ │ ├── add-to-homescreen-03.jpg │ │ ├── add-to-homescreen-04.jpg │ │ ├── add-to-homescreena-01.jpg │ │ ├── add-to-homescreena-02.jpg │ │ ├── add-to-homescreena-03.jpg │ │ ├── add-to-homescreena-04.jpg │ │ ├── iconstr1.jpg │ │ └── iconstr2.jpg │ │ ├── main │ │ ├── Luke_lu.jpg │ │ ├── Yue_plus.png │ │ ├── bbaa.png │ │ ├── crystal.jpg │ │ ├── github.png │ │ ├── graueneko.png │ │ └── telegram.png │ │ └── material │ │ ├── DIAMOND.png │ │ ├── DIAMOND_SHD.png │ │ ├── EXGG_SHD.png │ │ ├── GOLD.png │ │ ├── HGG_SHD.png │ │ ├── LGG_SHD.png │ │ ├── MTL_ASC_CST1.png │ │ ├── MTL_ASC_CST2.png │ │ ├── MTL_ASC_CST3.png │ │ ├── MTL_ASC_DI.png │ │ ├── MTL_ASC_GRD1.png │ │ ├── MTL_ASC_GRD2.png │ │ ├── MTL_ASC_GRD3.png │ │ ├── MTL_ASC_MED1.png │ │ ├── MTL_ASC_MED2.png │ │ ├── MTL_ASC_MED3.png │ │ ├── MTL_ASC_PIO1.png │ │ ├── MTL_ASC_PIO2.png │ │ ├── MTL_ASC_PIO3.png │ │ ├── MTL_ASC_SNP1.png │ │ ├── MTL_ASC_SNP2.png │ │ ├── MTL_ASC_SNP3.png │ │ ├── MTL_ASC_SPC1.png │ │ ├── MTL_ASC_SPC2.png │ │ ├── MTL_ASC_SPC3.png │ │ ├── MTL_ASC_SUP1.png │ │ ├── MTL_ASC_SUP2.png │ │ ├── MTL_ASC_SUP3.png │ │ ├── MTL_ASC_TNK1.png │ │ ├── MTL_ASC_TNK2.png │ │ ├── MTL_ASC_TNK3.png │ │ ├── MTL_BASE_ESS.png │ │ ├── MTL_BASE_SL1.png │ │ ├── MTL_BASE_SL2.png │ │ ├── MTL_BASE_SL3.png │ │ ├── MTL_BASE_SYNTH1.png │ │ ├── MTL_BASE_SYNTH2.png │ │ ├── MTL_BASE_SYNTH3.png │ │ ├── MTL_DIAMOND_SHD.png │ │ ├── MTL_GOLD1.png │ │ ├── MTL_GOLD2.png │ │ ├── MTL_GOLD3.png │ │ ├── MTL_SKILL1.png │ │ ├── MTL_SKILL2.png │ │ ├── MTL_SKILL3.png │ │ ├── MTL_SL_ALCOHOL1.png │ │ ├── MTL_SL_ALCOHOL2.png │ │ ├── MTL_SL_BN.png │ │ ├── MTL_SL_BOSS1.png │ │ ├── MTL_SL_BOSS2.png │ │ ├── MTL_SL_BOSS3.png │ │ ├── MTL_SL_BOSS4.png │ │ ├── MTL_SL_DS.png │ │ ├── MTL_SL_G1.png │ │ ├── MTL_SL_G2.png │ │ ├── MTL_SL_G3.png │ │ ├── MTL_SL_G4.png │ │ ├── MTL_SL_IAM3.png │ │ ├── MTL_SL_IAM4.png │ │ ├── MTL_SL_IRON1.png │ │ ├── MTL_SL_IRON2.png │ │ ├── MTL_SL_IRON3.png │ │ ├── MTL_SL_IRON4.png │ │ ├── MTL_SL_KETONE1.png │ │ ├── MTL_SL_KETONE2.png │ │ ├── MTL_SL_KETONE3.png │ │ ├── MTL_SL_KETONE4.png │ │ ├── MTL_SL_MANGANESE1.png │ │ ├── MTL_SL_MANGANESE2.png │ │ ├── MTL_SL_PG1.png │ │ ├── MTL_SL_PG2.png │ │ ├── MTL_SL_PGEL3.png │ │ ├── MTL_SL_PGEL4.png │ │ ├── MTL_SL_PP.png │ │ ├── MTL_SL_RMA7012.png │ │ ├── MTL_SL_RMA7024.png │ │ ├── MTL_SL_RUSH1.png │ │ ├── MTL_SL_RUSH2.png │ │ ├── MTL_SL_RUSH3.png │ │ ├── MTL_SL_RUSH4.png │ │ ├── MTL_SL_STRG1.png │ │ ├── MTL_SL_STRG2.png │ │ ├── MTL_SL_STRG3.png │ │ ├── MTL_SL_STRG4.png │ │ ├── README.md │ │ ├── TKT_INST_FIN.png │ │ ├── TKT_RECRUIT.png │ │ ├── sprite_exp_card_t1.png │ │ ├── sprite_exp_card_t2.png │ │ ├── sprite_exp_card_t3.png │ │ └── sprite_exp_card_t4.png ├── browserconfig.xml ├── environments │ ├── environment.prod.ts │ └── environment.ts ├── favicon.ico ├── index.html ├── main.ts ├── manifest.webmanifest ├── polyfills.ts ├── styles.scss └── test.ts ├── tools ├── extractMaterials.py └── extractStages.py ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.spec.json ├── tsconfig.worker.json ├── tslint.json ├── typings.json ├── version └── data └── yarn.lock /.dockerignore: -------------------------------------------------------------------------------- 1 | # 排除代码目录,加快构建过程 2 | .git/ 3 | src/ 4 | node_modules/ 5 | !dist/* -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | indent_size = 4 # github 只识别 4 个空格的缩进 15 | -------------------------------------------------------------------------------- /.github-ignored/workflows/autoupdate.yml: -------------------------------------------------------------------------------- 1 | name: Auto update data 2 | 3 | on: 4 | schedule: 5 | - cron: '0 3-10 * * *' 6 | 7 | jobs: 8 | auto-update: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v1 12 | - name: Fetch data version 13 | run: | 14 | curl -sL https://github.com/Kengxxiao/ArknightsGameData/commits/master.atom | grep -m1 "CN UPDATE" > version/data 15 | if [ -n "$(git status --porcelain)" ]; then 16 | echo "::set-env name=UPDATE::1" 17 | fi 18 | - uses: actions/setup-python@v1 19 | if: env.UPDATE==1 20 | with: 21 | python-version: '3.7' 22 | architecture: 'x64' 23 | - name: Update data and prepare push 24 | if: env.UPDATE==1 25 | run: | 26 | pip install requests 27 | NEWCH=$(python ./tools/extractMaterials.py) 28 | NEWST=$(python ./tools/extractStages.py) 29 | [[ $NEWCH ]] || [[ $NEWST ]] && COMB=$NEWCH$NEWST 30 | [[ $NEWCH ]] && [[ $NEWST ]] && COMB=$NEWCH"\ &\ "$NEWST 31 | echo "::set-env name=UPDATE::0" 32 | if [[ $COMB ]]; then 33 | echo "::set-env name=UPDATE::1" 34 | sed -i -e '/id="updates".*/a \ \ \ \ \ \ \ \

'$(date +"%Y.%m.%d")' '$COMB'

' src/app/main/main.component.html 35 | git config --global user.name "Neko Bot" 36 | git config --global user.email "graueneko@gmail.com" 37 | git checkout "${GITHUB_REF:11}" 38 | git commit -am "数据更新" 39 | fi 40 | - name: Push to Github 41 | if: env.UPDATE==1 42 | run: | 43 | git remote set-url origin https://x-access-token:$TOKEN@$REPO 44 | git push 45 | env: 46 | TOKEN: ${{ secrets.GH_TOKEN }} 47 | REPO: github.com/graueneko/aktools.git 48 | env: 49 | CI: true 50 | UPDATE: 0 51 | -------------------------------------------------------------------------------- /.github-ignored/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Node CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | build-on-push: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/checkout@v1 14 | - name: Use Node.js 10.15.3 15 | uses: actions/setup-node@v1 16 | with: 17 | node-version: "10.15.3" 18 | - name: Install node_modules 19 | run: | 20 | npm i -s 21 | npm install -g @angular/cli 22 | - name: Build & deploy gh-pages 23 | run: | 24 | # ng build --prod --base-href "https://$CNAME/" 25 | # npx angular-cli-ghpages --dir=dist/$PROJECT --repo=https://$TOKEN@$REPO --no-silent --cname=$CNAME --email=$EMAIL --name="graueneko" 26 | env: 27 | TOKEN: ${{ secrets.GH_TOKEN }} 28 | CNAME: aktools.graueneko.xyz 29 | REPO: github.com/graueneko/aktools.git 30 | - name: Build & deploy coding-pages 31 | run: | 32 | ng build --prod --base-href "https://$CNAME/" 33 | npx angular-cli-ghpages --dir=dist/$PROJECT --repo=https://$TOKEN@$REPO --no-silent --cname=$CNAME --email=$EMAIL --name="graueneko" --branch=coding-pages 34 | env: 35 | TOKEN: ${{ secrets.CODING_TOKEN }} 36 | CNAME: ak.capybaraaa.info 37 | REPO: e.coding.net/graueneko/aktools.git 38 | env: 39 | CI: true 40 | PROJECT: aktools 41 | EMAIL: graueneko@gmail.com 42 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /dist 5 | /tmp 6 | /out-tsc 7 | # Only exists if Bazel was run 8 | /bazel-out 9 | 10 | # dependencies 11 | /node_modules 12 | 13 | # profiling files 14 | chrome-profiler-events.json 15 | speed-measure-plugin.json 16 | 17 | # IDEs and editors 18 | /.idea 19 | .project 20 | .classpath 21 | .c9/ 22 | *.launch 23 | .settings/ 24 | *.sublime-workspace 25 | 26 | # IDE - VSCode 27 | .vscode 28 | .vscode/** 29 | !.vscode/settings.json 30 | !.vscode/tasks.json 31 | !.vscode/launch.json 32 | !.vscode/extensions.json 33 | .history/* 34 | 35 | # misc 36 | /.sass-cache 37 | /connect.lock 38 | /coverage 39 | /libpeerconnection.log 40 | npm-debug.log 41 | yarn-error.log 42 | testem.log 43 | /typings 44 | 45 | # System Files 46 | .DS_Store 47 | Thumbs.db 48 | 49 | build_pub.sh 50 | publish.sh 51 | 52 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM dockerhub.azk8s.cn/library/nginx:1.17.0-alpine-perl 2 | RUN rm /etc/nginx/conf.d/default.conf 3 | ADD default.conf /etc/nginx/conf.d/ 4 | COPY dist/aktools /usr/share/nginx/html/ -------------------------------------------------------------------------------- /HOWTOHELP.md: -------------------------------------------------------------------------------- 1 | 暂无信息 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 明日方舟工具箱 2 | 3 | ### 作者: [一只灰猫](https://github.com/graueneko) 4 | 5 | ## 开始使用 6 | 7 | 目前已部署在 Github Pages: [明日方舟工具箱 by 一只灰猫](https://aktools.graueneko.xyz/) 8 | 9 | ## 二次开发 10 | 11 | 页面允许 URL 中加入参数以修改显示样式。 12 | 13 | 包括三个参数,可以分别使用,以嵌入到您二次开发的app中: `hidenav`, `hidetags` 以及 `tags`。 14 | 15 | 其中 hidenav 全局有效, hidetags 和 tags 仅对公开招募页面有效。 16 | 17 | 例如: 18 | 19 | 20 | ## 反馈 21 | 22 | 有任何建议、想法,或发现 Bug,可以直接在本项目下提 [Issue](https://github.com/graueneko/aktools/issues)。 23 | 24 | 如果你实现了新功能/改进可以合并到 origin/master上,请发起 [Pull request](https://github.com/graueneko/aktools/pulls). 25 | 26 | ## 开发 27 | 28 | 29 | 1. 确保你的开发环境中包括 Node.js(10.9.0 或更高版本) 和 npm/yarn 包管理器 30 | * 获取 Node.js,请转到 [nodejs.org](https://nodejs.org)。 31 | * 获取 [yarn](https://baike.baidu.com/item/yarn),请转到[yarnpkg.com](https://yarnpkg.com/zh-Hans/docs/install#windows-stable)(非必须安装,该网站可能需要梯子) 32 | ```bash 33 | # 检查 Node.js 版本 34 | node -v 35 | # 检查 npm 版本 36 | npm -v 37 | ``` 38 | 2. 安装 cnpm 命令行工具(推荐) 39 | ```bash 40 | npm install -g cnpm --registry=https://registry.npm.taobao.org 41 | ``` 42 | 3. 安装 Angular CLI 43 | ```bash 44 | cnpm install -g @angular/cli 45 | # 检查 Angular 版本 46 | ng version 47 | ``` 48 | 4. 克隆项目 49 | ```bash 50 | git clone https://github.com/graueneko/aktools.git 51 | cd aktools 52 | cnpm i -s 53 | # yarn 用户: 54 | # yarn 55 | ng serve -o 56 | ``` 57 | 58 | 59 | #### 注意事项 60 | 61 | 1. 开发请注意移动优先(Mobile First); 62 | 2. 尽管代码格式可能会随 TSLint 的配置不同发生变化,还请尽可能减少 PR 中未修改部分的代码变动; 63 | 3. 可以适量引入新图片、数据文件,但请勿加入过多、过大,~~以免国内网络访问过慢~~。 64 | 65 | #### 参与开发您可能需要以下文档: 66 | 67 | 1. [Angular 9 中文文档](https://angular.cn/docs), or [Angular 9 Docs(en)](https://angular.io/docs) 68 | 2. [Blox Material Components](https://blox.src.zone/material/components) 69 | 3. [Angular Flex Layout](https://github.com/angular/flex-layout) 70 | 71 | ## 构建 72 | 73 | ```bash 74 | ng build --prod --base-href "http[s]://*YOUR_URL*/" 75 | ``` 76 | 77 | 可部署的 site 版本将生成在 `./dist/aktools` 目录下。 78 | 79 | ## 发布 80 | 请参照 `publish.sh.example` 中说明修改脚本内容,之后可用于一键发布。 81 | -------------------------------------------------------------------------------- /angular.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 3 | "version": 1, 4 | "newProjectRoot": "projects", 5 | "projects": { 6 | "aktools": { 7 | "projectType": "application", 8 | "schematics": { 9 | "@schematics/angular:component": { 10 | "style": "scss" 11 | } 12 | }, 13 | "root": "", 14 | "sourceRoot": "src", 15 | "prefix": "app", 16 | "architect": { 17 | "build": { 18 | "builder": "@angular-devkit/build-angular:browser", 19 | "options": { 20 | "aot": true, 21 | "outputPath": "dist/aktools", 22 | "index": "src/index.html", 23 | "main": "src/main.ts", 24 | "polyfills": "src/polyfills.ts", 25 | "tsConfig": "tsconfig.app.json", 26 | "extractCss": true, 27 | "assets": [ 28 | "src/favicon.ico", 29 | "src/assets", 30 | "src/manifest.webmanifest" 31 | ], 32 | "styles": [ 33 | "src/styles.scss", 34 | { 35 | "inject": false, 36 | "input": "src/app/styles/themes/dark.scss", 37 | "bundleName": "dark" 38 | }, 39 | { 40 | "inject": false, 41 | "input": "src/app/styles/themes/light.scss", 42 | "bundleName": "light" 43 | } 44 | ], 45 | "stylePreprocessorOptions": { 46 | "includePaths": [ 47 | "node_modules" 48 | ] 49 | }, 50 | "scripts": [], 51 | "webWorkerTsConfig": "tsconfig.worker.json" 52 | }, 53 | "configurations": { 54 | "production": { 55 | "fileReplacements": [ 56 | { 57 | "replace": "src/environments/environment.ts", 58 | "with": "src/environments/environment.prod.ts" 59 | } 60 | ], 61 | "optimization": true, 62 | "outputHashing": "all", 63 | "sourceMap": false, 64 | "extractCss": true, 65 | "namedChunks": false, 66 | "aot": true, 67 | "extractLicenses": true, 68 | "vendorChunk": false, 69 | "buildOptimizer": true, 70 | "budgets": [ 71 | { 72 | "type": "initial", 73 | "maximumWarning": "2mb", 74 | "maximumError": "5mb" 75 | }, 76 | { 77 | "type": "anyComponentStyle", 78 | "maximumWarning": "6kb" 79 | } 80 | ], 81 | "serviceWorker": true, 82 | "ngswConfigPath": "ngsw-config.json" 83 | } 84 | } 85 | }, 86 | "serve": { 87 | "builder": "@angular-devkit/build-angular:dev-server", 88 | "options": { 89 | "browserTarget": "aktools:build" 90 | }, 91 | "configurations": { 92 | "production": { 93 | "browserTarget": "aktools:build:production" 94 | } 95 | } 96 | }, 97 | "extract-i18n": { 98 | "builder": "@angular-devkit/build-angular:extract-i18n", 99 | "options": { 100 | "browserTarget": "aktools:build" 101 | } 102 | }, 103 | "test": { 104 | "builder": "@angular-devkit/build-angular:karma", 105 | "options": { 106 | "main": "src/test.ts", 107 | "polyfills": "src/polyfills.ts", 108 | "tsConfig": "tsconfig.spec.json", 109 | "karmaConfig": "karma.conf.js", 110 | "assets": [ 111 | "src/favicon.ico", 112 | "src/assets", 113 | "src/manifest.webmanifest" 114 | ], 115 | "styles": [ 116 | "src/styles.scss" 117 | ], 118 | "scripts": [] 119 | } 120 | }, 121 | "lint": { 122 | "builder": "@angular-devkit/build-angular:tslint", 123 | "options": { 124 | "tsConfig": [ 125 | "tsconfig.app.json", 126 | "tsconfig.spec.json", 127 | "e2e/tsconfig.json", 128 | "tsconfig.worker.json" 129 | ], 130 | "exclude": [ 131 | "**/node_modules/**" 132 | ] 133 | } 134 | }, 135 | "e2e": { 136 | "builder": "@angular-devkit/build-angular:protractor", 137 | "options": { 138 | "protractorConfig": "e2e/protractor.conf.js", 139 | "devServerTarget": "aktools:serve" 140 | }, 141 | "configurations": { 142 | "production": { 143 | "devServerTarget": "aktools:serve:production" 144 | } 145 | } 146 | } 147 | } 148 | } 149 | }, 150 | "defaultProject": "aktools", 151 | "cli": { 152 | "analytics": "12b3bcc6-f809-45fc-8f0c-996d9f563e1d" 153 | } 154 | } -------------------------------------------------------------------------------- /browserslist: -------------------------------------------------------------------------------- 1 | # This file is used by the build system to adjust CSS and JS output to support the specified browsers below. 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | 5 | # You can see what browsers were selected by your queries by running: 6 | # npx browserslist 7 | 8 | > 0.5% 9 | last 2 versions 10 | Firefox ESR 11 | not dead 12 | not IE 9-11 # For IE 9-11 support, remove 'not'. -------------------------------------------------------------------------------- /default.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | location / { 4 | root /usr/share/nginx/html/; 5 | index index.html; 6 | try_files $uri $uri/ /index.html; 7 | } 8 | } -------------------------------------------------------------------------------- /e2e/protractor.conf.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | // Protractor configuration file, see link for more information 3 | // https://github.com/angular/protractor/blob/master/lib/config.ts 4 | 5 | const { SpecReporter } = require('jasmine-spec-reporter'); 6 | 7 | /** 8 | * @type { import("protractor").Config } 9 | */ 10 | exports.config = { 11 | allScriptsTimeout: 11000, 12 | specs: [ 13 | './src/**/*.e2e-spec.ts' 14 | ], 15 | capabilities: { 16 | 'browserName': 'chrome' 17 | }, 18 | directConnect: true, 19 | baseUrl: 'http://localhost:4200/', 20 | framework: 'jasmine', 21 | jasmineNodeOpts: { 22 | showColors: true, 23 | defaultTimeoutInterval: 30000, 24 | print: function() {} 25 | }, 26 | onPrepare() { 27 | require('ts-node').register({ 28 | project: require('path').join(__dirname, './tsconfig.json') 29 | }); 30 | jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); 31 | } 32 | }; -------------------------------------------------------------------------------- /e2e/src/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { AppPage } from './app.po'; 2 | import { browser, logging } from 'protractor'; 3 | 4 | describe('workspace-project App', () => { 5 | let page: AppPage; 6 | 7 | beforeEach(() => { 8 | page = new AppPage(); 9 | }); 10 | 11 | it('should display welcome message', () => { 12 | page.navigateTo(); 13 | expect(page.getTitleText()).toEqual('Welcome to aktools!'); 14 | }); 15 | 16 | afterEach(async () => { 17 | // Assert that there are no errors emitted from the browser 18 | const logs = await browser.manage().logs().get(logging.Type.BROWSER); 19 | expect(logs).not.toContain(jasmine.objectContaining({ 20 | level: logging.Level.SEVERE, 21 | } as logging.Entry)); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | navigateTo() { 5 | return browser.get(browser.baseUrl) as Promise; 6 | } 7 | 8 | getTitleText() { 9 | return element(by.css('app-root h1')).getText() as Promise; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/e2e", 5 | "module": "commonjs", 6 | "target": "es5", 7 | "types": [ 8 | "jasmine", 9 | "jasminewd2", 10 | "node" 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular-devkit/build-angular'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage-istanbul-reporter'), 13 | require('@angular-devkit/build-angular/plugins/karma') 14 | ], 15 | client: { 16 | clearContext: false // leave Jasmine Spec Runner output visible in browser 17 | }, 18 | coverageIstanbulReporter: { 19 | dir: require('path').join(__dirname, './coverage/aktools'), 20 | reports: ['html', 'lcovonly', 'text-summary'], 21 | fixWebpackSourcePaths: true 22 | }, 23 | reporters: ['progress', 'kjhtml'], 24 | port: 9876, 25 | colors: true, 26 | logLevel: config.LOG_INFO, 27 | autoWatch: true, 28 | browsers: ['Chrome'], 29 | singleRun: false, 30 | restartOnFileChange: true 31 | }); 32 | }; 33 | -------------------------------------------------------------------------------- /ngsw-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/service-worker/config/schema.json", 3 | "index": "/index.html", 4 | "assetGroups": [ 5 | { 6 | "name": "app", 7 | "installMode": "prefetch", 8 | "resources": { 9 | "files": [ 10 | "/favicon.ico", 11 | "/index.html", 12 | "/*.css", 13 | "/*.js", 14 | "/manifest.webmanifest" 15 | ] 16 | } 17 | }, { 18 | "name": "assets", 19 | "installMode": "lazy", 20 | "updateMode": "prefetch", 21 | "resources": { 22 | "files": [ 23 | "/assets/**", 24 | "/*.(eot|svg|cur|jpg|png|webp|gif|otf|ttf|woff|woff2|ani)" 25 | ] 26 | } 27 | } 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aktools", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "ng": "ng", 6 | "start": "ng serve", 7 | "build": "ng build", 8 | "test": "ng test", 9 | "lint": "ng lint", 10 | "e2e": "ng e2e" 11 | }, 12 | "private": true, 13 | "dependencies": { 14 | "@angular/animations": "^9.1.0-next.1", 15 | "@angular/cdk": "^9.1.0", 16 | "@angular/common": "^9.1.0-next.1", 17 | "@angular/compiler": "^9.1.0-next.1", 18 | "@angular/core": "^9.1.0-next.1", 19 | "@angular/flex-layout": "^9.0.0-beta.29", 20 | "@angular/forms": "^9.1.0-next.1", 21 | "@angular/platform-browser": "^9.1.0-next.1", 22 | "@angular/platform-browser-dynamic": "^9.1.0-next.1", 23 | "@angular/router": "^9.1.0-next.1", 24 | "@angular/service-worker": "^9.1.0-next.1", 25 | "@blox/material": "^0.17.0", 26 | "fonts.css": "^2.0.0", 27 | "msgpack-lite": "^0.1.26", 28 | "ngx-clipboard": "^13.0.0", 29 | "ngx-pica": "^1.1.4", 30 | "rollup": "^1.31.1", 31 | "rxjs": "~6.5.4", 32 | "tslib": "^1.11.0", 33 | "typings": "^2.1.1", 34 | "vintagejs": "2.2.0", 35 | "zone.js": "~0.10.2" 36 | }, 37 | "devDependencies": { 38 | "@angular-devkit/build-angular": "~0.901.0-next.0", 39 | "@angular/cli": "^9.1.0-next.0", 40 | "@angular/compiler-cli": "^9.1.0-next.1", 41 | "@angular/language-service": "^9.1.0-next.1", 42 | "@types/google.analytics": "0.0.40", 43 | "@types/jasmine": "^3.5.7", 44 | "@types/jasminewd2": "^2.0.8", 45 | "@types/node": "^13.7.6", 46 | "codelyzer": "^5.1.2", 47 | "jasmine-core": "~3.4.0", 48 | "jasmine-spec-reporter": "~4.2.1", 49 | "karma": "~4.1.0", 50 | "karma-chrome-launcher": "~2.2.0", 51 | "karma-coverage-istanbul-reporter": "^2.1.1", 52 | "karma-jasmine": "~2.0.1", 53 | "karma-jasmine-html-reporter": "^1.5.2", 54 | "protractor": "^5.4.3", 55 | "ts-node": "^8.6.2", 56 | "tslint": "~5.15.0", 57 | "typescript": "~3.7.5" 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /publish.sh.example: -------------------------------------------------------------------------------- 1 | # Publish to Github pages 2 | # Get your token from https://github.com/settings/tokens 3 | NAME=GithubUserName 4 | EMAIL=YourEMail 5 | TOKEN=AAAAAAAAAAAAAAAAAAAAAAAA 6 | CNAME=aktools.graueneko.xyz 7 | REPO=github.com/graueneko/aktools.git 8 | PROJECT=aktools 9 | 10 | ng build --prod --base-href "https://$CNAME/" && npx angular-cli-ghpages --dir=dist/$PROJECT --repo=https://$TOKEN@$REPO --no-silent --cname=$CNAME --email=$EMAIL --name=$NAME 11 | 12 | 13 | # Publish to Tencent Pages 14 | # Get your token from https://dev.tencent.com/user/account/setting/tokens 15 | NAME=CodingUserName 16 | EMAIL=YourEMail 17 | TOKEN=AAAAAAAAAAAAAAAAAAAAAAAA 18 | CNAME=aktoolscn.graueneko.xyz 19 | REPO=git.dev.tencent.com/graueneko/aktools.git 20 | PROJECT=aktools 21 | 22 | ng build --prod --base-href "https://$CNAME/" && npx angular-cli-ghpages --dir=dist/$PROJECT --repo=https://$TOKEN@$REPO --no-silent --cname=$CNAME --email=EMAIL --name=$NAME --branch=coding-pages 23 | 24 | -------------------------------------------------------------------------------- /src/README.md: -------------------------------------------------------------------------------- 1 | # Your Favicon Package 2 | 3 | This package was generated with [RealFaviconGenerator](https://realfavicongenerator.net/) [v0.16](https://realfavicongenerator.net/change_log#v0.16) 4 | 5 | ## Install instructions 6 | 7 | To install this package: 8 | 9 | Extract this package in the root of your web site. If your site is http://www.example.com, you should be able to access a file named http://www.example.com/favicon.ico. 10 | 11 | Insert the following code in the `head` section of your pages: 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *Optional* - Check your favicon with the [favicon checker](https://realfavicongenerator.net/favicon_checker) -------------------------------------------------------------------------------- /src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | import { HrComponent } from './hr/hr.component'; 4 | import { LvlupComponent } from './lvlup/lvlup.component'; 5 | import { MaterialComponent } from './material/material.component'; 6 | import { MainComponent } from './main/main.component'; 7 | import { HelpComponent } from './help/help.component'; 8 | import { CharMatComponent } from './char-mat/char-mat.component'; 9 | import { SettingsComponent } from './settings/settings.component'; 10 | import { AutoDetectComponent } from './auto-detect/auto-detect.component'; 11 | import { AutoDetectHashComponent } from './auto-detect-hash/auto-detect-hash.component'; 12 | import { DetectSetttingComponent } from './detect-setting/detect-setting.component'; 13 | const routes: Routes = [ 14 | { path: 'hr', component: HrComponent }, 15 | { path: 'lvlup', component: LvlupComponent }, 16 | { path: 'material', component: MaterialComponent }, 17 | { path: 'help', component: HelpComponent }, 18 | { path: 'charmat', component: CharMatComponent }, 19 | { path: 'settings', component: SettingsComponent }, 20 | { path: '', component: MainComponent, pathMatch: 'full' }, 21 | { path: 'autodetect', component: AutoDetectComponent}, 22 | { path: 'autodetecthash', component: AutoDetectHashComponent}, 23 | { path: 'detect-setting', component: DetectSetttingComponent}, 24 | { path: '**', redirectTo: '/' } 25 | ]; 26 | 27 | @NgModule({ 28 | imports: [RouterModule.forRoot(routes)], 29 | exports: [RouterModule] 30 | }) 31 | export class AppRoutingModule { } 32 | -------------------------------------------------------------------------------- /src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 54 |
55 |
56 |
57 |
58 | menu 59 | 60 |
61 |
62 | 69 |
70 |
71 |
72 | brightness_2 74 | share 76 | content_copy 78 | update 80 | help 81 | settings 83 |
84 |
85 |
86 |
87 | 88 |
-------------------------------------------------------------------------------- /src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | @import "./styles/custom.scss"; 2 | @import "@material/theme/mixins"; 3 | 4 | [mdcDrawerHeader], 5 | [mdcDrawerToolbarSpacer], 6 | [mdcToolbar] { 7 | // color the header variants the same way as the toolbar: 8 | @include mdc-theme-prop(background-color, primary); 9 | @include mdc-theme-prop(color, on-primary); 10 | 11 | /* Support for iOS 11.2+. */ 12 | padding-top: env(safe-area-inset-top); 13 | padding-right: env(safe-area-inset-right); 14 | padding-left: env(safe-area-inset-left); 15 | } 16 | 17 | // .toolbar-titles { 18 | // padding: 0.5em; 19 | // } 20 | 21 | section { 22 | align-items: center; 23 | } 24 | 25 | [mdcDrawerHeader] { 26 | height: 128px; 27 | } 28 | [mdcDrawerToolbarSpacer], 29 | [mdcToolbar] { 30 | height: 64px; 31 | } 32 | [mdcToolbarRow] { 33 | min-height: 100%; 34 | } 35 | 36 | .container { 37 | //@include mdc-theme-prop(background-color, background); 38 | //@include mdc-theme-prop(color, text-primary-on-background); 39 | 40 | max-width: 1400px; 41 | margin: auto; 42 | padding-top: calc(0.5em + env(safe-area-inset-top)); 43 | padding-right: calc(0.5em + env(safe-area-inset-right)); 44 | padding-bottom: calc(0.5em + env(safe-area-inset-bottom)); 45 | padding-left: calc(0.5em + env(safe-area-inset-left)); 46 | width: 100%; 47 | box-sizing: border-box; 48 | } 49 | .mdc-toolbar__title { 50 | font-size: 1.125em; 51 | color: var(--mdc-theme-on-primary); 52 | padding: 0.25em; 53 | } 54 | .mdc-toolbar__title.router-active { 55 | border: 1px solid rgba(0, 0, 0, 0.125); 56 | border-radius: 1em 0.5em 1em 0.5em; 57 | border-color: #ffffff; 58 | } 59 | 60 | [mdcDrawerHeaderContent] { 61 | .mdc-toolbar__title.router-active { 62 | border: none; 63 | } 64 | .drawer-header { 65 | height: 100%; 66 | widows: 100%; 67 | } 68 | } 69 | 70 | [mdcDrawerContent] { 71 | a { 72 | color: var(--mdc-theme-secondary); 73 | &:hover { 74 | color: var(--mdc-theme-on-secondary); 75 | background-color: var(--mdc-theme-secondary); 76 | i { 77 | font-size: 32px; 78 | color: var(--mdc-theme-on-secondary); 79 | } 80 | } 81 | i { 82 | color: var(--mdc-theme-secondary); 83 | } 84 | } 85 | } 86 | 87 | .router-active.small { 88 | font-size: 80%; 89 | } 90 | 91 | .toolbar-titles { 92 | height: 100%; 93 | align-items: center; 94 | display: flex; 95 | } 96 | 97 | .img-header { 98 | max-width: 100%; 99 | max-height: 100%; 100 | width: auto; 101 | height: auto; 102 | } 103 | 104 | .img-title { 105 | width: 48px; 106 | height: 48px; 107 | } 108 | -------------------------------------------------------------------------------- /src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, async } from '@angular/core/testing'; 2 | import { RouterTestingModule } from '@angular/router/testing'; 3 | import { AppComponent } from './app.component'; 4 | 5 | describe('AppComponent', () => { 6 | beforeEach(async(() => { 7 | TestBed.configureTestingModule({ 8 | imports: [ 9 | RouterTestingModule 10 | ], 11 | declarations: [ 12 | AppComponent 13 | ], 14 | }).compileComponents(); 15 | })); 16 | 17 | it('should create the app', () => { 18 | const fixture = TestBed.createComponent(AppComponent); 19 | const app = fixture.debugElement.componentInstance; 20 | expect(app).toBeTruthy(); 21 | }); 22 | 23 | it(`should have as title 'aktools'`, () => { 24 | const fixture = TestBed.createComponent(AppComponent); 25 | const app = fixture.debugElement.componentInstance; 26 | expect(app.title).toEqual('aktools'); 27 | }); 28 | 29 | it('should render title in a h1 tag', () => { 30 | const fixture = TestBed.createComponent(AppComponent); 31 | fixture.detectChanges(); 32 | const compiled = fixture.debugElement.nativeElement; 33 | expect(compiled.querySelector('h1').textContent).toContain('Welcome to aktools!'); 34 | }); 35 | }); 36 | -------------------------------------------------------------------------------- /src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, HostListener } from '@angular/core'; 2 | import { MdcSnackbarService } from '@blox/material'; 3 | import { SwUpdate } from '@angular/service-worker'; 4 | import { Router, NavigationEnd, ActivatedRoute } from '@angular/router'; 5 | import {SwitchThemeService} from './switch-theme.service'; 6 | import { Observable } from 'rxjs'; 7 | import { FetchService } from './fetch.service'; 8 | 9 | declare var ga: Function; 10 | 11 | @Component({ 12 | selector: 'app-root', 13 | templateUrl: './app.component.html', 14 | styleUrls: ['./app.component.scss'] 15 | }) 16 | export class AppComponent { 17 | title = '明日方舟工具箱 by 一只灰猫'; 18 | drawerOpen = false; 19 | deferredPrompt: any; 20 | baseUrl: string; 21 | nav: any; 22 | temporary = 'temporary'; 23 | showNavbar = true; 24 | theme: string; 25 | 26 | toggleDrawer(): void { 27 | this.drawerOpen = !this.drawerOpen; 28 | } 29 | 30 | showSnackBar(msg: string, action: string) { 31 | this.snackBar.show({ 32 | message: msg, 33 | actionText: action, 34 | multiline: false, 35 | actionOnBottom: false 36 | }); 37 | } 38 | 39 | constructor(private snackBar: MdcSnackbarService, 40 | private swUpdate: SwUpdate, 41 | private router: Router, 42 | private activatedRoute: ActivatedRoute, 43 | private switchTheme: SwitchThemeService, 44 | private fetchService: FetchService) { 45 | this.baseUrl = window.location.origin; 46 | this.nav = window.navigator; 47 | if (this.swUpdate.isEnabled) { 48 | this.swUpdate.checkForUpdate(); 49 | this.swUpdate.available.subscribe(() => { 50 | const snackbarRef = this.snackBar.show({ 51 | message: '有新版本可用,是否更新?(同样可以点击右上角手动更新)', 52 | actionText: '更新', 53 | multiline: true, 54 | actionOnBottom: true, 55 | timeout: 5000 56 | }); 57 | snackbarRef.action().subscribe(() => { 58 | this.doUpdate(); 59 | }); 60 | }); 61 | } 62 | this.router.events.subscribe(event => { 63 | if (event instanceof NavigationEnd) { 64 | ga('set', 'page', event.urlAfterRedirects); 65 | ga('send', 'pageview'); 66 | } 67 | }); 68 | this.activatedRoute.queryParams.subscribe(params => { 69 | this.showNavbar = !('hidenav' in params); 70 | }); 71 | 72 | this.theme = this.fetchService.getLocalStorage("theme", "dark"); 73 | this.switchTheme.setTheme(this.theme); 74 | } 75 | toggleTheme() { 76 | if(this.theme==="light"){ 77 | this.theme="dark"; 78 | this.switchTheme.setTheme(this.theme); 79 | this.fetchService.setLocalStorage("theme", this.theme); 80 | }else { 81 | this.theme="light"; 82 | this.switchTheme.setTheme(this.theme); 83 | this.fetchService.setLocalStorage("theme", this.theme); 84 | } 85 | } 86 | doUpdate() { 87 | this.swUpdate.activateUpdate().then(() => window.location.reload()); 88 | } 89 | doShare() { 90 | if (this.nav && this.nav.share) { 91 | this.nav.share({ 92 | title: this.title, 93 | text: this.title, 94 | url: window.location.origin 95 | }); 96 | } 97 | } 98 | 99 | 100 | @HostListener('window:beforeinstallprompt', ['$event']) 101 | onbeforeinstallprompt(e) { 102 | e.preventDefault(); 103 | this.deferredPrompt = e; 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { BrowserModule } from '@angular/platform-browser'; 2 | import { NgModule } from '@angular/core'; 3 | import { FormsModule } from '@angular/forms'; // (optional) 4 | import { MaterialModule } from '@blox/material'; 5 | import { HttpClientModule } from '@angular/common/http'; 6 | import { FlexLayoutModule } from '@angular/flex-layout'; 7 | 8 | import { AppRoutingModule } from './app-routing.module'; 9 | import { AppComponent } from './app.component'; 10 | import { HrComponent } from './hr/hr.component'; 11 | import { HrTagsComponent } from './hr-tags/hr-tags.component'; 12 | import { HrCombComponent } from './hr-comb/hr-comb.component'; 13 | import { LvlupComponent } from './lvlup/lvlup.component'; 14 | import { MaterialComponent } from './material/material.component'; 15 | import { MaterialCardComponent } from './material-card/material-card.component'; 16 | import { ServiceWorkerModule } from '@angular/service-worker'; 17 | import { environment } from '../environments/environment'; 18 | import { MainComponent } from './main/main.component'; 19 | import { HelpComponent } from './help/help.component'; 20 | import { ClipboardModule } from 'ngx-clipboard'; 21 | import { CharMatComponent } from './char-mat/char-mat.component'; 22 | import { CharMatCharcardComponent } from './char-mat-charcard/char-mat-charcard.component'; 23 | import { CharMatMatcardComponent } from './char-mat-matcard/char-mat-matcard.component'; 24 | import { SettingsComponent } from './settings/settings.component'; 25 | import { AutoDetectComponent } from './auto-detect/auto-detect.component'; 26 | import { AutoDetectHashComponent } from './auto-detect-hash/auto-detect-hash.component'; 27 | import { DetectSetttingComponent } from './detect-setting/detect-setting.component'; 28 | import { StageChooserComponent } from './stage-chooser/stage-chooser.component'; 29 | 30 | @NgModule({ 31 | declarations: [ 32 | AppComponent, 33 | HrComponent, 34 | HrTagsComponent, 35 | HrCombComponent, 36 | LvlupComponent, 37 | MaterialComponent, 38 | MaterialCardComponent, 39 | MainComponent, 40 | HelpComponent, 41 | CharMatComponent, 42 | CharMatCharcardComponent, 43 | CharMatMatcardComponent, 44 | SettingsComponent, 45 | AutoDetectComponent, 46 | AutoDetectHashComponent, 47 | DetectSetttingComponent, 48 | StageChooserComponent 49 | ], 50 | imports: [ 51 | BrowserModule, 52 | AppRoutingModule, 53 | HttpClientModule, 54 | FormsModule, 55 | MaterialModule, 56 | FlexLayoutModule, 57 | ClipboardModule, 58 | ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }) 59 | ], 60 | providers: [], 61 | bootstrap: [AppComponent] 62 | }) 63 | export class AppModule { } 64 | -------------------------------------------------------------------------------- /src/app/auto-detect-hash/auto-detect-hash.component.html: -------------------------------------------------------------------------------- 1 |
2 |
8 | 11 |
20 | 29 |    识别率低?设置属于自己的识别数据! 32 |
33 |
34 | 40 |
41 |
42 |

{{ InfoText }}

43 |
44 |
45 |
46 | 浏览器不支持Canvas 建议您换用最新版的Chrome/Firefox浏览器 49 |
50 | 138 |
139 | -------------------------------------------------------------------------------- /src/app/auto-detect-hash/auto-detect-hash.component.scss: -------------------------------------------------------------------------------- 1 | @import "../styles/custom.scss"; 2 | 3 | img[src=""], 4 | img:not([src]) { 5 | opacity: 0; 6 | } 7 | input, 8 | select { 9 | text-align: center; 10 | } 11 | .mdc-button--dense { 12 | min-width: 20px; 13 | } 14 | .mdc-text-field--upgraded:not(.mdc-text-field--fullwidth):not(.mdc-text-field--box) { 15 | margin: 0; 16 | } 17 | .ad-container { 18 | width: 100%; 19 | max-width: 1200px; 20 | margin: auto; 21 | .card-title { 22 | max-width: 100%; 23 | width: 400; 24 | padding: 0.25em; 25 | display: block; 26 | } 27 | } 28 | 29 | [mdcCard] { 30 | margin: 0.5em; 31 | 32 | .mat-icon { 33 | max-height: 48px; 34 | max-width: 48px; 35 | height: auto; 36 | width: auto; 37 | } 38 | .matcard-item { 39 | padding: 0.25em; 40 | } 41 | } 42 | 43 | [mdcButton]:not(.mdc-button--raised) { 44 | color: var(--mdc-theme-on-surface); 45 | 46 | &:hover, &:checked { 47 | color: var(--mdc-theme-on-primary); 48 | background-color: var(--mdc-theme-primary); 49 | } 50 | &:disabled { 51 | color: $color-muted; 52 | background-color: $color-black; 53 | } 54 | } 55 | 56 | // [mdcTextField] { 57 | // input { 58 | // color: $color-white; 59 | // } 60 | // } 61 | 62 | [mdcLinearProgress] { 63 | max-width:1200px; 64 | margin:0 auto 10px auto; 65 | } 66 | canvas { 67 | max-width: 1200px; 68 | margin: auto; 69 | } 70 | canvas:not(.lt-sm){ 71 | width: 100%; 72 | } 73 | canvas.lt-sm { 74 | max-height: 500px; 75 | } 76 | 77 | p, input, select { 78 | color: $color-muted; 79 | } 80 | 81 | .select { 82 | border:blue 2px solid; 83 | } 84 | 85 | #canvas-box { 86 | max-width: 100%; 87 | overflow-x: auto; 88 | text-align: center; 89 | } -------------------------------------------------------------------------------- /src/app/auto-detect-hash/auto-detect-hash.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { AutoDetectHashComponent } from './auto-detect-hash.component'; 4 | 5 | describe('AutoDetectHashComponent', () => { 6 | let component: AutoDetectHashComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ AutoDetectHashComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(AutoDetectHashComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/auto-detect/auto-detect.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 7 | 9 |
10 | 识别率低/识别出错? 11 |
12 |
13 | 18 | 19 | 20 |
21 |
22 |
23 | 24 |
25 |
26 |

{{this.getMaterialInfo(m[0])}}

27 |
28 |
29 |
30 |
31 | 32 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 44 | 45 |
46 |
47 |
48 |
49 | 50 |
51 | 52 | 53 | 等待上传 54 | 55 |
-------------------------------------------------------------------------------- /src/app/auto-detect/auto-detect.component.scss: -------------------------------------------------------------------------------- 1 | img[src=""], 2 | img:not([src]) { 3 | opacity: 0; 4 | } 5 | input, 6 | select { 7 | text-align: center; 8 | } 9 | .matcard-item { 10 | .mdc-button--dense { 11 | min-width: 20px; 12 | width: 20px; 13 | margin: 0; 14 | padding: 0; 15 | } 16 | } 17 | .mdc-text-field--upgraded:not(.mdc-text-field--fullwidth):not(.mdc-text-field--box) { 18 | margin: 0; 19 | } 20 | .ad-container { 21 | img { 22 | width: 100%; 23 | height: auto; 24 | } 25 | width: 100%; 26 | max-width: 1200px; 27 | margin: auto; 28 | 29 | .card-title { 30 | max-width: 100%; 31 | width: 400; 32 | padding: 0.25em; 33 | display: block; 34 | } 35 | } 36 | 37 | [mdcCard] { 38 | margin: 0.5em; 39 | 40 | .mat-icon { 41 | max-height: 48px; 42 | max-width: 48px; 43 | height: auto; 44 | width: auto; 45 | } 46 | .matcard-item { 47 | padding: 0.25em; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/app/auto-detect/auto-detect.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { AutoDetectComponent } from './auto-detect.component'; 4 | 5 | describe('AutoDetectComponent', () => { 6 | let component: AutoDetectComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ AutoDetectComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(AutoDetectComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/auto-detect/itemList.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | 'TKT_INST_FIN', 3 | 'MTL_ASC_DI', 4 | 'MTL_ASC_CST3', 5 | 'TKT_RECRUIT', 6 | 'MTL_BASE_SL1', 7 | 'MTL_BASE_SL2', 8 | 'MTL_SL_G1', 9 | 'MTL_BASE_SL3', 10 | 'MTL_SL_DS', 11 | 'GOLD', 12 | 'MTL_SL_KETONE1', 13 | 'MTL_GOLD3', 14 | 'sprite_exp_card_t1', 15 | 'sprite_exp_card_t4', 16 | 'MTL_ASC_CST2', 17 | 'MTL_SL_RUSH1', 18 | 'MTL_SL_STRG4', 19 | 'MTL_SL_RMA7012', 20 | 'MTL_SL_RMA7024', 21 | 'MTL_ASC_MED1', 22 | 'MTL_ASC_GRD1', 23 | 'MTL_SL_STRG1', 24 | 'MTL_SL_G2', 25 | 'MTL_SL_STRG3', 26 | 'MTL_SL_IRON2', 27 | 'MTL_GOLD1', 28 | 'MTL_SL_RUSH3', 29 | 'MTL_SKILL1', 30 | 'LGG_SHD', 31 | 'MTL_SL_MANGANESE1', 32 | 'MTL_ASC_TNK2', 33 | 'MTL_SL_IRON4', 34 | 'MTL_SL_IRON3', 35 | 'MTL_GOLD2', 36 | 'MTL_ASC_MED3', 37 | 'MTL_SL_BN', 38 | 'MTL_ASC_GRD3', 39 | 'MTL_SL_RUSH4', 40 | 'MTL_ASC_SPC2', 41 | 'MTL_ASC_SUP3', 42 | 'MTL_ASC_PIO3', 43 | 'MTL_SL_BOSS4', 44 | 'MTL_ASC_PIO1', 45 | 'MTL_SL_BOSS3', 46 | 'sprite_exp_card_t2', 47 | 'MTL_BASE_ESS', 48 | 'MTL_SL_IRON1', 49 | 'MTL_SL_STRG2', 50 | 'MTL_ASC_PIO2', 51 | 'MTL_ASC_SUP1', 52 | 'MTL_BASE_SYNTH1', 53 | 'HGG_SHD', 54 | 'MTL_ASC_SUP2', 55 | 'MTL_ASC_SPC1', 56 | 'MTL_SL_PP', 57 | 'MTL_SL_G4', 58 | 'MTL_ASC_TNK1', 59 | 'MTL_DIAMOND_SHD', 60 | 'MTL_SL_ALCOHOL1', 61 | 'EXGG_SHD', 62 | 'MTL_BASE_SYNTH3', 63 | 'MTL_SL_PG1', 64 | 'MTL_SKILL3', 65 | 'MTL_ASC_SPC3', 66 | 'MTL_SL_BOSS2', 67 | 'MTL_ASC_SNP1', 68 | 'MTL_ASC_CST1', 69 | 'MTL_SL_BOSS1', 70 | 'MTL_SL_G3', 71 | 'MTL_SL_PG2', 72 | 'MTL_ASC_MED2', 73 | 'MTL_SL_KETONE2', 74 | 'DIAMOND_SHD', 75 | 'sprite_exp_card_t3', 76 | 'MTL_SL_MANGANESE2', 77 | 'MTL_ASC_TNK3', 78 | 'MTL_SKILL2', 79 | 'MTL_SL_KETONE3', 80 | 'MTL_ASC_SNP2', 81 | 'DIAMOND', 82 | 'MTL_BASE_SYNTH2', 83 | 'MTL_ASC_SNP3', 84 | 'MTL_SL_KETONE4', 85 | 'MTL_SL_RUSH2', 86 | 'MTL_SL_ALCOHOL2', 87 | 'MTL_ASC_GRD2', 88 | ]; 89 | -------------------------------------------------------------------------------- /src/app/char-mat-charcard/char-mat-charcard.component.scss: -------------------------------------------------------------------------------- 1 | @import '../styles/custom.scss'; 2 | .mdc-button--dense { 3 | min-width: 20px; 4 | margin: 0; 5 | padding: 0; 6 | } 7 | .mdc-button--dense .material-icons{ 8 | font-size: 16px; 9 | } 10 | .input-field{ 11 | width: 100%; 12 | margin: 0.25em; 13 | } 14 | input, select { 15 | text-align: center; 16 | } 17 | [mdcCard] { 18 | max-width: 100%; 19 | width: 100%; 20 | margin: 0.75em 0; 21 | padding: 0.25em; 22 | border: 0.125em solid rgba(0, 0, 0, 0.125); 23 | border-radius: 2em 0.5em 0.5em 0.5em; 24 | color: var(--mdc-theme-on-surface); 25 | 26 | .card-heading { 27 | padding: 8px 16px; 28 | text-align: center; 29 | } 30 | 31 | .material-source { 32 | font-size: 0.875em; 33 | } 34 | .material-detail { 35 | padding: 0.25em; 36 | } 37 | } 38 | 39 | .mdc-card.ch-lvl-5 { 40 | border-color: #d0694e; 41 | } 42 | .mdc-card.ch-lvl-4 { 43 | border-color: #f9ce8c; 44 | } 45 | .mdc-card.ch-lvl-3 { 46 | border-color: #589bad; 47 | } 48 | .mdc-card.ch-lvl-2 { 49 | border-color: #7ebc59; 50 | } 51 | .mdc-card.ch-lvl-1 { 52 | border-color: #c3e3e5; 53 | } 54 | 55 | button { 56 | margin: 0; 57 | } 58 | [mdcIconButton] { 59 | padding: 0.5em; 60 | } 61 | [mdcButton]{ 62 | font-size: 0.875em; 63 | padding: 0px; 64 | color: var(--mdc-theme-on-surface); 65 | } 66 | [mdcButton].btnTitle{ 67 | min-width: 54px; 68 | width:54px; 69 | white-space: normal; 70 | } 71 | .mdc-text-field--upgraded:not(.mdc-text-field--fullwidth):not(.mdc-text-field--box){ 72 | margin-top: 0; 73 | } -------------------------------------------------------------------------------- /src/app/char-mat-charcard/char-mat-charcard.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { CharMatCharcardComponent } from './char-mat-charcard.component'; 4 | 5 | describe('CharMatCharcardComponent', () => { 6 | let component: CharMatCharcardComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ CharMatCharcardComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(CharMatCharcardComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/char-mat-matcard/char-mat-matcard.component.html: -------------------------------------------------------------------------------- 1 |
2 | 7 |
8 | 9 |
10 |
11 | 12 |
13 |
14 |

{{allmats[m.id].name}}

15 |
16 |
17 |

{{m.count}}

18 |
19 |
20 |
21 |
22 | -------------------------------------------------------------------------------- /src/app/char-mat-matcard/char-mat-matcard.component.scss: -------------------------------------------------------------------------------- 1 | @import '../styles/custom.scss'; 2 | 3 | [mdcCard] { 4 | min-width: 300px; 5 | width: 100%; 6 | max-width: 100%; 7 | margin-top: 0.5em; 8 | padding: 0.25em; 9 | color: var(--mdc-theme-on-surface); 10 | img { 11 | max-width: 48px; 12 | max-height: 48px; 13 | width: auto; 14 | height: auto; 15 | margin: auto; 16 | } 17 | 18 | p { 19 | margin: 0; 20 | } 21 | 22 | .matcard-item { 23 | padding: 0.125em 0.5em; 24 | min-width: 150px; 25 | width: 160px; 26 | max-width: 100%; 27 | border: 0.125em solid rgba(0, 0, 0, 0.125); 28 | border-radius: 2em 0.5em 0.5em 2em; 29 | font-size: 0.875rem; 30 | margin: 0.125em; 31 | } 32 | .matcard-item-image { 33 | width: 48px; 34 | height: 48px; 35 | display: flex; 36 | } 37 | 38 | [mdcCardActions] { 39 | min-width: 300px; 40 | width: 300px; 41 | } 42 | 43 | .place-holder { 44 | height: 0px; 45 | border: none; 46 | } 47 | 48 | .m-lvl-5 { 49 | border-color: #d0694e; 50 | } 51 | .m-lvl-4 { 52 | border-color: #f9ce8c; 53 | } 54 | .m-lvl-3 { 55 | border-color: #589bad; 56 | } 57 | .m-lvl-2 { 58 | border-color: #7ebc59; 59 | } 60 | .m-lvl-1 { 61 | border-color: #c3e3e5; 62 | } 63 | } 64 | 65 | [mdcButton] { 66 | color: var(--mdc-theme-on-surface); 67 | } -------------------------------------------------------------------------------- /src/app/char-mat-matcard/char-mat-matcard.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { CharMatMatcardComponent } from './char-mat-matcard.component'; 4 | 5 | describe('CharMatMatcardComponent', () => { 6 | let component: CharMatMatcardComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ CharMatMatcardComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(CharMatMatcardComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/char-mat-matcard/char-mat-matcard.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | import { MaterialItem } from '../model/materialitem'; 3 | import { FetchService } from '../fetch.service'; 4 | import { Router } from '@angular/router'; 5 | import { MdcSnackbarService } from '@blox/material'; 6 | 7 | @Component({ 8 | selector: 'app-char-mat-matcard', 9 | templateUrl: './char-mat-matcard.component.html', 10 | styleUrls: ['./char-mat-matcard.component.scss'] 11 | }) 12 | export class CharMatMatcardComponent implements OnInit { 13 | @Input() allmats: { [key: string]: MaterialItem }; 14 | private innerSMats = []; 15 | @Input() 16 | set smats(sm: Array) { 17 | this.innerSMats = sm; 18 | } 19 | get smats() { 20 | return this.innerSMats; 21 | } 22 | toMaterialCalc() { 23 | if (!this.innerSMats || this.innerSMats.length === 0) { 24 | this.snackbar.show({ 25 | message: '材料为空,请先输入需求。', 26 | actionText: '好的', 27 | multiline: false, 28 | actionOnBottom: false 29 | }); 30 | return; 31 | } 32 | const data = this.fetch.getLocalStorage('m-data', {}); 33 | if (Object.keys(data).length === 0) { 34 | this.snackbar.show({ 35 | message: '请先打开一次材料计算页面。', 36 | actionText: '好的', 37 | multiline: false, 38 | actionOnBottom: false 39 | }); 40 | return; 41 | } 42 | // 导入前清空原有需求 43 | for (const e in data) { 44 | if (data.hasOwnProperty(e)) { 45 | data[e].need = 0; 46 | } 47 | } 48 | for (const m of this.innerSMats) { 49 | if(data[this.allmats[m.id].name]){ 50 | data[this.allmats[m.id].name].need = m.count; 51 | } else { 52 | this.snackbar.show({ 53 | message: '材料有更新,请先打开一次材料计算页面,当前输入不会清空。', 54 | actionText: '好的', 55 | multiline: false, 56 | actionOnBottom: false 57 | }); 58 | return; 59 | } 60 | } 61 | this.fetch.setLocalStorage('m-data', data); 62 | this.fetch.setLocalStorage('m-option', { 63 | showOnly3plus: true, 64 | filtered: true, 65 | showMat: true, 66 | showChip: true, 67 | showBook: true 68 | }); 69 | this.router.navigateByUrl('/material'); 70 | } 71 | constructor(private fetch: FetchService, private router: Router, private snackbar: MdcSnackbarService) { } 72 | 73 | ngOnInit() { 74 | } 75 | 76 | } 77 | -------------------------------------------------------------------------------- /src/app/char-mat/char-mat.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | 14 | 15 |
16 |
17 |
18 |
19 | 30 | 31 |
32 |
33 |
34 |
35 | 38 | 39 |
40 |
41 |
42 |
43 | 44 |
45 |
46 |
47 |
48 | 50 |
51 |
52 |
53 |
54 | 55 |
56 |
-------------------------------------------------------------------------------- /src/app/char-mat/char-mat.component.scss: -------------------------------------------------------------------------------- 1 | .input-field { 2 | width: 100%; 3 | margin: 0.25em; 4 | } 5 | input, 6 | select { 7 | text-align: center; 8 | padding-inline-start: 0.5em; 9 | } 10 | .padding-x-1 { 11 | padding: 0 1em; 12 | } 13 | div { 14 | color: var(--mdc-theme-on-surface); 15 | } 16 | 17 | option, 18 | .tpob { 19 | color: var(--mdc-theme-text-primary-on-background); 20 | background-color: var(--mdc-theme-background); 21 | } 22 | 23 | .mdc-select__native-control:focus ~ .mdc-floating-label { 24 | color: var(--mdc-theme-text-primary-on-background); 25 | } 26 | -------------------------------------------------------------------------------- /src/app/char-mat/char-mat.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { CharMatComponent } from './char-mat.component'; 4 | 5 | describe('CharMatComponent', () => { 6 | let component: CharMatComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ CharMatComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(CharMatComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/char-mat/char-mat.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, ChangeDetectorRef, AfterViewChecked } from '@angular/core'; 2 | import { FetchService } from '../fetch.service'; 3 | import { MaterialItem } from '../model/materialitem'; 4 | import { MdcSnackbarService } from '@blox/material'; 5 | 6 | @Component({ 7 | selector: 'app-char-mat', 8 | templateUrl: './char-mat.component.html', 9 | styleUrls: ['./char-mat.component.scss'] 10 | }) 11 | export class CharMatComponent implements OnInit, AfterViewChecked { 12 | 13 | cmMap: any; 14 | chars = []; 15 | charByStar: Array; 16 | charByProf: any; 17 | mats: { [key: string]: MaterialItem }; 18 | joindChars = []; 19 | star = 6; 20 | prof = '全部'; 21 | char = ''; 22 | selectedChars = []; 23 | rawMat = {}; 24 | summarizedMats: Array; 25 | constructor(private fetch: FetchService, private cdRef: ChangeDetectorRef, private snackbar: MdcSnackbarService) { } 26 | 27 | 28 | ngOnInit() { 29 | this.fetch.getJson('./assets/data/charMaterials.json').subscribe(data => { 30 | this.cmMap = data; 31 | this.chars = Object.keys(data); 32 | const cbs = [[], [], [], [], [], [], []]; 33 | const cbp = { 医疗: [], 近卫: [], 先锋: [], 重装: [], 狙击: [], 术师: [], 辅助: [], 特种: [], 全部: [], 其它: [] }; 34 | for (const chn in data) { 35 | if (data[chn] && data[chn].profession !== '其它') { 36 | cbs[0].push(chn); 37 | cbp.全部.push(chn); 38 | cbs[+data[chn].rarity + 1].push(chn); 39 | cbp[data[chn].profession].push(chn); 40 | } 41 | } 42 | for (let i = 0; i < cbs.length; i++) { 43 | cbs[i] = cbs[i].sort((a, b) => a > b ? 1 : (a < b ? -1 : 0)); 44 | } 45 | for (const p in cbp) { 46 | if (cbp[p]) { 47 | cbp[p] = cbp[p].sort((a, b) => a > b ? 1 : (a < b ? -1 : 0)); 48 | } 49 | } 50 | this.charByStar = cbs; 51 | this.charByProf = cbp; 52 | this.onFilterChange(); 53 | this.selectedChars = this.fetch.getLocalStorage('cm-chars', []); 54 | }); 55 | this.fetch.getJson('./assets/data/material.json').subscribe(data => { 56 | this.mats = data; 57 | }); 58 | } 59 | onFilterChange() { 60 | const cs = this.charByStar[this.star]; 61 | const cp = this.charByProf[this.prof]; 62 | // 在已排好序的前提下求交集,时间复杂度n+m 63 | const joind = []; 64 | for (let i = 0, j = 0; i < cs.length && j < cp.length;) { 65 | if (cs[i] > cp[j]) { 66 | j++; 67 | } else if (cs[i] < cp[j]) { 68 | i++; 69 | } else if (cs[i] === cp[j]) { 70 | joind.push(cs[i]); 71 | i++; 72 | j++; 73 | } 74 | } 75 | this.joindChars = joind; 76 | if (joind.length > 0) { 77 | this.char = joind[0]; 78 | } 79 | } 80 | onCharAdd() { 81 | if (!this.selectedChars.includes(this.char)) { 82 | this.selectedChars.unshift(this.char); 83 | this.fetch.setLocalStorage('cm-chars', this.selectedChars); 84 | } else { 85 | this.snackbar.show({ 86 | message: '干员已存在。', 87 | actionText: '好的', 88 | multiline: false, 89 | actionOnBottom: false 90 | }); 91 | } 92 | } 93 | onCharRemove(name: string) { 94 | const index = this.selectedChars.indexOf(name, 0); 95 | if (index > -1) { 96 | this.selectedChars.splice(index, 1); 97 | } 98 | delete this.rawMat[name]; 99 | this.fetch.setLocalStorage('cm-chars', this.selectedChars); 100 | this.summaryMats(); 101 | } 102 | onMatReport(charMat: any) { 103 | // console.log(charMat); 104 | this.rawMat[charMat.name] = charMat.mat; 105 | this.summaryMats(); 106 | } 107 | addOrCreate(m: any, key: string, val: number) { 108 | if (key in m) { 109 | m[key] += val; 110 | } else { 111 | m[key] = val; 112 | } 113 | } 114 | summaryMats() { 115 | const sum = {}; 116 | for (const k in this.rawMat) { 117 | if (this.rawMat[k]) { 118 | for (const mid in this.rawMat[k]) { 119 | if (this.rawMat[k][mid]) { 120 | this.addOrCreate(sum, mid, this.rawMat[k][mid]); 121 | } 122 | } 123 | } 124 | } 125 | const sorted = []; 126 | for (const k in sum) { 127 | if (sum[k]) { 128 | sorted.push({ 129 | id: k, 130 | count: sum[k] 131 | }); 132 | } 133 | } 134 | sorted.sort((a, b) => this.mats[a.id].rarity > this.mats[b.id].rarity ? -1 : 135 | (this.mats[a.id].rarity < this.mats[b.id].rarity ? 1 : 136 | (a.id > b.id ? -1 : (a.id < b.id ? 1 : 0)))); 137 | this.summarizedMats = sorted; 138 | } 139 | 140 | ngAfterViewChecked() { 141 | this.cdRef.detectChanges(); 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /src/app/detect-setting/detect-setting.component.scss: -------------------------------------------------------------------------------- 1 | @import "../styles/custom.scss"; 2 | 3 | img[src=""], 4 | img:not([src]) { 5 | opacity: 0; 6 | } 7 | input, 8 | select { 9 | text-align: center; 10 | } 11 | .mdc-button--dense { 12 | min-width: 20px; 13 | } 14 | .mdc-text-field--upgraded:not(.mdc-text-field--fullwidth):not(.mdc-text-field--box) { 15 | margin: 0; 16 | } 17 | .ad-container { 18 | width: 100%; 19 | max-width: 1200px; 20 | margin: auto; 21 | .card-title { 22 | max-width: 100%; 23 | width: 400; 24 | padding: 0.25em; 25 | display: block; 26 | } 27 | } 28 | 29 | [mdcCard] { 30 | margin: 0.5em; 31 | 32 | .mat-icon { 33 | max-height: 48px; 34 | max-width: 48px; 35 | height: auto; 36 | width: auto; 37 | } 38 | .matcard-item { 39 | padding: 0.25em; 40 | } 41 | } 42 | 43 | [mdcButton]:not(.mdc-button--raised) { 44 | color: var(--mdc-theme-on-surface); 45 | &:hover, &:checked { 46 | color: var(--mdc-theme-on-primary); 47 | background-color: var(--mdc-theme-primary); 48 | } 49 | &:disabled { 50 | color: $color-muted; 51 | background-color: $color-black; 52 | } 53 | } 54 | 55 | // [mdcTextField] { 56 | // input { 57 | // color: $color-white; 58 | // } 59 | // } 60 | 61 | [mdcLinearProgress] { 62 | max-width:1200px; 63 | margin:0 auto 10px auto; 64 | } 65 | canvas { 66 | width:100%; 67 | max-width: 1200px; 68 | } 69 | 70 | p, input, select { 71 | color: $color-muted; 72 | } 73 | 74 | .select { 75 | border:blue 2px solid; 76 | } 77 | .mdc-dialog__surface { 78 | color: var(--mdc-theme-on-surface); 79 | } 80 | 81 | .bitchar { 82 | font-family: Courier; 83 | color: green; 84 | 85 | } 86 | .bitchar.bcred { 87 | color: red; 88 | } 89 | [mdcTextField] { 90 | height: 200px; 91 | width: 100%; 92 | textarea { 93 | color: $color-muted; 94 | background-color: rgba($color-dark, 0.1); 95 | resize: none; 96 | width: 100%; 97 | height: 185px; 98 | font-size: small; 99 | } 100 | } 101 | .mdc-text-field__input { 102 | padding: 0.5em; 103 | } -------------------------------------------------------------------------------- /src/app/detect-setting/detect-setting.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { DetectSetttingComponent } from './detect-setting.component'; 4 | 5 | describe('AutoDetectComponent', () => { 6 | let component: DetectSetttingComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ DetectSetttingComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(DetectSetttingComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/fetch.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { FetchService } from './fetch.service'; 4 | 5 | describe('FetchService', () => { 6 | beforeEach(() => TestBed.configureTestingModule({})); 7 | 8 | it('should be created', () => { 9 | const service: FetchService = TestBed.get(FetchService); 10 | expect(service).toBeTruthy(); 11 | }); 12 | }); 13 | -------------------------------------------------------------------------------- /src/app/fetch.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Observable } from 'rxjs'; 3 | import { HttpClient, HttpHeaders } from '@angular/common/http'; 4 | 5 | @Injectable({ 6 | providedIn: 'root' 7 | }) 8 | export class FetchService { 9 | private cache = new Object(); 10 | constructor(private http: HttpClient) { } 11 | public getJson(url: string): Observable { 12 | if (url in this.cache) { 13 | return this.cache[url]; 14 | } 15 | const resp = this.http.get(url); 16 | this.cache[url] = resp; 17 | return resp; 18 | } 19 | 20 | public postJson(url: string, data: any): Observable { 21 | const resp = this.http.post(url, data); 22 | return resp; 23 | } 24 | 25 | public getLocalStorage(key: string, defaultVal: any = null): any { 26 | const val = localStorage.getItem(key); 27 | // console.log({ key: val }); 28 | if (val === null) { return defaultVal; } 29 | return JSON.parse(val); 30 | } 31 | public setLocalStorage(key: string, val: any) { 32 | // console.log({ key: val }); 33 | localStorage.setItem(key, JSON.stringify(val)); 34 | } 35 | public removeLocalStorage(key: string) { 36 | localStorage.removeItem(key); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/app/help/help.component.html: -------------------------------------------------------------------------------- 1 |
2 |

目录

3 | 11 | 12 |

右上角图标说明

13 |

右上角图标根据浏览器不同可能会有不同的显示,但每个位置功能相同:

14 |
15 | 16 |

依次为:复制或分享,更新,帮助,清空

17 |
    18 |
  • content_copy复制share分享 按钮可以帮您快速分享或者保存本工具链接。
  • 19 |
  • update更新 按钮可以强制更新本App,由于更新速度较快,请时常点击一下。
  • 20 |
  • help帮助 按钮带您回到本页面。
  • 21 |
  • delete清空 按钮可以清除本地的输入数据信息,这并不会影响到下次应用加载速度,也不会强制更新。
  • 22 |
23 | 24 | 25 |

添加到主屏幕教程

26 |

本工具箱以移动设备优先,添加到主屏幕后可以获得原生App体验:

27 |

首次加载后,后续使用加载飞快,可以离线使用,自动更新。

28 | 29 |

iOS 11及以上

30 |

1. 使用Safari浏览器打开本站任意页面;

31 | 32 |

2. 点击底部分享按钮;

33 | 34 |

3. 选择“添加到主屏幕”;

35 | 36 |

4. 若图标未加载出来,请稍等或者稍后重试;

37 | 38 |

5. 现在可以在主屏幕使用,无需安装。

39 | 40 |

Android 4.1以及上

41 |

1. 使用Chrome浏览器打开本站任意页面;

42 | 43 |

2. 点击底部添加按钮;

44 | 45 |

3. 若按钮未加载出来,可以到菜单栏选择“添加到主屏幕”;

46 | 47 |

4. 点击“添加”;

48 | 49 |

5. 现在可以在主屏幕使用,无需安装。

50 |
-------------------------------------------------------------------------------- /src/app/help/help.component.scss: -------------------------------------------------------------------------------- 1 | @import "../styles/custom.scss"; 2 | 3 | .help-container { 4 | max-width: 1200px; 5 | margin: auto; 6 | padding: 1em; 7 | } 8 | 9 | p { 10 | color: $color-muted; 11 | } 12 | img { 13 | max-width: 300px; 14 | width: auto; 15 | height: auto; 16 | } 17 | ul { 18 | color: $color-muted; 19 | li { 20 | vertical-align: center; 21 | align-content: center; 22 | align-items: center; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/app/help/help.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { HelpComponent } from './help.component'; 4 | 5 | describe('AddToHomescreenComponent', () => { 6 | let component: HelpComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ HelpComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(HelpComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/help/help.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-help', 5 | templateUrl: './help.component.html', 6 | styleUrls: ['./help.component.scss'] 7 | }) 8 | export class HelpComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit() { 13 | } 14 | 15 | scrollToAnchor($element: any) { 16 | $element.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' }); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/app/hr-comb/hr-comb.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 | 6 |
7 |
8 |
9 |
10 | 12 |
13 |
14 |
15 | 16 | 17 |
18 |
19 |
20 |
21 | 22 | 24 | 25 |
26 |
27 |
28 | 29 | 30 |
31 | 32 | 33 | 36 | 40 | 41 |
34 | 35 | 37 | 39 |
42 |
43 |
-------------------------------------------------------------------------------- /src/app/hr-comb/hr-comb.component.scss: -------------------------------------------------------------------------------- 1 | @import "../styles/custom.scss"; 2 | 3 | .char-lvl-6 { 4 | background-color: #d0694e; 5 | color: white; 6 | } 7 | 8 | .char-lvl-5 { 9 | background-color: #f9ce8c; 10 | color: #1a1d1e; 11 | } 12 | 13 | .char-lvl-4 { 14 | background-color: #589bad; 15 | color: white; 16 | } 17 | 18 | .char-lvl-3 { 19 | background-color: #7ebc59; 20 | color: white; 21 | } 22 | 23 | .char-lvl-2 { 24 | background-color: #c3e3e5; 25 | color: #1a1d1e; 26 | } 27 | 28 | .char-lvl-1 { 29 | background-color: #1a1d1e; 30 | color: white; 31 | } 32 | 33 | .char-hl { 34 | background-color: var(--mdc-theme-primary); 35 | color: white; 36 | } 37 | 38 | table { 39 | width: 100%; 40 | td { 41 | background: var(--hr-comb-background); 42 | color: rgba(#fff, 0.3); 43 | font-size: 1em; 44 | padding: 0px; 45 | } 46 | } 47 | 48 | [mdcCard] { 49 | margin: 8px 4px; 50 | background: var(--hr-comb-background); 51 | } 52 | 53 | 54 | // .btn-tag { 55 | // background-color: $mdc-theme-secondary; 56 | // color: #fff; 57 | // } 58 | 59 | .mdc-list-divider { 60 | margin: 2px; 61 | } 62 | 63 | .mdc-chip { 64 | margin: 8px; 65 | background: transparent 66 | } 67 | 68 | .mdc-button { 69 | padding: 0em 0.75em; 70 | min-width: 0px; 71 | min-height: 0px; 72 | height: 32px; 73 | } 74 | 75 | .mdc-button.mdc-button--outlined { 76 | padding: 0em 0.5em; 77 | background-color: var(--mdc-theme-on-primary); 78 | } 79 | 80 | .gap-row { 81 | background-color: var(--hr-gap-background); 82 | } 83 | 84 | [mdcListDivider] { 85 | margin: 0px; 86 | } 87 | 88 | // td { 89 | // min-width: 125px; 90 | // } 91 | .p-25{ 92 | padding: 0.25em; 93 | } 94 | .inline-block { 95 | display: inline-block; 96 | } 97 | .hidden-gap-row { 98 | height: 1px; 99 | width: 100%; 100 | min-width: 100%; 101 | } -------------------------------------------------------------------------------- /src/app/hr-comb/hr-comb.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { HrCombComponent } from './hr-comb.component'; 4 | 5 | describe('HrCombComponent', () => { 6 | let component: HrCombComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ HrCombComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(HrCombComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/hr-comb/hr-comb.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; 2 | import { HrComb } from '../model/hrcomb'; 3 | import { FetchService } from '../fetch.service'; 4 | 5 | @Component({ 6 | selector: 'app-hr-comb', 7 | templateUrl: './hr-comb.component.html', 8 | styleUrls: ['./hr-comb.component.scss'] 9 | }) 10 | export class HrCombComponent implements OnInit { 11 | @Input() hrcombs: Array; 12 | constructor(private fetch: FetchService) { } 13 | @Input() charSelected: ''; 14 | @Input() option: number; 15 | 16 | @Output() reportCharClick = new EventEmitter(); 17 | 18 | // Note: without this trackBy function, *ngFor re-rendering will be extremely 19 | // slow due to the tracking mechanism. 20 | public trackComb(_: number, item: HrComb) { 21 | if (item === null) { return null; } 22 | return item.id; 23 | } 24 | 25 | onNameClick(name: string) { 26 | this.reportCharClick.emit(name); 27 | } 28 | 29 | ngOnInit() { 30 | } 31 | 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/app/hr-tags/hr-tags.component.html: -------------------------------------------------------------------------------- 1 | 12 | 13 |
14 | 17 | 20 | 23 | 26 | 29 | 32 | 35 |
36 | 37 | 38 | 39 | 40 | 43 | 47 | 48 | 49 |
41 | 42 | 44 | 46 |
-------------------------------------------------------------------------------- /src/app/hr-tags/hr-tags.component.scss: -------------------------------------------------------------------------------- 1 | @import "../styles/custom.scss"; 2 | 3 | .mdc-button { 4 | border-color: var(--hr-unselected-background); 5 | background-color: var(--hr-unselected-background); 6 | padding: 0em 0.5em; 7 | min-width: 0px; 8 | min-height: 0px; 9 | height: 32px; 10 | &:hover { 11 | border-color: var(--mdc-theme-secondary); 12 | } 13 | } 14 | 15 | .mdc-button--outlined:not(.mdc-button--raised){ 16 | color: var(--hr-unselected-text); 17 | background-color: var(--hr-unselected-background); 18 | border-color: var(--hr-tag-border); 19 | } 20 | .mdc-button--outlined.mdc-button--raised { 21 | color: var(--hr-selected-text); 22 | background-color: var(--hr-selected-background); 23 | border-color: var(--hr-selected-background); 24 | } 25 | 26 | .mdc-button.btnTitle { 27 | background-color: var(--hr-unselected-background); 28 | color: var(--hr-unselected-text); 29 | } 30 | 31 | .no-padding { 32 | padding: 0px, 0px, 0px, 0px; 33 | } 34 | 35 | .mdc-chip { 36 | margin: 2px; 37 | } 38 | 39 | .btnStarGroup .mdc-button { 40 | padding: 0 0.36em; 41 | min-width: 0px; 42 | } 43 | 44 | .btnRowTitle { 45 | color: var(--hr-unselected-text); 46 | background-color: unset; 47 | padding: 0 0.25em; 48 | min-width: 40px; 49 | margin: 0px; 50 | pointer-events: none; 51 | } 52 | 53 | .even-row { 54 | background-color: var(--hr-gap-background); 55 | } 56 | -------------------------------------------------------------------------------- /src/app/hr-tags/hr-tags.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { HrTagsComponent } from './hr-tags.component'; 4 | 5 | describe('HrTagsComponent', () => { 6 | let component: HrTagsComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ HrTagsComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(HrTagsComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/hr-tags/hr-tags.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; 2 | import { HrTagRow } from '../model/hrtagrow'; 3 | import { MdcSnackbarService } from '@blox/material'; 4 | import { FetchService } from '../fetch.service'; 5 | import { ActivatedRoute } from '@angular/router'; 6 | 7 | @Component({ 8 | selector: 'app-hr-tags', 9 | templateUrl: './hr-tags.component.html', 10 | styleUrls: ['./hr-tags.component.scss'] 11 | }) 12 | export class HrTagsComponent implements OnInit { 13 | 14 | @Input() tagrows: Array; 15 | selectedTags: Array; 16 | @Output() reportSelectedTags = new EventEmitter(); 17 | @Output() reportSelectedStars = new EventEmitter(); 18 | selectedStars: Array = this.fetch.getLocalStorage('hr-stars', [true, true, true, true, true, true, true]); 19 | 20 | onStarBtnClick(id): void { 21 | if (id === 0) { 22 | const newStat = !this.selectedStars[0]; 23 | for (let i = 0; i < 7; i++) { 24 | this.selectedStars[i] = newStat; 25 | } 26 | } else { 27 | this.selectedStars[id] = !this.selectedStars[id]; 28 | let allSelected = true; 29 | for (let i = 1; i < 7; i++) { 30 | if (!this.selectedStars[i]) { allSelected = false; } 31 | } 32 | this.selectedStars[0] = allSelected; 33 | } 34 | const stars = []; 35 | for (let i = 1; i < 7; i++) { 36 | if (this.selectedStars[i]) { stars.push(i); } 37 | } 38 | this.fetch.setLocalStorage('hr-stars', this.selectedStars); 39 | this.reportSelectedStars.emit(stars); 40 | } 41 | onTagClick(tag: string): void { 42 | const index = this.selectedTags.indexOf(tag, 0); 43 | if (index > -1) { 44 | this.selectedTags.splice(index, 1); 45 | } else if (this.selectedTags.length > 5) { 46 | this.showSnackBar('无法选择更多标签:最多6个', '好的'); 47 | return; 48 | } else { 49 | this.selectedTags.push(tag); 50 | } 51 | this.reportSelectedTags.emit(this.selectedTags); 52 | } 53 | showSnackBar(msg: string, action: string) { 54 | this.snackbar.show({ 55 | message: msg, 56 | actionText: action, 57 | multiline: false, 58 | actionOnBottom: false 59 | }); 60 | } 61 | constructor(private snackbar: MdcSnackbarService, 62 | private fetch: FetchService, 63 | private activatedRoute: ActivatedRoute) { 64 | this.activatedRoute.queryParams.subscribe(params => { 65 | this.selectedTags = ('tags' in params) ? params.tags.split(' ') : []; 66 | }); 67 | this.selectedStars = this.fetch.getLocalStorage('hr-stars', [true, true, true, true, true, true, true]); 68 | } 69 | ngOnInit() { 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /src/app/hr/hr.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 6 |
7 |
8 |
10 |
11 |
12 |
13 |
14 | 16 | 17 |
18 |
-------------------------------------------------------------------------------- /src/app/hr/hr.component.scss: -------------------------------------------------------------------------------- 1 | @import "../styles/custom.scss"; 2 | 3 | .float-box { 4 | position: fixed; 5 | } 6 | .tagrows-container { 7 | max-width: 550px; 8 | } 9 | .mdc-button { 10 | padding: 0em 0.75em; 11 | min-width: 0px; 12 | min-height: 0px; 13 | height: 32px; 14 | } 15 | 16 | .option-0 { 17 | color: #1a1d1e; 18 | background-color: $color-2; 19 | } 20 | .option-1 { 21 | color: #1a1d1e; 22 | background-color: $color-3; 23 | } 24 | .option-2 { 25 | color: white; 26 | background-color: $color-4; 27 | } 28 | #btnClear { 29 | color: #fff; 30 | background-color: $color-1; 31 | } 32 | -------------------------------------------------------------------------------- /src/app/hr/hr.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { HrComponent } from './hr.component'; 4 | 5 | describe('HrComponent', () => { 6 | let component: HrComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ HrComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(HrComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/lvlup/lvlup.component.scss: -------------------------------------------------------------------------------- 1 | @import '../styles/custom.scss'; 2 | 3 | .mdc-button--dense { 4 | // background-color: $color-dark; 5 | min-width: 20px; 6 | margin: 0; 7 | padding: 0; 8 | color: var(--mdc-theme-on-surface); 9 | } 10 | .input-field{ 11 | width: 100%; 12 | margin: 0.25em; 13 | } 14 | 15 | input, select { 16 | // background-color: $color-primary; 17 | text-align: center; 18 | } 19 | 20 | [mdcCard] { 21 | min-width: 280px; 22 | max-width: 100%; 23 | width: 350px; 24 | color: var(--mdc-theme-on-surface); 25 | 26 | .custom-card-group-heading { 27 | font-size: 0.875em; 28 | padding: 8px 16px; 29 | text-align: center; 30 | } 31 | 32 | th { 33 | text-align: end; 34 | width: 100px; 35 | } 36 | td { 37 | text-align: start; 38 | } 39 | th, td{ 40 | padding: 0.375em 1em; 41 | } 42 | margin: 1em 0 0 0; 43 | } 44 | 45 | .btnCalc { 46 | margin: 1em 0 0 0; 47 | width: 50%; 48 | } -------------------------------------------------------------------------------- /src/app/lvlup/lvlup.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { LvlupComponent } from './lvlup.component'; 4 | 5 | describe('LvlupComponent', () => { 6 | let component: LvlupComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ LvlupComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(LvlupComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/main/main.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 |
7 |

明日方舟工具箱

8 |

欢迎使用,请在导航栏选择相应功能使用。

9 |

国内用户请点这里

10 |

国际用户请点这里

11 | 12 |
13 |
14 |   15 |
16 |

最近更新

17 |
18 |
19 |

2020.04.08 关卡数据

20 |

2020.04.01 新干员:断罪者

21 |

2020.03.25 关卡数据

22 |

2020.03.17 新干员:宴,柏喙,慑砂,风笛

23 |

2020.02.27 适配新版Planner API 支持关卡排除

24 |

2020.02.25 新干员:刻俄柏,惊蛰

25 |

2020.02.10 自动识别更新,如遇到Bug请前往项目界面发起issue。

26 |

2020.01.14 加入暗色模式,请点右上角月亮图标切换。

27 |

2020.01.14 新干员:年,吽,阿

28 |

Tip: 移动端和平板用户可以将任意页面添加到桌面,获得与本地App相同的使用体验:快速加载,离线使用,自动更新。

29 |

详情请点击右上角help查看。

30 |

贡献者

31 | 63 | 64 |

建议/需求/加入我们

65 |
66 | 72 | 78 |
79 |

友情链接

80 |

bigfun - 明日方舟

81 |

NGA 明日方舟-罗德岛驻艾泽拉斯大使馆

82 |

欢迎向企鹅物流数据统计 贡献材料掉落信息

83 |
84 | -------------------------------------------------------------------------------- /src/app/main/main.component.scss: -------------------------------------------------------------------------------- 1 | @import "../styles/custom.scss"; 2 | 3 | .main-container { 4 | max-width: 1200px; 5 | margin: auto; 6 | padding: 1em; 7 | background: none; 8 | color: var(--mdc-theme-text-primary-on-background); 9 | } 10 | 11 | a { 12 | color: var(--mdc-theme-on-surface); 13 | } 14 | 15 | .img-logos { 16 | max-width: 100px; 17 | max-height: 100px; 18 | width: auto; 19 | height: auto; 20 | } 21 | 22 | 23 | h1, 24 | h2, 25 | h3, 26 | h4, 27 | h5 { 28 | font-weight: 600; 29 | } 30 | 31 | .contributor a { 32 | padding: 0.5em; 33 | text-align: center; 34 | } 35 | 36 | .contributor img { 37 | border-radius: 50%; 38 | max-height: 64px; 39 | max-width: 64px; 40 | height: auto; 41 | width: auto; 42 | } 43 | .joinus img { 44 | max-height: 64px; 45 | max-width: 64px; 46 | height: auto; 47 | width: auto; 48 | } 49 | .notice{ 50 | font-weight: bold; 51 | } 52 | .img-title{ 53 | width: 128px; 54 | height: 128px; 55 | margin-right: 1em; 56 | } -------------------------------------------------------------------------------- /src/app/main/main.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { MainComponent } from './main.component'; 4 | 5 | describe('MainComponent', () => { 6 | let component: MainComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ MainComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(MainComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/main/main.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-main', 5 | templateUrl: './main.component.html', 6 | styleUrls: ['./main.component.scss'] 7 | }) 8 | export class MainComponent implements OnInit { 9 | 10 | cn: boolean; 11 | 12 | constructor() { 13 | this.cn = window.location.hostname.includes('cn'); 14 | } 15 | 16 | ngOnInit() { 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/app/material-card/material-card.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 |
7 |
{{item.name}}
8 |
{{s.key}} {{s.value}}
9 |
10 |
11 |
12 | 14 |
15 |
16 | 18 |
19 |
20 |
21 | 22 |
23 |
24 | 25 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 37 | 38 |
39 |
40 | 41 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 53 | 54 |
55 |
56 |
-------------------------------------------------------------------------------- /src/app/material-card/material-card.component.scss: -------------------------------------------------------------------------------- 1 | @import "../styles/custom.scss"; 2 | 3 | $img-size: 48px; 4 | 5 | .img-icon-box { 6 | height: $img-size; 7 | width: 100%; 8 | text-align: center; 9 | align-items: center; 10 | display: flex; 11 | margin: 0.25em; 12 | } 13 | .img-icon { 14 | max-width: 100%; 15 | max-height: 100%; 16 | width: auto; 17 | height: auto; 18 | float: left; 19 | } 20 | 21 | .input-field { 22 | width: 100%; 23 | margin: 0.25em 0; 24 | } 25 | 26 | input, 27 | select { 28 | // color: $color-primary; 29 | text-align: center; 30 | } 31 | 32 | .mdc-button--dense { 33 | color: var(--mdc-theme-on-surface); 34 | min-width: 20px; 35 | width: 20px; 36 | margin: 0; 37 | padding: 0; 38 | } 39 | .mdc-text-field--upgraded:not(.mdc-text-field--fullwidth):not(.mdc-text-field--box) { 40 | margin: 0; 41 | } 42 | 43 | [mdcCard] { 44 | width: 100%; 45 | height: 130px; 46 | min-width: 140px; 47 | max-height: 170px; 48 | padding: 0.25em; 49 | margin: 0.25em 0.125em; 50 | border: 0.125em solid rgba(0, 0, 0, 0.125); 51 | border-radius: 2em 0.5em 2em 0.5em; 52 | 53 | .card-title { 54 | color: var(--mdc-theme-on-surface); 55 | text-align: start; 56 | font-size: 0.875em; 57 | font-weight: 700; 58 | } 59 | 60 | .material-source { 61 | color: var(--mdc-theme-secondary); 62 | font-size: 0.75em; 63 | text-align: end; 64 | } 65 | 66 | .material-detail { 67 | color: var(--mdc-theme-secondary); 68 | padding: 0; 69 | } 70 | } 71 | 72 | .mdc-card.m-lvl-5 { 73 | border-color: #d0694e; 74 | } 75 | .mdc-card.m-lvl-4 { 76 | border-color: #f9ce8c; 77 | } 78 | .mdc-card.m-lvl-3 { 79 | border-color: #589bad; 80 | } 81 | .mdc-card.m-lvl-2 { 82 | border-color: #7ebc59; 83 | } 84 | .mdc-card.m-lvl-1 { 85 | border-color: #c3e3e5; 86 | } 87 | .mdc-card.op-card { 88 | opacity: 0.8; 89 | } 90 | 91 | .need-button { 92 | font-size: 1.25em; 93 | margin: 0; 94 | text-align: end; 95 | align-items: flex-end; 96 | color: $color-muted; 97 | font-weight: bold; 98 | min-width: 0px; 99 | } 100 | 101 | .need-button.notice { 102 | color: $color-danger; 103 | } 104 | 105 | .need-button::before { 106 | position: inherit; 107 | } 108 | 109 | .btnMerge{ 110 | width:32px; 111 | height:32px; 112 | } 113 | .btnMerge.mdc-button--raised { 114 | background-color: var(--mdc-theme-primary); 115 | color: var(--mdc-theme-on-primary); 116 | } 117 | -------------------------------------------------------------------------------- /src/app/material-card/material-card.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { MaterialCardComponent } from './material-card.component'; 4 | 5 | describe('MaterialCardComponent', () => { 6 | let component: MaterialCardComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ MaterialCardComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(MaterialCardComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/material-card/material-card.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core'; 2 | import { MaterialItemData } from '../model/materialitemdata'; 3 | import { MaterialInfo } from '../model/materialinfo'; 4 | 5 | @Component({ 6 | selector: 'app-material-card', 7 | templateUrl: './material-card.component.html', 8 | styleUrls: ['./material-card.component.scss'], 9 | changeDetection: ChangeDetectionStrategy.OnPush 10 | }) 11 | export class MaterialCardComponent implements OnInit { 12 | @Input() item: MaterialInfo; 13 | @Input() itemdata: MaterialItemData; 14 | 15 | @Output() dataChange = new EventEmitter(); 16 | @Output() reportMerge = new EventEmitter(); 17 | 18 | onInputChange(): void { 19 | this.dataChange.emit(this.itemdata); 20 | } 21 | 22 | doMerge(): void { 23 | this.reportMerge.emit(this.item.name); 24 | } 25 | 26 | constructor() { 27 | } 28 | 29 | ngOnInit() { 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/app/material/material.component.scss: -------------------------------------------------------------------------------- 1 | @import "../styles/custom.scss"; 2 | [mdcDialog] { 3 | color: var(--mdc-theme-text-primary-on-background); 4 | 5 | .mdc-dialog__body, 6 | a { 7 | color: var(--mdc-theme-text-secondary-on-background); 8 | } 9 | 10 | [mdcButton] { 11 | &:hover { 12 | color: var(--mdc-theme-on-primary); 13 | background-color: var(--mdc-theme-primary); 14 | } 15 | } 16 | [mdcDialogCancel], 17 | [mdcDialogAccept] { 18 | color: var(--mdc-theme-on-surface); 19 | } 20 | } 21 | .options-box { 22 | padding: 0.5em 1em; 23 | } 24 | .padding-025 { 25 | padding: 0.25em; 26 | } 27 | 28 | h4 { 29 | margin: 0.25em 0; 30 | } 31 | section { 32 | max-height: 60vh; 33 | height: 60vh; 34 | 35 | } 36 | .mdc-list-item { 37 | height: fit-content; 38 | padding: 0.25em 0; 39 | } 40 | #btnReset, 41 | #btnResetNeed { 42 | background-color: $color-1; 43 | } 44 | .sepatator { 45 | height: 0.5em; 46 | width: 10em; 47 | } 48 | 49 | [mdcTextField] { 50 | textarea { 51 | color: $color-muted; 52 | background-color: rgba($color-dark, 0.1); 53 | resize: none; 54 | // border-color: $color-primary; 55 | } 56 | } 57 | [mdcListDivider] { 58 | list-style: none; 59 | } 60 | .mdc-text-field__input { 61 | padding: 0.25em 0.75em; 62 | font-size: small; 63 | } 64 | 65 | .dialog-data { 66 | max-width: 600px; 67 | max-height: 600px; 68 | } 69 | .hint { 70 | line-height: 0.5em; 71 | } -------------------------------------------------------------------------------- /src/app/material/material.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { MaterialComponent } from './material.component'; 4 | 5 | describe('MaterialComponent', () => { 6 | let component: MaterialComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ MaterialComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(MaterialComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/model/hrcomb.ts: -------------------------------------------------------------------------------- 1 | export class HrComb { 2 | tags: Array = []; 3 | possible: Array = []; 4 | score: number; 5 | id: string; 6 | } -------------------------------------------------------------------------------- /src/app/model/hrdata.ts: -------------------------------------------------------------------------------- 1 | import { HrComb } from './hrcomb'; 2 | import { HrTagRow } from '../model/hrtagrow'; 3 | export class HrData { 4 | selectedTags: []; 5 | combs: Array = []; 6 | tagrows: Array = []; 7 | combsBk: Array = []; 8 | } 9 | -------------------------------------------------------------------------------- /src/app/model/hrtagrow.ts: -------------------------------------------------------------------------------- 1 | export class HrTagRow { 2 | title: string; 3 | tags: Array; 4 | } -------------------------------------------------------------------------------- /src/app/model/materialinfo.ts: -------------------------------------------------------------------------------- 1 | export class MaterialInfo { 2 | id: string; 3 | name: string; 4 | rarity: number; 5 | source: { 6 | [key:string]:string 7 | }; 8 | madeof: { 9 | [key:string]:number 10 | }; 11 | icon: string; 12 | } -------------------------------------------------------------------------------- /src/app/model/materialitem.ts: -------------------------------------------------------------------------------- 1 | import { MaterialItemData } from './materialitemdata'; 2 | export class MaterialItem { 3 | id: string; 4 | name: string; 5 | rarity: number; 6 | source: any; 7 | madeof: any; 8 | icon: string; 9 | data: MaterialItemData; 10 | } 11 | -------------------------------------------------------------------------------- /src/app/model/materialitemdata.ts: -------------------------------------------------------------------------------- 1 | export class MaterialItemData { 2 | have = 0; 3 | need = 0; 4 | lack = 0; 5 | canMerge = false; 6 | 7 | name: string; 8 | constructor(name: string) { 9 | this.name = name; 10 | } 11 | shouldHide() { 12 | return !(this.have || this.need || this.lack); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/app/settings/settings.component.html: -------------------------------------------------------------------------------- 1 | 17 |
18 |
19 |

设置

20 |
    21 |
  • 22 |
    23 |
    24 | 25 |
    26 | 27 |
    28 |
  • 29 |
  • 30 |
  • 31 |
    32 |
    33 | 34 |
    35 | 36 |
    37 |
  • 38 |
  • 39 |
  • 40 |
    41 |
    42 | 43 | 44 |
    45 | 46 |
    47 |
  • 48 |
  • 49 |
  • 50 | delete清空本地数据 51 |
  • 52 |
53 |
54 |
-------------------------------------------------------------------------------- /src/app/settings/settings.component.scss: -------------------------------------------------------------------------------- 1 | .settings-container { 2 | max-width: 600px; 3 | margin: auto; 4 | } 5 | .mdc-dialog__surface { 6 | background-color: var(--mdc-theme-surface); 7 | } 8 | .mdc-dialog { 9 | color: var(--mdc-theme-text-primary-on-background); 10 | } 11 | .mdc-dialog__body { 12 | color: var(--mdc-theme-text-secondary-on-background); 13 | } 14 | 15 | [mdcButton] { 16 | color: var(--mdc-theme-on-surface); 17 | } -------------------------------------------------------------------------------- /src/app/settings/settings.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { SettingsComponent } from './settings.component'; 4 | 5 | describe('SettingsComponent', () => { 6 | let component: SettingsComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ SettingsComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(SettingsComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/settings/settings.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | import { MdcSnackbarService } from '@blox/material'; 4 | import { FetchService } from '../fetch.service'; 5 | 6 | @Component({ 7 | selector: 'app-settings', 8 | templateUrl: './settings.component.html', 9 | styleUrls: ['./settings.component.scss'] 10 | }) 11 | export class SettingsComponent implements OnInit { 12 | dialog = { 13 | title: '提示', 14 | message: '', 15 | decline: '不了', 16 | accept: '好的', 17 | acceptCallback: () => { }, 18 | declineCallback: () => { } 19 | }; 20 | isExtraSmall = false; 21 | isMaxFontSize = true; 22 | detectColor = '#00ff00'; 23 | constructor(private fetch: FetchService, private router: Router, private snackbar: MdcSnackbarService) { 24 | } 25 | 26 | ngOnInit() { 27 | this.isExtraSmall = this.fetch.getLocalStorage("s-exsm", false); 28 | this.isMaxFontSize = this.fetch.getLocalStorage("detect-mfs", true); 29 | this.detectColor = this.fetch.getLocalStorage("detect-tclr", '#00ff00'); 30 | } 31 | 32 | saveSettings() { 33 | this.fetch.setLocalStorage("s-exsm", this.isExtraSmall); 34 | this.fetch.setLocalStorage("detect-mfs", this.isMaxFontSize); 35 | this.fetch.setLocalStorage("detect-tclr", this.detectColor); 36 | console.log(localStorage); 37 | } 38 | 39 | 40 | showSnackBar(msg: string, action: string) { 41 | this.snackbar.show({ 42 | message: msg, 43 | actionText: action, 44 | multiline: false, 45 | actionOnBottom: false 46 | }); 47 | } 48 | 49 | beforeClear() { 50 | this.dialog = { 51 | title: '提示', 52 | message: '是否清除本地输入数据?这在有些数据错误时很有用。(缓存数据不受影响)', 53 | accept: '好的', 54 | decline: '不了', 55 | declineCallback: () => { }, 56 | acceptCallback: () => { 57 | localStorage.clear(); 58 | const currentUrl = this.router.url; 59 | this.router.navigateByUrl('/', { skipLocationChange: true }).then(() => { 60 | this.router.navigateByUrl(currentUrl); 61 | }); 62 | this.showSnackBar('输入数据已清空', '好的'); 63 | } 64 | }; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/app/stage-chooser/stage-chooser.component.html: -------------------------------------------------------------------------------- 1 |
  • 2 |
    3 | 4 | 5 |
    6 | 11 | 12 |
    13 | 14 |
    15 | 16 | 17 |
    18 | 21 |
    22 |
    27 |
    28 |

    第{{ i }}章

    29 | 30 | 31 |
    32 |
    33 |
    34 | 42 |
    43 | 44 |
    45 |
    46 | -------------------------------------------------------------------------------- /src/app/stage-chooser/stage-chooser.component.scss: -------------------------------------------------------------------------------- 1 | [mdcFormFieldLabel] { 2 | width: 45px; 3 | } 4 | [mdcListDivider] { 5 | list-style: none; 6 | } 7 | [mdcSelect] { 8 | width: 120px; 9 | } 10 | -------------------------------------------------------------------------------- /src/app/stage-chooser/stage-chooser.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { StageChooserComponent } from './stage-chooser.component'; 4 | 5 | describe('StageChooserComponent', () => { 6 | let component: StageChooserComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ StageChooserComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(StageChooserComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/app/styles/custom.scss: -------------------------------------------------------------------------------- 1 | // https://colorhunt.co/palette/361 2 | $color-1: #d0694e; 3 | $color-2: #f6ce8c; 4 | $color-3: #c3e3e5; 5 | $color-4: #589bad; 6 | 7 | $color-muted: rgb(153, 153, 153);; // 方舟-文本灰 8 | $color-primary: rgb(34, 187, 255); // 方舟-蓝 9 | $color-success: rgb(127, 224, 149); // bootstrap4 10 | $color-info: rgb(137, 137, 137); // 方舟-灰 11 | $color-warning: #fe2; // 方舟-黄 12 | $color-danger: #ec2b00; // 洪炉示岁 13 | $color-secondary: rgb(137, 137, 137); // 方舟-灰 14 | $color-dark: #313131; // 方舟-按钮 15 | $color-black: #000; // 纯黑 16 | $color-light: rgb(250, 249, 248); //bootstrap4 17 | $color-white: #fff; // bootstrap4 18 | 19 | $mdc-typography-font-family: -apple-system, "Noto Sans", "Helvetica Neue", Helvetica, "Nimbus Sans L", Arial, 20 | "Liberation Sans", "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans SC", "Source Han Sans CN", 21 | SimHei, "Microsoft YaHei", "Wenquanyi Micro Hei", "WenQuanYi Zen Hei", "ST Heiti", "WenQuanYi Zen Hei Sharp", 22 | sans-serif; 23 | 24 | $highlight-background: #e8eaf7; 25 | button { 26 | margin: 0.25em; 27 | white-space: nowrap; 28 | } 29 | a { 30 | text-decoration: none; 31 | } 32 | option { 33 | color: var(--mdc-theme-text-primary-on-background); 34 | background-color: var(--mdc-theme-background); 35 | } -------------------------------------------------------------------------------- /src/app/styles/themes/dark.scss: -------------------------------------------------------------------------------- 1 | $mdc-theme-primary : rgba(0, 0, 0, 0.9); 2 | $mdc-theme-on-primary: rgba(202, 202, 202, 0.9); 3 | 4 | $mdc-theme-secondary : rgb(34, 187, 255); 5 | $mdc-theme-on-secondary: rgb(51, 51, 51, 0.9); 6 | $mdc-theme-background : #3F3F3F; 7 | 8 | $mdc-theme-surface : rgba(51, 51, 51, 0.9); 9 | $mdc-theme-on-surface: rgba(240, 240, 240); 10 | 11 | @import "material-components-web/material-components-web"; 12 | 13 | :root { 14 | --hr-gap-background: rgba(49,49,49,.5); 15 | --hr-comb-background: rgba(49,49,49,.6); 16 | --hr-selected-background: #2bf; 17 | --hr-unselected-background: #313131; 18 | --hr-selected-text: #fff; 19 | --hr-unselected-text: #fff; 20 | --hr-tag-border: #313131; 21 | } 22 | 23 | body { 24 | 25 | background-attachment: fixed; 26 | background-color: #3F3F3F; 27 | // background-image: url(https://ak.hypergryph.com/assets/index/images/ak/pc/bk.jpg); 28 | background-position: center; 29 | background-repeat: no-repeat; 30 | background-size: cover; 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/app/styles/themes/light.scss: -------------------------------------------------------------------------------- 1 | $mdc-theme-primary : #5c638b; 2 | $mdc-theme-on-primary: #fff; 3 | 4 | $mdc-theme-secondary : #87a0c6; 5 | $mdc-theme-on-secondary: #000; 6 | $mdc-theme-background : #fff; 7 | 8 | $mdc-theme-surface : #fff; 9 | $mdc-theme-on-surface: #5c638b; 10 | 11 | :root { 12 | --hr-gap-background: #e8eaf7; 13 | --hr-comb-background: #ffffff; 14 | --hr-selected-background: #5c638b; 15 | --hr-unselected-background: #fff; 16 | --hr-selected-text: #fff; 17 | --hr-unselected-text: #5c638b; 18 | --hr-tag-border: #5c638b; 19 | } 20 | 21 | @import "material-components-web/material-components-web"; 22 | 23 | #aside-logo, 24 | img[src$="github.png"] { 25 | filter: invert(100%); 26 | } 27 | 28 | body { 29 | background-attachment: fixed; 30 | background-color: white; 31 | // background-image: url(https://ak.hypergryph.com/assets/index/images/ak/pc/story/bk.jpg); 32 | background-position: center; 33 | background-repeat: no-repeat; 34 | background-size: cover; 35 | } -------------------------------------------------------------------------------- /src/app/switch-theme.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { SwitchThemeService } from './switch-theme.service'; 4 | 5 | describe('SwitchThemeService', () => { 6 | beforeEach(() => TestBed.configureTestingModule({})); 7 | 8 | it('should be created', () => { 9 | const service: SwitchThemeService = TestBed.get(SwitchThemeService); 10 | expect(service).toBeTruthy(); 11 | }); 12 | }); 13 | -------------------------------------------------------------------------------- /src/app/switch-theme.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, RendererFactory2, Renderer2, Inject } from '@angular/core'; 2 | import { Observable, BehaviorSubject, combineLatest } from 'rxjs'; 3 | import { DOCUMENT } from '@angular/common'; 4 | 5 | @Injectable({ 6 | providedIn: 'root' 7 | }) 8 | 9 | // Copied and modified from https://medium.com/better-programming/angular-multiple-themes-without-killing-bundle-size-with-material-or-not-5a80849b6b34 10 | 11 | export class SwitchThemeService { 12 | private _theme: BehaviorSubject = new BehaviorSubject("light"); 13 | 14 | private _renderer: Renderer2; 15 | private head: HTMLElement; 16 | private themeLinks: HTMLElement[] = []; 17 | 18 | theme$: Observable; 19 | 20 | constructor( 21 | rendererFactory: RendererFactory2, 22 | @Inject(DOCUMENT) document: Document 23 | ) { 24 | this.head = document.head; 25 | this._renderer = rendererFactory.createRenderer(null, null); 26 | this.theme$ = this._theme; 27 | this.theme$.subscribe(async (target) => { 28 | const cssFilename = target + ".css"; 29 | await this.loadCss(cssFilename); 30 | if (this.themeLinks.length == 2) 31 | this._renderer.removeChild(this.head, this.themeLinks.shift()); 32 | }) 33 | } 34 | 35 | setTheme(name: string) { 36 | this._theme.next(name); 37 | } 38 | 39 | private async loadCss(filename: string) { 40 | return new Promise(resolve => { 41 | const linkEl: HTMLElement = this._renderer.createElement('link'); 42 | this._renderer.setAttribute(linkEl, 'rel', 'stylesheet'); 43 | this._renderer.setAttribute(linkEl, 'type', 'text/css'); 44 | this._renderer.setAttribute(linkEl, 'href', filename); 45 | this._renderer.setProperty(linkEl, 'onload', resolve); 46 | this._renderer.appendChild(this.head, linkEl); 47 | this.themeLinks = [...this.themeLinks, linkEl]; 48 | }) 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/.gitkeep -------------------------------------------------------------------------------- /src/assets/data/StageList.json: -------------------------------------------------------------------------------- 1 | {"allStage": ["0-1", "0-2", "0-3", "0-4", "0-5", "0-6", "0-7", "0-8", "0-9", "0-10", "0-11", "1-1", "1-2", "1-3", "1-4", "1-5", "1-6", "1-7", "1-8", "1-9", "1-10", "1-11", "1-12", "2-1", "S2-1", "2-2", "S2-2", "S2-3", "S2-4", "2-3", "2-4", "S2-5", "S2-6", "S2-7", "2-5", "2-6", "2-7", "S2-8", "S2-9", "2-8", "2-9", "S2-10", "S2-11", "S2-12", "2-10", "3-1", "3-2", "3-3", "3-4", "3-5", "3-6", "3-7", "3-8", "4-1", "4-2", "4-3", "4-4", "4-5", "4-6", "4-7", "4-8", "4-9", "4-10", "5-1", "5-2", "5-3", "5-4", "5-5", "5-6", "5-7", "5-8", "5-9", "5-10", "5-11", "6-1", "6-2", "6-3", "6-4", "6-5", "6-6", "6-7", "6-8", "6-9", "6-10", "6-11", "6-12", "6-13", "6-14", "6-15", "6-16", "6-17", "6-18", "S3-1", "S3-2", "S3-3", "S3-4", "S3-5", "S3-6", "S4-1", "S4-2", "S4-3", "S4-4", "S4-5", "S4-6", "S4-7", "S4-8", "S4-9", "S4-10", "S5-1", "S5-2", "S5-3", "S5-4", "S5-5", "S5-6", "S5-7", "S5-8", "S6-1", "S6-2", "S6-3", "S6-4", "SA-1", "SA-2", "SA-3", "SA-4", "SA-5", "SA-6", "AF-1", "AF-2", "AF-3", "AF-4", "AF-5", "AF-6", "AF-7", "AF-8", "CB-1", "CB-2", "CB-3", "CB-4", "CB-5", "CB-ST1", "CB-6", "CB-7", "CB-8", "CB-ST2", "CB-9", "CB-10", "CB-ST3", "CB-EX1", "CB-EX2", "CB-EX3", "CB-EX4", "CB-EX5", "CB-EX6", "CB-EX7", "CB-EX8", "SW-EV-1", "SW-EV-2", "SW-EV-3", "SW-EV-4", "SW-EV-5", "OF-ST1", "OF-1", "OF-ST2", "OF-2", "OF-3", "OF-4", "OF-ST3", "OF-5", "OF-6", "OF-ST4", "OF-7", "OF-8", "OF-ST5", "OF-F1", "OF-F2", "OF-F3", "OF-F4", "OF-EX1", "OF-EX2", "OF-EX3", "OF-EX4", "OF-EX5", "OF-EX6", "GT-1", "GT-2", "GT-3", "GT-4", "GT-5", "GT-6", "GT-EX-1", "GT-EX-2", "GT-EX-3", "GT-HX-1", "GT-HX-2", "GT-HX-3"], "preset": {"en_US": ["0-1", "0-2", "0-3", "0-4", "0-5", "0-6", "0-7", "0-8", "0-9", "0-10", "0-11", "1-1", "1-2", "1-3", "1-4", "1-5", "1-6", "1-7", "1-8", "1-9", "1-10", "1-11", "1-12", "2-1", "S2-1", "2-2", "S2-2", "S2-3", "S2-4", "2-3", "2-4", "S2-5", "S2-6", "S2-7", "2-5", "2-6", "2-7", "S2-8", "S2-9", "2-8", "2-9", "S2-10", "S2-11", "S2-12", "2-10", "3-1", "3-2", "3-3", "3-4", "3-5", "3-6", "3-7", "3-8", "4-1", "4-2", "4-3", "4-4", "4-5", "4-6", "4-7", "4-8", "4-9", "4-10", "5-1", "5-2", "5-3", "5-4", "5-5", "5-6", "5-7", "5-8", "5-9", "5-10", "5-11", "S3-1", "S3-2", "S3-3", "S3-4", "S3-5", "S4-1", "S4-2", "S4-3", "S4-4", "S4-5", "S4-6", "S4-7", "S4-8", "S4-9", "S5-1", "S5-2", "S5-3", "S5-4", "S5-5", "S5-6", "SW-EV-1", "SW-EV-2", "SW-EV-3", "SW-EV-4", "SW-EV-5"], "ja_JP": ["0-1", "0-2", "0-3", "0-4", "0-5", "0-6", "0-7", "0-8", "0-9", "0-10", "0-11", "1-1", "1-2", "1-3", "1-4", "1-5", "1-6", "1-7", "1-8", "1-9", "1-10", "1-11", "1-12", "2-1", "S2-1", "2-2", "S2-2", "S2-3", "S2-4", "2-3", "2-4", "S2-5", "S2-6", "S2-7", "2-5", "2-6", "2-7", "S2-8", "S2-9", "2-8", "2-9", "S2-10", "S2-11", "S2-12", "2-10", "3-1", "3-2", "3-3", "3-4", "3-5", "3-6", "3-7", "3-8", "4-1", "4-2", "4-3", "4-4", "4-5", "4-6", "4-7", "4-8", "4-9", "4-10", "5-1", "5-2", "5-3", "5-4", "5-5", "5-6", "5-7", "5-8", "5-9", "5-10", "5-11", "S3-1", "S3-2", "S3-3", "S3-4", "S3-5", "S4-1", "S4-2", "S4-3", "S4-4", "S4-5", "S4-6", "S4-7", "S4-8", "S4-9", "S5-1", "S5-2", "S5-3", "S5-4", "S5-5", "S5-6"], "ko_KR": ["0-1", "0-2", "0-3", "0-4", "0-5", "0-6", "0-7", "0-8", "0-9", "0-10", "0-11", "1-1", "1-2", "1-3", "1-4", "1-5", "1-6", "1-7", "1-8", "1-9", "1-10", "1-11", "1-12", "2-1", "S2-1", "2-2", "S2-2", "S2-3", "S2-4", "2-3", "2-4", "S2-5", "S2-6", "S2-7", "2-5", "2-6", "2-7", "S2-8", "S2-9", "2-8", "2-9", "S2-10", "S2-11", "S2-12", "2-10", "3-1", "3-2", "3-3", "3-4", "3-5", "3-6", "3-7", "3-8", "4-1", "4-2", "4-3", "4-4", "4-5", "4-6", "4-7", "4-8", "4-9", "4-10", "5-1", "5-2", "5-3", "5-4", "5-5", "5-6", "5-7", "5-8", "5-9", "5-10", "5-11", "S3-1", "S3-2", "S3-3", "S3-4", "S3-5", "S4-1", "S4-2", "S4-3", "S4-4", "S4-5", "S4-6", "S4-7", "S4-8", "S4-9", "S5-1", "S5-2", "S5-3", "S5-4", "S5-5", "S5-6"], "zh_CN": ["0-1", "0-2", "0-3", "0-4", "0-5", "0-6", "0-7", "0-8", "0-9", "0-10", "0-11", "1-1", "1-2", "1-3", "1-4", "1-5", "1-6", "1-7", "1-8", "1-9", "1-10", "1-11", "1-12", "2-1", "S2-1", "2-2", "S2-2", "S2-3", "S2-4", "2-3", "2-4", "S2-5", "S2-6", "S2-7", "2-5", "2-6", "2-7", "S2-8", "S2-9", "2-8", "2-9", "S2-10", "S2-11", "S2-12", "2-10", "3-1", "3-2", "3-3", "3-4", "3-5", "3-6", "3-7", "3-8", "4-1", "4-2", "4-3", "4-4", "4-5", "4-6", "4-7", "4-8", "4-9", "4-10", "5-1", "5-2", "5-3", "5-4", "5-5", "5-6", "5-7", "5-8", "5-9", "5-10", "5-11", "6-1", "6-2", "6-3", "6-4", "6-5", "6-6", "6-7", "6-8", "6-9", "6-10", "6-11", "6-12", "6-13", "6-14", "6-15", "6-16", "6-17", "6-18", "S3-1", "S3-2", "S3-3", "S3-4", "S3-5", "S3-6", "S4-1", "S4-2", "S4-3", "S4-4", "S4-5", "S4-6", "S4-7", "S4-8", "S4-9", "S4-10", "S5-1", "S5-2", "S5-3", "S5-4", "S5-5", "S5-6", "S5-7", "S5-8", "S6-1", "S6-2", "S6-3", "S6-4"]}, "ActivityName": {"SA": "午间逸话", "AF": "洪炉示岁", "CB": "喧闹法则", "SW": "战地秘闻"}} -------------------------------------------------------------------------------- /src/assets/data/aklevel.json: -------------------------------------------------------------------------------- 1 | {"maxLevel":[[30],[30],[40,55],[45,60,70],[50,70,80],[50,80,90]],"characterExpMap":[[100,117,134,151,168,185,202,219,236,253,270,287,304,321,338,355,372,389,406,423,440,457,474,491,508,525,542,559,574,589,605,621,637,653,669,685,701,716,724,739,749,759,770,783,804,820,836,852,888,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[120,172,224,276,328,380,432,484,536,588,640,692,744,796,848,900,952,1004,1056,1108,1160,1212,1264,1316,1368,1420,1472,1524,1576,1628,1706,1784,1862,1940,2018,2096,2174,2252,2330,2408,2584,2760,2936,3112,3288,3464,3640,3816,3992,4168,4344,4520,4696,4890,5326,6019,6312,6505,6838,7391,7657,7823,8089,8355,8621,8887,9153,9419,9605,9951,10448,10945,11442,11939,12436,12933,13430,13927,14549,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[191,303,415,527,639,751,863,975,1087,1199,1311,1423,1535,1647,1759,1871,1983,2095,2207,2319,2431,2543,2655,2767,2879,2991,3103,3215,3327,3439,3602,3765,3928,4091,4254,4417,4580,4743,4906,5069,5232,5395,5558,5721,5884,6047,6210,6373,6536,6699,6902,7105,7308,7511,7714,7917,8120,8323,8526,8729,9163,9597,10031,10465,10899,11333,11767,12201,12729,13069,13747,14425,15103,15781,16459,17137,17815,18493,19171,19849,21105,22361,23617,24873,26129,27385,28641,29897,31143,-1]],"characterUpgradeCostMap":[[30,36,43,50,57,65,73,81,90,99,108,118,128,138,149,160,182,206,231,258,286,315,346,378,411,446,482,520,557,595,635,677,720,764,809,856,904,952,992,1042,1086,1131,1178,1229,1294,1353,1413,1474,1572,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[48,71,95,120,146,173,201,231,262,293,326,361,396,432,470,508,548,589,631,675,719,765,811,859,908,958,1010,1062,1116,1171,1245,1322,1400,1480,1562,1645,1731,1817,1906,1996,2171,2349,2531,2717,2907,3100,3298,3499,3705,3914,4127,4344,4565,4807,5294,6049,6413,6681,7098,7753,8116,8378,8752,9132,9518,9909,10306,10709,11027,11533,12224,12926,13639,14363,15097,15843,16599,17367,18303,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[76,124,173,225,279,334,392,451,513,577,642,710,780,851,925,1001,1079,1159,1240,1324,1410,1498,1588,1680,1773,1869,1967,2067,2169,2273,2413,2556,2702,2851,3003,3158,3316,3477,3640,3807,3976,4149,4324,4502,4684,4868,5055,5245,5438,5634,5867,6103,6343,6587,6835,7086,7340,7599,7861,8127,8613,9108,9610,10120,10637,11163,11696,12238,12882,13343,14159,14988,15828,16681,17545,18422,19311,20213,21126,22092,23722,25380,27065,28778,30519,32287,34083,35906,37745]],"evolveGoldCost":[[-1,-1],[-1,-1],[10000,-1],[15000,60000],[20000,120000],[30000,180000]]} -------------------------------------------------------------------------------- /src/assets/icons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/icons/android-chrome-192x192.png -------------------------------------------------------------------------------- /src/assets/icons/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/icons/android-chrome-512x512.png -------------------------------------------------------------------------------- /src/assets/icons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/icons/apple-touch-icon.png -------------------------------------------------------------------------------- /src/assets/icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/icons/favicon-16x16.png -------------------------------------------------------------------------------- /src/assets/icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/icons/favicon-32x32.png -------------------------------------------------------------------------------- /src/assets/icons/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/icons/mstile-150x150.png -------------------------------------------------------------------------------- /src/assets/img/chara/12F.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/12F.png -------------------------------------------------------------------------------- /src/assets/img/chara/Adnachiel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Adnachiel.png -------------------------------------------------------------------------------- /src/assets/img/chara/Ansel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Ansel.png -------------------------------------------------------------------------------- /src/assets/img/chara/Beagle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Beagle.png -------------------------------------------------------------------------------- /src/assets/img/chara/Blue Poison.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Blue Poison.png -------------------------------------------------------------------------------- /src/assets/img/chara/Castle-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Castle-3.png -------------------------------------------------------------------------------- /src/assets/img/chara/Cliffheart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Cliffheart.png -------------------------------------------------------------------------------- /src/assets/img/chara/Croissant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Croissant.png -------------------------------------------------------------------------------- /src/assets/img/chara/Cuora.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Cuora.png -------------------------------------------------------------------------------- /src/assets/img/chara/Dobermann.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Dobermann.png -------------------------------------------------------------------------------- /src/assets/img/chara/Durin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Durin.png -------------------------------------------------------------------------------- /src/assets/img/chara/Earthspirit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Earthspirit.png -------------------------------------------------------------------------------- /src/assets/img/chara/Estelle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Estelle.png -------------------------------------------------------------------------------- /src/assets/img/chara/Exusiai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Exusiai.png -------------------------------------------------------------------------------- /src/assets/img/chara/FEater.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/FEater.png -------------------------------------------------------------------------------- /src/assets/img/chara/Fang.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Fang.png -------------------------------------------------------------------------------- /src/assets/img/chara/Firewatch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Firewatch.png -------------------------------------------------------------------------------- /src/assets/img/chara/Frostleaf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Frostleaf.png -------------------------------------------------------------------------------- /src/assets/img/chara/Gitano.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Gitano.png -------------------------------------------------------------------------------- /src/assets/img/chara/Gravel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Gravel.png -------------------------------------------------------------------------------- /src/assets/img/chara/Haze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Haze.png -------------------------------------------------------------------------------- /src/assets/img/chara/Hibiscus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Hibiscus.png -------------------------------------------------------------------------------- /src/assets/img/chara/Hoshiguma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Hoshiguma.png -------------------------------------------------------------------------------- /src/assets/img/chara/Ifrit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Ifrit.png -------------------------------------------------------------------------------- /src/assets/img/chara/Indra.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Indra.png -------------------------------------------------------------------------------- /src/assets/img/chara/Jessica.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Jessica.png -------------------------------------------------------------------------------- /src/assets/img/chara/Kroos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Kroos.png -------------------------------------------------------------------------------- /src/assets/img/chara/Lancet-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Lancet-2.png -------------------------------------------------------------------------------- /src/assets/img/chara/Lava.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Lava.png -------------------------------------------------------------------------------- /src/assets/img/chara/Liskarm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Liskarm.png -------------------------------------------------------------------------------- /src/assets/img/chara/Manticore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Manticore.png -------------------------------------------------------------------------------- /src/assets/img/chara/Matoimaru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Matoimaru.png -------------------------------------------------------------------------------- /src/assets/img/chara/Matterhorn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Matterhorn.png -------------------------------------------------------------------------------- /src/assets/img/chara/Mayer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Mayer.png -------------------------------------------------------------------------------- /src/assets/img/chara/Melantha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Melantha.png -------------------------------------------------------------------------------- /src/assets/img/chara/Meteor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Meteor.png -------------------------------------------------------------------------------- /src/assets/img/chara/Meteorite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Meteorite.png -------------------------------------------------------------------------------- /src/assets/img/chara/Mousse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Mousse.png -------------------------------------------------------------------------------- /src/assets/img/chara/Myrrh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Myrrh.png -------------------------------------------------------------------------------- /src/assets/img/chara/Nearl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Nearl.png -------------------------------------------------------------------------------- /src/assets/img/chara/Nightingale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Nightingale.png -------------------------------------------------------------------------------- /src/assets/img/chara/Noir Corne.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Noir Corne.png -------------------------------------------------------------------------------- /src/assets/img/chara/Orchid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Orchid.png -------------------------------------------------------------------------------- /src/assets/img/chara/Perfumer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Perfumer.png -------------------------------------------------------------------------------- /src/assets/img/chara/Platinum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Platinum.png -------------------------------------------------------------------------------- /src/assets/img/chara/Plume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Plume.png -------------------------------------------------------------------------------- /src/assets/img/chara/Pramanix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Pramanix.png -------------------------------------------------------------------------------- /src/assets/img/chara/Projekt Red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Projekt Red.png -------------------------------------------------------------------------------- /src/assets/img/chara/Provence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Provence.png -------------------------------------------------------------------------------- /src/assets/img/chara/Ptilopsis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Ptilopsis.png -------------------------------------------------------------------------------- /src/assets/img/chara/Rangers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Rangers.png -------------------------------------------------------------------------------- /src/assets/img/chara/Rope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Rope.png -------------------------------------------------------------------------------- /src/assets/img/chara/Saria.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Saria.png -------------------------------------------------------------------------------- /src/assets/img/chara/Scavenger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Scavenger.png -------------------------------------------------------------------------------- /src/assets/img/chara/Shaw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Shaw.png -------------------------------------------------------------------------------- /src/assets/img/chara/Shining.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Shining.png -------------------------------------------------------------------------------- /src/assets/img/chara/ShiraYuki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/ShiraYuki.png -------------------------------------------------------------------------------- /src/assets/img/chara/Siege.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Siege.png -------------------------------------------------------------------------------- /src/assets/img/chara/Silence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Silence.png -------------------------------------------------------------------------------- /src/assets/img/chara/SilverAsh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/SilverAsh.png -------------------------------------------------------------------------------- /src/assets/img/chara/Specter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Specter.png -------------------------------------------------------------------------------- /src/assets/img/chara/Steward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Steward.png -------------------------------------------------------------------------------- /src/assets/img/chara/Texas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Texas.png -------------------------------------------------------------------------------- /src/assets/img/chara/Vanilla.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Vanilla.png -------------------------------------------------------------------------------- /src/assets/img/chara/Vigna.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Vigna.png -------------------------------------------------------------------------------- /src/assets/img/chara/Vulcan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Vulcan.png -------------------------------------------------------------------------------- /src/assets/img/chara/Warfarin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Warfarin.png -------------------------------------------------------------------------------- /src/assets/img/chara/Yato.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Yato.png -------------------------------------------------------------------------------- /src/assets/img/chara/ГУМ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/ГУМ.png -------------------------------------------------------------------------------- /src/assets/img/chara/Истина.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/Истина.png -------------------------------------------------------------------------------- /src/assets/img/chara/зима.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/chara/зима.png -------------------------------------------------------------------------------- /src/assets/img/help/add-to-homescreen-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/help/add-to-homescreen-01.jpg -------------------------------------------------------------------------------- /src/assets/img/help/add-to-homescreen-02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/help/add-to-homescreen-02.jpg -------------------------------------------------------------------------------- /src/assets/img/help/add-to-homescreen-03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/help/add-to-homescreen-03.jpg -------------------------------------------------------------------------------- /src/assets/img/help/add-to-homescreen-04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/help/add-to-homescreen-04.jpg -------------------------------------------------------------------------------- /src/assets/img/help/add-to-homescreena-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/help/add-to-homescreena-01.jpg -------------------------------------------------------------------------------- /src/assets/img/help/add-to-homescreena-02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/help/add-to-homescreena-02.jpg -------------------------------------------------------------------------------- /src/assets/img/help/add-to-homescreena-03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/help/add-to-homescreena-03.jpg -------------------------------------------------------------------------------- /src/assets/img/help/add-to-homescreena-04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/help/add-to-homescreena-04.jpg -------------------------------------------------------------------------------- /src/assets/img/help/iconstr1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/help/iconstr1.jpg -------------------------------------------------------------------------------- /src/assets/img/help/iconstr2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/help/iconstr2.jpg -------------------------------------------------------------------------------- /src/assets/img/main/Luke_lu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/main/Luke_lu.jpg -------------------------------------------------------------------------------- /src/assets/img/main/Yue_plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/main/Yue_plus.png -------------------------------------------------------------------------------- /src/assets/img/main/bbaa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/main/bbaa.png -------------------------------------------------------------------------------- /src/assets/img/main/crystal.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/main/crystal.jpg -------------------------------------------------------------------------------- /src/assets/img/main/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/main/github.png -------------------------------------------------------------------------------- /src/assets/img/main/graueneko.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/main/graueneko.png -------------------------------------------------------------------------------- /src/assets/img/main/telegram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/main/telegram.png -------------------------------------------------------------------------------- /src/assets/img/material/DIAMOND.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/DIAMOND.png -------------------------------------------------------------------------------- /src/assets/img/material/DIAMOND_SHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/DIAMOND_SHD.png -------------------------------------------------------------------------------- /src/assets/img/material/EXGG_SHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/EXGG_SHD.png -------------------------------------------------------------------------------- /src/assets/img/material/GOLD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/GOLD.png -------------------------------------------------------------------------------- /src/assets/img/material/HGG_SHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/HGG_SHD.png -------------------------------------------------------------------------------- /src/assets/img/material/LGG_SHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/LGG_SHD.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_CST1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_CST1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_CST2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_CST2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_CST3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_CST3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_DI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_DI.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_GRD1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_GRD1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_GRD2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_GRD2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_GRD3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_GRD3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_MED1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_MED1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_MED2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_MED2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_MED3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_MED3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_PIO1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_PIO1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_PIO2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_PIO2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_PIO3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_PIO3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_SNP1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_SNP1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_SNP2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_SNP2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_SNP3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_SNP3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_SPC1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_SPC1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_SPC2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_SPC2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_SPC3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_SPC3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_SUP1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_SUP1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_SUP2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_SUP2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_SUP3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_SUP3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_TNK1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_TNK1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_TNK2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_TNK2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_ASC_TNK3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_ASC_TNK3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_BASE_ESS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_BASE_ESS.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_BASE_SL1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_BASE_SL1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_BASE_SL2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_BASE_SL2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_BASE_SL3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_BASE_SL3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_BASE_SYNTH1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_BASE_SYNTH1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_BASE_SYNTH2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_BASE_SYNTH2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_BASE_SYNTH3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_BASE_SYNTH3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_DIAMOND_SHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_DIAMOND_SHD.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_GOLD1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_GOLD1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_GOLD2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_GOLD2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_GOLD3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_GOLD3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SKILL1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SKILL1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SKILL2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SKILL2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SKILL3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SKILL3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_ALCOHOL1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_ALCOHOL1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_ALCOHOL2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_ALCOHOL2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_BN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_BN.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_BOSS1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_BOSS1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_BOSS2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_BOSS2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_BOSS3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_BOSS3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_BOSS4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_BOSS4.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_DS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_DS.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_G1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_G1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_G2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_G2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_G3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_G3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_G4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_G4.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_IAM3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_IAM3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_IAM4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_IAM4.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_IRON1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_IRON1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_IRON2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_IRON2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_IRON3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_IRON3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_IRON4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_IRON4.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_KETONE1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_KETONE1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_KETONE2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_KETONE2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_KETONE3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_KETONE3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_KETONE4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_KETONE4.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_MANGANESE1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_MANGANESE1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_MANGANESE2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_MANGANESE2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_PG1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_PG1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_PG2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_PG2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_PGEL3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_PGEL3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_PGEL4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_PGEL4.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_PP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_PP.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_RMA7012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_RMA7012.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_RMA7024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_RMA7024.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_RUSH1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_RUSH1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_RUSH2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_RUSH2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_RUSH3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_RUSH3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_RUSH4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_RUSH4.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_STRG1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_STRG1.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_STRG2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_STRG2.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_STRG3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_STRG3.png -------------------------------------------------------------------------------- /src/assets/img/material/MTL_SL_STRG4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/MTL_SL_STRG4.png -------------------------------------------------------------------------------- /src/assets/img/material/README.md: -------------------------------------------------------------------------------- 1 | |图片|标签|名称| 2 | | ------------ | ------------ | ------------ | 3 | |![至纯源石](DIAMOND.png)|DIAMOND|至纯源石| 4 | |![合成玉](DIAMOND_SHD.png)|DIAMOND_SHD|合成玉| 5 | |![采购凭证](EXGG_SHD.png)|EXGG_SHD|采购凭证| 6 | |![龙门币](GOLD.png)|GOLD|龙门币| 7 | |![高级凭证](HGG_SHD.png)|HGG_SHD|高级凭证| 8 | |![资质凭证](LGG_SHD.png)|LGG_SHD|资质凭证| 9 | |![术士芯片](MTL_ASC_CST1.png)|MTL_ASC_CST1|术士芯片| 10 | |![术士芯片组](MTL_ASC_CST2.png)|MTL_ASC_CST2|术士芯片组| 11 | |![术士双芯片](MTL_ASC_CST3.png)|MTL_ASC_CST3|术士双芯片| 12 | |![芯片助剂](MTL_ASC_DI.png)|MTL_ASC_DI|芯片助剂| 13 | |![近卫芯片](MTL_ASC_GRD1.png)|MTL_ASC_GRD1|近卫芯片| 14 | |![近卫芯片组](MTL_ASC_GRD2.png)|MTL_ASC_GRD2|近卫芯片组| 15 | |![近卫双芯片](MTL_ASC_GRD3.png)|MTL_ASC_GRD3|近卫双芯片| 16 | |![医疗芯片](MTL_ASC_MED1.png)|MTL_ASC_MED1|医疗芯片| 17 | |![医疗芯片组](MTL_ASC_MED2.png)|MTL_ASC_MED2|医疗芯片组| 18 | |![医疗双芯片](MTL_ASC_MED3.png)|MTL_ASC_MED3|医疗双芯片| 19 | |![先锋芯片](MTL_ASC_PIO1.png)|MTL_ASC_PIO1|先锋芯片| 20 | |![先锋芯片组](MTL_ASC_PIO2.png)|MTL_ASC_PIO2|先锋芯片组| 21 | |![先锋双芯片](MTL_ASC_PIO3.png)|MTL_ASC_PIO3|先锋双芯片| 22 | |![狙击芯片](MTL_ASC_SNP1.png)|MTL_ASC_SNP1|狙击芯片| 23 | |![狙击芯片组](MTL_ASC_SNP2.png)|MTL_ASC_SNP2|狙击芯片组| 24 | |![狙击双芯片](MTL_ASC_SNP3.png)|MTL_ASC_SNP3|狙击双芯片| 25 | |![特种芯片](MTL_ASC_SPC1.png)|MTL_ASC_SPC1|特种芯片| 26 | |![特种芯片组](MTL_ASC_SPC2.png)|MTL_ASC_SPC2|特种芯片组| 27 | |![特种双芯片](MTL_ASC_SPC3.png)|MTL_ASC_SPC3|特种双芯片| 28 | |![辅助芯片](MTL_ASC_SUP1.png)|MTL_ASC_SUP1|辅助芯片| 29 | |![辅助芯片组](MTL_ASC_SUP2.png)|MTL_ASC_SUP2|辅助芯片组| 30 | |![辅助双芯片](MTL_ASC_SUP3.png)|MTL_ASC_SUP3|辅助双芯片| 31 | |![重装芯片](MTL_ASC_TNK1.png)|MTL_ASC_TNK1|重装芯片| 32 | |![重装芯片组](MTL_ASC_TNK2.png)|MTL_ASC_TNK2|重装芯片组| 33 | |![重装双芯片](MTL_ASC_TNK3.png)|MTL_ASC_TNK3|重装双芯片| 34 | |![龙骨](MTL_BASE_ESS.png)|MTL_BASE_ESS|龙骨| 35 | |![碳](MTL_BASE_SL1.png)|MTL_BASE_SL1|碳| 36 | |![碳素](MTL_BASE_SL2.png)|MTL_BASE_SL2|碳素| 37 | |![碳素组](MTL_BASE_SL3.png)|MTL_BASE_SL3|碳素组| 38 | |![碳素组](MTL_BASE_SL3.png)|MTL_BASE_SL3|碳素组| 39 | |![基础加固建材](MTL_BASE_SYNTH1.png)|MTL_BASE_SYNTH1|基础加固建材| 40 | |![进阶加固建材](MTL_BASE_SYNTH2.png)|MTL_BASE_SYNTH2|进阶加固建材| 41 | |![高级加固建材](MTL_BASE_SYNTH3.png)|MTL_BASE_SYNTH3|高级加固建材| 42 | |![源石碎片](MTL_DIAMOND_SHD.png)|MTL_DIAMOND_SHD|源石碎片| 43 | |![MTL_GOLD1](MTL_GOLD1.png)|MTL_GOLD1|MTL_GOLD1| 44 | |![MTL_GOLD2](MTL_GOLD2.png)|MTL_GOLD2|MTL_GOLD2| 45 | |![赤金](MTL_GOLD3.png)|MTL_GOLD3|赤金| 46 | |![技巧概要·卷1](MTL_SKILL1.png)|MTL_SKILL1|技巧概要·卷1| 47 | |![技巧概要·卷2](MTL_SKILL2.png)|MTL_SKILL2|技巧概要·卷2| 48 | |![技巧概要·卷3](MTL_SKILL3.png)|MTL_SKILL3|技巧概要·卷3| 49 | |![扭转醇](MTL_SL_ALCOHOL1.png)|MTL_SL_ALCOHOL1|扭转醇| 50 | |![白马醇](MTL_SL_ALCOHOL2.png)|MTL_SL_ALCOHOL2|白马醇| 51 | |![双极纳米片](MTL_SL_BN.png)|MTL_SL_BN|双极纳米片| 52 | |![破损装置](MTL_SL_BOSS1.png)|MTL_SL_BOSS1|破损装置| 53 | |![装置](MTL_SL_BOSS2.png)|MTL_SL_BOSS2|装置| 54 | |![全新装置](MTL_SL_BOSS3.png)|MTL_SL_BOSS3|全新装置| 55 | |![改量装置](MTL_SL_BOSS4.png)|MTL_SL_BOSS4|改量装置| 56 | |![D32钢](MTL_SL_DS.png)|MTL_SL_DS|D32钢| 57 | |![源岩](MTL_SL_G1.png)|MTL_SL_G1|源岩| 58 | |![固源岩](MTL_SL_G2.png)|MTL_SL_G2|固源岩| 59 | |![固源岩组](MTL_SL_G3.png)|MTL_SL_G3|固源岩组| 60 | |![提纯源岩](MTL_SL_G4.png)|MTL_SL_G4|提纯源岩| 61 | |![异铁碎片](MTL_SL_IRON1.png)|MTL_SL_IRON1|异铁碎片| 62 | |![异铁](MTL_SL_IRON2.png)|MTL_SL_IRON2|异铁| 63 | |![异铁组](MTL_SL_IRON3.png)|MTL_SL_IRON3|异铁组| 64 | |![异铁块](MTL_SL_IRON4.png)|MTL_SL_IRON4|异铁块| 65 | |![双酮](MTL_SL_KETONE1.png)|MTL_SL_KETONE1|双酮| 66 | |![酮凝集](MTL_SL_KETONE2.png)|MTL_SL_KETONE2|酮凝集| 67 | |![酮凝集组](MTL_SL_KETONE3.png)|MTL_SL_KETONE3|酮凝集组| 68 | |![酮阵列](MTL_SL_KETONE4.png)|MTL_SL_KETONE4|酮阵列| 69 | |![轻锰矿](MTL_SL_MANGANESE1.png)|MTL_SL_MANGANESE1|轻锰矿| 70 | |![三水锰矿](MTL_SL_MANGANESE2.png)|MTL_SL_MANGANESE2|三水锰矿| 71 | |![研磨石](MTL_SL_PG1.png)|MTL_SL_PG1|研磨石| 72 | |![五水研磨石](MTL_SL_PG2.png)|MTL_SL_PG2|五水研磨石| 73 | |![聚合剂](MTL_SL_PP.png)|MTL_SL_PP|聚合剂| 74 | |![RMA70-12](MTL_SL_RMA7012.png)|MTL_SL_RMA7012|RMA70-12| 75 | |![RMA70-24](MTL_SL_RMA7024.png)|MTL_SL_RMA7024|RMA70-24| 76 | |![酯原料](MTL_SL_RUSH1.png)|MTL_SL_RUSH1|酯原料| 77 | |![聚酸酯](MTL_SL_RUSH2.png)|MTL_SL_RUSH2|聚酸酯| 78 | |![聚酸酯组](MTL_SL_RUSH3.png)|MTL_SL_RUSH3|聚酸酯组| 79 | |![聚酸酯块](MTL_SL_RUSH4.png)|MTL_SL_RUSH4|聚酸酯块| 80 | |![代糖](MTL_SL_STRG1.png)|MTL_SL_STRG1|代糖| 81 | |![糖](MTL_SL_STRG2.png)|MTL_SL_STRG2|糖| 82 | |![糖组](MTL_SL_STRG3.png)|MTL_SL_STRG3|糖组| 83 | |![糖聚块](MTL_SL_STRG4.png)|MTL_SL_STRG4|糖聚块| 84 | |![基础作战记录](sprite_exp_card_t1.png)|sprite_exp_card_t1|基础作战记录| 85 | |![初级作战记录](sprite_exp_card_t2.png)|sprite_exp_card_t2|初级作战记录| 86 | |![中级作战记录](sprite_exp_card_t3.png)|sprite_exp_card_t3|中级作战记录| 87 | |![高级作战记录](sprite_exp_card_t4.png)|sprite_exp_card_t4|高级作战记录| 88 | |![加急许可](TKT_INST_FIN.png)|TKT_INST_FIN|加急许可| 89 | |![招聘许可](TKT_RECRUIT.png)|TKT_RECRUIT|招聘许可| -------------------------------------------------------------------------------- /src/assets/img/material/TKT_INST_FIN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/TKT_INST_FIN.png -------------------------------------------------------------------------------- /src/assets/img/material/TKT_RECRUIT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/TKT_RECRUIT.png -------------------------------------------------------------------------------- /src/assets/img/material/sprite_exp_card_t1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/sprite_exp_card_t1.png -------------------------------------------------------------------------------- /src/assets/img/material/sprite_exp_card_t2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/sprite_exp_card_t2.png -------------------------------------------------------------------------------- /src/assets/img/material/sprite_exp_card_t3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/sprite_exp_card_t3.png -------------------------------------------------------------------------------- /src/assets/img/material/sprite_exp_card_t4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/assets/img/material/sprite_exp_card_t4.png -------------------------------------------------------------------------------- /src/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #da532c 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | production: false 7 | }; 8 | 9 | /* 10 | * For easier debugging in development mode, you can import the following file 11 | * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. 12 | * 13 | * This import should be commented out in production mode because it will have a negative impact 14 | * on performance if an error is thrown. 15 | */ 16 | // import 'zone.js/dist/zone-error'; // Included with Angular CLI. 17 | -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gneko/aktools-closed/8f266b19832987f78948e9a736f5729544420c12/src/favicon.ico -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 明日方舟工具箱 by 一只灰猫 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 34 |
    35 | 36 | 37 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule).then(() => { 12 | if ('serviceWorker' in navigator && environment.production) { 13 | navigator.serviceWorker.register('ngsw-worker.js'); 14 | } 15 | }).catch(err => console.error(err)); 16 | -------------------------------------------------------------------------------- /src/manifest.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "明日方舟工具箱 by 一只灰猫", 3 | "short_name": "方舟工具箱", 4 | "start_url": "/", 5 | "display": "standalone", 6 | "theme_color": "#5c638b", 7 | "background_color": "#5c638b", 8 | "scope": "/", 9 | "icons": [ 10 | { 11 | "src": "assets/icons/android-chrome-192x192.png", 12 | "sizes": "192x192", 13 | "type": "image/png" 14 | }, 15 | { 16 | "src": "assets/icons/android-chrome-512x512.png", 17 | "sizes": "512x512", 18 | "type": "image/png" 19 | } 20 | ] 21 | } -------------------------------------------------------------------------------- /src/polyfills.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file includes polyfills needed by Angular and is loaded before the app. 3 | * You can add your own extra polyfills to this file. 4 | * 5 | * This file is divided into 2 sections: 6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. 7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main 8 | * file. 9 | * 10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that 11 | * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), 12 | * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. 13 | * 14 | * Learn more in https://angular.io/guide/browser-support 15 | */ 16 | 17 | /*************************************************************************************************** 18 | * BROWSER POLYFILLS 19 | */ 20 | 21 | /** IE10 and IE11 requires the following for NgClass support on SVG elements */ 22 | // import 'classlist.js'; // Run `npm install --save classlist.js`. 23 | 24 | /** 25 | * Web Animations `@angular/platform-browser/animations` 26 | * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. 27 | * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). 28 | */ 29 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`. 30 | 31 | /** 32 | * By default, zone.js will patch all possible macroTask and DomEvents 33 | * user can disable parts of macroTask/DomEvents patch by setting following flags 34 | * because those flags need to be set before `zone.js` being loaded, and webpack 35 | * will put import in the top of bundle, so user need to create a separate file 36 | * in this directory (for example: zone-flags.ts), and put the following flags 37 | * into that file, and then add the following code before importing zone.js. 38 | * import './zone-flags.ts'; 39 | * 40 | * The flags allowed in zone-flags.ts are listed here. 41 | * 42 | * The following flags will work for all browsers. 43 | * 44 | * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame 45 | * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick 46 | * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames 47 | * 48 | * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js 49 | * with the following flag, it will bypass `zone.js` patch for IE/Edge 50 | * 51 | * (window as any).__Zone_enable_cross_context_check = true; 52 | * 53 | */ 54 | 55 | /*************************************************************************************************** 56 | * Zone JS is required by default for Angular itself. 57 | */ 58 | import 'zone.js/dist/zone'; // Included with Angular CLI. 59 | 60 | 61 | /*************************************************************************************************** 62 | * APPLICATION IMPORTS 63 | */ 64 | -------------------------------------------------------------------------------- /src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | @import "./app/styles/custom.scss"; 3 | 4 | // import theming for all mdc components: 5 | // @import "material-components-web/material-components-web"; 6 | 7 | body, html {height: 100%;} 8 | 9 | body { 10 | font-family: -apple-system, "Noto Sans", "Helvetica Neue", Helvetica, "Nimbus Sans L", Arial, "Liberation Sans", 11 | "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans SC", "Source Han Sans CN", "Microsoft YaHei", 12 | "Wenquanyi Micro Hei", SimHei, "WenQuanYi Zen Hei", "ST Heiti", "WenQuanYi Zen Hei Sharp", sans-serif; 13 | margin: 0px; 14 | -webkit-user-select: none; 15 | -webkit-tap-highlight-color: transparent; 16 | -webkit-touch-callout: none; 17 | /* Support for all WebKit browsers. */ 18 | -webkit-font-smoothing: antialiased; 19 | /* Support for Safari and Chrome. */ 20 | text-rendering: optimizeLegibility; 21 | 22 | /* Support for Firefox. */ 23 | -moz-osx-font-smoothing: grayscale; 24 | 25 | } 26 | 27 | .mdc-button { 28 | font-family: -apple-system, "Noto Sans", "Helvetica Neue", Helvetica, "Nimbus Sans L", Arial, "Liberation Sans", 29 | "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans SC", "Source Han Sans CN", "Microsoft YaHei", 30 | "Wenquanyi Micro Hei", SimHei, "WenQuanYi Zen Hei", "ST Heiti", "WenQuanYi Zen Hei Sharp", sans-serif; 31 | } 32 | 33 | input::-webkit-outer-spin-button, 34 | input::-webkit-inner-spin-button { 35 | /* display: none; <- Crashes Chrome on hover */ 36 | -webkit-appearance: none; 37 | margin: 0; /* <-- Apparently some margin are still there even though it's hidden */ 38 | } 39 | 40 | input[type="number"] { 41 | -moz-appearance: textfield; /* Firefox */ 42 | } -------------------------------------------------------------------------------- /src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/zone-testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | declare const require: any; 11 | 12 | // First, initialize the Angular testing environment. 13 | getTestBed().initTestEnvironment( 14 | BrowserDynamicTestingModule, 15 | platformBrowserDynamicTesting() 16 | ); 17 | // Then we find all the tests. 18 | const context = require.context('./', true, /\.spec\.ts$/); 19 | // And load the modules. 20 | context.keys().map(context); 21 | -------------------------------------------------------------------------------- /tools/extractMaterials.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | 3 | import re 4 | import json 5 | import requests 6 | 7 | # 在根目录下执行以下指令: 8 | # python3 ./tools/extractMaterials.py 9 | 10 | # https://github.com/Kengxxiao/ArknightsGameData.git 11 | base = "https://raw.githubusercontent.com/Kengxxiao/ArknightsGameData/master/zh_CN/gamedata" 12 | 13 | # 某次更新后上面所用的数据出现了乱码问题,可以clone到本地后手动修复,此时需要用以下路径 14 | # base = r"C:\Users\user\ArknightsGameData\zh_CN\gamedata" 15 | 16 | 17 | def readJson(path): 18 | if base.startswith("http"): 19 | r = requests.get(base + path 20 | # 如果需要可以取消注释以使用代理,请注意socks5代理需要 pip3 install -U requests[socks] 21 | # , proxies = { 'http': 'socks5://127.0.0.1:1086', 'https': 'socks5://127.0.0.1:1086'} 22 | ) 23 | r.encoding = "utf-8" 24 | return r.json() 25 | else: 26 | with open(base + path, encoding='utf-8') as f: 27 | return json.load(f, encoding='utf-8') 28 | 29 | 30 | skillTbl = readJson("/excel/skill_table.json") 31 | skidToName = {} 32 | for skid in skillTbl: 33 | skidToName[skid] = skillTbl[skid]['levels'][0]['name'] 34 | 35 | charTbl = readJson("/excel/character_table.json") 36 | result = {} 37 | profMap = { 38 | 'MEDIC': '医疗', 39 | 'WARRIOR': '近卫', 40 | "PIONEER": '先锋', 41 | 'TANK': '重装', 42 | 'SNIPER': '狙击', 43 | 'CASTER': '术师', 44 | 'SUPPORT': '辅助', 45 | 'SPECIAL': '特种' 46 | } 47 | 48 | with open("./src/assets/data/charMaterials.json", "r", encoding="utf-8") as f: 49 | oldData = json.load(f) 50 | # print("Before update: {0} char-mats".format(len(oldData))) 51 | 52 | newChars = [] 53 | for chid in charTbl: 54 | char = charTbl[chid] 55 | chmat = { 56 | 'name': char['name'], 57 | 'rarity': char['rarity'], 58 | 'profession': profMap.get(char['profession'], '其它'), 59 | 'evolveCosts': [x['evolveCost'] for x in char['phases']], 60 | 'sskillCosts': [ 61 | { 62 | 'skillName': skidToName[x['skillId']] if x['skillId'] else "", 63 | 'levelUpCost': x['levelUpCostCond'], 64 | 'unlockCond':x['unlockCond'] 65 | } for x in char['skills']], 66 | 'askillCosts': char['allSkillLvlup'], 67 | } 68 | result[char['name']] = chmat 69 | if char['name'] not in oldData: 70 | newChars.append(char['name']) 71 | 72 | 73 | with open("./src/assets/data/charMaterials.json", "w", encoding="utf-8") as f: 74 | json.dump(result, f, ensure_ascii=False) 75 | # print("After update: {0} char-mats".format(len(result))) 76 | if len(newChars) > 0: 77 | print("新干员:{0}".format(",".join(newChars)), end="") 78 | -------------------------------------------------------------------------------- /tools/extractStages.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | 3 | import re 4 | import json 5 | import requests 6 | import time 7 | # 在根目录下执行以下指令: 8 | # python3 ./tools/extractStages.py 9 | 10 | # https://github.com/Kengxxiao/ArknightsGameData.git 11 | base = "https://raw.githubusercontent.com/Kengxxiao/ArknightsGameData/master/%s/gamedata" 12 | # "en_US","ja_JP","ko_KR","zh_CN" 13 | # 某次更新后上面所用的数据出现了乱码问题,可以clone到本地后手动修复,此时需要用以下路径 14 | # base = r"C:\Users\user\ArknightsGameData\zh_CN\gamedata" 15 | 16 | servers = ["en_US", "ja_JP", "ko_KR", "zh_CN"] 17 | newData = {"allStage": [], "preset": {},"ActivityName":{}} 18 | 19 | datafile = "./src/assets/data/StageList.json" 20 | 21 | def readJson(path, server="zh_CN"): 22 | if base.startswith("http"): 23 | r = requests.get(base % server + path 24 | # 如果需要可以取消注释以使用代理,请注意socks5代理需要 pip3 install -U requests[socks] 25 | # , proxies = { 'http': 'socks5://127.0.0.1:1080', 'https': 'socks5://127.0.0.1:1080'} 26 | ) 27 | r.encoding = "utf-8" 28 | return r.json() 29 | else: 30 | with open(base + path, encoding='utf-8') as f: 31 | return json.load(f, encoding='utf-8') 32 | 33 | 34 | def addId(stage): 35 | output = {"stageId": stage[0], "code": stage[1]["code"], 36 | "drop": stage[1]["displayMainItem"]} # 排除龙门币关 37 | return output 38 | 39 | 40 | def removeTR(stage): 41 | # 去除剿灭作战和教程关/突袭模式/超难关/龙门币支线关/物资筹备 42 | if re.search(r"(TR-\d+|H\d+-\d+|PR-[A-Z]-\d+|LS-\d+|SK-\d+|CA-\d+|AP-\d+|CE-\d+)", stage["code"]): 43 | return False 44 | if not re.search("-", stage["code"]): 45 | return False 46 | if re.search("#f#", stage["stageId"]): 47 | return False 48 | return True 49 | 50 | 51 | def checkActivityOpen(stage): 52 | stage["stageId"].split("-")[0] 53 | if StageRawData["stageValidInfo"].__contains__(stage["stageId"]): 54 | StageTime = StageRawData["stageValidInfo"][stage["stageId"]] 55 | if(time.time() > StageTime["startTs"] and (StageTime["endTs"] == -1 or time.time() < StageTime["endTs"])): 56 | # 这里也许要考虑时区? 57 | return True 58 | return False 59 | return True 60 | 61 | 62 | # See: https://stackoverflow.com/questions/25851183/how-to-compare-two-json-objects-with-the-same-elements-in-a-different-order-equa 63 | def ordered(obj): 64 | if isinstance(obj, dict): 65 | return sorted((k, ordered(v)) for k, v in obj.items()) 66 | if isinstance(obj, list): 67 | return sorted(ordered(x) for x in obj) 68 | else: 69 | return obj 70 | 71 | 72 | with open(datafile, "r", encoding="utf-8") as f: 73 | oldData = json.load(f) 74 | 75 | 76 | for server in servers: 77 | StageRawData = readJson("/excel/stage_table.json", server) 78 | StageRawData["stages"] = list( 79 | filter(removeTR, map(addId, StageRawData["stages"].items()))) 80 | if(server == "zh_CN"): 81 | ActivityRawData = readJson("/excel/activity_table.json", server) 82 | for Stage in StageRawData["stages"]: 83 | if(ActivityRawData["basicInfo"].__contains__(Stage["stageId"].split("_")[0])): 84 | StageCode=Stage["code"].split("-")[0] 85 | newData["ActivityName"][StageCode]=ActivityRawData["basicInfo"][Stage["stageId"].split("_")[0]]["name"] 86 | newData["allStage"] = list( 87 | map(lambda a: a["code"], StageRawData["stages"])) 88 | newData["preset"][server] = list( 89 | map(lambda a: a["code"], filter(checkActivityOpen, StageRawData["stages"]))) 90 | 91 | if ordered(oldData) != ordered(newData): 92 | with open(datafile, "w", encoding="utf-8") as f: 93 | json.dump(newData, f, ensure_ascii=False) 94 | print("关卡数据", end="") 95 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/app", 5 | "types": [] 6 | }, 7 | "files": [ 8 | "src/main.ts", 9 | "src/polyfills.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "baseUrl": "./", 5 | "outDir": "./dist/out-tsc", 6 | "sourceMap": true, 7 | "declaration": false, 8 | "module": "esnext", 9 | "moduleResolution": "node", 10 | "emitDecoratorMetadata": true, 11 | "experimentalDecorators": true, 12 | "importHelpers": true, 13 | "target": "es2015", 14 | "typeRoots": [ 15 | "node_modules/@types" 16 | ], 17 | "lib": [ 18 | "es2018", 19 | "dom" 20 | ] 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/spec", 5 | "types": [ 6 | "jasmine", 7 | "node", 8 | "jquery" 9 | ] 10 | }, 11 | "files": [ 12 | "src/test.ts", 13 | "src/polyfills.ts" 14 | ], 15 | "include": [ 16 | "src/**/*.spec.ts", 17 | "src/**/*.d.ts" 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /tsconfig.worker.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/worker", 5 | "lib": [ 6 | "es2018", 7 | "webworker" 8 | ], 9 | "types": [] 10 | }, 11 | "include": [ 12 | "src/**/*.worker.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tslint:recommended", 3 | "rules": { 4 | "array-type": false, 5 | "arrow-parens": false, 6 | "deprecation": { 7 | "severity": "warn" 8 | }, 9 | "component-class-suffix": true, 10 | "contextual-lifecycle": true, 11 | "directive-class-suffix": true, 12 | "directive-selector": [ 13 | true, 14 | "attribute", 15 | "app", 16 | "camelCase" 17 | ], 18 | "component-selector": [ 19 | true, 20 | "element", 21 | "app", 22 | "kebab-case" 23 | ], 24 | "import-blacklist": [ 25 | true, 26 | "rxjs/Rx" 27 | ], 28 | "interface-name": false, 29 | "max-classes-per-file": false, 30 | "max-line-length": [ 31 | true, 32 | 140 33 | ], 34 | "member-access": false, 35 | "member-ordering": [ 36 | true, 37 | { 38 | "order": [ 39 | "static-field", 40 | "instance-field", 41 | "static-method", 42 | "instance-method" 43 | ] 44 | } 45 | ], 46 | "no-consecutive-blank-lines": false, 47 | "no-console": [ 48 | true, 49 | "debug", 50 | "info", 51 | "time", 52 | "timeEnd", 53 | "trace" 54 | ], 55 | "no-empty": false, 56 | "no-inferrable-types": [ 57 | true, 58 | "ignore-params" 59 | ], 60 | "no-non-null-assertion": true, 61 | "no-redundant-jsdoc": true, 62 | "no-switch-case-fall-through": true, 63 | "no-use-before-declare": true, 64 | "no-var-requires": false, 65 | "object-literal-key-quotes": [ 66 | true, 67 | "as-needed" 68 | ], 69 | "object-literal-sort-keys": false, 70 | "ordered-imports": false, 71 | "quotemark": [ 72 | true, 73 | "single" 74 | ], 75 | "trailing-comma": false, 76 | "no-conflicting-lifecycle": true, 77 | "no-host-metadata-property": true, 78 | "no-input-rename": true, 79 | "no-inputs-metadata-property": true, 80 | "no-output-native": true, 81 | "no-output-on-prefix": true, 82 | "no-output-rename": true, 83 | "no-outputs-metadata-property": true, 84 | "template-banana-in-box": true, 85 | "template-no-negated-async": true, 86 | "use-lifecycle-interface": true, 87 | "use-pipe-transform-interface": true 88 | }, 89 | "rulesDirectory": [ 90 | "codelyzer" 91 | ] 92 | } -------------------------------------------------------------------------------- /typings.json: -------------------------------------------------------------------------------- 1 | { 2 | "globalDependencies": { 3 | "jquery": "registry:dt/jquery#1.10.0+20170310222111" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /version/data: -------------------------------------------------------------------------------- 1 | [CN UPDATE] Client:0.9.01 Data:20-04-07-13-09-17-ff7c7f 2 | --------------------------------------------------------------------------------